@mtcute/core 0.15.2 → 0.16.0

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 (163) hide show
  1. package/cjs/highlevel/base.d.ts +3 -3
  2. package/cjs/highlevel/base.js.map +1 -1
  3. package/cjs/highlevel/methods/files/download-iterable.js +1 -1
  4. package/cjs/highlevel/methods/files/download-iterable.js.map +1 -1
  5. package/cjs/highlevel/methods/users/resolve-peer-many.js +1 -1
  6. package/cjs/highlevel/methods/users/resolve-peer-many.js.map +1 -1
  7. package/cjs/highlevel/types/messages/dialog.d.ts +4 -2
  8. package/cjs/highlevel/types/messages/dialog.js +4 -2
  9. package/cjs/highlevel/types/messages/dialog.js.map +1 -1
  10. package/cjs/highlevel/types/messages/message-action.d.ts +15 -1
  11. package/cjs/highlevel/types/messages/message-action.js +10 -0
  12. package/cjs/highlevel/types/messages/message-action.js.map +1 -1
  13. package/cjs/highlevel/types/peers/full-chat.d.ts +2 -0
  14. package/cjs/highlevel/types/peers/full-chat.js +4 -0
  15. package/cjs/highlevel/types/peers/full-chat.js.map +1 -1
  16. package/cjs/highlevel/updates/manager.js +3 -3
  17. package/cjs/highlevel/updates/manager.js.map +1 -1
  18. package/cjs/highlevel/worker/invoker.js +2 -1
  19. package/cjs/highlevel/worker/invoker.js.map +1 -1
  20. package/cjs/highlevel/worker/port.js +4 -3
  21. package/cjs/highlevel/worker/port.js.map +1 -1
  22. package/cjs/highlevel/worker/protocol.d.ts +10 -5
  23. package/cjs/highlevel/worker/protocol.js +66 -0
  24. package/cjs/highlevel/worker/protocol.js.map +1 -1
  25. package/cjs/highlevel/worker/worker.js +6 -5
  26. package/cjs/highlevel/worker/worker.js.map +1 -1
  27. package/cjs/network/client.d.ts +0 -16
  28. package/cjs/network/client.js +0 -2
  29. package/cjs/network/client.js.map +1 -1
  30. package/cjs/network/index.d.ts +2 -1
  31. package/cjs/network/index.js +1 -0
  32. package/cjs/network/index.js.map +1 -1
  33. package/cjs/network/middlewares/bundle.d.ts +3 -0
  34. package/cjs/network/middlewares/bundle.js +20 -0
  35. package/cjs/network/middlewares/bundle.js.map +1 -0
  36. package/cjs/network/middlewares/default.d.ts +8 -0
  37. package/cjs/network/middlewares/default.js +10 -0
  38. package/cjs/network/middlewares/default.js.map +1 -0
  39. package/cjs/network/middlewares/flood-waiter.d.ts +37 -0
  40. package/cjs/network/middlewares/flood-waiter.js +70 -0
  41. package/cjs/network/middlewares/flood-waiter.js.map +1 -0
  42. package/cjs/network/middlewares/index.d.ts +2 -0
  43. package/cjs/network/middlewares/index.js +29 -0
  44. package/cjs/network/middlewares/index.js.map +1 -0
  45. package/cjs/network/middlewares/internal-errors.d.ts +17 -0
  46. package/cjs/network/middlewares/internal-errors.js +41 -0
  47. package/cjs/network/middlewares/internal-errors.js.map +1 -0
  48. package/cjs/network/middlewares/on-error.d.ts +30 -0
  49. package/cjs/network/middlewares/on-error.js +44 -0
  50. package/cjs/network/middlewares/on-error.js.map +1 -0
  51. package/cjs/network/middlewares/on-method.d.ts +39 -0
  52. package/cjs/network/middlewares/on-method.js +45 -0
  53. package/cjs/network/middlewares/on-method.js.map +1 -0
  54. package/cjs/network/mtproto-session.js +1 -1
  55. package/cjs/network/mtproto-session.js.map +1 -1
  56. package/cjs/network/multi-session-connection.js +1 -1
  57. package/cjs/network/multi-session-connection.js.map +1 -1
  58. package/cjs/network/network-manager.d.ts +23 -6
  59. package/cjs/network/network-manager.js +55 -102
  60. package/cjs/network/network-manager.js.map +1 -1
  61. package/cjs/network/persistent-connection.js +5 -5
  62. package/cjs/network/persistent-connection.js.map +1 -1
  63. package/cjs/network/session-connection.js +6 -6
  64. package/cjs/network/session-connection.js.map +1 -1
  65. package/cjs/storage/driver.js +1 -1
  66. package/cjs/storage/driver.js.map +1 -1
  67. package/cjs/storage/storage.js +1 -1
  68. package/cjs/storage/storage.js.map +1 -1
  69. package/cjs/utils/abort-signal.d.ts +1 -0
  70. package/cjs/utils/abort-signal.js +13 -0
  71. package/cjs/utils/abort-signal.js.map +1 -0
  72. package/cjs/utils/composer.d.ts +3 -0
  73. package/cjs/utils/composer.js +22 -0
  74. package/cjs/utils/composer.js.map +1 -0
  75. package/cjs/utils/error-reporting.js +1 -1
  76. package/cjs/utils/error-reporting.js.map +1 -1
  77. package/cjs/utils/index.d.ts +1 -0
  78. package/cjs/utils/index.js +1 -0
  79. package/cjs/utils/index.js.map +1 -1
  80. package/cjs/utils/logger.js +15 -3
  81. package/cjs/utils/logger.js.map +1 -1
  82. package/esm/highlevel/base.d.ts +3 -3
  83. package/esm/highlevel/base.js.map +1 -1
  84. package/esm/highlevel/methods/files/download-iterable.js +1 -1
  85. package/esm/highlevel/methods/files/download-iterable.js.map +1 -1
  86. package/esm/highlevel/methods/users/resolve-peer-many.js +1 -1
  87. package/esm/highlevel/methods/users/resolve-peer-many.js.map +1 -1
  88. package/esm/highlevel/types/messages/dialog.d.ts +4 -2
  89. package/esm/highlevel/types/messages/dialog.js +4 -2
  90. package/esm/highlevel/types/messages/dialog.js.map +1 -1
  91. package/esm/highlevel/types/messages/message-action.d.ts +15 -1
  92. package/esm/highlevel/types/messages/message-action.js +10 -0
  93. package/esm/highlevel/types/messages/message-action.js.map +1 -1
  94. package/esm/highlevel/types/peers/full-chat.d.ts +2 -0
  95. package/esm/highlevel/types/peers/full-chat.js +4 -0
  96. package/esm/highlevel/types/peers/full-chat.js.map +1 -1
  97. package/esm/highlevel/updates/manager.js +3 -3
  98. package/esm/highlevel/updates/manager.js.map +1 -1
  99. package/esm/highlevel/worker/invoker.js +2 -1
  100. package/esm/highlevel/worker/invoker.js.map +1 -1
  101. package/esm/highlevel/worker/port.js +4 -3
  102. package/esm/highlevel/worker/port.js.map +1 -1
  103. package/esm/highlevel/worker/protocol.d.ts +10 -5
  104. package/esm/highlevel/worker/protocol.js +60 -1
  105. package/esm/highlevel/worker/protocol.js.map +1 -1
  106. package/esm/highlevel/worker/worker.js +6 -5
  107. package/esm/highlevel/worker/worker.js.map +1 -1
  108. package/esm/network/client.d.ts +0 -16
  109. package/esm/network/client.js +0 -2
  110. package/esm/network/client.js.map +1 -1
  111. package/esm/network/index.d.ts +2 -1
  112. package/esm/network/index.js +1 -0
  113. package/esm/network/index.js.map +1 -1
  114. package/esm/network/middlewares/bundle.d.ts +3 -0
  115. package/esm/network/middlewares/bundle.js +4 -0
  116. package/esm/network/middlewares/bundle.js.map +1 -0
  117. package/esm/network/middlewares/default.d.ts +8 -0
  118. package/esm/network/middlewares/default.js +6 -0
  119. package/esm/network/middlewares/default.js.map +1 -0
  120. package/esm/network/middlewares/flood-waiter.d.ts +37 -0
  121. package/esm/network/middlewares/flood-waiter.js +66 -0
  122. package/esm/network/middlewares/flood-waiter.js.map +1 -0
  123. package/esm/network/middlewares/index.d.ts +2 -0
  124. package/esm/network/middlewares/index.js +3 -0
  125. package/esm/network/middlewares/index.js.map +1 -0
  126. package/esm/network/middlewares/internal-errors.d.ts +17 -0
  127. package/esm/network/middlewares/internal-errors.js +37 -0
  128. package/esm/network/middlewares/internal-errors.js.map +1 -0
  129. package/esm/network/middlewares/on-error.d.ts +30 -0
  130. package/esm/network/middlewares/on-error.js +40 -0
  131. package/esm/network/middlewares/on-error.js.map +1 -0
  132. package/esm/network/middlewares/on-method.d.ts +39 -0
  133. package/esm/network/middlewares/on-method.js +41 -0
  134. package/esm/network/middlewares/on-method.js.map +1 -0
  135. package/esm/network/mtproto-session.js +1 -1
  136. package/esm/network/mtproto-session.js.map +1 -1
  137. package/esm/network/multi-session-connection.js +1 -1
  138. package/esm/network/multi-session-connection.js.map +1 -1
  139. package/esm/network/network-manager.d.ts +23 -6
  140. package/esm/network/network-manager.js +57 -104
  141. package/esm/network/network-manager.js.map +1 -1
  142. package/esm/network/persistent-connection.js +5 -5
  143. package/esm/network/persistent-connection.js.map +1 -1
  144. package/esm/network/session-connection.js +6 -6
  145. package/esm/network/session-connection.js.map +1 -1
  146. package/esm/storage/driver.js +1 -1
  147. package/esm/storage/driver.js.map +1 -1
  148. package/esm/storage/storage.js +1 -1
  149. package/esm/storage/storage.js.map +1 -1
  150. package/esm/utils/abort-signal.d.ts +1 -0
  151. package/esm/utils/abort-signal.js +9 -0
  152. package/esm/utils/abort-signal.js.map +1 -0
  153. package/esm/utils/composer.d.ts +3 -0
  154. package/esm/utils/composer.js +18 -0
  155. package/esm/utils/composer.js.map +1 -0
  156. package/esm/utils/error-reporting.js +1 -1
  157. package/esm/utils/error-reporting.js.map +1 -1
  158. package/esm/utils/index.d.ts +1 -0
  159. package/esm/utils/index.js +1 -0
  160. package/esm/utils/index.js.map +1 -1
  161. package/esm/utils/logger.js +15 -3
  162. package/esm/utils/logger.js.map +1 -1
  163. package/package.json +4 -4
