@mtcute/core 0.1.1 → 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 (253) hide show
  1. package/cjs/network/auth-key.test.d.ts +1 -0
  2. package/cjs/network/auth-key.test.js +111 -0
  3. package/cjs/network/auth-key.test.js.map +1 -0
  4. package/cjs/network/config-manager.js +2 -1
  5. package/cjs/network/config-manager.js.map +1 -1
  6. package/cjs/network/config-manager.test.d.ts +1 -0
  7. package/cjs/network/config-manager.test.js +170 -0
  8. package/cjs/network/config-manager.test.js.map +1 -0
  9. package/cjs/network/network-manager.js +1 -1
  10. package/cjs/network/persistent-connection.test.d.ts +1 -0
  11. package/cjs/network/persistent-connection.test.js +157 -0
  12. package/cjs/network/persistent-connection.test.js.map +1 -0
  13. package/cjs/network/session-connection.js +3 -2
  14. package/cjs/network/session-connection.js.map +1 -1
  15. package/cjs/network/transports/intermediate.test.d.ts +1 -0
  16. package/cjs/network/transports/intermediate.test.js +86 -0
  17. package/cjs/network/transports/intermediate.test.js.map +1 -0
  18. package/cjs/network/transports/obfuscated.js +1 -1
  19. package/cjs/network/transports/obfuscated.js.map +1 -1
  20. package/cjs/network/transports/obfuscated.test.d.ts +1 -0
  21. package/cjs/network/transports/obfuscated.test.js +131 -0
  22. package/cjs/network/transports/obfuscated.test.js.map +1 -0
  23. package/cjs/network/transports/tcp.js +1 -1
  24. package/cjs/network/transports/tcp.js.map +1 -1
  25. package/cjs/network/transports/tcp.test.d.ts +1 -0
  26. package/cjs/network/transports/tcp.test.js +97 -0
  27. package/cjs/network/transports/tcp.test.js.map +1 -0
  28. package/cjs/network/transports/websocket.test.d.ts +1 -0
  29. package/cjs/network/transports/websocket.test.js +91 -0
  30. package/cjs/network/transports/websocket.test.js.map +1 -0
  31. package/cjs/storage/json.test.d.ts +1 -0
  32. package/cjs/storage/json.test.js +37 -0
  33. package/cjs/storage/json.test.js.map +1 -0
  34. package/cjs/storage/localstorage.test.d.ts +1 -0
  35. package/cjs/storage/localstorage.test.js +23 -0
  36. package/cjs/storage/localstorage.test.js.map +1 -0
  37. package/cjs/storage/memory.test.d.ts +1 -0
  38. package/cjs/storage/memory.test.js +47 -0
  39. package/cjs/storage/memory.test.js.map +1 -0
  40. package/cjs/utils/async-lock.test.d.ts +1 -0
  41. package/cjs/utils/async-lock.test.js +25 -0
  42. package/cjs/utils/async-lock.test.js.map +1 -0
  43. package/cjs/utils/bigint-utils.test.d.ts +1 -0
  44. package/cjs/utils/bigint-utils.test.js +150 -0
  45. package/cjs/utils/bigint-utils.test.js.map +1 -0
  46. package/cjs/utils/buffer-utils.test.d.ts +1 -0
  47. package/cjs/utils/buffer-utils.test.js +69 -0
  48. package/cjs/utils/buffer-utils.test.js.map +1 -0
  49. package/cjs/utils/condition-variable.test.d.ts +1 -0
  50. package/cjs/utils/condition-variable.test.js +27 -0
  51. package/cjs/utils/condition-variable.test.js.map +1 -0
  52. package/cjs/utils/controllable-promise.test.d.ts +1 -0
  53. package/cjs/utils/controllable-promise.test.js +17 -0
  54. package/cjs/utils/controllable-promise.test.js.map +1 -0
  55. package/cjs/utils/crypto/keys.test.d.ts +1 -0
  56. package/cjs/utils/crypto/keys.test.js +40 -0
  57. package/cjs/utils/crypto/keys.test.js.map +1 -0
  58. package/cjs/utils/crypto/miller-rabin.test.d.ts +1 -0
  59. package/cjs/utils/crypto/miller-rabin.test.js +60 -0
  60. package/cjs/utils/crypto/miller-rabin.test.js.map +1 -0
  61. package/cjs/utils/crypto/mtproto.test.d.ts +1 -0
  62. package/cjs/utils/crypto/mtproto.test.js +47 -0
  63. package/cjs/utils/crypto/mtproto.test.js.map +1 -0
  64. package/cjs/utils/crypto/node.test.d.ts +1 -0
  65. package/cjs/utils/crypto/node.test.js +13 -0
  66. package/cjs/utils/crypto/node.test.js.map +1 -0
  67. package/cjs/utils/crypto/password.test.d.ts +1 -0
  68. package/cjs/utils/crypto/password.test.js +95 -0
  69. package/cjs/utils/crypto/password.test.js.map +1 -0
  70. package/cjs/utils/crypto/utils.test.d.ts +1 -0
  71. package/cjs/utils/crypto/utils.test.js +49 -0
  72. package/cjs/utils/crypto/utils.test.js.map +1 -0
  73. package/cjs/utils/crypto/web.test.d.ts +1 -0
  74. package/cjs/utils/crypto/web.test.js +17 -0
  75. package/cjs/utils/crypto/web.test.js.map +1 -0
  76. package/cjs/utils/deque.test.d.ts +1 -0
  77. package/cjs/utils/deque.test.js +128 -0
  78. package/cjs/utils/deque.test.js.map +1 -0
  79. package/cjs/utils/function-utils.test.d.ts +1 -0
  80. package/cjs/utils/function-utils.test.js +23 -0
  81. package/cjs/utils/function-utils.test.js.map +1 -0
  82. package/cjs/utils/linked-list.test.d.ts +1 -0
  83. package/cjs/utils/linked-list.test.js +36 -0
  84. package/cjs/utils/linked-list.test.js.map +1 -0
  85. package/cjs/utils/links/bots.test.d.ts +1 -0
  86. package/cjs/utils/links/bots.test.js +152 -0
  87. package/cjs/utils/links/bots.test.js.map +1 -0
  88. package/cjs/utils/links/chat.test.d.ts +1 -0
  89. package/cjs/utils/links/chat.test.js +84 -0
  90. package/cjs/utils/links/chat.test.js.map +1 -0
  91. package/cjs/utils/links/misc.test.d.ts +1 -0
  92. package/cjs/utils/links/misc.test.js +153 -0
  93. package/cjs/utils/links/misc.test.js.map +1 -0
  94. package/cjs/utils/links/proxy.test.d.ts +1 -0
  95. package/cjs/utils/links/proxy.test.js +74 -0
  96. package/cjs/utils/links/proxy.test.js.map +1 -0
  97. package/cjs/utils/links/user.test.d.ts +1 -0
  98. package/cjs/utils/links/user.test.js +63 -0
  99. package/cjs/utils/links/user.test.js.map +1 -0
  100. package/cjs/utils/logger.test.d.ts +1 -0
  101. package/cjs/utils/logger.test.js +125 -0
  102. package/cjs/utils/logger.test.js.map +1 -0
  103. package/cjs/utils/long-utils.test.d.ts +1 -0
  104. package/cjs/utils/long-utils.test.js +158 -0
  105. package/cjs/utils/long-utils.test.js.map +1 -0
  106. package/cjs/utils/lru-map.test.d.ts +1 -0
  107. package/cjs/utils/lru-map.test.js +96 -0
  108. package/cjs/utils/lru-map.test.js.map +1 -0
  109. package/cjs/utils/lru-set.test.d.ts +1 -0
  110. package/cjs/utils/lru-set.test.js +77 -0
  111. package/cjs/utils/lru-set.test.js.map +1 -0
  112. package/cjs/utils/peer-utils.test.d.ts +1 -0
  113. package/cjs/utils/peer-utils.test.js +122 -0
  114. package/cjs/utils/peer-utils.test.js.map +1 -0
  115. package/cjs/utils/sorted-array.test.d.ts +1 -0
  116. package/cjs/utils/sorted-array.test.js +66 -0
  117. package/cjs/utils/sorted-array.test.js.map +1 -0
  118. package/cjs/utils/string-session.test.d.ts +1 -0
  119. package/cjs/utils/string-session.test.js +106 -0
  120. package/cjs/utils/string-session.test.js.map +1 -0
  121. package/cjs/utils/tl-json.test.d.ts +1 -0
  122. package/cjs/utils/tl-json.test.js +83 -0
  123. package/cjs/utils/tl-json.test.js.map +1 -0
  124. package/cjs/utils/type-assertions.test.d.ts +1 -0
  125. package/cjs/utils/type-assertions.test.js +67 -0
  126. package/cjs/utils/type-assertions.test.js.map +1 -0
  127. package/esm/network/auth-key.test.d.ts +1 -0
  128. package/esm/network/auth-key.test.js +106 -0
  129. package/esm/network/auth-key.test.js.map +1 -0
  130. package/esm/network/config-manager.js +2 -1
  131. package/esm/network/config-manager.js.map +1 -1
  132. package/esm/network/config-manager.test.d.ts +1 -0
  133. package/esm/network/config-manager.test.js +168 -0
  134. package/esm/network/config-manager.test.js.map +1 -0
  135. package/esm/network/network-manager.js +1 -1
  136. package/esm/network/persistent-connection.test.d.ts +1 -0
  137. package/esm/network/persistent-connection.test.js +155 -0
  138. package/esm/network/persistent-connection.test.js.map +1 -0
  139. package/esm/network/session-connection.js +3 -2
  140. package/esm/network/session-connection.js.map +1 -1
  141. package/esm/network/transports/intermediate.test.d.ts +1 -0
  142. package/esm/network/transports/intermediate.test.js +84 -0
  143. package/esm/network/transports/intermediate.test.js.map +1 -0
  144. package/esm/network/transports/obfuscated.js +1 -1
  145. package/esm/network/transports/obfuscated.js.map +1 -1
  146. package/esm/network/transports/obfuscated.test.d.ts +1 -0
  147. package/esm/network/transports/obfuscated.test.js +129 -0
  148. package/esm/network/transports/obfuscated.test.js.map +1 -0
  149. package/esm/network/transports/tcp.js +1 -1
  150. package/esm/network/transports/tcp.js.map +1 -1
  151. package/esm/network/transports/tcp.test.d.ts +1 -0
  152. package/esm/network/transports/tcp.test.js +95 -0
  153. package/esm/network/transports/tcp.test.js.map +1 -0
  154. package/esm/network/transports/websocket.test.d.ts +1 -0
  155. package/esm/network/transports/websocket.test.js +89 -0
  156. package/esm/network/transports/websocket.test.js.map +1 -0
  157. package/esm/storage/json.test.d.ts +1 -0
  158. package/esm/storage/json.test.js +35 -0
  159. package/esm/storage/json.test.js.map +1 -0
  160. package/esm/storage/localstorage.test.d.ts +1 -0
  161. package/esm/storage/localstorage.test.js +21 -0
  162. package/esm/storage/localstorage.test.js.map +1 -0
  163. package/esm/storage/memory.test.d.ts +1 -0
  164. package/esm/storage/memory.test.js +45 -0
  165. package/esm/storage/memory.test.js.map +1 -0
  166. package/esm/utils/async-lock.test.d.ts +1 -0
  167. package/esm/utils/async-lock.test.js +23 -0
  168. package/esm/utils/async-lock.test.js.map +1 -0
  169. package/esm/utils/bigint-utils.test.d.ts +1 -0
  170. package/esm/utils/bigint-utils.test.js +148 -0
  171. package/esm/utils/bigint-utils.test.js.map +1 -0
  172. package/esm/utils/buffer-utils.test.d.ts +1 -0
  173. package/esm/utils/buffer-utils.test.js +67 -0
  174. package/esm/utils/buffer-utils.test.js.map +1 -0
  175. package/esm/utils/condition-variable.test.d.ts +1 -0
  176. package/esm/utils/condition-variable.test.js +25 -0
  177. package/esm/utils/condition-variable.test.js.map +1 -0
  178. package/esm/utils/controllable-promise.test.d.ts +1 -0
  179. package/esm/utils/controllable-promise.test.js +15 -0
  180. package/esm/utils/controllable-promise.test.js.map +1 -0
  181. package/esm/utils/crypto/keys.test.d.ts +1 -0
  182. package/esm/utils/crypto/keys.test.js +38 -0
  183. package/esm/utils/crypto/keys.test.js.map +1 -0
  184. package/esm/utils/crypto/miller-rabin.test.d.ts +1 -0
  185. package/esm/utils/crypto/miller-rabin.test.js +58 -0
  186. package/esm/utils/crypto/miller-rabin.test.js.map +1 -0
  187. package/esm/utils/crypto/mtproto.test.d.ts +1 -0
  188. package/esm/utils/crypto/mtproto.test.js +45 -0
  189. package/esm/utils/crypto/mtproto.test.js.map +1 -0
  190. package/esm/utils/crypto/node.test.d.ts +1 -0
  191. package/esm/utils/crypto/node.test.js +11 -0
  192. package/esm/utils/crypto/node.test.js.map +1 -0
  193. package/esm/utils/crypto/password.test.d.ts +1 -0
  194. package/esm/utils/crypto/password.test.js +90 -0
  195. package/esm/utils/crypto/password.test.js.map +1 -0
  196. package/esm/utils/crypto/utils.test.d.ts +1 -0
  197. package/esm/utils/crypto/utils.test.js +47 -0
  198. package/esm/utils/crypto/utils.test.js.map +1 -0
  199. package/esm/utils/crypto/web.test.d.ts +1 -0
  200. package/esm/utils/crypto/web.test.js +15 -0
  201. package/esm/utils/crypto/web.test.js.map +1 -0
  202. package/esm/utils/deque.test.d.ts +1 -0
  203. package/esm/utils/deque.test.js +126 -0
  204. package/esm/utils/deque.test.js.map +1 -0
  205. package/esm/utils/function-utils.test.d.ts +1 -0
  206. package/esm/utils/function-utils.test.js +21 -0
  207. package/esm/utils/function-utils.test.js.map +1 -0
  208. package/esm/utils/linked-list.test.d.ts +1 -0
  209. package/esm/utils/linked-list.test.js +34 -0
  210. package/esm/utils/linked-list.test.js.map +1 -0
  211. package/esm/utils/links/bots.test.d.ts +1 -0
  212. package/esm/utils/links/bots.test.js +150 -0
  213. package/esm/utils/links/bots.test.js.map +1 -0
  214. package/esm/utils/links/chat.test.d.ts +1 -0
  215. package/esm/utils/links/chat.test.js +82 -0
  216. package/esm/utils/links/chat.test.js.map +1 -0
  217. package/esm/utils/links/misc.test.d.ts +1 -0
  218. package/esm/utils/links/misc.test.js +151 -0
  219. package/esm/utils/links/misc.test.js.map +1 -0
  220. package/esm/utils/links/proxy.test.d.ts +1 -0
  221. package/esm/utils/links/proxy.test.js +72 -0
  222. package/esm/utils/links/proxy.test.js.map +1 -0
  223. package/esm/utils/links/user.test.d.ts +1 -0
  224. package/esm/utils/links/user.test.js +61 -0
  225. package/esm/utils/links/user.test.js.map +1 -0
  226. package/esm/utils/logger.test.d.ts +1 -0
  227. package/esm/utils/logger.test.js +120 -0
  228. package/esm/utils/logger.test.js.map +1 -0
  229. package/esm/utils/long-utils.test.d.ts +1 -0
  230. package/esm/utils/long-utils.test.js +153 -0
  231. package/esm/utils/long-utils.test.js.map +1 -0
  232. package/esm/utils/lru-map.test.d.ts +1 -0
  233. package/esm/utils/lru-map.test.js +94 -0
  234. package/esm/utils/lru-map.test.js.map +1 -0
  235. package/esm/utils/lru-set.test.d.ts +1 -0
  236. package/esm/utils/lru-set.test.js +72 -0
  237. package/esm/utils/lru-set.test.js.map +1 -0
  238. package/esm/utils/peer-utils.test.d.ts +1 -0
  239. package/esm/utils/peer-utils.test.js +117 -0
  240. package/esm/utils/peer-utils.test.js.map +1 -0
  241. package/esm/utils/sorted-array.test.d.ts +1 -0
  242. package/esm/utils/sorted-array.test.js +64 -0
  243. package/esm/utils/sorted-array.test.js.map +1 -0
  244. package/esm/utils/string-session.test.d.ts +1 -0
  245. package/esm/utils/string-session.test.js +104 -0
  246. package/esm/utils/string-session.test.js.map +1 -0
  247. package/esm/utils/tl-json.test.d.ts +1 -0
  248. package/esm/utils/tl-json.test.js +81 -0
  249. package/esm/utils/tl-json.test.js.map +1 -0
  250. package/esm/utils/type-assertions.test.d.ts +1 -0
  251. package/esm/utils/type-assertions.test.js +65 -0
  252. package/esm/utils/type-assertions.test.js.map +1 -0
  253. package/package.json +2 -2
