@mtcute/core 0.1.1 → 0.2.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 (325) hide show
  1. package/cjs/base-client.d.ts +3 -6
  2. package/cjs/base-client.js +12 -20
  3. package/cjs/base-client.js.map +1 -1
  4. package/cjs/network/auth-key.test.d.ts +1 -0
  5. package/cjs/network/auth-key.test.js +111 -0
  6. package/cjs/network/auth-key.test.js.map +1 -0
  7. package/cjs/network/config-manager.js +2 -1
  8. package/cjs/network/config-manager.js.map +1 -1
  9. package/cjs/network/config-manager.test.d.ts +1 -0
  10. package/cjs/network/config-manager.test.js +170 -0
  11. package/cjs/network/config-manager.test.js.map +1 -0
  12. package/cjs/network/index.d.ts +1 -1
  13. package/cjs/network/index.js.map +1 -1
  14. package/cjs/network/multi-session-connection.js +17 -4
  15. package/cjs/network/multi-session-connection.js.map +1 -1
  16. package/cjs/network/network-manager.d.ts +1 -1
  17. package/cjs/network/network-manager.js +12 -5
  18. package/cjs/network/network-manager.js.map +1 -1
  19. package/cjs/network/persistent-connection.test.d.ts +1 -0
  20. package/cjs/network/persistent-connection.test.js +157 -0
  21. package/cjs/network/persistent-connection.test.js.map +1 -0
  22. package/cjs/network/session-connection.js +3 -2
  23. package/cjs/network/session-connection.js.map +1 -1
  24. package/cjs/network/transports/intermediate.test.d.ts +1 -0
  25. package/cjs/network/transports/intermediate.test.js +84 -0
  26. package/cjs/network/transports/intermediate.test.js.map +1 -0
  27. package/cjs/network/transports/obfuscated.js +1 -1
  28. package/cjs/network/transports/obfuscated.js.map +1 -1
  29. package/cjs/network/transports/obfuscated.test.d.ts +1 -0
  30. package/cjs/network/transports/obfuscated.test.js +131 -0
  31. package/cjs/network/transports/obfuscated.test.js.map +1 -0
  32. package/cjs/network/transports/tcp.js +1 -1
  33. package/cjs/network/transports/tcp.js.map +1 -1
  34. package/cjs/network/transports/tcp.test.d.ts +1 -0
  35. package/cjs/network/transports/tcp.test.js +103 -0
  36. package/cjs/network/transports/tcp.test.js.map +1 -0
  37. package/cjs/network/transports/websocket.test.d.ts +1 -0
  38. package/cjs/network/transports/websocket.test.js +91 -0
  39. package/cjs/network/transports/websocket.test.js.map +1 -0
  40. package/cjs/storage/abstract.d.ts +18 -0
  41. package/cjs/storage/abstract.js.map +1 -1
  42. package/cjs/storage/idb.d.ts +101 -0
  43. package/cjs/storage/idb.js +458 -0
  44. package/cjs/storage/idb.js.map +1 -0
  45. package/cjs/storage/idb.test.d.ts +1 -0
  46. package/cjs/storage/idb.test.js +21 -0
  47. package/cjs/storage/idb.test.js.map +1 -0
  48. package/cjs/storage/index.d.ts +0 -4
  49. package/cjs/storage/index.js +0 -4
  50. package/cjs/storage/index.js.map +1 -1
  51. package/cjs/storage/json-file.d.ts +12 -0
  52. package/cjs/storage/json-file.js +12 -0
  53. package/cjs/storage/json-file.js.map +1 -1
  54. package/cjs/storage/json.js +3 -2
  55. package/cjs/storage/json.js.map +1 -1
  56. package/cjs/storage/json.test.d.ts +1 -0
  57. package/cjs/storage/json.test.js +36 -0
  58. package/cjs/storage/json.test.js.map +1 -0
  59. package/cjs/storage/localstorage.d.ts +12 -0
  60. package/cjs/storage/localstorage.js +12 -0
  61. package/cjs/storage/localstorage.js.map +1 -1
  62. package/cjs/storage/localstorage.test.d.ts +1 -0
  63. package/cjs/storage/localstorage.test.js +23 -0
  64. package/cjs/storage/localstorage.test.js.map +1 -0
  65. package/cjs/storage/memory.d.ts +12 -1
  66. package/cjs/storage/memory.js +65 -3
  67. package/cjs/storage/memory.js.map +1 -1
  68. package/cjs/storage/memory.test.d.ts +1 -0
  69. package/cjs/storage/memory.test.js +48 -0
  70. package/cjs/storage/memory.test.js.map +1 -0
  71. package/cjs/utils/async-lock.test.d.ts +1 -0
  72. package/cjs/utils/async-lock.test.js +25 -0
  73. package/cjs/utils/async-lock.test.js.map +1 -0
  74. package/cjs/utils/bigint-utils.test.d.ts +1 -0
  75. package/cjs/utils/bigint-utils.test.js +150 -0
  76. package/cjs/utils/bigint-utils.test.js.map +1 -0
  77. package/cjs/utils/buffer-utils.test.d.ts +1 -0
  78. package/cjs/utils/buffer-utils.test.js +69 -0
  79. package/cjs/utils/buffer-utils.test.js.map +1 -0
  80. package/cjs/utils/condition-variable.test.d.ts +1 -0
  81. package/cjs/utils/condition-variable.test.js +27 -0
  82. package/cjs/utils/condition-variable.test.js.map +1 -0
  83. package/cjs/utils/controllable-promise.d.ts +0 -5
  84. package/cjs/utils/controllable-promise.js +1 -7
  85. package/cjs/utils/controllable-promise.js.map +1 -1
  86. package/cjs/utils/controllable-promise.test.d.ts +1 -0
  87. package/cjs/utils/controllable-promise.test.js +17 -0
  88. package/cjs/utils/controllable-promise.test.js.map +1 -0
  89. package/cjs/utils/crypto/keys.test.d.ts +1 -0
  90. package/cjs/utils/crypto/keys.test.js +40 -0
  91. package/cjs/utils/crypto/keys.test.js.map +1 -0
  92. package/cjs/utils/crypto/miller-rabin.test.d.ts +1 -0
  93. package/cjs/utils/crypto/miller-rabin.test.js +60 -0
  94. package/cjs/utils/crypto/miller-rabin.test.js.map +1 -0
  95. package/cjs/utils/crypto/mtproto.test.d.ts +1 -0
  96. package/cjs/utils/crypto/mtproto.test.js +50 -0
  97. package/cjs/utils/crypto/mtproto.test.js.map +1 -0
  98. package/cjs/utils/crypto/node.test.d.ts +1 -0
  99. package/cjs/utils/crypto/node.test.js +14 -0
  100. package/cjs/utils/crypto/node.test.js.map +1 -0
  101. package/cjs/utils/crypto/password.test.d.ts +1 -0
  102. package/cjs/utils/crypto/password.test.js +95 -0
  103. package/cjs/utils/crypto/password.test.js.map +1 -0
  104. package/cjs/utils/crypto/utils.test.d.ts +1 -0
  105. package/cjs/utils/crypto/utils.test.js +49 -0
  106. package/cjs/utils/crypto/utils.test.js.map +1 -0
  107. package/cjs/utils/crypto/web.test.d.ts +1 -0
  108. package/cjs/utils/crypto/web.test.js +17 -0
  109. package/cjs/utils/crypto/web.test.js.map +1 -0
  110. package/cjs/utils/deque.test.d.ts +1 -0
  111. package/cjs/utils/deque.test.js +128 -0
  112. package/cjs/utils/deque.test.js.map +1 -0
  113. package/cjs/utils/function-utils.test.d.ts +1 -0
  114. package/cjs/utils/function-utils.test.js +23 -0
  115. package/cjs/utils/function-utils.test.js.map +1 -0
  116. package/cjs/utils/linked-list.test.d.ts +1 -0
  117. package/cjs/utils/linked-list.test.js +36 -0
  118. package/cjs/utils/linked-list.test.js.map +1 -0
  119. package/cjs/utils/links/bots.test.d.ts +1 -0
  120. package/cjs/utils/links/bots.test.js +152 -0
  121. package/cjs/utils/links/bots.test.js.map +1 -0
  122. package/cjs/utils/links/chat.test.d.ts +1 -0
  123. package/cjs/utils/links/chat.test.js +84 -0
  124. package/cjs/utils/links/chat.test.js.map +1 -0
  125. package/cjs/utils/links/misc.test.d.ts +1 -0
  126. package/cjs/utils/links/misc.test.js +153 -0
  127. package/cjs/utils/links/misc.test.js.map +1 -0
  128. package/cjs/utils/links/proxy.test.d.ts +1 -0
  129. package/cjs/utils/links/proxy.test.js +74 -0
  130. package/cjs/utils/links/proxy.test.js.map +1 -0
  131. package/cjs/utils/links/user.test.d.ts +1 -0
  132. package/cjs/utils/links/user.test.js +63 -0
  133. package/cjs/utils/links/user.test.js.map +1 -0
  134. package/cjs/utils/logger.test.d.ts +1 -0
  135. package/cjs/utils/logger.test.js +127 -0
  136. package/cjs/utils/logger.test.js.map +1 -0
  137. package/cjs/utils/long-utils.test.d.ts +1 -0
  138. package/cjs/utils/long-utils.test.js +158 -0
  139. package/cjs/utils/long-utils.test.js.map +1 -0
  140. package/cjs/utils/lru-map.test.d.ts +1 -0
  141. package/cjs/utils/lru-map.test.js +96 -0
  142. package/cjs/utils/lru-map.test.js.map +1 -0
  143. package/cjs/utils/lru-set.test.d.ts +1 -0
  144. package/cjs/utils/lru-set.test.js +77 -0
  145. package/cjs/utils/lru-set.test.js.map +1 -0
  146. package/cjs/utils/peer-utils.js +3 -1
  147. package/cjs/utils/peer-utils.js.map +1 -1
  148. package/cjs/utils/peer-utils.test.d.ts +1 -0
  149. package/cjs/utils/peer-utils.test.js +122 -0
  150. package/cjs/utils/peer-utils.test.js.map +1 -0
  151. package/cjs/utils/sorted-array.test.d.ts +1 -0
  152. package/cjs/utils/sorted-array.test.js +66 -0
  153. package/cjs/utils/sorted-array.test.js.map +1 -0
  154. package/cjs/utils/string-session.test.d.ts +1 -0
  155. package/cjs/utils/string-session.test.js +106 -0
  156. package/cjs/utils/string-session.test.js.map +1 -0
  157. package/cjs/utils/tl-json.test.d.ts +1 -0
  158. package/cjs/utils/tl-json.test.js +83 -0
  159. package/cjs/utils/tl-json.test.js.map +1 -0
  160. package/cjs/utils/type-assertions.test.d.ts +1 -0
  161. package/cjs/utils/type-assertions.test.js +67 -0
  162. package/cjs/utils/type-assertions.test.js.map +1 -0
  163. package/esm/base-client.d.ts +3 -6
  164. package/esm/base-client.js +2 -10
  165. package/esm/base-client.js.map +1 -1
  166. package/esm/network/auth-key.test.d.ts +1 -0
  167. package/esm/network/auth-key.test.js +106 -0
  168. package/esm/network/auth-key.test.js.map +1 -0
  169. package/esm/network/config-manager.js +2 -1
  170. package/esm/network/config-manager.js.map +1 -1
  171. package/esm/network/config-manager.test.d.ts +1 -0
  172. package/esm/network/config-manager.test.js +168 -0
  173. package/esm/network/config-manager.test.js.map +1 -0
  174. package/esm/network/index.d.ts +1 -1
  175. package/esm/network/index.js.map +1 -1
  176. package/esm/network/multi-session-connection.js +17 -4
  177. package/esm/network/multi-session-connection.js.map +1 -1
  178. package/esm/network/network-manager.d.ts +1 -1
  179. package/esm/network/network-manager.js +12 -5
  180. package/esm/network/network-manager.js.map +1 -1
  181. package/esm/network/persistent-connection.test.d.ts +1 -0
  182. package/esm/network/persistent-connection.test.js +155 -0
  183. package/esm/network/persistent-connection.test.js.map +1 -0
  184. package/esm/network/session-connection.js +3 -2
  185. package/esm/network/session-connection.js.map +1 -1
  186. package/esm/network/transports/intermediate.test.d.ts +1 -0
  187. package/esm/network/transports/intermediate.test.js +82 -0
  188. package/esm/network/transports/intermediate.test.js.map +1 -0
  189. package/esm/network/transports/obfuscated.js +1 -1
  190. package/esm/network/transports/obfuscated.js.map +1 -1
  191. package/esm/network/transports/obfuscated.test.d.ts +1 -0
  192. package/esm/network/transports/obfuscated.test.js +129 -0
  193. package/esm/network/transports/obfuscated.test.js.map +1 -0
  194. package/esm/network/transports/tcp.js +1 -1
  195. package/esm/network/transports/tcp.js.map +1 -1
  196. package/esm/network/transports/tcp.test.d.ts +1 -0
  197. package/esm/network/transports/tcp.test.js +101 -0
  198. package/esm/network/transports/tcp.test.js.map +1 -0
  199. package/esm/network/transports/websocket.test.d.ts +1 -0
  200. package/esm/network/transports/websocket.test.js +89 -0
  201. package/esm/network/transports/websocket.test.js.map +1 -0
  202. package/esm/storage/abstract.d.ts +18 -0
  203. package/esm/storage/abstract.js.map +1 -1
  204. package/esm/storage/idb.d.ts +101 -0
  205. package/esm/storage/idb.js +454 -0
  206. package/esm/storage/idb.js.map +1 -0
  207. package/esm/storage/idb.test.d.ts +1 -0
  208. package/esm/storage/idb.test.js +19 -0
  209. package/esm/storage/idb.test.js.map +1 -0
  210. package/esm/storage/index.d.ts +0 -4
  211. package/esm/storage/index.js +0 -4
  212. package/esm/storage/index.js.map +1 -1
  213. package/esm/storage/json-file.d.ts +12 -0
  214. package/esm/storage/json-file.js +12 -0
  215. package/esm/storage/json-file.js.map +1 -1
  216. package/esm/storage/json.js +3 -2
  217. package/esm/storage/json.js.map +1 -1
  218. package/esm/storage/json.test.d.ts +1 -0
  219. package/esm/storage/json.test.js +34 -0
  220. package/esm/storage/json.test.js.map +1 -0
  221. package/esm/storage/localstorage.d.ts +12 -0
  222. package/esm/storage/localstorage.js +12 -0
  223. package/esm/storage/localstorage.js.map +1 -1
  224. package/esm/storage/localstorage.test.d.ts +1 -0
  225. package/esm/storage/localstorage.test.js +21 -0
  226. package/esm/storage/localstorage.test.js.map +1 -0
  227. package/esm/storage/memory.d.ts +12 -1
  228. package/esm/storage/memory.js +65 -3
  229. package/esm/storage/memory.js.map +1 -1
  230. package/esm/storage/memory.test.d.ts +1 -0
  231. package/esm/storage/memory.test.js +46 -0
  232. package/esm/storage/memory.test.js.map +1 -0
  233. package/esm/utils/async-lock.test.d.ts +1 -0
  234. package/esm/utils/async-lock.test.js +23 -0
  235. package/esm/utils/async-lock.test.js.map +1 -0
  236. package/esm/utils/bigint-utils.test.d.ts +1 -0
  237. package/esm/utils/bigint-utils.test.js +148 -0
  238. package/esm/utils/bigint-utils.test.js.map +1 -0
  239. package/esm/utils/buffer-utils.test.d.ts +1 -0
  240. package/esm/utils/buffer-utils.test.js +67 -0
  241. package/esm/utils/buffer-utils.test.js.map +1 -0
  242. package/esm/utils/condition-variable.test.d.ts +1 -0
  243. package/esm/utils/condition-variable.test.js +25 -0
  244. package/esm/utils/condition-variable.test.js.map +1 -0
  245. package/esm/utils/controllable-promise.d.ts +0 -5
  246. package/esm/utils/controllable-promise.js +0 -5
  247. package/esm/utils/controllable-promise.js.map +1 -1
  248. package/esm/utils/controllable-promise.test.d.ts +1 -0
  249. package/esm/utils/controllable-promise.test.js +15 -0
  250. package/esm/utils/controllable-promise.test.js.map +1 -0
  251. package/esm/utils/crypto/keys.test.d.ts +1 -0
  252. package/esm/utils/crypto/keys.test.js +38 -0
  253. package/esm/utils/crypto/keys.test.js.map +1 -0
  254. package/esm/utils/crypto/miller-rabin.test.d.ts +1 -0
  255. package/esm/utils/crypto/miller-rabin.test.js +58 -0
  256. package/esm/utils/crypto/miller-rabin.test.js.map +1 -0
  257. package/esm/utils/crypto/mtproto.test.d.ts +1 -0
  258. package/esm/utils/crypto/mtproto.test.js +48 -0
  259. package/esm/utils/crypto/mtproto.test.js.map +1 -0
  260. package/esm/utils/crypto/node.test.d.ts +1 -0
  261. package/esm/utils/crypto/node.test.js +12 -0
  262. package/esm/utils/crypto/node.test.js.map +1 -0
  263. package/esm/utils/crypto/password.test.d.ts +1 -0
  264. package/esm/utils/crypto/password.test.js +90 -0
  265. package/esm/utils/crypto/password.test.js.map +1 -0
  266. package/esm/utils/crypto/utils.test.d.ts +1 -0
  267. package/esm/utils/crypto/utils.test.js +47 -0
  268. package/esm/utils/crypto/utils.test.js.map +1 -0
  269. package/esm/utils/crypto/web.test.d.ts +1 -0
  270. package/esm/utils/crypto/web.test.js +15 -0
  271. package/esm/utils/crypto/web.test.js.map +1 -0
  272. package/esm/utils/deque.test.d.ts +1 -0
  273. package/esm/utils/deque.test.js +126 -0
  274. package/esm/utils/deque.test.js.map +1 -0
  275. package/esm/utils/function-utils.test.d.ts +1 -0
  276. package/esm/utils/function-utils.test.js +21 -0
  277. package/esm/utils/function-utils.test.js.map +1 -0
  278. package/esm/utils/linked-list.test.d.ts +1 -0
  279. package/esm/utils/linked-list.test.js +34 -0
  280. package/esm/utils/linked-list.test.js.map +1 -0
  281. package/esm/utils/links/bots.test.d.ts +1 -0
  282. package/esm/utils/links/bots.test.js +150 -0
  283. package/esm/utils/links/bots.test.js.map +1 -0
  284. package/esm/utils/links/chat.test.d.ts +1 -0
  285. package/esm/utils/links/chat.test.js +82 -0
  286. package/esm/utils/links/chat.test.js.map +1 -0
  287. package/esm/utils/links/misc.test.d.ts +1 -0
  288. package/esm/utils/links/misc.test.js +151 -0
  289. package/esm/utils/links/misc.test.js.map +1 -0
  290. package/esm/utils/links/proxy.test.d.ts +1 -0
  291. package/esm/utils/links/proxy.test.js +72 -0
  292. package/esm/utils/links/proxy.test.js.map +1 -0
  293. package/esm/utils/links/user.test.d.ts +1 -0
  294. package/esm/utils/links/user.test.js +61 -0
  295. package/esm/utils/links/user.test.js.map +1 -0
  296. package/esm/utils/logger.test.d.ts +1 -0
  297. package/esm/utils/logger.test.js +122 -0
  298. package/esm/utils/logger.test.js.map +1 -0
  299. package/esm/utils/long-utils.test.d.ts +1 -0
  300. package/esm/utils/long-utils.test.js +153 -0
  301. package/esm/utils/long-utils.test.js.map +1 -0
  302. package/esm/utils/lru-map.test.d.ts +1 -0
  303. package/esm/utils/lru-map.test.js +94 -0
  304. package/esm/utils/lru-map.test.js.map +1 -0
  305. package/esm/utils/lru-set.test.d.ts +1 -0
  306. package/esm/utils/lru-set.test.js +72 -0
  307. package/esm/utils/lru-set.test.js.map +1 -0
  308. package/esm/utils/peer-utils.js +3 -1
  309. package/esm/utils/peer-utils.js.map +1 -1
  310. package/esm/utils/peer-utils.test.d.ts +1 -0
  311. package/esm/utils/peer-utils.test.js +117 -0
  312. package/esm/utils/peer-utils.test.js.map +1 -0
  313. package/esm/utils/sorted-array.test.d.ts +1 -0
  314. package/esm/utils/sorted-array.test.js +64 -0
  315. package/esm/utils/sorted-array.test.js.map +1 -0
  316. package/esm/utils/string-session.test.d.ts +1 -0
  317. package/esm/utils/string-session.test.js +104 -0
  318. package/esm/utils/string-session.test.js.map +1 -0
  319. package/esm/utils/tl-json.test.d.ts +1 -0
  320. package/esm/utils/tl-json.test.js +81 -0
  321. package/esm/utils/tl-json.test.js.map +1 -0
  322. package/esm/utils/type-assertions.test.d.ts +1 -0
  323. package/esm/utils/type-assertions.test.js +65 -0
  324. package/esm/utils/type-assertions.test.js.map +1 -0
  325. package/package.json +20 -16
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const test_1 = require("@mtcute/test");
5
+ const config_manager_js_1 = require("./config-manager.js");
6
+ (0, vitest_1.describe)('ConfigManager', () => {
7
+ const config = (0, test_1.createStub)('config', {
8
+ expires: 300,
9
+ });
10
+ const getConfig = vitest_1.vi.fn();
11
+ (0, vitest_1.beforeEach)(() => {
12
+ vitest_1.vi.useFakeTimers();
13
+ vitest_1.vi.setSystemTime(0);
14
+ getConfig.mockClear().mockImplementation(() => Promise.resolve(config));
15
+ });
16
+ (0, vitest_1.afterEach)(() => void vitest_1.vi.useRealTimers());
17
+ (0, vitest_1.it)('should fetch initial config', async () => {
18
+ const cm = new config_manager_js_1.ConfigManager(getConfig);
19
+ const fetchedConfig = await cm.get();
20
+ (0, vitest_1.expect)(getConfig).toHaveBeenCalledTimes(1);
21
+ (0, vitest_1.expect)(fetchedConfig).toEqual(config);
22
+ (0, vitest_1.expect)(cm.getNow()).toEqual(config);
23
+ });
24
+ (0, vitest_1.it)('should automatically update config', async () => {
25
+ const cm = new config_manager_js_1.ConfigManager(getConfig);
26
+ await cm.update();
27
+ getConfig.mockImplementation(() => Promise.resolve({
28
+ ...config,
29
+ expires: 600,
30
+ }));
31
+ await vitest_1.vi.advanceTimersByTimeAsync(301000);
32
+ (0, vitest_1.expect)(getConfig).toHaveBeenCalledTimes(2);
33
+ });
34
+ (0, vitest_1.it)('should correctly determine stale config', () => {
35
+ const cm = new config_manager_js_1.ConfigManager(getConfig);
36
+ (0, vitest_1.expect)(cm.isStale).toBe(true);
37
+ cm.setConfig(config);
38
+ (0, vitest_1.expect)(cm.isStale).toBe(false);
39
+ vitest_1.vi.setSystemTime(300000);
40
+ (0, vitest_1.expect)(cm.isStale).toBe(true);
41
+ });
42
+ (0, vitest_1.it)('should not update config if not stale', async () => {
43
+ const cm = new config_manager_js_1.ConfigManager(getConfig);
44
+ await cm.update();
45
+ getConfig.mockClear();
46
+ await cm.update();
47
+ (0, vitest_1.expect)(getConfig).not.toHaveBeenCalled();
48
+ });
49
+ (0, vitest_1.it)('should not update config twice', async () => {
50
+ const cm = new config_manager_js_1.ConfigManager(getConfig);
51
+ await cm.update();
52
+ vitest_1.vi.setSystemTime(300000);
53
+ getConfig.mockClear();
54
+ await Promise.all([cm.update(), cm.update()]);
55
+ (0, vitest_1.expect)(getConfig).toHaveBeenCalledOnce();
56
+ });
57
+ (0, vitest_1.it)('should call listeners on config update', async () => {
58
+ const cm = new config_manager_js_1.ConfigManager(getConfig);
59
+ const listener = vitest_1.vi.fn();
60
+ cm.onConfigUpdate(listener);
61
+ await cm.update();
62
+ vitest_1.vi.setSystemTime(300000);
63
+ cm.offConfigUpdate(listener);
64
+ await cm.update();
65
+ (0, vitest_1.expect)(listener).toHaveBeenCalledOnce();
66
+ (0, vitest_1.expect)(listener).toHaveBeenCalledWith(config);
67
+ });
68
+ (0, vitest_1.it)('should correctly destroy', async () => {
69
+ const cm = new config_manager_js_1.ConfigManager(getConfig);
70
+ await cm.update();
71
+ cm.destroy();
72
+ getConfig.mockClear();
73
+ await vitest_1.vi.advanceTimersByTimeAsync(301000);
74
+ (0, vitest_1.expect)(getConfig).not.toHaveBeenCalled();
75
+ });
76
+ (0, vitest_1.describe)('findOption', () => {
77
+ const useDcOptions = (options) => {
78
+ getConfig.mockImplementation(() => Promise.resolve({
79
+ ...config,
80
+ dcOptions: options,
81
+ }));
82
+ };
83
+ const findOption = async (params) => {
84
+ const cm = new config_manager_js_1.ConfigManager(getConfig);
85
+ await cm.update();
86
+ return cm.findOption(params);
87
+ };
88
+ (0, vitest_1.it)('should find option by dc id', async () => {
89
+ useDcOptions([
90
+ (0, test_1.createStub)('dcOption', { id: 1, ipAddress: '1.1.1.1' }),
91
+ (0, test_1.createStub)('dcOption', { id: 2, ipAddress: '2.2.2.2' }),
92
+ ]);
93
+ (0, vitest_1.expect)(await findOption({ dcId: 1 })).toMatchObject({
94
+ id: 1,
95
+ ipAddress: '1.1.1.1',
96
+ });
97
+ (0, vitest_1.expect)(await findOption({ dcId: 2 })).toMatchObject({
98
+ id: 2,
99
+ ipAddress: '2.2.2.2',
100
+ });
101
+ });
102
+ (0, vitest_1.it)('should ignore tcpoOnly options', async () => {
103
+ useDcOptions([
104
+ (0, test_1.createStub)('dcOption', { id: 1, ipAddress: '1.1.1.1', tcpoOnly: true }),
105
+ (0, test_1.createStub)('dcOption', { id: 1, ipAddress: '1.1.1.2' }),
106
+ ]);
107
+ (0, vitest_1.expect)(await findOption({ dcId: 1 })).toMatchObject({
108
+ id: 1,
109
+ ipAddress: '1.1.1.2',
110
+ });
111
+ });
112
+ (0, vitest_1.it)('should respect allowMedia flag', async () => {
113
+ useDcOptions([
114
+ (0, test_1.createStub)('dcOption', { id: 2, ipAddress: '2.2.2.2', mediaOnly: true }),
115
+ (0, test_1.createStub)('dcOption', { id: 2, ipAddress: '2.2.2.3' }),
116
+ ]);
117
+ (0, vitest_1.expect)(await findOption({ dcId: 2 })).toMatchObject({
118
+ id: 2,
119
+ ipAddress: '2.2.2.3',
120
+ });
121
+ (0, vitest_1.expect)(await findOption({ dcId: 2, allowMedia: true })).toMatchObject({
122
+ id: 2,
123
+ ipAddress: '2.2.2.2',
124
+ });
125
+ });
126
+ (0, vitest_1.it)('should respect preferMedia flag', async () => {
127
+ useDcOptions([
128
+ (0, test_1.createStub)('dcOption', { id: 2, ipAddress: '2.2.2.3' }),
129
+ (0, test_1.createStub)('dcOption', { id: 2, ipAddress: '2.2.2.2', mediaOnly: true }),
130
+ ]);
131
+ (0, vitest_1.expect)(await findOption({ dcId: 2 })).toMatchObject({
132
+ id: 2,
133
+ ipAddress: '2.2.2.3',
134
+ });
135
+ (0, vitest_1.expect)(await findOption({ dcId: 2, allowMedia: true, preferMedia: true })).toMatchObject({
136
+ id: 2,
137
+ ipAddress: '2.2.2.2',
138
+ });
139
+ });
140
+ (0, vitest_1.it)('should respect allowIpv6 flag', async () => {
141
+ useDcOptions([
142
+ (0, test_1.createStub)('dcOption', { id: 2, ipAddress: '::1', ipv6: true }),
143
+ (0, test_1.createStub)('dcOption', { id: 2, ipAddress: '2.2.2.3' }),
144
+ ]);
145
+ (0, vitest_1.expect)(await findOption({ dcId: 2 })).toMatchObject({
146
+ id: 2,
147
+ ipAddress: '2.2.2.3',
148
+ });
149
+ (0, vitest_1.expect)(await findOption({ dcId: 2, allowIpv6: true })).toMatchObject({
150
+ id: 2,
151
+ ipAddress: '::1',
152
+ });
153
+ });
154
+ (0, vitest_1.it)('should respect preferIpv6 flag', async () => {
155
+ useDcOptions([
156
+ (0, test_1.createStub)('dcOption', { id: 2, ipAddress: '2.2.2.3' }),
157
+ (0, test_1.createStub)('dcOption', { id: 2, ipAddress: '::1', ipv6: true }),
158
+ ]);
159
+ (0, vitest_1.expect)(await findOption({ dcId: 2 })).toMatchObject({
160
+ id: 2,
161
+ ipAddress: '2.2.2.3',
162
+ });
163
+ (0, vitest_1.expect)(await findOption({ dcId: 2, allowIpv6: true, preferIpv6: true })).toMatchObject({
164
+ id: 2,
165
+ ipAddress: '::1',
166
+ });
167
+ });
168
+ });
169
+ });
170
+ //# sourceMappingURL=config-manager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-manager.test.js","sourceRoot":"","sources":["../../../src/network/config-manager.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'\n\nimport { createStub } from '@mtcute/test'\nimport { tl } from '@mtcute/tl'\n\nimport { ConfigManager } from './config-manager.js'\n\ndescribe('ConfigManager', () => {\n const config = createStub('config', {\n expires: 300,\n })\n const getConfig = vi.fn()\n\n beforeEach(() => {\n vi.useFakeTimers()\n vi.setSystemTime(0)\n getConfig.mockClear().mockImplementation(() => Promise.resolve(config))\n })\n afterEach(() => void vi.useRealTimers())\n\n it('should fetch initial config', async () => {\n const cm = new ConfigManager(getConfig)\n\n const fetchedConfig = await cm.get()\n\n expect(getConfig).toHaveBeenCalledTimes(1)\n expect(fetchedConfig).toEqual(config)\n expect(cm.getNow()).toEqual(config)\n })\n\n it('should automatically update config', async () => {\n const cm = new ConfigManager(getConfig)\n await cm.update()\n\n getConfig.mockImplementation(() =>\n Promise.resolve({\n ...config,\n expires: 600,\n }),\n )\n\n await vi.advanceTimersByTimeAsync(301_000)\n\n expect(getConfig).toHaveBeenCalledTimes(2)\n })\n\n it('should correctly determine stale config', () => {\n const cm = new ConfigManager(getConfig)\n expect(cm.isStale).toBe(true)\n\n cm.setConfig(config)\n expect(cm.isStale).toBe(false)\n\n vi.setSystemTime(300_000)\n expect(cm.isStale).toBe(true)\n })\n\n it('should not update config if not stale', async () => {\n const cm = new ConfigManager(getConfig)\n await cm.update()\n\n getConfig.mockClear()\n await cm.update()\n\n expect(getConfig).not.toHaveBeenCalled()\n })\n\n it('should not update config twice', async () => {\n const cm = new ConfigManager(getConfig)\n await cm.update()\n\n vi.setSystemTime(300_000)\n getConfig.mockClear()\n await Promise.all([cm.update(), cm.update()])\n\n expect(getConfig).toHaveBeenCalledOnce()\n })\n\n it('should call listeners on config update', async () => {\n const cm = new ConfigManager(getConfig)\n const listener = vi.fn()\n cm.onConfigUpdate(listener)\n await cm.update()\n\n vi.setSystemTime(300_000)\n cm.offConfigUpdate(listener)\n await cm.update()\n\n expect(listener).toHaveBeenCalledOnce()\n expect(listener).toHaveBeenCalledWith(config)\n })\n\n it('should correctly destroy', async () => {\n const cm = new ConfigManager(getConfig)\n await cm.update()\n\n cm.destroy()\n\n getConfig.mockClear()\n await vi.advanceTimersByTimeAsync(301_000)\n\n expect(getConfig).not.toHaveBeenCalled()\n })\n\n describe('findOption', () => {\n const useDcOptions = (options: tl.RawDcOption[]) => {\n getConfig.mockImplementation(() =>\n Promise.resolve({\n ...config,\n dcOptions: options,\n }),\n )\n }\n\n const findOption = async (params: Parameters<ConfigManager['findOption']>[0]) => {\n const cm = new ConfigManager(getConfig)\n await cm.update()\n\n return cm.findOption(params)\n }\n\n it('should find option by dc id', async () => {\n useDcOptions([\n createStub('dcOption', { id: 1, ipAddress: '1.1.1.1' }),\n createStub('dcOption', { id: 2, ipAddress: '2.2.2.2' }),\n ])\n\n expect(await findOption({ dcId: 1 })).toMatchObject({\n id: 1,\n ipAddress: '1.1.1.1',\n })\n expect(await findOption({ dcId: 2 })).toMatchObject({\n id: 2,\n ipAddress: '2.2.2.2',\n })\n })\n\n it('should ignore tcpoOnly options', async () => {\n useDcOptions([\n createStub('dcOption', { id: 1, ipAddress: '1.1.1.1', tcpoOnly: true }),\n createStub('dcOption', { id: 1, ipAddress: '1.1.1.2' }),\n ])\n\n expect(await findOption({ dcId: 1 })).toMatchObject({\n id: 1,\n ipAddress: '1.1.1.2',\n })\n })\n\n it('should respect allowMedia flag', async () => {\n useDcOptions([\n createStub('dcOption', { id: 2, ipAddress: '2.2.2.2', mediaOnly: true }),\n createStub('dcOption', { id: 2, ipAddress: '2.2.2.3' }),\n ])\n\n expect(await findOption({ dcId: 2 })).toMatchObject({\n id: 2,\n ipAddress: '2.2.2.3',\n })\n\n expect(await findOption({ dcId: 2, allowMedia: true })).toMatchObject({\n id: 2,\n ipAddress: '2.2.2.2',\n })\n })\n\n it('should respect preferMedia flag', async () => {\n useDcOptions([\n createStub('dcOption', { id: 2, ipAddress: '2.2.2.3' }),\n createStub('dcOption', { id: 2, ipAddress: '2.2.2.2', mediaOnly: true }),\n ])\n\n expect(await findOption({ dcId: 2 })).toMatchObject({\n id: 2,\n ipAddress: '2.2.2.3',\n })\n\n expect(await findOption({ dcId: 2, allowMedia: true, preferMedia: true })).toMatchObject({\n id: 2,\n ipAddress: '2.2.2.2',\n })\n })\n\n it('should respect allowIpv6 flag', async () => {\n useDcOptions([\n createStub('dcOption', { id: 2, ipAddress: '::1', ipv6: true }),\n createStub('dcOption', { id: 2, ipAddress: '2.2.2.3' }),\n ])\n\n expect(await findOption({ dcId: 2 })).toMatchObject({\n id: 2,\n ipAddress: '2.2.2.3',\n })\n\n expect(await findOption({ dcId: 2, allowIpv6: true })).toMatchObject({\n id: 2,\n ipAddress: '::1',\n })\n })\n\n it('should respect preferIpv6 flag', async () => {\n useDcOptions([\n createStub('dcOption', { id: 2, ipAddress: '2.2.2.3' }),\n createStub('dcOption', { id: 2, ipAddress: '::1', ipv6: true }),\n ])\n\n expect(await findOption({ dcId: 2 })).toMatchObject({\n id: 2,\n ipAddress: '2.2.2.3',\n })\n\n expect(await findOption({ dcId: 2, allowIpv6: true, preferIpv6: true })).toMatchObject({\n id: 2,\n ipAddress: '::1',\n })\n })\n })\n})\n"]}
@@ -1,4 +1,4 @@
1
- export { ConnectionKind, NetworkManagerExtraParams, RpcCallOptions } from './network-manager.js';
1
+ export type { ConnectionKind, NetworkManagerExtraParams, RpcCallOptions } from './network-manager.js';
2
2
  export * from './reconnection.js';
