@mtcute/core 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (325) hide show
  1. package/cjs/base-client.d.ts +3 -6
  2. package/cjs/base-client.js +12 -20
  3. package/cjs/base-client.js.map +1 -1
  4. package/cjs/network/auth-key.test.d.ts +1 -0
  5. package/cjs/network/auth-key.test.js +111 -0
  6. package/cjs/network/auth-key.test.js.map +1 -0
  7. package/cjs/network/config-manager.js +2 -1
  8. package/cjs/network/config-manager.js.map +1 -1
  9. package/cjs/network/config-manager.test.d.ts +1 -0
  10. package/cjs/network/config-manager.test.js +170 -0
  11. package/cjs/network/config-manager.test.js.map +1 -0
  12. package/cjs/network/index.d.ts +1 -1
  13. package/cjs/network/index.js.map +1 -1
  14. package/cjs/network/multi-session-connection.js +17 -4
  15. package/cjs/network/multi-session-connection.js.map +1 -1
  16. package/cjs/network/network-manager.d.ts +1 -1
  17. package/cjs/network/network-manager.js +12 -5
  18. package/cjs/network/network-manager.js.map +1 -1
  19. package/cjs/network/persistent-connection.test.d.ts +1 -0
  20. package/cjs/network/persistent-connection.test.js +157 -0
  21. package/cjs/network/persistent-connection.test.js.map +1 -0
  22. package/cjs/network/session-connection.js +3 -2
  23. package/cjs/network/session-connection.js.map +1 -1
  24. package/cjs/network/transports/intermediate.test.d.ts +1 -0
  25. package/cjs/network/transports/intermediate.test.js +84 -0
  26. package/cjs/network/transports/intermediate.test.js.map +1 -0
  27. package/cjs/network/transports/obfuscated.js +1 -1
  28. package/cjs/network/transports/obfuscated.js.map +1 -1
  29. package/cjs/network/transports/obfuscated.test.d.ts +1 -0
  30. package/cjs/network/transports/obfuscated.test.js +131 -0
  31. package/cjs/network/transports/obfuscated.test.js.map +1 -0
  32. package/cjs/network/transports/tcp.js +1 -1
  33. package/cjs/network/transports/tcp.js.map +1 -1
  34. package/cjs/network/transports/tcp.test.d.ts +1 -0
  35. package/cjs/network/transports/tcp.test.js +103 -0
  36. package/cjs/network/transports/tcp.test.js.map +1 -0
  37. package/cjs/network/transports/websocket.test.d.ts +1 -0
  38. package/cjs/network/transports/websocket.test.js +91 -0
  39. package/cjs/network/transports/websocket.test.js.map +1 -0
  40. package/cjs/storage/abstract.d.ts +18 -0
  41. package/cjs/storage/abstract.js.map +1 -1
  42. package/cjs/storage/idb.d.ts +101 -0
  43. package/cjs/storage/idb.js +458 -0
  44. package/cjs/storage/idb.js.map +1 -0
  45. package/cjs/storage/idb.test.d.ts +1 -0
  46. package/cjs/storage/idb.test.js +21 -0
  47. package/cjs/storage/idb.test.js.map +1 -0
  48. package/cjs/storage/index.d.ts +0 -4
  49. package/cjs/storage/index.js +0 -4
  50. package/cjs/storage/index.js.map +1 -1
  51. package/cjs/storage/json-file.d.ts +12 -0
  52. package/cjs/storage/json-file.js +12 -0
  53. package/cjs/storage/json-file.js.map +1 -1
  54. package/cjs/storage/json.js +3 -2
  55. package/cjs/storage/json.js.map +1 -1
  56. package/cjs/storage/json.test.d.ts +1 -0
  57. package/cjs/storage/json.test.js +36 -0
  58. package/cjs/storage/json.test.js.map +1 -0
  59. package/cjs/storage/localstorage.d.ts +12 -0
  60. package/cjs/storage/localstorage.js +12 -0
  61. package/cjs/storage/localstorage.js.map +1 -1
  62. package/cjs/storage/localstorage.test.d.ts +1 -0
  63. package/cjs/storage/localstorage.test.js +23 -0
  64. package/cjs/storage/localstorage.test.js.map +1 -0
  65. package/cjs/storage/memory.d.ts +12 -1
  66. package/cjs/storage/memory.js +65 -3
  67. package/cjs/storage/memory.js.map +1 -1
  68. package/cjs/storage/memory.test.d.ts +1 -0
  69. package/cjs/storage/memory.test.js +48 -0
  70. package/cjs/storage/memory.test.js.map +1 -0
  71. package/cjs/utils/async-lock.test.d.ts +1 -0
  72. package/cjs/utils/async-lock.test.js +25 -0
  73. package/cjs/utils/async-lock.test.js.map +1 -0
  74. package/cjs/utils/bigint-utils.test.d.ts +1 -0
  75. package/cjs/utils/bigint-utils.test.js +150 -0
  76. package/cjs/utils/bigint-utils.test.js.map +1 -0
  77. package/cjs/utils/buffer-utils.test.d.ts +1 -0
  78. package/cjs/utils/buffer-utils.test.js +69 -0
  79. package/cjs/utils/buffer-utils.test.js.map +1 -0
  80. package/cjs/utils/condition-variable.test.d.ts +1 -0
  81. package/cjs/utils/condition-variable.test.js +27 -0
  82. package/cjs/utils/condition-variable.test.js.map +1 -0
  83. package/cjs/utils/controllable-promise.d.ts +0 -5
  84. package/cjs/utils/controllable-promise.js +1 -7
  85. package/cjs/utils/controllable-promise.js.map +1 -1
  86. package/cjs/utils/controllable-promise.test.d.ts +1 -0
  87. package/cjs/utils/controllable-promise.test.js +17 -0
  88. package/cjs/utils/controllable-promise.test.js.map +1 -0
  89. package/cjs/utils/crypto/keys.test.d.ts +1 -0
  90. package/cjs/utils/crypto/keys.test.js +40 -0
  91. package/cjs/utils/crypto/keys.test.js.map +1 -0
  92. package/cjs/utils/crypto/miller-rabin.test.d.ts +1 -0
  93. package/cjs/utils/crypto/miller-rabin.test.js +60 -0
  94. package/cjs/utils/crypto/miller-rabin.test.js.map +1 -0
  95. package/cjs/utils/crypto/mtproto.test.d.ts +1 -0
  96. package/cjs/utils/crypto/mtproto.test.js +50 -0
  97. package/cjs/utils/crypto/mtproto.test.js.map +1 -0
  98. package/cjs/utils/crypto/node.test.d.ts +1 -0
  99. package/cjs/utils/crypto/node.test.js +14 -0
  100. package/cjs/utils/crypto/node.test.js.map +1 -0
  101. package/cjs/utils/crypto/password.test.d.ts +1 -0
  102. package/cjs/utils/crypto/password.test.js +95 -0
  103. package/cjs/utils/crypto/password.test.js.map +1 -0
  104. package/cjs/utils/crypto/utils.test.d.ts +1 -0
  105. package/cjs/utils/crypto/utils.test.js +49 -0
  106. package/cjs/utils/crypto/utils.test.js.map +1 -0
  107. package/cjs/utils/crypto/web.test.d.ts +1 -0
  108. package/cjs/utils/crypto/web.test.js +17 -0
  109. package/cjs/utils/crypto/web.test.js.map +1 -0
  110. package/cjs/utils/deque.test.d.ts +1 -0
  111. package/cjs/utils/deque.test.js +128 -0
  112. package/cjs/utils/deque.test.js.map +1 -0
  113. package/cjs/utils/function-utils.test.d.ts +1 -0
  114. package/cjs/utils/function-utils.test.js +23 -0
  115. package/cjs/utils/function-utils.test.js.map +1 -0
  116. package/cjs/utils/linked-list.test.d.ts +1 -0
  117. package/cjs/utils/linked-list.test.js +36 -0
  118. package/cjs/utils/linked-list.test.js.map +1 -0
  119. package/cjs/utils/links/bots.test.d.ts +1 -0
  120. package/cjs/utils/links/bots.test.js +152 -0
  121. package/cjs/utils/links/bots.test.js.map +1 -0
  122. package/cjs/utils/links/chat.test.d.ts +1 -0
  123. package/cjs/utils/links/chat.test.js +84 -0
  124. package/cjs/utils/links/chat.test.js.map +1 -0
  125. package/cjs/utils/links/misc.test.d.ts +1 -0
  126. package/cjs/utils/links/misc.test.js +153 -0
  127. package/cjs/utils/links/misc.test.js.map +1 -0
  128. package/cjs/utils/links/proxy.test.d.ts +1 -0
  129. package/cjs/utils/links/proxy.test.js +74 -0
  130. package/cjs/utils/links/proxy.test.js.map +1 -0
  131. package/cjs/utils/links/user.test.d.ts +1 -0
  132. package/cjs/utils/links/user.test.js +63 -0
  133. package/cjs/utils/links/user.test.js.map +1 -0
  134. package/cjs/utils/logger.test.d.ts +1 -0
  135. package/cjs/utils/logger.test.js +127 -0
  136. package/cjs/utils/logger.test.js.map +1 -0
  137. package/cjs/utils/long-utils.test.d.ts +1 -0
  138. package/cjs/utils/long-utils.test.js +158 -0
  139. package/cjs/utils/long-utils.test.js.map +1 -0
  140. package/cjs/utils/lru-map.test.d.ts +1 -0
  141. package/cjs/utils/lru-map.test.js +96 -0
  142. package/cjs/utils/lru-map.test.js.map +1 -0
  143. package/cjs/utils/lru-set.test.d.ts +1 -0
  144. package/cjs/utils/lru-set.test.js +77 -0
  145. package/cjs/utils/lru-set.test.js.map +1 -0
  146. package/cjs/utils/peer-utils.js +3 -1
  147. package/cjs/utils/peer-utils.js.map +1 -1
  148. package/cjs/utils/peer-utils.test.d.ts +1 -0
  149. package/cjs/utils/peer-utils.test.js +122 -0
  150. package/cjs/utils/peer-utils.test.js.map +1 -0
  151. package/cjs/utils/sorted-array.test.d.ts +1 -0
  152. package/cjs/utils/sorted-array.test.js +66 -0
  153. package/cjs/utils/sorted-array.test.js.map +1 -0
  154. package/cjs/utils/string-session.test.d.ts +1 -0
  155. package/cjs/utils/string-session.test.js +106 -0
  156. package/cjs/utils/string-session.test.js.map +1 -0
  157. package/cjs/utils/tl-json.test.d.ts +1 -0
  158. package/cjs/utils/tl-json.test.js +83 -0
  159. package/cjs/utils/tl-json.test.js.map +1 -0
  160. package/cjs/utils/type-assertions.test.d.ts +1 -0
  161. package/cjs/utils/type-assertions.test.js +67 -0
  162. package/cjs/utils/type-assertions.test.js.map +1 -0
  163. package/esm/base-client.d.ts +3 -6
  164. package/esm/base-client.js +2 -10
  165. package/esm/base-client.js.map +1 -1
  166. package/esm/network/auth-key.test.d.ts +1 -0
  167. package/esm/network/auth-key.test.js +106 -0
  168. package/esm/network/auth-key.test.js.map +1 -0
  169. package/esm/network/config-manager.js +2 -1
  170. package/esm/network/config-manager.js.map +1 -1
  171. package/esm/network/config-manager.test.d.ts +1 -0
  172. package/esm/network/config-manager.test.js +168 -0
  173. package/esm/network/config-manager.test.js.map +1 -0
  174. package/esm/network/index.d.ts +1 -1
  175. package/esm/network/index.js.map +1 -1
  176. package/esm/network/multi-session-connection.js +17 -4
  177. package/esm/network/multi-session-connection.js.map +1 -1
  178. package/esm/network/network-manager.d.ts +1 -1
  179. package/esm/network/network-manager.js +12 -5
  180. package/esm/network/network-manager.js.map +1 -1
  181. package/esm/network/persistent-connection.test.d.ts +1 -0
  182. package/esm/network/persistent-connection.test.js +155 -0
  183. package/esm/network/persistent-connection.test.js.map +1 -0
  184. package/esm/network/session-connection.js +3 -2
  185. package/esm/network/session-connection.js.map +1 -1
  186. package/esm/network/transports/intermediate.test.d.ts +1 -0
  187. package/esm/network/transports/intermediate.test.js +82 -0
  188. package/esm/network/transports/intermediate.test.js.map +1 -0
  189. package/esm/network/transports/obfuscated.js +1 -1
  190. package/esm/network/transports/obfuscated.js.map +1 -1
  191. package/esm/network/transports/obfuscated.test.d.ts +1 -0
  192. package/esm/network/transports/obfuscated.test.js +129 -0
  193. package/esm/network/transports/obfuscated.test.js.map +1 -0
  194. package/esm/network/transports/tcp.js +1 -1
  195. package/esm/network/transports/tcp.js.map +1 -1
  196. package/esm/network/transports/tcp.test.d.ts +1 -0
  197. package/esm/network/transports/tcp.test.js +101 -0
  198. package/esm/network/transports/tcp.test.js.map +1 -0
  199. package/esm/network/transports/websocket.test.d.ts +1 -0
  200. package/esm/network/transports/websocket.test.js +89 -0
  201. package/esm/network/transports/websocket.test.js.map +1 -0
  202. package/esm/storage/abstract.d.ts +18 -0
  203. package/esm/storage/abstract.js.map +1 -1
  204. package/esm/storage/idb.d.ts +101 -0
  205. package/esm/storage/idb.js +454 -0
  206. package/esm/storage/idb.js.map +1 -0
  207. package/esm/storage/idb.test.d.ts +1 -0
  208. package/esm/storage/idb.test.js +19 -0
  209. package/esm/storage/idb.test.js.map +1 -0
  210. package/esm/storage/index.d.ts +0 -4
  211. package/esm/storage/index.js +0 -4
  212. package/esm/storage/index.js.map +1 -1
  213. package/esm/storage/json-file.d.ts +12 -0
  214. package/esm/storage/json-file.js +12 -0
  215. package/esm/storage/json-file.js.map +1 -1
  216. package/esm/storage/json.js +3 -2
  217. package/esm/storage/json.js.map +1 -1
  218. package/esm/storage/json.test.d.ts +1 -0
  219. package/esm/storage/json.test.js +34 -0
  220. package/esm/storage/json.test.js.map +1 -0
  221. package/esm/storage/localstorage.d.ts +12 -0
  222. package/esm/storage/localstorage.js +12 -0
  223. package/esm/storage/localstorage.js.map +1 -1
  224. package/esm/storage/localstorage.test.d.ts +1 -0
  225. package/esm/storage/localstorage.test.js +21 -0
  226. package/esm/storage/localstorage.test.js.map +1 -0
  227. package/esm/storage/memory.d.ts +12 -1
  228. package/esm/storage/memory.js +65 -3
  229. package/esm/storage/memory.js.map +1 -1
  230. package/esm/storage/memory.test.d.ts +1 -0
  231. package/esm/storage/memory.test.js +46 -0
  232. package/esm/storage/memory.test.js.map +1 -0
  233. package/esm/utils/async-lock.test.d.ts +1 -0
  234. package/esm/utils/async-lock.test.js +23 -0
  235. package/esm/utils/async-lock.test.js.map +1 -0
  236. package/esm/utils/bigint-utils.test.d.ts +1 -0
  237. package/esm/utils/bigint-utils.test.js +148 -0
  238. package/esm/utils/bigint-utils.test.js.map +1 -0
  239. package/esm/utils/buffer-utils.test.d.ts +1 -0
  240. package/esm/utils/buffer-utils.test.js +67 -0
  241. package/esm/utils/buffer-utils.test.js.map +1 -0
  242. package/esm/utils/condition-variable.test.d.ts +1 -0
  243. package/esm/utils/condition-variable.test.js +25 -0
  244. package/esm/utils/condition-variable.test.js.map +1 -0
  245. package/esm/utils/controllable-promise.d.ts +0 -5
  246. package/esm/utils/controllable-promise.js +0 -5
  247. package/esm/utils/controllable-promise.js.map +1 -1
  248. package/esm/utils/controllable-promise.test.d.ts +1 -0
  249. package/esm/utils/controllable-promise.test.js +15 -0
  250. package/esm/utils/controllable-promise.test.js.map +1 -0
  251. package/esm/utils/crypto/keys.test.d.ts +1 -0
  252. package/esm/utils/crypto/keys.test.js +38 -0
  253. package/esm/utils/crypto/keys.test.js.map +1 -0
  254. package/esm/utils/crypto/miller-rabin.test.d.ts +1 -0
  255. package/esm/utils/crypto/miller-rabin.test.js +58 -0
  256. package/esm/utils/crypto/miller-rabin.test.js.map +1 -0
  257. package/esm/utils/crypto/mtproto.test.d.ts +1 -0
  258. package/esm/utils/crypto/mtproto.test.js +48 -0
  259. package/esm/utils/crypto/mtproto.test.js.map +1 -0
  260. package/esm/utils/crypto/node.test.d.ts +1 -0
  261. package/esm/utils/crypto/node.test.js +12 -0
  262. package/esm/utils/crypto/node.test.js.map +1 -0
  263. package/esm/utils/crypto/password.test.d.ts +1 -0
  264. package/esm/utils/crypto/password.test.js +90 -0
  265. package/esm/utils/crypto/password.test.js.map +1 -0
  266. package/esm/utils/crypto/utils.test.d.ts +1 -0
  267. package/esm/utils/crypto/utils.test.js +47 -0
  268. package/esm/utils/crypto/utils.test.js.map +1 -0
  269. package/esm/utils/crypto/web.test.d.ts +1 -0
  270. package/esm/utils/crypto/web.test.js +15 -0
  271. package/esm/utils/crypto/web.test.js.map +1 -0
  272. package/esm/utils/deque.test.d.ts +1 -0
  273. package/esm/utils/deque.test.js +126 -0
  274. package/esm/utils/deque.test.js.map +1 -0
  275. package/esm/utils/function-utils.test.d.ts +1 -0
  276. package/esm/utils/function-utils.test.js +21 -0
  277. package/esm/utils/function-utils.test.js.map +1 -0
  278. package/esm/utils/linked-list.test.d.ts +1 -0
  279. package/esm/utils/linked-list.test.js +34 -0
  280. package/esm/utils/linked-list.test.js.map +1 -0
  281. package/esm/utils/links/bots.test.d.ts +1 -0
  282. package/esm/utils/links/bots.test.js +150 -0
  283. package/esm/utils/links/bots.test.js.map +1 -0
  284. package/esm/utils/links/chat.test.d.ts +1 -0
  285. package/esm/utils/links/chat.test.js +82 -0
  286. package/esm/utils/links/chat.test.js.map +1 -0
  287. package/esm/utils/links/misc.test.d.ts +1 -0
  288. package/esm/utils/links/misc.test.js +151 -0
  289. package/esm/utils/links/misc.test.js.map +1 -0
  290. package/esm/utils/links/proxy.test.d.ts +1 -0
  291. package/esm/utils/links/proxy.test.js +72 -0
  292. package/esm/utils/links/proxy.test.js.map +1 -0
  293. package/esm/utils/links/user.test.d.ts +1 -0
  294. package/esm/utils/links/user.test.js +61 -0
  295. package/esm/utils/links/user.test.js.map +1 -0
  296. package/esm/utils/logger.test.d.ts +1 -0
  297. package/esm/utils/logger.test.js +122 -0
  298. package/esm/utils/logger.test.js.map +1 -0
  299. package/esm/utils/long-utils.test.d.ts +1 -0
  300. package/esm/utils/long-utils.test.js +153 -0
  301. package/esm/utils/long-utils.test.js.map +1 -0
  302. package/esm/utils/lru-map.test.d.ts +1 -0
  303. package/esm/utils/lru-map.test.js +94 -0
  304. package/esm/utils/lru-map.test.js.map +1 -0
  305. package/esm/utils/lru-set.test.d.ts +1 -0
  306. package/esm/utils/lru-set.test.js +72 -0
  307. package/esm/utils/lru-set.test.js.map +1 -0
  308. package/esm/utils/peer-utils.js +3 -1
  309. package/esm/utils/peer-utils.js.map +1 -1
  310. package/esm/utils/peer-utils.test.d.ts +1 -0
  311. package/esm/utils/peer-utils.test.js +117 -0
  312. package/esm/utils/peer-utils.test.js.map +1 -0
  313. package/esm/utils/sorted-array.test.d.ts +1 -0
  314. package/esm/utils/sorted-array.test.js +64 -0
  315. package/esm/utils/sorted-array.test.js.map +1 -0
  316. package/esm/utils/string-session.test.d.ts +1 -0
  317. package/esm/utils/string-session.test.js +104 -0
  318. package/esm/utils/string-session.test.js.map +1 -0
  319. package/esm/utils/tl-json.test.d.ts +1 -0
  320. package/esm/utils/tl-json.test.js +81 -0
  321. package/esm/utils/tl-json.test.js.map +1 -0
  322. package/esm/utils/type-assertions.test.d.ts +1 -0
  323. package/esm/utils/type-assertions.test.js +65 -0
  324. package/esm/utils/type-assertions.test.js.map +1 -0
  325. package/package.json +20 -16
