@mtcute/core 0.15.3 → 0.16.1

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 (215) hide show
  1. package/cjs/highlevel/base.d.ts +3 -3
  2. package/cjs/highlevel/base.js.map +1 -1
  3. package/cjs/highlevel/client.d.ts +29 -2
  4. package/cjs/highlevel/client.js.map +1 -1
  5. package/cjs/highlevel/methods/chats/delete-user-history.d.ts +5 -0
  6. package/cjs/highlevel/methods/chats/delete-user-history.js +4 -2
  7. package/cjs/highlevel/methods/chats/delete-user-history.js.map +1 -1
  8. package/cjs/highlevel/methods/files/download-iterable.js +1 -1
  9. package/cjs/highlevel/methods/files/download-iterable.js.map +1 -1
  10. package/cjs/highlevel/methods/forums/delete-forum-topic-history.d.ts +7 -1
  11. package/cjs/highlevel/methods/forums/delete-forum-topic-history.js +5 -2
  12. package/cjs/highlevel/methods/forums/delete-forum-topic-history.js.map +1 -1
  13. package/cjs/highlevel/methods/messages/delete-messages.d.ts +5 -0
  14. package/cjs/highlevel/methods/messages/delete-messages.js +4 -2
  15. package/cjs/highlevel/methods/messages/delete-messages.js.map +1 -1
  16. package/cjs/highlevel/methods/messages/read-history.d.ts +5 -0
  17. package/cjs/highlevel/methods/messages/read-history.js +11 -7
  18. package/cjs/highlevel/methods/messages/read-history.js.map +1 -1
  19. package/cjs/highlevel/methods/messages/read-reactions.d.ts +7 -1
  20. package/cjs/highlevel/methods/messages/read-reactions.js +5 -2
  21. package/cjs/highlevel/methods/messages/read-reactions.js.map +1 -1
  22. package/cjs/highlevel/methods/messages/send-common.d.ts +2 -2
  23. package/cjs/highlevel/methods/messages/send-common.js.map +1 -1
  24. package/cjs/highlevel/methods/messages/send-text.js +3 -3
  25. package/cjs/highlevel/methods/messages/send-text.js.map +1 -1
  26. package/cjs/highlevel/methods/messages/unpin-all-messages.d.ts +5 -0
  27. package/cjs/highlevel/methods/messages/unpin-all-messages.js +8 -6
  28. package/cjs/highlevel/methods/messages/unpin-all-messages.js.map +1 -1
  29. package/cjs/highlevel/methods/users/resolve-peer-many.js +1 -1
  30. package/cjs/highlevel/methods/users/resolve-peer-many.js.map +1 -1
  31. package/cjs/highlevel/types/messages/dialog.d.ts +4 -2
  32. package/cjs/highlevel/types/messages/dialog.js +4 -2
  33. package/cjs/highlevel/types/messages/dialog.js.map +1 -1
  34. package/cjs/highlevel/types/messages/message-action.d.ts +15 -1
  35. package/cjs/highlevel/types/messages/message-action.js +10 -0
  36. package/cjs/highlevel/types/messages/message-action.js.map +1 -1
  37. package/cjs/highlevel/types/peers/full-chat.d.ts +2 -0
  38. package/cjs/highlevel/types/peers/full-chat.js +4 -0
  39. package/cjs/highlevel/types/peers/full-chat.js.map +1 -1
  40. package/cjs/highlevel/updates/manager.js +3 -3
  41. package/cjs/highlevel/updates/manager.js.map +1 -1
  42. package/cjs/highlevel/updates/types.d.ts +2 -0
  43. package/cjs/highlevel/updates/types.js.map +1 -1
  44. package/cjs/highlevel/worker/invoker.js +3 -2
  45. package/cjs/highlevel/worker/invoker.js.map +1 -1
  46. package/cjs/highlevel/worker/port.js +4 -3
  47. package/cjs/highlevel/worker/port.js.map +1 -1
  48. package/cjs/highlevel/worker/protocol.d.ts +11 -6
  49. package/cjs/highlevel/worker/protocol.js +69 -0
  50. package/cjs/highlevel/worker/protocol.js.map +1 -1
  51. package/cjs/highlevel/worker/worker.js +12 -8
  52. package/cjs/highlevel/worker/worker.js.map +1 -1
  53. package/cjs/network/client.d.ts +0 -16
  54. package/cjs/network/client.js +0 -2
  55. package/cjs/network/client.js.map +1 -1
  56. package/cjs/network/index.d.ts +2 -1
  57. package/cjs/network/index.js +1 -0
  58. package/cjs/network/index.js.map +1 -1
  59. package/cjs/network/middlewares/bundle.d.ts +3 -0
  60. package/cjs/network/middlewares/bundle.js +20 -0
  61. package/cjs/network/middlewares/bundle.js.map +1 -0
  62. package/cjs/network/middlewares/default.d.ts +8 -0
  63. package/cjs/network/middlewares/default.js +10 -0
  64. package/cjs/network/middlewares/default.js.map +1 -0
  65. package/cjs/network/middlewares/flood-waiter.d.ts +37 -0
  66. package/cjs/network/middlewares/flood-waiter.js +70 -0
  67. package/cjs/network/middlewares/flood-waiter.js.map +1 -0
  68. package/cjs/network/middlewares/index.d.ts +2 -0
  69. package/cjs/network/middlewares/index.js +29 -0
  70. package/cjs/network/middlewares/index.js.map +1 -0
  71. package/cjs/network/middlewares/internal-errors.d.ts +17 -0
  72. package/cjs/network/middlewares/internal-errors.js +41 -0
  73. package/cjs/network/middlewares/internal-errors.js.map +1 -0
  74. package/cjs/network/middlewares/on-error.d.ts +30 -0
  75. package/cjs/network/middlewares/on-error.js +44 -0
  76. package/cjs/network/middlewares/on-error.js.map +1 -0
  77. package/cjs/network/middlewares/on-method.d.ts +39 -0
  78. package/cjs/network/middlewares/on-method.js +45 -0
  79. package/cjs/network/middlewares/on-method.js.map +1 -0
  80. package/cjs/network/mtproto-session.js +1 -1
  81. package/cjs/network/mtproto-session.js.map +1 -1
  82. package/cjs/network/multi-session-connection.js +1 -1
  83. package/cjs/network/multi-session-connection.js.map +1 -1
  84. package/cjs/network/network-manager.d.ts +23 -6
  85. package/cjs/network/network-manager.js +55 -103
  86. package/cjs/network/network-manager.js.map +1 -1
  87. package/cjs/network/persistent-connection.js +5 -5
  88. package/cjs/network/persistent-connection.js.map +1 -1
  89. package/cjs/network/session-connection.js +6 -6
  90. package/cjs/network/session-connection.js.map +1 -1
  91. package/cjs/storage/driver.js +1 -1
  92. package/cjs/storage/driver.js.map +1 -1
  93. package/cjs/storage/storage.js +1 -1
  94. package/cjs/storage/storage.js.map +1 -1
  95. package/cjs/utils/abort-signal.d.ts +1 -0
  96. package/cjs/utils/abort-signal.js +13 -0
  97. package/cjs/utils/abort-signal.js.map +1 -0
  98. package/cjs/utils/composer.d.ts +3 -0
  99. package/cjs/utils/composer.js +22 -0
  100. package/cjs/utils/composer.js.map +1 -0
  101. package/cjs/utils/error-reporting.js +1 -1
  102. package/cjs/utils/error-reporting.js.map +1 -1
  103. package/cjs/utils/index.d.ts +1 -0
  104. package/cjs/utils/index.js +1 -0
  105. package/cjs/utils/index.js.map +1 -1
  106. package/cjs/utils/logger.js +15 -3
  107. package/cjs/utils/logger.js.map +1 -1
  108. package/esm/highlevel/base.d.ts +3 -3
  109. package/esm/highlevel/base.js.map +1 -1
  110. package/esm/highlevel/client.d.ts +29 -2
  111. package/esm/highlevel/client.js.map +1 -1
  112. package/esm/highlevel/methods/chats/delete-user-history.d.ts +5 -0
  113. package/esm/highlevel/methods/chats/delete-user-history.js +4 -2
  114. package/esm/highlevel/methods/chats/delete-user-history.js.map +1 -1
  115. package/esm/highlevel/methods/files/download-iterable.js +1 -1
  116. package/esm/highlevel/methods/files/download-iterable.js.map +1 -1
  117. package/esm/highlevel/methods/forums/delete-forum-topic-history.d.ts +7 -1
  118. package/esm/highlevel/methods/forums/delete-forum-topic-history.js +5 -2
  119. package/esm/highlevel/methods/forums/delete-forum-topic-history.js.map +1 -1
  120. package/esm/highlevel/methods/messages/delete-messages.d.ts +5 -0
  121. package/esm/highlevel/methods/messages/delete-messages.js +4 -2
  122. package/esm/highlevel/methods/messages/delete-messages.js.map +1 -1
  123. package/esm/highlevel/methods/messages/read-history.d.ts +5 -0
  124. package/esm/highlevel/methods/messages/read-history.js +11 -7
  125. package/esm/highlevel/methods/messages/read-history.js.map +1 -1
  126. package/esm/highlevel/methods/messages/read-reactions.d.ts +7 -1
  127. package/esm/highlevel/methods/messages/read-reactions.js +5 -2
  128. package/esm/highlevel/methods/messages/read-reactions.js.map +1 -1
  129. package/esm/highlevel/methods/messages/send-common.d.ts +2 -2
  130. package/esm/highlevel/methods/messages/send-common.js.map +1 -1
  131. package/esm/highlevel/methods/messages/send-text.js +3 -3
  132. package/esm/highlevel/methods/messages/send-text.js.map +1 -1
  133. package/esm/highlevel/methods/messages/unpin-all-messages.d.ts +5 -0
  134. package/esm/highlevel/methods/messages/unpin-all-messages.js +8 -6
  135. package/esm/highlevel/methods/messages/unpin-all-messages.js.map +1 -1
  136. package/esm/highlevel/methods/users/resolve-peer-many.js +1 -1
  137. package/esm/highlevel/methods/users/resolve-peer-many.js.map +1 -1
  138. package/esm/highlevel/types/messages/dialog.d.ts +4 -2
  139. package/esm/highlevel/types/messages/dialog.js +4 -2
  140. package/esm/highlevel/types/messages/dialog.js.map +1 -1
  141. package/esm/highlevel/types/messages/message-action.d.ts +15 -1
  142. package/esm/highlevel/types/messages/message-action.js +10 -0
  143. package/esm/highlevel/types/messages/message-action.js.map +1 -1
  144. package/esm/highlevel/types/peers/full-chat.d.ts +2 -0
  145. package/esm/highlevel/types/peers/full-chat.js +4 -0
  146. package/esm/highlevel/types/peers/full-chat.js.map +1 -1
  147. package/esm/highlevel/updates/manager.js +3 -3
  148. package/esm/highlevel/updates/manager.js.map +1 -1
  149. package/esm/highlevel/updates/types.d.ts +2 -0
  150. package/esm/highlevel/updates/types.js.map +1 -1
  151. package/esm/highlevel/worker/invoker.js +3 -2
  152. package/esm/highlevel/worker/invoker.js.map +1 -1
  153. package/esm/highlevel/worker/port.js +4 -3
  154. package/esm/highlevel/worker/port.js.map +1 -1
  155. package/esm/highlevel/worker/protocol.d.ts +11 -6
  156. package/esm/highlevel/worker/protocol.js +63 -1
  157. package/esm/highlevel/worker/protocol.js.map +1 -1
  158. package/esm/highlevel/worker/worker.js +12 -8
  159. package/esm/highlevel/worker/worker.js.map +1 -1
  160. package/esm/network/client.d.ts +0 -16
  161. package/esm/network/client.js +0 -2
  162. package/esm/network/client.js.map +1 -1
  163. package/esm/network/index.d.ts +2 -1
  164. package/esm/network/index.js +1 -0
  165. package/esm/network/index.js.map +1 -1
  166. package/esm/network/middlewares/bundle.d.ts +3 -0
  167. package/esm/network/middlewares/bundle.js +4 -0
  168. package/esm/network/middlewares/bundle.js.map +1 -0
  169. package/esm/network/middlewares/default.d.ts +8 -0
  170. package/esm/network/middlewares/default.js +6 -0
  171. package/esm/network/middlewares/default.js.map +1 -0
  172. package/esm/network/middlewares/flood-waiter.d.ts +37 -0
  173. package/esm/network/middlewares/flood-waiter.js +66 -0
  174. package/esm/network/middlewares/flood-waiter.js.map +1 -0
  175. package/esm/network/middlewares/index.d.ts +2 -0
  176. package/esm/network/middlewares/index.js +3 -0
  177. package/esm/network/middlewares/index.js.map +1 -0
  178. package/esm/network/middlewares/internal-errors.d.ts +17 -0
  179. package/esm/network/middlewares/internal-errors.js +37 -0
  180. package/esm/network/middlewares/internal-errors.js.map +1 -0
  181. package/esm/network/middlewares/on-error.d.ts +30 -0
  182. package/esm/network/middlewares/on-error.js +40 -0
  183. package/esm/network/middlewares/on-error.js.map +1 -0
  184. package/esm/network/middlewares/on-method.d.ts +39 -0
  185. package/esm/network/middlewares/on-method.js +41 -0
  186. package/esm/network/middlewares/on-method.js.map +1 -0
  187. package/esm/network/mtproto-session.js +1 -1
  188. package/esm/network/mtproto-session.js.map +1 -1
  189. package/esm/network/multi-session-connection.js +1 -1
  190. package/esm/network/multi-session-connection.js.map +1 -1
  191. package/esm/network/network-manager.d.ts +23 -6
  192. package/esm/network/network-manager.js +57 -105
  193. package/esm/network/network-manager.js.map +1 -1
  194. package/esm/network/persistent-connection.js +5 -5
  195. package/esm/network/persistent-connection.js.map +1 -1
  196. package/esm/network/session-connection.js +6 -6
  197. package/esm/network/session-connection.js.map +1 -1
  198. package/esm/storage/driver.js +1 -1
  199. package/esm/storage/driver.js.map +1 -1
  200. package/esm/storage/storage.js +1 -1
  201. package/esm/storage/storage.js.map +1 -1
  202. package/esm/utils/abort-signal.d.ts +1 -0
  203. package/esm/utils/abort-signal.js +9 -0
  204. package/esm/utils/abort-signal.js.map +1 -0
  205. package/esm/utils/composer.d.ts +3 -0
  206. package/esm/utils/composer.js +18 -0
  207. package/esm/utils/composer.js.map +1 -0
  208. package/esm/utils/error-reporting.js +1 -1
  209. package/esm/utils/error-reporting.js.map +1 -1
  210. package/esm/utils/index.d.ts +1 -0
  211. package/esm/utils/index.js +1 -0
  212. package/esm/utils/index.js.map +1 -1
  213. package/esm/utils/logger.js +15 -3
  214. package/esm/utils/logger.js.map +1 -1
  215. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"multi-session-connection.js","sourceRoot":"","sources":["../../../src/network/multi-session-connection.ts"],"names":[],"mappings":"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","sourcesContent":["import EventEmitter from 'events'\n\nimport { mtp, tl } from '@mtcute/tl'\n\nimport { createControllablePromise, Logger } from '../utils/index.js'\nimport { MtprotoSession } from './mtproto-session.js'\nimport { SessionConnection, SessionConnectionParams } from './session-connection.js'\nimport { TransportFactory } from './transports/index.js'\n\nexport class MultiSessionConnection extends EventEmitter {\n private _log: Logger\n readonly _sessions: MtprotoSession[]\n private _enforcePfs = false\n\n constructor(\n readonly params: SessionConnectionParams,\n private _count: number,\n log: Logger,\n logPrefix = '',\n ) {\n super()\n this._log = log.create('multi')\n if (logPrefix) this._log.prefix = `[${logPrefix}] `\n this._enforcePfs = _count > 1 && params.isMainConnection\n\n this._sessions = []\n this._updateConnections()\n }\n\n protected _connections: SessionConnection[] = []\n\n setCount(count: number, connect = this.params.isMainConnection): void {\n this._count = count\n\n this._updateConnections(connect)\n }\n\n private _updateSessions(): void {\n // there are two cases\n // 1. this msc is main, in which case every connection should have its own session\n // 2. this msc is not main, in which case all connections should share the same session\n // if (!this.params.isMainConnection) {\n // // case 2\n // this._log.debug(\n // 'updating sessions count: %d -> 1',\n // this._sessions.length,\n // )\n //\n // if (this._sessions.length === 0) {\n // this._sessions.push(\n // new MtprotoSession(\n // this.params.crypto,\n // this._log.create('session'),\n // this.params.readerMap,\n // this.params.writerMap,\n // ),\n // )\n // }\n //\n // // shouldn't happen, but just in case\n // while (this._sessions.length > 1) {\n // this._sessions.pop()!.reset()\n // }\n //\n // return\n // }\n\n this._log.debug('updating sessions count: %d -> %d', this._sessions.length, this._count)\n\n // case 1\n if (this._sessions.length === this._count) return\n\n if (this._sessions.length > this._count) {\n // destroy extra sessions\n for (let i = this._sessions.length - 1; i >= this._count; i--) {\n this._sessions[i].reset()\n }\n\n this._sessions.splice(this._count)\n\n return\n }\n\n while (this._sessions.length < this._count) {\n const idx = this._sessions.length\n const session = new MtprotoSession(\n this.params.crypto,\n this._log.create('session'),\n this.params.readerMap,\n this.params.writerMap,\n this.params.salts,\n )\n\n // brvh\n if (idx !== 0) session._authKey = this._sessions[0]._authKey\n\n this._sessions.push(session)\n }\n }\n\n private _updateConnections(connect = false): void {\n this._updateSessions()\n if (this._connections.length === this._count) return\n\n this._log.debug('updating connections count: %d -> %d', this._connections.length, this._count)\n\n const newEnforcePfs = this._count > 1 && this.params.isMainConnection\n const enforcePfsChanged = newEnforcePfs !== this._enforcePfs\n\n if (enforcePfsChanged) {\n this._log.debug('enforcePfs changed: %s -> %s', this._enforcePfs, newEnforcePfs)\n this._enforcePfs = newEnforcePfs\n }\n\n if (this._connections.length > this._count) {\n // destroy extra connections\n for (let i = this._connections.length - 1; i >= this._count; i--) {\n this._connections[i].removeAllListeners()\n this._connections[i].destroy().catch((err) => {\n this._log.warn('error destroying connection: %s', err)\n })\n }\n\n this._connections.splice(this._count)\n\n return\n }\n\n if (enforcePfsChanged) {\n // we need to fetch new auth keys first\n const promise = createControllablePromise<void>()\n this.emit('request-keys', promise)\n\n promise\n .then(() => {\n this._connections.forEach((conn) => {\n conn.setUsePfs(this.params.usePfs || this._enforcePfs)\n\n if (connect) conn.connect()\n })\n })\n .catch((err) => {\n this.emit('error', err)\n })\n }\n\n // create new connections\n for (let i = this._connections.length; i < this._count; i++) {\n const session = this._sessions[i] // this.params.isMainConnection ? // :\n // this._sessions[0]\n const conn = new SessionConnection(\n {\n ...this.params,\n usePfs: this.params.usePfs || this._enforcePfs,\n isMainConnection: this.params.isMainConnection && i === 0,\n withUpdates:\n this.params.isMainConnection && this.params.isMainDcConnection && !this.params.disableUpdates,\n },\n session,\n )\n\n if (this.params.isMainConnection && this.params.isMainDcConnection) {\n conn.on('update', (update) => this.emit('update', update))\n }\n conn.on('error', (err) => this.emit('error', err, conn))\n conn.on('key-change', (key) => {\n this.emit('key-change', i, key)\n\n // notify other connections\n for (const conn_ of this._connections) {\n if (conn_ === conn) continue\n conn_.onConnected()\n }\n })\n conn.on('tmp-key-change', (key, expires) => this.emit('tmp-key-change', i, key, expires))\n conn.on('future-salts', (salts) => this.emit('future-salts', salts))\n conn.on('auth-begin', () => {\n this._log.debug('received auth-begin from connection %d', i)\n this.emit('auth-begin', i)\n\n // we need to reset temp auth keys if there are any left\n\n this._connections.forEach((conn_) => {\n conn_._session._authKeyTemp.reset()\n if (conn_ !== conn) conn_.reconnect()\n })\n })\n conn.on('usable', () => this.emit('usable', i))\n conn.on('wait', () => this.emit('wait', i))\n conn.on('request-auth', () => this.emit('request-auth', i))\n conn.on('flood-done', () => {\n this._log.debug('received flood-done from connection %d', i)\n\n this._connections.forEach((it) => it.flushWhenIdle())\n })\n\n this._connections.push(conn)\n // if enforcePfsChanged, we need to connect after setting the new auth key\n if (connect && !enforcePfsChanged) conn.connect()\n }\n }\n\n _destroyed = false\n async destroy(): Promise<void> {\n await Promise.all(this._connections.map((conn) => conn.destroy()))\n this._sessions.forEach((sess) => sess.reset())\n this.removeAllListeners()\n\n this._destroyed = true\n }\n\n private _nextConnection = 0\n\n sendRpc<T extends tl.RpcMethod>(\n request: T,\n timeout?: number,\n abortSignal?: AbortSignal,\n chainId?: string | number,\n ): Promise<tl.RpcCallReturn[T['_']] | mtp.RawMt_rpc_error> {\n // if (this.params.isMainConnection) {\n // find the least loaded connection\n let min = Infinity\n let minIdx = 0\n\n for (let i = 0; i < this._connections.length; i++) {\n const conn = this._connections[i]\n const total = conn._session.queuedRpc.length + conn._session.pendingMessages.size()\n\n if (total < min) {\n min = total\n minIdx = i\n }\n }\n\n return this._connections[minIdx].sendRpc(request, timeout, abortSignal, chainId)\n // }\n\n // round-robin connections\n // since they all share the same session, it doesn't matter which one we use\n // the connection chosen here will only affect the first attempt at sending\n // return this._connections[\n // this._nextConnection++ % this._connections.length\n // ].sendRpc(request, stack, timeout)\n }\n\n connect(): void {\n for (const conn of this._connections) {\n conn.connect()\n }\n }\n\n ensureConnected(): void {\n if (this._connections[0].isConnected) return\n\n this.connect()\n }\n\n setAuthKey(authKey: Uint8Array | null, temp = false, idx = 0): void {\n const session = this._sessions[idx]\n const key = temp ? session._authKeyTemp : session._authKey\n key.setup(authKey)\n }\n\n resetAuthKeys(): void {\n for (const session of this._sessions) {\n session.reset(true)\n }\n this.notifyKeyChange()\n }\n\n setInactivityTimeout(timeout?: number): void {\n this._log.debug('setting inactivity timeout to %s', timeout)\n\n // for future connections (if any)\n this.params.inactivityTimeout = timeout\n\n // for current connections\n for (const conn of this._connections) {\n conn.setInactivityTimeout(timeout)\n }\n }\n\n notifyKeyChange(): void {\n // only expected to be called on non-main connections\n const session = this._sessions[0]\n\n if (this.params.usePfs && !session._authKeyTemp.ready) {\n this._log.debug('temp auth key needed but not ready, ignoring key change')\n\n return\n }\n\n if (this._sessions[0].queuedRpc.length) {\n // there are pending requests, we need to reconnect.\n this._log.debug('notifying key change on the connection due to queued rpc')\n this._connections[0].onConnected()\n }\n\n // connection is idle, we don't need to notify it\n }\n\n notifyNetworkChanged(connected: boolean): void {\n for (const conn of this._connections) {\n conn.notifyNetworkChanged(connected)\n }\n }\n\n requestAuth(): void {\n this._connections[0]._authorize()\n }\n\n resetSessions(): void {\n if (this.params.isMainConnection) {\n for (const conn of this._connections) {\n conn._resetSession()\n }\n } else {\n this._connections[0]._resetSession()\n }\n }\n\n changeTransport(factory: TransportFactory): void {\n this._connections.forEach((conn) => conn.changeTransport(factory))\n }\n\n getPoolSize(): number {\n return this._connections.length\n }\n}\n"]}