@@ -10,7 +10,7 @@ class BaseStorageDriver {
10
10
  _destroyed = false;
11
11
  _log;
12
12
  setup(log) {
13
- this._log = log;
13
+ this._log = log.create('sqlite');
14
14
  }
15
15
  get loaded() {
16
16
  return this._loadedTimes > 0;
@@ -1 +1 @@
1
- {"version":3,"file":"driver.js","sourceRoot":"","sources":["../../../src/storage/driver.ts"],"names":[],"mappings":";;;AA0CA;;;GAGG;AACH,MAAsB,iBAAiB;IAK3B,YAAY,GAAG,CAAC,CAAA;IAChB,UAAU,GAAG,KAAK,CAAA;IAEhB,IAAI,CAAS;IAEvB,KAAK,CAAC,GAAW;QACb,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;IACnB,CAAC;IAED,IAAc,MAAM;QAChB,OAAO,IAAI,CAAC,YAAY,GAAG,CAAC,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,IAAI;QACN,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;YAClB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;QAC3B,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAA;IACvB,CAAC;IAED,KAAK,CAAC,OAAO;QACT,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,OAAM;QACV,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAA;QAEnB,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAA;YACrB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QAC1B,CAAC;IACL,CAAC;IAED,IAAI;QACA,OAAO,IAAI,CAAC,KAAK,EAAE,EAAE,CAAA;IACzB,CAAC;CACJ;AA3CD,8CA2CC","sourcesContent":["import { MaybePromise } from '../types/utils.js'\nimport { Logger } from '../utils/logger.js'\n\n/**\n * Basic storage driver interface,\n * describing the lifecycle of a storage driver\n */\nexport interface IStorageDriver {\n /**\n * Load session from some external storage.\n * Should be used either to load data from file/network/etc\n * to memory, or to open required connections to fetch data on demand\n *\n * May be called more than once, handle this with care\n * (or use {@link BaseStorageDriver} that handles this for you)\n */\n load?(): MaybePromise<void>\n /**\n * Save session to some external storage.\n * Should be used to commit pending changes in the session.\n * For example, saving session content to file/network/etc,\n * or committing a database transaction\n *\n * It is safe to batch all changes and only commit them here,\n * unless stated otherwise in the method description\n */\n save?(): MaybePromise<void>\n /**\n * Cleanup session and release all used resources.\n *\n * May be called more than once, handle this with care\n * (or use {@link BaseStorageDriver} that handles this for you)\n */\n destroy?(): MaybePromise<void>\n\n /**\n * Setup the driver, passing the logger instance,\n * in case your driver needs it\n */\n setup?(log: Logger): void\n}\n\n/**\n * Base storage driver class, implementing {@link IStorageDriver}\n * and handling the lifecycle for you\n */\nexport abstract class BaseStorageDriver implements IStorageDriver {\n abstract _load(): MaybePromise<void>\n abstract _destroy(): MaybePromise<void>\n abstract _save?(): MaybePromise<void>\n\n private _loadedTimes = 0\n private _destroyed = false\n\n protected _log!: Logger\n\n setup(log: Logger): void {\n this._log = log\n }\n\n protected get loaded(): boolean {\n return this._loadedTimes > 0\n }\n\n async load(): Promise<void> {\n if (this._loadedTimes === 0) {\n await this._load()\n this._destroyed = false\n }\n\n this._loadedTimes++\n }\n\n async destroy(): Promise<void> {\n if (this._destroyed) {\n return\n }\n\n this._loadedTimes--\n\n if (this._loadedTimes === 0) {\n await this._destroy()\n this._destroyed = true\n }\n }\n\n save(): MaybePromise<void> {\n return this._save?.()\n }\n}\n"]}
1
+ {"version":3,"file":"driver.js","sourceRoot":"","sources":["../../../src/storage/driver.ts"],"names":[],"mappings":";;;AA0CA;;;GAGG;AACH,MAAsB,iBAAiB;IAK3B,YAAY,GAAG,CAAC,CAAA;IAChB,UAAU,GAAG,KAAK,CAAA;IAEhB,IAAI,CAAS;IAEvB,KAAK,CAAC,GAAW;QACb,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACpC,CAAC;IAED,IAAc,MAAM;QAChB,OAAO,IAAI,CAAC,YAAY,GAAG,CAAC,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,IAAI;QACN,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;YAClB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;QAC3B,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAA;IACvB,CAAC;IAED,KAAK,CAAC,OAAO;QACT,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,OAAM;QACV,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAA;QAEnB,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAA;YACrB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QAC1B,CAAC;IACL,CAAC;IAED,IAAI;QACA,OAAO,IAAI,CAAC,KAAK,EAAE,EAAE,CAAA;IACzB,CAAC;CACJ;AA3CD,8CA2CC","sourcesContent":["import { MaybePromise } from '../types/utils.js'\nimport { Logger } from '../utils/logger.js'\n\n/**\n * Basic storage driver interface,\n * describing the lifecycle of a storage driver\n */\nexport interface IStorageDriver {\n /**\n * Load session from some external storage.\n * Should be used either to load data from file/network/etc\n * to memory, or to open required connections to fetch data on demand\n *\n * May be called more than once, handle this with care\n * (or use {@link BaseStorageDriver} that handles this for you)\n */\n load?(): MaybePromise<void>\n /**\n * Save session to some external storage.\n * Should be used to commit pending changes in the session.\n * For example, saving session content to file/network/etc,\n * or committing a database transaction\n *\n * It is safe to batch all changes and only commit them here,\n * unless stated otherwise in the method description\n */\n save?(): MaybePromise<void>\n /**\n * Cleanup session and release all used resources.\n *\n * May be called more than once, handle this with care\n * (or use {@link BaseStorageDriver} that handles this for you)\n */\n destroy?(): MaybePromise<void>\n\n /**\n * Setup the driver, passing the logger instance,\n * in case your driver needs it\n */\n setup?(log: Logger): void\n}\n\n/**\n * Base storage driver class, implementing {@link IStorageDriver}\n * and handling the lifecycle for you\n */\nexport abstract class BaseStorageDriver implements IStorageDriver {\n abstract _load(): MaybePromise<void>\n abstract _destroy(): MaybePromise<void>\n abstract _save?(): MaybePromise<void>\n\n private _loadedTimes = 0\n private _destroyed = false\n\n protected _log!: Logger\n\n setup(log: Logger): void {\n this._log = log.create('sqlite')\n }\n\n protected get loaded(): boolean {\n return this._loadedTimes > 0\n }\n\n async load(): Promise<void> {\n if (this._loadedTimes === 0) {\n await this._load()\n this._destroyed = false\n }\n\n this._loadedTimes++\n }\n\n async destroy(): Promise<void> {\n if (this._destroyed) {\n return\n }\n\n this._loadedTimes--\n\n if (this._loadedTimes === 0) {\n await this._destroy()\n this._destroyed = true\n }\n }\n\n save(): MaybePromise<void> {\n return this._save?.()\n }\n}\n"]}
@@ -34,7 +34,7 @@ class StorageManager {
34
34
  this.driver.setup?.(this.log);
35
35
  if (this.options.cleanup ?? true) {
36
36
  this._cleanupRestore = (0, platform_js_1.getPlatform)().beforeExit(() => {
37
- this._destroy().catch((err) => this.log.error('cleanup error: %s', err));
37
+ this._destroy().catch((err) => this.log.error('cleanup error: %e', err));
38
38
  });
39
39
  }
40
40
  await this.driver.load?.();
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/storage/storage.ts"],"names":[],"mappings":";;;AAEA,gDAA4C;AAC5C,gDAAmD;AAGnD,yDAAwD;AAExD,6DAA4D;AAC5D,+DAA8D;AAgC9D,MAAa,cAAc;IAQF;IAPZ,QAAQ,CAAA;IACR,MAAM,CAAA;IACN,GAAG,CAAA;IACH,GAAG,CAAA;IACH,KAAK,CAAA;IACL,IAAI,CAAA;IAEb,YAAqB,OAA2D;QAA3D,YAAO,GAAP,OAAO,CAAoD;QAC5E,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAA;QACrC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAA;QAClC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QAE7C,MAAM,cAAc,GAAmB;YACnC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;YACjC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;YACjC,GAAG,EAAE,IAAI,CAAC,GAAG;SAChB,CAAA;QAED,IAAI,CAAC,GAAG,GAAG,IAAI,kCAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;QAClE,IAAI,CAAC,KAAK,GAAG,IAAI,oCAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;QACrE,IAAI,CAAC,IAAI,GAAG,IAAI,8BAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,CAAA;IACvF,CAAC;IAEO,eAAe,CAAa;IAE5B,KAAK,GAAG,IAAA,0BAAe,EAAC,KAAK,IAAI,EAAE;QACvC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAE7B,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YAC/B,IAAI,CAAC,eAAe,GAAG,IAAA,yBAAW,GAAE,CAAC,UAAU,CAAC,GAAG,EAAE;gBACjD,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,CAAA;YAC5E,CAAC,CAAC,CAAA;QACN,CAAC;QAED,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAA;IAC9B,CAAC,CAAC,CAAA;IACF,IAAI;QACA,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAA;IAC3B,CAAC;IAED,KAAK,CAAC,IAAI;QACN,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,YAAY,GAAG,KAAK;QAC5B,IAAI,YAAY,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAA;QAC5C,CAAC;QACD,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,CAAA;QAClC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;IACrB,CAAC;IAEO,KAAK,CAAC,QAAQ;QAClB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YAAE,OAAM;QAClC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;QAEvB,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAA;QAC7B,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IACtB,CAAC;IAED,KAAK,CAAC,OAAO;QACT,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,IAAI,CAAC,eAAe,EAAE,CAAA;YACtB,IAAI,CAAC,eAAe,GAAG,SAAS,CAAA;QACpC,CAAC;QAED,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAA;IACzB,CAAC;CACJ;AAtED,wCAsEC","sourcesContent":["import { TlReaderMap, TlWriterMap } from '@mtcute/tl-runtime'\n\nimport { getPlatform } from '../platform.js'\nimport { asyncResettable } from '../utils/index.js'\nimport { Logger } from '../utils/logger.js'\nimport { IMtStorageProvider } from './provider.js'\nimport { AuthKeysService } from './service/auth-keys.js'\nimport { ServiceOptions } from './service/base.js'\nimport { DefaultDcsService } from './service/default-dcs.js'\nimport { FutureSaltsService } from './service/future-salts.js'\n\ninterface StorageManagerOptions {\n provider: IMtStorageProvider\n log: Logger\n readerMap: TlReaderMap\n writerMap: TlWriterMap\n}\n\n/**\n * Additional options for {@link StorageManager}, that\n * can be customized by the user.\n *\n * @internal\n */\nexport interface StorageManagerExtraOptions {\n /**\n * Interval in milliseconds for saving the storage.\n *\n * When saving, the storage is expected to persist\n * all changes to disk, so that they are not lost.\n */\n saveInterval?: number\n\n /**\n * Whether to finalize database before exiting.\n *\n * @default `true`\n */\n cleanup?: boolean\n}\n\nexport class StorageManager {\n readonly provider\n readonly driver\n readonly log\n readonly dcs\n readonly salts\n readonly keys\n\n constructor(readonly options: StorageManagerOptions & StorageManagerExtraOptions) {\n this.provider = this.options.provider\n this.driver = this.provider.driver\n this.log = this.options.log.create('storage')\n\n const serviceOptions: ServiceOptions = {\n driver: this.driver,\n readerMap: this.options.readerMap,\n writerMap: this.options.writerMap,\n log: this.log,\n }\n\n this.dcs = new DefaultDcsService(this.provider.kv, serviceOptions)\n this.salts = new FutureSaltsService(this.provider.kv, serviceOptions)\n this.keys = new AuthKeysService(this.provider.authKeys, this.salts, serviceOptions)\n }\n\n private _cleanupRestore?: () => void\n\n private _load = asyncResettable(async () => {\n this.driver.setup?.(this.log)\n\n if (this.options.cleanup ?? true) {\n this._cleanupRestore = getPlatform().beforeExit(() => {\n this._destroy().catch((err) => this.log.error('cleanup error: %s', err))\n })\n }\n\n await this.driver.load?.()\n })\n load(): Promise<void> {\n return this._load.run()\n }\n\n async save(): Promise<void> {\n await this.driver.save?.()\n }\n\n async clear(withAuthKeys = false) {\n if (withAuthKeys) {\n await this.provider.authKeys.deleteAll()\n }\n await this.provider.kv.deleteAll()\n await this.save()\n }\n\n private async _destroy(): Promise<void> {\n if (!this._load.finished()) return\n await this._load.wait()\n\n await this.driver.destroy?.()\n this._load.reset()\n }\n\n async destroy(): Promise<void> {\n if (this._cleanupRestore) {\n this._cleanupRestore()\n this._cleanupRestore = undefined\n }\n\n await this._destroy()\n }\n}\n"]}
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/storage/storage.ts"],"names":[],"mappings":"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","sourcesContent":["import { TlReaderMap, TlWriterMap } from '@mtcute/tl-runtime'\n\nimport { getPlatform } from '../platform.js'\nimport { asyncResettable } from '../utils/index.js'\nimport { Logger } from '../utils/logger.js'\nimport { IMtStorageProvider } from './provider.js'\nimport { AuthKeysService } from './service/auth-keys.js'\nimport { ServiceOptions } from './service/base.js'\nimport { DefaultDcsService } from './service/default-dcs.js'\nimport { FutureSaltsService } from './service/future-salts.js'\n\ninterface StorageManagerOptions {\n provider: IMtStorageProvider\n log: Logger\n readerMap: TlReaderMap\n writerMap: TlWriterMap\n}\n\n/**\n * Additional options for {@link StorageManager}, that\n * can be customized by the user.\n *\n * @internal\n */\nexport interface StorageManagerExtraOptions {\n /**\n * Interval in milliseconds for saving the storage.\n *\n * When saving, the storage is expected to persist\n * all changes to disk, so that they are not lost.\n */\n saveInterval?: number\n\n /**\n * Whether to finalize database before exiting.\n *\n * @default `true`\n */\n cleanup?: boolean\n}\n\nexport class StorageManager {\n readonly provider\n readonly driver\n readonly log\n readonly dcs\n readonly salts\n readonly keys\n\n constructor(readonly options: StorageManagerOptions & StorageManagerExtraOptions) {\n this.provider = this.options.provider\n this.driver = this.provider.driver\n this.log = this.options.log.create('storage')\n\n const serviceOptions: ServiceOptions = {\n driver: this.driver,\n readerMap: this.options.readerMap,\n writerMap: this.options.writerMap,\n log: this.log,\n }\n\n this.dcs = new DefaultDcsService(this.provider.kv, serviceOptions)\n this.salts = new FutureSaltsService(this.provider.kv, serviceOptions)\n this.keys = new AuthKeysService(this.provider.authKeys, this.salts, serviceOptions)\n }\n\n private _cleanupRestore?: () => void\n\n private _load = asyncResettable(async () => {\n this.driver.setup?.(this.log)\n\n if (this.options.cleanup ?? true) {\n this._cleanupRestore = getPlatform().beforeExit(() => {\n this._destroy().catch((err) => this.log.error('cleanup error: %e', err))\n })\n }\n\n await this.driver.load?.()\n })\n load(): Promise<void> {\n return this._load.run()\n }\n\n async save(): Promise<void> {\n await this.driver.save?.()\n }\n\n async clear(withAuthKeys = false) {\n if (withAuthKeys) {\n await this.provider.authKeys.deleteAll()\n }\n await this.provider.kv.deleteAll()\n await this.save()\n }\n\n private async _destroy(): Promise<void> {\n if (!this._load.finished()) return\n await this._load.wait()\n\n await this.driver.destroy?.()\n this._load.reset()\n }\n\n async destroy(): Promise<void> {\n if (this._cleanupRestore) {\n this._cleanupRestore()\n this._cleanupRestore = undefined\n }\n\n await this._destroy()\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare function combineAbortSignals(signal1: AbortSignal, signal2?: AbortSignal): AbortSignal;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.combineAbortSignals = void 0;
4
+ function combineAbortSignals(signal1, signal2) {
5
+ if (!signal2)
6
+ return signal1;
7
+ const controller = new AbortController();
8
+ signal1.addEventListener('abort', () => controller.abort());
9
+ signal2.addEventListener('abort', () => controller.abort());
10
+ return controller.signal;
11
+ }
12
+ exports.combineAbortSignals = combineAbortSignals;
13
+ //# sourceMappingURL=abort-signal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abort-signal.js","sourceRoot":"","sources":["../../../src/utils/abort-signal.ts"],"names":[],"mappings":";;;AAAA,SAAgB,mBAAmB,CAAC,OAAoB,EAAE,OAAqB;IAC3E,IAAI,CAAC,OAAO;QAAE,OAAO,OAAO,CAAA;IAE5B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IAExC,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAA;IAC3D,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAA;IAE3D,OAAO,UAAU,CAAC,MAAM,CAAA;AAC5B,CAAC;AATD,kDASC","sourcesContent":["export function combineAbortSignals(signal1: AbortSignal, signal2?: AbortSignal): AbortSignal {\n if (!signal2) return signal1\n\n const controller = new AbortController()\n\n signal1.addEventListener('abort', () => controller.abort())\n signal2.addEventListener('abort', () => controller.abort())\n\n return controller.signal\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export type Middleware<Context, Result = void> = (ctx: Context, next: (ctx: Context) => Promise<Result>) => Promise<Result>;
2
+ export type ComposedMiddleware<Context, Result = void> = (ctx: Context) => Promise<Result>;
3
+ export declare function composeMiddlewares<Context, Result = void>(middlewares: Middleware<Context, Result>[], final: ComposedMiddleware<Context, Result>): ComposedMiddleware<Context, Result>;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.composeMiddlewares = void 0;
4
+ function composeMiddlewares(middlewares, final) {
5
+ middlewares = middlewares.slice();
6
+ middlewares.push(final);
7
+ function dispatch(i, ctx) {
8
+ const fn = middlewares[i];
9
+ if (!fn)
10
+ return final(ctx);
11
+ return fn(ctx, boundDispatches[i + 1]);
12
+ }
13
+ const boundDispatches = [];
14
+ for (let i = 0; i < middlewares.length; i++) {
15
+ boundDispatches.push(dispatch.bind(null, i));
16
+ }
17
+ return function (context) {
18
+ return boundDispatches[0](context);
19
+ };
20
+ }
21
+ exports.composeMiddlewares = composeMiddlewares;
22
+ //# sourceMappingURL=composer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer.js","sourceRoot":"","sources":["../../../src/utils/composer.ts"],"names":[],"mappings":";;;AAMA,SAAgB,kBAAkB,CAC9B,WAA0C,EAC1C,KAA0C;IAE1C,WAAW,GAAG,WAAW,CAAC,KAAK,EAAE,CAAA;IACjC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAEvB,SAAS,QAAQ,CAAC,CAAS,EAAE,GAAY;QACrC,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;QACzB,IAAI,CAAC,EAAE;YAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAA;QAE1B,OAAO,EAAE,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC1C,CAAC;IAED,MAAM,eAAe,GAA6C,EAAE,CAAA;IAEpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;IAChD,CAAC;IAED,OAAO,UAAU,OAAgB;QAC7B,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IACtC,CAAC,CAAA;AACL,CAAC;AAvBD,gDAuBC","sourcesContent":["export type Middleware<Context, Result = void> = (\n ctx: Context,\n next: (ctx: Context) => Promise<Result>,\n) => Promise<Result>\nexport type ComposedMiddleware<Context, Result = void> = (ctx: Context) => Promise<Result>\n\nexport function composeMiddlewares<Context, Result = void>(\n middlewares: Middleware<Context, Result>[],\n final: ComposedMiddleware<Context, Result>,\n): ComposedMiddleware<Context, Result> {\n middlewares = middlewares.slice()\n middlewares.push(final)\n\n function dispatch(i: number, ctx: Context): Promise<Result> {\n const fn = middlewares[i]\n if (!fn) return final(ctx)\n\n return fn(ctx, boundDispatches[i + 1])\n }\n\n const boundDispatches: Array<(ctx: Context) => Promise<Result>> = []\n\n for (let i = 0; i < middlewares.length; i++) {\n boundDispatches.push(dispatch.bind(null, i))\n }\n\n return function (context: Context): Promise<Result> {\n return boundDispatches[0](context)\n }\n}\n"]}
@@ -15,7 +15,7 @@ function reportUnknownError(log, error, method) {
15
15
  }
16
16
  })
17
17
  .catch((e) => {
18
- log.debug('failed to report error %s to telerpc: %s', error.text, e);
18
+ log.debug('failed to report error %s to telerpc: %e', error.text, e);
19
19
  });
20
20
  }
21
21
  exports.reportUnknownError = reportUnknownError;
@@ -1 +1 @@
1
- {"version":3,"file":"error-reporting.js","sourceRoot":"","sources":["../../../src/utils/error-reporting.ts"],"names":[],"mappings":";;;AAIA,SAAgB,kBAAkB,CAAC,GAAW,EAAE,KAAkB,EAAE,MAAc;IAC9E,IAAI,OAAO,KAAK,KAAK,UAAU;QAAE,OAAM;IAEvC,KAAK,CAAC,qCAAqC,KAAK,CAAC,IAAI,WAAW,MAAM,UAAU,KAAK,CAAC,IAAI,EAAE,CAAC;SACxF,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACrB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;QACR,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;YACP,GAAG,CAAC,IAAI,CAAC,8CAA8C,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;QAClF,CAAC;aAAM,CAAC;YACJ,GAAG,CAAC,IAAI,CACJ,wFAAwF,EACxF,KAAK,CAAC,IAAI,CACb,CAAA;QACL,CAAC;IACL,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,GAAG,CAAC,KAAK,CAAC,0CAA0C,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IACxE,CAAC,CAAC,CAAA;AACV,CAAC;AAlBD,gDAkBC","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { Logger } from './logger.js'\n\nexport function reportUnknownError(log: Logger, error: tl.RpcError, method: string): void {\n if (typeof fetch !== 'function') return\n\n fetch(`https://rpc.pwrtelegram.xyz/?code=${error.code}&method=${method}&error=${error.text}`)\n .then((r) => r.json())\n .then((r) => {\n if (r.ok) {\n log.info('telerpc responded with error info for %s: %s', error.text, r.result)\n } else {\n log.info(\n 'Reported error %s to telerpc. You can disable this using `enableErrorReporting: false`',\n error.text,\n )\n }\n })\n .catch((e) => {\n log.debug('failed to report error %s to telerpc: %s', error.text, e)\n })\n}\n"]}
1
+ {"version":3,"file":"error-reporting.js","sourceRoot":"","sources":["../../../src/utils/error-reporting.ts"],"names":[],"mappings":";;;AAIA,SAAgB,kBAAkB,CAAC,GAAW,EAAE,KAAkB,EAAE,MAAc;IAC9E,IAAI,OAAO,KAAK,KAAK,UAAU;QAAE,OAAM;IAEvC,KAAK,CAAC,qCAAqC,KAAK,CAAC,IAAI,WAAW,MAAM,UAAU,KAAK,CAAC,IAAI,EAAE,CAAC;SACxF,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACrB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;QACR,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;YACP,GAAG,CAAC,IAAI,CAAC,8CAA8C,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;QAClF,CAAC;aAAM,CAAC;YACJ,GAAG,CAAC,IAAI,CACJ,wFAAwF,EACxF,KAAK,CAAC,IAAI,CACb,CAAA;QACL,CAAC;IACL,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,GAAG,CAAC,KAAK,CAAC,0CAA0C,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IACxE,CAAC,CAAC,CAAA;AACV,CAAC;AAlBD,gDAkBC","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { Logger } from './logger.js'\n\nexport function reportUnknownError(log: Logger, error: tl.RpcError, method: string): void {\n if (typeof fetch !== 'function') return\n\n fetch(`https://rpc.pwrtelegram.xyz/?code=${error.code}&method=${method}&error=${error.text}`)\n .then((r) => r.json())\n .then((r) => {\n if (r.ok) {\n log.info('telerpc responded with error info for %s: %s', error.text, r.result)\n } else {\n log.info(\n 'Reported error %s to telerpc. You can disable this using `enableErrorReporting: false`',\n error.text,\n )\n }\n })\n .catch((e) => {\n log.debug('failed to report error %s to telerpc: %e', error.text, e)\n })\n}\n"]}
@@ -6,6 +6,7 @@ export * from '../storage/service/default-dcs.js';
6
6
  export * from './async-lock.js';
