@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,89 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { defaultTestCryptoProvider, u8HexDecode } from '@mtcute/test';
3
+ import { defaultProductionDc, hexDecodeToBuffer, LogManager } from '../../utils/index.js';
4
+ import { TransportState } from './abstract.js';
5
+ import { WebSocketTransport } from './websocket.js';
6
+ describe('WebSocketTransport', () => {
7
+ const create = async () => {
8
+ const fakeWs = vi.fn().mockImplementation(() => ({
9
+ addEventListener: vi.fn().mockImplementation((event, cb) => {
10
+ if (event === 'open') {
11
+ cb();
12
+ }
13
+ }),
14
+ removeEventListener: vi.fn(),
15
+ close: vi.fn(),
16
+ send: vi.fn(),
17
+ }));
18
+ const transport = new WebSocketTransport({ ws: fakeWs });
19
+ const logger = new LogManager();
20
+ logger.level = 0;
21
+ transport.setup(await defaultTestCryptoProvider(), logger);
22
+ return [transport, fakeWs];
23
+ };
24
+ const getLastSocket = (ws) => {
25
+ return ws.mock.results[ws.mock.results.length - 1].value;
26
+ };
27
+ it('should initiate a websocket connection to the given dc', async () => {
28
+ const [t, ws] = await create();
29
+ t.connect(defaultProductionDc.main, false);
30
+ expect(ws).toHaveBeenCalledOnce();
31
+ expect(ws).toHaveBeenCalledWith('wss://venus.web.telegram.org/apiws', 'binary');
32
+ await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready));
33
+ });
34
+ it('should set up event handlers', async () => {
35
+ const [t, ws] = await create();
36
+ t.connect(defaultProductionDc.main, false);
37
+ const socket = getLastSocket(ws);
38
+ expect(socket.addEventListener).toHaveBeenCalledWith('message', expect.any(Function));
39
+ expect(socket.addEventListener).toHaveBeenCalledWith('error', expect.any(Function));
40
+ expect(socket.addEventListener).toHaveBeenCalledWith('close', expect.any(Function));
41
+ });
42
+ it('should write packet codec tag to the socket', async () => {
43
+ const [t, ws] = await create();
44
+ t.connect(defaultProductionDc.main, false);
45
+ const socket = getLastSocket(ws);
46
+ await vi.waitFor(() => expect(socket.send).toHaveBeenCalledWith(u8HexDecode('29afd26df40fb8ed10b6b4ad6d56ef5df9453f88e6ee6adb6e0544ba635dc6a8a990c9b8b980c343936b33fa7f97bae025102532233abb26d4a1fe6d34f1ba08')));
47
+ });
48
+ it('should write to the underlying socket', async () => {
49
+ const [t, ws] = await create();
50
+ t.connect(defaultProductionDc.main, false);
51
+ const socket = getLastSocket(ws);
52
+ await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready));
53
+ await t.send(hexDecodeToBuffer('00010203040506070809'));
54
+ expect(socket.send).toHaveBeenCalledWith(hexDecodeToBuffer('af020630c8ef14bcf53af33853ea'));
55
+ });
56
+ it('should correctly close', async () => {
57
+ const [t, ws] = await create();
58
+ t.connect(defaultProductionDc.main, false);
59
+ const socket = getLastSocket(ws);
60
+ await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready));
61
+ t.close();
62
+ expect(socket.removeEventListener).toHaveBeenCalled();
63
+ expect(socket.close).toHaveBeenCalled();
64
+ });
65
+ it('should correctly handle incoming messages', async () => {
66
+ const [t, ws] = await create();
67
+ const feedSpy = vi.spyOn(t._packetCodec, 'feed');
68
+ t.connect(defaultProductionDc.main, false);
69
+ const socket = getLastSocket(ws);
70
+ await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready));
71
+ const data = hexDecodeToBuffer('00010203040506070809');
72
+ const message = new MessageEvent('message', { data });
73
+ const onMessageCall = socket.addEventListener.mock.calls.find(([event]) => event === 'message');
74
+ onMessageCall[1](message);
75
+ expect(feedSpy).toHaveBeenCalledWith(u8HexDecode('00010203040506070809'));
76
+ });
77
+ it('should propagate errors', async () => {
78
+ const [t, ws] = await create();
79
+ const spyEmit = vi.spyOn(t, 'emit').mockImplementation(() => true);
80
+ t.connect(defaultProductionDc.main, false);
81
+ const socket = getLastSocket(ws);
82
+ await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready));
83
+ const error = new Error('test');
84
+ const onErrorCall = socket.addEventListener.mock.calls.find(([event]) => event === 'error');
85
+ onErrorCall[1]({ error });
86
+ expect(spyEmit).toHaveBeenCalledWith('error', error);
87
+ });
88
+ });
89
+ //# sourceMappingURL=websocket.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.test.js","sourceRoot":"","sources":["../../../../src/network/transports/websocket.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it, Mock, 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 { WebSocketTransport } from './websocket.js'\n\ndescribe('WebSocketTransport', () => {\n const create = async () => {\n const fakeWs = vi.fn().mockImplementation(() => ({\n addEventListener: vi.fn().mockImplementation((event: string, cb: () => void) => {\n if (event === 'open') {\n cb()\n }\n }),\n removeEventListener: vi.fn(),\n close: vi.fn(),\n send: vi.fn(),\n }))\n\n const transport = new WebSocketTransport({ ws: fakeWs })\n const logger = new LogManager()\n logger.level = 0\n transport.setup(await defaultTestCryptoProvider(), logger)\n\n return [transport, fakeWs] as const\n }\n\n const getLastSocket = (ws: Mock) => {\n return ws.mock.results[ws.mock.results.length - 1].value as MockedObject<WebSocket>\n }\n\n it('should initiate a websocket connection to the given dc', async () => {\n const [t, ws] = await create()\n\n t.connect(defaultProductionDc.main, false)\n\n expect(ws).toHaveBeenCalledOnce()\n expect(ws).toHaveBeenCalledWith('wss://venus.web.telegram.org/apiws', 'binary')\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n })\n\n it('should set up event handlers', async () => {\n const [t, ws] = await create()\n\n t.connect(defaultProductionDc.main, false)\n const socket = getLastSocket(ws)\n\n expect(socket.addEventListener).toHaveBeenCalledWith('message', expect.any(Function))\n expect(socket.addEventListener).toHaveBeenCalledWith('error', expect.any(Function))\n expect(socket.addEventListener).toHaveBeenCalledWith('close', expect.any(Function))\n })\n\n it('should write packet codec tag to the socket', async () => {\n const [t, ws] = await create()\n\n t.connect(defaultProductionDc.main, false)\n const socket = getLastSocket(ws)\n\n await vi.waitFor(() =>\n expect(socket.send).toHaveBeenCalledWith(\n u8HexDecode(\n '29afd26df40fb8ed10b6b4ad6d56ef5df9453f88e6ee6adb6e0544ba635dc6a8a990c9b8b980c343936b33fa7f97bae025102532233abb26d4a1fe6d34f1ba08',\n ),\n ),\n )\n })\n\n it('should write to the underlying socket', async () => {\n const [t, ws] = await create()\n\n t.connect(defaultProductionDc.main, false)\n const socket = getLastSocket(ws)\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n\n await t.send(hexDecodeToBuffer('00010203040506070809'))\n\n expect(socket.send).toHaveBeenCalledWith(hexDecodeToBuffer('af020630c8ef14bcf53af33853ea'))\n })\n\n it('should correctly close', async () => {\n const [t, ws] = await create()\n\n t.connect(defaultProductionDc.main, false)\n const socket = getLastSocket(ws)\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n\n t.close()\n\n expect(socket.removeEventListener).toHaveBeenCalled()\n expect(socket.close).toHaveBeenCalled()\n })\n\n it('should correctly handle incoming messages', async () => {\n const [t, ws] = await create()\n\n const feedSpy = vi.spyOn(t._packetCodec, 'feed')\n\n t.connect(defaultProductionDc.main, false)\n const socket = getLastSocket(ws)\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n\n const data = hexDecodeToBuffer('00010203040506070809')\n const message = new MessageEvent('message', { data })\n\n const onMessageCall = socket.addEventListener.mock.calls.find(([event]) => event === 'message') as unknown as [\n string,\n (evt: MessageEvent) => void,\n ]\n onMessageCall[1](message)\n\n expect(feedSpy).toHaveBeenCalledWith(u8HexDecode('00010203040506070809'))\n })\n\n it('should propagate errors', async () => {\n const [t, ws] = await create()\n\n const spyEmit = vi.spyOn(t, 'emit').mockImplementation(() => true)\n\n t.connect(defaultProductionDc.main, false)\n const socket = getLastSocket(ws)\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n\n const error = new Error('test')\n const onErrorCall = socket.addEventListener.mock.calls.find(([event]) => event === 'error') as unknown as [\n string,\n (evt: { error: Error }) => void,\n ]\n onErrorCall[1]({ error })\n\n expect(spyEmit).toHaveBeenCalledWith('error', error)\n })\n})\n"]}
@@ -69,9 +69,11 @@ export interface ITelegramStorage {
69
69
  */
70
70
  destroy?(): MaybeAsync<void>;
71
71
  /**
72
- * Reset session to its default state
72
+ * Reset session to its default state, optionally resetting auth keys
73
+ *
74
+ * @param [withAuthKeys=false] Whether to also reset auth keys
73
75
  */
74
- reset(): void;
76
+ reset(withAuthKeys?: boolean): void;
75
77
  /**
76
78
  * Set default datacenter to use with this session.
77
79
  */
@@ -115,6 +117,9 @@ export interface ITelegramStorage {
115
117
  setSelf(self: ITelegramStorage.SelfInfo | null): MaybeAsync<void>;
116
118
  /**
117
119
  * Update local database of input peers from the peer info list
120
+ *
121
+ * Client will call `.save()` after all updates-related methods
122
+ * are called, so you can safely batch these updates
118
123
  */
119
124
  updatePeers(peers: ITelegramStorage.PeerInfo[]): MaybeAsync<void>;
120
125
  /**
@@ -136,18 +141,30 @@ export interface ITelegramStorage {
136
141
  getUpdatesState(): MaybeAsync<[number, number, number, number] | null>;
137
142
  /**
138
143
  * Set common `pts` value
144
+ *
145
+ * Client will call `.save()` after all updates-related methods
146
+ * are called, so you can safely batch these updates
139
147
  */
140
148
  setUpdatesPts(val: number): MaybeAsync<void>;
141
149
  /**
142
150
  * Set common `qts` value
151
+ *
152
+ * Client will call `.save()` after all updates-related methods
153
+ * are called, so you can safely batch these updates
143
154
  */
144
155
  setUpdatesQts(val: number): MaybeAsync<void>;
145
156
  /**
146
157
  * Set updates `date` value
158
+ *
159
+ * Client will call `.save()` after all updates-related methods
160
+ * are called, so you can safely batch these updates
147
161
  */
148
162
  setUpdatesDate(val: number): MaybeAsync<void>;
149
163
  /**
150
164
  * Set updates `seq` value
165
+ *
166
+ * Client will call `.save()` after all updates-related methods
167
+ * are called, so you can safely batch these updates
151
168
  */
152
169
  setUpdatesSeq(val: number): MaybeAsync<void>;
153
170
  /**
@@ -156,8 +173,12 @@ export interface ITelegramStorage {
156
173
  getChannelPts(entityId: number): MaybeAsync<number | null>;
157
174
  /**
158
175
  * Set channels `pts` values in batch.
176
+ *
159
177
  * Storage is supposed to replace stored channel `pts` values
160
178
  * with given in the object (key is unmarked peer id, value is the `pts`)
179
+ *
180
+ * Client will call `.save()` after all updates-related methods
181
+ * are called, so you can safely batch these updates
161
182
  */
162
183
  setManyChannelPts(values: Map<number, number>): MaybeAsync<void>;
163
184
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"abstract.js","sourceRoot":"","sources":["../../../src/storage/abstract.ts"],"names":[],"mappings":"","sourcesContent":["import { tl } from '@mtcute/tl'\nimport { TlReaderMap, TlWriterMap } from '@mtcute/tl-runtime'\n\nimport { BasicPeerType, MaybeAsync } from '../types/index.js'\nimport { Logger } from '../utils/index.js'\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace ITelegramStorage {\n /** Information about a cached peer */\n export interface PeerInfo {\n /** Peer marked ID */\n id: number\n /** Peer access hash */\n accessHash: tl.Long\n /** Peer type */\n type: BasicPeerType\n /** Peer username, if any */\n username?: string\n /** Peer phone number, if available */\n phone?: string\n\n /** Full TL object with the cached entity */\n full: tl.TypeUser | tl.TypeChat\n }\n\n /** Information about currently logged in user */\n export interface SelfInfo {\n /** Whether this is a bot */\n isBot: boolean\n /** Current user's ID */\n userId: number\n }\n\n /** Information about preferred DC-s for the user */\n export interface DcOptions {\n /** Main DC */\n main: tl.RawDcOption\n /** Media DC. Can be the same as main */\n media: tl.RawDcOption\n }\n}\n\n/**\n * Abstract interface for persistent storage.\n *\n * In some cases you may want to extend existing MemorySession\n * and override save()/load()/destroy() methods, but you are also free\n * to implement your own session (be sure to refer to MemorySession\n * source code to avoid shooting your leg though)\n *\n * Note that even though set methods *can* be async, you should only\n * write updates to the disk when `save()` is called.\n */\nexport interface ITelegramStorage {\n /**\n * This method is called before any other.\n * For storages that use logging, logger instance.\n * For storages that use binary storage, binary maps\n */\n setup?(log: Logger, readerMap: TlReaderMap, writerMap: TlWriterMap): void\n\n /**\n * Load session from some external storage.\n * Should be used either to load session content from file/network/etc\n * to memory, or to open required connections to fetch session content later\n */\n load?(): MaybeAsync<void>\n /**\n * Save session to some external storage.\n * Should be used to commit pending changes in the session.\n * For example, saving session content to file/network/etc,\n * or committing a database transaction\n */\n save?(): MaybeAsync<void>\n /**\n * Cleanup session and release all used resources.\n */\n destroy?(): MaybeAsync<void>\n\n /**\n * Reset session to its default state\n */\n reset(): void\n\n /**\n * Set default datacenter to use with this session.\n */\n setDefaultDcs(dcs: ITelegramStorage.DcOptions | null): MaybeAsync<void>\n /**\n * Get default datacenter for this session\n * (by default should return null)\n */\n getDefaultDcs(): MaybeAsync<ITelegramStorage.DcOptions | null>\n\n /**\n * Get auth_key for a given DC\n * (returning null will start authorization)\n * For temp keys: should also return null if the key has expired\n *\n * @param dcId DC ID\n * @param tempIndex Index of the temporary key (usually 0, used for multi-connections)\n */\n getAuthKeyFor(dcId: number, tempIndex?: number): MaybeAsync<Uint8Array | null>\n /**\n * Set auth_key for a given DC\n */\n setAuthKeyFor(dcId: number, key: Uint8Array | null): MaybeAsync<void>\n /**\n * Set temp_auth_key for a given DC\n * expiresAt is unix time in ms\n */\n setTempAuthKeyFor(dcId: number, index: number, key: Uint8Array | null, expiresAt: number): MaybeAsync<void>\n /**\n * Remove all saved auth keys (both temp and perm)\n * for the given DC. Used when perm_key becomes invalid,\n * meaning all temp_keys also become invalid\n */\n dropAuthKeysFor(dcId: number): MaybeAsync<void>\n\n /**\n * Get information about currently logged in user (if available)\n */\n getSelf(): MaybeAsync<ITelegramStorage.SelfInfo | null>\n /**\n * Save information about currently logged in user\n */\n setSelf(self: ITelegramStorage.SelfInfo | null): MaybeAsync<void>\n\n /**\n * Update local database of input peers from the peer info list\n */\n updatePeers(peers: ITelegramStorage.PeerInfo[]): MaybeAsync<void>\n /**\n * Find a peer in local database by its marked ID\n */\n getPeerById(peerId: number): MaybeAsync<tl.TypeInputPeer | null>\n /**\n * Find a peer in local database by its username\n */\n getPeerByUsername(username: string): MaybeAsync<tl.TypeInputPeer | null>\n /**\n * Find a peer in local database by its phone number\n */\n getPeerByPhone(phone: string): MaybeAsync<tl.TypeInputPeer | null>\n\n /**\n * Get updates state (if available), represented as a tuple\n * containing: `pts, qts, date, seq`\n */\n getUpdatesState(): MaybeAsync<[number, number, number, number] | null>\n\n /**\n * Set common `pts` value\n */\n setUpdatesPts(val: number): MaybeAsync<void>\n /**\n * Set common `qts` value\n */\n setUpdatesQts(val: number): MaybeAsync<void>\n /**\n * Set updates `date` value\n */\n setUpdatesDate(val: number): MaybeAsync<void>\n /**\n * Set updates `seq` value\n */\n setUpdatesSeq(val: number): MaybeAsync<void>\n\n /**\n * Get channel `pts` value\n */\n getChannelPts(entityId: number): MaybeAsync<number | null>\n /**\n * Set channels `pts` values in batch.\n * Storage is supposed to replace stored channel `pts` values\n * with given in the object (key is unmarked peer id, value is the `pts`)\n */\n setManyChannelPts(values: Map<number, number>): MaybeAsync<void>\n\n /**\n * Get cached peer information by their marked ID.\n * Return `null` if caching is not supported, or the entity\n * is not cached (yet).\n *\n * This is primarily used when a `min` entity is encountered\n * in an update, or when a *short* update is encountered.\n * Returning `null` will require re-fetching that\n * update with the peers added, which might not be very efficient.\n */\n getFullPeerById(id: number): MaybeAsync<tl.TypeUser | tl.TypeChat | null>\n}\n"]}
1
+ {"version":3,"file":"abstract.js","sourceRoot":"","sources":["../../../src/storage/abstract.ts"],"names":[],"mappings":"","sourcesContent":["import { tl } from '@mtcute/tl'\nimport { TlReaderMap, TlWriterMap } from '@mtcute/tl-runtime'\n\nimport { BasicPeerType, MaybeAsync } from '../types/index.js'\nimport { Logger } from '../utils/index.js'\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace ITelegramStorage {\n /** Information about a cached peer */\n export interface PeerInfo {\n /** Peer marked ID */\n id: number\n /** Peer access hash */\n accessHash: tl.Long\n /** Peer type */\n type: BasicPeerType\n /** Peer username, if any */\n username?: string\n /** Peer phone number, if available */\n phone?: string\n\n /** Full TL object with the cached entity */\n full: tl.TypeUser | tl.TypeChat\n }\n\n /** Information about currently logged in user */\n export interface SelfInfo {\n /** Whether this is a bot */\n isBot: boolean\n /** Current user's ID */\n userId: number\n }\n\n /** Information about preferred DC-s for the user */\n export interface DcOptions {\n /** Main DC */\n main: tl.RawDcOption\n /** Media DC. Can be the same as main */\n media: tl.RawDcOption\n }\n}\n\n/**\n * Abstract interface for persistent storage.\n *\n * In some cases you may want to extend existing MemorySession\n * and override save()/load()/destroy() methods, but you are also free\n * to implement your own session (be sure to refer to MemorySession\n * source code to avoid shooting your leg though)\n *\n * Note that even though set methods *can* be async, you should only\n * write updates to the disk when `save()` is called.\n */\nexport interface ITelegramStorage {\n /**\n * This method is called before any other.\n * For storages that use logging, logger instance.\n * For storages that use binary storage, binary maps\n */\n setup?(log: Logger, readerMap: TlReaderMap, writerMap: TlWriterMap): void\n\n /**\n * Load session from some external storage.\n * Should be used either to load session content from file/network/etc\n * to memory, or to open required connections to fetch session content later\n */\n load?(): MaybeAsync<void>\n /**\n * Save session to some external storage.\n * Should be used to commit pending changes in the session.\n * For example, saving session content to file/network/etc,\n * or committing a database transaction\n */\n save?(): MaybeAsync<void>\n /**\n * Cleanup session and release all used resources.\n */\n destroy?(): MaybeAsync<void>\n\n /**\n * Reset session to its default state, optionally resetting auth keys\n *\n * @param [withAuthKeys=false] Whether to also reset auth keys\n */\n reset(withAuthKeys?: boolean): void\n\n /**\n * Set default datacenter to use with this session.\n */\n setDefaultDcs(dcs: ITelegramStorage.DcOptions | null): MaybeAsync<void>\n /**\n * Get default datacenter for this session\n * (by default should return null)\n */\n getDefaultDcs(): MaybeAsync<ITelegramStorage.DcOptions | null>\n\n /**\n * Get auth_key for a given DC\n * (returning null will start authorization)\n * For temp keys: should also return null if the key has expired\n *\n * @param dcId DC ID\n * @param tempIndex Index of the temporary key (usually 0, used for multi-connections)\n */\n getAuthKeyFor(dcId: number, tempIndex?: number): MaybeAsync<Uint8Array | null>\n /**\n * Set auth_key for a given DC\n */\n setAuthKeyFor(dcId: number, key: Uint8Array | null): MaybeAsync<void>\n /**\n * Set temp_auth_key for a given DC\n * expiresAt is unix time in ms\n */\n setTempAuthKeyFor(dcId: number, index: number, key: Uint8Array | null, expiresAt: number): MaybeAsync<void>\n /**\n * Remove all saved auth keys (both temp and perm)\n * for the given DC. Used when perm_key becomes invalid,\n * meaning all temp_keys also become invalid\n */\n dropAuthKeysFor(dcId: number): MaybeAsync<void>\n\n /**\n * Get information about currently logged in user (if available)\n */\n getSelf(): MaybeAsync<ITelegramStorage.SelfInfo | null>\n /**\n * Save information about currently logged in user\n */\n setSelf(self: ITelegramStorage.SelfInfo | null): MaybeAsync<void>\n\n /**\n * Update local database of input peers from the peer info list\n *\n * Client will call `.save()` after all updates-related methods\n * are called, so you can safely batch these updates\n */\n updatePeers(peers: ITelegramStorage.PeerInfo[]): MaybeAsync<void>\n /**\n * Find a peer in local database by its marked ID\n */\n getPeerById(peerId: number): MaybeAsync<tl.TypeInputPeer | null>\n /**\n * Find a peer in local database by its username\n */\n getPeerByUsername(username: string): MaybeAsync<tl.TypeInputPeer | null>\n /**\n * Find a peer in local database by its phone number\n */\n getPeerByPhone(phone: string): MaybeAsync<tl.TypeInputPeer | null>\n\n /**\n * Get updates state (if available), represented as a tuple\n * containing: `pts, qts, date, seq`\n */\n getUpdatesState(): MaybeAsync<[number, number, number, number] | null>\n\n /**\n * Set common `pts` value\n *\n * Client will call `.save()` after all updates-related methods\n * are called, so you can safely batch these updates\n */\n setUpdatesPts(val: number): MaybeAsync<void>\n /**\n * Set common `qts` value\n *\n * Client will call `.save()` after all updates-related methods\n * are called, so you can safely batch these updates\n */\n setUpdatesQts(val: number): MaybeAsync<void>\n /**\n * Set updates `date` value\n *\n * Client will call `.save()` after all updates-related methods\n * are called, so you can safely batch these updates\n */\n setUpdatesDate(val: number): MaybeAsync<void>\n /**\n * Set updates `seq` value\n *\n * Client will call `.save()` after all updates-related methods\n * are called, so you can safely batch these updates\n */\n setUpdatesSeq(val: number): MaybeAsync<void>\n\n /**\n * Get channel `pts` value\n */\n getChannelPts(entityId: number): MaybeAsync<number | null>\n /**\n * Set channels `pts` values in batch.\n *\n * Storage is supposed to replace stored channel `pts` values\n * with given in the object (key is unmarked peer id, value is the `pts`)\n *\n * Client will call `.save()` after all updates-related methods\n * are called, so you can safely batch these updates\n */\n setManyChannelPts(values: Map<number, number>): MaybeAsync<void>\n\n /**\n * Get cached peer information by their marked ID.\n * Return `null` if caching is not supported, or the entity\n * is not cached (yet).\n *\n * This is primarily used when a `min` entity is encountered\n * in an update, or when a *short* update is encountered.\n * Returning `null` will require re-fetching that\n * update with the peers added, which might not be very efficient.\n */\n getFullPeerById(id: number): MaybeAsync<tl.TypeUser | tl.TypeChat | null>\n}\n"]}
@@ -1,5 +1,5 @@
1
+ /* eslint-disable @typescript-eslint/no-unsafe-return */
1
2
  import { base64DecodeToBuffer, base64Encode } from '@mtcute/tl-runtime';
2
- import { longFromFastString, longToFastString } from '../utils/long-utils.js';
3
3
  import { MemoryStorage } from './memory.js';
4
4
  /**
5
5
  * Helper class that provides json serialization functions
@@ -11,23 +11,23 @@ export class JsonMemoryStorage extends MemoryStorage {
11
11
  switch (key) {
12
12
  case 'authKeys':
13
13
  case 'authKeysTemp': {
14
- const ret = {};
14
+ const ret = new Map();
15
15
  value.split('|').forEach((pair) => {
16
16
  const [dcId, b64] = pair.split(',');
17
- ret[dcId] = base64DecodeToBuffer(b64);
17
+ const mapKey = key === 'authKeysTemp' ? dcId : parseInt(dcId);
18
+ ret.set(mapKey, base64DecodeToBuffer(b64));
18
19
  });
19
20
  return ret;
20
21
  }
21
22
  case 'authKeysTempExpiry':
22
- case 'entities':
23
23
  case 'phoneIndex':
24
24
  case 'usernameIndex':
25
25
  case 'pts':
26
26
  case 'fsm':
27
27
  case 'rl':
28
28
  return new Map(Object.entries(value));
29
- case 'accessHash':
30
- return longFromFastString(value);
29
+ case 'entities':
30
+ return new Map();
31
31
  }
32
32
  return value;
33
33
  }));
@@ -44,15 +44,14 @@ export class JsonMemoryStorage extends MemoryStorage {
44
44
  .join('|');
45
45
  }
46
46
  case 'authKeysTempExpiry':
47
- case 'entities':
48
47
  case 'phoneIndex':
49
48
  case 'usernameIndex':
50
49
  case 'pts':
51
50
  case 'fsm':
52
51
  case 'rl':
53
52
  return Object.fromEntries([...value.entries()]);
54
- case 'accessHash':
55
- return longToFastString(value);
53
+ case 'entities':
54
+ return {};
56
55
  }
57
56
  return value;
58
57
  });
@@ -1 +1 @@
1
- {"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/storage/json.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEvE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC7E,OAAO,EAAsB,aAAa,EAAE,MAAM,aAAa,CAAA;AAE/D;;;GAGG;AACH,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IACtC,SAAS,CAAC,IAAY;QAC5B,IAAI,CAAC,aAAa,CACd,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YAC5B,QAAQ,GAAG,EAAE;gBACT,KAAK,UAAU,CAAC;gBAChB,KAAK,cAAc,CAAC,CAAC;oBACjB,MAAM,GAAG,GAA+B,EAAE,CAEzC;oBAAC,KAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,IAAY,EAAE,EAAE;wBACnD,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;wBACnC,GAAG,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAA;oBACzC,CAAC,CAAC,CAAA;oBAEF,OAAO,GAAG,CAAA;iBACb;gBACD,KAAK,oBAAoB,CAAC;gBAC1B,KAAK,UAAU,CAAC;gBAChB,KAAK,YAAY,CAAC;gBAClB,KAAK,eAAe,CAAC;gBACrB,KAAK,KAAK,CAAC;gBACX,KAAK,KAAK,CAAC;gBACX,KAAK,IAAI;oBACL,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAA+B,CAAC,CAAC,CAAA;gBACnE,KAAK,YAAY;oBACb,OAAO,kBAAkB,CAAC,KAAe,CAAC,CAAA;aACjD;YAED,OAAO,KAAK,CAAA;QAChB,CAAC,CAAuB,CAC3B,CAAA;IACL,CAAC;IAES,SAAS;QACf,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YAC9C,QAAQ,GAAG,EAAE;gBACT,KAAK,UAAU,CAAC;gBAChB,KAAK,cAAc,CAAC,CAAC;oBACjB,MAAM,MAAM,GAAG,KAAuC,CAAA;oBAEtD,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;yBACvB,MAAM,CAAC,CAAC,EAAE,EAA8B,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;yBAC1D,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;yBACpD,IAAI,CAAC,GAAG,CAAC,CAAA;iBACjB;gBACD,KAAK,oBAAoB,CAAC;gBAC1B,KAAK,UAAU,CAAC;gBAChB,KAAK,YAAY,CAAC;gBAClB,KAAK,eAAe,CAAC;gBACrB,KAAK,KAAK,CAAC;gBACX,KAAK,KAAK,CAAC;gBACX,KAAK,IAAI;oBACL,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC,GAAI,KAA6B,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;gBAC5E,KAAK,YAAY;oBACb,OAAO,gBAAgB,CAAC,KAAgB,CAAC,CAAA;aAChD;YAED,OAAO,KAAK,CAAA;QAChB,CAAC,CAAC,CAAA;IACN,CAAC;CACJ","sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-return */\nimport { tl } from '@mtcute/tl'\nimport { base64DecodeToBuffer, base64Encode } from '@mtcute/tl-runtime'\n\nimport { longFromFastString, longToFastString } from '../utils/long-utils.js'\nimport { MemorySessionState, MemoryStorage } from './memory.js'\n\n/**\n * Helper class that provides json serialization functions\n * to the session.\n */\nexport class JsonMemoryStorage extends MemoryStorage {\n protected _loadJson(json: string): void {\n this._setStateFrom(\n JSON.parse(json, (key, value) => {\n switch (key) {\n case 'authKeys':\n case 'authKeysTemp': {\n const ret: Record<string, Uint8Array> = {}\n\n ;(value as string).split('|').forEach((pair: string) => {\n const [dcId, b64] = pair.split(',')\n ret[dcId] = base64DecodeToBuffer(b64)\n })\n\n return ret\n }\n case 'authKeysTempExpiry':\n case 'entities':\n case 'phoneIndex':\n case 'usernameIndex':\n case 'pts':\n case 'fsm':\n case 'rl':\n return new Map(Object.entries(value as Record<string, string>))\n case 'accessHash':\n return longFromFastString(value as string)\n }\n\n return value\n }) as MemorySessionState,\n )\n }\n\n protected _saveJson(): string {\n return JSON.stringify(this._state, (key, value) => {\n switch (key) {\n case 'authKeys':\n case 'authKeysTemp': {\n const value_ = value as Map<string, Uint8Array | null>\n\n return [...value_.entries()]\n .filter((it): it is [string, Uint8Array] => it[1] !== null)\n .map(([dcId, key]) => dcId + ',' + base64Encode(key))\n .join('|')\n }\n case 'authKeysTempExpiry':\n case 'entities':\n case 'phoneIndex':\n case 'usernameIndex':\n case 'pts':\n case 'fsm':\n case 'rl':\n return Object.fromEntries([...(value as Map<string, string>).entries()])\n case 'accessHash':\n return longToFastString(value as tl.Long)\n }\n\n return value\n })\n }\n}\n"]}
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/storage/json.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEvE,OAAO,EAAsB,aAAa,EAAE,MAAM,aAAa,CAAA;AAE/D;;;GAGG;AACH,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IACtC,SAAS,CAAC,IAAY;QAC5B,IAAI,CAAC,aAAa,CACd,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YAC5B,QAAQ,GAAG,EAAE;gBACT,KAAK,UAAU,CAAC;gBAChB,KAAK,cAAc,CAAC,CAAC;oBACjB,MAAM,GAAG,GAAG,IAAI,GAAG,EAA+B,CAEjD;oBAAC,KAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,IAAY,EAAE,EAAE;wBACnD,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;wBACnC,MAAM,MAAM,GAAG,GAAG,KAAK,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;wBAE7D,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAA;oBAC9C,CAAC,CAAC,CAAA;oBAEF,OAAO,GAAG,CAAA;iBACb;gBACD,KAAK,oBAAoB,CAAC;gBAC1B,KAAK,YAAY,CAAC;gBAClB,KAAK,eAAe,CAAC;gBACrB,KAAK,KAAK,CAAC;gBACX,KAAK,KAAK,CAAC;gBACX,KAAK,IAAI;oBACL,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAA+B,CAAC,CAAC,CAAA;gBACnE,KAAK,UAAU;oBACX,OAAO,IAAI,GAAG,EAAE,CAAA;aACvB;YAED,OAAO,KAAK,CAAA;QAChB,CAAC,CAAuB,CAC3B,CAAA;IACL,CAAC;IAES,SAAS;QACf,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YAC9C,QAAQ,GAAG,EAAE;gBACT,KAAK,UAAU,CAAC;gBAChB,KAAK,cAAc,CAAC,CAAC;oBACjB,MAAM,MAAM,GAAG,KAAuC,CAAA;oBAEtD,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;yBACvB,MAAM,CAAC,CAAC,EAAE,EAA8B,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;yBAC1D,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;yBACpD,IAAI,CAAC,GAAG,CAAC,CAAA;iBACjB;gBACD,KAAK,oBAAoB,CAAC;gBAC1B,KAAK,YAAY,CAAC;gBAClB,KAAK,eAAe,CAAC;gBACrB,KAAK,KAAK,CAAC;gBACX,KAAK,KAAK,CAAC;gBACX,KAAK,IAAI;oBACL,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC,GAAI,KAA6B,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;gBAC5E,KAAK,UAAU;oBACX,OAAO,EAAE,CAAA;aAChB;YAED,OAAO,KAAK,CAAA;QAChB,CAAC,CAAC,CAAA;IACN,CAAC;CACJ","sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-return */\nimport { base64DecodeToBuffer, base64Encode } from '@mtcute/tl-runtime'\n\nimport { MemorySessionState, MemoryStorage } from './memory.js'\n\n/**\n * Helper class that provides json serialization functions\n * to the session.\n */\nexport class JsonMemoryStorage extends MemoryStorage {\n protected _loadJson(json: string): void {\n this._setStateFrom(\n JSON.parse(json, (key, value) => {\n switch (key) {\n case 'authKeys':\n case 'authKeysTemp': {\n const ret = new Map<string | number, Uint8Array>()\n\n ;(value as string).split('|').forEach((pair: string) => {\n const [dcId, b64] = pair.split(',')\n const mapKey = key === 'authKeysTemp' ? dcId : parseInt(dcId)\n\n ret.set(mapKey, base64DecodeToBuffer(b64))\n })\n\n return ret\n }\n case 'authKeysTempExpiry':\n case 'phoneIndex':\n case 'usernameIndex':\n case 'pts':\n case 'fsm':\n case 'rl':\n return new Map(Object.entries(value as Record<string, string>))\n case 'entities':\n return new Map()\n }\n\n return value\n }) as MemorySessionState,\n )\n }\n\n protected _saveJson(): string {\n return JSON.stringify(this._state, (key, value) => {\n switch (key) {\n case 'authKeys':\n case 'authKeysTemp': {\n const value_ = value as Map<string, Uint8Array | null>\n\n return [...value_.entries()]\n .filter((it): it is [string, Uint8Array] => it[1] !== null)\n .map(([dcId, key]) => dcId + ',' + base64Encode(key))\n .join('|')\n }\n case 'authKeysTempExpiry':\n case 'phoneIndex':\n case 'usernameIndex':\n case 'pts':\n case 'fsm':\n case 'rl':\n return Object.fromEntries([...(value as Map<string, string>).entries()])\n case 'entities':\n return {}\n }\n\n return value\n })\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,35 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { stubPeerUser } from '@mtcute/test';
3
+ import { JsonMemoryStorage } from './json.js';
4
+ describe('JsonMemoryStorage', () => {
5
+ class ExtJsonMemoryStorage extends JsonMemoryStorage {
6
+ loadJson(json) {
7
+ this._loadJson(json);
8
+ }
9
+ saveJson() {
10
+ return this._saveJson();
11
+ }
12
+ getInternalState() {
13
+ return this._state;
14
+ }
15
+ }
16
+ it('should allow importing and exporting to json', () => {
17
+ const s = new ExtJsonMemoryStorage();
18
+ s.setUpdatesPts(123);
19
+ s.setUpdatesQts(456);
20
+ // eslint-disable-next-line no-restricted-globals
21
+ s.setAuthKeyFor(1, Buffer.from([1, 2, 3]));
22
+ // eslint-disable-next-line no-restricted-globals
23
+ s.setTempAuthKeyFor(2, 0, Buffer.from([4, 5, 6]), 1234567890);
24
+ s.setState('someState', 'someValue');
25
+ s.updatePeers([{ ...stubPeerUser, updated: 0 }]);
26
+ const json = s.saveJson();
27
+ const s2 = new ExtJsonMemoryStorage();
28
+ s2.loadJson(json);
29
+ expect(s2.getInternalState()).toEqual({
30
+ ...s.getInternalState(),
31
+ entities: new Map(), // entities are not saved
32
+ });
33
+ });
34
+ });
35
+ //# sourceMappingURL=json.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.test.js","sourceRoot":"","sources":["../../../src/storage/json.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAE7C,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAC/B,MAAM,oBAAqB,SAAQ,iBAAiB;QAChD,QAAQ,CAAC,IAAY;YACjB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QACxB,CAAC;QAED,QAAQ;YACJ,OAAO,IAAI,CAAC,SAAS,EAAE,CAAA;QAC3B,CAAC;QAED,gBAAgB;YACZ,OAAO,IAAI,CAAC,MAAM,CAAA;QACtB,CAAC;KACJ;IAED,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,GAAG,IAAI,oBAAoB,EAAE,CAAA;QAEpC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;QACpB,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;QACpB,iDAAiD;QACjD,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1C,iDAAiD;QACjD,CAAC,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAA;QAC7D,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;QACpC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,GAAG,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAEhD,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAA;QACzB,MAAM,EAAE,GAAG,IAAI,oBAAoB,EAAE,CAAA;QACrC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAEjB,MAAM,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC;YAClC,GAAG,CAAC,CAAC,gBAAgB,EAAE;YACvB,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,yBAAyB;SACjD,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { stubPeerUser } from '@mtcute/test'\n\nimport { JsonMemoryStorage } from './json.js'\n\ndescribe('JsonMemoryStorage', () => {\n class ExtJsonMemoryStorage extends JsonMemoryStorage {\n loadJson(json: string): void {\n this._loadJson(json)\n }\n\n saveJson(): string {\n return this._saveJson()\n }\n\n getInternalState() {\n return this._state\n }\n }\n\n it('should allow importing and exporting to json', () => {\n const s = new ExtJsonMemoryStorage()\n\n s.setUpdatesPts(123)\n s.setUpdatesQts(456)\n // eslint-disable-next-line no-restricted-globals\n s.setAuthKeyFor(1, Buffer.from([1, 2, 3]))\n // eslint-disable-next-line no-restricted-globals\n s.setTempAuthKeyFor(2, 0, Buffer.from([4, 5, 6]), 1234567890)\n s.setState('someState', 'someValue')\n s.updatePeers([{ ...stubPeerUser, updated: 0 }])\n\n const json = s.saveJson()\n const s2 = new ExtJsonMemoryStorage()\n s2.loadJson(json)\n\n expect(s2.getInternalState()).toEqual({\n ...s.getInternalState(),\n entities: new Map(), // entities are not saved\n })\n })\n})\n"]}
@@ -10,12 +10,15 @@ export class LocalstorageStorage extends JsonMemoryStorage {
10
10
  }
11
11
  load() {
12
12
  try {
13
- this._loadJson(localStorage[this._key]);
13
+ const val = localStorage.getItem(this._key);
14
+ if (val === null)
15
+ return;
16
+ this._loadJson(val);
14
17
  }
15
18
  catch (e) { }
16
19
  }
17
20
  save() {
18
- localStorage[this._key] = this._saveJson();
21
+ localStorage.setItem(this._key, this._saveJson());
19
22
  }
20
23
  }
21
24
  //# sourceMappingURL=localstorage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"localstorage.js","sourceRoot":"","sources":["../../../src/storage/localstorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAE7C,MAAM,OAAO,mBAAoB,SAAQ,iBAAiB;IAGtD,YAAY,GAAW;QACnB,KAAK,EAAE,CAAA;QAEP,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE;YACrC,MAAM,IAAI,kBAAkB,CAAC,gCAAgC,CAAC,CAAA;SACjE;QAED,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;IACnB,CAAC;IAED,IAAI;QACA,IAAI;YACA,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAW,CAAC,CAAA;SACpD;QAAC,OAAO,CAAC,EAAE,GAAE;IAClB,CAAC;IAED,IAAI;QACA,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;IAC9C,CAAC;CACJ","sourcesContent":["import { MtUnsupportedError } from '../types/index.js'\nimport { JsonMemoryStorage } from './json.js'\n\nexport class LocalstorageStorage extends JsonMemoryStorage {\n private readonly _key: string\n\n constructor(key: string) {\n super()\n\n if (typeof localStorage === 'undefined') {\n throw new MtUnsupportedError('localStorage is not available!')\n }\n\n this._key = key\n }\n\n load(): void {\n try {\n this._loadJson(localStorage[this._key] as string)\n } catch (e) {}\n }\n\n save(): void {\n localStorage[this._key] = this._saveJson()\n }\n}\n"]}
1
+ {"version":3,"file":"localstorage.js","sourceRoot":"","sources":["../../../src/storage/localstorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAE7C,MAAM,OAAO,mBAAoB,SAAQ,iBAAiB;IAGtD,YAAY,GAAW;QACnB,KAAK,EAAE,CAAA;QAEP,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE;YACrC,MAAM,IAAI,kBAAkB,CAAC,gCAAgC,CAAC,CAAA;SACjE;QAED,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;IACnB,CAAC;IAED,IAAI;QACA,IAAI;YACA,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC3C,IAAI,GAAG,KAAK,IAAI;gBAAE,OAAM;YAExB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;SACtB;QAAC,OAAO,CAAC,EAAE,GAAE;IAClB,CAAC;IAED,IAAI;QACA,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;IACrD,CAAC;CACJ","sourcesContent":["import { MtUnsupportedError } from '../types/index.js'\nimport { JsonMemoryStorage } from './json.js'\n\nexport class LocalstorageStorage extends JsonMemoryStorage {\n private readonly _key: string\n\n constructor(key: string) {\n super()\n\n if (typeof localStorage === 'undefined') {\n throw new MtUnsupportedError('localStorage is not available!')\n }\n\n this._key = key\n }\n\n load(): void {\n try {\n const val = localStorage.getItem(this._key)\n if (val === null) return\n\n this._loadJson(val)\n } catch (e) {}\n }\n\n save(): void {\n localStorage.setItem(this._key, this._saveJson())\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,21 @@
1
+ import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest';
2
+ import { LocalstorageStorage } from './localstorage.js';
3
+ const localStorageStub = {
4
+ getItem: vi.fn().mockImplementation(() => null),
5
+ setItem: vi.fn(),
6
+ };
7
+ describe('LocalstorageStorage', () => {
8
+ beforeAll(() => void vi.stubGlobal('localStorage', localStorageStub));
9
+ afterAll(() => void vi.unstubAllGlobals());
10
+ it('should load from localstorage', () => {
11
+ const s = new LocalstorageStorage('test');
12
+ s.load();
13
+ expect(localStorageStub.getItem).toHaveBeenCalledWith('test');
14
+ });
15
+ it('should save to localstorage', () => {
16
+ const s = new LocalstorageStorage('test');
17
+ s.save();
18
+ expect(localStorageStub.setItem).toHaveBeenCalledWith('test', expect.any(String));
19
+ });
20
+ });
21
+ //# sourceMappingURL=localstorage.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localstorage.test.js","sourceRoot":"","sources":["../../../src/storage/localstorage.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAEtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAEvD,MAAM,gBAAgB,GAAG;IACrB,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;IAC/C,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;CACnB,CAAA;AACD,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACjC,SAAS,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC,CAAA;IACrE,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAA;IAE1C,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,GAAG,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAA;QACzC,CAAC,CAAC,IAAI,EAAE,CAAA;QAER,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,GAAG,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAA;QACzC,CAAC,CAAC,IAAI,EAAE,CAAA;QAER,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;IACrF,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA","sourcesContent":["import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest'\n\nimport { LocalstorageStorage } from './localstorage.js'\n\nconst localStorageStub = {\n getItem: vi.fn().mockImplementation(() => null),\n setItem: vi.fn(),\n}\ndescribe('LocalstorageStorage', () => {\n beforeAll(() => void vi.stubGlobal('localStorage', localStorageStub))\n afterAll(() => void vi.unstubAllGlobals())\n\n it('should load from localstorage', () => {\n const s = new LocalstorageStorage('test')\n s.load()\n\n expect(localStorageStub.getItem).toHaveBeenCalledWith('test')\n })\n\n it('should save to localstorage', () => {\n const s = new LocalstorageStorage('test')\n s.save()\n\n expect(localStorageStub.setItem).toHaveBeenCalledWith('test', expect.any(String))\n })\n})\n"]}
@@ -1,5 +1,4 @@
1
1
  import { tl } from '@mtcute/tl';
2
- import { MaybeAsync } from '../types/index.js';
3
2
  import { ITelegramStorage } from './abstract.js';
4
3
  declare const CURRENT_VERSION = 1;
5
4
  type PeerInfoWithUpdated = ITelegramStorage.PeerInfo & {
@@ -56,7 +55,7 @@ export declare class MemoryStorage implements ITelegramStorage {
56
55
  });
57
56
  load(): void;
58
57
  destroy(): void;
59
- reset(): void;
58
+ reset(withAuthKeys?: boolean): void;
60
59
  /**
61
60
  * Set a given object as an underlying state.
62
61
  *
@@ -71,7 +70,7 @@ export declare class MemoryStorage implements ITelegramStorage {
71
70
  setAuthKeyFor(dcId: number, key: Uint8Array | null): void;
72
71
  getAuthKeyFor(dcId: number, tempIndex?: number): Uint8Array | null;
73
72
  dropAuthKeysFor(dcId: number): void;
74
- updatePeers(peers: PeerInfoWithUpdated[]): MaybeAsync<void>;
73
+ updatePeers(peers: PeerInfoWithUpdated[]): void;
75
74
  protected _getInputPeer(peerInfo?: ITelegramStorage.PeerInfo): tl.TypeInputPeer | null;
76
75
  getPeerById(peerId: number): tl.TypeInputPeer | null;
77
76
  getPeerByPhone(phone: string): tl.TypeInputPeer | null;
@@ -80,11 +79,11 @@ export declare class MemoryStorage implements ITelegramStorage {
80
79
  setSelf(self: ITelegramStorage.SelfInfo | null): void;
81
80
  setManyChannelPts(values: Map<number, number>): void;
82
81
  getChannelPts(entityId: number): number | null;
83
- getUpdatesState(): MaybeAsync<[number, number, number, number] | null>;
84
- setUpdatesPts(val: number): MaybeAsync<void>;
85
- setUpdatesQts(val: number): MaybeAsync<void>;
86
- setUpdatesDate(val: number): MaybeAsync<void>;
87
- setUpdatesSeq(val: number): MaybeAsync<void>;
82
+ getUpdatesState(): [number, number, number, number] | null;
83
+ setUpdatesPts(val: number): void;
84
+ setUpdatesQts(val: number): void;
85
+ setUpdatesDate(val: number): void;
86
+ setUpdatesSeq(val: number): void;
88
87
  getFullPeerById(id: number): tl.TypeUser | tl.TypeChat | null;
89
88
  getState(key: string): unknown;
90
89
  setState(key: string, state: unknown, ttl?: number): void;
@@ -4,7 +4,7 @@ const USERNAME_TTL = 86400000; // 24 hours
4
4
  export class MemoryStorage {
5
5
  constructor(params) {
6
6
  this._cachedInputPeers = new LruMap(100);
7
- this.reset();
7
+ this.reset(true);
8
8
  this._cachedFull = new LruMap(params?.cacheSize ?? 100);
9
9
  this._vacuumInterval = params?.vacuumInterval ?? 300000;
10
10
  }
@@ -14,13 +14,13 @@ export class MemoryStorage {
14
14
  destroy() {
15
15
  clearInterval(this._vacuumTimeout);
16
16
  }
17
- reset() {
17
+ reset(withAuthKeys = false) {
18
18
  this._state = {
19
19
  $version: CURRENT_VERSION,
20
20
  defaultDcs: null,
21
- authKeys: new Map(),
22
- authKeysTemp: new Map(),
23
- authKeysTempExpiry: new Map(),
21
+ authKeys: withAuthKeys ? new Map() : this._state.authKeys,
22
+ authKeysTemp: withAuthKeys ? new Map() : this._state.authKeysTemp,
23
+ authKeysTempExpiry: withAuthKeys ? new Map() : this._state.authKeysTempExpiry,
24
24
  entities: new Map(),
25
25
  phoneIndex: new Map(),
26
26
  usernameIndex: new Map(),
@@ -42,11 +42,11 @@ export class MemoryStorage {
42
42
  return;
43
43
  // populate indexes if needed
44
44
  let populate = false;
45
- if (!obj.phoneIndex) {
45
+ if (!obj.phoneIndex?.size) {
46
46
  obj.phoneIndex = new Map();
47
47
  populate = true;
48
48
  }
49
- if (!obj.usernameIndex) {
49
+ if (!obj.usernameIndex?.size) {
50
50
  obj.usernameIndex = new Map();
51
51
  populate = true;
52
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/storage/memory.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { MaybeAsync } from '../types/index.js'\nimport { LruMap, toggleChannelIdMark } from '../utils/index.js'\nimport { ITelegramStorage } from './abstract.js'\n\nconst CURRENT_VERSION = 1\n\ntype PeerInfoWithUpdated = ITelegramStorage.PeerInfo & { updated: number }\n\nexport interface MemorySessionState {\n // forwards compatibility for persistent storages\n $version: typeof CURRENT_VERSION\n\n defaultDcs: ITelegramStorage.DcOptions | null\n authKeys: Map<number, Uint8Array>\n authKeysTemp: Map<string, Uint8Array>\n authKeysTempExpiry: Map<string, number>\n\n // marked peer id -> entity info\n entities: Map<number, PeerInfoWithUpdated>\n // phone number -> peer id\n phoneIndex: Map<string, number>\n // username -> peer id\n usernameIndex: Map<string, number>\n\n // common pts, date, seq, qts\n gpts: [number, number, number, number] | null\n // channel pts\n pts: Map<number, number>\n\n // state for fsm\n fsm: Map<\n string,\n {\n // value\n v: unknown\n // expires\n e?: number\n }\n >\n\n // state for rate limiter\n rl: Map<\n string,\n {\n // reset\n res: number\n // remaining\n rem: number\n }\n >\n\n self: ITelegramStorage.SelfInfo | null\n}\n\nconst USERNAME_TTL = 86400000 // 24 hours\n\nexport class MemoryStorage implements ITelegramStorage /*, IStateStorage*/ {\n protected _state!: MemorySessionState\n private _cachedInputPeers: LruMap<number, tl.TypeInputPeer> = new LruMap(100)\n\n private _cachedFull: LruMap<number, tl.TypeUser | tl.TypeChat>\n\n private _vacuumTimeout?: NodeJS.Timeout\n private _vacuumInterval: number\n\n constructor(params?: {\n /**\n * Maximum number of cached full entities.\n *\n * Note that full entities are **NOT** persisted\n * to the disk (in case this storage is backed\n * by a local storage), and only available within\n * the current runtime.\n *\n * @default `100`, use `0` to disable\n */\n cacheSize?: number\n\n /**\n * Interval in milliseconds for vacuuming the storage.\n *\n * When vacuuming, the storage will remove expired FSM\n * states to reduce memory usage.\n *\n * @default `300_000` (5 minutes)\n */\n vacuumInterval?: number\n }) {\n this.reset()\n this._cachedFull = new LruMap(params?.cacheSize ?? 100)\n this._vacuumInterval = params?.vacuumInterval ?? 300_000\n }\n\n load(): void {\n this._vacuumTimeout = setInterval(this._vacuum.bind(this), this._vacuumInterval)\n }\n\n destroy(): void {\n clearInterval(this._vacuumTimeout)\n }\n\n reset(): void {\n this._state = {\n $version: CURRENT_VERSION,\n defaultDcs: null,\n authKeys: new Map(),\n authKeysTemp: new Map(),\n authKeysTempExpiry: new Map(),\n entities: new Map(),\n phoneIndex: new Map(),\n usernameIndex: new Map(),\n gpts: null,\n pts: new Map(),\n fsm: new Map(),\n rl: new Map(),\n self: null,\n }\n }\n\n /**\n * Set a given object as an underlying state.\n *\n * Note that this object will be used as-is, so if\n * you plan on using it somewhere else, be sure to copy it beforehand.\n */\n protected _setStateFrom(obj: MemorySessionState): void {\n if (obj.$version !== CURRENT_VERSION) return\n\n // populate indexes if needed\n let populate = false\n\n if (!obj.phoneIndex) {\n obj.phoneIndex = new Map()\n populate = true\n }\n if (!obj.usernameIndex) {\n obj.usernameIndex = new Map()\n populate = true\n }\n\n if (populate) {\n Object.values(obj.entities).forEach((ent: ITelegramStorage.PeerInfo) => {\n if (ent.phone) obj.phoneIndex.set(ent.phone, ent.id)\n\n if (ent.username) {\n obj.usernameIndex.set(ent.username, ent.id)\n }\n })\n }\n\n this._state = obj\n }\n\n private _vacuum(): void {\n // remove expired entities from fsm and rate limit storages\n\n const now = Date.now()\n\n // make references in advance to avoid lookups\n const state = this._state\n const fsm = state.fsm\n const rl = state.rl\n\n for (const [key, item] of fsm) {\n if (item.e && item.e < now) {\n fsm.delete(key)\n }\n }\n\n for (const [key, item] of rl) {\n if (item.res < now) {\n rl.delete(key)\n }\n }\n }\n\n getDefaultDcs(): ITelegramStorage.DcOptions | null {\n return this._state.defaultDcs\n }\n\n setDefaultDcs(dcs: ITelegramStorage.DcOptions | null): void {\n this._state.defaultDcs = dcs\n }\n\n setTempAuthKeyFor(dcId: number, index: number, key: Uint8Array | null, expiresAt: number): void {\n const k = `${dcId}:${index}`\n\n if (key) {\n this._state.authKeysTemp.set(k, key)\n this._state.authKeysTempExpiry.set(k, expiresAt)\n } else {\n this._state.authKeysTemp.delete(k)\n this._state.authKeysTempExpiry.delete(k)\n }\n }\n\n setAuthKeyFor(dcId: number, key: Uint8Array | null): void {\n if (key) {\n this._state.authKeys.set(dcId, key)\n } else {\n this._state.authKeys.delete(dcId)\n }\n }\n\n getAuthKeyFor(dcId: number, tempIndex?: number): Uint8Array | null {\n if (tempIndex !== undefined) {\n const k = `${dcId}:${tempIndex}`\n\n if (Date.now() > (this._state.authKeysTempExpiry.get(k) ?? 0)) {\n return null\n }\n\n return this._state.authKeysTemp.get(k) ?? null\n }\n\n return this._state.authKeys.get(dcId) ?? null\n }\n\n dropAuthKeysFor(dcId: number): void {\n this._state.authKeys.delete(dcId)\n\n for (const key of this._state.authKeysTemp.keys()) {\n if (key.startsWith(`${dcId}:`)) {\n this._state.authKeysTemp.delete(key)\n this._state.authKeysTempExpiry.delete(key)\n }\n }\n }\n\n updatePeers(peers: PeerInfoWithUpdated[]): MaybeAsync<void> {\n for (const peer of peers) {\n this._cachedFull.set(peer.id, peer.full)\n\n peer.updated = Date.now()\n const old = this._state.entities.get(peer.id)\n\n if (old) {\n // delete old index entries if needed\n if (old.username && peer.username !== old.username) {\n this._state.usernameIndex.delete(old.username)\n }\n if (old.phone && old.phone !== peer.phone) {\n this._state.phoneIndex.delete(old.phone)\n }\n }\n\n if (peer.username) {\n this._state.usernameIndex.set(peer.username, peer.id)\n }\n\n if (peer.phone) this._state.phoneIndex.set(peer.phone, peer.id)\n\n this._state.entities.set(peer.id, peer)\n }\n }\n\n protected _getInputPeer(peerInfo?: ITelegramStorage.PeerInfo): tl.TypeInputPeer | null {\n if (!peerInfo) return null\n\n switch (peerInfo.type) {\n case 'user':\n return {\n _: 'inputPeerUser',\n userId: peerInfo.id,\n accessHash: peerInfo.accessHash,\n }\n case 'chat':\n return {\n _: 'inputPeerChat',\n chatId: -peerInfo.id,\n }\n case 'channel':\n return {\n _: 'inputPeerChannel',\n channelId: toggleChannelIdMark(peerInfo.id),\n accessHash: peerInfo.accessHash,\n }\n }\n }\n\n getPeerById(peerId: number): tl.TypeInputPeer | null {\n if (this._cachedInputPeers.has(peerId)) {\n return this._cachedInputPeers.get(peerId)!\n }\n const peer = this._getInputPeer(this._state.entities.get(peerId))\n if (peer) this._cachedInputPeers.set(peerId, peer)\n\n return peer\n }\n\n getPeerByPhone(phone: string): tl.TypeInputPeer | null {\n const peerId = this._state.phoneIndex.get(phone)\n if (!peerId) return null\n\n return this._getInputPeer(this._state.entities.get(peerId))\n }\n\n getPeerByUsername(username: string): tl.TypeInputPeer | null {\n const id = this._state.usernameIndex.get(username.toLowerCase())\n if (!id) return null\n const peer = this._state.entities.get(id)\n if (!peer) return null\n\n if (Date.now() - peer.updated > USERNAME_TTL) return null\n\n return this._getInputPeer(peer)\n }\n\n getSelf(): ITelegramStorage.SelfInfo | null {\n return this._state.self\n }\n\n setSelf(self: ITelegramStorage.SelfInfo | null): void {\n this._state.self = self\n }\n\n setManyChannelPts(values: Map<number, number>): void {\n for (const [id, pts] of values) {\n this._state.pts.set(id, pts)\n }\n }\n\n getChannelPts(entityId: number): number | null {\n return this._state.pts.get(entityId) ?? null\n }\n\n getUpdatesState(): MaybeAsync<[number, number, number, number] | null> {\n return this._state.gpts ?? null\n }\n\n setUpdatesPts(val: number): MaybeAsync<void> {\n if (!this._state.gpts) this._state.gpts = [0, 0, 0, 0]\n this._state.gpts[0] = val\n }\n\n setUpdatesQts(val: number): MaybeAsync<void> {\n if (!this._state.gpts) this._state.gpts = [0, 0, 0, 0]\n this._state.gpts[1] = val\n }\n\n setUpdatesDate(val: number): MaybeAsync<void> {\n if (!this._state.gpts) this._state.gpts = [0, 0, 0, 0]\n this._state.gpts[2] = val\n }\n\n setUpdatesSeq(val: number): MaybeAsync<void> {\n if (!this._state.gpts) this._state.gpts = [0, 0, 0, 0]\n this._state.gpts[3] = val\n }\n\n getFullPeerById(id: number): tl.TypeUser | tl.TypeChat | null {\n return this._cachedFull.get(id) ?? null\n }\n\n // IStateStorage implementation\n\n getState(key: string): unknown {\n const val = this._state.fsm.get(key)\n if (!val) return null\n\n if (val.e && val.e < Date.now()) {\n // expired\n this._state.fsm.delete(key)\n\n return null\n }\n\n return val.v\n }\n\n setState(key: string, state: unknown, ttl?: number): void {\n this._state.fsm.set(key, {\n v: state,\n e: ttl ? Date.now() + ttl * 1000 : undefined,\n })\n }\n\n deleteState(key: string): void {\n this._state.fsm.delete(key)\n }\n\n getCurrentScene(key: string): string | null {\n return this.getState(`$current_scene_${key}`) as string | null\n }\n\n setCurrentScene(key: string, scene: string, ttl?: number): void {\n return this.setState(`$current_scene_${key}`, scene, ttl)\n }\n\n deleteCurrentScene(key: string): void {\n this._state.fsm.delete(`$current_scene_${key}`)\n }\n\n getRateLimit(key: string, limit: number, window: number): [number, number] {\n // leaky bucket\n const now = Date.now()\n\n const item = this._state.rl.get(key)\n\n if (!item) {\n const state = {\n res: now + window * 1000,\n rem: limit,\n }\n\n this._state.rl.set(key, state)\n\n return [state.rem, state.res]\n }\n\n if (item.res < now) {\n // expired\n\n const state = {\n res: now + window * 1000,\n rem: limit,\n }\n\n this._state.rl.set(key, state)\n\n return [state.rem, state.res]\n }\n\n item.rem = item.rem > 0 ? item.rem - 1 : 0\n\n return [item.rem, item.res]\n }\n\n resetRateLimit(key: string): void {\n this._state.rl.delete(key)\n }\n}\n"]}
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/storage/memory.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { LruMap, toggleChannelIdMark } from '../utils/index.js'\nimport { ITelegramStorage } from './abstract.js'\n\nconst CURRENT_VERSION = 1\n\ntype PeerInfoWithUpdated = ITelegramStorage.PeerInfo & { updated: number }\n\nexport interface MemorySessionState {\n // forwards compatibility for persistent storages\n $version: typeof CURRENT_VERSION\n\n defaultDcs: ITelegramStorage.DcOptions | null\n authKeys: Map<number, Uint8Array>\n authKeysTemp: Map<string, Uint8Array>\n authKeysTempExpiry: Map<string, number>\n\n // marked peer id -> entity info\n entities: Map<number, PeerInfoWithUpdated>\n // phone number -> peer id\n phoneIndex: Map<string, number>\n // username -> peer id\n usernameIndex: Map<string, number>\n\n // common pts, date, seq, qts\n gpts: [number, number, number, number] | null\n // channel pts\n pts: Map<number, number>\n\n // state for fsm\n fsm: Map<\n string,\n {\n // value\n v: unknown\n // expires\n e?: number\n }\n >\n\n // state for rate limiter\n rl: Map<\n string,\n {\n // reset\n res: number\n // remaining\n rem: number\n }\n >\n\n self: ITelegramStorage.SelfInfo | null\n}\n\nconst USERNAME_TTL = 86400000 // 24 hours\n\nexport class MemoryStorage implements ITelegramStorage {\n protected _state!: MemorySessionState\n private _cachedInputPeers: LruMap<number, tl.TypeInputPeer> = new LruMap(100)\n\n private _cachedFull: LruMap<number, tl.TypeUser | tl.TypeChat>\n\n private _vacuumTimeout?: NodeJS.Timeout\n private _vacuumInterval: number\n\n constructor(params?: {\n /**\n * Maximum number of cached full entities.\n *\n * Note that full entities are **NOT** persisted\n * to the disk (in case this storage is backed\n * by a local storage), and only available within\n * the current runtime.\n *\n * @default `100`, use `0` to disable\n */\n cacheSize?: number\n\n /**\n * Interval in milliseconds for vacuuming the storage.\n *\n * When vacuuming, the storage will remove expired FSM\n * states to reduce memory usage.\n *\n * @default `300_000` (5 minutes)\n */\n vacuumInterval?: number\n }) {\n this.reset(true)\n this._cachedFull = new LruMap(params?.cacheSize ?? 100)\n this._vacuumInterval = params?.vacuumInterval ?? 300_000\n }\n\n load(): void {\n this._vacuumTimeout = setInterval(this._vacuum.bind(this), this._vacuumInterval)\n }\n\n destroy(): void {\n clearInterval(this._vacuumTimeout)\n }\n\n reset(withAuthKeys = false): void {\n this._state = {\n $version: CURRENT_VERSION,\n defaultDcs: null,\n authKeys: withAuthKeys ? new Map<number, Uint8Array>() : this._state.authKeys,\n authKeysTemp: withAuthKeys ? new Map<string, Uint8Array>() : this._state.authKeysTemp,\n authKeysTempExpiry: withAuthKeys ? new Map<string, number>() : this._state.authKeysTempExpiry,\n entities: new Map(),\n phoneIndex: new Map(),\n usernameIndex: new Map(),\n gpts: null,\n pts: new Map(),\n fsm: new Map(),\n rl: new Map(),\n self: null,\n }\n }\n\n /**\n * Set a given object as an underlying state.\n *\n * Note that this object will be used as-is, so if\n * you plan on using it somewhere else, be sure to copy it beforehand.\n */\n protected _setStateFrom(obj: MemorySessionState): void {\n if (obj.$version !== CURRENT_VERSION) return\n\n // populate indexes if needed\n let populate = false\n\n if (!obj.phoneIndex?.size) {\n obj.phoneIndex = new Map()\n populate = true\n }\n if (!obj.usernameIndex?.size) {\n obj.usernameIndex = new Map()\n populate = true\n }\n\n if (populate) {\n Object.values(obj.entities).forEach((ent: ITelegramStorage.PeerInfo) => {\n if (ent.phone) obj.phoneIndex.set(ent.phone, ent.id)\n\n if (ent.username) {\n obj.usernameIndex.set(ent.username, ent.id)\n }\n })\n }\n\n this._state = obj\n }\n\n private _vacuum(): void {\n // remove expired entities from fsm and rate limit storages\n\n const now = Date.now()\n\n // make references in advance to avoid lookups\n const state = this._state\n const fsm = state.fsm\n const rl = state.rl\n\n for (const [key, item] of fsm) {\n if (item.e && item.e < now) {\n fsm.delete(key)\n }\n }\n\n for (const [key, item] of rl) {\n if (item.res < now) {\n rl.delete(key)\n }\n }\n }\n\n getDefaultDcs(): ITelegramStorage.DcOptions | null {\n return this._state.defaultDcs\n }\n\n setDefaultDcs(dcs: ITelegramStorage.DcOptions | null): void {\n this._state.defaultDcs = dcs\n }\n\n setTempAuthKeyFor(dcId: number, index: number, key: Uint8Array | null, expiresAt: number): void {\n const k = `${dcId}:${index}`\n\n if (key) {\n this._state.authKeysTemp.set(k, key)\n this._state.authKeysTempExpiry.set(k, expiresAt)\n } else {\n this._state.authKeysTemp.delete(k)\n this._state.authKeysTempExpiry.delete(k)\n }\n }\n\n setAuthKeyFor(dcId: number, key: Uint8Array | null): void {\n if (key) {\n this._state.authKeys.set(dcId, key)\n } else {\n this._state.authKeys.delete(dcId)\n }\n }\n\n getAuthKeyFor(dcId: number, tempIndex?: number): Uint8Array | null {\n if (tempIndex !== undefined) {\n const k = `${dcId}:${tempIndex}`\n\n if (Date.now() > (this._state.authKeysTempExpiry.get(k) ?? 0)) {\n return null\n }\n\n return this._state.authKeysTemp.get(k) ?? null\n }\n\n return this._state.authKeys.get(dcId) ?? null\n }\n\n dropAuthKeysFor(dcId: number): void {\n this._state.authKeys.delete(dcId)\n\n for (const key of this._state.authKeysTemp.keys()) {\n if (key.startsWith(`${dcId}:`)) {\n this._state.authKeysTemp.delete(key)\n this._state.authKeysTempExpiry.delete(key)\n }\n }\n }\n\n updatePeers(peers: PeerInfoWithUpdated[]): void {\n for (const peer of peers) {\n this._cachedFull.set(peer.id, peer.full)\n\n peer.updated = Date.now()\n const old = this._state.entities.get(peer.id)\n\n if (old) {\n // delete old index entries if needed\n if (old.username && peer.username !== old.username) {\n this._state.usernameIndex.delete(old.username)\n }\n if (old.phone && old.phone !== peer.phone) {\n this._state.phoneIndex.delete(old.phone)\n }\n }\n\n if (peer.username) {\n this._state.usernameIndex.set(peer.username, peer.id)\n }\n\n if (peer.phone) this._state.phoneIndex.set(peer.phone, peer.id)\n\n this._state.entities.set(peer.id, peer)\n }\n }\n\n protected _getInputPeer(peerInfo?: ITelegramStorage.PeerInfo): tl.TypeInputPeer | null {\n if (!peerInfo) return null\n\n switch (peerInfo.type) {\n case 'user':\n return {\n _: 'inputPeerUser',\n userId: peerInfo.id,\n accessHash: peerInfo.accessHash,\n }\n case 'chat':\n return {\n _: 'inputPeerChat',\n chatId: -peerInfo.id,\n }\n case 'channel':\n return {\n _: 'inputPeerChannel',\n channelId: toggleChannelIdMark(peerInfo.id),\n accessHash: peerInfo.accessHash,\n }\n }\n }\n\n getPeerById(peerId: number): tl.TypeInputPeer | null {\n if (this._cachedInputPeers.has(peerId)) {\n return this._cachedInputPeers.get(peerId)!\n }\n const peer = this._getInputPeer(this._state.entities.get(peerId))\n if (peer) this._cachedInputPeers.set(peerId, peer)\n\n return peer\n }\n\n getPeerByPhone(phone: string): tl.TypeInputPeer | null {\n const peerId = this._state.phoneIndex.get(phone)\n if (!peerId) return null\n\n return this._getInputPeer(this._state.entities.get(peerId))\n }\n\n getPeerByUsername(username: string): tl.TypeInputPeer | null {\n const id = this._state.usernameIndex.get(username.toLowerCase())\n if (!id) return null\n const peer = this._state.entities.get(id)\n if (!peer) return null\n\n if (Date.now() - peer.updated > USERNAME_TTL) return null\n\n return this._getInputPeer(peer)\n }\n\n getSelf(): ITelegramStorage.SelfInfo | null {\n return this._state.self\n }\n\n setSelf(self: ITelegramStorage.SelfInfo | null): void {\n this._state.self = self\n }\n\n setManyChannelPts(values: Map<number, number>): void {\n for (const [id, pts] of values) {\n this._state.pts.set(id, pts)\n }\n }\n\n getChannelPts(entityId: number): number | null {\n return this._state.pts.get(entityId) ?? null\n }\n\n getUpdatesState(): [number, number, number, number] | null {\n return this._state.gpts ?? null\n }\n\n setUpdatesPts(val: number): void {\n if (!this._state.gpts) this._state.gpts = [0, 0, 0, 0]\n this._state.gpts[0] = val\n }\n\n setUpdatesQts(val: number): void {\n if (!this._state.gpts) this._state.gpts = [0, 0, 0, 0]\n this._state.gpts[1] = val\n }\n\n setUpdatesDate(val: number): void {\n if (!this._state.gpts) this._state.gpts = [0, 0, 0, 0]\n this._state.gpts[2] = val\n }\n\n setUpdatesSeq(val: number): void {\n if (!this._state.gpts) this._state.gpts = [0, 0, 0, 0]\n this._state.gpts[3] = val\n }\n\n getFullPeerById(id: number): tl.TypeUser | tl.TypeChat | null {\n return this._cachedFull.get(id) ?? null\n }\n\n // IStateStorage implementation\n\n getState(key: string): unknown {\n const val = this._state.fsm.get(key)\n if (!val) return null\n\n if (val.e && val.e < Date.now()) {\n // expired\n this._state.fsm.delete(key)\n\n return null\n }\n\n return val.v\n }\n\n setState(key: string, state: unknown, ttl?: number): void {\n this._state.fsm.set(key, {\n v: state,\n e: ttl ? Date.now() + ttl * 1000 : undefined,\n })\n }\n\n deleteState(key: string): void {\n this._state.fsm.delete(key)\n }\n\n getCurrentScene(key: string): string | null {\n return this.getState(`$current_scene_${key}`) as string | null\n }\n\n setCurrentScene(key: string, scene: string, ttl?: number): void {\n return this.setState(`$current_scene_${key}`, scene, ttl)\n }\n\n deleteCurrentScene(key: string): void {\n this._state.fsm.delete(`$current_scene_${key}`)\n }\n\n getRateLimit(key: string, limit: number, window: number): [number, number] {\n // leaky bucket\n const now = Date.now()\n\n const item = this._state.rl.get(key)\n\n if (!item) {\n const state = {\n res: now + window * 1000,\n rem: limit,\n }\n\n this._state.rl.set(key, state)\n\n return [state.rem, state.res]\n }\n\n if (item.res < now) {\n // expired\n\n const state = {\n res: now + window * 1000,\n rem: limit,\n }\n\n this._state.rl.set(key, state)\n\n return [state.rem, state.res]\n }\n\n item.rem = item.rem > 0 ? item.rem - 1 : 0\n\n return [item.rem, item.res]\n }\n\n resetRateLimit(key: string): void {\n this._state.rl.delete(key)\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};