@mtcute/core 0.15.1 → 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 (67) 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/worker/invoker.d.ts +1 -0
  9. package/cjs/highlevel/worker/invoker.js +13 -1
  10. package/cjs/highlevel/worker/invoker.js.map +1 -1
  11. package/cjs/highlevel/worker/port.d.ts +9 -6
  12. package/cjs/highlevel/worker/port.js +7 -2
  13. package/cjs/highlevel/worker/port.js.map +1 -1
  14. package/cjs/highlevel/worker/protocol.d.ts +4 -0
  15. package/cjs/highlevel/worker/protocol.js.map +1 -1
  16. package/cjs/highlevel/worker/worker.d.ts +1 -0
  17. package/cjs/highlevel/worker/worker.js +27 -1
  18. package/cjs/highlevel/worker/worker.js.map +1 -1
  19. package/cjs/network/client.d.ts +2 -16
  20. package/cjs/network/client.js +7 -5
  21. package/cjs/network/client.js.map +1 -1
  22. package/cjs/network/multi-session-connection.d.ts +2 -2
  23. package/cjs/network/multi-session-connection.js +2 -2
  24. package/cjs/network/multi-session-connection.js.map +1 -1
  25. package/cjs/network/network-manager.d.ts +2 -2
  26. package/cjs/network/network-manager.js +65 -51
  27. package/cjs/network/network-manager.js.map +1 -1
  28. package/cjs/network/session-connection.d.ts +1 -2
  29. package/cjs/network/session-connection.js +7 -26
  30. package/cjs/network/session-connection.js.map +1 -1
  31. package/cjs/utils/type-assertions.d.ts +1 -0
  32. package/cjs/utils/type-assertions.js +5 -1
  33. package/cjs/utils/type-assertions.js.map +1 -1
  34. package/esm/highlevel/base.js +19 -1
  35. package/esm/highlevel/base.js.map +1 -1
  36. package/esm/highlevel/client.d.ts +5 -0
  37. package/esm/highlevel/client.js.map +1 -1
  38. package/esm/highlevel/methods/auth/sign-in-qr.d.ts +5 -0
  39. package/esm/highlevel/methods/auth/sign-in-qr.js +2 -1
  40. package/esm/highlevel/methods/auth/sign-in-qr.js.map +1 -1
  41. package/esm/highlevel/worker/invoker.d.ts +1 -0
  42. package/esm/highlevel/worker/invoker.js +13 -1
  43. package/esm/highlevel/worker/invoker.js.map +1 -1
  44. package/esm/highlevel/worker/port.d.ts +9 -6
  45. package/esm/highlevel/worker/port.js +7 -2
  46. package/esm/highlevel/worker/port.js.map +1 -1
  47. package/esm/highlevel/worker/protocol.d.ts +4 -0
  48. package/esm/highlevel/worker/protocol.js.map +1 -1
  49. package/esm/highlevel/worker/worker.d.ts +1 -0
  50. package/esm/highlevel/worker/worker.js +27 -1
  51. package/esm/highlevel/worker/worker.js.map +1 -1
  52. package/esm/network/client.d.ts +2 -16
  53. package/esm/network/client.js +8 -6
  54. package/esm/network/client.js.map +1 -1
  55. package/esm/network/multi-session-connection.d.ts +2 -2
  56. package/esm/network/multi-session-connection.js +2 -2
  57. package/esm/network/multi-session-connection.js.map +1 -1
  58. package/esm/network/network-manager.d.ts +2 -2
  59. package/esm/network/network-manager.js +66 -52
  60. package/esm/network/network-manager.js.map +1 -1
  61. package/esm/network/session-connection.d.ts +1 -2
  62. package/esm/network/session-connection.js +7 -26
  63. package/esm/network/session-connection.js.map +1 -1
  64. package/esm/utils/type-assertions.d.ts +1 -0
  65. package/esm/utils/type-assertions.js +3 -0
  66. package/esm/utils/type-assertions.js.map +1 -1
  67. package/package.json +1 -1
