@mtcute/core 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (461) hide show
  1. package/cjs/base-client.js +4 -1
  2. package/cjs/base-client.js.map +1 -1
  3. package/cjs/network/auth-key.d.ts +3 -3
  4. package/cjs/network/auth-key.js +12 -12
  5. package/cjs/network/auth-key.js.map +1 -1
  6. package/cjs/network/auth-key.test.d.ts +1 -0
  7. package/cjs/network/auth-key.test.js +111 -0
  8. package/cjs/network/auth-key.test.js.map +1 -0
  9. package/cjs/network/authorization.js +62 -57
  10. package/cjs/network/authorization.js.map +1 -1
  11. package/cjs/network/config-manager.js +2 -1
  12. package/cjs/network/config-manager.js.map +1 -1
  13. package/cjs/network/config-manager.test.d.ts +1 -0
  14. package/cjs/network/config-manager.test.js +170 -0
  15. package/cjs/network/config-manager.test.js.map +1 -0
  16. package/cjs/network/mtproto-session.d.ts +2 -2
  17. package/cjs/network/mtproto-session.js +2 -2
  18. package/cjs/network/mtproto-session.js.map +1 -1
  19. package/cjs/network/multi-session-connection.d.ts +1 -1
  20. package/cjs/network/multi-session-connection.js +2 -2
  21. package/cjs/network/multi-session-connection.js.map +1 -1
  22. package/cjs/network/network-manager.d.ts +1 -0
  23. package/cjs/network/network-manager.js +21 -27
  24. package/cjs/network/network-manager.js.map +1 -1
  25. package/cjs/network/persistent-connection.test.d.ts +1 -0
  26. package/cjs/network/persistent-connection.test.js +157 -0
  27. package/cjs/network/persistent-connection.test.js.map +1 -0
  28. package/cjs/network/session-connection.d.ts +2 -1
  29. package/cjs/network/session-connection.js +51 -37
  30. package/cjs/network/session-connection.js.map +1 -1
  31. package/cjs/network/transports/intermediate.d.ts +3 -0
  32. package/cjs/network/transports/intermediate.js +5 -3
  33. package/cjs/network/transports/intermediate.js.map +1 -1
  34. package/cjs/network/transports/intermediate.test.d.ts +1 -0
  35. package/cjs/network/transports/intermediate.test.js +86 -0
  36. package/cjs/network/transports/intermediate.test.js.map +1 -0
  37. package/cjs/network/transports/obfuscated.js +15 -19
  38. package/cjs/network/transports/obfuscated.js.map +1 -1
  39. package/cjs/network/transports/obfuscated.test.d.ts +1 -0
  40. package/cjs/network/transports/obfuscated.test.js +131 -0
  41. package/cjs/network/transports/obfuscated.test.js.map +1 -0
  42. package/cjs/network/transports/tcp.js +1 -1
  43. package/cjs/network/transports/tcp.js.map +1 -1
  44. package/cjs/network/transports/tcp.test.d.ts +1 -0
  45. package/cjs/network/transports/tcp.test.js +97 -0
  46. package/cjs/network/transports/tcp.test.js.map +1 -0
  47. package/cjs/network/transports/websocket.test.d.ts +1 -0
  48. package/cjs/network/transports/websocket.test.js +91 -0
  49. package/cjs/network/transports/websocket.test.js.map +1 -0
  50. package/cjs/storage/abstract.d.ts +23 -2
  51. package/cjs/storage/abstract.js.map +1 -1
  52. package/cjs/storage/json.js +8 -9
  53. package/cjs/storage/json.js.map +1 -1
  54. package/cjs/storage/json.test.d.ts +1 -0
  55. package/cjs/storage/json.test.js +37 -0
  56. package/cjs/storage/json.test.js.map +1 -0
  57. package/cjs/storage/localstorage.js +5 -2
  58. package/cjs/storage/localstorage.js.map +1 -1
  59. package/cjs/storage/localstorage.test.d.ts +1 -0
  60. package/cjs/storage/localstorage.test.js +23 -0
  61. package/cjs/storage/localstorage.test.js.map +1 -0
  62. package/cjs/storage/memory.d.ts +7 -8
  63. package/cjs/storage/memory.js +7 -7
  64. package/cjs/storage/memory.js.map +1 -1
  65. package/cjs/storage/memory.test.d.ts +1 -0
  66. package/cjs/storage/memory.test.js +47 -0
  67. package/cjs/storage/memory.test.js.map +1 -0
  68. package/cjs/utils/async-lock.test.d.ts +1 -0
  69. package/cjs/utils/async-lock.test.js +25 -0
  70. package/cjs/utils/async-lock.test.js.map +1 -0
  71. package/cjs/utils/bigint-utils.d.ts +18 -11
  72. package/cjs/utils/bigint-utils.js +148 -47
  73. package/cjs/utils/bigint-utils.js.map +1 -1
  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.d.ts +7 -1
  78. package/cjs/utils/buffer-utils.js +16 -3
  79. package/cjs/utils/buffer-utils.js.map +1 -1
  80. package/cjs/utils/buffer-utils.test.d.ts +1 -0
  81. package/cjs/utils/buffer-utils.test.js +69 -0
  82. package/cjs/utils/buffer-utils.test.js.map +1 -0
  83. package/cjs/utils/condition-variable.test.d.ts +1 -0
  84. package/cjs/utils/condition-variable.test.js +27 -0
  85. package/cjs/utils/condition-variable.test.js.map +1 -0
  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/abstract.d.ts +16 -9
  90. package/cjs/utils/crypto/abstract.js +6 -9
  91. package/cjs/utils/crypto/abstract.js.map +1 -1
  92. package/cjs/utils/crypto/factorization.d.ts +2 -1
  93. package/cjs/utils/crypto/factorization.js +28 -36
  94. package/cjs/utils/crypto/factorization.js.map +1 -1
  95. package/cjs/utils/crypto/index.d.ts +4 -0
  96. package/cjs/utils/crypto/index.js +4 -0
  97. package/cjs/utils/crypto/index.js.map +1 -1
  98. package/cjs/utils/crypto/keys.d.ts +2 -2
  99. package/cjs/utils/crypto/keys.js +4 -4
  100. package/cjs/utils/crypto/keys.js.map +1 -1
  101. package/cjs/utils/crypto/keys.test.d.ts +1 -0
  102. package/cjs/utils/crypto/keys.test.js +40 -0
  103. package/cjs/utils/crypto/keys.test.js.map +1 -0
  104. package/cjs/utils/crypto/miller-rabin.d.ts +2 -2
  105. package/cjs/utils/crypto/miller-rabin.js +20 -22
  106. package/cjs/utils/crypto/miller-rabin.js.map +1 -1
  107. package/cjs/utils/crypto/miller-rabin.test.d.ts +1 -0
  108. package/cjs/utils/crypto/miller-rabin.test.js +60 -0
  109. package/cjs/utils/crypto/miller-rabin.test.js.map +1 -0
  110. package/cjs/utils/crypto/mtproto.d.ts +3 -3
  111. package/cjs/utils/crypto/mtproto.js +12 -12
  112. package/cjs/utils/crypto/mtproto.js.map +1 -1
  113. package/cjs/utils/crypto/mtproto.test.d.ts +1 -0
  114. package/cjs/utils/crypto/mtproto.test.js +47 -0
  115. package/cjs/utils/crypto/mtproto.test.js.map +1 -0
  116. package/cjs/utils/crypto/node.d.ts +21 -0
  117. package/cjs/utils/crypto/node.js +74 -0
  118. package/cjs/utils/crypto/node.js.map +1 -0
  119. package/cjs/utils/crypto/node.test.d.ts +1 -0
  120. package/cjs/utils/crypto/node.test.js +13 -0
  121. package/cjs/utils/crypto/node.test.js.map +1 -0
  122. package/cjs/utils/crypto/password.js +22 -33
  123. package/cjs/utils/crypto/password.js.map +1 -1
  124. package/cjs/utils/crypto/password.test.d.ts +1 -0
  125. package/cjs/utils/crypto/password.test.js +95 -0
  126. package/cjs/utils/crypto/password.test.js.map +1 -0
  127. package/cjs/utils/crypto/utils.test.d.ts +1 -0
  128. package/cjs/utils/crypto/utils.test.js +49 -0
  129. package/cjs/utils/crypto/utils.test.js.map +1 -0
  130. package/cjs/utils/crypto/wasm.d.ts +22 -0
  131. package/cjs/utils/crypto/wasm.js +41 -0
  132. package/cjs/utils/crypto/wasm.js.map +1 -0
  133. package/cjs/utils/crypto/web.d.ts +11 -0
  134. package/cjs/utils/crypto/web.js +40 -0
  135. package/cjs/utils/crypto/web.js.map +1 -0
  136. package/cjs/utils/crypto/web.test.d.ts +1 -0
  137. package/cjs/utils/crypto/web.test.js +17 -0
  138. package/cjs/utils/crypto/web.test.js.map +1 -0
  139. package/cjs/utils/deque.d.ts +1 -1
  140. package/cjs/utils/deque.js +9 -3
  141. package/cjs/utils/deque.js.map +1 -1
  142. package/cjs/utils/deque.test.d.ts +1 -0
  143. package/cjs/utils/deque.test.js +128 -0
  144. package/cjs/utils/deque.test.js.map +1 -0
  145. package/cjs/utils/function-utils.d.ts +4 -1
  146. package/cjs/utils/function-utils.js +8 -1
  147. package/cjs/utils/function-utils.js.map +1 -1
  148. package/cjs/utils/function-utils.test.d.ts +1 -0
  149. package/cjs/utils/function-utils.test.js +23 -0
  150. package/cjs/utils/function-utils.test.js.map +1 -0
  151. package/cjs/utils/index.d.ts +0 -1
  152. package/cjs/utils/index.js +0 -1
  153. package/cjs/utils/index.js.map +1 -1
  154. package/cjs/utils/linked-list.test.d.ts +1 -0
  155. package/cjs/utils/linked-list.test.js +36 -0
  156. package/cjs/utils/linked-list.test.js.map +1 -0
  157. package/cjs/utils/links/bots.test.d.ts +1 -0
  158. package/cjs/utils/links/bots.test.js +152 -0
  159. package/cjs/utils/links/bots.test.js.map +1 -0
  160. package/cjs/utils/links/chat.test.d.ts +1 -0
  161. package/cjs/utils/links/chat.test.js +84 -0
  162. package/cjs/utils/links/chat.test.js.map +1 -0
  163. package/cjs/utils/links/misc.test.d.ts +1 -0
  164. package/cjs/utils/links/misc.test.js +153 -0
  165. package/cjs/utils/links/misc.test.js.map +1 -0
  166. package/cjs/utils/links/proxy.test.d.ts +1 -0
  167. package/cjs/utils/links/proxy.test.js +74 -0
  168. package/cjs/utils/links/proxy.test.js.map +1 -0
  169. package/cjs/utils/links/user.test.d.ts +1 -0
  170. package/cjs/utils/links/user.test.js +63 -0
  171. package/cjs/utils/links/user.test.js.map +1 -0
  172. package/cjs/utils/logger.d.ts +0 -1
  173. package/cjs/utils/logger.js +3 -4
  174. package/cjs/utils/logger.js.map +1 -1
  175. package/cjs/utils/logger.test.d.ts +1 -0
  176. package/cjs/utils/logger.test.js +125 -0
  177. package/cjs/utils/logger.test.js.map +1 -0
  178. package/cjs/utils/long-utils.test.d.ts +1 -0
  179. package/cjs/utils/long-utils.test.js +158 -0
  180. package/cjs/utils/long-utils.test.js.map +1 -0
  181. package/cjs/utils/lru-map.d.ts +1 -0
  182. package/cjs/utils/lru-map.js +6 -0
  183. package/cjs/utils/lru-map.js.map +1 -1
  184. package/cjs/utils/lru-map.test.d.ts +1 -0
  185. package/cjs/utils/lru-map.test.js +96 -0
  186. package/cjs/utils/lru-map.test.js.map +1 -0
  187. package/cjs/utils/lru-set.test.d.ts +1 -0
  188. package/cjs/utils/lru-set.test.js +77 -0
  189. package/cjs/utils/lru-set.test.js.map +1 -0
  190. package/cjs/utils/peer-utils.js +5 -1
  191. package/cjs/utils/peer-utils.js.map +1 -1
  192. package/cjs/utils/peer-utils.test.d.ts +1 -0
  193. package/cjs/utils/peer-utils.test.js +122 -0
  194. package/cjs/utils/peer-utils.test.js.map +1 -0
  195. package/cjs/utils/platform/crypto.js +2 -2
  196. package/cjs/utils/platform/crypto.js.map +1 -1
  197. package/cjs/utils/platform/crypto.web.js +2 -2
  198. package/cjs/utils/platform/crypto.web.js.map +1 -1
  199. package/cjs/utils/sorted-array.test.d.ts +1 -0
  200. package/cjs/utils/sorted-array.test.js +66 -0
  201. package/cjs/utils/sorted-array.test.js.map +1 -0
  202. package/cjs/utils/string-session.js +4 -2
  203. package/cjs/utils/string-session.js.map +1 -1
  204. package/cjs/utils/string-session.test.d.ts +1 -0
  205. package/cjs/utils/string-session.test.js +106 -0
  206. package/cjs/utils/string-session.test.js.map +1 -0
  207. package/cjs/utils/tl-json.test.d.ts +1 -0
  208. package/cjs/utils/tl-json.test.js +83 -0
  209. package/cjs/utils/tl-json.test.js.map +1 -0
  210. package/cjs/utils/type-assertions.test.d.ts +1 -0
  211. package/cjs/utils/type-assertions.test.js +67 -0
  212. package/cjs/utils/type-assertions.test.js.map +1 -0
  213. package/esm/base-client.js +4 -1
  214. package/esm/base-client.js.map +1 -1
  215. package/esm/network/auth-key.d.ts +3 -3
  216. package/esm/network/auth-key.js +13 -13
  217. package/esm/network/auth-key.js.map +1 -1
  218. package/esm/network/auth-key.test.d.ts +1 -0
  219. package/esm/network/auth-key.test.js +106 -0
  220. package/esm/network/auth-key.test.js.map +1 -0
  221. package/esm/network/authorization.js +64 -59
  222. package/esm/network/authorization.js.map +1 -1
  223. package/esm/network/config-manager.js +2 -1
  224. package/esm/network/config-manager.js.map +1 -1
  225. package/esm/network/config-manager.test.d.ts +1 -0
  226. package/esm/network/config-manager.test.js +168 -0
  227. package/esm/network/config-manager.test.js.map +1 -0
  228. package/esm/network/mtproto-session.d.ts +2 -2
  229. package/esm/network/mtproto-session.js +2 -2
  230. package/esm/network/mtproto-session.js.map +1 -1
  231. package/esm/network/multi-session-connection.d.ts +1 -1
  232. package/esm/network/multi-session-connection.js +2 -2
  233. package/esm/network/multi-session-connection.js.map +1 -1
  234. package/esm/network/network-manager.d.ts +1 -0
  235. package/esm/network/network-manager.js +21 -27
  236. package/esm/network/network-manager.js.map +1 -1
  237. package/esm/network/persistent-connection.test.d.ts +1 -0
  238. package/esm/network/persistent-connection.test.js +155 -0
  239. package/esm/network/persistent-connection.test.js.map +1 -0
  240. package/esm/network/session-connection.d.ts +2 -1
  241. package/esm/network/session-connection.js +53 -39
  242. package/esm/network/session-connection.js.map +1 -1
  243. package/esm/network/transports/intermediate.d.ts +3 -0
  244. package/esm/network/transports/intermediate.js +6 -4
  245. package/esm/network/transports/intermediate.js.map +1 -1
  246. package/esm/network/transports/intermediate.test.d.ts +1 -0
  247. package/esm/network/transports/intermediate.test.js +84 -0
  248. package/esm/network/transports/intermediate.test.js.map +1 -0
  249. package/esm/network/transports/obfuscated.js +16 -20
  250. package/esm/network/transports/obfuscated.js.map +1 -1
  251. package/esm/network/transports/obfuscated.test.d.ts +1 -0
  252. package/esm/network/transports/obfuscated.test.js +129 -0
  253. package/esm/network/transports/obfuscated.test.js.map +1 -0
  254. package/esm/network/transports/tcp.js +1 -1
  255. package/esm/network/transports/tcp.js.map +1 -1
  256. package/esm/network/transports/tcp.test.d.ts +1 -0
  257. package/esm/network/transports/tcp.test.js +95 -0
  258. package/esm/network/transports/tcp.test.js.map +1 -0
  259. package/esm/network/transports/websocket.test.d.ts +1 -0
  260. package/esm/network/transports/websocket.test.js +89 -0
  261. package/esm/network/transports/websocket.test.js.map +1 -0
  262. package/esm/storage/abstract.d.ts +23 -2
  263. package/esm/storage/abstract.js.map +1 -1
  264. package/esm/storage/json.js +8 -9
  265. package/esm/storage/json.js.map +1 -1
  266. package/esm/storage/json.test.d.ts +1 -0
  267. package/esm/storage/json.test.js +35 -0
  268. package/esm/storage/json.test.js.map +1 -0
  269. package/esm/storage/localstorage.js +5 -2
  270. package/esm/storage/localstorage.js.map +1 -1
  271. package/esm/storage/localstorage.test.d.ts +1 -0
  272. package/esm/storage/localstorage.test.js +21 -0
  273. package/esm/storage/localstorage.test.js.map +1 -0
  274. package/esm/storage/memory.d.ts +7 -8
  275. package/esm/storage/memory.js +7 -7
  276. package/esm/storage/memory.js.map +1 -1
  277. package/esm/storage/memory.test.d.ts +1 -0
  278. package/esm/storage/memory.test.js +45 -0
  279. package/esm/storage/memory.test.js.map +1 -0
  280. package/esm/utils/async-lock.test.d.ts +1 -0
  281. package/esm/utils/async-lock.test.js +23 -0
  282. package/esm/utils/async-lock.test.js.map +1 -0
  283. package/esm/utils/bigint-utils.d.ts +18 -11
  284. package/esm/utils/bigint-utils.js +142 -44
  285. package/esm/utils/bigint-utils.js.map +1 -1
  286. package/esm/utils/bigint-utils.test.d.ts +1 -0
  287. package/esm/utils/bigint-utils.test.js +148 -0
  288. package/esm/utils/bigint-utils.test.js.map +1 -0
  289. package/esm/utils/buffer-utils.d.ts +7 -1
  290. package/esm/utils/buffer-utils.js +14 -1
  291. package/esm/utils/buffer-utils.js.map +1 -1
  292. package/esm/utils/buffer-utils.test.d.ts +1 -0
  293. package/esm/utils/buffer-utils.test.js +67 -0
  294. package/esm/utils/buffer-utils.test.js.map +1 -0
  295. package/esm/utils/condition-variable.test.d.ts +1 -0
  296. package/esm/utils/condition-variable.test.js +25 -0
  297. package/esm/utils/condition-variable.test.js.map +1 -0
  298. package/esm/utils/controllable-promise.test.d.ts +1 -0
  299. package/esm/utils/controllable-promise.test.js +15 -0
  300. package/esm/utils/controllable-promise.test.js.map +1 -0
  301. package/esm/utils/crypto/abstract.d.ts +16 -9
  302. package/esm/utils/crypto/abstract.js +6 -9
  303. package/esm/utils/crypto/abstract.js.map +1 -1
  304. package/esm/utils/crypto/factorization.d.ts +2 -1
  305. package/esm/utils/crypto/factorization.js +29 -34
  306. package/esm/utils/crypto/factorization.js.map +1 -1
  307. package/esm/utils/crypto/index.d.ts +4 -0
  308. package/esm/utils/crypto/index.js +4 -0
  309. package/esm/utils/crypto/index.js.map +1 -1
  310. package/esm/utils/crypto/keys.d.ts +2 -2
  311. package/esm/utils/crypto/keys.js +4 -4
  312. package/esm/utils/crypto/keys.js.map +1 -1
  313. package/esm/utils/crypto/keys.test.d.ts +1 -0
  314. package/esm/utils/crypto/keys.test.js +38 -0
  315. package/esm/utils/crypto/keys.test.js.map +1 -0
  316. package/esm/utils/crypto/miller-rabin.d.ts +2 -2
  317. package/esm/utils/crypto/miller-rabin.js +21 -20
  318. package/esm/utils/crypto/miller-rabin.js.map +1 -1
  319. package/esm/utils/crypto/miller-rabin.test.d.ts +1 -0
  320. package/esm/utils/crypto/miller-rabin.test.js +58 -0
  321. package/esm/utils/crypto/miller-rabin.test.js.map +1 -0
  322. package/esm/utils/crypto/mtproto.d.ts +3 -3
  323. package/esm/utils/crypto/mtproto.js +12 -12
  324. package/esm/utils/crypto/mtproto.js.map +1 -1
  325. package/esm/utils/crypto/mtproto.test.d.ts +1 -0
  326. package/esm/utils/crypto/mtproto.test.js +45 -0
  327. package/esm/utils/crypto/mtproto.test.js.map +1 -0
  328. package/esm/utils/crypto/node.d.ts +21 -0
  329. package/esm/utils/crypto/node.js +69 -0
  330. package/esm/utils/crypto/node.js.map +1 -0
  331. package/esm/utils/crypto/node.test.d.ts +1 -0
  332. package/esm/utils/crypto/node.test.js +11 -0
  333. package/esm/utils/crypto/node.test.js.map +1 -0
  334. package/esm/utils/crypto/password.js +24 -32
  335. package/esm/utils/crypto/password.js.map +1 -1
  336. package/esm/utils/crypto/password.test.d.ts +1 -0
  337. package/esm/utils/crypto/password.test.js +90 -0
  338. package/esm/utils/crypto/password.test.js.map +1 -0
  339. package/esm/utils/crypto/utils.test.d.ts +1 -0
  340. package/esm/utils/crypto/utils.test.js +47 -0
  341. package/esm/utils/crypto/utils.test.js.map +1 -0
  342. package/esm/utils/crypto/wasm.d.ts +22 -0
  343. package/esm/utils/crypto/wasm.js +37 -0
  344. package/esm/utils/crypto/wasm.js.map +1 -0
  345. package/esm/utils/crypto/web.d.ts +11 -0
  346. package/esm/utils/crypto/web.js +36 -0
  347. package/esm/utils/crypto/web.js.map +1 -0
  348. package/esm/utils/crypto/web.test.d.ts +1 -0
  349. package/esm/utils/crypto/web.test.js +15 -0
  350. package/esm/utils/crypto/web.test.js.map +1 -0
  351. package/esm/utils/deque.d.ts +1 -1
  352. package/esm/utils/deque.js +9 -3
  353. package/esm/utils/deque.js.map +1 -1
  354. package/esm/utils/deque.test.d.ts +1 -0
  355. package/esm/utils/deque.test.js +126 -0
  356. package/esm/utils/deque.test.js.map +1 -0
  357. package/esm/utils/function-utils.d.ts +4 -1
  358. package/esm/utils/function-utils.js +8 -1
  359. package/esm/utils/function-utils.js.map +1 -1
  360. package/esm/utils/function-utils.test.d.ts +1 -0
  361. package/esm/utils/function-utils.test.js +21 -0
  362. package/esm/utils/function-utils.test.js.map +1 -0
  363. package/esm/utils/index.d.ts +0 -1
  364. package/esm/utils/index.js +0 -1
  365. package/esm/utils/index.js.map +1 -1
  366. package/esm/utils/linked-list.test.d.ts +1 -0
  367. package/esm/utils/linked-list.test.js +34 -0
  368. package/esm/utils/linked-list.test.js.map +1 -0
  369. package/esm/utils/links/bots.test.d.ts +1 -0
  370. package/esm/utils/links/bots.test.js +150 -0
  371. package/esm/utils/links/bots.test.js.map +1 -0
  372. package/esm/utils/links/chat.test.d.ts +1 -0
  373. package/esm/utils/links/chat.test.js +82 -0
  374. package/esm/utils/links/chat.test.js.map +1 -0
  375. package/esm/utils/links/misc.test.d.ts +1 -0
  376. package/esm/utils/links/misc.test.js +151 -0
  377. package/esm/utils/links/misc.test.js.map +1 -0
  378. package/esm/utils/links/proxy.test.d.ts +1 -0
  379. package/esm/utils/links/proxy.test.js +72 -0
  380. package/esm/utils/links/proxy.test.js.map +1 -0
  381. package/esm/utils/links/user.test.d.ts +1 -0
  382. package/esm/utils/links/user.test.js +61 -0
  383. package/esm/utils/links/user.test.js.map +1 -0
  384. package/esm/utils/logger.d.ts +0 -1
  385. package/esm/utils/logger.js +3 -4
  386. package/esm/utils/logger.js.map +1 -1
  387. package/esm/utils/logger.test.d.ts +1 -0
  388. package/esm/utils/logger.test.js +120 -0
  389. package/esm/utils/logger.test.js.map +1 -0
  390. package/esm/utils/long-utils.test.d.ts +1 -0
  391. package/esm/utils/long-utils.test.js +153 -0
  392. package/esm/utils/long-utils.test.js.map +1 -0
  393. package/esm/utils/lru-map.d.ts +1 -0
  394. package/esm/utils/lru-map.js +6 -0
  395. package/esm/utils/lru-map.js.map +1 -1
  396. package/esm/utils/lru-map.test.d.ts +1 -0
  397. package/esm/utils/lru-map.test.js +94 -0
  398. package/esm/utils/lru-map.test.js.map +1 -0
  399. package/esm/utils/lru-set.test.d.ts +1 -0
  400. package/esm/utils/lru-set.test.js +72 -0
  401. package/esm/utils/lru-set.test.js.map +1 -0
  402. package/esm/utils/peer-utils.js +5 -1
  403. package/esm/utils/peer-utils.js.map +1 -1
  404. package/esm/utils/peer-utils.test.d.ts +1 -0
  405. package/esm/utils/peer-utils.test.js +117 -0
  406. package/esm/utils/peer-utils.test.js.map +1 -0
  407. package/esm/utils/platform/crypto.js +1 -1
  408. package/esm/utils/platform/crypto.js.map +1 -1
  409. package/esm/utils/platform/crypto.web.js +2 -2
  410. package/esm/utils/platform/crypto.web.js.map +1 -1
  411. package/esm/utils/sorted-array.test.d.ts +1 -0
  412. package/esm/utils/sorted-array.test.js +64 -0
  413. package/esm/utils/sorted-array.test.js.map +1 -0
  414. package/esm/utils/string-session.js +4 -2
  415. package/esm/utils/string-session.js.map +1 -1
  416. package/esm/utils/string-session.test.d.ts +1 -0
  417. package/esm/utils/string-session.test.js +104 -0
  418. package/esm/utils/string-session.test.js.map +1 -0
  419. package/esm/utils/tl-json.test.d.ts +1 -0
  420. package/esm/utils/tl-json.test.js +81 -0
  421. package/esm/utils/tl-json.test.js.map +1 -0
  422. package/esm/utils/type-assertions.test.d.ts +1 -0
  423. package/esm/utils/type-assertions.test.js +65 -0
  424. package/esm/utils/type-assertions.test.js.map +1 -0
  425. package/package.json +4 -5
  426. package/cjs/utils/crypto/common.d.ts +0 -12
  427. package/cjs/utils/crypto/common.js +0 -54
  428. package/cjs/utils/crypto/common.js.map +0 -1
  429. package/cjs/utils/crypto/node-crypto.d.ts +0 -10
  430. package/cjs/utils/crypto/node-crypto.js +0 -46
  431. package/cjs/utils/crypto/node-crypto.js.map +0 -1
  432. package/cjs/utils/crypto/subtle.d.ts +0 -12
  433. package/cjs/utils/crypto/subtle.js +0 -86
  434. package/cjs/utils/crypto/subtle.js.map +0 -1
  435. package/cjs/utils/flood-control.d.ts +0 -14
  436. package/cjs/utils/flood-control.js +0 -65
  437. package/cjs/utils/flood-control.js.map +0 -1
  438. package/cjs/utils/platform/random.d.ts +0 -1
  439. package/cjs/utils/platform/random.js +0 -7
  440. package/cjs/utils/platform/random.js.map +0 -1
  441. package/cjs/utils/platform/random.web.d.ts +0 -1
  442. package/cjs/utils/platform/random.web.js +0 -10
  443. package/cjs/utils/platform/random.web.js.map +0 -1
  444. package/esm/utils/crypto/common.d.ts +0 -12
  445. package/esm/utils/crypto/common.js +0 -50
  446. package/esm/utils/crypto/common.js.map +0 -1
  447. package/esm/utils/crypto/node-crypto.d.ts +0 -10
  448. package/esm/utils/crypto/node-crypto.js +0 -42
  449. package/esm/utils/crypto/node-crypto.js.map +0 -1
  450. package/esm/utils/crypto/subtle.d.ts +0 -12
  451. package/esm/utils/crypto/subtle.js +0 -59
  452. package/esm/utils/crypto/subtle.js.map +0 -1
  453. package/esm/utils/flood-control.d.ts +0 -14
  454. package/esm/utils/flood-control.js +0 -61
  455. package/esm/utils/flood-control.js.map +0 -1
  456. package/esm/utils/platform/random.d.ts +0 -1
  457. package/esm/utils/platform/random.js +0 -4
  458. package/esm/utils/platform/random.js.map +0 -1
  459. package/esm/utils/platform/random.web.d.ts +0 -1
  460. package/esm/utils/platform/random.web.js +0 -6
  461. package/esm/utils/platform/random.web.js.map +0 -1
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,86 @@
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 tl_runtime_1 = require("@mtcute/tl-runtime");
6
+ const index_js_1 = require("../../index.js");
7
+ const index_js_2 = require("../../utils/index.js");
8
+ (0, vitest_1.describe)('IntermediatePacketCodec', () => {
9
+ (0, vitest_1.it)('should return correct tag', () => {
10
+ (0, vitest_1.expect)((0, tl_runtime_1.hexEncode)(new index_js_1.IntermediatePacketCodec().tag())).eq('eeeeeeee');
11
+ });
12
+ (0, vitest_1.it)('should correctly parse immediate framing', () => new Promise((done) => {
13
+ const codec = new index_js_1.IntermediatePacketCodec();
14
+ codec.on('packet', (data) => {
15
+ (0, vitest_1.expect)([...data]).eql([5, 1, 2, 3, 4]);
16
+ done();
17
+ });
18
+ codec.feed((0, tl_runtime_1.hexDecodeToBuffer)('050000000501020304'));
19
+ }));
20
+ (0, vitest_1.it)('should correctly parse incomplete framing', () => new Promise((done) => {
21
+ const codec = new index_js_1.IntermediatePacketCodec();
22
+ codec.on('packet', (data) => {
23
+ (0, vitest_1.expect)([...data]).eql([5, 1, 2, 3, 4]);
24
+ done();
25
+ });
26
+ codec.feed((0, tl_runtime_1.hexDecodeToBuffer)('050000000501'));
27
+ codec.feed((0, tl_runtime_1.hexDecodeToBuffer)('020304'));
28
+ }));
29
+ (0, vitest_1.it)('should correctly parse multiple streamed packets', () => new Promise((done) => {
30
+ const codec = new index_js_1.IntermediatePacketCodec();
31
+ let number = 0;
32
+ codec.on('packet', (data) => {
33
+ if (number === 0) {
34
+ (0, vitest_1.expect)([...data]).eql([5, 1, 2, 3, 4]);
35
+ number = 1;
36
+ }
37
+ else {
38
+ (0, vitest_1.expect)([...data]).eql([3, 1, 2, 3, 1]);
39
+ done();
40
+ }
41
+ });
42
+ codec.feed((0, tl_runtime_1.hexDecodeToBuffer)('050000000501'));
43
+ codec.feed((0, tl_runtime_1.hexDecodeToBuffer)('020304050000'));
44
+ codec.feed((0, tl_runtime_1.hexDecodeToBuffer)('000301020301'));
45
+ }));
46
+ (0, vitest_1.it)('should correctly parse transport errors', () => new Promise((done) => {
47
+ const codec = new index_js_1.IntermediatePacketCodec();
48
+ codec.on('error', (err) => {
49
+ (0, vitest_1.expect)(err).to.have.instanceOf(index_js_1.TransportError);
50
+ (0, vitest_1.expect)(err.code).eq(404);
51
+ done();
52
+ });
53
+ codec.feed((0, tl_runtime_1.hexDecodeToBuffer)('040000006cfeffff'));
54
+ }));
55
+ (0, vitest_1.it)('should reset when called reset()', () => new Promise((done) => {
56
+ const codec = new index_js_1.IntermediatePacketCodec();
57
+ codec.on('packet', (data) => {
58
+ (0, vitest_1.expect)([...data]).eql([1, 2, 3, 4, 5]);
59
+ done();
60
+ });
61
+ codec.feed((0, tl_runtime_1.hexDecodeToBuffer)('ff0000001234567812345678'));
62
+ codec.reset();
63
+ codec.feed((0, tl_runtime_1.hexDecodeToBuffer)('050000000102030405'));
64
+ }));
65
+ (0, vitest_1.it)('should correctly frame packets', () => {
66
+ const data = (0, tl_runtime_1.hexDecodeToBuffer)('6cfeffff');
67
+ // eslint-disable-next-line no-restricted-globals
68
+ (0, vitest_1.expect)(Buffer.from(new index_js_1.IntermediatePacketCodec().encode(data))).toEqual((0, index_js_2.concatBuffers)([new Uint8Array([0x04, 0x00, 0x00, 0x00]), data]));
69
+ });
70
+ });
71
+ (0, vitest_1.describe)('PaddedIntermediatePacketCodec', () => {
72
+ (0, test_1.useFakeMathRandom)();
73
+ const create = async () => {
74
+ const codec = new index_js_1.PaddedIntermediatePacketCodec();
75
+ codec.setup(await (0, test_1.defaultTestCryptoProvider)());
76
+ return codec;
77
+ };
78
+ (0, vitest_1.it)('should return correct tag', async () => {
79
+ (0, vitest_1.expect)((0, tl_runtime_1.hexEncode)((await create()).tag())).eq('dddddddd');
80
+ });
81
+ (0, vitest_1.it)('should correctly frame packets', async () => {
82
+ const data = (0, tl_runtime_1.hexDecodeToBuffer)('6cfeffff');
83
+ (0, vitest_1.expect)((0, tl_runtime_1.hexEncode)((await create()).encode(data))).toEqual('0a0000006cfeffff29afd26df40f');
84
+ });
85
+ });
86
+ //# sourceMappingURL=intermediate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intermediate.test.js","sourceRoot":"","sources":["../../../../src/network/transports/intermediate.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { defaultTestCryptoProvider, useFakeMathRandom } from '@mtcute/test'\nimport { hexDecodeToBuffer, hexEncode } from '@mtcute/tl-runtime'\n\nimport { IntermediatePacketCodec, PaddedIntermediatePacketCodec, TransportError } from '../../index.js'\nimport { concatBuffers } from '../../utils/index.js'\n\ndescribe('IntermediatePacketCodec', () => {\n it('should return correct tag', () => {\n expect(hexEncode(new IntermediatePacketCodec().tag())).eq('eeeeeeee')\n })\n\n it('should correctly parse immediate framing', () =>\n new Promise<void>((done) => {\n const codec = new IntermediatePacketCodec()\n codec.on('packet', (data: Uint8Array) => {\n expect([...data]).eql([5, 1, 2, 3, 4])\n done()\n })\n codec.feed(hexDecodeToBuffer('050000000501020304'))\n }))\n\n it('should correctly parse incomplete framing', () =>\n new Promise<void>((done) => {\n const codec = new IntermediatePacketCodec()\n codec.on('packet', (data: Uint8Array) => {\n expect([...data]).eql([5, 1, 2, 3, 4])\n done()\n })\n codec.feed(hexDecodeToBuffer('050000000501'))\n codec.feed(hexDecodeToBuffer('020304'))\n }))\n\n it('should correctly parse multiple streamed packets', () =>\n new Promise<void>((done) => {\n const codec = new IntermediatePacketCodec()\n\n let number = 0\n\n codec.on('packet', (data: Uint8Array) => {\n if (number === 0) {\n expect([...data]).eql([5, 1, 2, 3, 4])\n number = 1\n } else {\n expect([...data]).eql([3, 1, 2, 3, 1])\n done()\n }\n })\n codec.feed(hexDecodeToBuffer('050000000501'))\n codec.feed(hexDecodeToBuffer('020304050000'))\n codec.feed(hexDecodeToBuffer('000301020301'))\n }))\n\n it('should correctly parse transport errors', () =>\n new Promise<void>((done) => {\n const codec = new IntermediatePacketCodec()\n\n codec.on('error', (err: TransportError) => {\n expect(err).to.have.instanceOf(TransportError)\n expect(err.code).eq(404)\n done()\n })\n\n codec.feed(hexDecodeToBuffer('040000006cfeffff'))\n }))\n\n it('should reset when called reset()', () =>\n new Promise<void>((done) => {\n const codec = new IntermediatePacketCodec()\n\n codec.on('packet', (data: Uint8Array) => {\n expect([...data]).eql([1, 2, 3, 4, 5])\n done()\n })\n\n codec.feed(hexDecodeToBuffer('ff0000001234567812345678'))\n codec.reset()\n codec.feed(hexDecodeToBuffer('050000000102030405'))\n }))\n\n it('should correctly frame packets', () => {\n const data = hexDecodeToBuffer('6cfeffff')\n\n // eslint-disable-next-line no-restricted-globals\n expect(Buffer.from(new IntermediatePacketCodec().encode(data))).toEqual(\n concatBuffers([new Uint8Array([0x04, 0x00, 0x00, 0x00]), data]),\n )\n })\n})\n\ndescribe('PaddedIntermediatePacketCodec', () => {\n useFakeMathRandom()\n\n const create = async () => {\n const codec = new PaddedIntermediatePacketCodec()\n codec.setup!(await defaultTestCryptoProvider())\n\n return codec\n }\n\n it('should return correct tag', async () => {\n expect(hexEncode((await create()).tag())).eq('dddddddd')\n })\n\n it('should correctly frame packets', async () => {\n const data = hexDecodeToBuffer('6cfeffff')\n\n expect(hexEncode((await create()).encode(data))).toEqual('0a0000006cfeffff29afd26df40f')\n })\n})\n"]}
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ObfuscatedPacketCodec = void 0;
4
4
  const buffer_utils_js_1 = require("../../utils/buffer-utils.js");