3
3
  export * from './session-connection.js';
4
4
  export * from './transports/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/network/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AACA,oDAAiC;AACjC,0DAAuC;AACvC,wDAAqC","sourcesContent":["export { ConnectionKind, NetworkManagerExtraParams, RpcCallOptions } from './network-manager.js'\nexport * from './reconnection.js'\nexport * from './session-connection.js'\nexport * from './transports/index.js'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/network/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AACA,oDAAiC;AACjC,0DAAuC;AACvC,wDAAqC","sourcesContent":["export type { ConnectionKind, NetworkManagerExtraParams, RpcCallOptions } from './network-manager.js'\nexport * from './reconnection.js'\nexport * from './session-connection.js'\nexport * from './transports/index.js'\n"]}
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.MultiSessionConnection = void 0;
7
7
  const events_1 = __importDefault(require("events"));
8
+ const index_js_1 = require("../utils/index.js");
8
9
  const mtproto_session_js_1 = require("./mtproto-session.js");
9
10
  const session_connection_js_1 = require("./session-connection.js");
10
11
  class MultiSessionConnection extends events_1.default {
@@ -98,8 +99,19 @@ class MultiSessionConnection extends events_1.default {
98
99
  return;
99
100
  }
100
101
  if (enforcePfsChanged) {
101
- this._connections.forEach((conn) => {
102
- conn.setUsePfs(this.params.usePfs || this._enforcePfs);
102
+ // we need to fetch new auth keys first
103
+ const promise = (0, index_js_1.createControllablePromise)();
104
+ this.emit('request-keys', promise);
105
+ promise
106
+ .then(() => {
107
+ this._connections.forEach((conn) => {
108
+ conn.setUsePfs(this.params.usePfs || this._enforcePfs);
109
+ if (connect)
110
+ conn.connect();
111
+ });
112
+ })
113
+ .catch((err) => {
114
+ this.emit('error', err);
103
115
  });
104
116
  }
105
117
  // create new connections
@@ -112,7 +124,7 @@ class MultiSessionConnection extends events_1.default {
112
124
  isMainConnection: this.params.isMainConnection && i === 0,
113
125
  withUpdates: this.params.isMainConnection && this.params.isMainDcConnection && !this.params.disableUpdates,
114
126
  }, session);
115
- if (this.params.isMainConnection) {
127
+ if (this.params.isMainConnection && this.params.isMainDcConnection) {
116
128
  conn.on('update', (update) => this.emit('update', update));
117
129
  }
118
130
  conn.on('error', (err) => this.emit('error', err, conn));
@@ -143,7 +155,8 @@ class MultiSessionConnection extends events_1.default {
143
155
  this._connections.forEach((it) => it.flushWhenIdle());
144
156
  });
145
157
  this._connections.push(conn);
146
- if (connect)
158
+ // if enforcePfsChanged, we need to connect after setting the new auth key
159
+ if (connect && !enforcePfsChanged)
147
160
  conn.connect();
148
161
  }
149
162
  }