@@ -14,6 +14,11 @@ export declare function signInQr(client: ITelegramClient, params: {
14
14
  * The app is expected to display `url` as a QR code to the user
15
15
  */
16
16
  onUrlUpdated: (url: string, expires: Date) => void;
17
+ /**
18
+ * Function that will be called when the user has scanned the QR code
19
+ * (i.e. when `updateLoginToken` is received), and the library is finalizing the auth
20
+ */
21
+ onQrScanned?: () => void;
17
22
  /** Password for 2FA */
18
23
  password?: MaybeDynamic<string>;
19
24
  /**
@@ -17,7 +17,7 @@ const check_password_js_1 = require("./check-password.js");
17
17
  * returning the authorized user.
18
18
  */
19
19
  async function signInQr(client, params) {
20
- const { onUrlUpdated, abortSignal } = params;
20
+ const { onUrlUpdated, abortSignal, onQrScanned } = params;
21
21
  let waiter;
22
22
  // crutch – we need to wait for the updateLoginToken update.
23
23
  // we replace the server update handler temporarily because:
@@ -28,6 +28,7 @@ async function signInQr(client, params) {
28
28
  const originalHandler = client.getServerUpdateHandler();
29
29
  const onUpdate = (upd) => {
30
30
  if (upd._ === 'updateShort' && upd.update._ === 'updateLoginToken') {
31
+ onQrScanned?.();
31
32
  waiter?.resolve();
32
33
  client.onServerUpdate(originalHandler);
33
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sign-in-qr.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/auth/sign-in-qr.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { getPlatform } from '../../../platform.js'\nimport { MaybePromise } from '../../../types/utils.js'\nimport { ControllablePromise, createControllablePromise } from '../../../utils/controllable-promise.js'\nimport { sleepWithAbort } from '../../../utils/misc-utils.js'\nimport { assertTypeIs } from '../../../utils/type-assertions.js'\nimport { ITelegramClient, ServerUpdateHandler } from '../../client.types.js'\nimport { MaybeDynamic, User } from '../../types/index.js'\nimport { resolveMaybeDynamic } from '../../utils/misc-utils.js'\nimport { checkPassword } from './check-password.js'\n\n// @available=user\n/**\n * Execute the [QR login flow](https://core.telegram.org/api/qr-login).\n *\n * This method will resolve once the authorization is complete,\n * returning the authorized user.\n */\nexport async function signInQr(\n client: ITelegramClient,\n params: {\n /**\n * Function that will be called whenever the login URL is changed.\n *\n * The app is expected to display `url` as a QR code to the user\n */\n onUrlUpdated: (url: string, expires: Date) => void\n\n /** Password for 2FA */\n password?: MaybeDynamic<string>\n\n /**\n * Function that will be called after the server has rejected the password.\n *\n * Note that in case {@link password} is not a function,\n * this callback will never be called, and an error will be thrown instead.\n */\n invalidPasswordCallback?: () => MaybePromise<void>\n\n /** Abort signal */\n abortSignal?: AbortSignal\n },\n): Promise<User> {\n const { onUrlUpdated, abortSignal } = params\n\n let waiter: ControllablePromise<void> | undefined\n\n // crutch – we need to wait for the updateLoginToken update.\n // we replace the server update handler temporarily because:\n // - updates manager may be disabled, in which case `onUpdate` will never be called\n // - even if the updates manager is enabled, it won't start until we're logged in\n //\n // todo: how can we make this more clean?\n const originalHandler = client.getServerUpdateHandler()\n\n const onUpdate: ServerUpdateHandler = (upd) => {\n if (upd._ === 'updateShort' && upd.update._ === 'updateLoginToken') {\n waiter?.resolve()\n client.onServerUpdate(originalHandler)\n }\n }\n\n client.onServerUpdate(onUpdate)\n\n abortSignal?.addEventListener('abort', () => {\n client.onServerUpdate(originalHandler)\n waiter?.reject(abortSignal.reason)\n })\n\n async function handle2fa(input: MaybeDynamic<string>) {\n const isDynamic = typeof input === 'function'\n\n while (true) {\n const password = await resolveMaybeDynamic(input)\n\n try {\n return await checkPassword(client, password)\n } catch (e) {\n if (tl.RpcError.is(e, 'PASSWORD_HASH_INVALID')) {\n if (!isDynamic) {\n throw e\n }\n\n if (params.invalidPasswordCallback) {\n await params.invalidPasswordCallback?.()\n } else {\n // eslint-disable-next-line no-console\n console.log('Invalid password. Please try again')\n }\n continue\n }\n\n throw e\n }\n }\n }\n\n try {\n const { id, hash } = await client.getApiCrenetials()\n const platform = getPlatform()\n\n loop: while (true) {\n let res: tl.auth.TypeLoginToken\n\n try {\n res = await client.call(\n {\n _: 'auth.exportLoginToken',\n apiId: id,\n apiHash: hash,\n exceptIds: [],\n },\n { abortSignal },\n )\n } catch (e) {\n if (tl.RpcError.is(e, 'SESSION_PASSWORD_NEEDED') && params.password) {\n return handle2fa(params.password)\n }\n\n throw e\n }\n\n switch (res._) {\n case 'auth.loginToken':\n onUrlUpdated(\n `tg://login?token=${platform.base64Encode(res.token, true)}`,\n new Date(res.expires * 1000),\n )\n\n waiter = createControllablePromise()\n await Promise.race([waiter, sleepWithAbort(res.expires * 1000 - Date.now(), client.stopSignal)])\n break\n case 'auth.loginTokenMigrateTo': {\n await client.changePrimaryDc(res.dcId)\n\n let res2: tl.auth.TypeLoginToken\n\n try {\n res2 = await client.call(\n {\n _: 'auth.importLoginToken',\n token: res.token,\n },\n { abortSignal },\n )\n } catch (e) {\n if (tl.RpcError.is(e, 'SESSION_PASSWORD_NEEDED') && params.password) {\n return handle2fa(params.password)\n }\n\n throw e\n }\n\n assertTypeIs('auth.importLoginToken', res2, 'auth.loginTokenSuccess')\n break loop\n }\n case 'auth.loginTokenSuccess':\n break loop\n }\n }\n\n const [self] = await client.call(\n {\n _: 'users.getUsers',\n id: [{ _: 'inputUserSelf' }],\n },\n { abortSignal },\n )\n assertTypeIs('users.getUsers', self, 'user')\n\n await client.notifyLoggedIn(self)\n\n return new User(self)\n } finally {\n client.onServerUpdate(originalHandler)\n }\n}\n"]}
1
+ {"version":3,"file":"sign-in-qr.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/auth/sign-in-qr.ts"],"names":[],"mappings":";;;AAAA,mCAA+B;AAE/B,sDAAkD;AAElD,oFAAuG;AACvG,gEAA6D;AAC7D,0EAAgE;AAEhE,mDAAyD;AACzD,6DAA+D;AAC/D,2DAAmD;AAEnD,kBAAkB;AAClB;;;;;GAKG;AACI,KAAK,UAAU,QAAQ,CAC1B,MAAuB,EACvB,MA2BC;IAED,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,MAAM,CAAA;IAEzD,IAAI,MAA6C,CAAA;IAEjD,4DAA4D;IAC5D,4DAA4D;IAC5D,qFAAqF;IACrF,mFAAmF;IACnF,EAAE;IACF,yCAAyC;IACzC,MAAM,eAAe,GAAG,MAAM,CAAC,sBAAsB,EAAE,CAAA;IAEvD,MAAM,QAAQ,GAAwB,CAAC,GAAG,EAAE,EAAE;QAC1C,IAAI,GAAG,CAAC,CAAC,KAAK,aAAa,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,kBAAkB,EAAE,CAAC;YACjE,WAAW,EAAE,EAAE,CAAA;YACf,MAAM,EAAE,OAAO,EAAE,CAAA;YACjB,MAAM,CAAC,cAAc,CAAC,eAAe,CAAC,CAAA;QAC1C,CAAC;IACL,CAAC,CAAA;IAED,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAA;IAE/B,WAAW,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,cAAc,CAAC,eAAe,CAAC,CAAA;QACtC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,KAAK,UAAU,SAAS,CAAC,KAA2B;QAChD,MAAM,SAAS,GAAG,OAAO,KAAK,KAAK,UAAU,CAAA;QAE7C,OAAO,IAAI,EAAE,CAAC;YACV,MAAM,QAAQ,GAAG,MAAM,IAAA,mCAAmB,EAAC,KAAK,CAAC,CAAA;YAEjD,IAAI,CAAC;gBACD,OAAO,MAAM,IAAA,iCAAa,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;YAChD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,IAAI,OAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,uBAAuB,CAAC,EAAE,CAAC;oBAC7C,IAAI,CAAC,SAAS,EAAE,CAAC;wBACb,MAAM,CAAC,CAAA;oBACX,CAAC;oBAED,IAAI,MAAM,CAAC,uBAAuB,EAAE,CAAC;wBACjC,MAAM,MAAM,CAAC,uBAAuB,EAAE,EAAE,CAAA;oBAC5C,CAAC;yBAAM,CAAC;wBACJ,sCAAsC;wBACtC,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAA;oBACrD,CAAC;oBACD,SAAQ;gBACZ,CAAC;gBAED,MAAM,CAAC,CAAA;YACX,CAAC;QACL,CAAC;IACL,CAAC;IAED,IAAI,CAAC;QACD,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,EAAE,CAAA;QACpD,MAAM,QAAQ,GAAG,IAAA,yBAAW,GAAE,CAAA;QAE9B,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;YAChB,IAAI,GAA2B,CAAA;YAE/B,IAAI,CAAC;gBACD,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CACnB;oBACI,CAAC,EAAE,uBAAuB;oBAC1B,KAAK,EAAE,EAAE;oBACT,OAAO,EAAE,IAAI;oBACb,SAAS,EAAE,EAAE;iBAChB,EACD,EAAE,WAAW,EAAE,CAClB,CAAA;YACL,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,IAAI,OAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,yBAAyB,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;oBAClE,OAAO,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;gBACrC,CAAC;gBAED,MAAM,CAAC,CAAA;YACX,CAAC;YAED,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC;gBACZ,KAAK,iBAAiB;oBAClB,YAAY,CACR,oBAAoB,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAC5D,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,CAC/B,CAAA;oBAED,MAAM,GAAG,IAAA,mDAAyB,GAAE,CAAA;oBACpC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,IAAA,8BAAc,EAAC,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;oBAChG,MAAK;gBACT,KAAK,0BAA0B,CAAC,CAAC,CAAC;oBAC9B,MAAM,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;oBAEtC,IAAI,IAA4B,CAAA;oBAEhC,IAAI,CAAC;wBACD,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CACpB;4BACI,CAAC,EAAE,uBAAuB;4BAC1B,KAAK,EAAE,GAAG,CAAC,KAAK;yBACnB,EACD,EAAE,WAAW,EAAE,CAClB,CAAA;oBACL,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACT,IAAI,OAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,yBAAyB,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;4BAClE,OAAO,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;wBACrC,CAAC;wBAED,MAAM,CAAC,CAAA;oBACX,CAAC;oBAED,IAAA,iCAAY,EAAC,uBAAuB,EAAE,IAAI,EAAE,wBAAwB,CAAC,CAAA;oBACrE,MAAM,IAAI,CAAA;gBACd,CAAC;gBACD,KAAK,wBAAwB;oBACzB,MAAM,IAAI,CAAA;YAClB,CAAC;QACL,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,MAAM,CAAC,IAAI,CAC5B;YACI,CAAC,EAAE,gBAAgB;YACnB,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC;SAC/B,EACD,EAAE,WAAW,EAAE,CAClB,CAAA;QACD,IAAA,iCAAY,EAAC,gBAAgB,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;QAE5C,MAAM,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;QAEjC,OAAO,IAAI,eAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;YAAS,CAAC;QACP,MAAM,CAAC,cAAc,CAAC,eAAe,CAAC,CAAA;IAC1C,CAAC;AACL,CAAC;AArKD,4BAqKC","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { getPlatform } from '../../../platform.js'\nimport { MaybePromise } from '../../../types/utils.js'\nimport { ControllablePromise, createControllablePromise } from '../../../utils/controllable-promise.js'\nimport { sleepWithAbort } from '../../../utils/misc-utils.js'\nimport { assertTypeIs } from '../../../utils/type-assertions.js'\nimport { ITelegramClient, ServerUpdateHandler } from '../../client.types.js'\nimport { MaybeDynamic, User } from '../../types/index.js'\nimport { resolveMaybeDynamic } from '../../utils/misc-utils.js'\nimport { checkPassword } from './check-password.js'\n\n// @available=user\n/**\n * Execute the [QR login flow](https://core.telegram.org/api/qr-login).\n *\n * This method will resolve once the authorization is complete,\n * returning the authorized user.\n */\nexport async function signInQr(\n client: ITelegramClient,\n params: {\n /**\n * Function that will be called whenever the login URL is changed.\n *\n * The app is expected to display `url` as a QR code to the user\n */\n onUrlUpdated: (url: string, expires: Date) => void\n\n /**\n * Function that will be called when the user has scanned the QR code\n * (i.e. when `updateLoginToken` is received), and the library is finalizing the auth\n */\n onQrScanned?: () => void\n\n /** Password for 2FA */\n password?: MaybeDynamic<string>\n\n /**\n * Function that will be called after the server has rejected the password.\n *\n * Note that in case {@link password} is not a function,\n * this callback will never be called, and an error will be thrown instead.\n */\n invalidPasswordCallback?: () => MaybePromise<void>\n\n /** Abort signal */\n abortSignal?: AbortSignal\n },\n): Promise<User> {\n const { onUrlUpdated, abortSignal, onQrScanned } = params\n\n let waiter: ControllablePromise<void> | undefined\n\n // crutch – we need to wait for the updateLoginToken update.\n // we replace the server update handler temporarily because:\n // - updates manager may be disabled, in which case `onUpdate` will never be called\n // - even if the updates manager is enabled, it won't start until we're logged in\n //\n // todo: how can we make this more clean?\n const originalHandler = client.getServerUpdateHandler()\n\n const onUpdate: ServerUpdateHandler = (upd) => {\n if (upd._ === 'updateShort' && upd.update._ === 'updateLoginToken') {\n onQrScanned?.()\n waiter?.resolve()\n client.onServerUpdate(originalHandler)\n }\n }\n\n client.onServerUpdate(onUpdate)\n\n abortSignal?.addEventListener('abort', () => {\n client.onServerUpdate(originalHandler)\n waiter?.reject(abortSignal.reason)\n })\n\n async function handle2fa(input: MaybeDynamic<string>) {\n const isDynamic = typeof input === 'function'\n\n while (true) {\n const password = await resolveMaybeDynamic(input)\n\n try {\n return await checkPassword(client, password)\n } catch (e) {\n if (tl.RpcError.is(e, 'PASSWORD_HASH_INVALID')) {\n if (!isDynamic) {\n throw e\n }\n\n if (params.invalidPasswordCallback) {\n await params.invalidPasswordCallback?.()\n } else {\n // eslint-disable-next-line no-console\n console.log('Invalid password. Please try again')\n }\n continue\n }\n\n throw e\n }\n }\n }\n\n try {\n const { id, hash } = await client.getApiCrenetials()\n const platform = getPlatform()\n\n loop: while (true) {\n let res: tl.auth.TypeLoginToken\n\n try {\n res = await client.call(\n {\n _: 'auth.exportLoginToken',\n apiId: id,\n apiHash: hash,\n exceptIds: [],\n },\n { abortSignal },\n )\n } catch (e) {\n if (tl.RpcError.is(e, 'SESSION_PASSWORD_NEEDED') && params.password) {\n return handle2fa(params.password)\n }\n\n throw e\n }\n\n switch (res._) {\n case 'auth.loginToken':\n onUrlUpdated(\n `tg://login?token=${platform.base64Encode(res.token, true)}`,\n new Date(res.expires * 1000),\n )\n\n waiter = createControllablePromise()\n await Promise.race([waiter, sleepWithAbort(res.expires * 1000 - Date.now(), client.stopSignal)])\n break\n case 'auth.loginTokenMigrateTo': {\n await client.changePrimaryDc(res.dcId)\n\n let res2: tl.auth.TypeLoginToken\n\n try {\n res2 = await client.call(\n {\n _: 'auth.importLoginToken',\n token: res.token,\n },\n { abortSignal },\n )\n } catch (e) {\n if (tl.RpcError.is(e, 'SESSION_PASSWORD_NEEDED') && params.password) {\n return handle2fa(params.password)\n }\n\n throw e\n }\n\n assertTypeIs('auth.importLoginToken', res2, 'auth.loginTokenSuccess')\n break loop\n }\n case 'auth.loginTokenSuccess':\n break loop\n }\n }\n\n const [self] = await client.call(\n {\n _: 'users.getUsers',\n id: [{ _: 'inputUserSelf' }],\n },\n { abortSignal },\n )\n assertTypeIs('users.getUsers', self, 'user')\n\n await client.notifyLoggedIn(self)\n\n return new User(self)\n } finally {\n client.onServerUpdate(originalHandler)\n }\n}\n"]}
@@ -10,6 +10,7 @@ export declare class WorkerInvoker {
10
10
  private _invoke;
11
11
  invoke(target: InvokeTarget, method: string, args: unknown[]): Promise<unknown>;
12
12
  invokeVoid(target: InvokeTarget, method: string, args: unknown[]): void;
13
+ invokeWithAbort(target: InvokeTarget, method: string, args: unknown[], abortSignal: AbortSignal): Promise<unknown>;
13
14
  handleResult(msg: Extract<WorkerOutboundMessage, {
14
15
  type: 'result';
15
16
  }>): void;
@@ -10,7 +10,7 @@ class WorkerInvoker {
10
10
  }
11
11
  _nextId = 0;
12
12
  _pending = new Map();
13
- _invoke(target, method, args, isVoid) {
13
+ _invoke(target, method, args, isVoid, abortSignal) {
14
14
  const id = this._nextId++;
15
15
  this.send({
16
16
  type: 'invoke',
@@ -19,6 +19,13 @@ class WorkerInvoker {
19
19
  method,
20
20
  args,
21
21
  void: isVoid,
22
+ withAbort: Boolean(abortSignal),
23
+ });
24
+ abortSignal?.addEventListener('abort', () => {
25
+ this.send({
26
+ type: 'abort',
27
+ id,
28
+ });
22
29
  });
23
30
  if (!isVoid) {
24
31
  const promise = (0, controllable_promise_js_1.createControllablePromise)();
@@ -33,6 +40,11 @@ class WorkerInvoker {
33
40
  // eslint-disable-next-line @typescript-eslint/no-floating-promises
34
41
  this._invoke(target, method, args, true);
35
42
  }
43
+ invokeWithAbort(target, method, args, abortSignal) {
44
+ if (abortSignal.aborted)
45
+ return Promise.reject(abortSignal.reason);
46
+ return this._invoke(target, method, args, false, abortSignal);
47
+ }
36
48
  handleResult(msg) {
37
49
  const promise = this._pending.get(msg.id);
38
50
  if (!promise)
@@ -1 +1 @@
1
- {"version":3,"file":"invoker.js","sourceRoot":"","sources":["../../../../src/highlevel/worker/invoker.ts"],"names":[],"mappings":";;;AAAA,iFAAoG;AACpG,2CAA8C;AAK9C,MAAa,aAAa;IACF;IAApB,YAAoB,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;IAE5B,OAAO,GAAG,CAAC,CAAA;IACX,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAA;IAEjD,OAAO,CAAC,MAAoB,EAAE,MAAc,EAAE,IAAe,EAAE,MAAe;QAClF,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;QAEzB,IAAI,CAAC,IAAI,CAAC;YACN,IAAI,EAAE,QAAQ;YACd,EAAE;YACF,MAAM;YACN,MAAM;YACN,IAAI;YACJ,IAAI,EAAE,MAAM;SACf,CAAC,CAAA;QAEF,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,IAAA,mDAAyB,GAAE,CAAA;YAE3C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;YAE9B,OAAO,OAAO,CAAA;QAClB,CAAC;IACL,CAAC;IAED,MAAM,CAAC,MAAoB,EAAE,MAAc,EAAE,IAAe;QACxD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAqB,CAAA;IACxE,CAAC;IAED,UAAU,CAAC,MAAoB,EAAE,MAAc,EAAE,IAAe;QAC5D,mEAAmE;QACnE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IAC5C,CAAC;IAED,YAAY,CAAC,GAAuD;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACzC,IAAI,CAAC,OAAO;YAAE,OAAM;QAEpB,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,CAAC,IAAA,4BAAgB,EAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;QAC/C,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAC/B,CAAC;IACL,CAAC;IAED,UAAU,CAAI,MAAoB;QAC9B,OAAO,CAAoB,MAAS,EAAE,MAAM,GAAG,KAAK,EAAE,EAAE;YACpD,IAAI,EAAE,CAAA;YAEN,IAAI,MAAM,EAAE,CAAC;gBACT,EAAE,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAgB,EAAE,IAAI,CAAC,CAAA;YAChF,CAAC;iBAAM,CAAC;gBACJ,EAAE,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAgB,EAAE,IAAI,CAAC,CAAA;YAC5E,CAAC;YAED,OAAO,EAAU,CAAA;QACrB,CAAC,CAAA;IACL,CAAC;CACJ;AA5DD,sCA4DC","sourcesContent":["import { ControllablePromise, createControllablePromise } from '../../utils/controllable-promise.js'\nimport { deserializeError } from './errors.js'\nimport { SendFn, WorkerInboundMessage, WorkerOutboundMessage } from './protocol.js'\n\nexport type InvokeTarget = Extract<WorkerInboundMessage, { type: 'invoke' }>['target']\n\nexport class WorkerInvoker {\n constructor(private send: SendFn) {}\n\n private _nextId = 0\n private _pending = new Map<number, ControllablePromise>()\n\n private _invoke(target: InvokeTarget, method: string, args: unknown[], isVoid: boolean) {\n const id = this._nextId++\n\n this.send({\n type: 'invoke',\n id,\n target,\n method,\n args,\n void: isVoid,\n })\n\n if (!isVoid) {\n const promise = createControllablePromise()\n\n this._pending.set(id, promise)\n\n return promise\n }\n }\n\n invoke(target: InvokeTarget, method: string, args: unknown[]): Promise<unknown> {\n return this._invoke(target, method, args, false) as Promise<unknown>\n }\n\n invokeVoid(target: InvokeTarget, method: string, args: unknown[]): void {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._invoke(target, method, args, true)\n }\n\n handleResult(msg: Extract<WorkerOutboundMessage, { type: 'result' }>) {\n const promise = this._pending.get(msg.id)\n if (!promise) return\n\n if (msg.error) {\n promise.reject(deserializeError(msg.error))\n } else {\n promise.resolve(msg.result)\n }\n }\n\n makeBinder<T>(target: InvokeTarget) {\n return <K extends keyof T>(method: K, isVoid = false) => {\n let fn\n\n if (isVoid) {\n fn = (...args: unknown[]) => this.invokeVoid(target, method as string, args)\n } else {\n fn = (...args: unknown[]) => this.invoke(target, method as string, args)\n }\n\n return fn as T[K]\n }\n }\n}\n"]}
1
+ {"version":3,"file":"invoker.js","sourceRoot":"","sources":["../../../../src/highlevel/worker/invoker.ts"],"names":[],"mappings":";;;AAAA,iFAAoG;AACpG,2CAA8C;AAK9C,MAAa,aAAa;IACF;IAApB,YAAoB,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;IAE5B,OAAO,GAAG,CAAC,CAAA;IACX,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAA;IAEjD,OAAO,CAAC,MAAoB,EAAE,MAAc,EAAE,IAAe,EAAE,MAAe,EAAE,WAAyB;QAC7G,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;QAEzB,IAAI,CAAC,IAAI,CAAC;YACN,IAAI,EAAE,QAAQ;YACd,EAAE;YACF,MAAM;YACN,MAAM;YACN,IAAI;YACJ,IAAI,EAAE,MAAM;YACZ,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC;SAClC,CAAC,CAAA;QAEF,WAAW,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACxC,IAAI,CAAC,IAAI,CAAC;gBACN,IAAI,EAAE,OAAO;gBACb,EAAE;aACL,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,IAAA,mDAAyB,GAAE,CAAA;YAE3C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;YAE9B,OAAO,OAAO,CAAA;QAClB,CAAC;IACL,CAAC;IAED,MAAM,CAAC,MAAoB,EAAE,MAAc,EAAE,IAAe;QACxD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAqB,CAAA;IACxE,CAAC;IAED,UAAU,CAAC,MAAoB,EAAE,MAAc,EAAE,IAAe;QAC5D,mEAAmE;QACnE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IAC5C,CAAC;IAED,eAAe,CAAC,MAAoB,EAAE,MAAc,EAAE,IAAe,EAAE,WAAwB;QAC3F,IAAI,WAAW,CAAC,OAAO;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;QAElE,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAqB,CAAA;IACrF,CAAC;IAED,YAAY,CAAC,GAAuD;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACzC,IAAI,CAAC,OAAO;YAAE,OAAM;QAEpB,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,CAAC,IAAA,4BAAgB,EAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;QAC/C,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAC/B,CAAC;IACL,CAAC;IAED,UAAU,CAAI,MAAoB;QAC9B,OAAO,CAAoB,MAAS,EAAE,MAAM,GAAG,KAAK,EAAE,EAAE;YACpD,IAAI,EAAE,CAAA;YAEN,IAAI,MAAM,EAAE,CAAC;gBACT,EAAE,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAgB,EAAE,IAAI,CAAC,CAAA;YAChF,CAAC;iBAAM,CAAC;gBACJ,EAAE,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAgB,EAAE,IAAI,CAAC,CAAA;YAC5E,CAAC;YAED,OAAO,EAAU,CAAA;QACrB,CAAC,CAAA;IACL,CAAC;CACJ;AA1ED,sCA0EC","sourcesContent":["import { ControllablePromise, createControllablePromise } from '../../utils/controllable-promise.js'\nimport { deserializeError } from './errors.js'\nimport { SendFn, WorkerInboundMessage, WorkerOutboundMessage } from './protocol.js'\n\nexport type InvokeTarget = Extract<WorkerInboundMessage, { type: 'invoke' }>['target']\n\nexport class WorkerInvoker {\n constructor(private send: SendFn) {}\n\n private _nextId = 0\n private _pending = new Map<number, ControllablePromise>()\n\n private _invoke(target: InvokeTarget, method: string, args: unknown[], isVoid: boolean, abortSignal?: AbortSignal) {\n const id = this._nextId++\n\n this.send({\n type: 'invoke',\n id,\n target,\n method,\n args,\n void: isVoid,\n withAbort: Boolean(abortSignal),\n })\n\n abortSignal?.addEventListener('abort', () => {\n this.send({\n type: 'abort',\n id,\n })\n })\n\n if (!isVoid) {\n const promise = createControllablePromise()\n\n this._pending.set(id, promise)\n\n return promise\n }\n }\n\n invoke(target: InvokeTarget, method: string, args: unknown[]): Promise<unknown> {\n return this._invoke(target, method, args, false) as Promise<unknown>\n }\n\n invokeVoid(target: InvokeTarget, method: string, args: unknown[]): void {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._invoke(target, method, args, true)\n }\n\n invokeWithAbort(target: InvokeTarget, method: string, args: unknown[], abortSignal: AbortSignal): Promise<unknown> {\n if (abortSignal.aborted) return Promise.reject(abortSignal.reason)\n\n return this._invoke(target, method, args, false, abortSignal) as Promise<unknown>\n }\n\n handleResult(msg: Extract<WorkerOutboundMessage, { type: 'result' }>) {\n const promise = this._pending.get(msg.id)\n if (!promise) return\n\n if (msg.error) {\n promise.reject(deserializeError(msg.error))\n } else {\n promise.resolve(msg.result)\n }\n }\n\n makeBinder<T>(target: InvokeTarget) {\n return <K extends keyof T>(method: K, isVoid = false) => {\n let fn\n\n if (isVoid) {\n fn = (...args: unknown[]) => this.invokeVoid(target, method as string, args)\n } else {\n fn = (...args: unknown[]) => this.invoke(target, method as string, args)\n }\n\n return fn as T[K]\n }\n }\n}\n"]}
@@ -1,3 +1,6 @@
1
+ import { tl } from '@mtcute/tl';
2
+ import { RpcCallOptions } from '../../network/network-manager.js';
3
+ import { MustEqual } from '../../types/utils.js';
1
4
  import { LogManager } from '../../utils/logger.js';
2
5
  import { ConnectionState, ITelegramClient, ServerUpdateHandler } from '../client.types.js';
3
6
  import { RawUpdateHandler } from '../updates/types.js';
@@ -17,28 +20,28 @@ export declare abstract class TelegramWorkerPort<Custom extends WorkerCustomMeth
17
20
  readonly prepare: () => Promise<void>;
18
21
  private _connect;
19
22
  readonly close: () => Promise<void>;
20
- readonly notifyLoggedIn: (auth: import("@mtcute/tl").tl.RawUser | import("@mtcute/tl").tl.auth.TypeAuthorization) => Promise<import("@mtcute/tl").tl.RawUser>;
23
+ readonly notifyLoggedIn: (auth: tl.RawUser | tl.auth.TypeAuthorization) => Promise<tl.RawUser>;
21
24
  readonly notifyLoggedOut: () => Promise<void>;
22
25
  readonly notifyChannelOpened: (channelId: number, pts?: number | undefined) => Promise<boolean>;
23
26
  readonly notifyChannelClosed: (channelId: number) => Promise<boolean>;
24
- readonly call: <T extends import("@mtcute/tl").tl.RpcMethod>(message: import("../../index.js").MustEqual<T, import("@mtcute/tl").tl.RpcMethod>, params?: import("../../index.js").RpcCallOptions | undefined) => Promise<import("@mtcute/tl").tl.RpcCallReturn[T["_"]]>;
25
27
  readonly importSession: (session: string | import("../utils/string-session.js").StringSessionData, force?: boolean | undefined) => Promise<void>;
26
28
  readonly exportSession: () => Promise<string>;
27
- readonly handleClientUpdate: (updates: import("@mtcute/tl").tl.TypeUpdates, noDispatch?: boolean | undefined) => void;
29
+ readonly handleClientUpdate: (updates: tl.TypeUpdates, noDispatch?: boolean | undefined) => void;
28
30
  readonly getApiCrenetials: () => Promise<{
29
31
  id: number;
30
32
  hash: string;
31
33
  }>;
32
- readonly getPoolSize: (kind: import("../../index.js").ConnectionKind, dcId?: number | undefined) => Promise<number>;
34
+ readonly getPoolSize: (kind: import("../../network/network-manager.js").ConnectionKind, dcId?: number | undefined) => Promise<number>;
33
35
  readonly getPrimaryDcId: () => Promise<number>;
34
36
  readonly changePrimaryDc: (newDc: number) => Promise<void>;
35
- readonly computeSrpParams: (request: import("@mtcute/tl").tl.account.RawPassword, password: string) => Promise<import("@mtcute/tl").tl.RawInputCheckPasswordSRP>;
36
- readonly computeNewPasswordHash: (algo: import("@mtcute/tl").tl.TypePasswordKdfAlgo, password: string) => Promise<Uint8Array>;
37
+ readonly computeSrpParams: (request: tl.account.RawPassword, password: string) => Promise<tl.RawInputCheckPasswordSRP>;
38
+ readonly computeNewPasswordHash: (algo: tl.TypePasswordKdfAlgo, password: string) => Promise<Uint8Array>;
37
39
  readonly startUpdatesLoop: () => Promise<void>;
38
40
  readonly stopUpdatesLoop: () => Promise<void>;
39
41
  private _abortController;
40
42
  readonly stopSignal: AbortSignal;
41
43
  constructor(options: TelegramWorkerPortOptions);
44
+ call<T extends tl.RpcMethod>(message: MustEqual<T, tl.RpcMethod>, params?: RpcCallOptions): Promise<tl.RpcCallReturn[T['_']]>;
42
45
  abstract connectToWorker(worker: SomeWorker, handler: ClientMessageHandler): [SendFn, () => void];
43
46
  private _serverUpdatesHandler;
44
47
  onServerUpdate(handler: ServerUpdateHandler): void;
@@ -21,7 +21,6 @@ class TelegramWorkerPort {
21
21
  notifyLoggedOut;
22
22
  notifyChannelOpened;
23
23
  notifyChannelClosed;
24
- call;
25
24
  importSession;
26
25
  exportSession;
27
26
  handleClientUpdate;
@@ -50,7 +49,6 @@ class TelegramWorkerPort {
50
49
  this.notifyLoggedOut = bind('notifyLoggedOut');
51
50
  this.notifyChannelOpened = bind('notifyChannelOpened');
52
51
  this.notifyChannelClosed = bind('notifyChannelClosed');
53
- this.call = bind('call');
54
52
  this.importSession = bind('importSession');
55
53
  this.exportSession = bind('exportSession');
56
54
  this.handleClientUpdate = bind('handleClientUpdate', true);
@@ -63,6 +61,13 @@ class TelegramWorkerPort {
63
61
  this.startUpdatesLoop = bind('startUpdatesLoop');
64
62
  this.stopUpdatesLoop = bind('stopUpdatesLoop');
65
63
  }
64
+ call(message, params) {
65
+ if (params?.abortSignal) {
66
+ const { abortSignal, ...rest } = params;
67
+ return this._invoker.invokeWithAbort('client', 'call', [message, rest], abortSignal);
68
+ }
69
+ return this._invoker.invoke('client', 'call', [message, params]);
70
+ }
66
71
  _serverUpdatesHandler = () => { };
67
72
  onServerUpdate(handler) {
68
73
  this._serverUpdatesHandler = handler;
@@ -1 +1 @@
1
- {"version":3,"file":"port.js","sourceRoot":"","sources":["../../../../src/highlevel/worker/port.ts"],"names":[],"mappings":"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","sourcesContent":["import { LogManager } from '../../utils/logger.js'\nimport { ConnectionState, ITelegramClient, ServerUpdateHandler } from '../client.types.js'\nimport { PeersIndex } from '../types/peers/peers-index.js'\nimport { RawUpdateHandler } from '../updates/types.js'\nimport { AppConfigManagerProxy } from './app-config.js'\nimport { WorkerInvoker } from './invoker.js'\nimport { ClientMessageHandler, SendFn, SomeWorker, WorkerCustomMethods } from './protocol.js'\nimport { TelegramStorageProxy } from './storage.js'\n\nexport interface TelegramWorkerPortOptions {\n worker: SomeWorker\n}\n\nexport abstract class TelegramWorkerPort<Custom extends WorkerCustomMethods> implements ITelegramClient {\n readonly log\n\n private _connection\n private _invoker\n\n readonly storage\n readonly appConfig\n\n // bound methods\n readonly prepare\n private _connect\n readonly close\n readonly notifyLoggedIn\n readonly notifyLoggedOut\n readonly notifyChannelOpened\n readonly notifyChannelClosed\n readonly call\n readonly importSession\n readonly exportSession\n readonly handleClientUpdate\n readonly getApiCrenetials\n readonly getPoolSize\n readonly getPrimaryDcId\n readonly changePrimaryDc\n readonly computeSrpParams\n readonly computeNewPasswordHash\n readonly startUpdatesLoop\n readonly stopUpdatesLoop\n\n private _abortController = new AbortController()\n readonly stopSignal = this._abortController.signal\n\n constructor(readonly options: TelegramWorkerPortOptions) {\n this.log = new LogManager('worker')\n\n this._connection = this.connectToWorker(this.options.worker, this._onMessage)\n this._invoker = new WorkerInvoker(this._connection[0])\n\n this.storage = new TelegramStorageProxy(this._invoker)\n this.appConfig = new AppConfigManagerProxy(this._invoker)\n\n const bind = this._invoker.makeBinder<ITelegramClient>('client')\n\n this.prepare = bind('prepare')\n this._connect = bind('connect')\n\n this.close = bind('close')\n this.notifyLoggedIn = bind('notifyLoggedIn')\n this.notifyLoggedOut = bind('notifyLoggedOut')\n this.notifyChannelOpened = bind('notifyChannelOpened')\n this.notifyChannelClosed = bind('notifyChannelClosed')\n this.call = bind('call')\n this.importSession = bind('importSession')\n this.exportSession = bind('exportSession')\n this.handleClientUpdate = bind('handleClientUpdate', true)\n this.getApiCrenetials = bind('getApiCrenetials')\n this.getPoolSize = bind('getPoolSize')\n this.getPrimaryDcId = bind('getPrimaryDcId')\n this.changePrimaryDc = bind('changePrimaryDc')\n this.computeSrpParams = bind('computeSrpParams')\n this.computeNewPasswordHash = bind('computeNewPasswordHash')\n this.startUpdatesLoop = bind('startUpdatesLoop')\n this.stopUpdatesLoop = bind('stopUpdatesLoop')\n }\n\n abstract connectToWorker(worker: SomeWorker, handler: ClientMessageHandler): [SendFn, () => void]\n\n private _serverUpdatesHandler: ServerUpdateHandler = () => {}\n onServerUpdate(handler: ServerUpdateHandler): void {\n this._serverUpdatesHandler = handler\n }\n\n getServerUpdateHandler(): ServerUpdateHandler {\n return this._serverUpdatesHandler\n }\n\n private _errorHandler: (err: unknown) => void = () => {}\n onError(handler: (err: unknown) => void): void {\n this._errorHandler = handler\n }\n emitError(err: unknown): void {\n this._errorHandler(err)\n }\n\n private _updateHandler: RawUpdateHandler = () => {}\n onUpdate(handler: RawUpdateHandler): void {\n this._updateHandler = handler\n }\n\n private _connectionStateHandler: (state: ConnectionState) => void = () => {}\n onConnectionState(handler: (state: ConnectionState) => void): void {\n this._connectionStateHandler = handler\n }\n\n private _onMessage: ClientMessageHandler = (message) => {\n switch (message.type) {\n case 'log':\n this.log.handler(message.color, message.level, message.tag, message.fmt, message.args)\n break\n case 'server_update':\n this._serverUpdatesHandler(message.update)\n break\n case 'conn_state':\n this._connectionStateHandler(message.state)\n break\n case 'update': {\n const peers = new PeersIndex(message.users, message.chats)\n peers.hasMin = message.hasMin\n this._updateHandler(message.update, peers)\n break\n }\n case 'result':\n this._invoker.handleResult(message)\n break\n case 'error':\n this.emitError(message.error)\n break\n case 'stop':\n this._abortController.abort()\n break\n }\n }\n\n private _destroyed = false\n destroy(terminate = false): void {\n if (this._destroyed) return\n this._connection[1]()\n this._destroyed = true\n\n if (terminate && 'terminate' in this.options.worker) {\n Promise.resolve(this.options.worker.terminate()).catch(() => {})\n }\n }\n\n invokeCustom<T extends keyof Custom>(method: T, ...args: Parameters<Custom[T]>): Promise<ReturnType<Custom[T]>> {\n return this._invoker.invoke('custom', method as string, args) as Promise<ReturnType<Custom[T]>>\n }\n\n async connect(): Promise<void> {\n await this._connect()\n await this.storage.self.fetch() // force cache self locally\n }\n}\n"]}
1
+ {"version":3,"file":"port.js","sourceRoot":"","sources":["../../../../src/highlevel/worker/port.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { RpcCallOptions } from '../../network/network-manager.js'\nimport { MustEqual } from '../../types/utils.js'\nimport { LogManager } from '../../utils/logger.js'\nimport { ConnectionState, ITelegramClient, ServerUpdateHandler } from '../client.types.js'\nimport { PeersIndex } from '../types/peers/peers-index.js'\nimport { RawUpdateHandler } from '../updates/types.js'\nimport { AppConfigManagerProxy } from './app-config.js'\nimport { WorkerInvoker } from './invoker.js'\nimport { ClientMessageHandler, SendFn, SomeWorker, WorkerCustomMethods } from './protocol.js'\nimport { TelegramStorageProxy } from './storage.js'\n\nexport interface TelegramWorkerPortOptions {\n worker: SomeWorker\n}\n\nexport abstract class TelegramWorkerPort<Custom extends WorkerCustomMethods> implements ITelegramClient {\n readonly log\n\n private _connection\n private _invoker\n\n readonly storage\n readonly appConfig\n\n // bound methods\n readonly prepare\n private _connect\n readonly close\n readonly notifyLoggedIn\n readonly notifyLoggedOut\n readonly notifyChannelOpened\n readonly notifyChannelClosed\n readonly importSession\n readonly exportSession\n readonly handleClientUpdate\n readonly getApiCrenetials\n readonly getPoolSize\n readonly getPrimaryDcId\n readonly changePrimaryDc\n readonly computeSrpParams\n readonly computeNewPasswordHash\n readonly startUpdatesLoop\n readonly stopUpdatesLoop\n\n private _abortController = new AbortController()\n readonly stopSignal = this._abortController.signal\n\n constructor(readonly options: TelegramWorkerPortOptions) {\n this.log = new LogManager('worker')\n\n this._connection = this.connectToWorker(this.options.worker, this._onMessage)\n this._invoker = new WorkerInvoker(this._connection[0])\n\n this.storage = new TelegramStorageProxy(this._invoker)\n this.appConfig = new AppConfigManagerProxy(this._invoker)\n\n const bind = this._invoker.makeBinder<ITelegramClient>('client')\n\n this.prepare = bind('prepare')\n this._connect = bind('connect')\n\n this.close = bind('close')\n this.notifyLoggedIn = bind('notifyLoggedIn')\n this.notifyLoggedOut = bind('notifyLoggedOut')\n this.notifyChannelOpened = bind('notifyChannelOpened')\n this.notifyChannelClosed = bind('notifyChannelClosed')\n this.importSession = bind('importSession')\n this.exportSession = bind('exportSession')\n this.handleClientUpdate = bind('handleClientUpdate', true)\n this.getApiCrenetials = bind('getApiCrenetials')\n this.getPoolSize = bind('getPoolSize')\n this.getPrimaryDcId = bind('getPrimaryDcId')\n this.changePrimaryDc = bind('changePrimaryDc')\n this.computeSrpParams = bind('computeSrpParams')\n this.computeNewPasswordHash = bind('computeNewPasswordHash')\n this.startUpdatesLoop = bind('startUpdatesLoop')\n this.stopUpdatesLoop = bind('stopUpdatesLoop')\n }\n\n call<T extends tl.RpcMethod>(\n message: MustEqual<T, tl.RpcMethod>,\n params?: RpcCallOptions,\n ): Promise<tl.RpcCallReturn[T['_']]> {\n if (params?.abortSignal) {\n const { abortSignal, ...rest } = params\n\n return this._invoker.invokeWithAbort('client', 'call', [message, rest], abortSignal) as Promise<\n tl.RpcCallReturn[T['_']]\n >\n }\n\n return this._invoker.invoke('client', 'call', [message, params]) as Promise<tl.RpcCallReturn[T['_']]>\n }\n\n abstract connectToWorker(worker: SomeWorker, handler: ClientMessageHandler): [SendFn, () => void]\n\n private _serverUpdatesHandler: ServerUpdateHandler = () => {}\n onServerUpdate(handler: ServerUpdateHandler): void {\n this._serverUpdatesHandler = handler\n }\n\n getServerUpdateHandler(): ServerUpdateHandler {\n return this._serverUpdatesHandler\n }\n\n private _errorHandler: (err: unknown) => void = () => {}\n onError(handler: (err: unknown) => void): void {\n this._errorHandler = handler\n }\n emitError(err: unknown): void {\n this._errorHandler(err)\n }\n\n private _updateHandler: RawUpdateHandler = () => {}\n onUpdate(handler: RawUpdateHandler): void {\n this._updateHandler = handler\n }\n\n private _connectionStateHandler: (state: ConnectionState) => void = () => {}\n onConnectionState(handler: (state: ConnectionState) => void): void {\n this._connectionStateHandler = handler\n }\n\n private _onMessage: ClientMessageHandler = (message) => {\n switch (message.type) {\n case 'log':\n this.log.handler(message.color, message.level, message.tag, message.fmt, message.args)\n break\n case 'server_update':\n this._serverUpdatesHandler(message.update)\n break\n case 'conn_state':\n this._connectionStateHandler(message.state)\n break\n case 'update': {\n const peers = new PeersIndex(message.users, message.chats)\n peers.hasMin = message.hasMin\n this._updateHandler(message.update, peers)\n break\n }\n case 'result':\n this._invoker.handleResult(message)\n break\n case 'error':\n this.emitError(message.error)\n break\n case 'stop':\n this._abortController.abort()\n break\n }\n }\n\n private _destroyed = false\n destroy(terminate = false): void {\n if (this._destroyed) return\n this._connection[1]()\n this._destroyed = true\n\n if (terminate && 'terminate' in this.options.worker) {\n Promise.resolve(this.options.worker.terminate()).catch(() => {})\n }\n }\n\n invokeCustom<T extends keyof Custom>(method: T, ...args: Parameters<Custom[T]>): Promise<ReturnType<Custom[T]>> {\n return this._invoker.invoke('custom', method as string, args) as Promise<ReturnType<Custom[T]>>\n }\n\n async connect(): Promise<void> {\n await this._connect()\n await this.storage.self.fetch() // force cache self locally\n }\n}\n"]}
@@ -9,6 +9,10 @@ export type WorkerInboundMessage = {
9
9
  method: string;
10
10
  args: unknown[];
11
11
  void: boolean;
12
+ withAbort: boolean;
13
+ } | {
14
+ type: 'abort';
15
+ id: number;
12
16
  };
13
17
  export type WorkerOutboundMessage = {
14
18
  type: 'server_update';
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../../src/highlevel/worker/protocol.ts"],"names":[],"mappings":"","sourcesContent":["import type { Worker as NodeWorker } from 'node:worker_threads'\n\nimport { tl } from '@mtcute/tl'\n\nimport { ConnectionState } from '../client.types.js'\nimport { SerializedError } from './errors.js'\n\nexport type WorkerInboundMessage = {\n type: 'invoke'\n id: number\n target: 'custom' | 'client' | 'storage' | 'storage-self' | 'storage-peers' | 'app-config'\n method: string\n args: unknown[]\n void: boolean\n}\n\nexport type WorkerOutboundMessage =\n | { type: 'server_update'; update: tl.TypeUpdates }\n | {\n type: 'update'\n update: tl.TypeUpdate\n users: Map<number, tl.TypeUser>\n chats: Map<number, tl.TypeChat>\n hasMin: boolean\n }\n | { type: 'error'; error: unknown }\n | { type: 'stop' }\n | { type: 'conn_state'; state: ConnectionState }\n | {\n type: 'log'\n color: number\n level: number\n tag: string\n fmt: string\n args: unknown[]\n }\n | {\n type: 'result'\n id: number\n result?: unknown\n error?: SerializedError\n }\n\nexport type SomeWorker = NodeWorker | Worker | SharedWorker\n\nexport type SendFn = (message: WorkerInboundMessage) => void\nexport type ClientMessageHandler = (message: WorkerOutboundMessage) => void\n\nexport type RespondFn = (message: WorkerOutboundMessage) => void\nexport type WorkerMessageHandler = (message: WorkerInboundMessage, respond: RespondFn) => void\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type WorkerCustomMethods = Record<string, (...args: any[]) => Promise<any>>\n"]}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../../src/highlevel/worker/protocol.ts"],"names":[],"mappings":"","sourcesContent":["import type { Worker as NodeWorker } from 'node:worker_threads'\n\nimport { tl } from '@mtcute/tl'\n\nimport { ConnectionState } from '../client.types.js'\nimport { SerializedError } from './errors.js'\n\nexport type WorkerInboundMessage =\n | {\n type: 'invoke'\n id: number\n target: 'custom' | 'client' | 'storage' | 'storage-self' | 'storage-peers' | 'app-config'\n method: string\n args: unknown[]\n void: boolean\n withAbort: boolean\n }\n | {\n type: 'abort'\n id: number\n }\n\nexport type WorkerOutboundMessage =\n | { type: 'server_update'; update: tl.TypeUpdates }\n | {\n type: 'update'\n update: tl.TypeUpdate\n users: Map<number, tl.TypeUser>\n chats: Map<number, tl.TypeChat>\n hasMin: boolean\n }\n | { type: 'error'; error: unknown }\n | { type: 'stop' }\n | { type: 'conn_state'; state: ConnectionState }\n | {\n type: 'log'\n color: number\n level: number\n tag: string\n fmt: string\n args: unknown[]\n }\n | {\n type: 'result'\n id: number\n result?: unknown\n error?: SerializedError\n }\n\nexport type SomeWorker = NodeWorker | Worker | SharedWorker\n\nexport type SendFn = (message: WorkerInboundMessage) => void\nexport type ClientMessageHandler = (message: WorkerOutboundMessage) => void\n\nexport type RespondFn = (message: WorkerOutboundMessage) => void\nexport type WorkerMessageHandler = (message: WorkerInboundMessage, respond: RespondFn) => void\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type WorkerCustomMethods = Record<string, (...args: any[]) => Promise<any>>\n"]}
@@ -9,6 +9,7 @@ export declare abstract class TelegramWorker<T extends WorkerCustomMethods> {
9
9
  readonly client: BaseTelegramClient;
10
10
  readonly broadcast: RespondFn;
11
11
  abstract registerWorker(handler: WorkerMessageHandler): RespondFn;
12
+ readonly pendingAborts: Map<number, AbortController>;
12
13
  constructor(params: TelegramWorkerOptions<T>);
13
14
  private onInvoke;
14
15
  }
@@ -6,6 +6,7 @@ class TelegramWorker {
6
6
  params;
7
7
  client;
8
8
  broadcast;
9
+ pendingAborts = new Map();
9
10
  constructor(params) {
10
11
  this.params = params;
11
12
  this.broadcast = this.registerWorker((message, respond) => {
@@ -13,6 +14,13 @@ class TelegramWorker {
13
14
  case 'invoke':
14
15
  this.onInvoke(message, respond);
15
16
  break;
17
+ case 'abort': {
18
+ const abort = this.pendingAborts.get(message.id);
19
+ if (abort) {
20
+ abort.abort();
21
+ this.pendingAborts.delete(message.id);
22
+ }
23
+ }
16
24
  }
17
25
  });
18
26
  const client = params.client;
@@ -91,9 +99,24 @@ class TelegramWorker {
91
99
  });
92
100
  return;
93
101
  }
102
+ let args = msg.args;
103
+ if (msg.target === 'client' && msg.method === 'call' && msg.withAbort) {
104
+ const abort = new AbortController();
105
+ this.pendingAborts.set(msg.id, abort);
106
+ args = [
107
+ args[0],
108
+ {
109
+ ...args[1],
110
+ abortSignal: abort.signal,
111
+ },
112
+ ];
113
+ }
94
114
  // eslint-disable-next-line @typescript-eslint/no-unsafe-call
95
- Promise.resolve(method.apply(target, msg.args))
115
+ Promise.resolve(method.apply(target, args))
96
116
  .then((res) => {
117
+ if (msg.withAbort) {
118
+ this.pendingAborts.delete(msg.id);
119
+ }
97
120
  if (msg.void)
98
121
  return;
99
122
  respond({
@@ -103,6 +126,9 @@ class TelegramWorker {
103
126
  });
104
127
  })
105
128
  .catch((err) => {
129
+ if (msg.withAbort) {
130
+ this.pendingAborts.delete(msg.id);
131
+ }
106
132
  respond({
107
133
  type: 'result',
108
134
  id: msg.id,
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../../src/highlevel/worker/worker.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseTelegramClient } from '../base.js'\nimport { serializeError } from './errors.js'\nimport { RespondFn, WorkerCustomMethods, WorkerInboundMessage, WorkerMessageHandler } from './protocol.js'\n\nexport interface TelegramWorkerOptions<T extends WorkerCustomMethods> {\n client: BaseTelegramClient\n customMethods?: T\n}\n\nexport abstract class TelegramWorker<T extends WorkerCustomMethods> {\n readonly client: BaseTelegramClient\n readonly broadcast: RespondFn\n\n abstract registerWorker(handler: WorkerMessageHandler): RespondFn\n\n constructor(readonly params: TelegramWorkerOptions<T>) {\n this.broadcast = this.registerWorker((message, respond) => {\n switch (message.type) {\n case 'invoke':\n this.onInvoke(message, respond)\n break\n }\n })\n\n const client = params.client\n this.client = client\n\n client.log.mgr.handler = (color, level, tag, fmt, args) =>\n this.broadcast({\n type: 'log',\n color,\n level,\n tag,\n fmt,\n args,\n })\n client.onError((err) =>\n this.broadcast({\n type: 'error',\n error: err,\n }),\n )\n client.onConnectionState((state) =>\n this.broadcast({\n type: 'conn_state',\n state,\n }),\n )\n client.stopSignal.addEventListener('abort', () => this.broadcast({ type: 'stop' }))\n\n if (client.updates) {\n client.onUpdate((update, peers) =>\n this.broadcast({\n type: 'update',\n update,\n users: peers.users,\n chats: peers.chats,\n hasMin: peers.hasMin,\n }),\n )\n } else {\n client.onServerUpdate((update) =>\n this.broadcast({\n type: 'server_update',\n update,\n }),\n )\n }\n }\n\n private onInvoke(msg: Extract<WorkerInboundMessage, { type: 'invoke' }>, respond: RespondFn) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let target: any\n\n switch (msg.target) {\n case 'custom':\n target = this.params.customMethods\n break\n case 'client':\n target = this.client\n break\n case 'storage':\n target = this.client.storage\n break\n case 'storage-self':\n target = this.client.storage.self\n break\n case 'storage-peers':\n target = this.client.storage.peers\n break\n case 'app-config':\n target = this.client.appConfig\n break\n\n default: {\n respond({\n type: 'result',\n id: msg.id,\n error: new Error(`Unknown target ${msg.target}`),\n })\n\n return\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const method = target[msg.method]\n\n if (!method) {\n respond({\n type: 'result',\n id: msg.id,\n error: new Error(`Method ${msg.method} not found on ${msg.target}`),\n })\n\n return\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n Promise.resolve(method.apply(target, msg.args))\n .then((res) => {\n if (msg.void) return\n\n respond({\n type: 'result',\n id: msg.id,\n result: res,\n })\n })\n .catch((err) => {\n respond({\n type: 'result',\n id: msg.id,\n error: serializeError(err),\n })\n })\n }\n}\n"]}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../../src/highlevel/worker/worker.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseTelegramClient } from '../base.js'\nimport { serializeError } from './errors.js'\nimport { RespondFn, WorkerCustomMethods, WorkerInboundMessage, WorkerMessageHandler } from './protocol.js'\n\nexport interface TelegramWorkerOptions<T extends WorkerCustomMethods> {\n client: BaseTelegramClient\n customMethods?: T\n}\n\nexport abstract class TelegramWorker<T extends WorkerCustomMethods> {\n readonly client: BaseTelegramClient\n readonly broadcast: RespondFn\n\n abstract registerWorker(handler: WorkerMessageHandler): RespondFn\n\n readonly pendingAborts = new Map<number, AbortController>()\n\n constructor(readonly params: TelegramWorkerOptions<T>) {\n this.broadcast = this.registerWorker((message, respond) => {\n switch (message.type) {\n case 'invoke':\n this.onInvoke(message, respond)\n break\n case 'abort': {\n const abort = this.pendingAborts.get(message.id)\n\n if (abort) {\n abort.abort()\n this.pendingAborts.delete(message.id)\n }\n }\n }\n })\n\n const client = params.client\n this.client = client\n\n client.log.mgr.handler = (color, level, tag, fmt, args) =>\n this.broadcast({\n type: 'log',\n color,\n level,\n tag,\n fmt,\n args,\n })\n client.onError((err) =>\n this.broadcast({\n type: 'error',\n error: err,\n }),\n )\n client.onConnectionState((state) =>\n this.broadcast({\n type: 'conn_state',\n state,\n }),\n )\n client.stopSignal.addEventListener('abort', () => this.broadcast({ type: 'stop' }))\n\n if (client.updates) {\n client.onUpdate((update, peers) =>\n this.broadcast({\n type: 'update',\n update,\n users: peers.users,\n chats: peers.chats,\n hasMin: peers.hasMin,\n }),\n )\n } else {\n client.onServerUpdate((update) =>\n this.broadcast({\n type: 'server_update',\n update,\n }),\n )\n }\n }\n\n private onInvoke(msg: Extract<WorkerInboundMessage, { type: 'invoke' }>, respond: RespondFn) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let target: any\n\n switch (msg.target) {\n case 'custom':\n target = this.params.customMethods\n break\n case 'client':\n target = this.client\n break\n case 'storage':\n target = this.client.storage\n break\n case 'storage-self':\n target = this.client.storage.self\n break\n case 'storage-peers':\n target = this.client.storage.peers\n break\n case 'app-config':\n target = this.client.appConfig\n break\n\n default: {\n respond({\n type: 'result',\n id: msg.id,\n error: new Error(`Unknown target ${msg.target}`),\n })\n\n return\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const method = target[msg.method]\n\n if (!method) {\n respond({\n type: 'result',\n id: msg.id,\n error: new Error(`Method ${msg.method} not found on ${msg.target}`),\n })\n\n return\n }\n\n let args = msg.args\n\n if (msg.target === 'client' && msg.method === 'call' && msg.withAbort) {\n const abort = new AbortController()\n this.pendingAborts.set(msg.id, abort)\n\n args = [\n args[0],\n {\n ...(args[1] as object),\n abortSignal: abort.signal,\n },\n ]\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n Promise.resolve(method.apply(target, args))\n .then((res) => {\n if (msg.withAbort) {\n this.pendingAborts.delete(msg.id)\n }\n\n if (msg.void) return\n\n respond({\n type: 'result',\n id: msg.id,\n result: res,\n })\n })\n .catch((err) => {\n if (msg.withAbort) {\n this.pendingAborts.delete(msg.id)\n }\n\n respond({\n type: 'result',\n id: msg.id,\n error: serializeError(err),\n })\n })\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import EventEmitter from 'events';
2
- import { tl } from '@mtcute/tl';
2
+ import { mtp, tl } from '@mtcute/tl';
3
3
  import { TlReaderMap, TlWriterMap } from '@mtcute/tl-runtime';
4
4
  import { IMtStorageProvider } from '../storage/provider.js';
5
5
  import { StorageManager, StorageManagerExtraOptions } from '../storage/storage.js';
@@ -111,19 +111,6 @@ export interface MtClientOptions {
111
111
  * @default false
112
112
  */
113
113
  enableErrorReporting?: boolean;
114
- /**
115
- * If true, RPC errors will have a stack trace of the initial `.call()`
116
- * or `.sendForResult()` call position, which drastically improves
117
- * debugging experience.<br>
118
- * If false, they will have a stack trace of mtcute internals.
119
- *
120
- * Internally this creates a stack capture before every RPC call
121
- * and stores it until the result is received. This might
122
- * use a lot more memory than normal, thus can be disabled here.
123
- *
124
- * @default true
125
- */
126
- niceStacks?: boolean;
127
114
  /**
128
115
  * Extra parameters for {@link NetworkManager}
129
116
  */
@@ -183,7 +170,6 @@ export declare class MtClient extends EventEmitter {
183
170
  * loaded from session or changed by other means (like redirecting).
184
171
  */
185
172
  _defaultDcs: DcOptions;
186
- private _niceStacks;
187
173
  /** TL layer used by the client */
188
174
  readonly _layer: number;
189
175
  /** TL readers map used by the client */
@@ -233,7 +219,7 @@ export declare class MtClient extends EventEmitter {
233
219
  * @param message RPC method to call
234
220
  * @param params Additional call parameters
235
221
  */
236
- call<T extends tl.RpcMethod>(message: MustEqual<T, tl.RpcMethod>, params?: RpcCallOptions): Promise<tl.RpcCallReturn[T['_']]>;
222
+ call<T extends tl.RpcMethod>(message: MustEqual<T, tl.RpcMethod>, params?: RpcCallOptions): Promise<tl.RpcCallReturn[T['_']] | mtp.RawMt_rpc_error>;
237
223
  /**
238
224
  * Register an error handler for the client
239
225
  *
@@ -35,14 +35,18 @@ class MtClient extends events_1.default {
35
35
  * loaded from session or changed by other means (like redirecting).
36
36
  */
37
37
  _defaultDcs;
38
- _niceStacks;
39
38
  /** TL layer used by the client */
40
39
  _layer;
41
40
  /** TL readers map used by the client */
42
41
  _readerMap;
43
42
  /** TL writers map used by the client */
44
43
  _writerMap;
45
- _config = new config_manager_js_1.ConfigManager(() => this.call({ _: 'help.getConfig' }));
44
+ _config = new config_manager_js_1.ConfigManager(async () => {
45
+ const res = await this.call({ _: 'help.getConfig' });
46
+ if ((0, index_js_1.isTlRpcError)(res))
47
+ throw new Error(`Failed to get config: ${res.errorMessage}`);
48
+ return res;
49
+ });
46
50
  _emitError;
47
51
  log;
48
52
  network;
@@ -67,7 +71,6 @@ class MtClient extends events_1.default {
67
71
  }
68
72
  }
69
73
  this._defaultDcs = dc;
70
- this._niceStacks = params.niceStacks ?? true;
71
74
  this._layer = params.overrideLayer ?? tl_1.tl.LAYER;
72
75
  this._readerMap = params.readerMap ?? reader_js_1.__tlReaderMap;
73
76
  this._writerMap = params.writerMap ?? writer_js_1.__tlWriterMap;
@@ -174,9 +177,8 @@ class MtClient extends events_1.default {
174
177
  * @param params Additional call parameters
175
178
  */
176
179
  async call(message, params) {
177
- const stack = this._niceStacks ? new Error().stack : undefined;
178
180
  // eslint-disable-next-line @typescript-eslint/no-unsafe-return
179
- return this.network.call(message, params, stack);
181
+ return this.network.call(message, params);
180
182
  }
181
183
  /**
182
184
  * Register an error handler for the client
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/network/client.ts"],"names":[],"mappings":";;;;;;AAAA,uDAAuD;AACvD,oDAAiC;AAEjC,mCAA+B;AAC/B,2DAA+E;AAC/E,2DAA+E;AAI/E,sDAAkF;AAElF,gDAU0B;AAC1B,2DAAmD;AACnD,6DAAgG;AAiLhG;;;;GAIG;AACH,MAAa,QAAS,SAAQ,gBAAY;IAsCjB;IArCrB;;OAEG;IACM,MAAM,CAAiB;IAEhC,sBAAsB;IACb,OAAO,CAAgB;IAEhC;;OAEG;IACgB,SAAS,CAAS;IAErC;;;OAGG;IACH,WAAW,CAAW;IAEd,WAAW,CAAS;IAC5B,kCAAkC;IACzB,MAAM,CAAQ;IACvB,wCAAwC;IAC/B,UAAU,CAAa;IAChC,wCAAwC;IAC/B,UAAU,CAAa;IAEvB,OAAO,GAAG,IAAI,iCAAa,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAA;IAEtE,UAAU,CAAyB;IAElC,GAAG,CAAQ;IACX,OAAO,CAAgB;IAExB,gBAAgB,CAAiB;IAChC,UAAU,CAAa;IAEhC,YAAqB,MAAuB;QACxC,KAAK,EAAE,CAAA;QADU,WAAM,GAAN,MAAM,CAAiB;QAGxC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,IAAI,IAAI,qBAAU,EAAE,CAAA;QAE5C,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAA;QACxC,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;QAC3B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAEzC,IAAI,EAAE,GAAG,MAAM,CAAC,UAAU,CAAA;QAE1B,IAAI,CAAC,EAAE,EAAE,CAAC;YACN,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAClB,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,4BAAiB,CAAC,CAAC,CAAC,wBAAa,CAAA;YAC3D,CAAC;iBAAM,CAAC;gBACJ,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,kCAAuB,CAAC,CAAC,CAAC,8BAAmB,CAAA;YACvE,CAAC;QACL,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,EAAE,CAAA;QACrB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,IAAI,IAAI,CAAA;QAE5C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,aAAa,IAAI,OAAE,CAAC,KAAK,CAAA;QAC9C,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,SAAS,IAAI,yBAAgB,CAAA;QACtD,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,SAAS,IAAI,yBAAgB,CAAA;QAEtD,IAAI,CAAC,gBAAgB,GAAG,IAAI,eAAe,EAAE,CAAA;QAC7C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAA;QAE9C,IAAI,CAAC,OAAO,GAAG,IAAI,2BAAc,CAAC;YAC9B,QAAQ,EAAE,MAAM,CAAC,OAAO;YACxB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,GAAG,MAAM,CAAC,cAAc;SAC3B,CAAC,CAAA;QAEF,IAAI,CAAC,OAAO,GAAG,IAAI,mCAAc,CAC7B;YACI,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,KAAK;YAC9C,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;YACnD,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;YACjD,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;YAClC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;YACpC,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,IAAI,KAAK;YACxD,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,CAAC;YACxC,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;YAChC,oBAAoB,EAAE,MAAM,CAAC,oBAAoB,IAAI,KAAK;YAC1D,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;YACnC,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;YAC3C,gBAAgB,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC;YACvE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;YAC3C,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,GAAG,MAAM,CAAC,OAAO;SACpB,EACD,IAAI,CAAC,OAAO,CACf,CAAA;IACL,CAAC;IAED,SAAS,CAAC,GAAY;QAClB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;QACxB,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAA;QAC3C,CAAC;IACL,CAAC;IAEO,QAAQ,GAAG,IAAA,0BAAe,EAAC,KAAK,IAAI,EAAE;QAC1C,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,CAAA;QAChC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;QAEzB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAA;QAChD,IAAI,SAAS,KAAK,IAAI;YAAE,IAAI,CAAC,WAAW,GAAG,SAAS,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF;;;;;;;;OAQG;IACH,OAAO;QACH,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAA;IAC9B,CAAC;IAEO,QAAQ,GAAG,IAAA,0BAAe,EAAC,KAAK,IAAI,EAAE;QAC1C,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAA;QACzB,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IAChD,CAAC,CAAC,CAAA;IAEF;;;;;OAKG;IACH,KAAK,CAAC,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAA;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACP,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;QAEhC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAA;QACtB,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAA;QAE5B,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;QACzB,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAA;QAE9B,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;QACrB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;QACrB,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAA;QAE7B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAA;IAChD,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,IAAI,CACN,OAAmC,EACnC,MAAuB;QAEvB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;QAE9D,+DAA+D;QAC/D,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IACpD,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,OAA+B;QACnC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAA;IAC7B,CAAC;CACJ;AA1MD,4BA0MC","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport EventEmitter from 'events'\n\nimport { tl } from '@mtcute/tl'\nimport { __tlReaderMap as defaultReaderMap } from '@mtcute/tl/binary/reader.js'\nimport { __tlWriterMap as defaultWriterMap } from '@mtcute/tl/binary/writer.js'\nimport { TlReaderMap, TlWriterMap } from '@mtcute/tl-runtime'\n\nimport { IMtStorageProvider } from '../storage/provider.js'\nimport { StorageManager, StorageManagerExtraOptions } from '../storage/storage.js'\nimport { MustEqual } from '../types/index.js'\nimport {\n asyncResettable,\n DcOptions,\n defaultProductionDc,\n defaultProductionIpv6Dc,\n defaultTestDc,\n defaultTestIpv6Dc,\n ICryptoProvider,\n Logger,\n LogManager,\n} from '../utils/index.js'\nimport { ConfigManager } from './config-manager.js'\nimport { NetworkManager, NetworkManagerExtraParams, RpcCallOptions } from './network-manager.js'\nimport { PersistentConnectionParams } from './persistent-connection.js'\nimport { ReconnectionStrategy } from './reconnection.js'\nimport { TransportFactory } from './transports/index.js'\n\n/** Options for {@link MtClient} */\nexport interface MtClientOptions {\n /**\n * API ID from my.telegram.org\n */\n apiId: number\n /**\n * API hash from my.telegram.org\n */\n apiHash: string\n\n /**\n * Storage to use for this client.\n */\n storage: IMtStorageProvider\n\n /** Additional options for the storage manager */\n storageOptions?: StorageManagerExtraOptions\n\n /**\n * Cryptography provider to allow delegating\n * crypto to native addon, worker, etc.\n */\n crypto: ICryptoProvider\n\n /**\n * Whether to use IPv6 datacenters\n * (IPv6 will be preferred when choosing a DC by id)\n * (default: false)\n */\n useIpv6?: boolean\n\n /**\n * Primary DC to use for initial connection.\n * This does not mean this will be the only DC used,\n * nor that this DC will actually be primary, this only\n * determines the first DC the library will try to connect to.\n * Can be used to connect to other networks (like test DCs).\n *\n * When session already contains primary DC, this parameter is ignored.\n *\n * @default Production DC 2.\n */\n defaultDcs?: DcOptions\n\n /**\n * Whether to connect to test servers.\n *\n * If passed, {@link defaultDc} defaults to Test DC 2.\n *\n * **Must** be passed if using test servers, even if\n * you passed custom {@link defaultDc}\n */\n testMode?: boolean\n\n /**\n * Additional options for initConnection call.\n * `apiId` and `query` are not available and will be ignored.\n * Omitted values will be filled with defaults\n */\n initConnectionOptions?: Partial<Omit<tl.RawInitConnectionRequest, 'apiId' | 'query'>>\n\n /**\n * Transport factory to use in the client.\n *\n * @default platform-specific transport: WebSocket on the web, TCP in node\n */\n transport: TransportFactory\n\n /**\n * Reconnection strategy.\n *\n * @default simple reconnection strategy: first 0ms, then up to 5s (increasing by 1s)\n */\n reconnectionStrategy?: ReconnectionStrategy<PersistentConnectionParams>\n\n /**\n * Maximum duration of a flood_wait that will be waited automatically.\n * Flood waits above this threshold will throw a FloodWaitError.\n * Set to 0 to disable. Can be overridden with `throwFlood` parameter in call() params\n *\n * @default 10000\n */\n floodSleepThreshold?: number\n\n /**\n * Maximum number of retries when calling RPC methods.\n * Call is retried when InternalError or FloodWaitError is encountered.\n * Can be set to Infinity.\n *\n * @default 5\n */\n maxRetryCount?: number\n\n /**\n * If true, all API calls will be wrapped with `tl.invokeWithoutUpdates`,\n * effectively disabling the server-sent events for the clients.\n * May be useful in some cases.\n *\n * @default false\n */\n disableUpdates?: boolean\n\n /**\n * mtcute can send all unknown RPC errors to [danog](https://github.com/danog)'s\n * [error reporting service](https://rpc.pwrtelegram.xyz/).\n *\n * This is fully anonymous (except maybe IP) and is only used to improve the library\n * and developer experience for everyone working with MTProto. This is fully opt-in,\n * and if you're too paranoid, you can disable it by manually passing `enableErrorReporting: false` to the client.\n *\n * @default false\n */\n enableErrorReporting?: boolean\n\n /**\n * If true, RPC errors will have a stack trace of the initial `.call()`\n * or `.sendForResult()` call position, which drastically improves\n * debugging experience.<br>\n * If false, they will have a stack trace of mtcute internals.\n *\n * Internally this creates a stack capture before every RPC call\n * and stores it until the result is received. This might\n * use a lot more memory than normal, thus can be disabled here.\n *\n * @default true\n */\n niceStacks?: boolean\n\n /**\n * Extra parameters for {@link NetworkManager}\n */\n network?: NetworkManagerExtraParams\n\n /**\n * Logger instance for the client.\n * If not passed, a new one will be created.\n */\n logger?: Logger\n\n /**\n * Set logging level for the client.\n * Shorthand for `client.log.level = level`.\n *\n * See static members of {@link LogManager} for possible values.\n */\n logLevel?: number\n\n /**\n * **EXPERT USE ONLY!**\n *\n * Override TL layer used for the connection.\n *\n * **Does not** change the schema used.\n */\n overrideLayer?: number\n\n /**\n * **EXPERT USE ONLY**\n *\n * Override reader map used for the connection.\n */\n readerMap?: TlReaderMap\n\n /**\n * **EXPERT USE ONLY**\n *\n * Override writer map used for the connection.\n */\n writerMap?: TlWriterMap\n}\n\n/**\n * Basic MTProto client implementation, only doing the bare minimum\n * to make RPC calls and receive low-level updates, as well as providing\n * some APIs to manage that.\n */\nexport class MtClient extends EventEmitter {\n /**\n * Crypto provider taken from {@link MtClientOptions.crypto}\n */\n readonly crypto: ICryptoProvider\n\n /** Storage manager */\n readonly storage: StorageManager\n\n /**\n * \"Test mode\" taken from {@link MtClientOptions.testMode}\n */\n protected readonly _testMode: boolean\n\n /**\n * Primary DCs taken from {@link MtClientOptions.defaultDcs},\n * loaded from session or changed by other means (like redirecting).\n */\n _defaultDcs: DcOptions\n\n private _niceStacks: boolean\n /** TL layer used by the client */\n readonly _layer: number\n /** TL readers map used by the client */\n readonly _readerMap: TlReaderMap\n /** TL writers map used by the client */\n readonly _writerMap: TlWriterMap\n\n readonly _config = new ConfigManager(() => this.call({ _: 'help.getConfig' }))\n\n private _emitError?: (err: unknown) => void\n\n readonly log: Logger\n readonly network: NetworkManager\n\n private _abortController: AbortController\n readonly stopSignal: AbortSignal\n\n constructor(readonly params: MtClientOptions) {\n super()\n\n this.log = params.logger ?? new LogManager()\n\n if (params.logLevel !== undefined) {\n this.log.mgr.level = params.logLevel\n }\n\n this.crypto = params.crypto\n this._testMode = Boolean(params.testMode)\n\n let dc = params.defaultDcs\n\n if (!dc) {\n if (params.testMode) {\n dc = params.useIpv6 ? defaultTestIpv6Dc : defaultTestDc\n } else {\n dc = params.useIpv6 ? defaultProductionIpv6Dc : defaultProductionDc\n }\n }\n\n this._defaultDcs = dc\n this._niceStacks = params.niceStacks ?? true\n\n this._layer = params.overrideLayer ?? tl.LAYER\n this._readerMap = params.readerMap ?? defaultReaderMap\n this._writerMap = params.writerMap ?? defaultWriterMap\n\n this._abortController = new AbortController()\n this.stopSignal = this._abortController.signal\n\n this.storage = new StorageManager({\n provider: params.storage,\n log: this.log,\n readerMap: this._readerMap,\n writerMap: this._writerMap,\n ...params.storageOptions,\n })\n\n this.network = new NetworkManager(\n {\n apiId: params.apiId,\n crypto: this.crypto,\n disableUpdates: params.disableUpdates ?? false,\n initConnectionOptions: params.initConnectionOptions,\n layer: this._layer,\n log: this.log,\n readerMap: this._readerMap,\n writerMap: this._writerMap,\n reconnectionStrategy: params.reconnectionStrategy,\n storage: this.storage,\n testMode: Boolean(params.testMode),\n transport: params.transport,\n emitError: this.emitError.bind(this),\n floodSleepThreshold: params.floodSleepThreshold ?? 10000,\n maxRetryCount: params.maxRetryCount ?? 5,\n isPremium: false,\n useIpv6: Boolean(params.useIpv6),\n enableErrorReporting: params.enableErrorReporting ?? false,\n onUsable: () => this.emit('usable'),\n onConnecting: () => this.emit('connecting'),\n onNetworkChanged: (connected) => this.emit('networkChanged', connected),\n onUpdate: (upd) => this.emit('update', upd),\n stopSignal: this.stopSignal,\n ...params.network,\n },\n this._config,\n )\n }\n\n emitError(err: unknown): void {\n if (this._emitError) {\n this._emitError(err)\n } else if (this._connect.finished()) {\n this.log.error('unhandled error:', err)\n }\n }\n\n private _prepare = asyncResettable(async () => {\n await this.crypto.initialize?.()\n await this.storage.load()\n\n const primaryDc = await this.storage.dcs.fetch()\n if (primaryDc !== null) this._defaultDcs = primaryDc\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 private _connect = asyncResettable(async () => {\n await this._prepare.run()\n await this.network.connect(this._defaultDcs)\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 /**\n * Close all connections and finalize the client.\n */\n async close(): Promise<void> {\n this.log.debug('closing client')\n\n this._config.destroy()\n await this.network.destroy()\n\n await this.storage.save()\n await this.storage.destroy?.()\n\n this._prepare.reset()\n this._connect.reset()\n this._abortController.abort()\n\n this.log.debug('client closed successfully')\n }\n\n /**\n * Make an RPC call.\n *\n * The connection must have been {@link connect}-ed\n * before calling this method.\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 const stack = this._niceStacks ? new Error().stack : undefined\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return this.network.call(message, params, stack)\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._emitError = handler\n }\n}\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/network/client.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport EventEmitter from 'events'\n\nimport { mtp, tl } from '@mtcute/tl'\nimport { __tlReaderMap as defaultReaderMap } from '@mtcute/tl/binary/reader.js'\nimport { __tlWriterMap as defaultWriterMap } from '@mtcute/tl/binary/writer.js'\nimport { TlReaderMap, TlWriterMap } from '@mtcute/tl-runtime'\n\nimport { IMtStorageProvider } from '../storage/provider.js'\nimport { StorageManager, StorageManagerExtraOptions } from '../storage/storage.js'\nimport { MustEqual } from '../types/index.js'\nimport {\n asyncResettable,\n DcOptions,\n defaultProductionDc,\n defaultProductionIpv6Dc,\n defaultTestDc,\n defaultTestIpv6Dc,\n ICryptoProvider,\n isTlRpcError,\n Logger,\n LogManager,\n} from '../utils/index.js'\nimport { ConfigManager } from './config-manager.js'\nimport { NetworkManager, NetworkManagerExtraParams, RpcCallOptions } from './network-manager.js'\nimport { PersistentConnectionParams } from './persistent-connection.js'\nimport { ReconnectionStrategy } from './reconnection.js'\nimport { TransportFactory } from './transports/index.js'\n\n/** Options for {@link MtClient} */\nexport interface MtClientOptions {\n /**\n * API ID from my.telegram.org\n */\n apiId: number\n /**\n * API hash from my.telegram.org\n */\n apiHash: string\n\n /**\n * Storage to use for this client.\n */\n storage: IMtStorageProvider\n\n /** Additional options for the storage manager */\n storageOptions?: StorageManagerExtraOptions\n\n /**\n * Cryptography provider to allow delegating\n * crypto to native addon, worker, etc.\n */\n crypto: ICryptoProvider\n\n /**\n * Whether to use IPv6 datacenters\n * (IPv6 will be preferred when choosing a DC by id)\n * (default: false)\n */\n useIpv6?: boolean\n\n /**\n * Primary DC to use for initial connection.\n * This does not mean this will be the only DC used,\n * nor that this DC will actually be primary, this only\n * determines the first DC the library will try to connect to.\n * Can be used to connect to other networks (like test DCs).\n *\n * When session already contains primary DC, this parameter is ignored.\n *\n * @default Production DC 2.\n */\n defaultDcs?: DcOptions\n\n /**\n * Whether to connect to test servers.\n *\n * If passed, {@link defaultDc} defaults to Test DC 2.\n *\n * **Must** be passed if using test servers, even if\n * you passed custom {@link defaultDc}\n */\n testMode?: boolean\n\n /**\n * Additional options for initConnection call.\n * `apiId` and `query` are not available and will be ignored.\n * Omitted values will be filled with defaults\n */\n initConnectionOptions?: Partial<Omit<tl.RawInitConnectionRequest, 'apiId' | 'query'>>\n\n /**\n * Transport factory to use in the client.\n *\n * @default platform-specific transport: WebSocket on the web, TCP in node\n */\n transport: TransportFactory\n\n /**\n * Reconnection strategy.\n *\n * @default simple reconnection strategy: first 0ms, then up to 5s (increasing by 1s)\n */\n reconnectionStrategy?: ReconnectionStrategy<PersistentConnectionParams>\n\n /**\n * Maximum duration of a flood_wait that will be waited automatically.\n * Flood waits above this threshold will throw a FloodWaitError.\n * Set to 0 to disable. Can be overridden with `throwFlood` parameter in call() params\n *\n * @default 10000\n */\n floodSleepThreshold?: number\n\n /**\n * Maximum number of retries when calling RPC methods.\n * Call is retried when InternalError or FloodWaitError is encountered.\n * Can be set to Infinity.\n *\n * @default 5\n */\n maxRetryCount?: number\n\n /**\n * If true, all API calls will be wrapped with `tl.invokeWithoutUpdates`,\n * effectively disabling the server-sent events for the clients.\n * May be useful in some cases.\n *\n * @default false\n */\n disableUpdates?: boolean\n\n /**\n * mtcute can send all unknown RPC errors to [danog](https://github.com/danog)'s\n * [error reporting service](https://rpc.pwrtelegram.xyz/).\n *\n * This is fully anonymous (except maybe IP) and is only used to improve the library\n * and developer experience for everyone working with MTProto. This is fully opt-in,\n * and if you're too paranoid, you can disable it by manually passing `enableErrorReporting: false` to the client.\n *\n * @default false\n */\n enableErrorReporting?: boolean\n\n /**\n * Extra parameters for {@link NetworkManager}\n */\n network?: NetworkManagerExtraParams\n\n /**\n * Logger instance for the client.\n * If not passed, a new one will be created.\n */\n logger?: Logger\n\n /**\n * Set logging level for the client.\n * Shorthand for `client.log.level = level`.\n *\n * See static members of {@link LogManager} for possible values.\n */\n logLevel?: number\n\n /**\n * **EXPERT USE ONLY!**\n *\n * Override TL layer used for the connection.\n *\n * **Does not** change the schema used.\n */\n overrideLayer?: number\n\n /**\n * **EXPERT USE ONLY**\n *\n * Override reader map used for the connection.\n */\n readerMap?: TlReaderMap\n\n /**\n * **EXPERT USE ONLY**\n *\n * Override writer map used for the connection.\n */\n writerMap?: TlWriterMap\n}\n\n/**\n * Basic MTProto client implementation, only doing the bare minimum\n * to make RPC calls and receive low-level updates, as well as providing\n * some APIs to manage that.\n */\nexport class MtClient extends EventEmitter {\n /**\n * Crypto provider taken from {@link MtClientOptions.crypto}\n */\n readonly crypto: ICryptoProvider\n\n /** Storage manager */\n readonly storage: StorageManager\n\n /**\n * \"Test mode\" taken from {@link MtClientOptions.testMode}\n */\n protected readonly _testMode: boolean\n\n /**\n * Primary DCs taken from {@link MtClientOptions.defaultDcs},\n * loaded from session or changed by other means (like redirecting).\n */\n _defaultDcs: DcOptions\n\n /** TL layer used by the client */\n readonly _layer: number\n /** TL readers map used by the client */\n readonly _readerMap: TlReaderMap\n /** TL writers map used by the client */\n readonly _writerMap: TlWriterMap\n\n readonly _config = new ConfigManager(async () => {\n const res = await this.call({ _: 'help.getConfig' })\n\n if (isTlRpcError(res)) throw new Error(`Failed to get config: ${res.errorMessage}`)\n\n return res\n })\n\n private _emitError?: (err: unknown) => void\n\n readonly log: Logger\n readonly network: NetworkManager\n\n private _abortController: AbortController\n readonly stopSignal: AbortSignal\n\n constructor(readonly params: MtClientOptions) {\n super()\n\n this.log = params.logger ?? new LogManager()\n\n if (params.logLevel !== undefined) {\n this.log.mgr.level = params.logLevel\n }\n\n this.crypto = params.crypto\n this._testMode = Boolean(params.testMode)\n\n let dc = params.defaultDcs\n\n if (!dc) {\n if (params.testMode) {\n dc = params.useIpv6 ? defaultTestIpv6Dc : defaultTestDc\n } else {\n dc = params.useIpv6 ? defaultProductionIpv6Dc : defaultProductionDc\n }\n }\n\n this._defaultDcs = dc\n\n this._layer = params.overrideLayer ?? tl.LAYER\n this._readerMap = params.readerMap ?? defaultReaderMap\n this._writerMap = params.writerMap ?? defaultWriterMap\n\n this._abortController = new AbortController()\n this.stopSignal = this._abortController.signal\n\n this.storage = new StorageManager({\n provider: params.storage,\n log: this.log,\n readerMap: this._readerMap,\n writerMap: this._writerMap,\n ...params.storageOptions,\n })\n\n this.network = new NetworkManager(\n {\n apiId: params.apiId,\n crypto: this.crypto,\n disableUpdates: params.disableUpdates ?? false,\n initConnectionOptions: params.initConnectionOptions,\n layer: this._layer,\n log: this.log,\n readerMap: this._readerMap,\n writerMap: this._writerMap,\n reconnectionStrategy: params.reconnectionStrategy,\n storage: this.storage,\n testMode: Boolean(params.testMode),\n transport: params.transport,\n emitError: this.emitError.bind(this),\n floodSleepThreshold: params.floodSleepThreshold ?? 10000,\n maxRetryCount: params.maxRetryCount ?? 5,\n isPremium: false,\n useIpv6: Boolean(params.useIpv6),\n enableErrorReporting: params.enableErrorReporting ?? false,\n onUsable: () => this.emit('usable'),\n onConnecting: () => this.emit('connecting'),\n onNetworkChanged: (connected) => this.emit('networkChanged', connected),\n onUpdate: (upd) => this.emit('update', upd),\n stopSignal: this.stopSignal,\n ...params.network,\n },\n this._config,\n )\n }\n\n emitError(err: unknown): void {\n if (this._emitError) {\n this._emitError(err)\n } else if (this._connect.finished()) {\n this.log.error('unhandled error:', err)\n }\n }\n\n private _prepare = asyncResettable(async () => {\n await this.crypto.initialize?.()\n await this.storage.load()\n\n const primaryDc = await this.storage.dcs.fetch()\n if (primaryDc !== null) this._defaultDcs = primaryDc\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 private _connect = asyncResettable(async () => {\n await this._prepare.run()\n await this.network.connect(this._defaultDcs)\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 /**\n * Close all connections and finalize the client.\n */\n async close(): Promise<void> {\n this.log.debug('closing client')\n\n this._config.destroy()\n await this.network.destroy()\n\n await this.storage.save()\n await this.storage.destroy?.()\n\n this._prepare.reset()\n this._connect.reset()\n this._abortController.abort()\n\n this.log.debug('client closed successfully')\n }\n\n /**\n * Make an RPC call.\n *\n * The connection must have been {@link connect}-ed\n * before calling this method.\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['_']] | mtp.RawMt_rpc_error> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return this.network.call(message, params)\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._emitError = handler\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import EventEmitter from 'events';
2
- import { tl } from '@mtcute/tl';
2
+ import { mtp, tl } from '@mtcute/tl';
3
3
  import { Logger } from '../utils/index.js';
4
4
  import { MtprotoSession } from './mtproto-session.js';
5
5
  import { SessionConnection, SessionConnectionParams } from './session-connection.js';
@@ -18,7 +18,7 @@ export declare class MultiSessionConnection extends EventEmitter {
18
18
  _destroyed: boolean;
19
19
  destroy(): Promise<void>;
20
20
  private _nextConnection;
21
- sendRpc<T extends tl.RpcMethod>(request: T, stack?: string, timeout?: number, abortSignal?: AbortSignal, chainId?: string | number): Promise<tl.RpcCallReturn[T['_']]>;
21
+ sendRpc<T extends tl.RpcMethod>(request: T, timeout?: number, abortSignal?: AbortSignal, chainId?: string | number): Promise<tl.RpcCallReturn[T['_']] | mtp.RawMt_rpc_error>;
22
22
  connect(): void;
23
23
  ensureConnected(): void;
24
24
  setAuthKey(authKey: Uint8Array | null, temp?: boolean, idx?: number): void;