@mtcute/core 0.15.0 → 0.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/cjs/highlevel/base.js +18 -0
  2. package/cjs/highlevel/base.js.map +1 -1
  3. package/cjs/highlevel/client.d.ts +5 -0
  4. package/cjs/highlevel/client.js.map +1 -1
  5. package/cjs/highlevel/methods/auth/sign-in-qr.d.ts +5 -0
  6. package/cjs/highlevel/methods/auth/sign-in-qr.js +2 -1
  7. package/cjs/highlevel/methods/auth/sign-in-qr.js.map +1 -1
  8. package/cjs/highlevel/methods/messages/edit-inline-message.js +1 -1
  9. package/cjs/highlevel/methods/messages/edit-inline-message.js.map +1 -1
  10. package/cjs/highlevel/methods/messages/edit-message.js +1 -1
  11. package/cjs/highlevel/methods/messages/edit-message.js.map +1 -1
  12. package/cjs/highlevel/worker/invoker.d.ts +1 -0
  13. package/cjs/highlevel/worker/invoker.js +13 -1
  14. package/cjs/highlevel/worker/invoker.js.map +1 -1
  15. package/cjs/highlevel/worker/port.d.ts +9 -6
  16. package/cjs/highlevel/worker/port.js +7 -2
  17. package/cjs/highlevel/worker/port.js.map +1 -1
  18. package/cjs/highlevel/worker/protocol.d.ts +4 -0
  19. package/cjs/highlevel/worker/protocol.js.map +1 -1
  20. package/cjs/highlevel/worker/worker.d.ts +1 -0
  21. package/cjs/highlevel/worker/worker.js +27 -1
  22. package/cjs/highlevel/worker/worker.js.map +1 -1
  23. package/cjs/network/client.d.ts +2 -16
  24. package/cjs/network/client.js +7 -5
  25. package/cjs/network/client.js.map +1 -1
  26. package/cjs/network/multi-session-connection.d.ts +2 -2
  27. package/cjs/network/multi-session-connection.js +2 -2
  28. package/cjs/network/multi-session-connection.js.map +1 -1
  29. package/cjs/network/network-manager.d.ts +2 -2
  30. package/cjs/network/network-manager.js +65 -51
  31. package/cjs/network/network-manager.js.map +1 -1
  32. package/cjs/network/session-connection.d.ts +1 -2
  33. package/cjs/network/session-connection.js +7 -26
  34. package/cjs/network/session-connection.js.map +1 -1
  35. package/cjs/utils/type-assertions.d.ts +1 -0
  36. package/cjs/utils/type-assertions.js +5 -1
  37. package/cjs/utils/type-assertions.js.map +1 -1
  38. package/esm/highlevel/base.js +19 -1
  39. package/esm/highlevel/base.js.map +1 -1
  40. package/esm/highlevel/client.d.ts +5 -0
  41. package/esm/highlevel/client.js.map +1 -1
  42. package/esm/highlevel/methods/auth/sign-in-qr.d.ts +5 -0
  43. package/esm/highlevel/methods/auth/sign-in-qr.js +2 -1
  44. package/esm/highlevel/methods/auth/sign-in-qr.js.map +1 -1
  45. package/esm/highlevel/methods/messages/edit-inline-message.js +1 -1
  46. package/esm/highlevel/methods/messages/edit-inline-message.js.map +1 -1
  47. package/esm/highlevel/methods/messages/edit-message.js +1 -1
  48. package/esm/highlevel/methods/messages/edit-message.js.map +1 -1
  49. package/esm/highlevel/worker/invoker.d.ts +1 -0
  50. package/esm/highlevel/worker/invoker.js +13 -1
  51. package/esm/highlevel/worker/invoker.js.map +1 -1
  52. package/esm/highlevel/worker/port.d.ts +9 -6
  53. package/esm/highlevel/worker/port.js +7 -2
  54. package/esm/highlevel/worker/port.js.map +1 -1
  55. package/esm/highlevel/worker/protocol.d.ts +4 -0
  56. package/esm/highlevel/worker/protocol.js.map +1 -1
  57. package/esm/highlevel/worker/worker.d.ts +1 -0
  58. package/esm/highlevel/worker/worker.js +27 -1
  59. package/esm/highlevel/worker/worker.js.map +1 -1
  60. package/esm/network/client.d.ts +2 -16
  61. package/esm/network/client.js +8 -6
  62. package/esm/network/client.js.map +1 -1
  63. package/esm/network/multi-session-connection.d.ts +2 -2
  64. package/esm/network/multi-session-connection.js +2 -2
  65. package/esm/network/multi-session-connection.js.map +1 -1
  66. package/esm/network/network-manager.d.ts +2 -2
  67. package/esm/network/network-manager.js +66 -52
  68. package/esm/network/network-manager.js.map +1 -1
  69. package/esm/network/session-connection.d.ts +1 -2
  70. package/esm/network/session-connection.js +7 -26
  71. package/esm/network/session-connection.js.map +1 -1
  72. package/esm/utils/type-assertions.d.ts +1 -0
  73. package/esm/utils/type-assertions.js +3 -0
  74. package/esm/utils/type-assertions.js.map +1 -1
  75. package/package.json +1 -1