5
- const index_js_1 = require("../../utils/index.js");
6
5
  const wrapped_js_1 = require("./wrapped.js");
7
6
  class ObfuscatedPacketCodec extends wrapped_js_1.WrappedCodec {
8
7
  constructor(inner, proxy) {
@@ -13,11 +12,11 @@ class ObfuscatedPacketCodec extends wrapped_js_1.WrappedCodec {
13
12
  let random;
14
13
  let dv;
15
14
  for (;;) {
16
- random = (0, index_js_1.randomBytes)(64);
15
+ random = this._crypto.randomBytes(64);
17
16
  if (random[0] === 0xef)
18
17
  continue;
19
18
  dv = (0, buffer_utils_js_1.dataViewFromBuffer)(random);
20
- const firstInt = dv.getInt32(0, true);
19
+ const firstInt = dv.getUint32(0, true);
21
20
  if (firstInt === 0x44414548 || // HEAD
22
21
  firstInt === 0x54534f50 || // POST
23
22
  firstInt === 0x20544547 || // GET(space)
@@ -46,37 +45,34 @@ class ObfuscatedPacketCodec extends wrapped_js_1.WrappedCodec {
46
45
  dcId = -dcId;
47
46
  dv.setInt16(60, dcId, true);
48
47
  }
49
- // randomBytes may return a Buffer in Node.js, whose .slice() doesn't copy
50
- const randomRev = Uint8Array.prototype.slice.call(random, 8, 56).reverse();
48
+ const randomRev = (0, buffer_utils_js_1.bufferToReversed)(random, 8, 56);
51
49
  let encryptKey = random.subarray(8, 40);
52
50
  const encryptIv = random.subarray(40, 56);
53
51
  let decryptKey = randomRev.subarray(0, 32);
54
52
  const decryptIv = randomRev.subarray(32, 48);
55
53
  if (this._proxy) {
56
- encryptKey = await this._crypto.sha256((0, buffer_utils_js_1.concatBuffers)([encryptKey, this._proxy.secret]));
57
- decryptKey = await this._crypto.sha256((0, buffer_utils_js_1.concatBuffers)([decryptKey, this._proxy.secret]));
54
+ encryptKey = this._crypto.sha256((0, buffer_utils_js_1.concatBuffers)([encryptKey, this._proxy.secret]));
55
+ decryptKey = this._crypto.sha256((0, buffer_utils_js_1.concatBuffers)([decryptKey, this._proxy.secret]));
58
56
  }
59
- this._encryptor = await this._crypto.createAesCtr(encryptKey, encryptIv, true);
60
- this._decryptor = await this._crypto.createAesCtr(decryptKey, decryptIv, false);
61
- const encrypted = await this._encryptor.encrypt(random);
57
+ this._encryptor = this._crypto.createAesCtr(encryptKey, encryptIv, true);
58
+ this._decryptor = this._crypto.createAesCtr(decryptKey, decryptIv, false);
59
+ const encrypted = this._encryptor.process(random);
62
60
  random.set(encrypted.subarray(56, 64), 56);
63
61
  return random;
64
62
  }
65
63
  async encode(packet) {
66
- return this._encryptor.encrypt(await this._inner.encode(packet));
64
+ return this._encryptor.process(await this._inner.encode(packet));
67
65
  }
68
66
  feed(data) {
69
- const dec = this._decryptor.decrypt(data);
70
- if (ArrayBuffer.isView(dec))
71
- this._inner.feed(dec);
72
- else {
73
- dec.then((dec) => this._inner.feed(dec)).catch((err) => this.emit('error', err));
74
- }
67
+ const dec = this._decryptor.process(data);
68
+ this._inner.feed(dec);
75
69
  }
76
70
  reset() {
77
71
  this._inner.reset();
78
- delete this._encryptor;
79
- delete this._decryptor;
72
+ this._encryptor?.close?.();
73
+ this._decryptor?.close?.();
74
+ this._encryptor = undefined;
75
+ this._decryptor = undefined;
80
76
  }
81
77
  }
82
78
  exports.ObfuscatedPacketCodec = ObfuscatedPacketCodec;
@@ -1 +1 @@
1
- {"version":3,"file":"obfuscated.js","sourceRoot":"","sources":["../../../../src/network/transports/obfuscated.ts"],"names":[],"mappings":"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","sourcesContent":["import { concatBuffers, dataViewFromBuffer } from '../../utils/buffer-utils.js'\nimport { IEncryptionScheme, randomBytes } from '../../utils/index.js'\nimport { IPacketCodec } from './abstract.js'\nimport { WrappedCodec } from './wrapped.js'\n\nexport interface MtProxyInfo {\n dcId: number\n secret: Uint8Array\n test: boolean\n media: boolean\n}\n\nexport class ObfuscatedPacketCodec extends WrappedCodec implements IPacketCodec {\n private _encryptor?: IEncryptionScheme\n private _decryptor?: IEncryptionScheme\n\n private _proxy?: MtProxyInfo\n\n constructor(inner: IPacketCodec, proxy?: MtProxyInfo) {\n super(inner)\n this._proxy = proxy\n }\n\n async tag(): Promise<Uint8Array> {\n let random: Uint8Array\n let dv: DataView\n\n for (;;) {\n random = randomBytes(64)\n if (random[0] === 0xef) continue\n\n dv = dataViewFromBuffer(random)\n const firstInt = dv.getInt32(0, true)\n\n if (\n firstInt === 0x44414548 || // HEAD\n firstInt === 0x54534f50 || // POST\n firstInt === 0x20544547 || // GET(space)\n firstInt === 0x4954504f || // OPTI\n firstInt === 0xdddddddd || // padded intermediate\n firstInt === 0xeeeeeeee || // intermediate\n firstInt === 0x02010316 // no idea, taken from tdlib\n ) {\n continue\n }\n if (dv.getInt32(4, true) === 0) continue\n\n break\n }\n\n let innerTag = await this._inner.tag()\n\n if (innerTag.length !== 4) {\n const b = innerTag[0]\n innerTag = new Uint8Array([b, b, b, b])\n }\n random.set(innerTag, 56)\n\n if (this._proxy) {\n let dcId = this._proxy.dcId\n if (this._proxy.test) dcId += 10000\n if (this._proxy.media) dcId = -dcId\n\n dv.setInt16(60, dcId, true)\n }\n\n // randomBytes may return a Buffer in Node.js, whose .slice() doesn't copy\n const randomRev = Uint8Array.prototype.slice.call(random, 8, 56).reverse()\n\n let encryptKey = random.subarray(8, 40)\n const encryptIv = random.subarray(40, 56)\n\n let decryptKey = randomRev.subarray(0, 32)\n const decryptIv = randomRev.subarray(32, 48)\n\n if (this._proxy) {\n encryptKey = await this._crypto.sha256(concatBuffers([encryptKey, this._proxy.secret]))\n decryptKey = await this._crypto.sha256(concatBuffers([decryptKey, this._proxy.secret]))\n }\n\n this._encryptor = await this._crypto.createAesCtr(encryptKey, encryptIv, true)\n this._decryptor = await this._crypto.createAesCtr(decryptKey, decryptIv, false)\n\n const encrypted = await this._encryptor.encrypt(random)\n random.set(encrypted.subarray(56, 64), 56)\n\n return random\n }\n\n async encode(packet: Uint8Array): Promise<Uint8Array> {\n return this._encryptor!.encrypt(await this._inner.encode(packet))\n }\n\n feed(data: Uint8Array): void {\n const dec = this._decryptor!.decrypt(data)\n\n if (ArrayBuffer.isView(dec)) this._inner.feed(dec)\n else {\n dec.then((dec) => this._inner.feed(dec)).catch((err) => this.emit('error', err))\n }\n }\n\n reset(): void {\n this._inner.reset()\n delete this._encryptor\n delete this._decryptor\n }\n}\n"]}
1
+ {"version":3,"file":"obfuscated.js","sourceRoot":"","sources":["../../../../src/network/transports/obfuscated.ts"],"names":[],"mappings":"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","sourcesContent":["import { bufferToReversed, concatBuffers, dataViewFromBuffer } from '../../utils/buffer-utils.js'\nimport { IAesCtr } from '../../utils/index.js'\nimport { IPacketCodec } from './abstract.js'\nimport { WrappedCodec } from './wrapped.js'\n\nexport interface MtProxyInfo {\n dcId: number\n secret: Uint8Array\n test: boolean\n media: boolean\n}\n\nexport class ObfuscatedPacketCodec extends WrappedCodec implements IPacketCodec {\n private _encryptor?: IAesCtr\n private _decryptor?: IAesCtr\n\n private _proxy?: MtProxyInfo\n\n constructor(inner: IPacketCodec, proxy?: MtProxyInfo) {\n super(inner)\n this._proxy = proxy\n }\n\n async tag(): Promise<Uint8Array> {\n let random: Uint8Array\n let dv: DataView\n\n for (;;) {\n random = this._crypto.randomBytes(64)\n if (random[0] === 0xef) continue\n\n dv = dataViewFromBuffer(random)\n const firstInt = dv.getUint32(0, true)\n\n if (\n firstInt === 0x44414548 || // HEAD\n firstInt === 0x54534f50 || // POST\n firstInt === 0x20544547 || // GET(space)\n firstInt === 0x4954504f || // OPTI\n firstInt === 0xdddddddd || // padded intermediate\n firstInt === 0xeeeeeeee || // intermediate\n firstInt === 0x02010316 // no idea, taken from tdlib\n ) {\n continue\n }\n if (dv.getInt32(4, true) === 0) continue\n\n break\n }\n\n let innerTag = await this._inner.tag()\n\n if (innerTag.length !== 4) {\n const b = innerTag[0]\n innerTag = new Uint8Array([b, b, b, b])\n }\n random.set(innerTag, 56)\n\n if (this._proxy) {\n let dcId = this._proxy.dcId\n if (this._proxy.test) dcId += 10000\n if (this._proxy.media) dcId = -dcId\n\n dv.setInt16(60, dcId, true)\n }\n\n const randomRev = bufferToReversed(random, 8, 56)\n\n let encryptKey = random.subarray(8, 40)\n const encryptIv = random.subarray(40, 56)\n\n let decryptKey = randomRev.subarray(0, 32)\n const decryptIv = randomRev.subarray(32, 48)\n\n if (this._proxy) {\n encryptKey = this._crypto.sha256(concatBuffers([encryptKey, this._proxy.secret]))\n decryptKey = this._crypto.sha256(concatBuffers([decryptKey, this._proxy.secret]))\n }\n\n this._encryptor = this._crypto.createAesCtr(encryptKey, encryptIv, true)\n this._decryptor = this._crypto.createAesCtr(decryptKey, decryptIv, false)\n\n const encrypted = this._encryptor.process(random)\n random.set(encrypted.subarray(56, 64), 56)\n\n return random\n }\n\n async encode(packet: Uint8Array): Promise<Uint8Array> {\n return this._encryptor!.process(await this._inner.encode(packet))\n }\n\n feed(data: Uint8Array): void {\n const dec = this._decryptor!.process(data)\n\n this._inner.feed(dec)\n }\n\n reset(): void {\n this._inner.reset()\n this._encryptor?.close?.()\n this._decryptor?.close?.()\n\n this._encryptor = undefined\n this._decryptor = undefined\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,131 @@
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 index_js_1 = require("../../utils/index.js");
6
+ const intermediate_js_1 = require("./intermediate.js");
7
+ const obfuscated_js_1 = require("./obfuscated.js");
8
+ (0, vitest_1.describe)('ObfuscatedPacketCodec', () => {
9
+ const create = async (randomSource, proxy) => {
10
+ const codec = new obfuscated_js_1.ObfuscatedPacketCodec(new intermediate_js_1.IntermediatePacketCodec(), proxy);
11
+ const crypto = await (0, test_1.defaultTestCryptoProvider)(randomSource);
12
+ codec.setup(crypto, new index_js_1.LogManager());
13
+ return [codec, crypto];
14
+ };
15
+ (0, vitest_1.describe)('tag', () => {
16
+ (0, vitest_1.it)('should correctly generate random initial payload', async () => {
17
+ const random = 'ff'.repeat(64);
18
+ const [codec] = await create(random);
19
+ const tag = await codec.tag();
20
+ (0, vitest_1.expect)((0, index_js_1.hexEncode)(tag)).toEqual('ff'.repeat(56) + 'fce8ab2203db2bff');
21
+ });
22
+ (0, vitest_1.describe)('mtproxy', () => {
23
+ (0, vitest_1.it)('should correctly generate random initial payload for prod dc', async () => {
24
+ const random = 'ff'.repeat(64);
25
+ const proxy = {
26
+ dcId: 1,
27
+ secret: new Uint8Array(16),
28
+ test: false,
29
+ media: false,
30
+ };
31
+ const [codec] = await create(random, proxy);
32
+ const tag = await codec.tag();
33
+ (0, vitest_1.expect)((0, index_js_1.hexEncode)(tag)).toEqual('ff'.repeat(56) + 'ecec4cbda8bb188b');
34
+ });
35
+ (0, vitest_1.it)('should correctly generate random initial payload for test dc', async () => {
36
+ const random = 'ff'.repeat(64);
37
+ const proxy = {
38
+ dcId: 1,
39
+ secret: new Uint8Array(16),
40
+ test: true,
41
+ media: false,
42
+ };
43
+ const [codec] = await create(random, proxy);
44
+ const tag = await codec.tag();
45
+ (0, vitest_1.expect)((0, index_js_1.hexEncode)(tag)).toEqual('ff'.repeat(56) + 'ecec4cbdb89c188b');
46
+ });
47
+ (0, vitest_1.it)('should correctly generate random initial payload for media dc', async () => {
48
+ const random = 'ff'.repeat(64);
49
+ const proxy = {
50
+ dcId: 1,
51
+ secret: new Uint8Array(16),
52
+ test: false,
53
+ media: true,
54
+ };
55
+ const [codec] = await create(random, proxy);
56
+ const tag = await codec.tag();
57
+ (0, vitest_1.expect)((0, index_js_1.hexEncode)(tag)).toEqual('ff'.repeat(56) + 'ecec4cbd5644188b');
58
+ });
59
+ });
60
+ vitest_1.it.each([
61
+ ['ef'],
62
+ ['48454144'],
63
+ ['504f5354'],
64
+ ['47455420'],
65
+ ['4f505449'],
66
+ ['dddddddd'],
67
+ ['eeeeeeee'],
68
+ ['16030102'],
69
+ ])('should correctly retry for %s prefix', async (prefix) => {
70
+ const random = prefix + 'ff'.repeat(64 - prefix.length / 2);
71
+ const [codec] = await create(random);
72
+ // generating random payload requires 64 bytes of entropy, so
73
+ // if it asks for more, it means it tried to generate it again
74
+ await (0, vitest_1.expect)(() => codec.tag()).rejects.toThrow('not enough entropy');
75
+ });
76
+ });
77
+ (0, vitest_1.it)('should correctly create aes ctr', async () => {
78
+ const [codec, crypto] = await create();
79
+ const spyCreateAesCtr = vitest_1.vi.spyOn(crypto, 'createAesCtr');
80
+ await codec.tag();
81
+ (0, vitest_1.expect)(spyCreateAesCtr).toHaveBeenCalledTimes(2);
82
+ (0, vitest_1.expect)(spyCreateAesCtr).toHaveBeenNthCalledWith(1, (0, test_1.u8HexDecode)('10b6b4ad6d56ef5df9453f88e6ee6adb6e0544ba635dc6a8a990c9b8b980c343'), (0, test_1.u8HexDecode)('936b33fa7f97bae025102532233abb26'), true);
83
+ (0, vitest_1.expect)(spyCreateAesCtr).toHaveBeenNthCalledWith(2, (0, test_1.u8HexDecode)('26bb3a2332251025e0ba977ffa336b9343c380b9b8c990a9a8c65d63ba44056e'), (0, test_1.u8HexDecode)('db6aeee6883f45f95def566dadb4b610'), false);
84
+ });
85
+ (0, vitest_1.it)('should correctly create aes ctr for mtproxy', async () => {
86
+ const proxy = {
87
+ dcId: 1,
88
+ secret: (0, index_js_1.hexDecodeToBuffer)('00112233445566778899aabbccddeeff'),
89
+ test: true,
90
+ media: false,
91
+ };
92
+ const [codec, crypto] = await create(undefined, proxy);
93
+ const spyCreateAesCtr = vitest_1.vi.spyOn(crypto, 'createAesCtr');
94
+ await codec.tag();
95
+ (0, vitest_1.expect)(spyCreateAesCtr).toHaveBeenCalledTimes(2);
96
+ (0, vitest_1.expect)(spyCreateAesCtr).toHaveBeenNthCalledWith(1, (0, index_js_1.hexDecodeToBuffer)('dd03188944590983e28dad14d97d0952389d118af4ffcbdb28d56a6a612ef7a6'), (0, test_1.u8HexDecode)('936b33fa7f97bae025102532233abb26'), true);
97
+ (0, vitest_1.expect)(spyCreateAesCtr).toHaveBeenNthCalledWith(2, (0, index_js_1.hexDecodeToBuffer)('413b8e08021fbb08a2962b6d7187194fe46565c6b329d3bbdfcffd4870c16119'), (0, test_1.u8HexDecode)('db6aeee6883f45f95def566dadb4b610'), false);
98
+ });
99
+ (0, vitest_1.it)('should correctly encrypt the underlying codec', async () => {
100
+ const data = (0, index_js_1.hexDecodeToBuffer)('6cfeffff');
101
+ const msg1 = 'a1020630a410e940';
102
+ const msg2 = 'f53ff53f371db495';
103
+ const [codec] = await create();
104
+ await codec.tag();
105
+ (0, vitest_1.expect)((0, index_js_1.hexEncode)(await codec.encode(data))).toEqual(msg1);
106
+ (0, vitest_1.expect)((0, index_js_1.hexEncode)(await codec.encode(data))).toEqual(msg2);
107
+ });
108
+ (0, vitest_1.it)('should correctly decrypt the underlying codec', async () => {
109
+ const msg1 = 'e8027df708ab3b5c';
110
+ const msg2 = '1854be76d2df4949';
111
+ const [codec] = await create();
112
+ await codec.tag();
113
+ const log = [];
114
+ codec.on('error', (e) => {
115
+ log.push(e.toString());
116
+ });
117
+ codec.feed((0, index_js_1.hexDecodeToBuffer)(msg1));
118
+ codec.feed((0, index_js_1.hexDecodeToBuffer)(msg2));
119
+ await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(log).toEqual(['Error: Transport error: 404', 'Error: Transport error: 404']));
120
+ });
121
+ (0, vitest_1.it)('should correctly reset', async () => {
122
+ const inner = new intermediate_js_1.IntermediatePacketCodec();
123
+ const spyInnerReset = vitest_1.vi.spyOn(inner, 'reset');
124
+ const codec = new obfuscated_js_1.ObfuscatedPacketCodec(inner);
125
+ codec.setup(await (0, test_1.defaultTestCryptoProvider)(), new index_js_1.LogManager());
126
+ await codec.tag();
127
+ codec.reset();
128
+ (0, vitest_1.expect)(spyInnerReset).toHaveBeenCalledTimes(1);
129
+ });
130
+ });
131
+ //# sourceMappingURL=obfuscated.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obfuscated.test.js","sourceRoot":"","sources":["../../../../src/network/transports/obfuscated.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it, vi } from 'vitest'\n\nimport { defaultTestCryptoProvider, u8HexDecode } from '@mtcute/test'\n\nimport { hexDecodeToBuffer, hexEncode, LogManager } from '../../utils/index.js'\nimport { IntermediatePacketCodec } from './intermediate.js'\nimport { MtProxyInfo, ObfuscatedPacketCodec } from './obfuscated.js'\n\ndescribe('ObfuscatedPacketCodec', () => {\n const create = async (randomSource?: string, proxy?: MtProxyInfo) => {\n const codec = new ObfuscatedPacketCodec(new IntermediatePacketCodec(), proxy)\n const crypto = await defaultTestCryptoProvider(randomSource)\n codec.setup(crypto, new LogManager())\n\n return [codec, crypto] as const\n }\n\n describe('tag', () => {\n it('should correctly generate random initial payload', async () => {\n const random = 'ff'.repeat(64)\n const [codec] = await create(random)\n\n const tag = await codec.tag()\n\n expect(hexEncode(tag)).toEqual(\n 'ff'.repeat(56) + 'fce8ab2203db2bff', // encrypted part\n )\n })\n\n describe('mtproxy', () => {\n it('should correctly generate random initial payload for prod dc', async () => {\n const random = 'ff'.repeat(64)\n const proxy: MtProxyInfo = {\n dcId: 1,\n secret: new Uint8Array(16),\n test: false,\n media: false,\n }\n const [codec] = await create(random, proxy)\n\n const tag = await codec.tag()\n\n expect(hexEncode(tag)).toEqual(\n 'ff'.repeat(56) + 'ecec4cbda8bb188b', // encrypted part with dcId = 1\n )\n })\n\n it('should correctly generate random initial payload for test dc', async () => {\n const random = 'ff'.repeat(64)\n const proxy: MtProxyInfo = {\n dcId: 1,\n secret: new Uint8Array(16),\n test: true,\n media: false,\n }\n const [codec] = await create(random, proxy)\n\n const tag = await codec.tag()\n\n expect(hexEncode(tag)).toEqual(\n 'ff'.repeat(56) + 'ecec4cbdb89c188b', // encrypted part with dcId = 10001\n )\n })\n\n it('should correctly generate random initial payload for media dc', async () => {\n const random = 'ff'.repeat(64)\n const proxy: MtProxyInfo = {\n dcId: 1,\n secret: new Uint8Array(16),\n test: false,\n media: true,\n }\n const [codec] = await create(random, proxy)\n\n const tag = await codec.tag()\n\n expect(hexEncode(tag)).toEqual(\n 'ff'.repeat(56) + 'ecec4cbd5644188b', // encrypted part with dcId = -1\n )\n })\n })\n\n it.each([\n ['ef'],\n ['48454144'],\n ['504f5354'],\n ['47455420'],\n ['4f505449'],\n ['dddddddd'],\n ['eeeeeeee'],\n ['16030102'],\n ])('should correctly retry for %s prefix', async (prefix) => {\n const random = prefix + 'ff'.repeat(64 - prefix.length / 2)\n const [codec] = await create(random)\n\n // generating random payload requires 64 bytes of entropy, so\n // if it asks for more, it means it tried to generate it again\n await expect(() => codec.tag()).rejects.toThrow('not enough entropy')\n })\n })\n\n it('should correctly create aes ctr', async () => {\n const [codec, crypto] = await create()\n\n const spyCreateAesCtr = vi.spyOn(crypto, 'createAesCtr')\n\n await codec.tag()\n\n expect(spyCreateAesCtr).toHaveBeenCalledTimes(2)\n expect(spyCreateAesCtr).toHaveBeenNthCalledWith(\n 1,\n u8HexDecode('10b6b4ad6d56ef5df9453f88e6ee6adb6e0544ba635dc6a8a990c9b8b980c343'),\n u8HexDecode('936b33fa7f97bae025102532233abb26'),\n true,\n )\n expect(spyCreateAesCtr).toHaveBeenNthCalledWith(\n 2,\n u8HexDecode('26bb3a2332251025e0ba977ffa336b9343c380b9b8c990a9a8c65d63ba44056e'),\n u8HexDecode('db6aeee6883f45f95def566dadb4b610'),\n false,\n )\n })\n\n it('should correctly create aes ctr for mtproxy', async () => {\n const proxy: MtProxyInfo = {\n dcId: 1,\n secret: hexDecodeToBuffer('00112233445566778899aabbccddeeff'),\n test: true,\n media: false,\n }\n const [codec, crypto] = await create(undefined, proxy)\n\n const spyCreateAesCtr = vi.spyOn(crypto, 'createAesCtr')\n\n await codec.tag()\n\n expect(spyCreateAesCtr).toHaveBeenCalledTimes(2)\n expect(spyCreateAesCtr).toHaveBeenNthCalledWith(\n 1,\n hexDecodeToBuffer('dd03188944590983e28dad14d97d0952389d118af4ffcbdb28d56a6a612ef7a6'),\n u8HexDecode('936b33fa7f97bae025102532233abb26'),\n true,\n )\n expect(spyCreateAesCtr).toHaveBeenNthCalledWith(\n 2,\n hexDecodeToBuffer('413b8e08021fbb08a2962b6d7187194fe46565c6b329d3bbdfcffd4870c16119'),\n u8HexDecode('db6aeee6883f45f95def566dadb4b610'),\n false,\n )\n })\n\n it('should correctly encrypt the underlying codec', async () => {\n const data = hexDecodeToBuffer('6cfeffff')\n const msg1 = 'a1020630a410e940'\n const msg2 = 'f53ff53f371db495'\n\n const [codec] = await create()\n\n await codec.tag()\n\n expect(hexEncode(await codec.encode(data))).toEqual(msg1)\n expect(hexEncode(await codec.encode(data))).toEqual(msg2)\n })\n\n it('should correctly decrypt the underlying codec', async () => {\n const msg1 = 'e8027df708ab3b5c'\n const msg2 = '1854be76d2df4949'\n\n const [codec] = await create()\n\n await codec.tag()\n\n const log: string[] = []\n\n codec.on('error', (e: Error) => {\n log.push(e.toString())\n })\n\n codec.feed(hexDecodeToBuffer(msg1))\n codec.feed(hexDecodeToBuffer(msg2))\n\n await vi.waitFor(() => expect(log).toEqual(['Error: Transport error: 404', 'Error: Transport error: 404']))\n })\n\n it('should correctly reset', async () => {\n const inner = new IntermediatePacketCodec()\n const spyInnerReset = vi.spyOn(inner, 'reset')\n\n const codec = new ObfuscatedPacketCodec(inner)\n codec.setup(await defaultTestCryptoProvider(), new LogManager())\n\n await codec.tag()\n\n codec.reset()\n\n expect(spyInnerReset).toHaveBeenCalledTimes(1)\n })\n})\n"]}
@@ -103,10 +103,10 @@ class BaseTcpTransport extends events_1.default {
103
103
  .catch((err) => this.emit('error', err));
104
104
  }
105
105
  async send(bytes) {
106
+ const framed = await this._packetCodec.encode(bytes);
106
107
  if (this._state !== abstract_js_1.TransportState.Ready) {
107
108
  throw new errors_js_1.MtcuteError('Transport is not READY');
108
109
  }
109
- const framed = await this._packetCodec.encode(bytes);
110
110
  return new Promise((resolve, reject) => {
111
111
  this._socket.write(framed, (error) => {
112
112
  if (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"tcp.js","sourceRoot":"","sources":["../../../../src/network/transports/tcp.ts"],"names":[],"mappings":"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","sourcesContent":["import EventEmitter from 'events'\nimport { connect, Socket } from 'net'\n\nimport { tl } from '@mtcute/tl'\n\nimport { MtcuteError } from '../../types/errors.js'\nimport { ICryptoProvider, Logger } from '../../utils/index.js'\nimport { IPacketCodec, ITelegramTransport, TransportState } from './abstract.js'\nimport { IntermediatePacketCodec } from './intermediate.js'\n\n/**\n * Base for TCP transports.\n * Subclasses must provide packet codec in `_packetCodec` property\n */\nexport abstract class BaseTcpTransport extends EventEmitter implements ITelegramTransport {\n protected _currentDc: tl.RawDcOption | null = null\n protected _state: TransportState = TransportState.Idle\n protected _socket: Socket | null = null\n\n abstract _packetCodec: IPacketCodec\n protected _crypto!: ICryptoProvider\n protected log!: Logger\n\n packetCodecInitialized = false\n\n private _updateLogPrefix() {\n if (this._currentDc) {\n this.log.prefix = `[TCP:${this._currentDc.ipAddress}:${this._currentDc.port}] `\n } else {\n this.log.prefix = '[TCP:disconnected] '\n }\n }\n\n setup(crypto: ICryptoProvider, log: Logger): void {\n this._crypto = crypto\n this.log = log.create('tcp')\n this._updateLogPrefix()\n }\n\n state(): TransportState {\n return this._state\n }\n\n currentDc(): tl.RawDcOption | null {\n return this._currentDc\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n connect(dc: tl.RawDcOption, testMode: boolean): void {\n if (this._state !== TransportState.Idle) {\n throw new MtcuteError('Transport is not IDLE')\n }\n\n if (!this.packetCodecInitialized) {\n this._packetCodec.setup?.(this._crypto, this.log)\n this._packetCodec.on('error', (err) => this.emit('error', err))\n this._packetCodec.on('packet', (buf) => this.emit('message', buf))\n this.packetCodecInitialized = true\n }\n\n this._state = TransportState.Connecting\n this._currentDc = dc\n this._updateLogPrefix()\n\n this.log.debug('connecting to %j', dc)\n\n this._socket = connect(dc.port, dc.ipAddress, this.handleConnect.bind(this))\n\n this._socket.on('data', (data) => {\n this._packetCodec.feed(data)\n })\n this._socket.on('error', this.handleError.bind(this))\n this._socket.on('close', this.close.bind(this))\n }\n\n close(): void {\n if (this._state === TransportState.Idle) return\n this.log.info('connection closed')\n\n this.emit('close')\n this._state = TransportState.Idle\n this._socket!.removeAllListeners()\n this._socket!.destroy()\n this._socket = null\n this._currentDc = null\n this._packetCodec.reset()\n }\n\n handleError(error: Error): void {\n this.log.error('error: %s', error.stack)\n this.emit('error', error)\n }\n\n handleConnect(): void {\n this.log.info('connected')\n\n Promise.resolve(this._packetCodec.tag())\n .then((initialMessage) => {\n if (initialMessage.length) {\n this._socket!.write(initialMessage, (err) => {\n if (err) {\n this.log.error('failed to write initial message: %s', err.stack)\n this.emit('error')\n this.close()\n } else {\n this._state = TransportState.Ready\n this.emit('ready')\n }\n })\n } else {\n this._state = TransportState.Ready\n this.emit('ready')\n }\n })\n .catch((err) => this.emit('error', err))\n }\n\n async send(bytes: Uint8Array): Promise<void> {\n if (this._state !== TransportState.Ready) {\n throw new MtcuteError('Transport is not READY')\n }\n\n const framed = await this._packetCodec.encode(bytes)\n\n return new Promise((resolve, reject) => {\n this._socket!.write(framed, (error) => {\n if (error) {\n reject(error)\n } else {\n resolve()\n }\n })\n })\n }\n}\n\nexport class TcpTransport extends BaseTcpTransport {\n _packetCodec = new IntermediatePacketCodec()\n}\n"]}
1
+ {"version":3,"file":"tcp.js","sourceRoot":"","sources":["../../../../src/network/transports/tcp.ts"],"names":[],"mappings":"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","sourcesContent":["import EventEmitter from 'events'\nimport { connect, Socket } from 'net'\n\nimport { tl } from '@mtcute/tl'\n\nimport { MtcuteError } from '../../types/errors.js'\nimport { ICryptoProvider, Logger } from '../../utils/index.js'\nimport { IPacketCodec, ITelegramTransport, TransportState } from './abstract.js'\nimport { IntermediatePacketCodec } from './intermediate.js'\n\n/**\n * Base for TCP transports.\n * Subclasses must provide packet codec in `_packetCodec` property\n */\nexport abstract class BaseTcpTransport extends EventEmitter implements ITelegramTransport {\n protected _currentDc: tl.RawDcOption | null = null\n protected _state: TransportState = TransportState.Idle\n protected _socket: Socket | null = null\n\n abstract _packetCodec: IPacketCodec\n protected _crypto!: ICryptoProvider\n protected log!: Logger\n\n packetCodecInitialized = false\n\n private _updateLogPrefix() {\n if (this._currentDc) {\n this.log.prefix = `[TCP:${this._currentDc.ipAddress}:${this._currentDc.port}] `\n } else {\n this.log.prefix = '[TCP:disconnected] '\n }\n }\n\n setup(crypto: ICryptoProvider, log: Logger): void {\n this._crypto = crypto\n this.log = log.create('tcp')\n this._updateLogPrefix()\n }\n\n state(): TransportState {\n return this._state\n }\n\n currentDc(): tl.RawDcOption | null {\n return this._currentDc\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n connect(dc: tl.RawDcOption, testMode: boolean): void {\n if (this._state !== TransportState.Idle) {\n throw new MtcuteError('Transport is not IDLE')\n }\n\n if (!this.packetCodecInitialized) {\n this._packetCodec.setup?.(this._crypto, this.log)\n this._packetCodec.on('error', (err) => this.emit('error', err))\n this._packetCodec.on('packet', (buf) => this.emit('message', buf))\n this.packetCodecInitialized = true\n }\n\n this._state = TransportState.Connecting\n this._currentDc = dc\n this._updateLogPrefix()\n\n this.log.debug('connecting to %j', dc)\n\n this._socket = connect(dc.port, dc.ipAddress, this.handleConnect.bind(this))\n\n this._socket.on('data', (data) => {\n this._packetCodec.feed(data)\n })\n this._socket.on('error', this.handleError.bind(this))\n this._socket.on('close', this.close.bind(this))\n }\n\n close(): void {\n if (this._state === TransportState.Idle) return\n this.log.info('connection closed')\n\n this.emit('close')\n this._state = TransportState.Idle\n this._socket!.removeAllListeners()\n this._socket!.destroy()\n this._socket = null\n this._currentDc = null\n this._packetCodec.reset()\n }\n\n handleError(error: Error): void {\n this.log.error('error: %s', error.stack)\n this.emit('error', error)\n }\n\n handleConnect(): void {\n this.log.info('connected')\n\n Promise.resolve(this._packetCodec.tag())\n .then((initialMessage) => {\n if (initialMessage.length) {\n this._socket!.write(initialMessage, (err) => {\n if (err) {\n this.log.error('failed to write initial message: %s', err.stack)\n this.emit('error')\n this.close()\n } else {\n this._state = TransportState.Ready\n this.emit('ready')\n }\n })\n } else {\n this._state = TransportState.Ready\n this.emit('ready')\n }\n })\n .catch((err) => this.emit('error', err))\n }\n\n async send(bytes: Uint8Array): Promise<void> {\n const framed = await this._packetCodec.encode(bytes)\n\n if (this._state !== TransportState.Ready) {\n throw new MtcuteError('Transport is not READY')\n }\n\n return new Promise((resolve, reject) => {\n this._socket!.write(framed, (error) => {\n if (error) {\n reject(error)\n } else {\n resolve()\n }\n })\n })\n }\n}\n\nexport class TcpTransport extends BaseTcpTransport {\n _packetCodec = new IntermediatePacketCodec()\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,97 @@
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 index_js_1 = require("../../utils/index.js");
6
+ const abstract_js_1 = require("./abstract.js");
7
+ const tcp_js_1 = require("./tcp.js");
8
+ vitest_1.vi.mock('net', () => ({
9
+ connect: vitest_1.vi.fn().mockImplementation((port, ip, cb) => {
10
+ cb();
11
+ return {
12
+ on: vitest_1.vi.fn(),
13
+ write: vitest_1.vi.fn().mockImplementation((data, cb) => {
14
+ cb();
15
+ }),
16
+ end: vitest_1.vi.fn(),
17
+ removeAllListeners: vitest_1.vi.fn(),
18
+ destroy: vitest_1.vi.fn(),
19
+ };
20
+ }),
21
+ }));
22
+ (0, vitest_1.describe)('TcpTransport', async () => {
23
+ const net = await import('net');
24
+ const connect = vitest_1.vi.mocked(net.connect);
25
+ const getLastSocket = () => {
26
+ return connect.mock.results[connect.mock.results.length - 1].value;
27
+ };
28
+ const create = async () => {
29
+ const transport = new tcp_js_1.TcpTransport();
30
+ const logger = new index_js_1.LogManager();
31
+ logger.level = 0;
32
+ transport.setup(await (0, test_1.defaultTestCryptoProvider)(), logger);
33
+ return transport;
34
+ };
35
+ (0, vitest_1.it)('should initiate a tcp connection to the given dc', async () => {
36
+ const t = await create();
37
+ t.connect(index_js_1.defaultProductionDc.main, false);
38
+ (0, vitest_1.expect)(connect).toHaveBeenCalledOnce();
39
+ (0, vitest_1.expect)(connect).toHaveBeenCalledWith(index_js_1.defaultProductionDc.main.port, index_js_1.defaultProductionDc.main.ipAddress, vitest_1.expect.any(Function));
40
+ await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(t.state()).toEqual(abstract_js_1.TransportState.Ready));
41
+ });
42
+ (0, vitest_1.it)('should set up event handlers', async () => {
43
+ const t = await create();
44
+ t.connect(index_js_1.defaultProductionDc.main, false);
45
+ const socket = getLastSocket();
46
+ (0, vitest_1.expect)(socket.on).toHaveBeenCalledTimes(3);
47
+ (0, vitest_1.expect)(socket.on).toHaveBeenCalledWith('data', vitest_1.expect.any(Function));
48
+ (0, vitest_1.expect)(socket.on).toHaveBeenCalledWith('error', vitest_1.expect.any(Function));
49
+ (0, vitest_1.expect)(socket.on).toHaveBeenCalledWith('close', vitest_1.expect.any(Function));
50
+ });
51
+ (0, vitest_1.it)('should write packet codec tag once connected', async () => {
52
+ const t = await create();
53
+ t.connect(index_js_1.defaultProductionDc.main, false);
54
+ const socket = getLastSocket();
55
+ await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(socket.write).toHaveBeenCalledWith((0, test_1.u8HexDecode)('eeeeeeee'), // intermediate
56
+ vitest_1.expect.any(Function)));
57
+ });
58
+ (0, vitest_1.it)('should write to the underlying socket', async () => {
59
+ const t = await create();
60
+ t.connect(index_js_1.defaultProductionDc.main, false);
61
+ await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(t.state()).toEqual(abstract_js_1.TransportState.Ready));
62
+ await t.send((0, index_js_1.hexDecodeToBuffer)('00010203040506070809'));
63
+ const socket = getLastSocket();
64
+ (0, vitest_1.expect)(socket.write).toHaveBeenCalledWith((0, test_1.u8HexDecode)('0a00000000010203040506070809'), vitest_1.expect.any(Function));
65
+ });
66
+ (0, vitest_1.it)('should correctly close', async () => {
67
+ const t = await create();
68
+ t.connect(index_js_1.defaultProductionDc.main, false);
69
+ await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(t.state()).toEqual(abstract_js_1.TransportState.Ready));
70
+ t.close();
71
+ const socket = getLastSocket();
72
+ (0, vitest_1.expect)(socket.removeAllListeners).toHaveBeenCalledOnce();
73
+ (0, vitest_1.expect)(socket.destroy).toHaveBeenCalledOnce();
74
+ });
75
+ (0, vitest_1.it)('should feed data to the packet codec', async () => {
76
+ const t = await create();
77
+ const codec = t._packetCodec;
78
+ const spyFeed = vitest_1.vi.spyOn(codec, 'feed');
79
+ t.connect(index_js_1.defaultProductionDc.main, false);
80
+ await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(t.state()).toEqual(abstract_js_1.TransportState.Ready));
81
+ const socket = getLastSocket();
82
+ const onDataCall = socket.on.mock.calls.find((c) => c[0] === 'data');
83
+ onDataCall[1]((0, test_1.u8HexDecode)('00010203040506070809'));
84
+ (0, vitest_1.expect)(spyFeed).toHaveBeenCalledWith((0, test_1.u8HexDecode)('00010203040506070809'));
85
+ });
86
+ (0, vitest_1.it)('should propagate errors', async () => {
87
+ const t = await create();
88
+ const spyEmit = vitest_1.vi.spyOn(t, 'emit').mockImplementation(() => true);
89
+ t.connect(index_js_1.defaultProductionDc.main, false);
90
+ await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(t.state()).toEqual(abstract_js_1.TransportState.Ready));
91
+ const socket = getLastSocket();
92
+ const onErrorCall = socket.on.mock.calls.find((c) => c[0] === 'error');
93
+ onErrorCall[1](new Error('test error'));
94
+ (0, vitest_1.expect)(spyEmit).toHaveBeenCalledWith('error', new Error('test error'));
95
+ });
96
+ });
97
+ //# sourceMappingURL=tcp.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tcp.test.js","sourceRoot":"","sources":["../../../../src/network/transports/tcp.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { Socket } from 'net'\nimport { describe, expect, it, MockedObject, vi } from 'vitest'\n\nimport { defaultTestCryptoProvider, u8HexDecode } from '@mtcute/test'\n\nimport { defaultProductionDc, hexDecodeToBuffer, LogManager } from '../../utils/index.js'\nimport { TransportState } from './abstract.js'\nimport { TcpTransport } from './tcp.js'\n\nvi.mock('net', () => ({\n connect: vi.fn().mockImplementation((port: number, ip: string, cb: () => void) => {\n cb()\n\n return {\n on: vi.fn(),\n write: vi.fn().mockImplementation((data: Uint8Array, cb: () => void) => {\n cb()\n }),\n end: vi.fn(),\n removeAllListeners: vi.fn(),\n destroy: vi.fn(),\n }\n }),\n}))\n\ndescribe('TcpTransport', async () => {\n const net = await import('net')\n const connect = vi.mocked(net.connect)\n\n const getLastSocket = () => {\n return connect.mock.results[connect.mock.results.length - 1].value as MockedObject<Socket>\n }\n\n const create = async () => {\n const transport = new TcpTransport()\n const logger = new LogManager()\n logger.level = 0\n transport.setup(await defaultTestCryptoProvider(), logger)\n\n return transport\n }\n\n it('should initiate a tcp connection to the given dc', async () => {\n const t = await create()\n\n t.connect(defaultProductionDc.main, false)\n\n expect(connect).toHaveBeenCalledOnce()\n expect(connect).toHaveBeenCalledWith(\n defaultProductionDc.main.port,\n defaultProductionDc.main.ipAddress,\n expect.any(Function),\n )\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n })\n\n it('should set up event handlers', async () => {\n const t = await create()\n\n t.connect(defaultProductionDc.main, false)\n\n const socket = getLastSocket()\n\n expect(socket.on).toHaveBeenCalledTimes(3)\n expect(socket.on).toHaveBeenCalledWith('data', expect.any(Function))\n expect(socket.on).toHaveBeenCalledWith('error', expect.any(Function))\n expect(socket.on).toHaveBeenCalledWith('close', expect.any(Function))\n })\n\n it('should write packet codec tag once connected', async () => {\n const t = await create()\n\n t.connect(defaultProductionDc.main, false)\n\n const socket = getLastSocket()\n\n await vi.waitFor(() =>\n expect(socket.write).toHaveBeenCalledWith(\n u8HexDecode('eeeeeeee'), // intermediate\n expect.any(Function),\n ),\n )\n })\n\n it('should write to the underlying socket', async () => {\n const t = await create()\n\n t.connect(defaultProductionDc.main, false)\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n\n await t.send(hexDecodeToBuffer('00010203040506070809'))\n\n const socket = getLastSocket()\n\n expect(socket.write).toHaveBeenCalledWith(u8HexDecode('0a00000000010203040506070809'), expect.any(Function))\n })\n\n it('should correctly close', async () => {\n const t = await create()\n\n t.connect(defaultProductionDc.main, false)\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n\n t.close()\n\n const socket = getLastSocket()\n\n expect(socket.removeAllListeners).toHaveBeenCalledOnce()\n expect(socket.destroy).toHaveBeenCalledOnce()\n })\n\n it('should feed data to the packet codec', async () => {\n const t = await create()\n const codec = t._packetCodec\n\n const spyFeed = vi.spyOn(codec, 'feed')\n\n t.connect(defaultProductionDc.main, false)\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n\n const socket = getLastSocket()\n\n const onDataCall = socket.on.mock.calls.find((c) => (c as string[])[0] === 'data') as unknown as [\n string,\n (data: Uint8Array) => void,\n ]\n onDataCall[1](u8HexDecode('00010203040506070809'))\n\n expect(spyFeed).toHaveBeenCalledWith(u8HexDecode('00010203040506070809'))\n })\n\n it('should propagate errors', async () => {\n const t = await create()\n\n const spyEmit = vi.spyOn(t, 'emit').mockImplementation(() => true)\n\n t.connect(defaultProductionDc.main, false)\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n\n const socket = getLastSocket()\n\n const onErrorCall = socket.on.mock.calls.find((c) => (c as string[])[0] === 'error') as unknown as [\n string,\n (error: Error) => void,\n ]\n onErrorCall[1](new Error('test error'))\n\n expect(spyEmit).toHaveBeenCalledWith('error', new Error('test error'))\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ export {};