@@ -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 { 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"]}
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 = 2\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 // reference messages. peer id -> `${chat id}:${msg id}][]\n refs: Map<number, Set<string>>\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\n/**\n * In-memory storage implementation for mtcute.\n *\n * This storage is **not persistent**, meaning that all data\n * **will** be lost on restart. Only use this storage for testing,\n * or if you know what you're doing.\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 refs: new Map(),\n gpts: null,\n pts: new Map(),\n fsm: new Map(),\n rl: new Map(),\n self: null,\n }\n this._cachedInputPeers?.clear()\n this._cachedFull?.clear()\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 let ver = obj.$version as number\n\n if (ver === 1) {\n // v2: introduced message references\n obj.refs = new Map()\n obj.$version = ver = 2\n }\n if (ver !== 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 // no point in storing references anymore, since we have the full peer\n if (this._state.refs.has(peer.id)) {\n this._state.refs.delete(peer.id)\n }\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 private _findPeerByRef(peerId: number): tl.TypeInputPeer | null {\n const refs = this._state.refs.get(peerId)\n if (!refs || refs.size === 0) return null\n\n const [ref] = refs.values()\n const [chatId, msgId] = ref.split(':').map(Number)\n\n const chatPeer = this._getInputPeer(this._state.entities.get(chatId))\n if (!chatPeer) return null\n\n if (peerId > 0) {\n // user\n return {\n _: 'inputPeerUserFromMessage',\n msgId,\n userId: peerId,\n peer: chatPeer,\n }\n }\n\n // channel\n return {\n _: 'inputPeerChannelFromMessage',\n msgId,\n channelId: toggleChannelIdMark(peerId),\n peer: chatPeer,\n }\n }\n\n getPeerById(peerId: number): tl.TypeInputPeer | null {\n if (this._cachedInputPeers.has(peerId)) {\n return this._cachedInputPeers.get(peerId)!\n }\n\n let peer = this._getInputPeer(this._state.entities.get(peerId))\n if (!peer) peer = this._findPeerByRef(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 saveReferenceMessage(peerId: number, chatId: number, messageId: number): void {\n if (!this._state.refs.has(peerId)) {\n this._state.refs.set(peerId, new Set())\n }\n\n this._state.refs.get(peerId)!.add(`${chatId}:${messageId}`)\n }\n\n deleteReferenceMessages(chatId: number, messageIds: number[]): void {\n // not the most efficient way, but it's fine\n for (const refs of this._state.refs.values()) {\n for (const msg of messageIds) {\n refs.delete(`${chatId}:${msg}`)\n }\n }\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 {};
@@ -0,0 +1,46 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { testStateStorage, testStorage } from '@mtcute/test';
3
+ import { MemoryStorage } from './memory.js';
4
+ describe('MemoryStorage', () => {
5
+ testStorage(new MemoryStorage());
6
+ testStateStorage(new MemoryStorage());
7
+ describe('extending', () => {
8
+ it('should allow populating from an object', () => {
9
+ class ExtendedMemoryStorage extends MemoryStorage {
10
+ constructor() {
11
+ super();
12
+ this._setStateFrom({
13
+ $version: 2,
14
+ defaultDcs: null,
15
+ authKeys: new Map(),
16
+ authKeysTemp: new Map(),
17
+ authKeysTempExpiry: new Map(),
18
+ entities: new Map(),
19
+ phoneIndex: new Map(),
20
+ usernameIndex: new Map(),
21
+ gpts: [1, 2, 3, 4],
22
+ pts: new Map(),
23
+ fsm: new Map(),
24
+ rl: new Map(),
25
+ refs: new Map(),
26
+ self: null,
27
+ });
28
+ }
29
+ }
30
+ const s = new ExtendedMemoryStorage();
31
+ expect(s.getUpdatesState()).toEqual([1, 2, 3, 4]);
32
+ });
33
+ it('should silently fail if version is wrong', () => {
34
+ class ExtendedMemoryStorage extends MemoryStorage {
35
+ constructor() {
36
+ super();
37
+ // eslint-disable-next-line
38
+ this._setStateFrom({ $version: 0 });
39
+ }
40
+ }
41
+ const s = new ExtendedMemoryStorage();
42
+ expect(s.getUpdatesState()).toEqual(null);
43
+ });
44
+ });
45
+ });
46
+ //# sourceMappingURL=memory.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.test.js","sourceRoot":"","sources":["../../../src/storage/memory.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC3B,WAAW,CAAC,IAAI,aAAa,EAAE,CAAC,CAAA;IAChC,gBAAgB,CAAC,IAAI,aAAa,EAAE,CAAC,CAAA;IAErC,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAC9C,MAAM,qBAAsB,SAAQ,aAAa;gBAC7C;oBACI,KAAK,EAAE,CAAA;oBACP,IAAI,CAAC,aAAa,CAAC;wBACf,QAAQ,EAAE,CAAC;wBACX,UAAU,EAAE,IAAI;wBAChB,QAAQ,EAAE,IAAI,GAAG,EAAE;wBACnB,YAAY,EAAE,IAAI,GAAG,EAAE;wBACvB,kBAAkB,EAAE,IAAI,GAAG,EAAE;wBAC7B,QAAQ,EAAE,IAAI,GAAG,EAAE;wBACnB,UAAU,EAAE,IAAI,GAAG,EAAE;wBACrB,aAAa,EAAE,IAAI,GAAG,EAAE;wBACxB,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;wBAClB,GAAG,EAAE,IAAI,GAAG,EAAE;wBACd,GAAG,EAAE,IAAI,GAAG,EAAE;wBACd,EAAE,EAAE,IAAI,GAAG,EAAE;wBACb,IAAI,EAAE,IAAI,GAAG,EAAE;wBACf,IAAI,EAAE,IAAI;qBACb,CAAC,CAAA;gBACN,CAAC;aACJ;YAED,MAAM,CAAC,GAAG,IAAI,qBAAqB,EAAE,CAAA;YAErC,MAAM,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACrD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAChD,MAAM,qBAAsB,SAAQ,aAAa;gBAC7C;oBACI,KAAK,EAAE,CAAA;oBACP,2BAA2B;oBAC3B,IAAI,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAS,CAAC,CAAA;gBAC9C,CAAC;aACJ;YAED,MAAM,CAAC,GAAG,IAAI,qBAAqB,EAAE,CAAA;YAErC,MAAM,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { testStateStorage, testStorage } from '@mtcute/test'\n\nimport { MemoryStorage } from './memory.js'\n\ndescribe('MemoryStorage', () => {\n testStorage(new MemoryStorage())\n testStateStorage(new MemoryStorage())\n\n describe('extending', () => {\n it('should allow populating from an object', () => {\n class ExtendedMemoryStorage extends MemoryStorage {\n constructor() {\n super()\n this._setStateFrom({\n $version: 2,\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: [1, 2, 3, 4],\n pts: new Map(),\n fsm: new Map(),\n rl: new Map(),\n refs: new Map(),\n self: null,\n })\n }\n }\n\n const s = new ExtendedMemoryStorage()\n\n expect(s.getUpdatesState()).toEqual([1, 2, 3, 4])\n })\n\n it('should silently fail if version is wrong', () => {\n class ExtendedMemoryStorage extends MemoryStorage {\n constructor() {\n super()\n // eslint-disable-next-line\n this._setStateFrom({ $version: 0 } as any)\n }\n }\n\n const s = new ExtendedMemoryStorage()\n\n expect(s.getUpdatesState()).toEqual(null)\n })\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,23 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { AsyncLock } from './async-lock.js';
3
+ import { sleep } from './misc-utils.js';
4
+ describe('AsyncLock', () => {
5
+ it('should correctly lock execution', async () => {
6
+ const lock = new AsyncLock();
7
+ const log = [];
8
+ await Promise.all(Array.from({ length: 10 }, (_, idx) => lock.with(async () => {
9
+ await sleep(10 - idx);
10
+ log.push(idx);
11
+ })));
12
+ expect(log).toEqual([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
13
+ });
14
+ it('should correctly propagate errors', async () => {
15
+ const lock = new AsyncLock();
16
+ await expect(async () => {
17
+ await lock.with(() => {
18
+ throw new Error('test');
19
+ });
20
+ }).rejects.toThrow('test');
21
+ });
22
+ });
23
+ //# sourceMappingURL=async-lock.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-lock.test.js","sourceRoot":"","sources":["../../../src/utils/async-lock.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEvC,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACvB,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,IAAI,GAAG,IAAI,SAAS,EAAE,CAAA;QAE5B,MAAM,GAAG,GAAa,EAAE,CAAA;QACxB,MAAM,OAAO,CAAC,GAAG,CACb,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAClC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YACjB,MAAM,KAAK,CAAC,EAAE,GAAG,GAAG,CAAC,CAAA;YACrB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACjB,CAAC,CAAC,CACL,CACJ,CAAA;QAED,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACvD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,IAAI,GAAG,IAAI,SAAS,EAAE,CAAA;QAE5B,MAAM,MAAM,CAAC,KAAK,IAAI,EAAE;YACpB,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;gBACjB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAA;YAC3B,CAAC,CAAC,CAAA;QACN,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { AsyncLock } from './async-lock.js'\nimport { sleep } from './misc-utils.js'\n\ndescribe('AsyncLock', () => {\n it('should correctly lock execution', async () => {\n const lock = new AsyncLock()\n\n const log: number[] = []\n await Promise.all(\n Array.from({ length: 10 }, (_, idx) =>\n lock.with(async () => {\n await sleep(10 - idx)\n log.push(idx)\n }),\n ),\n )\n\n expect(log).toEqual([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])\n })\n\n it('should correctly propagate errors', async () => {\n const lock = new AsyncLock()\n\n await expect(async () => {\n await lock.with(() => {\n throw new Error('test')\n })\n }).rejects.toThrow('test')\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,148 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { defaultTestCryptoProvider } from '@mtcute/test';
3
+ import { hexDecodeToBuffer } from '@mtcute/tl-runtime';
4
+ import { bigIntBitLength, bigIntGcd, bigIntModInv, bigIntModPow, bigIntToBuffer, bufferToBigInt, randomBigInt, randomBigIntBits, randomBigIntInRange, twoMultiplicity, } from './index.js';
5
+ describe('bigIntBitLength', () => {
6
+ it('should correctly calculate bit length', () => {
7
+ expect(bigIntBitLength(0n)).eq(0);
8
+ expect(bigIntBitLength(1n)).eq(1);
9
+ expect(bigIntBitLength(2n)).eq(2);
10
+ expect(bigIntBitLength(255n)).eq(8);
11
+ expect(bigIntBitLength(256n)).eq(9);
12
+ });
13
+ });
14
+ describe('bigIntToBuffer', () => {
15
+ it('should handle writing to BE', () => {
16
+ expect([...bigIntToBuffer(BigInt('10495708'), 0, false)]).eql([0xa0, 0x26, 0xdc]);
17
+ expect([...bigIntToBuffer(BigInt('10495708'), 4, false)]).eql([0x00, 0xa0, 0x26, 0xdc]);
18
+ expect([...bigIntToBuffer(BigInt('10495708'), 8, false)]).eql([0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x26, 0xdc]);
19
+ expect([...bigIntToBuffer(BigInt('3038102549'), 4, false)]).eql([0xb5, 0x15, 0xc4, 0x15]);
20
+ expect([...bigIntToBuffer(BigInt('9341376580368336208'), 8, false)]).eql([
21
+ ...hexDecodeToBuffer('81A33C81D2020550'),
22
+ ]);
23
+ });
24
+ it('should handle writing to LE', () => {
25
+ expect([...bigIntToBuffer(BigInt('10495708'), 0, true)]).eql([0xdc, 0x26, 0xa0]);
26
+ expect([...bigIntToBuffer(BigInt('10495708'), 4, true)]).eql([0xdc, 0x26, 0xa0, 0x00]);
27
+ expect([...bigIntToBuffer(BigInt('10495708'), 8, true)]).eql([0xdc, 0x26, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00]);
28
+ expect([...bigIntToBuffer(BigInt('3038102549'), 4, true)]).eql([0x15, 0xc4, 0x15, 0xb5]);
29
+ expect([...bigIntToBuffer(BigInt('9341376580368336208'), 8, true)]).eql([
30
+ ...hexDecodeToBuffer('81A33C81D2020550').reverse(),
31
+ ]);
32
+ });
33
+ it('should handle large integers', () => {
34
+ const buf = hexDecodeToBuffer('1a981ce8bf86bf4a1bd79c2ef829914172f8d0e54cb7ad807552d56977e1c946872e2c7bd77052be30e7e9a7a35c4feff848a25759f5f2f5b0e96538');
35
+ const num = BigInt('0x1a981ce8bf86bf4a1bd79c2ef829914172f8d0e54cb7ad807552d56977e1c946872e2c7bd77052be30e7e9a7a35c4feff848a25759f5f2f5b0e96538');
36
+ expect([...bigIntToBuffer(num, 0, false)]).eql([...buf]);
37
+ expect([...bigIntToBuffer(num, 0, true)]).eql([...buf.reverse()]);
38
+ });
39
+ });
40
+ describe('bufferToBigInt', () => {
41
+ it('should handle reading BE', () => {
42
+ expect(bufferToBigInt(new Uint8Array([0xa0, 0x26, 0xdc]), false).toString()).eq('10495708');
43
+ expect(bufferToBigInt(new Uint8Array([0x00, 0xa0, 0x26, 0xdc]), false).toString()).eq('10495708');
44
+ expect(bufferToBigInt(new Uint8Array([0xb5, 0x15, 0xc4, 0x15]), false).toString()).eq('3038102549');
45
+ });
46
+ it('should handle reading LE', () => {
47
+ expect(bufferToBigInt(new Uint8Array([0xdc, 0x26, 0xa0]), true).toString()).eq('10495708');
48
+ expect(bufferToBigInt(new Uint8Array([0xdc, 0x26, 0xa0, 0x00]), true).toString()).eq('10495708');
49
+ expect(bufferToBigInt(new Uint8Array([0x15, 0xc4, 0x15, 0xb5]), true).toString()).eq('3038102549');
50
+ });
51
+ it('should handle large integers', () => {
52
+ const buf = hexDecodeToBuffer('1a981ce8bf86bf4a1bd79c2ef829914172f8d0e54cb7ad807552d56977e1c946872e2c7bd77052be30e7e9a7a35c4feff848a25759f5f2f5b0e96538');
53
+ const num = BigInt('0x1a981ce8bf86bf4a1bd79c2ef829914172f8d0e54cb7ad807552d56977e1c946872e2c7bd77052be30e7e9a7a35c4feff848a25759f5f2f5b0e96538');
54
+ expect(bufferToBigInt(buf, false).toString()).eq(num.toString());
55
+ expect(bufferToBigInt(buf.reverse(), true).toString()).eq(num.toString());
56
+ });
57
+ });
58
+ describe('randomBigInt', async () => {
59
+ const c = await defaultTestCryptoProvider();
60
+ it('should return a random bigint', () => {
61
+ const a = randomBigInt(c, 32);
62
+ const b = randomBigInt(c, 32);
63
+ expect(a).not.toEqual(b);
64
+ });
65
+ it('should return a random bigint up to specified byte length', () => {
66
+ const a = randomBigInt(c, 32);
67
+ const b = randomBigInt(c, 64);
68
+ expect(bigIntBitLength(a)).toBeLessThanOrEqual(32 * 8);
69
+ expect(bigIntBitLength(b)).toBeLessThanOrEqual(64 * 8);
70
+ });
71
+ });
72
+ describe('randomBigIntBits', async () => {
73
+ const c = await defaultTestCryptoProvider();
74
+ it('should return a random bigint', () => {
75
+ const a = randomBigIntBits(c, 32);
76
+ const b = randomBigIntBits(c, 32);
77
+ expect(a).not.toEqual(b);
78
+ });
79
+ it('should return a random bigint up to specified bit length', () => {
80
+ const a = randomBigIntBits(c, 32);
81
+ const b = randomBigIntBits(c, 64);
82
+ expect(bigIntBitLength(a)).toBeLessThanOrEqual(32);
83
+ expect(bigIntBitLength(b)).toBeLessThanOrEqual(64);
84
+ });
85
+ });
86
+ describe('randomBigIntInRange', async () => {
87
+ const c = await defaultTestCryptoProvider();
88
+ it('should return a random bigint', () => {
89
+ const a = randomBigIntInRange(c, 10000n);
90
+ const b = randomBigIntInRange(c, 10000n);
91
+ expect(a).not.toEqual(b);
92
+ });
93
+ it('should return a bigint within a given range', () => {
94
+ const a = randomBigIntInRange(c, 200n, 100n);
95
+ expect(a).toBeGreaterThanOrEqual(100n);
96
+ expect(a).toBeLessThan(200n);
97
+ });
98
+ });
99
+ describe('twoMultiplicity', () => {
100
+ it('should return the multiplicity of 2 in the prime factorization of n', () => {
101
+ expect(twoMultiplicity(0n)).toEqual(0n);
102
+ expect(twoMultiplicity(1n)).toEqual(0n);
103
+ expect(twoMultiplicity(2n)).toEqual(1n);
104
+ expect(twoMultiplicity(4n)).toEqual(2n);
105
+ expect(twoMultiplicity(65536n)).toEqual(16n);
106
+ expect(twoMultiplicity(65537n)).toEqual(0n);
107
+ });
108
+ });
109
+ describe('bigIntGcd', () => {
110
+ it('should return the greatest common divisor of a and b', () => {
111
+ expect(bigIntGcd(123n, 456n)).toEqual(3n);
112
+ });
113
+ it('should correctly handle zeros', () => {
114
+ expect(bigIntGcd(0n, 0n)).toEqual(0n);
115
+ expect(bigIntGcd(0n, 1n)).toEqual(1n);
116
+ expect(bigIntGcd(1n, 0n)).toEqual(1n);
117
+ });
118
+ it('should correctly handle equal values', () => {
119
+ expect(bigIntGcd(1n, 1n)).toEqual(1n);
120
+ });
121
+ });
122
+ describe('bigIntModPow', () => {
123
+ it('should correctly calculate modular exponentiation', () => {
124
+ expect(bigIntModPow(2n, 3n, 5n)).toEqual(3n);
125
+ expect(bigIntModPow(2n, 3n, 6n)).toEqual(2n);
126
+ expect(bigIntModPow(2n, 3n, 7n)).toEqual(1n);
127
+ expect(bigIntModPow(2n, 3n, 8n)).toEqual(0n);
128
+ });
129
+ it('should correctly handle very large numbers', () => {
130
+ // calculating this with BigInt would either take forever or error with "Maximum BigInt size exceeded
131
+ expect(bigIntModPow(2n, 100000000000n, 100n)).toEqual(76n);
132
+ });
133
+ });
134
+ describe('bigIntModInv', () => {
135
+ it('should correctly calculate modular inverse', () => {
136
+ expect(bigIntModInv(2n, 5n)).toEqual(3n);
137
+ expect(bigIntModInv(2n, 7n)).toEqual(4n);
138
+ });
139
+ it("should error if there's no modular inverse", () => {
140
+ expect(() => bigIntModInv(2n, 6n)).toThrow(RangeError);
141
+ expect(() => bigIntModInv(2n, 8n)).toThrow(RangeError);
142
+ });
143
+ it('should correctly handle very large numbers', () => {
144
+ // calculating this with BigInt would either take forever or error with "Maximum BigInt size exceeded
145
+ expect(bigIntModInv(123123123123n, 1829n)).toEqual(318n);
146
+ });
147
+ });
148
+ //# sourceMappingURL=bigint-utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bigint-utils.test.js","sourceRoot":"","sources":["../../../src/utils/bigint-utils.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { defaultTestCryptoProvider } from '@mtcute/test'\nimport { hexDecodeToBuffer } from '@mtcute/tl-runtime'\n\nimport {\n bigIntBitLength,\n bigIntGcd,\n bigIntModInv,\n bigIntModPow,\n bigIntToBuffer,\n bufferToBigInt,\n randomBigInt,\n randomBigIntBits,\n randomBigIntInRange,\n twoMultiplicity,\n} from './index.js'\n\ndescribe('bigIntBitLength', () => {\n it('should correctly calculate bit length', () => {\n expect(bigIntBitLength(0n)).eq(0)\n expect(bigIntBitLength(1n)).eq(1)\n expect(bigIntBitLength(2n)).eq(2)\n expect(bigIntBitLength(255n)).eq(8)\n expect(bigIntBitLength(256n)).eq(9)\n })\n})\n\ndescribe('bigIntToBuffer', () => {\n it('should handle writing to BE', () => {\n expect([...bigIntToBuffer(BigInt('10495708'), 0, false)]).eql([0xa0, 0x26, 0xdc])\n expect([...bigIntToBuffer(BigInt('10495708'), 4, false)]).eql([0x00, 0xa0, 0x26, 0xdc])\n expect([...bigIntToBuffer(BigInt('10495708'), 8, false)]).eql([0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x26, 0xdc])\n expect([...bigIntToBuffer(BigInt('3038102549'), 4, false)]).eql([0xb5, 0x15, 0xc4, 0x15])\n expect([...bigIntToBuffer(BigInt('9341376580368336208'), 8, false)]).eql([\n ...hexDecodeToBuffer('81A33C81D2020550'),\n ])\n })\n\n it('should handle writing to LE', () => {\n expect([...bigIntToBuffer(BigInt('10495708'), 0, true)]).eql([0xdc, 0x26, 0xa0])\n expect([...bigIntToBuffer(BigInt('10495708'), 4, true)]).eql([0xdc, 0x26, 0xa0, 0x00])\n expect([...bigIntToBuffer(BigInt('10495708'), 8, true)]).eql([0xdc, 0x26, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00])\n expect([...bigIntToBuffer(BigInt('3038102549'), 4, true)]).eql([0x15, 0xc4, 0x15, 0xb5])\n expect([...bigIntToBuffer(BigInt('9341376580368336208'), 8, true)]).eql([\n ...hexDecodeToBuffer('81A33C81D2020550').reverse(),\n ])\n })\n\n it('should handle large integers', () => {\n const buf = hexDecodeToBuffer(\n '1a981ce8bf86bf4a1bd79c2ef829914172f8d0e54cb7ad807552d56977e1c946872e2c7bd77052be30e7e9a7a35c4feff848a25759f5f2f5b0e96538',\n )\n const num = BigInt(\n '0x1a981ce8bf86bf4a1bd79c2ef829914172f8d0e54cb7ad807552d56977e1c946872e2c7bd77052be30e7e9a7a35c4feff848a25759f5f2f5b0e96538',\n )\n\n expect([...bigIntToBuffer(num, 0, false)]).eql([...buf])\n expect([...bigIntToBuffer(num, 0, true)]).eql([...buf.reverse()])\n })\n})\n\ndescribe('bufferToBigInt', () => {\n it('should handle reading BE', () => {\n expect(bufferToBigInt(new Uint8Array([0xa0, 0x26, 0xdc]), false).toString()).eq('10495708')\n expect(bufferToBigInt(new Uint8Array([0x00, 0xa0, 0x26, 0xdc]), false).toString()).eq('10495708')\n expect(bufferToBigInt(new Uint8Array([0xb5, 0x15, 0xc4, 0x15]), false).toString()).eq('3038102549')\n })\n\n it('should handle reading LE', () => {\n expect(bufferToBigInt(new Uint8Array([0xdc, 0x26, 0xa0]), true).toString()).eq('10495708')\n expect(bufferToBigInt(new Uint8Array([0xdc, 0x26, 0xa0, 0x00]), true).toString()).eq('10495708')\n expect(bufferToBigInt(new Uint8Array([0x15, 0xc4, 0x15, 0xb5]), true).toString()).eq('3038102549')\n })\n\n it('should handle large integers', () => {\n const buf = hexDecodeToBuffer(\n '1a981ce8bf86bf4a1bd79c2ef829914172f8d0e54cb7ad807552d56977e1c946872e2c7bd77052be30e7e9a7a35c4feff848a25759f5f2f5b0e96538',\n )\n const num = BigInt(\n '0x1a981ce8bf86bf4a1bd79c2ef829914172f8d0e54cb7ad807552d56977e1c946872e2c7bd77052be30e7e9a7a35c4feff848a25759f5f2f5b0e96538',\n )\n\n expect(bufferToBigInt(buf, false).toString()).eq(num.toString())\n expect(bufferToBigInt(buf.reverse(), true).toString()).eq(num.toString())\n })\n})\n\ndescribe('randomBigInt', async () => {\n const c = await defaultTestCryptoProvider()\n\n it('should return a random bigint', () => {\n const a = randomBigInt(c, 32)\n const b = randomBigInt(c, 32)\n\n expect(a).not.toEqual(b)\n })\n\n it('should return a random bigint up to specified byte length', () => {\n const a = randomBigInt(c, 32)\n const b = randomBigInt(c, 64)\n\n expect(bigIntBitLength(a)).toBeLessThanOrEqual(32 * 8)\n expect(bigIntBitLength(b)).toBeLessThanOrEqual(64 * 8)\n })\n})\n\ndescribe('randomBigIntBits', async () => {\n const c = await defaultTestCryptoProvider()\n\n it('should return a random bigint', () => {\n const a = randomBigIntBits(c, 32)\n const b = randomBigIntBits(c, 32)\n\n expect(a).not.toEqual(b)\n })\n\n it('should return a random bigint up to specified bit length', () => {\n const a = randomBigIntBits(c, 32)\n const b = randomBigIntBits(c, 64)\n\n expect(bigIntBitLength(a)).toBeLessThanOrEqual(32)\n expect(bigIntBitLength(b)).toBeLessThanOrEqual(64)\n })\n})\n\ndescribe('randomBigIntInRange', async () => {\n const c = await defaultTestCryptoProvider()\n\n it('should return a random bigint', () => {\n const a = randomBigIntInRange(c, 10000n)\n const b = randomBigIntInRange(c, 10000n)\n\n expect(a).not.toEqual(b)\n })\n\n it('should return a bigint within a given range', () => {\n const a = randomBigIntInRange(c, 200n, 100n)\n\n expect(a).toBeGreaterThanOrEqual(100n)\n expect(a).toBeLessThan(200n)\n })\n})\n\ndescribe('twoMultiplicity', () => {\n it('should return the multiplicity of 2 in the prime factorization of n', () => {\n expect(twoMultiplicity(0n)).toEqual(0n)\n expect(twoMultiplicity(1n)).toEqual(0n)\n expect(twoMultiplicity(2n)).toEqual(1n)\n expect(twoMultiplicity(4n)).toEqual(2n)\n expect(twoMultiplicity(65536n)).toEqual(16n)\n expect(twoMultiplicity(65537n)).toEqual(0n)\n })\n})\n\ndescribe('bigIntGcd', () => {\n it('should return the greatest common divisor of a and b', () => {\n expect(bigIntGcd(123n, 456n)).toEqual(3n)\n })\n\n it('should correctly handle zeros', () => {\n expect(bigIntGcd(0n, 0n)).toEqual(0n)\n expect(bigIntGcd(0n, 1n)).toEqual(1n)\n expect(bigIntGcd(1n, 0n)).toEqual(1n)\n })\n\n it('should correctly handle equal values', () => {\n expect(bigIntGcd(1n, 1n)).toEqual(1n)\n })\n})\n\ndescribe('bigIntModPow', () => {\n it('should correctly calculate modular exponentiation', () => {\n expect(bigIntModPow(2n, 3n, 5n)).toEqual(3n)\n expect(bigIntModPow(2n, 3n, 6n)).toEqual(2n)\n expect(bigIntModPow(2n, 3n, 7n)).toEqual(1n)\n expect(bigIntModPow(2n, 3n, 8n)).toEqual(0n)\n })\n\n it('should correctly handle very large numbers', () => {\n // calculating this with BigInt would either take forever or error with \"Maximum BigInt size exceeded\n expect(bigIntModPow(2n, 100000000000n, 100n)).toEqual(76n)\n })\n})\n\ndescribe('bigIntModInv', () => {\n it('should correctly calculate modular inverse', () => {\n expect(bigIntModInv(2n, 5n)).toEqual(3n)\n expect(bigIntModInv(2n, 7n)).toEqual(4n)\n })\n\n it(\"should error if there's no modular inverse\", () => {\n expect(() => bigIntModInv(2n, 6n)).toThrow(RangeError)\n expect(() => bigIntModInv(2n, 8n)).toThrow(RangeError)\n })\n\n it('should correctly handle very large numbers', () => {\n // calculating this with BigInt would either take forever or error with \"Maximum BigInt size exceeded\n expect(bigIntModInv(123123123123n, 1829n)).toEqual(318n)\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,67 @@
1
+ import { afterEach, describe, expect, it, vi } from 'vitest';
2
+ import { buffersEqual, bufferToReversed, cloneBuffer, concatBuffers } from './buffer-utils.js';
3
+ describe('buffersEqual', () => {
4
+ it('should return true for equal buffers', () => {
5
+ expect(buffersEqual(new Uint8Array([]), new Uint8Array([]))).is.true;
6
+ expect(buffersEqual(new Uint8Array([1, 2, 3]), new Uint8Array([1, 2, 3]))).is.true;
7
+ });
8
+ it('should return false for non-equal buffers', () => {
9
+ expect(buffersEqual(new Uint8Array([1]), new Uint8Array([]))).is.false;
10
+ expect(buffersEqual(new Uint8Array([1, 2, 3]), new Uint8Array([1, 2, 4]))).is.false;
11
+ });
12
+ });
13
+ describe('cloneBuffer', () => {
14
+ it('should clone buffer', () => {
15
+ const orig = new Uint8Array([1, 2, 3]);
16
+ const copy = cloneBuffer(orig);
17
+ expect([...copy]).eql([1, 2, 3]);
18
+ orig[0] = 0xff;
19
+ expect(copy[0]).not.eql(0xff);
20
+ });
21
+ it('should clone buffer partially', () => {
22
+ const orig = new Uint8Array([1, 2, 3, 4, 5]);
23
+ const copy = cloneBuffer(orig, 1, 4);
24
+ expect([...copy]).eql([2, 3, 4]);
25
+ orig[0] = 0xff;
26
+ expect(copy[0]).not.eql(0xff);
27
+ });
28
+ });
29
+ describe('concatBuffers', () => {
30
+ it('should concat buffers', () => {
31
+ const buf = concatBuffers([new Uint8Array([1, 2, 3]), new Uint8Array([4, 5, 6])]);
32
+ expect([...buf]).eql([1, 2, 3, 4, 5, 6]);
33
+ });
34
+ it('should create a new buffer', () => {
35
+ const buf1 = new Uint8Array([1, 2, 3]);
36
+ const buf2 = new Uint8Array([4, 5, 6]);
37
+ const buf = concatBuffers([buf1, buf2]);
38
+ buf[0] = 0xff;
39
+ expect(buf1[0]).not.eql(0xff);
40
+ });
41
+ it('should work without native Buffer', () => {
42
+ vi.stubGlobal('Buffer', undefined);
43
+ const buf1 = new Uint8Array([1, 2, 3]);
44
+ const buf2 = new Uint8Array([4, 5, 6]);
45
+ const buf = concatBuffers([buf1, buf2]);
46
+ buf1[0] = 0xff;
47
+ expect([...buf]).eql([1, 2, 3, 4, 5, 6]);
48
+ });
49
+ afterEach(() => void vi.unstubAllGlobals());
50
+ });
51
+ describe('bufferToReversed', () => {
52
+ it('should reverse the buffer', () => {
53
+ const buf = bufferToReversed(new Uint8Array([1, 2, 3, 4, 5, 6]));
54
+ expect([...buf]).eql([6, 5, 4, 3, 2, 1]);
55
+ });
56
+ it('should reverse a part of the buffer', () => {
57
+ const buf = bufferToReversed(new Uint8Array([1, 2, 3, 4, 5, 6]), 1, 5);
58
+ expect([...buf]).eql([5, 4, 3, 2]);
59
+ });
60
+ it('should create a new buffer', () => {
61
+ const buf1 = new Uint8Array([1, 2, 3]);
62
+ const buf2 = bufferToReversed(buf1);
63
+ buf2[0] = 0xff;
64
+ expect([...buf1]).eql([1, 2, 3]);
65
+ });
66
+ });
67
+ //# sourceMappingURL=buffer-utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buffer-utils.test.js","sourceRoot":"","sources":["../../../src/utils/buffer-utils.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { afterEach, describe, expect, it, vi } from 'vitest'\n\nimport { buffersEqual, bufferToReversed, cloneBuffer, concatBuffers } from './buffer-utils.js'\n\ndescribe('buffersEqual', () => {\n it('should return true for equal buffers', () => {\n expect(buffersEqual(new Uint8Array([]), new Uint8Array([]))).is.true\n expect(buffersEqual(new Uint8Array([1, 2, 3]), new Uint8Array([1, 2, 3]))).is.true\n })\n\n it('should return false for non-equal buffers', () => {\n expect(buffersEqual(new Uint8Array([1]), new Uint8Array([]))).is.false\n expect(buffersEqual(new Uint8Array([1, 2, 3]), new Uint8Array([1, 2, 4]))).is.false\n })\n})\n\ndescribe('cloneBuffer', () => {\n it('should clone buffer', () => {\n const orig = new Uint8Array([1, 2, 3])\n const copy = cloneBuffer(orig)\n\n expect([...copy]).eql([1, 2, 3])\n orig[0] = 0xff\n expect(copy[0]).not.eql(0xff)\n })\n\n it('should clone buffer partially', () => {\n const orig = new Uint8Array([1, 2, 3, 4, 5])\n const copy = cloneBuffer(orig, 1, 4)\n\n expect([...copy]).eql([2, 3, 4])\n orig[0] = 0xff\n expect(copy[0]).not.eql(0xff)\n })\n})\n\ndescribe('concatBuffers', () => {\n it('should concat buffers', () => {\n const buf = concatBuffers([new Uint8Array([1, 2, 3]), new Uint8Array([4, 5, 6])])\n\n expect([...buf]).eql([1, 2, 3, 4, 5, 6])\n })\n\n it('should create a new buffer', () => {\n const buf1 = new Uint8Array([1, 2, 3])\n const buf2 = new Uint8Array([4, 5, 6])\n const buf = concatBuffers([buf1, buf2])\n\n buf[0] = 0xff\n expect(buf1[0]).not.eql(0xff)\n })\n\n it('should work without native Buffer', () => {\n vi.stubGlobal('Buffer', undefined)\n const buf1 = new Uint8Array([1, 2, 3])\n const buf2 = new Uint8Array([4, 5, 6])\n const buf = concatBuffers([buf1, buf2])\n\n buf1[0] = 0xff\n\n expect([...buf]).eql([1, 2, 3, 4, 5, 6])\n })\n\n afterEach(() => void vi.unstubAllGlobals())\n})\n\ndescribe('bufferToReversed', () => {\n it('should reverse the buffer', () => {\n const buf = bufferToReversed(new Uint8Array([1, 2, 3, 4, 5, 6]))\n\n expect([...buf]).eql([6, 5, 4, 3, 2, 1])\n })\n\n it('should reverse a part of the buffer', () => {\n const buf = bufferToReversed(new Uint8Array([1, 2, 3, 4, 5, 6]), 1, 5)\n\n expect([...buf]).eql([5, 4, 3, 2])\n })\n\n it('should create a new buffer', () => {\n const buf1 = new Uint8Array([1, 2, 3])\n const buf2 = bufferToReversed(buf1)\n\n buf2[0] = 0xff\n expect([...buf1]).eql([1, 2, 3])\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,25 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { ConditionVariable } from './condition-variable.js';
3
+ describe('ConditionVariable', () => {
4
+ it('should correctly unlock execution', async () => {
5
+ const cv = new ConditionVariable();
6
+ setTimeout(() => cv.notify(), 10);
7
+ await cv.wait();
8
+ expect(true).toBeTruthy();
9
+ });
10
+ it('should correctly time out', async () => {
11
+ const cv = new ConditionVariable();
12
+ await cv.wait(10);
13
+ expect(true).toBeTruthy();
14
+ });
15
+ it('should only unlock once', async () => {
16
+ const cv = new ConditionVariable();
17
+ setTimeout(() => {
18
+ cv.notify();
19
+ cv.notify();
20
+ }, 10);
21
+ await cv.wait();
22
+ expect(true).toBeTruthy();
23
+ });
24
+ });
25
+ //# sourceMappingURL=condition-variable.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"condition-variable.test.js","sourceRoot":"","sources":["../../../src/utils/condition-variable.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAE3D,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,EAAE,GAAG,IAAI,iBAAiB,EAAE,CAAA;QAElC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAA;QAEjC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAA;QAEf,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAA;IAC7B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,EAAE,GAAG,IAAI,iBAAiB,EAAE,CAAA;QAElC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAEjB,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAA;IAC7B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,EAAE,GAAG,IAAI,iBAAiB,EAAE,CAAA;QAElC,UAAU,CAAC,GAAG,EAAE;YACZ,EAAE,CAAC,MAAM,EAAE,CAAA;YACX,EAAE,CAAC,MAAM,EAAE,CAAA;QACf,CAAC,EAAE,EAAE,CAAC,CAAA;QAEN,MAAM,EAAE,CAAC,IAAI,EAAE,CAAA;QAEf,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAA;IAC7B,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { ConditionVariable } from './condition-variable.js'\n\ndescribe('ConditionVariable', () => {\n it('should correctly unlock execution', async () => {\n const cv = new ConditionVariable()\n\n setTimeout(() => cv.notify(), 10)\n\n await cv.wait()\n\n expect(true).toBeTruthy()\n })\n\n it('should correctly time out', async () => {\n const cv = new ConditionVariable()\n\n await cv.wait(10)\n\n expect(true).toBeTruthy()\n })\n\n it('should only unlock once', async () => {\n const cv = new ConditionVariable()\n\n setTimeout(() => {\n cv.notify()\n cv.notify()\n }, 10)\n\n await cv.wait()\n\n expect(true).toBeTruthy()\n })\n})\n"]}
@@ -5,11 +5,6 @@ export type ControllablePromise<T = unknown> = Promise<T> & {
5
5
  resolve(val: T): void;
6
6
  reject(err?: unknown): void;
7
7
  };
8
- /**
9
- * The promise was cancelled
10
- */
11
- export declare class PromiseCancelledError extends Error {
12
- }
13
8
  /**
14
9
  * Creates a promise that can be resolved or rejected from outside.
15
10
  */
@@ -1,8 +1,3 @@
1
- /**
2
- * The promise was cancelled
3
- */
4
- export class PromiseCancelledError extends Error {
5
- }
6
1
  /**
7
2
  * Creates a promise that can be resolved or rejected from outside.
8
3
  */
@@ -1 +1 @@
1
- {"version":3,"file":"controllable-promise.js","sourceRoot":"","sources":["../../../src/utils/controllable-promise.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,OAAO,qBAAsB,SAAQ,KAAK;CAAG;AAEnD;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACrC,IAAI,QAA2C,CAAA;IAC/C,IAAI,OAAyC,CAAA;IAC7C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC/C,QAAQ,GAAG,OAAO,CAAA;QAClB,OAAO,GAAG,MAAM,CAAA;IACpB,CAAC,CAAC,CAGD;IAAC,OAAkC,CAAC,OAAO,GAAG,QAAS,CACvD;IAAC,OAAkC,CAAC,MAAM,GAAG,OAAQ,CAAA;IAEtD,OAAO,OAAiC,CAAA;AAC5C,CAAC","sourcesContent":["/**\n * A promise that can be resolved or rejected from outside.\n */\nexport type ControllablePromise<T = unknown> = Promise<T> & {\n resolve(val: T): void\n reject(err?: unknown): void\n}\n\n/**\n * The promise was cancelled\n */\nexport class PromiseCancelledError extends Error {}\n\n/**\n * Creates a promise that can be resolved or rejected from outside.\n */\nexport function createControllablePromise<T = unknown>(): ControllablePromise<T> {\n let _resolve: ControllablePromise<T>['resolve']\n let _reject: ControllablePromise<T>['reject']\n const promise = new Promise<T>((resolve, reject) => {\n _resolve = resolve\n _reject = reject\n })\n // ts doesn't like this, but it's fine\n\n ;(promise as ControllablePromise<T>).resolve = _resolve!\n ;(promise as ControllablePromise<T>).reject = _reject!\n\n return promise as ControllablePromise<T>\n}\n"]}
1
+ {"version":3,"file":"controllable-promise.js","sourceRoot":"","sources":["../../../src/utils/controllable-promise.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACrC,IAAI,QAA2C,CAAA;IAC/C,IAAI,OAAyC,CAAA;IAC7C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC/C,QAAQ,GAAG,OAAO,CAAA;QAClB,OAAO,GAAG,MAAM,CAAA;IACpB,CAAC,CAAC,CAGD;IAAC,OAAkC,CAAC,OAAO,GAAG,QAAS,CACvD;IAAC,OAAkC,CAAC,MAAM,GAAG,OAAQ,CAAA;IAEtD,OAAO,OAAiC,CAAA;AAC5C,CAAC","sourcesContent":["/**\n * A promise that can be resolved or rejected from outside.\n */\nexport type ControllablePromise<T = unknown> = Promise<T> & {\n resolve(val: T): void\n reject(err?: unknown): void\n}\n\n/**\n * Creates a promise that can be resolved or rejected from outside.\n */\nexport function createControllablePromise<T = unknown>(): ControllablePromise<T> {\n let _resolve: ControllablePromise<T>['resolve']\n let _reject: ControllablePromise<T>['reject']\n const promise = new Promise<T>((resolve, reject) => {\n _resolve = resolve\n _reject = reject\n })\n // ts doesn't like this, but it's fine\n\n ;(promise as ControllablePromise<T>).resolve = _resolve!\n ;(promise as ControllablePromise<T>).reject = _reject!\n\n return promise as ControllablePromise<T>\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,15 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { createControllablePromise } from './controllable-promise.js';
3
+ describe('createControllablePromise', () => {
4
+ it('should resolve', async () => {
5
+ const p = createControllablePromise();
6
+ p.resolve(1);
7
+ await expect(p).resolves.toBe(1);
8
+ });
9
+ it('should reject', async () => {
10
+ const p = createControllablePromise();
11
+ p.reject(1);
12
+ await expect(p).rejects.toBe(1);
13
+ });
14
+ });
15
+ //# sourceMappingURL=controllable-promise.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controllable-promise.test.js","sourceRoot":"","sources":["../../../src/utils/controllable-promise.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAA;AAErE,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE;QAC5B,MAAM,CAAC,GAAG,yBAAyB,EAAE,CAAA;QACrC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QACZ,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE;QAC3B,MAAM,CAAC,GAAG,yBAAyB,EAAE,CAAA;QACrC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACX,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { createControllablePromise } from './controllable-promise.js'\n\ndescribe('createControllablePromise', () => {\n it('should resolve', async () => {\n const p = createControllablePromise()\n p.resolve(1)\n await expect(p).resolves.toBe(1)\n })\n\n it('should reject', async () => {\n const p = createControllablePromise()\n p.reject(1)\n await expect(p).rejects.toBe(1)\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ export {};