@@ -36,3 +36,4 @@ export declare function assertTypeIs<T extends tl.TlObject, K extends T['_']>(co
36
36
  export declare function assertTypeIsNot<T extends tl.TlObject, K extends T['_']>(context: string, obj: T, expectedNot: K): asserts obj is Exclude<T, tl.FindByName<T, K>>;
37
37
  export declare function mtpAssertTypeIs<T extends mtp.TlObject, K extends T['_']>(context: string, obj: T, expected: K): asserts obj is mtp.FindByName<T, K>;
38
38
  export declare function assertTrue(context: string, cond: boolean): asserts cond;
39
+ export declare function isTlRpcError(obj: unknown): obj is mtp.RawMt_rpc_error;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.assertTrue = exports.mtpAssertTypeIs = exports.assertTypeIsNot = exports.assertTypeIs = exports.hasValueAtKey = exports.hasPresentKey = exports.isPresent = void 0;
3
+ exports.isTlRpcError = exports.assertTrue = exports.mtpAssertTypeIs = exports.assertTypeIsNot = exports.assertTypeIs = exports.hasValueAtKey = exports.hasPresentKey = exports.isPresent = void 0;
4
4
  const errors_js_1 = require("../types/errors.js");
5
5
  // mostly taken from https://github.com/robertmassaioli/ts-is-present
6
6
  function isPresent(t) {
@@ -73,4 +73,8 @@ function assertTrue(context, cond) {
73
73
  }
74
74
  }
75
75
  exports.assertTrue = assertTrue;
76
+ function isTlRpcError(obj) {
77
+ return typeof obj === 'object' && obj !== null && obj._ === 'mt_rpc_error';
78
+ }
79
+ exports.isTlRpcError = isTlRpcError;
76
80
  //# sourceMappingURL=type-assertions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"type-assertions.js","sourceRoot":"","sources":["../../../src/utils/type-assertions.ts"],"names":[],"mappings":";;;AAEA,kDAAyD;AAEzD,qEAAqE;AAErE,SAAgB,SAAS,CAAI,CAA8B;IACvD,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,CAAA;AACxC,CAAC;AAFD,8BAEC;AAED;;;;;;;;;;;;GAYG;AACH,SAAgB,aAAa,CAAqC,CAAI;IAClE,OAAO,UAAiB,CAA8B;QAClD,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IAC9C,CAAC,CAAA;AACL,CAAC;AAJD,sCAIC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,aAAa,CAAoD,CAAI,EAAE,CAAI;IACvF,OAAO,UAAc,CAA4B;QAC7C,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC,CAAA;AACL,CAAC;AAJD,sCAIC;AAED,SAAgB,YAAY,CACxB,OAAe,EACf,GAAM,EACN,QAAW;IAEX,IAAI,GAAG,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,gCAAoB,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IAC5D,CAAC;AACL,CAAC;AARD,oCAQC;AAED,SAAgB,eAAe,CAC3B,OAAe,EACf,GAAM,EACN,WAAc;IAEd,IAAI,GAAG,CAAC,CAAC,KAAK,WAAW,EAAE,CAAC;QACxB,MAAM,IAAI,gCAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IACxE,CAAC;AACL,CAAC;AARD,0CAQC;AAED,SAAgB,eAAe,CAC3B,OAAe,EACf,GAAM,EACN,QAAW;IAEX,IAAI,GAAG,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,gCAAoB,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IAC5D,CAAC;AACL,CAAC;AARD,0CAQC;AAED,SAAgB,UAAU,CAAC,OAAe,EAAE,IAAa;IACrD,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,MAAM,IAAI,gCAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;IAC5D,CAAC;AACL,CAAC;AAJD,gCAIC","sourcesContent":["import { mtp, tl } from '@mtcute/tl'\n\nimport { MtTypeAssertionError } from '../types/errors.js'\n\n// mostly taken from https://github.com/robertmassaioli/ts-is-present\n\nexport function isPresent<T>(t: T | undefined | null | void): t is T {\n return t !== undefined && t !== null\n}\n\n/**\n * Returns a function that can be used to filter down objects\n * to the ones that have a defined non-null value under the key `k`.\n *\n * @example\n * ```ts\n * const filesWithUrl = files.filter(file => file.url);\n * files[0].url // In this case, TS might still treat this as undefined/null\n *\n * const filesWithUrl = files.filter(hasPresentKey(\"url\"));\n * files[0].url // TS will know that this is present\n * ```\n */\nexport function hasPresentKey<K extends string | number | symbol>(k: K) {\n return function <T, V> (a: T & { [k in K]?: V | null }): a is T & { [k in K]: V } {\n return a[k] !== undefined && a[k] !== null\n }\n}\n\n/**\n * Returns a function that can be used to filter down objects\n * to the ones that have a specific value V under a key `k`.\n *\n * @example\n * ```ts\n * type File = { type: \"image\", imageUrl: string } | { type: \"pdf\", pdfUrl: string };\n * const files: File[] = [];\n *\n * const imageFiles = files.filter(file => file.type === \"image\");\n * files[0].type // In this case, TS will still treat it as `\"image\" | \"pdf\"`\n *\n * const filesWithUrl = files.filter(hasValueKey(\"type\", \"image\" as const));\n * files[0].type // TS will now know that this is \"image\"\n * files[0].imageUrl // TS will know this is present, because already it excluded the other union members.\n * ```\n */\nexport function hasValueAtKey<const K extends string | number | symbol, const V>(k: K, v: V) {\n return function <T> (a: T & { [k in K]: unknown }): a is T & { [k in K]: V } {\n return a[k] === v\n }\n}\n\nexport function assertTypeIs<T extends tl.TlObject, K extends T['_']>(\n context: string,\n obj: T,\n expected: K,\n): asserts obj is tl.FindByName<T, K> {\n if (obj._ !== expected) {\n throw new MtTypeAssertionError(context, expected, obj._)\n }\n}\n\nexport function assertTypeIsNot<T extends tl.TlObject, K extends T['_']>(\n context: string,\n obj: T,\n expectedNot: K,\n): asserts obj is Exclude<T, tl.FindByName<T, K>> {\n if (obj._ === expectedNot) {\n throw new MtTypeAssertionError(context, 'not ' + expectedNot, obj._)\n }\n}\n\nexport function mtpAssertTypeIs<T extends mtp.TlObject, K extends T['_']>(\n context: string,\n obj: T,\n expected: K,\n): asserts obj is mtp.FindByName<T, K> {\n if (obj._ !== expected) {\n throw new MtTypeAssertionError(context, expected, obj._)\n }\n}\n\nexport function assertTrue(context: string, cond: boolean): asserts cond {\n if (!cond) {\n throw new MtTypeAssertionError(context, 'true', 'false')\n }\n}\n"]}
1
+ {"version":3,"file":"type-assertions.js","sourceRoot":"","sources":["../../../src/utils/type-assertions.ts"],"names":[],"mappings":";;;AAEA,kDAAyD;AAEzD,qEAAqE;AAErE,SAAgB,SAAS,CAAI,CAA8B;IACvD,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,CAAA;AACxC,CAAC;AAFD,8BAEC;AAED;;;;;;;;;;;;GAYG;AACH,SAAgB,aAAa,CAAqC,CAAI;IAClE,OAAO,UAAiB,CAA8B;QAClD,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IAC9C,CAAC,CAAA;AACL,CAAC;AAJD,sCAIC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,aAAa,CAAoD,CAAI,EAAE,CAAI;IACvF,OAAO,UAAc,CAA4B;QAC7C,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC,CAAA;AACL,CAAC;AAJD,sCAIC;AAED,SAAgB,YAAY,CACxB,OAAe,EACf,GAAM,EACN,QAAW;IAEX,IAAI,GAAG,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,gCAAoB,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IAC5D,CAAC;AACL,CAAC;AARD,oCAQC;AAED,SAAgB,eAAe,CAC3B,OAAe,EACf,GAAM,EACN,WAAc;IAEd,IAAI,GAAG,CAAC,CAAC,KAAK,WAAW,EAAE,CAAC;QACxB,MAAM,IAAI,gCAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IACxE,CAAC;AACL,CAAC;AARD,0CAQC;AAED,SAAgB,eAAe,CAC3B,OAAe,EACf,GAAM,EACN,QAAW;IAEX,IAAI,GAAG,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,gCAAoB,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IAC5D,CAAC;AACL,CAAC;AARD,0CAQC;AAED,SAAgB,UAAU,CAAC,OAAe,EAAE,IAAa;IACrD,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,MAAM,IAAI,gCAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;IAC5D,CAAC;AACL,CAAC;AAJD,gCAIC;AAED,SAAgB,YAAY,CAAC,GAAY;IACrC,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAK,GAAqB,CAAC,CAAC,KAAK,cAAc,CAAA;AACjG,CAAC;AAFD,oCAEC","sourcesContent":["import { mtp, tl } from '@mtcute/tl'\n\nimport { MtTypeAssertionError } from '../types/errors.js'\n\n// mostly taken from https://github.com/robertmassaioli/ts-is-present\n\nexport function isPresent<T>(t: T | undefined | null | void): t is T {\n return t !== undefined && t !== null\n}\n\n/**\n * Returns a function that can be used to filter down objects\n * to the ones that have a defined non-null value under the key `k`.\n *\n * @example\n * ```ts\n * const filesWithUrl = files.filter(file => file.url);\n * files[0].url // In this case, TS might still treat this as undefined/null\n *\n * const filesWithUrl = files.filter(hasPresentKey(\"url\"));\n * files[0].url // TS will know that this is present\n * ```\n */\nexport function hasPresentKey<K extends string | number | symbol>(k: K) {\n return function <T, V> (a: T & { [k in K]?: V | null }): a is T & { [k in K]: V } {\n return a[k] !== undefined && a[k] !== null\n }\n}\n\n/**\n * Returns a function that can be used to filter down objects\n * to the ones that have a specific value V under a key `k`.\n *\n * @example\n * ```ts\n * type File = { type: \"image\", imageUrl: string } | { type: \"pdf\", pdfUrl: string };\n * const files: File[] = [];\n *\n * const imageFiles = files.filter(file => file.type === \"image\");\n * files[0].type // In this case, TS will still treat it as `\"image\" | \"pdf\"`\n *\n * const filesWithUrl = files.filter(hasValueKey(\"type\", \"image\" as const));\n * files[0].type // TS will now know that this is \"image\"\n * files[0].imageUrl // TS will know this is present, because already it excluded the other union members.\n * ```\n */\nexport function hasValueAtKey<const K extends string | number | symbol, const V>(k: K, v: V) {\n return function <T> (a: T & { [k in K]: unknown }): a is T & { [k in K]: V } {\n return a[k] === v\n }\n}\n\nexport function assertTypeIs<T extends tl.TlObject, K extends T['_']>(\n context: string,\n obj: T,\n expected: K,\n): asserts obj is tl.FindByName<T, K> {\n if (obj._ !== expected) {\n throw new MtTypeAssertionError(context, expected, obj._)\n }\n}\n\nexport function assertTypeIsNot<T extends tl.TlObject, K extends T['_']>(\n context: string,\n obj: T,\n expectedNot: K,\n): asserts obj is Exclude<T, tl.FindByName<T, K>> {\n if (obj._ === expectedNot) {\n throw new MtTypeAssertionError(context, 'not ' + expectedNot, obj._)\n }\n}\n\nexport function mtpAssertTypeIs<T extends mtp.TlObject, K extends T['_']>(\n context: string,\n obj: T,\n expected: K,\n): asserts obj is mtp.FindByName<T, K> {\n if (obj._ !== expected) {\n throw new MtTypeAssertionError(context, expected, obj._)\n }\n}\n\nexport function assertTrue(context: string, cond: boolean): asserts cond {\n if (!cond) {\n throw new MtTypeAssertionError(context, 'true', 'false')\n }\n}\n\nexport function isTlRpcError(obj: unknown): obj is mtp.RawMt_rpc_error {\n return typeof obj === 'object' && obj !== null && (obj as { _: string })._ === 'mt_rpc_error'\n}\n"]}
@@ -1,10 +1,21 @@
1
+ /* eslint-disable @typescript-eslint/require-await */
2
+ import { tl } from '@mtcute/tl';
1
3
  import { MtClient } from '../network/client.js';
2
4
  import { MtArgumentError } from '../types/errors.js';
3
- import { asyncResettable, computeNewPasswordHash, computeSrpParams, readStringSession, writeStringSession, } from '../utils/index.js';
5
+ import { reportUnknownError } from '../utils/error-reporting.js';
6
+ import { asyncResettable, computeNewPasswordHash, computeSrpParams, isTlRpcError, readStringSession, writeStringSession, } from '../utils/index.js';
4
7
  import { LogManager } from '../utils/logger.js';
5
8
  import { AppConfigManager } from './managers/app-config-manager.js';
6
9
  import { TelegramStorageManager } from './storage/storage.js';
7
10
  import { UpdatesManager } from './updates/manager.js';
11
+ function makeRpcError(raw, stack, method) {
12
+ const error = tl.RpcError.fromTl(raw);
13
+ error.stack = `RpcError (${error.code} ${error.text}): ${error.message}\n at ${method}\n${stack
14
+ .split('\n')
15
+ .slice(2)
16
+ .join('\n')}`;
17
+ return error;
18
+ }
8
19
  export class BaseTelegramClient {
9
20
  params;
10
21
  updates;
@@ -132,6 +143,13 @@ export class BaseTelegramClient {
132
143
  await this._connect.run();
133
144
  }
134
145
  const res = await this.mt.call(message, params);
146
+ if (isTlRpcError(res)) {
147
+ const error = makeRpcError(res, new Error().stack ?? '', message._);
148
+ if (error.unknown && this.params.enableErrorReporting) {
149
+ reportUnknownError(this.log, error, message._);
150
+ }
151
+ throw error;
152
+ }
135
153
  await this.storage.peers.updatePeersFrom(res);
136
154
  // eslint-disable-next-line @typescript-eslint/no-unsafe-return
137
155
  return res;
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/highlevel/base.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAmB,MAAM,sBAAsB,CAAA;AAGhE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEpD,OAAO,EACH,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,iBAAiB,EAEjB,kBAAkB,GACrB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAE/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAEnE,OAAO,EAAE,sBAAsB,EAAsC,MAAM,sBAAsB,CAAA;AACjG,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AASrD,MAAM,OAAO,kBAAkB;IAUN;IATZ,OAAO,CAAiB;IACzB,qBAAqB,GAAwB,GAAG,EAAE,GAAE,CAAC,CAAA;IACrD,uBAAuB,GAAqC,GAAG,EAAE,GAAE,CAAC,CAAA;IAEnE,GAAG,CAAA;IACH,EAAE,CAAA;IACF,MAAM,CAAA;IACN,OAAO,CAAA;IAEhB,YAAqB,MAAiC;QAAjC,WAAM,GAAN,MAAM,CAA2B;QAClD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAA;QACzD,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC;YACnB,GAAG,IAAI,CAAC,MAAM;YACd,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;SACrC,CAAC,CAAA;QAEF,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YACrD,IAAI,CAAC,OAAO,GAAG,IAAI,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;YACvD,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACzE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,EAAE;gBACrC,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;YACvE,CAAC,CAAC,CAAA;QACN,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,MAAsB,EAAE,EAAE;YAC5C,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;QACtC,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACtB,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACpB,IAAI,CAAC,uBAAuB,CAAC,YAAY,CAAC,CAAA;QAC9C,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,SAAkB,EAAE,EAAE;YAChD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACb,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAA;YAC3C,CAAC;QACL,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAAA;QAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE;YACvD,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;YAC7B,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc;SAChC,CAAC,CAAA;IACN,CAAC;IACQ,SAAS,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAA;IAEvC,QAAQ,GAAG,eAAe,CAAC,KAAK,IAAI,EAAE;QAC1C,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAA;QAEvB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;QAC5C,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,SAAS,IAAI,EAAE,MAAM,IAAI,KAAK,IAAI,CAAA;QACpD,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,IAAI,KAAK,CAAC,CAAA;QAEtD,MAAM,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF;;;;;;;;OAQG;IACH,OAAO;QACH,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAA;IAC9B,CAAC;IAED,iDAAiD;IACzC,UAAU,GAAG,KAAK,CAAA;IAClB,QAAQ,GAAG,eAAe,CAAC,KAAK,IAAI,EAAE;QAC1C,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAA;QACzB,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAA;QACvB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;IAC1B,CAAC,CAAC,CAAA;IAEF;;;;;OAKG;IACH,KAAK,CAAC,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAA;IAC9B,CAAC;IAED,IAAI,WAAW;QACX,OAAO,IAAI,CAAC,UAAU,CAAA;IAC1B,CAAC;IAED,KAAK,CAAC,KAAK;QACP,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;QACvB,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAA;QACrB,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAA;QACxB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;QACrB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;IACzB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,IAA4C;QAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;QAEjD,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,SAAS,IAAI,CAAC,EAAE,IAAI,CAAA;QACtC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAEpD,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,CAAA;QAElC,OAAO,IAAI,CAAA;IACf,CAAC;IAED,KAAK,CAAC,eAAe;QACjB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,CAAA;QAEjC,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,aAAa,CAAA;QAC/B,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACvC,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,SAAiB,EAAE,GAAY;QACrD,OAAO,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,KAAK,CAAA;IACrE,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,SAAiB;QACvC,OAAO,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,SAAS,CAAC,IAAI,KAAK,CAAA;IAChE,CAAC;IAED,KAAK,CAAC,gBAAgB;QAClB,MAAM,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,eAAe;QACjB,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAA;IAC5B,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAI,CACN,OAAmC,EACnC,MAAuB;QAEvB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAA;QAC7B,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAE/C,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;QAE7C,+DAA+D;QAC/D,OAAO,GAAG,CAAA;IACd,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,aAAa,CAAC,OAAmC,EAAE,KAAK,GAAG,KAAK;QAClE,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;QAEpB,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAEjG,IAAI,gBAAgB,IAAI,CAAC,KAAK;YAAE,OAAM;QAEtC,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;QAE/E,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CACX,sDAAsD;gBAClD,cAAc,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI;gBACjD,qBAAqB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CACpE,CAAA;QACL,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAA;QACrC,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAEhD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5C,CAAC;QAED,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QAElF,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;IAChC,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,aAAa;QACf,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAA;QAEzB,MAAM,UAAU,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,WAAW,CAAA;QAE7E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC/E,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;QAE1D,OAAO,kBAAkB,CAAC;YACtB,OAAO,EAAE,CAAC;YACV,IAAI,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE;YACrC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YACvC,UAAU;YACV,OAAO;SACV,CAAC,CAAA;IACN,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,OAA+B;QACnC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC;IAED,SAAS,CAAC,GAAY;QAClB,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;IAC1B,CAAC;IAED,kBAAkB,CAAC,OAAuB,EAAE,UAAoB;QAC5D,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;IACzD,CAAC;IAED,cAAc,CAAC,OAA4B;QACvC,IAAI,CAAC,qBAAqB,GAAG,OAAO,CAAA;IACxC,CAAC;IAED,sBAAsB;QAClB,OAAO,IAAI,CAAC,qBAAqB,CAAA;IACrC,CAAC;IAED,QAAQ,CAAC,OAAyB;QAC9B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,MAAM,IAAI,eAAe,CAAC,6BAA6B,CAAC,CAAA;QAC5D,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;IACpC,CAAC;IAED,iBAAiB,CAAC,OAAyC;QACvD,IAAI,CAAC,uBAAuB,GAAG,OAAO,CAAA;IAC1C,CAAC;IAED,KAAK,CAAC,gBAAgB;QAClB,OAAO;YACH,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACrB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;SAC5B,CAAA;IACL,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAoB,EAAE,IAAa;QACjD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAA;QAC7B,CAAC;QAED,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAClD,CAAC;IAED,KAAK,CAAC,cAAc;QAChB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAA;QAC7B,CAAC;QAED,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,CAAA;IAC3C,CAAC;IAED,gBAAgB,CAAC,OAA+B,EAAE,QAAgB;QAC9D,OAAO,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;IAC3D,CAAC;IACD,sBAAsB,CAAC,IAA4B,EAAE,QAAgB;QACjE,OAAO,sBAAsB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC9D,CAAC;IAED,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,EAAE,CAAC,UAAU,CAAA;IAC7B,CAAC;IAED,eAAe,CAAC,IAAY;QACxB,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;IAChD,CAAC;CACJ","sourcesContent":["/* eslint-disable @typescript-eslint/require-await */\nimport { tl } from '@mtcute/tl'\n\nimport { MtClient, MtClientOptions } from '../network/client.js'\nimport { ConnectionKind, RpcCallOptions } from '../network/network-manager.js'\nimport { StorageManagerExtraOptions } from '../storage/storage.js'\nimport { MtArgumentError } from '../types/errors.js'\nimport { MustEqual } from '../types/utils.js'\nimport {\n asyncResettable,\n computeNewPasswordHash,\n computeSrpParams,\n readStringSession,\n StringSessionData,\n writeStringSession,\n} from '../utils/index.js'\nimport { LogManager } from '../utils/logger.js'\nimport { ConnectionState, ITelegramClient, ServerUpdateHandler } from './client.types.js'\nimport { AppConfigManager } from './managers/app-config-manager.js'\nimport { ITelegramStorageProvider } from './storage/provider.js'\nimport { TelegramStorageManager, TelegramStorageManagerExtraOptions } from './storage/storage.js'\nimport { UpdatesManager } from './updates/manager.js'\nimport { RawUpdateHandler, UpdatesManagerParams } from './updates/types.js'\n\nexport interface BaseTelegramClientOptions extends MtClientOptions {\n storage: ITelegramStorageProvider\n storageOptions?: StorageManagerExtraOptions & TelegramStorageManagerExtraOptions\n updates?: UpdatesManagerParams | false\n}\n\nexport class BaseTelegramClient implements ITelegramClient {\n readonly updates?: UpdatesManager\n private _serverUpdatesHandler: ServerUpdateHandler = () => {}\n private _connectionStateHandler: (state: ConnectionState) => void = () => {}\n\n readonly log\n readonly mt\n readonly crypto\n readonly storage\n\n constructor(readonly params: BaseTelegramClientOptions) {\n this.log = this.params.logger ?? new LogManager('client')\n this.mt = new MtClient({\n ...this.params,\n logger: this.log.create('mtproto'),\n })\n\n if (!params.disableUpdates && params.updates !== false) {\n this.updates = new UpdatesManager(this, params.updates)\n this._serverUpdatesHandler = this.updates.handleUpdate.bind(this.updates)\n this.updates.onCatchingUp((catchingUp) => {\n this._connectionStateHandler(catchingUp ? 'updating' : 'connected')\n })\n }\n\n this.mt.on('update', (update: tl.TypeUpdates) => {\n this._serverUpdatesHandler(update)\n })\n this.mt.on('usable', () => {\n this._connectionStateHandler('connected')\n })\n this.mt.on('wait', () => {\n this._connectionStateHandler('connecting')\n })\n this.mt.on('networkChanged', (connected: boolean) => {\n if (!connected) {\n this._connectionStateHandler('offline')\n }\n })\n\n this.crypto = this.mt.crypto\n this.storage = new TelegramStorageManager(this.mt.storage, {\n provider: this.params.storage,\n ...this.params.storageOptions,\n })\n }\n readonly appConfig = new AppConfigManager(this)\n\n private _prepare = asyncResettable(async () => {\n await this.mt.prepare()\n\n const self = await this.storage.self.fetch()\n this.log.prefix = `[USER ${self?.userId ?? 'n/a'}] `\n this.mt.network.setIsPremium(self?.isPremium ?? false)\n\n await this.updates?.prepare()\n })\n\n /**\n * **ADVANCED**\n *\n * Do all the preparations, but don't connect just yet.\n * Useful when you want to do some preparations before\n * connecting, like setting up session.\n *\n * Call {@link connect} to actually connect.\n */\n prepare() {\n return this._prepare.run()\n }\n\n // used in a hot path, avoid extra function calls\n private _connected = false\n private _connect = asyncResettable(async () => {\n await this._prepare.run()\n await this.mt.connect()\n this._connected = true\n })\n\n /**\n * Initialize the connection to the primary DC.\n *\n * You shouldn't usually call this method directly as it is called\n * implicitly the first time you call {@link call}.\n */\n async connect(): Promise<void> {\n return this._connect.run()\n }\n\n get isConnected(): boolean {\n return this._connected\n }\n\n async close(): Promise<void> {\n this._connected = false\n await this.mt.close()\n this.updates?.stopLoop()\n this._prepare.reset()\n this._connect.reset()\n }\n\n async notifyLoggedIn(auth: tl.auth.TypeAuthorization | tl.RawUser): Promise<tl.RawUser> {\n const user = this.mt.network.notifyLoggedIn(auth)\n\n this.log.prefix = `[USER ${user.id}] `\n const self = await this.storage.self.storeFrom(user)\n\n this.updates?.notifyLoggedIn(self)\n\n return user\n }\n\n async notifyLoggedOut(): Promise<void> {\n this.mt.network.notifyLoggedOut()\n\n this.log.prefix = '[USER n/a] '\n await this.storage.self.store(null)\n }\n\n async notifyChannelOpened(channelId: number, pts?: number): Promise<boolean> {\n return this.updates?.notifyChannelOpened(channelId, pts) ?? false\n }\n\n async notifyChannelClosed(channelId: number): Promise<boolean> {\n return this.updates?.notifyChannelClosed(channelId) ?? false\n }\n\n async startUpdatesLoop(): Promise<void> {\n await this.updates?.startLoop()\n }\n\n async stopUpdatesLoop(): Promise<void> {\n this.updates?.stopLoop()\n }\n\n /**\n * Make an RPC call\n *\n * This method is still quite low-level and you shouldn't use this\n * when using high-level API provided by `@mtcute/client`.\n *\n * @param message RPC method to call\n * @param params Additional call parameters\n */\n async call<T extends tl.RpcMethod>(\n message: MustEqual<T, tl.RpcMethod>,\n params?: RpcCallOptions,\n ): Promise<tl.RpcCallReturn[T['_']]> {\n if (!this._connected) {\n await this._connect.run()\n }\n\n const res = await this.mt.call(message, params)\n\n await this.storage.peers.updatePeersFrom(res)\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return res\n }\n\n /**\n * Import the session from the given session string.\n *\n * Note that the session will only be imported in case\n * the storage is missing authorization (i.e. does not contain\n * auth key for the primary DC), otherwise it will be ignored (unless `force`).\n *\n * @param session Session string to import\n * @param force Whether to overwrite existing session\n */\n async importSession(session: string | StringSessionData, force = false): Promise<void> {\n await this.prepare()\n\n const defaultDcAuthKey = await this.mt.storage.provider.authKeys.get(this.mt._defaultDcs.main.id)\n\n if (defaultDcAuthKey && !force) return\n\n const data = typeof session === 'string' ? readStringSession(session) : session\n\n if (data.testMode && !this.params.testMode) {\n throw new Error(\n 'This session string is not for the current backend. ' +\n `Session is ${data.testMode ? 'test' : 'prod'}, ` +\n `but the client is ${this.params.testMode ? 'test' : 'prod'}`,\n )\n }\n\n this.mt._defaultDcs = data.primaryDcs\n await this.mt.storage.dcs.store(data.primaryDcs)\n\n if (data.self) {\n await this.storage.self.store(data.self)\n }\n\n await this.mt.storage.provider.authKeys.set(data.primaryDcs.main.id, data.authKey)\n\n await this.mt.storage.save()\n }\n\n /**\n * Export current session to a single *LONG* string, containing\n * all the needed information.\n *\n * > **Warning!** Anyone with this string will be able\n * > to authorize as you and do anything. Treat this\n * > as your password, and never give it away!\n * >\n * > In case you have accidentally leaked this string,\n * > make sure to revoke this session in account settings:\n * > \"Privacy & Security\" > \"Active sessions\" >\n * > find the one containing `mtcute` > Revoke,\n * > or, in case this is a bot, revoke bot token\n * > with [@BotFather](//t.me/botfather)\n */\n async exportSession(): Promise<string> {\n await this._prepare.run()\n\n const primaryDcs = (await this.mt.storage.dcs.fetch()) ?? this.mt._defaultDcs\n\n const authKey = await this.mt.storage.provider.authKeys.get(primaryDcs.main.id)\n if (!authKey) throw new Error('Auth key is not ready yet')\n\n return writeStringSession({\n version: 3,\n self: await this.storage.self.fetch(),\n testMode: Boolean(this.params.testMode),\n primaryDcs,\n authKey,\n })\n }\n\n /**\n * Register an error handler for the client\n *\n * @param handler Error handler.\n */\n onError(handler: (err: unknown) => void): void {\n this.mt.onError(handler)\n }\n\n emitError(err: unknown): void {\n this.mt.emitError(err)\n }\n\n handleClientUpdate(updates: tl.TypeUpdates, noDispatch?: boolean): void {\n this.updates?.handleClientUpdate(updates, noDispatch)\n }\n\n onServerUpdate(handler: ServerUpdateHandler): void {\n this._serverUpdatesHandler = handler\n }\n\n getServerUpdateHandler(): ServerUpdateHandler {\n return this._serverUpdatesHandler\n }\n\n onUpdate(handler: RawUpdateHandler): void {\n if (!this.updates) {\n throw new MtArgumentError('Updates manager is disabled')\n }\n\n this.updates.setHandler(handler)\n }\n\n onConnectionState(handler: (state: ConnectionState) => void): void {\n this._connectionStateHandler = handler\n }\n\n async getApiCrenetials() {\n return {\n id: this.params.apiId,\n hash: this.params.apiHash,\n }\n }\n\n async getPoolSize(kind: ConnectionKind, dcId?: number): Promise<number> {\n if (!this._connected) {\n await this._connect.run()\n }\n\n return this.mt.network.getPoolSize(kind, dcId)\n }\n\n async getPrimaryDcId(): Promise<number> {\n if (!this._connected) {\n await this._connect.run()\n }\n\n return this.mt.network.getPrimaryDcId()\n }\n\n computeSrpParams(request: tl.account.RawPassword, password: string): Promise<tl.RawInputCheckPasswordSRP> {\n return computeSrpParams(this.crypto, request, password)\n }\n computeNewPasswordHash(algo: tl.TypePasswordKdfAlgo, password: string): Promise<Uint8Array> {\n return computeNewPasswordHash(this.crypto, algo, password)\n }\n\n get stopSignal(): AbortSignal {\n return this.mt.stopSignal\n }\n\n changePrimaryDc(dcId: number): Promise<void> {\n return this.mt.network.changePrimaryDc(dcId)\n }\n}\n"]}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/highlevel/base.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/require-await */\nimport { mtp, tl } from '@mtcute/tl'\n\nimport { MtClient, MtClientOptions } from '../network/client.js'\nimport { ConnectionKind, RpcCallOptions } from '../network/network-manager.js'\nimport { StorageManagerExtraOptions } from '../storage/storage.js'\nimport { MtArgumentError } from '../types/errors.js'\nimport { MustEqual } from '../types/utils.js'\nimport { reportUnknownError } from '../utils/error-reporting.js'\nimport {\n asyncResettable,\n computeNewPasswordHash,\n computeSrpParams,\n isTlRpcError,\n readStringSession,\n StringSessionData,\n writeStringSession,\n} from '../utils/index.js'\nimport { LogManager } from '../utils/logger.js'\nimport { ConnectionState, ITelegramClient, ServerUpdateHandler } from './client.types.js'\nimport { AppConfigManager } from './managers/app-config-manager.js'\nimport { ITelegramStorageProvider } from './storage/provider.js'\nimport { TelegramStorageManager, TelegramStorageManagerExtraOptions } from './storage/storage.js'\nimport { UpdatesManager } from './updates/manager.js'\nimport { RawUpdateHandler, UpdatesManagerParams } from './updates/types.js'\n\nexport interface BaseTelegramClientOptions extends MtClientOptions {\n storage: ITelegramStorageProvider\n storageOptions?: StorageManagerExtraOptions & TelegramStorageManagerExtraOptions\n updates?: UpdatesManagerParams | false\n}\n\nfunction makeRpcError(raw: mtp.RawMt_rpc_error, stack: string, method?: string) {\n const error = tl.RpcError.fromTl(raw)\n error.stack = `RpcError (${error.code} ${error.text}): ${error.message}\\n at ${method}\\n${stack\n .split('\\n')\n .slice(2)\n .join('\\n')}`\n\n return error\n}\n\nexport class BaseTelegramClient implements ITelegramClient {\n readonly updates?: UpdatesManager\n private _serverUpdatesHandler: ServerUpdateHandler = () => {}\n private _connectionStateHandler: (state: ConnectionState) => void = () => {}\n\n readonly log\n readonly mt\n readonly crypto\n readonly storage\n\n constructor(readonly params: BaseTelegramClientOptions) {\n this.log = this.params.logger ?? new LogManager('client')\n this.mt = new MtClient({\n ...this.params,\n logger: this.log.create('mtproto'),\n })\n\n if (!params.disableUpdates && params.updates !== false) {\n this.updates = new UpdatesManager(this, params.updates)\n this._serverUpdatesHandler = this.updates.handleUpdate.bind(this.updates)\n this.updates.onCatchingUp((catchingUp) => {\n this._connectionStateHandler(catchingUp ? 'updating' : 'connected')\n })\n }\n\n this.mt.on('update', (update: tl.TypeUpdates) => {\n this._serverUpdatesHandler(update)\n })\n this.mt.on('usable', () => {\n this._connectionStateHandler('connected')\n })\n this.mt.on('wait', () => {\n this._connectionStateHandler('connecting')\n })\n this.mt.on('networkChanged', (connected: boolean) => {\n if (!connected) {\n this._connectionStateHandler('offline')\n }\n })\n\n this.crypto = this.mt.crypto\n this.storage = new TelegramStorageManager(this.mt.storage, {\n provider: this.params.storage,\n ...this.params.storageOptions,\n })\n }\n readonly appConfig = new AppConfigManager(this)\n\n private _prepare = asyncResettable(async () => {\n await this.mt.prepare()\n\n const self = await this.storage.self.fetch()\n this.log.prefix = `[USER ${self?.userId ?? 'n/a'}] `\n this.mt.network.setIsPremium(self?.isPremium ?? false)\n\n await this.updates?.prepare()\n })\n\n /**\n * **ADVANCED**\n *\n * Do all the preparations, but don't connect just yet.\n * Useful when you want to do some preparations before\n * connecting, like setting up session.\n *\n * Call {@link connect} to actually connect.\n */\n prepare() {\n return this._prepare.run()\n }\n\n // used in a hot path, avoid extra function calls\n private _connected = false\n private _connect = asyncResettable(async () => {\n await this._prepare.run()\n await this.mt.connect()\n this._connected = true\n })\n\n /**\n * Initialize the connection to the primary DC.\n *\n * You shouldn't usually call this method directly as it is called\n * implicitly the first time you call {@link call}.\n */\n async connect(): Promise<void> {\n return this._connect.run()\n }\n\n get isConnected(): boolean {\n return this._connected\n }\n\n async close(): Promise<void> {\n this._connected = false\n await this.mt.close()\n this.updates?.stopLoop()\n this._prepare.reset()\n this._connect.reset()\n }\n\n async notifyLoggedIn(auth: tl.auth.TypeAuthorization | tl.RawUser): Promise<tl.RawUser> {\n const user = this.mt.network.notifyLoggedIn(auth)\n\n this.log.prefix = `[USER ${user.id}] `\n const self = await this.storage.self.storeFrom(user)\n\n this.updates?.notifyLoggedIn(self)\n\n return user\n }\n\n async notifyLoggedOut(): Promise<void> {\n this.mt.network.notifyLoggedOut()\n\n this.log.prefix = '[USER n/a] '\n await this.storage.self.store(null)\n }\n\n async notifyChannelOpened(channelId: number, pts?: number): Promise<boolean> {\n return this.updates?.notifyChannelOpened(channelId, pts) ?? false\n }\n\n async notifyChannelClosed(channelId: number): Promise<boolean> {\n return this.updates?.notifyChannelClosed(channelId) ?? false\n }\n\n async startUpdatesLoop(): Promise<void> {\n await this.updates?.startLoop()\n }\n\n async stopUpdatesLoop(): Promise<void> {\n this.updates?.stopLoop()\n }\n\n /**\n * Make an RPC call\n *\n * This method is still quite low-level and you shouldn't use this\n * when using high-level API provided by `@mtcute/client`.\n *\n * @param message RPC method to call\n * @param params Additional call parameters\n */\n async call<T extends tl.RpcMethod>(\n message: MustEqual<T, tl.RpcMethod>,\n params?: RpcCallOptions,\n ): Promise<tl.RpcCallReturn[T['_']]> {\n if (!this._connected) {\n await this._connect.run()\n }\n\n const res = await this.mt.call(message, params)\n\n if (isTlRpcError(res)) {\n const error = makeRpcError(res, new Error().stack ?? '', message._)\n\n if (error.unknown && this.params.enableErrorReporting) {\n reportUnknownError(this.log, error, message._)\n }\n\n throw error\n }\n\n await this.storage.peers.updatePeersFrom(res)\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return res\n }\n\n /**\n * Import the session from the given session string.\n *\n * Note that the session will only be imported in case\n * the storage is missing authorization (i.e. does not contain\n * auth key for the primary DC), otherwise it will be ignored (unless `force`).\n *\n * @param session Session string to import\n * @param force Whether to overwrite existing session\n */\n async importSession(session: string | StringSessionData, force = false): Promise<void> {\n await this.prepare()\n\n const defaultDcAuthKey = await this.mt.storage.provider.authKeys.get(this.mt._defaultDcs.main.id)\n\n if (defaultDcAuthKey && !force) return\n\n const data = typeof session === 'string' ? readStringSession(session) : session\n\n if (data.testMode && !this.params.testMode) {\n throw new Error(\n 'This session string is not for the current backend. ' +\n `Session is ${data.testMode ? 'test' : 'prod'}, ` +\n `but the client is ${this.params.testMode ? 'test' : 'prod'}`,\n )\n }\n\n this.mt._defaultDcs = data.primaryDcs\n await this.mt.storage.dcs.store(data.primaryDcs)\n\n if (data.self) {\n await this.storage.self.store(data.self)\n }\n\n await this.mt.storage.provider.authKeys.set(data.primaryDcs.main.id, data.authKey)\n\n await this.mt.storage.save()\n }\n\n /**\n * Export current session to a single *LONG* string, containing\n * all the needed information.\n *\n * > **Warning!** Anyone with this string will be able\n * > to authorize as you and do anything. Treat this\n * > as your password, and never give it away!\n * >\n * > In case you have accidentally leaked this string,\n * > make sure to revoke this session in account settings:\n * > \"Privacy & Security\" > \"Active sessions\" >\n * > find the one containing `mtcute` > Revoke,\n * > or, in case this is a bot, revoke bot token\n * > with [@BotFather](//t.me/botfather)\n */\n async exportSession(): Promise<string> {\n await this._prepare.run()\n\n const primaryDcs = (await this.mt.storage.dcs.fetch()) ?? this.mt._defaultDcs\n\n const authKey = await this.mt.storage.provider.authKeys.get(primaryDcs.main.id)\n if (!authKey) throw new Error('Auth key is not ready yet')\n\n return writeStringSession({\n version: 3,\n self: await this.storage.self.fetch(),\n testMode: Boolean(this.params.testMode),\n primaryDcs,\n authKey,\n })\n }\n\n /**\n * Register an error handler for the client\n *\n * @param handler Error handler.\n */\n onError(handler: (err: unknown) => void): void {\n this.mt.onError(handler)\n }\n\n emitError(err: unknown): void {\n this.mt.emitError(err)\n }\n\n handleClientUpdate(updates: tl.TypeUpdates, noDispatch?: boolean): void {\n this.updates?.handleClientUpdate(updates, noDispatch)\n }\n\n onServerUpdate(handler: ServerUpdateHandler): void {\n this._serverUpdatesHandler = handler\n }\n\n getServerUpdateHandler(): ServerUpdateHandler {\n return this._serverUpdatesHandler\n }\n\n onUpdate(handler: RawUpdateHandler): void {\n if (!this.updates) {\n throw new MtArgumentError('Updates manager is disabled')\n }\n\n this.updates.setHandler(handler)\n }\n\n onConnectionState(handler: (state: ConnectionState) => void): void {\n this._connectionStateHandler = handler\n }\n\n async getApiCrenetials() {\n return {\n id: this.params.apiId,\n hash: this.params.apiHash,\n }\n }\n\n async getPoolSize(kind: ConnectionKind, dcId?: number): Promise<number> {\n if (!this._connected) {\n await this._connect.run()\n }\n\n return this.mt.network.getPoolSize(kind, dcId)\n }\n\n async getPrimaryDcId(): Promise<number> {\n if (!this._connected) {\n await this._connect.run()\n }\n\n return this.mt.network.getPrimaryDcId()\n }\n\n computeSrpParams(request: tl.account.RawPassword, password: string): Promise<tl.RawInputCheckPasswordSRP> {\n return computeSrpParams(this.crypto, request, password)\n }\n computeNewPasswordHash(algo: tl.TypePasswordKdfAlgo, password: string): Promise<Uint8Array> {\n return computeNewPasswordHash(this.crypto, algo, password)\n }\n\n get stopSignal(): AbortSignal {\n return this.mt.stopSignal\n }\n\n changePrimaryDc(dcId: number): Promise<void> {\n return this.mt.network.changePrimaryDc(dcId)\n }\n}\n"]}
@@ -409,6 +409,11 @@ export interface TelegramClient extends ITelegramClient {
409
409
  * The app is expected to display `url` as a QR code to the user
410
410
  */
411
411
  onUrlUpdated: (url: string, expires: Date) => void;
412
+ /**
413
+ * Function that will be called when the user has scanned the QR code
414
+ * (i.e. when `updateLoginToken` is received), and the library is finalizing the auth
415
+ */
416
+ onQrScanned?: () => void;
412
417
  /** Password for 2FA */
413
418
  password?: MaybeDynamic<string>;
414
419
  /**