Browse Source

Add new type of session

painor 4 years ago
parent
commit
14750736d1

+ 1 - 0
gramjs/Utils.ts

@@ -148,6 +148,7 @@ export function _photoSizeByteCount(size: FileLike) {
 export function _getEntityPair(entityId: number, entities: Map<number, Entity>,
                                cache: EntityCache,
                                getInputPeerFunction: any = getInputPeer): [Entity?, EntityLike?] {
+
     const entity = entities.get(entityId);
     let inputEntity = cache.get(entityId);
     if (!inputEntity) {

+ 1 - 1
gramjs/client/messages.ts

@@ -466,7 +466,7 @@ export class MessageMethods {
                 replyMarkup: request.replyMarkup,
             })
             // @ts-ignore
-            newMessage._finishInit(this, {}, entity);
+            //newMessage._finishInit(this, new Map<>(), entity);
             return newMessage;
         }
         return this._getResponseMessage(request, result, entity);

+ 4 - 4
gramjs/client/telegramBaseClient.ts

@@ -3,7 +3,7 @@ import {IS_NODE} from "../Helpers";
 import {ConnectionTCPFull, ConnectionTCPObfuscated} from "../network/connection";
 import {Session} from "../sessions/Abstract";
 import {Logger} from "../extensions";
-import {StringSession} from "../sessions";
+import {StoreSession, StringSession} from "../sessions";
 import {Api} from "../tl";
 
 
@@ -45,7 +45,7 @@ export class TelegramBaseClient {
     _config ?: Api.Config;
     public _log: Logger;
     public _floodSleepThreshold: number;
-    public session: StringSession;
+    public session: StringSession|StoreSession;
     public apiHash: string;
     public apiId: number;
     public _requestRetries: number;
@@ -94,8 +94,8 @@ export class TelegramBaseClient {
         } else {
             this._log = baseLogger
         }
-        if (!(session instanceof StringSession)) {
-            throw new Error("Only StringSession is supported currently :( ");
+        if (!(session instanceof StoreSession) && !(session instanceof StringSession)) {
+            throw new Error("Only StringSession and StoreSessions are supported currently :( ");
         }
         this._floodSleepThreshold = floodSleepThreshold;
         this.session = session;

+ 2 - 1
gramjs/client/users.ts

@@ -186,6 +186,7 @@ export class UserMethods {
 
     async getInputEntity(peer: EntityLike): Promise<Api.TypeInputPeer> {
         // Short-circuit if the input parameter directly maps to an InputPeer
+
         try {
             return utils.getInputPeer(peer)
             // eslint-disable-next-line no-empty
@@ -232,7 +233,7 @@ export class UserMethods {
                     accessHash: bigInt.zero,
                 })],
             }));
-            if (users && !(users[0] instanceof Api.UserEmpty)) {
+            if (users.length && !(users[0] instanceof Api.UserEmpty)) {
                 // If the user passed a valid ID they expect to work for
                 // channels but would be valid for users, we get UserEmpty.
                 // Avoid returning the invalid empty input peer for that.

+ 1 - 1
gramjs/errors/Common.ts

@@ -74,7 +74,7 @@ export class InvalidBufferError extends Error {
  * Generic security error, mostly used when generating a new AuthKey.
  */
 export class SecurityError extends Error {
-    constructor(...args: any) {
+    constructor(...args: any[]) {
         if (!args.length) {
             args = ['A security check failed.']
         }

+ 4 - 4
gramjs/sessions/Memory.ts

@@ -123,19 +123,19 @@ export class MemorySession extends Session {
 
     _entitiesToRows(tlo: any) {
         let entities: any = [];
-        if (tlo.classType === "constructor" && isArrayLike(tlo)) {
+        if (!(tlo.classType === "constructor") && isArrayLike(tlo)) {
             // This may be a list of users already for instance
             entities = tlo;
         } else {
-            if (tlo instanceof Object) {
+            if (typeof tlo==="object") {
                 if ('user' in tlo) {
                     entities.push(tlo.user)
                 }
                 if ('chats' in tlo && isArrayLike(tlo.chats)) {
-                    entities.concat(tlo.chats)
+                    entities = entities.concat(tlo.chats)
                 }
                 if ('users' in tlo && isArrayLike(tlo.users)) {
-                    entities.concat(tlo.users)
+                    entities = entities.concat(tlo.users)
                 }
             }
         }

+ 92 - 0
gramjs/sessions/StoreSession.ts

@@ -0,0 +1,92 @@
+import {MemorySession} from "./Memory";
+import store from "store2";
+import {AuthKey} from "../crypto/AuthKey";
+import {LocalStorage} from 'node-localstorage';
+
+export class StoreSession extends MemorySession {
+    private readonly sessionName: string;
+    private store: store.StoreAPI;
+
+    constructor(sessionName: string) {
+        super();
+        this.store = store.area('fs', new LocalStorage("./" + sessionName));
+        this.sessionName = sessionName + ":";
+
+
+    }
+
+    async load() {
+        let authKey = this.store.get(this.sessionName + "authKey");
+        if (authKey && typeof authKey === "object") {
+            this._authKey = new AuthKey();
+            if ("data" in authKey) {
+                authKey = Buffer.from(authKey.data);
+            }
+            await this._authKey.setKey(authKey);
+        }
+
+        const dcId = this.store.get(this.sessionName + "dcId");
+        if (dcId) {
+            this._dcId = dcId;
+
+        }
+
+        const port = this.store.get(this.sessionName + "port");
+        if (port) {
+            this._port = port;
+        }
+        const serverAddress = this.store.get(this.sessionName + "serverAddress");
+        if (serverAddress) {
+            this._serverAddress = serverAddress;
+        }
+    }
+
+    setDC(dcId: number, serverAddress: string, port: number) {
+        this.store.set(this.sessionName + "dcId", dcId);
+        this.store.set(this.sessionName + "port", port);
+        this.store.set(this.sessionName + "serverAddress", serverAddress);
+        super.setDC(dcId, serverAddress, port);
+    }
+
+    set authKey(value: AuthKey | undefined) {
+        this._authKey = value;
+        this.store.set(this.sessionName + "authKey", value?.getKey());
+    }
+
+    get authKey() {
+        return this._authKey;
+    }
+
+    getAuthKey(dcId?: number) {
+        if (dcId && dcId !== this.dcId) {
+            // Not supported.
+            return undefined
+        }
+
+        return this.authKey
+    }
+
+    setAuthKey(authKey?: AuthKey, dcId?: number) {
+        if (dcId && dcId !== this.dcId) {
+            // Not supported.
+            return undefined
+        }
+
+        this.authKey = authKey
+    }
+
+    processEntities(tlo: any) {
+        const rows = this._entitiesToRows(tlo);
+        if (!rows) {
+            return;
+        }
+        for (const row of rows) {
+            row.push(new Date().getTime());
+            this.store.set(this.sessionName + row[0], row);
+        }
+    }
+
+    getEntityRowsById(id: number, exact: boolean = true): any {
+        return this.store.get(this.sessionName + id);
+    }
+}

+ 1 - 0
gramjs/sessions/index.ts

@@ -1,5 +1,6 @@
 export {MemorySession} from './Memory';
 export {StringSession} from './StringSession';
+export {StoreSession} from './StoreSession';
 // @ts-ignore
 //export {CacheApiSession} from './CacheApiSession';
 

+ 1 - 0
gramjs/tl/custom/message.ts

@@ -212,6 +212,7 @@ export class Message extends Mixin(SenderGetter, ChatGetter) {
                 )]
             }
         }
+
     }
 
     get client() {

+ 48 - 7
package-lock.json

@@ -3243,6 +3243,12 @@
       "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==",
       "dev": true
     },
+    "@types/events": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
+      "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==",
+      "dev": true
+    },
     "@types/graceful-fs": {
       "version": "4.1.4",
       "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz",
@@ -3294,6 +3300,15 @@
       "integrity": "sha512-O+x6uIpa6oMNTkPuHDa9MhMMehlxLAd5QcOvKRjAFsBVpeFWTOPnXbDvILvFgFFZfQ1xh1EZi1FbXxUix+zpsQ==",
       "dev": true
     },
+    "@types/node-localstorage": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/@types/node-localstorage/-/node-localstorage-1.3.0.tgz",
+      "integrity": "sha512-9+s5CWGhkYitklhLgnbf4s5ncCEx0An2jhBuhvw/sh9WNQ+/WvNFkPLyLjXGy+Oeo8CjPl69oz6M2FzZH+KwWA==",
+      "dev": true,
+      "requires": {
+        "@types/events": "*"
+      }
+    },
     "@types/normalize-package-data": {
       "version": "2.4.0",
       "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
@@ -5188,8 +5203,7 @@
     "graceful-fs": {
       "version": "4.2.3",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
-      "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
-      "dev": true
+      "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ=="
     },
     "growly": {
       "version": "1.3.0",
@@ -5332,8 +5346,7 @@
     "imurmurhash": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
-      "dev": true
+      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
     },
     "inflight": {
       "version": "1.0.6",
@@ -7675,14 +7688,12 @@
     "mime-db": {
       "version": "1.45.0",
       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz",
-      "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==",
-      "dev": true
+      "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w=="
     },
     "mime-types": {
       "version": "2.1.28",
       "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz",
       "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==",
-      "dev": true,
       "requires": {
         "mime-db": "1.45.0"
       }
@@ -7788,6 +7799,26 @@
       "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=",
       "dev": true
     },
+    "node-localstorage": {
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-2.1.6.tgz",
+      "integrity": "sha512-yE7AycE5G2hU55d+F7Ona9nx97C+enJzWWx6jrsji7fuPZFJOvuW3X/LKKAcXRBcEIJPDOKt8ZiFWFmShR/irg==",
+      "requires": {
+        "write-file-atomic": "^1.1.4"
+      },
+      "dependencies": {
+        "write-file-atomic": {
+          "version": "1.3.4",
+          "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz",
+          "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=",
+          "requires": {
+            "graceful-fs": "^4.1.11",
+            "imurmurhash": "^0.1.4",
+            "slide": "^1.1.5"
+          }
+        }
+      }
+    },
     "node-modules-regexp": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
@@ -8747,6 +8778,11 @@
       "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
       "dev": true
     },
+    "slide": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
+      "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc="
+    },
     "snapdragon": {
       "version": "0.8.2",
       "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
@@ -9026,6 +9062,11 @@
       "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=",
       "dev": true
     },
+    "store2": {
+      "version": "2.12.0",
+      "resolved": "https://registry.npmjs.org/store2/-/store2-2.12.0.tgz",
+      "integrity": "sha512-7t+/wpKLanLzSnQPX8WAcuLCCeuSHoWdQuh9SB3xD0kNOM38DNf+0Oa+wmvxmYueRzkmh6IcdKFtvTa+ecgPDw=="
+    },
     "string-length": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz",

+ 3 - 0
package.json

@@ -25,6 +25,7 @@
     "@babel/preset-env": "^7.12.16",
     "@types/browser-or-node": "^1.3.0",
     "@types/mime-types": "^2.1.0",
+    "@types/node-localstorage": "^1.3.0",
     "@types/pako": "^1.0.1",
     "@types/websocket": "^1.0.1",
     "babel-loader": "^8.2.2",
@@ -43,9 +44,11 @@
     "browser-or-node": "^1.3.0",
     "buffer": "^6.0.3",
     "mime-types": "latest",
+    "node-localstorage": "^2.1.6",
     "os-browserify": "^0.3.0",
     "pako": "^2.0.3",
     "path-browserify": "^1.0.1",
+    "store2": "^2.12.0",
     "ts-mixer": "^5.4.0",
     "websocket": "^1.0.33"
   }