7
7
  export * from './bigint-utils.js';
8
8
  export * from './buffer-utils.js';
9
+ export * from './composer.js';
9
10
  export * from './condition-variable.js';
10
11
  export * from './controllable-promise.js';
11
12
  export * from './crypto/index.js';
@@ -30,6 +30,7 @@ __exportStar(require("../storage/service/default-dcs.js"), exports);
30
30
  __exportStar(require("./async-lock.js"), exports);
31
31
  __exportStar(require("./bigint-utils.js"), exports);
32
32
  __exportStar(require("./buffer-utils.js"), exports);
33
+ __exportStar(require("./composer.js"), exports);
33
34
  __exportStar(require("./condition-variable.js"), exports);
34
35
  __exportStar(require("./controllable-promise.js"), exports);
35
36
  __exportStar(require("./crypto/index.js"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8DAA2C;AAC3C,2BAA2B;AAC3B,+EAA4D;AAC5D,0EAAuD;AACvD,6DAA0C;AAC1C,oEAAiD;AACjD,WAAW;AACX,kDAA+B;AAC/B,oDAAiC;AACjC,oDAAiC;AACjC,0DAAuC;AACvC,4DAAyC;AACzC,oDAAiC;AACjC,2CAAwB;AACxB,6CAA0B;AAC1B,mDAAgC;AAChC,sDAAmC;AACnC,mDAAgC;AAChC,mDAAgC;AAChC,8CAA2B;AAC3B,kDAA+B;AAC/B,+CAA4B;AAC5B,+CAA4B;AAC5B,kDAA+B;AAC/B,kDAA+B;AAC/B,oDAAiC;AACjC,+CAA4B;AAC5B,uDAAoC;AACpC,qDAAkC","sourcesContent":["export * from '../highlevel/utils/index.js'\n// todo: remove after 1.0.0\nexport * from '../highlevel/storage/service/current-user.js'\nexport * from '../highlevel/storage/service/updates.js'\nexport * from '../storage/service/base.js'\nexport * from '../storage/service/default-dcs.js'\n// end todo\nexport * from './async-lock.js'\nexport * from './bigint-utils.js'\nexport * from './buffer-utils.js'\nexport * from './condition-variable.js'\nexport * from './controllable-promise.js'\nexport * from './crypto/index.js'\nexport * from './dcs.js'\nexport * from './deque.js'\nexport * from './early-timer.js'\nexport * from './function-utils.js'\nexport * from './linked-list.js'\nexport * from './links/index.js'\nexport * from './logger.js'\nexport * from './long-utils.js'\nexport * from './lru-map.js'\nexport * from './lru-set.js'\nexport * from './misc-utils.js'\nexport * from './peer-utils.js'\nexport * from './sorted-array.js'\nexport * from './tl-json.js'\nexport * from './type-assertions.js'\nexport * from '@mtcute/tl-runtime'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8DAA2C;AAC3C,2BAA2B;AAC3B,+EAA4D;AAC5D,0EAAuD;AACvD,6DAA0C;AAC1C,oEAAiD;AACjD,WAAW;AACX,kDAA+B;AAC/B,oDAAiC;AACjC,oDAAiC;AACjC,gDAA6B;AAC7B,0DAAuC;AACvC,4DAAyC;AACzC,oDAAiC;AACjC,2CAAwB;AACxB,6CAA0B;AAC1B,mDAAgC;AAChC,sDAAmC;AACnC,mDAAgC;AAChC,mDAAgC;AAChC,8CAA2B;AAC3B,kDAA+B;AAC/B,+CAA4B;AAC5B,+CAA4B;AAC5B,kDAA+B;AAC/B,kDAA+B;AAC/B,oDAAiC;AACjC,+CAA4B;AAC5B,uDAAoC;AACpC,qDAAkC","sourcesContent":["export * from '../highlevel/utils/index.js'\n// todo: remove after 1.0.0\nexport * from '../highlevel/storage/service/current-user.js'\nexport * from '../highlevel/storage/service/updates.js'\nexport * from '../storage/service/base.js'\nexport * from '../storage/service/default-dcs.js'\n// end todo\nexport * from './async-lock.js'\nexport * from './bigint-utils.js'\nexport * from './buffer-utils.js'\nexport * from './composer.js'\nexport * from './condition-variable.js'\nexport * from './controllable-promise.js'\nexport * from './crypto/index.js'\nexport * from './dcs.js'\nexport * from './deque.js'\nexport * from './early-timer.js'\nexport * from './function-utils.js'\nexport * from './linked-list.js'\nexport * from './links/index.js'\nexport * from './logger.js'\nexport * from './long-utils.js'\nexport * from './lru-map.js'\nexport * from './lru-set.js'\nexport * from './misc-utils.js'\nexport * from './peer-utils.js'\nexport * from './sorted-array.js'\nexport * from './tl-json.js'\nexport * from './type-assertions.js'\nexport * from '@mtcute/tl-runtime'\n"]}
@@ -1,8 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.LogManager = exports.Logger = void 0;
4
+ const tl_1 = require("@mtcute/tl");
4
5
  const platform_js_1 = require("../platform.js");
5
- const DEFAULT_LOG_LEVEL = 3;
6
+ const type_assertions_js_1 = require("./type-assertions.js");
7
+ const DEFAULT_LOG_LEVEL = 2;
6
8
  const FORMATTER_RE = /%[a-zA-Z]/g;
7
9
  /**
8
10
  * Logger created by {@link LogManager}
@@ -47,10 +49,11 @@ class Logger {
47
49
  fmt.includes('%j') ||
48
50
  fmt.includes('%J') ||
49
51
  fmt.includes('%l') ||
50
- fmt.includes('%L')) {
52
+ fmt.includes('%L') ||
53
+ fmt.includes('%e')) {
51
54
  let idx = 0;
52
55
  fmt = fmt.replace(FORMATTER_RE, (m) => {
53
- if (m === '%h' || m === '%b' || m === '%j' || m === '%J' || m === '%l' || m === '%L') {
56
+ if (m === '%h' || m === '%b' || m === '%j' || m === '%J' || m === '%l' || m === '%L' || m === '%e') {
54
57
  let val = args[idx];
55
58
  args.splice(idx, 1);
56
59
  if (m === '%h') {
@@ -88,6 +91,15 @@ class Logger {
88
91
  return 'n/a';
89
92
  return `[${val.map(String).join(', ')}]`;
90
93
  }
94
+ if (m === '%e') {
95
+ if ((0, type_assertions_js_1.isTlRpcError)(val)) {
96
+ return `${val.errorCode} ${val.errorMessage}`;
97
+ }
98
+ if (tl_1.tl.RpcError.is(val)) {
99
+ return `${val.code} ${val.text}`;
100
+ }
101
+ return val && typeof val === 'object' ? val.stack || val.message : String(val);
102
+ }
91
103
  }
92
104
  idx++;
93
105
  return m;
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"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","sourcesContent":["import { getPlatform } from '../platform.js'\n\nconst DEFAULT_LOG_LEVEL = 3\nconst FORMATTER_RE = /%[a-zA-Z]/g\n\n/**\n * Logger created by {@link LogManager}\n */\nexport class Logger {\n private color: number\n\n prefix = ''\n\n constructor(\n readonly mgr: LogManager,\n readonly tag: string,\n readonly parent: Logger = mgr,\n ) {\n let hash = 0\n\n for (let i = 0; i < tag.length; i++) {\n hash = (hash << 5) - hash + tag.charCodeAt(i)\n hash |= 0 // convert to 32bit int\n }\n\n this.color = Math.abs(hash) % 6\n }\n\n getPrefix(): string {\n let s = ''\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let obj: Logger | undefined = this\n\n while (obj) {\n if (obj.prefix) s = obj.prefix + s\n obj = obj.parent\n }\n\n return s\n }\n\n log(level: number, fmt: string, ...args: unknown[]): void {\n if (level > this.mgr.level) return\n // eslint-disable-next-line dot-notation\n if (!this.mgr['_filter'](this.tag)) return\n\n // custom formatters\n if (\n fmt.includes('%h') ||\n fmt.includes('%b') ||\n fmt.includes('%j') ||\n fmt.includes('%J') ||\n fmt.includes('%l') ||\n fmt.includes('%L')\n ) {\n let idx = 0\n fmt = fmt.replace(FORMATTER_RE, (m) => {\n if (m === '%h' || m === '%b' || m === '%j' || m === '%J' || m === '%l' || m === '%L') {\n let val = args[idx]\n\n args.splice(idx, 1)\n\n if (m === '%h') {\n if (ArrayBuffer.isView(val)) return this.mgr.platform.hexEncode(val as Uint8Array)\n if (typeof val === 'number' || typeof val === 'bigint') return val.toString(16)\n\n return String(val)\n }\n if (m === '%b') return String(Boolean(val))\n\n if (m === '%j' || m === '%J') {\n if (m === '%J') {\n val = [...(val as IterableIterator<unknown>)]\n }\n\n return JSON.stringify(val, (k, v) => {\n if (\n ArrayBuffer.isView(v) ||\n (typeof v === 'object' && v.type === 'Buffer' && Array.isArray(v.data)) // todo: how can we do this better?\n ) {\n // eslint-disable-next-line\n let str = v.data ? Buffer.from(v.data as number[]).toString('hex') : this.mgr.platform.hexEncode(v)\n\n if (str.length > 300) {\n str = str.slice(0, 300) + '...'\n }\n\n return str\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return v\n })\n }\n if (m === '%l') return String(val)\n\n if (m === '%L') {\n if (!Array.isArray(val)) return 'n/a'\n\n return `[${(val as unknown[]).map(String).join(', ')}]`\n }\n }\n\n idx++\n\n return m\n })\n }\n\n this.mgr.handler(this.color, level, this.tag, this.getPrefix() + fmt, args)\n }\n\n readonly error = this.log.bind(this, LogManager.ERROR)\n readonly warn = this.log.bind(this, LogManager.WARN)\n readonly info = this.log.bind(this, LogManager.INFO)\n readonly debug = this.log.bind(this, LogManager.DEBUG)\n readonly verbose = this.log.bind(this, LogManager.VERBOSE)\n\n /**\n * Create a {@link Logger} with the given tag\n * from the same {@link LogManager} as the current\n * Logger.\n *\n * @param tag Logger tag\n */\n create(tag: string): Logger {\n return new Logger(this.mgr, tag, this)\n }\n}\n\nconst defaultFilter = () => true\n\n/**\n * Log manager. A logger that allows managing child loggers\n */\nexport class LogManager extends Logger {\n static OFF = 0\n static ERROR = 1\n static WARN = 2\n static INFO = 3\n static DEBUG = 4\n static VERBOSE = 5\n\n readonly platform\n level: number\n handler\n\n constructor(tag = 'base') {\n // workaround because we cant pass this to super\n // eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-argument\n super(null as any, tag)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ;(this as any).mgr = this\n\n this.platform = getPlatform()\n this.level = this.platform.getDefaultLogLevel() ?? DEFAULT_LOG_LEVEL\n this.handler = this.platform.log.bind(this.platform)\n }\n\n private _filter: (tag: string) => boolean = defaultFilter\n\n /**\n * Create a {@link Logger} with the given tag\n *\n * @param tag Logger tag\n */\n create(tag: string): Logger {\n return new Logger(this, tag)\n }\n\n /**\n * Filter logging by tags.\n *\n * @param cb\n */\n filter(cb: ((tag: string) => boolean) | null): void {\n this._filter = cb ?? defaultFilter\n }\n}\n"]}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { getPlatform } from '../platform.js'\nimport { isTlRpcError } from './type-assertions.js'\n\nconst DEFAULT_LOG_LEVEL = 2\nconst FORMATTER_RE = /%[a-zA-Z]/g\n\n/**\n * Logger created by {@link LogManager}\n */\nexport class Logger {\n private color: number\n\n prefix = ''\n\n constructor(\n readonly mgr: LogManager,\n readonly tag: string,\n readonly parent: Logger = mgr,\n ) {\n let hash = 0\n\n for (let i = 0; i < tag.length; i++) {\n hash = (hash << 5) - hash + tag.charCodeAt(i)\n hash |= 0 // convert to 32bit int\n }\n\n this.color = Math.abs(hash) % 6\n }\n\n getPrefix(): string {\n let s = ''\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let obj: Logger | undefined = this\n\n while (obj) {\n if (obj.prefix) s = obj.prefix + s\n obj = obj.parent\n }\n\n return s\n }\n\n log(level: number, fmt: string, ...args: unknown[]): void {\n if (level > this.mgr.level) return\n // eslint-disable-next-line dot-notation\n if (!this.mgr['_filter'](this.tag)) return\n\n // custom formatters\n if (\n fmt.includes('%h') ||\n fmt.includes('%b') ||\n fmt.includes('%j') ||\n fmt.includes('%J') ||\n fmt.includes('%l') ||\n fmt.includes('%L') ||\n fmt.includes('%e')\n ) {\n let idx = 0\n fmt = fmt.replace(FORMATTER_RE, (m) => {\n if (m === '%h' || m === '%b' || m === '%j' || m === '%J' || m === '%l' || m === '%L' || m === '%e') {\n let val = args[idx]\n\n args.splice(idx, 1)\n\n if (m === '%h') {\n if (ArrayBuffer.isView(val)) return this.mgr.platform.hexEncode(val as Uint8Array)\n if (typeof val === 'number' || typeof val === 'bigint') return val.toString(16)\n\n return String(val)\n }\n if (m === '%b') return String(Boolean(val))\n\n if (m === '%j' || m === '%J') {\n if (m === '%J') {\n val = [...(val as IterableIterator<unknown>)]\n }\n\n return JSON.stringify(val, (k, v) => {\n if (\n ArrayBuffer.isView(v) ||\n (typeof v === 'object' && v.type === 'Buffer' && Array.isArray(v.data)) // todo: how can we do this better?\n ) {\n // eslint-disable-next-line\n let str = v.data ? Buffer.from(v.data as number[]).toString('hex') : this.mgr.platform.hexEncode(v)\n\n if (str.length > 300) {\n str = str.slice(0, 300) + '...'\n }\n\n return str\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return v\n })\n }\n if (m === '%l') return String(val)\n\n if (m === '%L') {\n if (!Array.isArray(val)) return 'n/a'\n\n return `[${(val as unknown[]).map(String).join(', ')}]`\n }\n\n if (m === '%e') {\n if (isTlRpcError(val)) {\n return `${val.errorCode} ${val.errorMessage}`\n }\n\n if (tl.RpcError.is(val)) {\n return `${val.code} ${val.text}`\n }\n\n return val && typeof val === 'object' ? (val as Error).stack || (val as Error).message : String(val)\n }\n }\n\n idx++\n\n return m\n })\n }\n\n this.mgr.handler(this.color, level, this.tag, this.getPrefix() + fmt, args)\n }\n\n readonly error = this.log.bind(this, LogManager.ERROR)\n readonly warn = this.log.bind(this, LogManager.WARN)\n readonly info = this.log.bind(this, LogManager.INFO)\n readonly debug = this.log.bind(this, LogManager.DEBUG)\n readonly verbose = this.log.bind(this, LogManager.VERBOSE)\n\n /**\n * Create a {@link Logger} with the given tag\n * from the same {@link LogManager} as the current\n * Logger.\n *\n * @param tag Logger tag\n */\n create(tag: string): Logger {\n return new Logger(this.mgr, tag, this)\n }\n}\n\nconst defaultFilter = () => true\n\n/**\n * Log manager. A logger that allows managing child loggers\n */\nexport class LogManager extends Logger {\n static OFF = 0\n static ERROR = 1\n static WARN = 2\n static INFO = 3\n static DEBUG = 4\n static VERBOSE = 5\n\n readonly platform\n level: number\n handler\n\n constructor(tag = 'base') {\n // workaround because we cant pass this to super\n // eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-argument\n super(null as any, tag)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ;(this as any).mgr = this\n\n this.platform = getPlatform()\n this.level = this.platform.getDefaultLogLevel() ?? DEFAULT_LOG_LEVEL\n this.handler = this.platform.log.bind(this.platform)\n }\n\n private _filter: (tag: string) => boolean = defaultFilter\n\n /**\n * Create a {@link Logger} with the given tag\n *\n * @param tag Logger tag\n */\n create(tag: string): Logger {\n return new Logger(this, tag)\n }\n\n /**\n * Filter logging by tags.\n *\n * @param cb\n */\n filter(cb: ((tag: string) => boolean) | null): void {\n this._filter = cb ?? defaultFilter\n }\n}\n"]}
@@ -3,7 +3,7 @@ import { MtClient, MtClientOptions } from '../network/client.js';
3
3
  import { ConnectionKind, RpcCallOptions } from '../network/network-manager.js';
4
4
  import { StorageManagerExtraOptions } from '../storage/storage.js';
5
5
  import { MustEqual } from '../types/utils.js';
6
- import { StringSessionData } from '../utils/index.js';
6
+ import { ICryptoProvider, Logger, StringSessionData } from '../utils/index.js';
7
7
  import { ConnectionState, ITelegramClient, ServerUpdateHandler } from './client.types.js';
8
8
  import { AppConfigManager } from './managers/app-config-manager.js';
9
9
  import { ITelegramStorageProvider } from './storage/provider.js';
@@ -20,9 +20,9 @@ export declare class BaseTelegramClient implements ITelegramClient {
20
20
  readonly updates?: UpdatesManager;
21
21
  private _serverUpdatesHandler;
22
22
  private _connectionStateHandler;
23
- readonly log: import("../utils/logger.js").Logger;
23
+ readonly log: Logger;
24
24
  readonly mt: MtClient;
25
- readonly crypto: import("../utils/index.js").ICryptoProvider;
25
+ readonly crypto: ICryptoProvider;
26
26
  readonly storage: TelegramStorageManager;
27
27
  constructor(params: BaseTelegramClientOptions);
28
28
  readonly appConfig: AppConfigManager;
@@ -1 +1 @@
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"]}
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 ICryptoProvider,\n isTlRpcError,\n Logger,\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: Logger\n readonly mt: MtClient\n readonly crypto: ICryptoProvider\n readonly storage: TelegramStorageManager\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"]}
@@ -142,7 +142,7 @@ export async function* downloadAsIterable(client, input, params) {
142
142
  let error = undefined;
143
143
  void Promise.all(Array.from({ length: Math.min(poolSize * REQUESTS_PER_CONNECTION, numChunks) }, downloadChunk))
144
144
  .catch((e) => {
145
- client.log.debug('download workers errored: %s', e.message);
145
+ client.log.debug('download workers errored: %e', e);
146
146
  error = e;
147
147
  aborted = true; // not really aborted, but we dont want to download more chunks
148
148
  nextChunkCv.notify();
@@ -1 +1 @@
1
- {"version":3,"file":"download-iterable.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/files/download-iterable.ts"],"names":[],"mappings":"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","sourcesContent":["import { parseFileId } from '@mtcute/file-id'\nimport { tl } from '@mtcute/tl'\n\nimport { ConnectionKind } from '../../../network/network-manager.js'\nimport { getPlatform } from '../../../platform.js'\nimport { MtArgumentError, MtUnsupportedError } from '../../../types/errors.js'\nimport { ConditionVariable } from '../../../utils/condition-variable.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { FileDownloadLocation, FileDownloadParameters, FileLocation } from '../../types/index.js'\nimport { fileIdToInputFileLocation, fileIdToInputWebFileLocation } from '../../utils/convert-file-id.js'\nimport { determinePartSize } from '../../utils/file-utils.js'\n\n// small files (less than 128 kb) are downloaded using the \"downloadSmall\" pool\n// furthermore, if the file is small and is located on our main DC, it will be downloaded\n// using the current main connection\nconst SMALL_FILE_MAX_SIZE = 131072\nconst REQUESTS_PER_CONNECTION = 3 // some arbitrary magic value that seems to work best\n\n/**\n * Download a file and return it as an iterable, which yields file contents\n * in chunks of a given size. Order of the chunks is guaranteed to be\n * consecutive.\n *\n * @param params Download parameters\n */\nexport async function* downloadAsIterable(\n client: ITelegramClient,\n input: FileDownloadLocation,\n params?: FileDownloadParameters,\n): AsyncIterableIterator<Uint8Array> {\n const offset = params?.offset ?? 0\n\n if (offset % 4096 !== 0) {\n throw new MtArgumentError(`Invalid offset: ${offset}. Must be divisible by 4096`)\n }\n\n let dcId = params?.dcId\n let fileSize = params?.fileSize\n\n const abortSignal = params?.abortSignal\n let aborted = false\n\n let location: tl.TypeInputFileLocation | tl.TypeInputWebFileLocation\n if (input instanceof FileLocation) {\n let locationInner = input.location\n\n if (typeof locationInner === 'function') {\n locationInner = locationInner()\n }\n\n if (ArrayBuffer.isView(locationInner)) {\n yield locationInner\n\n return\n }\n if (!dcId) dcId = input.dcId\n if (!fileSize) fileSize = input.fileSize\n location = locationInner\n } else if (typeof input === 'string') {\n const parsed = parseFileId(getPlatform(), input)\n\n if (parsed.location._ === 'web') {\n location = fileIdToInputWebFileLocation(parsed)\n } else {\n location = fileIdToInputFileLocation(parsed)\n }\n } else location = input\n\n const isWeb = tl.isAnyInputWebFileLocation(location)\n\n // we will receive a FileMigrateError in case this is invalid\n const primaryDcId = await client.getPrimaryDcId()\n if (!dcId) dcId = primaryDcId\n\n const partSizeKb = params?.partSize ?? (fileSize ? determinePartSize(fileSize) : 64)\n\n if (partSizeKb % 4 !== 0) {\n throw new MtArgumentError(`Invalid part size: ${partSizeKb}. Must be divisible by 4.`)\n }\n\n const chunkSize = partSizeKb * 1024\n\n let limitBytes = params?.limit ?? fileSize ?? Infinity\n if (limitBytes === 0) return\n\n let numChunks = limitBytes === Infinity ? Infinity : ~~((limitBytes + chunkSize - offset - 1) / chunkSize)\n\n let nextChunkIdx = 0\n let nextWorkerChunkIdx = 0\n const nextChunkCv = new ConditionVariable()\n const buffer: Record<number, Uint8Array> = {}\n\n const isSmall = fileSize && fileSize <= SMALL_FILE_MAX_SIZE\n let connectionKind: ConnectionKind\n\n if (isSmall) {\n connectionKind = dcId === primaryDcId ? 'main' : 'downloadSmall'\n } else {\n connectionKind = 'download'\n }\n const poolSize = await client.getPoolSize(connectionKind, dcId)\n\n client.log.debug(\n 'Downloading file of size %d from dc %d using %s connection pool (pool size: %d)',\n limitBytes,\n dcId,\n connectionKind,\n poolSize,\n )\n\n const downloadChunk = async (chunk = nextWorkerChunkIdx++): Promise<void> => {\n let result: tl.RpcCallReturn['upload.getFile'] | tl.RpcCallReturn['upload.getWebFile']\n\n if (aborted) {\n return\n }\n\n try {\n result = await client.call(\n {\n _: isWeb ? 'upload.getWebFile' : 'upload.getFile',\n // eslint-disable-next-line\n location: location as any,\n offset: chunkSize * chunk,\n limit: chunkSize,\n },\n {\n dcId,\n kind: connectionKind,\n maxRetryCount: Infinity, // retry until explicitly aborted (or finished)\n abortSignal,\n },\n )\n } catch (e: unknown) {\n if (e instanceof DOMException && e.name === 'AbortError') return\n if (!tl.RpcError.is(e)) throw e\n\n if (e.is('FILE_MIGRATE_%d')) {\n dcId = e.newDc\n\n return downloadChunk(chunk)\n } else if (e.is('FILEREF_UPGRADE_NEEDED')) {\n // todo: implement someday\n // see: https://github.com/LonamiWebs/Telethon/blob/0e8bd8248cc649637b7c392616887c50986427a0/telethon/client/downloads.py#L99\n throw new MtUnsupportedError('File ref expired!')\n } else throw e\n }\n\n if (result._ === 'upload.fileCdnRedirect') {\n // we shouldnt receive them since cdnSupported is not set in the getFile request.\n // also, i couldnt find any media that would be downloaded from cdn, so even if\n // i implemented that, i wouldnt be able to test that, so :shrug:\n throw new MtUnsupportedError('Received CDN redirect, which is not supported (yet)')\n }\n\n if (aborted) {\n return\n }\n\n if (result._ === 'upload.webFile' && result.size && limitBytes === Infinity) {\n limitBytes = result.size\n numChunks = ~~((limitBytes + chunkSize - offset - 1) / chunkSize)\n }\n\n buffer[chunk] = result.bytes\n\n if (chunk === nextChunkIdx) {\n nextChunkCv.notify()\n }\n\n if (nextWorkerChunkIdx < numChunks && result.bytes.length === chunkSize) {\n return downloadChunk()\n }\n }\n\n let error: unknown = undefined\n void Promise.all(Array.from({ length: Math.min(poolSize * REQUESTS_PER_CONNECTION, numChunks) }, downloadChunk))\n .catch((e) => {\n client.log.debug('download workers errored: %s', e.message)\n error = e\n aborted = true // not really aborted, but we dont want to download more chunks\n nextChunkCv.notify()\n })\n .then(() => {\n client.log.debug('download workers finished')\n })\n\n // to avoid MaxListenersExceededWarning we do this instead\n // already sent requests can go to hell (they will get ignored)\n abortSignal?.addEventListener('abort', () => {\n client.log.debug('download aborted')\n error = abortSignal.reason\n aborted = true\n nextChunkCv.notify()\n })\n\n let position = offset\n\n while (position < limitBytes) {\n await nextChunkCv.wait()\n\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n if (error) throw error\n\n while (nextChunkIdx in buffer) {\n const buf = buffer[nextChunkIdx]\n delete buffer[nextChunkIdx]\n\n position += buf.length\n\n params?.progressCallback?.(position, limitBytes)\n\n yield buf\n\n nextChunkIdx++\n\n if (buf.length < chunkSize) {\n // we received the last chunk\n return\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"download-iterable.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/files/download-iterable.ts"],"names":[],"mappings":"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","sourcesContent":["import { parseFileId } from '@mtcute/file-id'\nimport { tl } from '@mtcute/tl'\n\nimport { ConnectionKind } from '../../../network/network-manager.js'\nimport { getPlatform } from '../../../platform.js'\nimport { MtArgumentError, MtUnsupportedError } from '../../../types/errors.js'\nimport { ConditionVariable } from '../../../utils/condition-variable.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { FileDownloadLocation, FileDownloadParameters, FileLocation } from '../../types/index.js'\nimport { fileIdToInputFileLocation, fileIdToInputWebFileLocation } from '../../utils/convert-file-id.js'\nimport { determinePartSize } from '../../utils/file-utils.js'\n\n// small files (less than 128 kb) are downloaded using the \"downloadSmall\" pool\n// furthermore, if the file is small and is located on our main DC, it will be downloaded\n// using the current main connection\nconst SMALL_FILE_MAX_SIZE = 131072\nconst REQUESTS_PER_CONNECTION = 3 // some arbitrary magic value that seems to work best\n\n/**\n * Download a file and return it as an iterable, which yields file contents\n * in chunks of a given size. Order of the chunks is guaranteed to be\n * consecutive.\n *\n * @param params Download parameters\n */\nexport async function* downloadAsIterable(\n client: ITelegramClient,\n input: FileDownloadLocation,\n params?: FileDownloadParameters,\n): AsyncIterableIterator<Uint8Array> {\n const offset = params?.offset ?? 0\n\n if (offset % 4096 !== 0) {\n throw new MtArgumentError(`Invalid offset: ${offset}. Must be divisible by 4096`)\n }\n\n let dcId = params?.dcId\n let fileSize = params?.fileSize\n\n const abortSignal = params?.abortSignal\n let aborted = false\n\n let location: tl.TypeInputFileLocation | tl.TypeInputWebFileLocation\n if (input instanceof FileLocation) {\n let locationInner = input.location\n\n if (typeof locationInner === 'function') {\n locationInner = locationInner()\n }\n\n if (ArrayBuffer.isView(locationInner)) {\n yield locationInner\n\n return\n }\n if (!dcId) dcId = input.dcId\n if (!fileSize) fileSize = input.fileSize\n location = locationInner\n } else if (typeof input === 'string') {\n const parsed = parseFileId(getPlatform(), input)\n\n if (parsed.location._ === 'web') {\n location = fileIdToInputWebFileLocation(parsed)\n } else {\n location = fileIdToInputFileLocation(parsed)\n }\n } else location = input\n\n const isWeb = tl.isAnyInputWebFileLocation(location)\n\n // we will receive a FileMigrateError in case this is invalid\n const primaryDcId = await client.getPrimaryDcId()\n if (!dcId) dcId = primaryDcId\n\n const partSizeKb = params?.partSize ?? (fileSize ? determinePartSize(fileSize) : 64)\n\n if (partSizeKb % 4 !== 0) {\n throw new MtArgumentError(`Invalid part size: ${partSizeKb}. Must be divisible by 4.`)\n }\n\n const chunkSize = partSizeKb * 1024\n\n let limitBytes = params?.limit ?? fileSize ?? Infinity\n if (limitBytes === 0) return\n\n let numChunks = limitBytes === Infinity ? Infinity : ~~((limitBytes + chunkSize - offset - 1) / chunkSize)\n\n let nextChunkIdx = 0\n let nextWorkerChunkIdx = 0\n const nextChunkCv = new ConditionVariable()\n const buffer: Record<number, Uint8Array> = {}\n\n const isSmall = fileSize && fileSize <= SMALL_FILE_MAX_SIZE\n let connectionKind: ConnectionKind\n\n if (isSmall) {\n connectionKind = dcId === primaryDcId ? 'main' : 'downloadSmall'\n } else {\n connectionKind = 'download'\n }\n const poolSize = await client.getPoolSize(connectionKind, dcId)\n\n client.log.debug(\n 'Downloading file of size %d from dc %d using %s connection pool (pool size: %d)',\n limitBytes,\n dcId,\n connectionKind,\n poolSize,\n )\n\n const downloadChunk = async (chunk = nextWorkerChunkIdx++): Promise<void> => {\n let result: tl.RpcCallReturn['upload.getFile'] | tl.RpcCallReturn['upload.getWebFile']\n\n if (aborted) {\n return\n }\n\n try {\n result = await client.call(\n {\n _: isWeb ? 'upload.getWebFile' : 'upload.getFile',\n // eslint-disable-next-line\n location: location as any,\n offset: chunkSize * chunk,\n limit: chunkSize,\n },\n {\n dcId,\n kind: connectionKind,\n maxRetryCount: Infinity, // retry until explicitly aborted (or finished)\n abortSignal,\n },\n )\n } catch (e: unknown) {\n if (e instanceof DOMException && e.name === 'AbortError') return\n if (!tl.RpcError.is(e)) throw e\n\n if (e.is('FILE_MIGRATE_%d')) {\n dcId = e.newDc\n\n return downloadChunk(chunk)\n } else if (e.is('FILEREF_UPGRADE_NEEDED')) {\n // todo: implement someday\n // see: https://github.com/LonamiWebs/Telethon/blob/0e8bd8248cc649637b7c392616887c50986427a0/telethon/client/downloads.py#L99\n throw new MtUnsupportedError('File ref expired!')\n } else throw e\n }\n\n if (result._ === 'upload.fileCdnRedirect') {\n // we shouldnt receive them since cdnSupported is not set in the getFile request.\n // also, i couldnt find any media that would be downloaded from cdn, so even if\n // i implemented that, i wouldnt be able to test that, so :shrug:\n throw new MtUnsupportedError('Received CDN redirect, which is not supported (yet)')\n }\n\n if (aborted) {\n return\n }\n\n if (result._ === 'upload.webFile' && result.size && limitBytes === Infinity) {\n limitBytes = result.size\n numChunks = ~~((limitBytes + chunkSize - offset - 1) / chunkSize)\n }\n\n buffer[chunk] = result.bytes\n\n if (chunk === nextChunkIdx) {\n nextChunkCv.notify()\n }\n\n if (nextWorkerChunkIdx < numChunks && result.bytes.length === chunkSize) {\n return downloadChunk()\n }\n }\n\n let error: unknown = undefined\n void Promise.all(Array.from({ length: Math.min(poolSize * REQUESTS_PER_CONNECTION, numChunks) }, downloadChunk))\n .catch((e) => {\n client.log.debug('download workers errored: %e', e)\n error = e\n aborted = true // not really aborted, but we dont want to download more chunks\n nextChunkCv.notify()\n })\n .then(() => {\n client.log.debug('download workers finished')\n })\n\n // to avoid MaxListenersExceededWarning we do this instead\n // already sent requests can go to hell (they will get ignored)\n abortSignal?.addEventListener('abort', () => {\n client.log.debug('download aborted')\n error = abortSignal.reason\n aborted = true\n nextChunkCv.notify()\n })\n\n let position = offset\n\n while (position < limitBytes) {\n await nextChunkCv.wait()\n\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n if (error) throw error\n\n while (nextChunkIdx in buffer) {\n const buf = buffer[nextChunkIdx]\n delete buffer[nextChunkIdx]\n\n position += buf.length\n\n params?.progressCallback?.(position, limitBytes)\n\n yield buf\n\n nextChunkIdx++\n\n if (buf.length < chunkSize) {\n // we received the last chunk\n return\n }\n }\n }\n}\n"]}
@@ -52,7 +52,7 @@ export async function resolvePeerMany(client, peerIds, normalizer) {
52
52
  };
53
53
  let error = undefined;
54
54
  void Promise.all(Array.from({ length: limit }, (_, i) => fetchNext(i))).catch((e) => {
55
- client.log.debug('resolvePeerMany errored: %s', e.message);
55
+ client.log.debug('resolvePeerMany errored: %e', e);
56
56
  error = e;
57
57
  cv.notify();
58
58
  });
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-peer-many.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/users/resolve-peer-many.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { ConditionVariable } from '../../../utils/condition-variable.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { MtPeerNotFoundError } from '../../types/errors.js'\nimport { InputPeerLike } from '../../types/peers/index.js'\nimport { resolvePeer } from './resolve-peer.js'\n\n/**\n * Get multiple `InputPeer`s at once,\n * while also normalizing and removing\n * peers that can't be normalized to that type.\n *\n * If a peer was not found, it will be skipped.\n *\n * Uses async pool internally, with a concurrent limit of 8\n *\n * @param peerIds Peer Ids\n * @param normalizer Normalization function\n */\nexport async function resolvePeerMany<T extends tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel>(\n client: ITelegramClient,\n peerIds: InputPeerLike[],\n normalizer: (obj: tl.TypeInputPeer) => T | null,\n): Promise<T[]>\n\n/**\n * Get multiple `InputPeer`s at once.\n *\n * If a peer was not found, `null` will be returned instead\n *\n * Uses async pool internally, with a concurrent limit of 8\n *\n * @param peerIds Peer Ids\n */\nexport async function resolvePeerMany(\n client: ITelegramClient,\n peerIds: InputPeerLike[],\n): Promise<(tl.TypeInputPeer | null)[]>\n\n/**\n * @internal\n */\nexport async function resolvePeerMany(\n client: ITelegramClient,\n peerIds: InputPeerLike[],\n normalizer?: (obj: tl.TypeInputPeer) => tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel | null,\n): Promise<(tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel | null)[]> {\n const ret: (tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel | null)[] = []\n\n const limit = 8\n\n if (peerIds.length < limit) {\n // no point in using async pool for <limit peers\n const res = await Promise.all(\n peerIds.map((it) =>\n resolvePeer(client, it).catch((e) => {\n if (e instanceof MtPeerNotFoundError) {\n return null\n }\n throw e\n }),\n ),\n )\n\n if (!normalizer) return res\n\n for (const value of res) {\n if (!value) continue\n const norm = normalizer(value)\n\n if (norm) {\n ret.push(norm)\n }\n }\n\n return ret\n }\n\n const cv = new ConditionVariable()\n const buffer: Record<number, tl.TypeInputPeer | null> = {}\n\n let nextIdx = 0\n let nextWorkerIdx = 0\n\n const fetchNext = async (idx = nextWorkerIdx++): Promise<void> => {\n try {\n const result = await resolvePeer(client, peerIds[idx])\n buffer[idx] = result\n } catch (e) {\n if (e instanceof MtPeerNotFoundError) {\n buffer[idx] = null\n } else throw e\n }\n\n if (nextIdx === idx) {\n cv.notify()\n }\n\n if (nextWorkerIdx < peerIds.length) {\n await fetchNext(nextWorkerIdx++)\n }\n }\n\n let error: unknown = undefined\n void Promise.all(Array.from({ length: limit }, (_, i) => fetchNext(i))).catch((e) => {\n client.log.debug('resolvePeerMany errored: %s', e.message)\n error = e\n cv.notify()\n })\n\n while (nextIdx < peerIds.length) {\n await cv.wait()\n\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n if (error) throw error\n\n while (nextIdx in buffer) {\n const buf = buffer[nextIdx]\n delete buffer[nextIdx]\n\n nextIdx++\n\n if (!normalizer) {\n ret.push(buf)\n continue\n }\n\n if (buf !== null) {\n const norm = normalizer(buf)\n\n if (norm) {\n ret.push(norm)\n }\n }\n }\n }\n\n return ret\n}\n"]}
1
+ {"version":3,"file":"resolve-peer-many.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/users/resolve-peer-many.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { ConditionVariable } from '../../../utils/condition-variable.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { MtPeerNotFoundError } from '../../types/errors.js'\nimport { InputPeerLike } from '../../types/peers/index.js'\nimport { resolvePeer } from './resolve-peer.js'\n\n/**\n * Get multiple `InputPeer`s at once,\n * while also normalizing and removing\n * peers that can't be normalized to that type.\n *\n * If a peer was not found, it will be skipped.\n *\n * Uses async pool internally, with a concurrent limit of 8\n *\n * @param peerIds Peer Ids\n * @param normalizer Normalization function\n */\nexport async function resolvePeerMany<T extends tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel>(\n client: ITelegramClient,\n peerIds: InputPeerLike[],\n normalizer: (obj: tl.TypeInputPeer) => T | null,\n): Promise<T[]>\n\n/**\n * Get multiple `InputPeer`s at once.\n *\n * If a peer was not found, `null` will be returned instead\n *\n * Uses async pool internally, with a concurrent limit of 8\n *\n * @param peerIds Peer Ids\n */\nexport async function resolvePeerMany(\n client: ITelegramClient,\n peerIds: InputPeerLike[],\n): Promise<(tl.TypeInputPeer | null)[]>\n\n/**\n * @internal\n */\nexport async function resolvePeerMany(\n client: ITelegramClient,\n peerIds: InputPeerLike[],\n normalizer?: (obj: tl.TypeInputPeer) => tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel | null,\n): Promise<(tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel | null)[]> {\n const ret: (tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel | null)[] = []\n\n const limit = 8\n\n if (peerIds.length < limit) {\n // no point in using async pool for <limit peers\n const res = await Promise.all(\n peerIds.map((it) =>\n resolvePeer(client, it).catch((e) => {\n if (e instanceof MtPeerNotFoundError) {\n return null\n }\n throw e\n }),\n ),\n )\n\n if (!normalizer) return res\n\n for (const value of res) {\n if (!value) continue\n const norm = normalizer(value)\n\n if (norm) {\n ret.push(norm)\n }\n }\n\n return ret\n }\n\n const cv = new ConditionVariable()\n const buffer: Record<number, tl.TypeInputPeer | null> = {}\n\n let nextIdx = 0\n let nextWorkerIdx = 0\n\n const fetchNext = async (idx = nextWorkerIdx++): Promise<void> => {\n try {\n const result = await resolvePeer(client, peerIds[idx])\n buffer[idx] = result\n } catch (e) {\n if (e instanceof MtPeerNotFoundError) {\n buffer[idx] = null\n } else throw e\n }\n\n if (nextIdx === idx) {\n cv.notify()\n }\n\n if (nextWorkerIdx < peerIds.length) {\n await fetchNext(nextWorkerIdx++)\n }\n }\n\n let error: unknown = undefined\n void Promise.all(Array.from({ length: limit }, (_, i) => fetchNext(i))).catch((e) => {\n client.log.debug('resolvePeerMany errored: %e', e)\n error = e\n cv.notify()\n })\n\n while (nextIdx < peerIds.length) {\n await cv.wait()\n\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n if (error) throw error\n\n while (nextIdx in buffer) {\n const buf = buffer[nextIdx]\n delete buffer[nextIdx]\n\n nextIdx++\n\n if (!normalizer) {\n ret.push(buf)\n continue\n }\n\n if (buf !== null) {\n const norm = normalizer(buf)\n\n if (norm) {\n ret.push(norm)\n }\n }\n }\n }\n\n return ret\n}\n"]}
@@ -58,9 +58,11 @@ export declare class Dialog {
58
58
  */
59
59
  get isUnread(): boolean;
60
60
  /**
61
- * Whether this dialog is muted
61
+ * Whether this dialog is muted.
62
+ *
63
+ * If `null`, the default account-level setting should be used.
62
64
  */
63
- get isMuted(): boolean;
65
+ get isMuted(): boolean | null;
64
66
  /**
65
67
  * Whether this dialog is archived
66
68
  */
@@ -150,10 +150,12 @@ class Dialog {
150
150
  return this.raw.unreadMark || this.raw.unreadCount > 1;
151
151
  }
152
152
  /**
153
- * Whether this dialog is muted
153
+ * Whether this dialog is muted.
154
+ *
155
+ * If `null`, the default account-level setting should be used.
154
156
  */
155
157
  get isMuted() {
156
- return this.raw.notifySettings.silent;
158
+ return this.raw.notifySettings.silent ?? null;
157
159
  }
158
160
  /**
159
161
  * Whether this dialog is archived