@@ -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"]}
@@ -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"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,45 @@
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: 1,
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
+ self: null,
26
+ });
27
+ }
28
+ }
29
+ const s = new ExtendedMemoryStorage();
30
+ expect(s.getUpdatesState()).toEqual([1, 2, 3, 4]);
31
+ });
32
+ it('should silently fail if version is wrong', () => {
33
+ class ExtendedMemoryStorage extends MemoryStorage {
34
+ constructor() {
35
+ super();
36
+ // eslint-disable-next-line
37
+ this._setStateFrom({ $version: 0 });
38
+ }
39
+ }
40
+ const s = new ExtendedMemoryStorage();
41
+ expect(s.getUpdatesState()).toEqual(null);
42
+ });
43
+ });
44
+ });
45
+ //# 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;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: 1,\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 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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAEtD,OAAO,EACH,eAAe,EACf,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,GAClB,MAAM,YAAY,CAAA;AAEnB,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACjC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACjC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACjC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACnC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;QACjF,MAAM,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;QACvF,MAAM,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;QAC/G,MAAM,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;QACzF,MAAM,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,qBAAqB,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACrE,GAAG,iBAAiB,CAAC,kBAAkB,CAAC;SAC3C,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;QAChF,MAAM,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;QACtF,MAAM,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;QAC9G,MAAM,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;QACxF,MAAM,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,qBAAqB,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACpE,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE;SACrD,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACpC,MAAM,GAAG,GAAG,iBAAiB,CACzB,0HAA0H,CAC7H,CAAA;QACD,MAAM,GAAG,GAAG,MAAM,CACd,4HAA4H,CAC/H,CAAA;QAED,MAAM,CAAC,CAAC,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;QACxD,MAAM,CAAC,CAAC,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IACrE,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAA;QAC3F,MAAM,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAA;QACjG,MAAM,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAA;IACvG,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAA;QAC1F,MAAM,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAA;QAChG,MAAM,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAA;IACtG,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACpC,MAAM,GAAG,GAAG,iBAAiB,CACzB,0HAA0H,CAC7H,CAAA;QACD,MAAM,GAAG,GAAG,MAAM,CACd,4HAA4H,CAC/H,CAAA;QAED,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;QAChE,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC7E,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;IAChC,MAAM,CAAC,GAAG,MAAM,yBAAyB,EAAE,CAAA;IAE3C,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAC7B,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAE7B,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACjE,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAC7B,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAE7B,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QACtD,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;IAC1D,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;IACpC,MAAM,CAAC,GAAG,MAAM,yBAAyB,EAAE,CAAA;IAE3C,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,GAAG,gBAAgB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACjC,MAAM,CAAC,GAAG,gBAAgB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAEjC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,GAAG,gBAAgB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACjC,MAAM,CAAC,GAAG,gBAAgB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAEjC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAA;QAClD,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;IACvC,MAAM,CAAC,GAAG,MAAM,yBAAyB,EAAE,CAAA;IAE3C,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,GAAG,mBAAmB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;QACxC,MAAM,CAAC,GAAG,mBAAmB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;QAExC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,GAAG,mBAAmB,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QAE5C,MAAM,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAA;QACtC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC3E,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACvC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACvC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACvC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACvC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC5C,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACvB,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACrC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACrC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC5C,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC5C,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC5C,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAChD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QAClD,qGAAqG;QACrG,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACxC,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACtD,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IAC1D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QAClD,qGAAqG;QACrG,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA","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"]}
@@ -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 {};
@@ -0,0 +1,38 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { findKeyByFingerprints, parsePublicKey } from '../index.js';
3
+ import { NodeCryptoProvider } from './node.js';
4
+ const crypto = new NodeCryptoProvider();
5
+ describe('parsePublicKey', () => {
6
+ it('should parse telegram public keys', () => {
7
+ expect(parsePublicKey(crypto, `-----BEGIN RSA PUBLIC KEY-----
8
+ MIIBCgKCAQEAruw2yP/BCcsJliRoW5eBVBVle9dtjJw+OYED160Wybum9SXtBBLX
9
+ riwt4rROd9csv0t0OHCaTmRqBcQ0J8fxhN6/cpR1GWgOZRUAiQxoMnlt0R93LCX/
10
+ j1dnVa/gVbCjdSxpbrfY2g2L4frzjJvdl84Kd9ORYjDEAyFnEA7dD556OptgLQQ2
11
+ e2iVNq8NZLYTzLp5YpOdO1doK+ttrltggTCy5SrKeLoCPPbOgGsdxJxyz5KKcZnS
12
+ Lj16yE5HvJQn0CNpRdENvRUXe6tBP78O39oJ8BTHp9oIjd6XWXAsp2CvK45Ol8wF
13
+ XGF710w9lwCGNbmNxNYhtIkdqfsEcwR5JwIDAQAB
14
+ -----END RSA PUBLIC KEY-----`)).eql({
15
+ modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',
16
+ exponent: '010001',
17
+ fingerprint: '0bc35f3509f7b7a5',
18
+ old: false,
19
+ });
20
+ });
21
+ it('should be able to find a key by its fingerprint', () => {
22
+ expect(findKeyByFingerprints(['b25898df208d2603'])).toMatchInlineSnapshot(`
23
+ {
24
+ "exponent": "010001",
25
+ "fingerprint": "b25898df208d2603",
26
+ "modulus": "c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5",
27
+ "old": false,
28
+ }
29
+ `);
30
+ });
31
+ it('should prefer new keys over old', () => {
32
+ expect(findKeyByFingerprints(['71e025b6c76033e3', 'b25898df208d2603'])?.fingerprint).toEqual('b25898df208d2603');
33
+ });
34
+ it('should return null if not found', () => {
35
+ expect(findKeyByFingerprints(['deadbeefdeadbeef'])).toBeNull();
36
+ });
37
+ });
38
+ //# sourceMappingURL=keys.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.test.js","sourceRoot":"","sources":["../../../../src/utils/crypto/keys.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAE9C,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAA;AAEvC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QACzC,MAAM,CACF,cAAc,CACV,MAAM,EACN;;;;;;;6BAOa,CAChB,CACJ,CAAC,GAAG,CAAC;YACF,OAAO,EACH,kgBAAkgB;YACtgB,QAAQ,EAAE,QAAQ;YAClB,WAAW,EAAE,kBAAkB;YAC/B,GAAG,EAAE,KAAK;SACb,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,qBAAqB,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;;;;;SAOzE,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,qBAAqB,CAAC,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAA;IACpH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,qBAAqB,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IAClE,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { findKeyByFingerprints, parsePublicKey } from '../index.js'\nimport { NodeCryptoProvider } from './node.js'\n\nconst crypto = new NodeCryptoProvider()\n\ndescribe('parsePublicKey', () => {\n it('should parse telegram public keys', () => {\n expect(\n parsePublicKey(\n crypto,\n `-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEAruw2yP/BCcsJliRoW5eBVBVle9dtjJw+OYED160Wybum9SXtBBLX\nriwt4rROd9csv0t0OHCaTmRqBcQ0J8fxhN6/cpR1GWgOZRUAiQxoMnlt0R93LCX/\nj1dnVa/gVbCjdSxpbrfY2g2L4frzjJvdl84Kd9ORYjDEAyFnEA7dD556OptgLQQ2\ne2iVNq8NZLYTzLp5YpOdO1doK+ttrltggTCy5SrKeLoCPPbOgGsdxJxyz5KKcZnS\nLj16yE5HvJQn0CNpRdENvRUXe6tBP78O39oJ8BTHp9oIjd6XWXAsp2CvK45Ol8wF\nXGF710w9lwCGNbmNxNYhtIkdqfsEcwR5JwIDAQAB\n-----END RSA PUBLIC KEY-----`,\n ),\n ).eql({\n modulus:\n 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\n exponent: '010001',\n fingerprint: '0bc35f3509f7b7a5',\n old: false,\n })\n })\n\n it('should be able to find a key by its fingerprint', () => {\n expect(findKeyByFingerprints(['b25898df208d2603'])).toMatchInlineSnapshot(`\n {\n \"exponent\": \"010001\",\n \"fingerprint\": \"b25898df208d2603\",\n \"modulus\": \"c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5\",\n \"old\": false,\n }\n `)\n })\n\n it('should prefer new keys over old', () => {\n expect(findKeyByFingerprints(['71e025b6c76033e3', 'b25898df208d2603'])?.fingerprint).toEqual('b25898df208d2603')\n })\n\n it('should return null if not found', () => {\n expect(findKeyByFingerprints(['deadbeefdeadbeef'])).toBeNull()\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ export {};