1
+ {"version":3,"file":"multi-session-connection.js","sourceRoot":"","sources":["../../../src/network/multi-session-connection.ts"],"names":[],"mappings":"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","sourcesContent":["import EventEmitter from 'events'\n\nimport { mtp, tl } from '@mtcute/tl'\n\nimport { createControllablePromise, Logger } from '../utils/index.js'\nimport { MtprotoSession } from './mtproto-session.js'\nimport { SessionConnection, SessionConnectionParams } from './session-connection.js'\nimport { TransportFactory } from './transports/index.js'\n\nexport class MultiSessionConnection extends EventEmitter {\n private _log: Logger\n readonly _sessions: MtprotoSession[]\n private _enforcePfs = false\n\n constructor(\n readonly params: SessionConnectionParams,\n private _count: number,\n log: Logger,\n logPrefix = '',\n ) {\n super()\n this._log = log.create('multi')\n if (logPrefix) this._log.prefix = `[${logPrefix}] `\n this._enforcePfs = _count > 1 && params.isMainConnection\n\n this._sessions = []\n this._updateConnections()\n }\n\n protected _connections: SessionConnection[] = []\n\n setCount(count: number, connect = this.params.isMainConnection): void {\n this._count = count\n\n this._updateConnections(connect)\n }\n\n private _updateSessions(): void {\n // there are two cases\n // 1. this msc is main, in which case every connection should have its own session\n // 2. this msc is not main, in which case all connections should share the same session\n // if (!this.params.isMainConnection) {\n // // case 2\n // this._log.debug(\n // 'updating sessions count: %d -> 1',\n // this._sessions.length,\n // )\n //\n // if (this._sessions.length === 0) {\n // this._sessions.push(\n // new MtprotoSession(\n // this.params.crypto,\n // this._log.create('session'),\n // this.params.readerMap,\n // this.params.writerMap,\n // ),\n // )\n // }\n //\n // // shouldn't happen, but just in case\n // while (this._sessions.length > 1) {\n // this._sessions.pop()!.reset()\n // }\n //\n // return\n // }\n\n this._log.debug('updating sessions count: %d -> %d', this._sessions.length, this._count)\n\n // case 1\n if (this._sessions.length === this._count) return\n\n if (this._sessions.length > this._count) {\n // destroy extra sessions\n for (let i = this._sessions.length - 1; i >= this._count; i--) {\n this._sessions[i].reset()\n }\n\n this._sessions.splice(this._count)\n\n return\n }\n\n while (this._sessions.length < this._count) {\n const idx = this._sessions.length\n const session = new MtprotoSession(\n this.params.crypto,\n this._log.create('session'),\n this.params.readerMap,\n this.params.writerMap,\n this.params.salts,\n )\n\n // brvh\n if (idx !== 0) session._authKey = this._sessions[0]._authKey\n\n this._sessions.push(session)\n }\n }\n\n private _updateConnections(connect = false): void {\n this._updateSessions()\n if (this._connections.length === this._count) return\n\n this._log.debug('updating connections count: %d -> %d', this._connections.length, this._count)\n\n const newEnforcePfs = this._count > 1 && this.params.isMainConnection\n const enforcePfsChanged = newEnforcePfs !== this._enforcePfs\n\n if (enforcePfsChanged) {\n this._log.debug('enforcePfs changed: %s -> %s', this._enforcePfs, newEnforcePfs)\n this._enforcePfs = newEnforcePfs\n }\n\n if (this._connections.length > this._count) {\n // destroy extra connections\n for (let i = this._connections.length - 1; i >= this._count; i--) {\n this._connections[i].removeAllListeners()\n this._connections[i].destroy().catch((err) => {\n this._log.warn('error destroying connection: %e', err)\n })\n }\n\n this._connections.splice(this._count)\n\n return\n }\n\n if (enforcePfsChanged) {\n // we need to fetch new auth keys first\n const promise = createControllablePromise<void>()\n this.emit('request-keys', promise)\n\n promise\n .then(() => {\n this._connections.forEach((conn) => {\n conn.setUsePfs(this.params.usePfs || this._enforcePfs)\n\n if (connect) conn.connect()\n })\n })\n .catch((err) => {\n this.emit('error', err)\n })\n }\n\n // create new connections\n for (let i = this._connections.length; i < this._count; i++) {\n const session = this._sessions[i] // this.params.isMainConnection ? // :\n // this._sessions[0]\n const conn = new SessionConnection(\n {\n ...this.params,\n usePfs: this.params.usePfs || this._enforcePfs,\n isMainConnection: this.params.isMainConnection && i === 0,\n withUpdates:\n this.params.isMainConnection && this.params.isMainDcConnection && !this.params.disableUpdates,\n },\n session,\n )\n\n if (this.params.isMainConnection && this.params.isMainDcConnection) {\n conn.on('update', (update) => this.emit('update', update))\n }\n conn.on('error', (err) => this.emit('error', err, conn))\n conn.on('key-change', (key) => {\n this.emit('key-change', i, key)\n\n // notify other connections\n for (const conn_ of this._connections) {\n if (conn_ === conn) continue\n conn_.onConnected()\n }\n })\n conn.on('tmp-key-change', (key, expires) => this.emit('tmp-key-change', i, key, expires))\n conn.on('future-salts', (salts) => this.emit('future-salts', salts))\n conn.on('auth-begin', () => {\n this._log.debug('received auth-begin from connection %d', i)\n this.emit('auth-begin', i)\n\n // we need to reset temp auth keys if there are any left\n\n this._connections.forEach((conn_) => {\n conn_._session._authKeyTemp.reset()\n if (conn_ !== conn) conn_.reconnect()\n })\n })\n conn.on('usable', () => this.emit('usable', i))\n conn.on('wait', () => this.emit('wait', i))\n conn.on('request-auth', () => this.emit('request-auth', i))\n conn.on('flood-done', () => {\n this._log.debug('received flood-done from connection %d', i)\n\n this._connections.forEach((it) => it.flushWhenIdle())\n })\n\n this._connections.push(conn)\n // if enforcePfsChanged, we need to connect after setting the new auth key\n if (connect && !enforcePfsChanged) conn.connect()\n }\n }\n\n _destroyed = false\n async destroy(): Promise<void> {\n await Promise.all(this._connections.map((conn) => conn.destroy()))\n this._sessions.forEach((sess) => sess.reset())\n this.removeAllListeners()\n\n this._destroyed = true\n }\n\n private _nextConnection = 0\n\n sendRpc<T extends tl.RpcMethod>(\n request: T,\n timeout?: number,\n abortSignal?: AbortSignal,\n chainId?: string | number,\n ): Promise<tl.RpcCallReturn[T['_']] | mtp.RawMt_rpc_error> {\n // if (this.params.isMainConnection) {\n // find the least loaded connection\n let min = Infinity\n let minIdx = 0\n\n for (let i = 0; i < this._connections.length; i++) {\n const conn = this._connections[i]\n const total = conn._session.queuedRpc.length + conn._session.pendingMessages.size()\n\n if (total < min) {\n min = total\n minIdx = i\n }\n }\n\n return this._connections[minIdx].sendRpc(request, timeout, abortSignal, chainId)\n // }\n\n // round-robin connections\n // since they all share the same session, it doesn't matter which one we use\n // the connection chosen here will only affect the first attempt at sending\n // return this._connections[\n // this._nextConnection++ % this._connections.length\n // ].sendRpc(request, stack, timeout)\n }\n\n connect(): void {\n for (const conn of this._connections) {\n conn.connect()\n }\n }\n\n ensureConnected(): void {\n if (this._connections[0].isConnected) return\n\n this.connect()\n }\n\n setAuthKey(authKey: Uint8Array | null, temp = false, idx = 0): void {\n const session = this._sessions[idx]\n const key = temp ? session._authKeyTemp : session._authKey\n key.setup(authKey)\n }\n\n resetAuthKeys(): void {\n for (const session of this._sessions) {\n session.reset(true)\n }\n this.notifyKeyChange()\n }\n\n setInactivityTimeout(timeout?: number): void {\n this._log.debug('setting inactivity timeout to %s', timeout)\n\n // for future connections (if any)\n this.params.inactivityTimeout = timeout\n\n // for current connections\n for (const conn of this._connections) {\n conn.setInactivityTimeout(timeout)\n }\n }\n\n notifyKeyChange(): void {\n // only expected to be called on non-main connections\n const session = this._sessions[0]\n\n if (this.params.usePfs && !session._authKeyTemp.ready) {\n this._log.debug('temp auth key needed but not ready, ignoring key change')\n\n return\n }\n\n if (this._sessions[0].queuedRpc.length) {\n // there are pending requests, we need to reconnect.\n this._log.debug('notifying key change on the connection due to queued rpc')\n this._connections[0].onConnected()\n }\n\n // connection is idle, we don't need to notify it\n }\n\n notifyNetworkChanged(connected: boolean): void {\n for (const conn of this._connections) {\n conn.notifyNetworkChanged(connected)\n }\n }\n\n requestAuth(): void {\n this._connections[0]._authorize()\n }\n\n resetSessions(): void {\n if (this.params.isMainConnection) {\n for (const conn of this._connections) {\n conn._resetSession()\n }\n } else {\n this._connections[0]._resetSession()\n }\n }\n\n changeTransport(factory: TransportFactory): void {\n this._connections.forEach((conn) => conn.changeTransport(factory))\n }\n\n getPoolSize(): number {\n return this._connections.length\n }\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  import { mtp, tl } from '@mtcute/tl';
2
2
  import { TlReaderMap, TlWriterMap } from '@mtcute/tl-runtime';
3
3
  import { StorageManager } from '../storage/storage.js';
4
+ import { Middleware } from '../utils/composer.js';
4
5
  import { DcOptions, ICryptoProvider, Logger } from '../utils/index.js';
5
6
  import { ConfigManager } from './config-manager.js';
6
7
  import { MultiSessionConnection } from './multi-session-connection.js';
@@ -22,8 +23,6 @@ export interface NetworkManagerParams {
22
23
  initConnectionOptions?: Partial<Omit<tl.RawInitConnectionRequest, 'apiId' | 'query'>>;
23
24
  transport: TransportFactory;
24
25
  reconnectionStrategy?: ReconnectionStrategy<PersistentConnectionParams>;
25
- floodSleepThreshold: number;
26
- maxRetryCount: number;
27
26
  disableUpdates?: boolean;
28
27
  testMode: boolean;
29
28
  layer: number;
@@ -71,6 +70,13 @@ export interface NetworkManagerExtraParams {
71
70
  * @default 60000 (60 seconds).
72
71
  */
73
72
  inactivityTimeout?: number;
73
+ /**
74
+ * List of middlewares to use for the network manager
75
+ *
76
+ * > **Note**: these middlewares apply to **outgoing requests only**.
77
+ * > If you need to handle incoming updates, use a {@link Dispatcher} instead.
78
+ */
79
+ middlewares?: Middleware<RpcCallMiddlewareContext, unknown>[];
74
80
  }
75
81
  /** Options that can be customized when making an RPC call */
76
82
  export interface RpcCallOptions {
@@ -80,14 +86,15 @@ export interface RpcCallOptions {
80
86
  *
81
87
  * If set to `0`, the call will not be retried.
82
88
  *
83
- * @default {@link BaseTelegramClientOptions.floodSleepThreshold}
89
+ * Only applies when the flood waiter middleware is enabled.
84
90
  */
85
91
  floodSleepThreshold?: number;
86
92
  /**
87
93
  * If the call results in an internal server error or a flood wait,
88
94
  * the maximum amount of times to retry the call.
89
95
  *
90
- * @default {@link BaseTelegramClientOptions.maxRetryCount}
96
+ * Only applies when the flood waiter middleware and/or
97
+ * internal errors handler middleware is enabled.
91
98
  */
92
99
  maxRetryCount?: number;
93
100
  /**
@@ -126,6 +133,9 @@ export interface RpcCallOptions {
126
133
  *
127
134
  * Useful for methods like `messages.getBotCallbackAnswer` that reliably return
128
135
  * -503 in case the upstream bot failed to respond.
136
+ *
137
+ * Only applies if the internal error handler middleware is enabled,
138
+ * otherwise -503 is always thrown.
129
139
  */
130
140
  throw503?: boolean;
131
141
  /**
@@ -145,6 +155,12 @@ export interface RpcCallOptions {
145
155
  */
146
156
  chainId?: string | number;
147
157
  }
158
+ export interface RpcCallMiddlewareContext {
159
+ request: tl.RpcMethod;
160
+ manager: NetworkManager;
161
+ params?: RpcCallOptions;
162
+ }
163
+ export type RpcCallMiddleware<Result = unknown> = Middleware<RpcCallMiddlewareContext, Result>;
148
164
  /**
149
165
  * Wrapper over all connection pools for a single DC.
150
166
  */
@@ -220,8 +236,9 @@ export declare class NetworkManager {
220
236
  resetSessions(): void;
221
237
  private _onConfigChanged;
222
238
  changePrimaryDc(newDc: number): Promise<void>;
223
- private _floodWaitedRequests;
224
- call<T extends tl.RpcMethod>(message: T, params?: RpcCallOptions): Promise<tl.RpcCallReturn[T['_']] | mtp.RawMt_rpc_error>;
239
+ readonly call: <T extends tl.RpcMethod>(message: T, params?: RpcCallOptions) => Promise<tl.RpcCallReturn[T['_']] | mtp.RawMt_rpc_error>;
240
+ private _composeCall;
241
+ private _call;
225
242
  changeTransport(factory: TransportFactory): void;
226
243
  getPoolSize(kind: ConnectionKind, dcId?: number): number;
227
244
  getPrimaryDcId(): number;
@@ -1,23 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.NetworkManager = exports.DcConnectionManager = void 0;
4
- const tl_1 = require("@mtcute/tl");
5
4
  const platform_js_1 = require("../platform.js");
6
5
  const index_js_1 = require("../types/index.js");
6
+ const composer_js_1 = require("../utils/composer.js");
7
7
  const index_js_2 = require("../utils/index.js");
8
8
  const type_assertions_js_1 = require("../utils/type-assertions.js");
9
+ const default_js_1 = require("./middlewares/default.js");
9
10
  const multi_session_connection_js_1 = require("./multi-session-connection.js");
10
11
  const reconnection_js_1 = require("./reconnection.js");
11
12
  const server_salt_js_1 = require("./server-salt.js");
12
- const CLIENT_ERRORS = {
13
- [tl_1.tl.RpcError.BAD_REQUEST]: 1,
14
- [tl_1.tl.RpcError.UNAUTHORIZED]: 1,
15
- [tl_1.tl.RpcError.FORBIDDEN]: 1,
16
- [tl_1.tl.RpcError.NOT_FOUND]: 1,
17
- [tl_1.tl.RpcError.FLOOD]: 1,
18
- [tl_1.tl.RpcError.SEE_OTHER]: 1,
19
- [tl_1.tl.RpcError.NOT_ACCEPTABLE]: 1,
20
- };
21
13
  const defaultConnectionCountDelegate = (kind, dcId, isPremium) => {
22
14
  switch (kind) {
23
15
  case 'main':
@@ -130,7 +122,7 @@ class DcConnectionManager {
130
122
  this.downloadSmall.notifyKeyChange();
131
123
  })
132
124
  .catch((e) => {
133
- this.manager._log.warn('failed to save auth key for dc %d: %s', this.dcId, e);
125
+ this.manager._log.warn('failed to save auth key for dc %d: %e', this.dcId, e);
134
126
  this.manager.params.emitError(e);
135
127
  });
136
128
  });
@@ -151,7 +143,7 @@ class DcConnectionManager {
151
143
  this.downloadSmall.notifyKeyChange();
152
144
  })
153
145
  .catch((e) => {
154
- this.manager._log.warn('failed to save temp auth key %d for dc %d: %s', idx, this.dcId, e);
146
+ this.manager._log.warn('failed to save temp auth key %d for dc %d: %e', idx, this.dcId, e);
155
147
  this.manager.params.emitError(e);
156
148
  });
157
149
  });
@@ -267,7 +259,7 @@ class NetworkManager {
267
259
  _: 'initConnection',
268
260
  deviceModel,
269
261
  systemVersion: '1.0',
270
- appVersion: '0.15.3',
262
+ appVersion: '0.16.1',
271
263
  systemLangCode: 'en',
272
264
  langPack: '', // "langPacks are for official apps only"
273
265
  langCode: 'en',
@@ -280,6 +272,7 @@ class NetworkManager {
280
272
  this._reconnectionStrategy = params.reconnectionStrategy ?? reconnection_js_1.defaultReconnectionStrategy;
281
273
  this._connectionCount = params.connectionCount ?? defaultConnectionCountDelegate;
282
274
  this._updateHandler = params.onUpdate;
275
+ this.call = this._composeCall(params.middlewares);
283
276
  this._onConfigChanged = this._onConfigChanged.bind(this);
284
277
  config.onReload(this._onConfigChanged);
285
278
  this._log = params.log.create('network');
@@ -478,32 +471,28 @@ class NetworkManager {
478
471
  await this._storage.dcs.store(options);
479
472
  await this._switchPrimaryDc(this._dcConnections.get(newDc));
480
473
  }
481
- _floodWaitedRequests = new Map();
482
- async call(message, params) {
474
+ call;
475
+ _composeCall = (middlewares) => {
476
+ if (!middlewares) {
477
+ middlewares = (0, default_js_1.basic)();
478
+ }
479
+ if (!middlewares.length) {
480
+ return this._call;
481
+ }
482
+ const final = async (ctx) => {
483
+ return this._call(ctx.request, ctx.params);
484
+ };
485
+ const composed = (0, composer_js_1.composeMiddlewares)(middlewares, final);
486
+ return async (message, params) => composed({
487
+ request: message,
488
+ manager: this,
489
+ params,
490
+ });
491
+ };
492
+ _call = async (message, params) => {
483
493
  if (!this._primaryDc) {
484
494
  throw new index_js_1.MtcuteError('Not connected to any DC');
485
495
  }
486
- const floodSleepThreshold = params?.floodSleepThreshold ?? this.params.floodSleepThreshold;
487
- const maxRetryCount = params?.maxRetryCount ?? this.params.maxRetryCount;
488
- const throw503 = params?.throw503 ?? false;
489
- // do not send requests that are in flood wait
490
- if (this._floodWaitedRequests.has(message._)) {
491
- const delta = this._floodWaitedRequests.get(message._) - Date.now();
492
- if (delta <= 3000) {
493
- // flood waits below 3 seconds are "ignored"
494
- this._floodWaitedRequests.delete(message._);
495
- }
496
- else if (delta <= this.params.floodSleepThreshold) {
497
- await (0, index_js_2.sleepWithAbort)(delta, this.params.stopSignal);
498
- this._floodWaitedRequests.delete(message._);
499
- }
500
- else {
501
- const err = tl_1.tl.RpcError.create(tl_1.tl.RpcError.FLOOD, 'FLOOD_WAIT_%d');
502
- err.seconds = Math.ceil(delta / 1000);
503
- throw err;
504
- }
505
- }
506
- let lastError = null;
507
496
  const kind = params?.kind ?? 'main';
508
497
  let manager;
509
498
  if (params?.manager) {
@@ -516,79 +505,42 @@ class NetworkManager {
516
505
  manager = this._primaryDc;
517
506
  }
518
507
  let multi = manager[kind];
519
- for (let i = 0; i < maxRetryCount; i++) {
520
- const res = await multi.sendRpc(message, params?.timeout, params?.abortSignal, params?.chainId);
521
- if (!(0, type_assertions_js_1.isTlRpcError)(res)) {
522
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
523
- return res;
524
- }
525
- lastError = res;
526
- const err = res.errorMessage;
527
- if (!(res.errorCode in CLIENT_ERRORS)) {
528
- if (throw503 && res.errorCode === -503) {
529
- throw new index_js_1.MtTimeoutError();
530
- }
531
- this._log.warn('Telegram is having internal issues: %d:%s, retrying', res.errorCode, err);
532
- if (err === 'WORKER_BUSY_TOO_LONG_RETRY') {
533
- // according to tdlib, "it is dangerous to resend query without timeout, so use 1"
534
- await (0, index_js_2.sleepWithAbort)(1000, this.params.stopSignal);
535
- }
536
- continue;
537
- }
538
- if (err.startsWith('FLOOD_WAIT_') ||
539
- err.startsWith('SLOWMODE_WAIT_') ||
540
- err.startsWith('FLOOD_TEST_PHONE_WAIT_')) {
541
- let seconds = Number(err.lastIndexOf('_') + 1);
542
- if (Number.isNaN(seconds)) {
543
- this._log.warn('invalid flood wait error received: %s, ignoring', err);
508
+ let res = await multi.sendRpc(message, params?.timeout, params?.abortSignal, params?.chainId);
509
+ if (!(0, type_assertions_js_1.isTlRpcError)(res)) {
510
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
511
+ return res;
512
+ }
513
+ const err = res.errorMessage;
514
+ if (manager === this._primaryDc) {
515
+ if (err.startsWith('PHONE_MIGRATE_') ||
516
+ err.startsWith('NETWORK_MIGRATE_') ||
517
+ err.startsWith('USER_MIGRATE_')) {
518
+ const newDc = Number(err.slice(err.lastIndexOf('_') + 1));
519
+ if (Number.isNaN(newDc)) {
520
+ this._log.warn('invalid migrate error received: %s, ignoring', err);
544
521
  return res;
545
522
  }
546
- if (!err.startsWith('SLOWMODE_WAIT_')) {
547
- // SLOW_MODE_WAIT is chat-specific, not request-specific
548
- this._floodWaitedRequests.set(message._, Date.now() + seconds * 1000);
549
- }
550
- // In test servers, FLOOD_WAIT_0 has been observed, and sleeping for
551
- // such a short amount will cause retries very fast leading to issues
552
- if (seconds === 0) {
553
- seconds = 1;
523
+ if (params?.localMigrate) {
524
+ manager = await this._getOtherDc(newDc);
554
525
  }
555
- if (seconds <= floodSleepThreshold) {
556
- this._log.warn('%s resulted in a flood wait, will retry in %d seconds', message._, seconds);
557
- await (0, index_js_2.sleepWithAbort)(seconds * 1000, this.params.stopSignal);
558
- continue;
526
+ else {
527
+ this._log.info('received %s, migrating to dc %d', err, newDc);
528
+ await this.changePrimaryDc(newDc);
529
+ manager = this._primaryDc;
559
530
  }
531
+ multi = manager[kind];
532
+ res = await multi.sendRpc(message, params?.timeout, params?.abortSignal, params?.chainId);
560
533
  }
561
- if (manager === this._primaryDc) {
562
- if (err.startsWith('PHONE_MIGRATE_') ||
563
- err.startsWith('NETWORK_MIGRATE_') ||
564
- err.startsWith('USER_MIGRATE_')) {
565
- const newDc = Number(err.slice(err.lastIndexOf('_') + 1));
566
- if (Number.isNaN(newDc)) {
567
- this._log.warn('invalid migrate error received: %s, ignoring', err);
568
- return res;
569
- }
570
- if (params?.localMigrate) {
571
- manager = await this._getOtherDc(newDc);
572
- }
573
- else {
574
- this._log.info('Migrate error, new dc = %d', newDc);
575
- await this.changePrimaryDc(newDc);
576
- manager = this._primaryDc;
577
- }
578
- multi = manager[kind];
579
- continue;
580
- }
581
- }
582
- else if (err === 'AUTH_KEY_UNREGISTERED') {
583
- // we can try re-exporting auth from the primary connection
584
- this._log.warn('exported auth key error, trying re-exporting..');
585
- await this._exportAuthTo(manager);
586
- continue;
587
- }
588
- return res;
589
534
  }
590
- return lastError;
591
- }
535
+ else if (err === 'AUTH_KEY_UNREGISTERED') {
536
+ // we can try re-exporting auth from the primary connection
537
+ this._log.warn('exported auth key error, trying re-exporting..');
538
+ await this._exportAuthTo(manager);
539
+ res = await multi.sendRpc(message, params?.timeout, params?.abortSignal, params?.chainId);
540
+ }
541
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
542
+ return res;
543
+ };
592
544
  changeTransport(factory) {
593
545
  for (const dc of this._dcConnections.values()) {
594
546
  dc.main.changeTransport(factory);