@@ -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 { tl } from '@mtcute/tl'\n\nimport { 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 )\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()\n }\n\n this._connections.splice(this._count)\n\n return\n }\n\n if (enforcePfsChanged) {\n this._connections.forEach((conn) => {\n conn.setUsePfs(this.params.usePfs || this._enforcePfs)\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) {\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('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('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 (connect) conn.connect()\n }\n }\n\n _destroyed = false\n destroy(): void {\n this._connections.forEach((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 stack?: string,\n timeout?: number,\n abortSignal?: AbortSignal,\n ): Promise<tl.RpcCallReturn[T['_']]> {\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, stack, timeout, abortSignal)\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 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 { 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 )\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()\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('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('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 destroy(): void {\n this._connections.forEach((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 stack?: string,\n timeout?: number,\n abortSignal?: AbortSignal,\n ): Promise<tl.RpcCallReturn[T['_']]> {\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, stack, timeout, abortSignal)\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 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"]}
@@ -143,7 +143,7 @@ export declare class DcConnectionManager {
143
143
  private _setupMulti;
144
144
  setIsPrimary(isPrimary: boolean): void;
145
145
  setIsPremium(isPremium: boolean): void;
146
- loadKeys(): Promise<boolean>;
146
+ loadKeys(forcePfs?: boolean): Promise<boolean>;
147
147
  }
148
148
  /**
149
149
  * Class that manages all connections to Telegram servers.
@@ -144,6 +144,12 @@ class DcConnectionManager {
144
144
  connection.on('request-auth', () => {
145
145
  this.main.requestAuth();
146
146
  });
147
+ // fucking awesome architecture, but whatever
148
+ connection.on('request-keys', (promise) => {
149
+ this.loadKeys(true)
150
+ .then(() => promise.resolve())
151
+ .catch((e) => promise.reject(e));
152
+ });
147
153
  connection.on('error', (err, conn) => {
148
154
  this.manager.params._emitError(err, conn);
149
155
  });
@@ -152,6 +158,7 @@ class DcConnectionManager {
152
158
  if (this.isPrimary === isPrimary)
153
159
  return;
154
160
  this.isPrimary = isPrimary;
161
+ this.main.params.isMainDcConnection = isPrimary;
155
162
  if (isPrimary) {
156
163
  this.main.setInactivityTimeout(undefined);
157
164
  }
@@ -164,7 +171,7 @@ class DcConnectionManager {
164
171
  this.download.setCount(this.manager._connectionCount('download', this.dcId, isPremium));
165
172
  this.downloadSmall.setCount(this.manager._connectionCount('downloadSmall', this.dcId, isPremium));
166
173
  }
167
- async loadKeys() {
174
+ async loadKeys(forcePfs = false) {
168
175
  const permanent = await this.manager._storage.getAuthKeyFor(this.dcId);
169
176
  this.main.setAuthKey(permanent);
170
177
  this.upload.setAuthKey(permanent);
@@ -173,7 +180,7 @@ class DcConnectionManager {
173
180
  if (!permanent) {
174
181
  return false;
175
182
  }
176
- if (this.manager.params.usePfs) {
183
+ if (this.manager.params.usePfs || forcePfs) {
177
184
  await Promise.all(this.main._sessions.map(async (_, i) => {
178
185
  const temp = await this.manager._storage.getAuthKeyFor(this.dcId, i);
179
186
  this.main.setAuthKey(temp, true, i);
@@ -219,7 +226,7 @@ class NetworkManager {
219
226
  _: 'initConnection',
220
227
  deviceModel,
221
228
  systemVersion: '1.0',
222
- appVersion: '0.1.1',
229
+ appVersion: '0.2.0',
223
230
  systemLangCode: 'en',
224
231
  langPack: '',
225
232
  langCode: 'en',
@@ -327,7 +334,7 @@ class NetworkManager {
327
334
  // shouldn't happen
328
335
  throw new index_js_1.MtArgumentError('DC manager already exists');
329
336
  }
330
- const dc = new DcConnectionManager(this, defaultDcs.main.id, defaultDcs);
337
+ const dc = new DcConnectionManager(this, defaultDcs.main.id, defaultDcs, true);
331
338
  this._dcConnections.set(defaultDcs.main.id, dc);
332
339
  await this._switchPrimaryDc(dc);
333
340
  }
@@ -394,7 +401,7 @@ class NetworkManager {
394
401
  return;
395
402
  const options = await this._findDcOptions(newDc);
396
403
  if (!this._dcConnections.has(newDc)) {
397
- this._dcConnections.set(newDc, new DcConnectionManager(this, newDc, options));
404
+ this._dcConnections.set(newDc, new DcConnectionManager(this, newDc, options, true));
398
405
  }
399
406
  await this._storage.setDefaultDcs(options);
400
407
  await this._switchPrimaryDc(this._dcConnections.get(newDc));