@mtcute/core 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (461) hide show
  1. package/cjs/base-client.js +4 -1
  2. package/cjs/base-client.js.map +1 -1
  3. package/cjs/network/auth-key.d.ts +3 -3
  4. package/cjs/network/auth-key.js +12 -12
  5. package/cjs/network/auth-key.js.map +1 -1
  6. package/cjs/network/auth-key.test.d.ts +1 -0
  7. package/cjs/network/auth-key.test.js +111 -0
  8. package/cjs/network/auth-key.test.js.map +1 -0
  9. package/cjs/network/authorization.js +62 -57
  10. package/cjs/network/authorization.js.map +1 -1
  11. package/cjs/network/config-manager.js +2 -1
  12. package/cjs/network/config-manager.js.map +1 -1
  13. package/cjs/network/config-manager.test.d.ts +1 -0
  14. package/cjs/network/config-manager.test.js +170 -0
  15. package/cjs/network/config-manager.test.js.map +1 -0
  16. package/cjs/network/mtproto-session.d.ts +2 -2
  17. package/cjs/network/mtproto-session.js +2 -2
  18. package/cjs/network/mtproto-session.js.map +1 -1
  19. package/cjs/network/multi-session-connection.d.ts +1 -1
  20. package/cjs/network/multi-session-connection.js +2 -2
  21. package/cjs/network/multi-session-connection.js.map +1 -1
  22. package/cjs/network/network-manager.d.ts +1 -0
  23. package/cjs/network/network-manager.js +21 -27
  24. package/cjs/network/network-manager.js.map +1 -1
  25. package/cjs/network/persistent-connection.test.d.ts +1 -0
  26. package/cjs/network/persistent-connection.test.js +157 -0
  27. package/cjs/network/persistent-connection.test.js.map +1 -0
  28. package/cjs/network/session-connection.d.ts +2 -1
  29. package/cjs/network/session-connection.js +51 -37
  30. package/cjs/network/session-connection.js.map +1 -1
  31. package/cjs/network/transports/intermediate.d.ts +3 -0
  32. package/cjs/network/transports/intermediate.js +5 -3
  33. package/cjs/network/transports/intermediate.js.map +1 -1
  34. package/cjs/network/transports/intermediate.test.d.ts +1 -0
  35. package/cjs/network/transports/intermediate.test.js +86 -0
  36. package/cjs/network/transports/intermediate.test.js.map +1 -0
  37. package/cjs/network/transports/obfuscated.js +15 -19
  38. package/cjs/network/transports/obfuscated.js.map +1 -1
  39. package/cjs/network/transports/obfuscated.test.d.ts +1 -0
  40. package/cjs/network/transports/obfuscated.test.js +131 -0
  41. package/cjs/network/transports/obfuscated.test.js.map +1 -0
  42. package/cjs/network/transports/tcp.js +1 -1
  43. package/cjs/network/transports/tcp.js.map +1 -1
  44. package/cjs/network/transports/tcp.test.d.ts +1 -0
  45. package/cjs/network/transports/tcp.test.js +97 -0
  46. package/cjs/network/transports/tcp.test.js.map +1 -0
  47. package/cjs/network/transports/websocket.test.d.ts +1 -0
  48. package/cjs/network/transports/websocket.test.js +91 -0
  49. package/cjs/network/transports/websocket.test.js.map +1 -0
  50. package/cjs/storage/abstract.d.ts +23 -2
  51. package/cjs/storage/abstract.js.map +1 -1
  52. package/cjs/storage/json.js +8 -9
  53. package/cjs/storage/json.js.map +1 -1
  54. package/cjs/storage/json.test.d.ts +1 -0
  55. package/cjs/storage/json.test.js +37 -0
  56. package/cjs/storage/json.test.js.map +1 -0
  57. package/cjs/storage/localstorage.js +5 -2
  58. package/cjs/storage/localstorage.js.map +1 -1
  59. package/cjs/storage/localstorage.test.d.ts +1 -0
  60. package/cjs/storage/localstorage.test.js +23 -0
  61. package/cjs/storage/localstorage.test.js.map +1 -0
  62. package/cjs/storage/memory.d.ts +7 -8
  63. package/cjs/storage/memory.js +7 -7
  64. package/cjs/storage/memory.js.map +1 -1
  65. package/cjs/storage/memory.test.d.ts +1 -0
  66. package/cjs/storage/memory.test.js +47 -0
  67. package/cjs/storage/memory.test.js.map +1 -0
  68. package/cjs/utils/async-lock.test.d.ts +1 -0
  69. package/cjs/utils/async-lock.test.js +25 -0
  70. package/cjs/utils/async-lock.test.js.map +1 -0
  71. package/cjs/utils/bigint-utils.d.ts +18 -11
  72. package/cjs/utils/bigint-utils.js +148 -47
  73. package/cjs/utils/bigint-utils.js.map +1 -1
  74. package/cjs/utils/bigint-utils.test.d.ts +1 -0
  75. package/cjs/utils/bigint-utils.test.js +150 -0
  76. package/cjs/utils/bigint-utils.test.js.map +1 -0
  77. package/cjs/utils/buffer-utils.d.ts +7 -1
  78. package/cjs/utils/buffer-utils.js +16 -3
  79. package/cjs/utils/buffer-utils.js.map +1 -1
  80. package/cjs/utils/buffer-utils.test.d.ts +1 -0
  81. package/cjs/utils/buffer-utils.test.js +69 -0
  82. package/cjs/utils/buffer-utils.test.js.map +1 -0
  83. package/cjs/utils/condition-variable.test.d.ts +1 -0
  84. package/cjs/utils/condition-variable.test.js +27 -0
  85. package/cjs/utils/condition-variable.test.js.map +1 -0
  86. package/cjs/utils/controllable-promise.test.d.ts +1 -0
  87. package/cjs/utils/controllable-promise.test.js +17 -0
  88. package/cjs/utils/controllable-promise.test.js.map +1 -0
  89. package/cjs/utils/crypto/abstract.d.ts +16 -9
  90. package/cjs/utils/crypto/abstract.js +6 -9
  91. package/cjs/utils/crypto/abstract.js.map +1 -1
  92. package/cjs/utils/crypto/factorization.d.ts +2 -1
  93. package/cjs/utils/crypto/factorization.js +28 -36
  94. package/cjs/utils/crypto/factorization.js.map +1 -1
  95. package/cjs/utils/crypto/index.d.ts +4 -0
  96. package/cjs/utils/crypto/index.js +4 -0
  97. package/cjs/utils/crypto/index.js.map +1 -1
  98. package/cjs/utils/crypto/keys.d.ts +2 -2
  99. package/cjs/utils/crypto/keys.js +4 -4
  100. package/cjs/utils/crypto/keys.js.map +1 -1
  101. package/cjs/utils/crypto/keys.test.d.ts +1 -0
  102. package/cjs/utils/crypto/keys.test.js +40 -0
  103. package/cjs/utils/crypto/keys.test.js.map +1 -0
  104. package/cjs/utils/crypto/miller-rabin.d.ts +2 -2
  105. package/cjs/utils/crypto/miller-rabin.js +20 -22
  106. package/cjs/utils/crypto/miller-rabin.js.map +1 -1
  107. package/cjs/utils/crypto/miller-rabin.test.d.ts +1 -0
  108. package/cjs/utils/crypto/miller-rabin.test.js +60 -0
  109. package/cjs/utils/crypto/miller-rabin.test.js.map +1 -0
  110. package/cjs/utils/crypto/mtproto.d.ts +3 -3
  111. package/cjs/utils/crypto/mtproto.js +12 -12
  112. package/cjs/utils/crypto/mtproto.js.map +1 -1
  113. package/cjs/utils/crypto/mtproto.test.d.ts +1 -0
  114. package/cjs/utils/crypto/mtproto.test.js +47 -0
  115. package/cjs/utils/crypto/mtproto.test.js.map +1 -0
  116. package/cjs/utils/crypto/node.d.ts +21 -0
  117. package/cjs/utils/crypto/node.js +74 -0
  118. package/cjs/utils/crypto/node.js.map +1 -0
  119. package/cjs/utils/crypto/node.test.d.ts +1 -0
  120. package/cjs/utils/crypto/node.test.js +13 -0
  121. package/cjs/utils/crypto/node.test.js.map +1 -0
  122. package/cjs/utils/crypto/password.js +22 -33
  123. package/cjs/utils/crypto/password.js.map +1 -1
  124. package/cjs/utils/crypto/password.test.d.ts +1 -0
  125. package/cjs/utils/crypto/password.test.js +95 -0
  126. package/cjs/utils/crypto/password.test.js.map +1 -0
  127. package/cjs/utils/crypto/utils.test.d.ts +1 -0
  128. package/cjs/utils/crypto/utils.test.js +49 -0
  129. package/cjs/utils/crypto/utils.test.js.map +1 -0
  130. package/cjs/utils/crypto/wasm.d.ts +22 -0
  131. package/cjs/utils/crypto/wasm.js +41 -0
  132. package/cjs/utils/crypto/wasm.js.map +1 -0
  133. package/cjs/utils/crypto/web.d.ts +11 -0
  134. package/cjs/utils/crypto/web.js +40 -0
  135. package/cjs/utils/crypto/web.js.map +1 -0
  136. package/cjs/utils/crypto/web.test.d.ts +1 -0
  137. package/cjs/utils/crypto/web.test.js +17 -0
  138. package/cjs/utils/crypto/web.test.js.map +1 -0
  139. package/cjs/utils/deque.d.ts +1 -1
  140. package/cjs/utils/deque.js +9 -3
  141. package/cjs/utils/deque.js.map +1 -1
  142. package/cjs/utils/deque.test.d.ts +1 -0
  143. package/cjs/utils/deque.test.js +128 -0
  144. package/cjs/utils/deque.test.js.map +1 -0
  145. package/cjs/utils/function-utils.d.ts +4 -1
  146. package/cjs/utils/function-utils.js +8 -1
  147. package/cjs/utils/function-utils.js.map +1 -1
  148. package/cjs/utils/function-utils.test.d.ts +1 -0
  149. package/cjs/utils/function-utils.test.js +23 -0
  150. package/cjs/utils/function-utils.test.js.map +1 -0
  151. package/cjs/utils/index.d.ts +0 -1
  152. package/cjs/utils/index.js +0 -1
  153. package/cjs/utils/index.js.map +1 -1
  154. package/cjs/utils/linked-list.test.d.ts +1 -0
  155. package/cjs/utils/linked-list.test.js +36 -0
  156. package/cjs/utils/linked-list.test.js.map +1 -0
  157. package/cjs/utils/links/bots.test.d.ts +1 -0
  158. package/cjs/utils/links/bots.test.js +152 -0
  159. package/cjs/utils/links/bots.test.js.map +1 -0
  160. package/cjs/utils/links/chat.test.d.ts +1 -0
  161. package/cjs/utils/links/chat.test.js +84 -0
  162. package/cjs/utils/links/chat.test.js.map +1 -0
  163. package/cjs/utils/links/misc.test.d.ts +1 -0
  164. package/cjs/utils/links/misc.test.js +153 -0
  165. package/cjs/utils/links/misc.test.js.map +1 -0
  166. package/cjs/utils/links/proxy.test.d.ts +1 -0
  167. package/cjs/utils/links/proxy.test.js +74 -0
  168. package/cjs/utils/links/proxy.test.js.map +1 -0
  169. package/cjs/utils/links/user.test.d.ts +1 -0
  170. package/cjs/utils/links/user.test.js +63 -0
  171. package/cjs/utils/links/user.test.js.map +1 -0
  172. package/cjs/utils/logger.d.ts +0 -1
  173. package/cjs/utils/logger.js +3 -4
  174. package/cjs/utils/logger.js.map +1 -1
  175. package/cjs/utils/logger.test.d.ts +1 -0
  176. package/cjs/utils/logger.test.js +125 -0
  177. package/cjs/utils/logger.test.js.map +1 -0
  178. package/cjs/utils/long-utils.test.d.ts +1 -0
  179. package/cjs/utils/long-utils.test.js +158 -0
  180. package/cjs/utils/long-utils.test.js.map +1 -0
  181. package/cjs/utils/lru-map.d.ts +1 -0
  182. package/cjs/utils/lru-map.js +6 -0
  183. package/cjs/utils/lru-map.js.map +1 -1
  184. package/cjs/utils/lru-map.test.d.ts +1 -0
  185. package/cjs/utils/lru-map.test.js +96 -0
  186. package/cjs/utils/lru-map.test.js.map +1 -0
  187. package/cjs/utils/lru-set.test.d.ts +1 -0
  188. package/cjs/utils/lru-set.test.js +77 -0
  189. package/cjs/utils/lru-set.test.js.map +1 -0
  190. package/cjs/utils/peer-utils.js +5 -1
  191. package/cjs/utils/peer-utils.js.map +1 -1
  192. package/cjs/utils/peer-utils.test.d.ts +1 -0
  193. package/cjs/utils/peer-utils.test.js +122 -0
  194. package/cjs/utils/peer-utils.test.js.map +1 -0
  195. package/cjs/utils/platform/crypto.js +2 -2
  196. package/cjs/utils/platform/crypto.js.map +1 -1
  197. package/cjs/utils/platform/crypto.web.js +2 -2
  198. package/cjs/utils/platform/crypto.web.js.map +1 -1
  199. package/cjs/utils/sorted-array.test.d.ts +1 -0
  200. package/cjs/utils/sorted-array.test.js +66 -0
  201. package/cjs/utils/sorted-array.test.js.map +1 -0
  202. package/cjs/utils/string-session.js +4 -2
  203. package/cjs/utils/string-session.js.map +1 -1
  204. package/cjs/utils/string-session.test.d.ts +1 -0
  205. package/cjs/utils/string-session.test.js +106 -0
  206. package/cjs/utils/string-session.test.js.map +1 -0
  207. package/cjs/utils/tl-json.test.d.ts +1 -0
  208. package/cjs/utils/tl-json.test.js +83 -0
  209. package/cjs/utils/tl-json.test.js.map +1 -0
  210. package/cjs/utils/type-assertions.test.d.ts +1 -0
  211. package/cjs/utils/type-assertions.test.js +67 -0
  212. package/cjs/utils/type-assertions.test.js.map +1 -0
  213. package/esm/base-client.js +4 -1
  214. package/esm/base-client.js.map +1 -1
  215. package/esm/network/auth-key.d.ts +3 -3
  216. package/esm/network/auth-key.js +13 -13
  217. package/esm/network/auth-key.js.map +1 -1
  218. package/esm/network/auth-key.test.d.ts +1 -0
  219. package/esm/network/auth-key.test.js +106 -0
  220. package/esm/network/auth-key.test.js.map +1 -0
  221. package/esm/network/authorization.js +64 -59
  222. package/esm/network/authorization.js.map +1 -1
  223. package/esm/network/config-manager.js +2 -1
  224. package/esm/network/config-manager.js.map +1 -1
  225. package/esm/network/config-manager.test.d.ts +1 -0
  226. package/esm/network/config-manager.test.js +168 -0
  227. package/esm/network/config-manager.test.js.map +1 -0
  228. package/esm/network/mtproto-session.d.ts +2 -2
  229. package/esm/network/mtproto-session.js +2 -2
  230. package/esm/network/mtproto-session.js.map +1 -1
  231. package/esm/network/multi-session-connection.d.ts +1 -1
  232. package/esm/network/multi-session-connection.js +2 -2
  233. package/esm/network/multi-session-connection.js.map +1 -1
  234. package/esm/network/network-manager.d.ts +1 -0
  235. package/esm/network/network-manager.js +21 -27
  236. package/esm/network/network-manager.js.map +1 -1
  237. package/esm/network/persistent-connection.test.d.ts +1 -0
  238. package/esm/network/persistent-connection.test.js +155 -0
  239. package/esm/network/persistent-connection.test.js.map +1 -0
  240. package/esm/network/session-connection.d.ts +2 -1
  241. package/esm/network/session-connection.js +53 -39
  242. package/esm/network/session-connection.js.map +1 -1
  243. package/esm/network/transports/intermediate.d.ts +3 -0
  244. package/esm/network/transports/intermediate.js +6 -4
  245. package/esm/network/transports/intermediate.js.map +1 -1
  246. package/esm/network/transports/intermediate.test.d.ts +1 -0
  247. package/esm/network/transports/intermediate.test.js +84 -0
  248. package/esm/network/transports/intermediate.test.js.map +1 -0
  249. package/esm/network/transports/obfuscated.js +16 -20
  250. package/esm/network/transports/obfuscated.js.map +1 -1
  251. package/esm/network/transports/obfuscated.test.d.ts +1 -0
  252. package/esm/network/transports/obfuscated.test.js +129 -0
  253. package/esm/network/transports/obfuscated.test.js.map +1 -0
  254. package/esm/network/transports/tcp.js +1 -1
  255. package/esm/network/transports/tcp.js.map +1 -1
  256. package/esm/network/transports/tcp.test.d.ts +1 -0
  257. package/esm/network/transports/tcp.test.js +95 -0
  258. package/esm/network/transports/tcp.test.js.map +1 -0
  259. package/esm/network/transports/websocket.test.d.ts +1 -0
  260. package/esm/network/transports/websocket.test.js +89 -0
  261. package/esm/network/transports/websocket.test.js.map +1 -0
  262. package/esm/storage/abstract.d.ts +23 -2
  263. package/esm/storage/abstract.js.map +1 -1
  264. package/esm/storage/json.js +8 -9
  265. package/esm/storage/json.js.map +1 -1
  266. package/esm/storage/json.test.d.ts +1 -0
  267. package/esm/storage/json.test.js +35 -0
  268. package/esm/storage/json.test.js.map +1 -0
  269. package/esm/storage/localstorage.js +5 -2
  270. package/esm/storage/localstorage.js.map +1 -1
  271. package/esm/storage/localstorage.test.d.ts +1 -0
  272. package/esm/storage/localstorage.test.js +21 -0
  273. package/esm/storage/localstorage.test.js.map +1 -0
  274. package/esm/storage/memory.d.ts +7 -8
  275. package/esm/storage/memory.js +7 -7
  276. package/esm/storage/memory.js.map +1 -1
  277. package/esm/storage/memory.test.d.ts +1 -0
  278. package/esm/storage/memory.test.js +45 -0
  279. package/esm/storage/memory.test.js.map +1 -0
  280. package/esm/utils/async-lock.test.d.ts +1 -0
  281. package/esm/utils/async-lock.test.js +23 -0
  282. package/esm/utils/async-lock.test.js.map +1 -0
  283. package/esm/utils/bigint-utils.d.ts +18 -11
  284. package/esm/utils/bigint-utils.js +142 -44
  285. package/esm/utils/bigint-utils.js.map +1 -1
  286. package/esm/utils/bigint-utils.test.d.ts +1 -0
  287. package/esm/utils/bigint-utils.test.js +148 -0
  288. package/esm/utils/bigint-utils.test.js.map +1 -0
  289. package/esm/utils/buffer-utils.d.ts +7 -1
  290. package/esm/utils/buffer-utils.js +14 -1
  291. package/esm/utils/buffer-utils.js.map +1 -1
  292. package/esm/utils/buffer-utils.test.d.ts +1 -0
  293. package/esm/utils/buffer-utils.test.js +67 -0
  294. package/esm/utils/buffer-utils.test.js.map +1 -0
  295. package/esm/utils/condition-variable.test.d.ts +1 -0
  296. package/esm/utils/condition-variable.test.js +25 -0
  297. package/esm/utils/condition-variable.test.js.map +1 -0
  298. package/esm/utils/controllable-promise.test.d.ts +1 -0
  299. package/esm/utils/controllable-promise.test.js +15 -0
  300. package/esm/utils/controllable-promise.test.js.map +1 -0
  301. package/esm/utils/crypto/abstract.d.ts +16 -9
  302. package/esm/utils/crypto/abstract.js +6 -9
  303. package/esm/utils/crypto/abstract.js.map +1 -1
  304. package/esm/utils/crypto/factorization.d.ts +2 -1
  305. package/esm/utils/crypto/factorization.js +29 -34
  306. package/esm/utils/crypto/factorization.js.map +1 -1
  307. package/esm/utils/crypto/index.d.ts +4 -0
  308. package/esm/utils/crypto/index.js +4 -0
  309. package/esm/utils/crypto/index.js.map +1 -1
  310. package/esm/utils/crypto/keys.d.ts +2 -2
  311. package/esm/utils/crypto/keys.js +4 -4
  312. package/esm/utils/crypto/keys.js.map +1 -1
  313. package/esm/utils/crypto/keys.test.d.ts +1 -0
  314. package/esm/utils/crypto/keys.test.js +38 -0
  315. package/esm/utils/crypto/keys.test.js.map +1 -0
  316. package/esm/utils/crypto/miller-rabin.d.ts +2 -2
  317. package/esm/utils/crypto/miller-rabin.js +21 -20
  318. package/esm/utils/crypto/miller-rabin.js.map +1 -1
  319. package/esm/utils/crypto/miller-rabin.test.d.ts +1 -0
  320. package/esm/utils/crypto/miller-rabin.test.js +58 -0
  321. package/esm/utils/crypto/miller-rabin.test.js.map +1 -0
  322. package/esm/utils/crypto/mtproto.d.ts +3 -3
  323. package/esm/utils/crypto/mtproto.js +12 -12
  324. package/esm/utils/crypto/mtproto.js.map +1 -1
  325. package/esm/utils/crypto/mtproto.test.d.ts +1 -0
  326. package/esm/utils/crypto/mtproto.test.js +45 -0
  327. package/esm/utils/crypto/mtproto.test.js.map +1 -0
  328. package/esm/utils/crypto/node.d.ts +21 -0
  329. package/esm/utils/crypto/node.js +69 -0
  330. package/esm/utils/crypto/node.js.map +1 -0
  331. package/esm/utils/crypto/node.test.d.ts +1 -0
  332. package/esm/utils/crypto/node.test.js +11 -0
  333. package/esm/utils/crypto/node.test.js.map +1 -0
  334. package/esm/utils/crypto/password.js +24 -32
  335. package/esm/utils/crypto/password.js.map +1 -1
  336. package/esm/utils/crypto/password.test.d.ts +1 -0
  337. package/esm/utils/crypto/password.test.js +90 -0
  338. package/esm/utils/crypto/password.test.js.map +1 -0
  339. package/esm/utils/crypto/utils.test.d.ts +1 -0
  340. package/esm/utils/crypto/utils.test.js +47 -0
  341. package/esm/utils/crypto/utils.test.js.map +1 -0
  342. package/esm/utils/crypto/wasm.d.ts +22 -0
  343. package/esm/utils/crypto/wasm.js +37 -0
  344. package/esm/utils/crypto/wasm.js.map +1 -0
  345. package/esm/utils/crypto/web.d.ts +11 -0
  346. package/esm/utils/crypto/web.js +36 -0
  347. package/esm/utils/crypto/web.js.map +1 -0
  348. package/esm/utils/crypto/web.test.d.ts +1 -0
  349. package/esm/utils/crypto/web.test.js +15 -0
  350. package/esm/utils/crypto/web.test.js.map +1 -0
  351. package/esm/utils/deque.d.ts +1 -1
  352. package/esm/utils/deque.js +9 -3
  353. package/esm/utils/deque.js.map +1 -1
  354. package/esm/utils/deque.test.d.ts +1 -0
  355. package/esm/utils/deque.test.js +126 -0
  356. package/esm/utils/deque.test.js.map +1 -0
  357. package/esm/utils/function-utils.d.ts +4 -1
  358. package/esm/utils/function-utils.js +8 -1
  359. package/esm/utils/function-utils.js.map +1 -1
  360. package/esm/utils/function-utils.test.d.ts +1 -0
  361. package/esm/utils/function-utils.test.js +21 -0
  362. package/esm/utils/function-utils.test.js.map +1 -0
  363. package/esm/utils/index.d.ts +0 -1
  364. package/esm/utils/index.js +0 -1
  365. package/esm/utils/index.js.map +1 -1
  366. package/esm/utils/linked-list.test.d.ts +1 -0
  367. package/esm/utils/linked-list.test.js +34 -0
  368. package/esm/utils/linked-list.test.js.map +1 -0
  369. package/esm/utils/links/bots.test.d.ts +1 -0
  370. package/esm/utils/links/bots.test.js +150 -0
  371. package/esm/utils/links/bots.test.js.map +1 -0
  372. package/esm/utils/links/chat.test.d.ts +1 -0
  373. package/esm/utils/links/chat.test.js +82 -0
  374. package/esm/utils/links/chat.test.js.map +1 -0
  375. package/esm/utils/links/misc.test.d.ts +1 -0
  376. package/esm/utils/links/misc.test.js +151 -0
  377. package/esm/utils/links/misc.test.js.map +1 -0
  378. package/esm/utils/links/proxy.test.d.ts +1 -0
  379. package/esm/utils/links/proxy.test.js +72 -0
  380. package/esm/utils/links/proxy.test.js.map +1 -0
  381. package/esm/utils/links/user.test.d.ts +1 -0
  382. package/esm/utils/links/user.test.js +61 -0
  383. package/esm/utils/links/user.test.js.map +1 -0
  384. package/esm/utils/logger.d.ts +0 -1
  385. package/esm/utils/logger.js +3 -4
  386. package/esm/utils/logger.js.map +1 -1
  387. package/esm/utils/logger.test.d.ts +1 -0
  388. package/esm/utils/logger.test.js +120 -0
  389. package/esm/utils/logger.test.js.map +1 -0
  390. package/esm/utils/long-utils.test.d.ts +1 -0
  391. package/esm/utils/long-utils.test.js +153 -0
  392. package/esm/utils/long-utils.test.js.map +1 -0
  393. package/esm/utils/lru-map.d.ts +1 -0
  394. package/esm/utils/lru-map.js +6 -0
  395. package/esm/utils/lru-map.js.map +1 -1
  396. package/esm/utils/lru-map.test.d.ts +1 -0
  397. package/esm/utils/lru-map.test.js +94 -0
  398. package/esm/utils/lru-map.test.js.map +1 -0
  399. package/esm/utils/lru-set.test.d.ts +1 -0
  400. package/esm/utils/lru-set.test.js +72 -0
  401. package/esm/utils/lru-set.test.js.map +1 -0
  402. package/esm/utils/peer-utils.js +5 -1
  403. package/esm/utils/peer-utils.js.map +1 -1
  404. package/esm/utils/peer-utils.test.d.ts +1 -0
  405. package/esm/utils/peer-utils.test.js +117 -0
  406. package/esm/utils/peer-utils.test.js.map +1 -0
  407. package/esm/utils/platform/crypto.js +1 -1
  408. package/esm/utils/platform/crypto.js.map +1 -1
  409. package/esm/utils/platform/crypto.web.js +2 -2
  410. package/esm/utils/platform/crypto.web.js.map +1 -1
  411. package/esm/utils/sorted-array.test.d.ts +1 -0
  412. package/esm/utils/sorted-array.test.js +64 -0
  413. package/esm/utils/sorted-array.test.js.map +1 -0
  414. package/esm/utils/string-session.js +4 -2
  415. package/esm/utils/string-session.js.map +1 -1
  416. package/esm/utils/string-session.test.d.ts +1 -0
  417. package/esm/utils/string-session.test.js +104 -0
  418. package/esm/utils/string-session.test.js.map +1 -0
  419. package/esm/utils/tl-json.test.d.ts +1 -0
  420. package/esm/utils/tl-json.test.js +81 -0
  421. package/esm/utils/tl-json.test.js.map +1 -0
  422. package/esm/utils/type-assertions.test.d.ts +1 -0
  423. package/esm/utils/type-assertions.test.js +65 -0
  424. package/esm/utils/type-assertions.test.js.map +1 -0
  425. package/package.json +4 -5
  426. package/cjs/utils/crypto/common.d.ts +0 -12
  427. package/cjs/utils/crypto/common.js +0 -54
  428. package/cjs/utils/crypto/common.js.map +0 -1
  429. package/cjs/utils/crypto/node-crypto.d.ts +0 -10
  430. package/cjs/utils/crypto/node-crypto.js +0 -46
  431. package/cjs/utils/crypto/node-crypto.js.map +0 -1
  432. package/cjs/utils/crypto/subtle.d.ts +0 -12
  433. package/cjs/utils/crypto/subtle.js +0 -86
  434. package/cjs/utils/crypto/subtle.js.map +0 -1
  435. package/cjs/utils/flood-control.d.ts +0 -14
  436. package/cjs/utils/flood-control.js +0 -65
  437. package/cjs/utils/flood-control.js.map +0 -1
  438. package/cjs/utils/platform/random.d.ts +0 -1
  439. package/cjs/utils/platform/random.js +0 -7
  440. package/cjs/utils/platform/random.js.map +0 -1
  441. package/cjs/utils/platform/random.web.d.ts +0 -1
  442. package/cjs/utils/platform/random.web.js +0 -10
  443. package/cjs/utils/platform/random.web.js.map +0 -1
  444. package/esm/utils/crypto/common.d.ts +0 -12
  445. package/esm/utils/crypto/common.js +0 -50
  446. package/esm/utils/crypto/common.js.map +0 -1
  447. package/esm/utils/crypto/node-crypto.d.ts +0 -10
  448. package/esm/utils/crypto/node-crypto.js +0 -42
  449. package/esm/utils/crypto/node-crypto.js.map +0 -1
  450. package/esm/utils/crypto/subtle.d.ts +0 -12
  451. package/esm/utils/crypto/subtle.js +0 -59
  452. package/esm/utils/crypto/subtle.js.map +0 -1
  453. package/esm/utils/flood-control.d.ts +0 -14
  454. package/esm/utils/flood-control.js +0 -61
  455. package/esm/utils/flood-control.js.map +0 -1
  456. package/esm/utils/platform/random.d.ts +0 -1
  457. package/esm/utils/platform/random.js +0 -4
  458. package/esm/utils/platform/random.js.map +0 -1
  459. package/esm/utils/platform/random.web.d.ts +0 -1
  460. package/esm/utils/platform/random.web.js +0 -6
  461. package/esm/utils/platform/random.web.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"password.js","sourceRoot":"","sources":["../../../../src/utils/crypto/password.ts"],"names":[],"mappings":"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","sourcesContent":["import bigInt from 'big-integer'\n\nimport { tl } from '@mtcute/tl'\nimport { utf8EncodeToBuffer } from '@mtcute/tl-runtime'\n\nimport { MtSecurityError, MtUnsupportedError } from '../../types/errors.js'\nimport { bigIntToBuffer, bufferToBigInt } from '../bigint-utils.js'\nimport { concatBuffers, randomBytes } from '../buffer-utils.js'\nimport { ICryptoProvider } from './abstract.js'\nimport { xorBuffer } from './utils.js'\n\n/**\n * Compute password hash as defined by MTProto.\n *\n * See https://core.telegram.org/api/srp#checking-the-password-with-srp\n *\n * @param crypto Crypto provider\n * @param password Password\n * @param salt1 Salt 1\n * @param salt2 Salt 2\n */\nexport async function computePasswordHash(\n crypto: ICryptoProvider,\n password: Uint8Array,\n salt1: Uint8Array,\n salt2: Uint8Array,\n): Promise<Uint8Array> {\n const SH = (data: Uint8Array, salt: Uint8Array) => crypto.sha256(concatBuffers([salt, data, salt]))\n const PH1 = async (pwd: Uint8Array, salt1: Uint8Array, salt2: Uint8Array) => SH(await SH(pwd, salt1), salt2)\n\n return SH(await crypto.pbkdf2(await PH1(password, salt1, salt2), salt1, 100000), salt2)\n}\n\n/**\n * Compute new password SRP hash as defined by MTProto.\n *\n * @param crypto Crypto provider\n * @param algo KDF algorithm\n * @param password Password\n */\nexport async function computeNewPasswordHash(\n crypto: ICryptoProvider,\n algo: tl.RawPasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow,\n password: string,\n): Promise<Uint8Array> {\n (algo as tl.Mutable<typeof algo>).salt1 = concatBuffers([algo.salt1, randomBytes(32)])\n\n const _x = await computePasswordHash(crypto, utf8EncodeToBuffer(password), algo.salt1, algo.salt2)\n\n const g = bigInt(algo.g)\n const p = bufferToBigInt(algo.p)\n const x = bufferToBigInt(_x)\n\n return bigIntToBuffer(g.modPow(x, p), 256)\n}\n\n/**\n * Compute SRP check parameters for 2fa password as defined by MTProto.\n *\n * @param crypto Crypto provider\n * @param request SRP request\n * @param password 2fa password\n */\nexport async function computeSrpParams(\n crypto: ICryptoProvider,\n request: tl.account.RawPassword,\n password: string,\n): Promise<tl.RawInputCheckPasswordSRP> {\n // nice naming thx durov\n if (\n !request.currentAlgo ||\n request.currentAlgo._ !== 'passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow'\n ) {\n throw new MtUnsupportedError(`Unknown algo ${request.currentAlgo?._}`)\n }\n\n const algo = request.currentAlgo\n\n // here and after: underscored variables are buffers, non-underscored are bigInts\n\n if (!request.srpB) {\n throw new MtSecurityError('SRP_B is not present in the request')\n }\n\n if (!request.srpId) {\n throw new MtSecurityError('SRP_ID is not present in the request')\n }\n\n const g = bigInt(algo.g)\n const _g = bigIntToBuffer(g, 256)\n const p = bufferToBigInt(algo.p)\n const gB = bufferToBigInt(request.srpB)\n\n const a = bufferToBigInt(randomBytes(256))\n const gA = g.modPow(a, p)\n const _gA = bigIntToBuffer(gA, 256)\n\n const H = (data: Uint8Array) => crypto.sha256(data)\n\n const [_k, _u, _x] = await Promise.all([\n // maybe, just maybe this will be a bit faster with some crypto providers\n /* k = */ crypto.sha256(concatBuffers([algo.p, _g])),\n /* u = */ crypto.sha256(concatBuffers([_gA, request.srpB])),\n /* x = */ computePasswordHash(crypto, utf8EncodeToBuffer(password), algo.salt1, algo.salt2),\n ])\n const k = bufferToBigInt(_k)\n const u = bufferToBigInt(_u)\n const x = bufferToBigInt(_x)\n\n const v = g.modPow(x, p)\n const kV = k.multiply(v).mod(p)\n\n let t = gB.minus(kV).mod(p)\n if (t.isNegative()) t = t.plus(p)\n const sA = t.modPow(a.plus(u.multiply(x)), p)\n const _kA = await H(bigIntToBuffer(sA, 256))\n\n const _M1 = await H(\n concatBuffers([\n xorBuffer(await H(algo.p), await H(_g)),\n await H(algo.salt1),\n await H(algo.salt2),\n _gA,\n request.srpB,\n _kA,\n ]),\n )\n\n return {\n _: 'inputCheckPasswordSRP',\n srpId: request.srpId,\n A: _gA,\n M1: _M1,\n }\n}\n"]}
1
+ {"version":3,"file":"password.js","sourceRoot":"","sources":["../../../../src/utils/crypto/password.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\nimport { utf8EncodeToBuffer } from '@mtcute/tl-runtime'\n\nimport { MtSecurityError, MtUnsupportedError } from '../../types/errors.js'\nimport { bigIntModPow, bigIntToBuffer, bufferToBigInt } from '../bigint-utils.js'\nimport { concatBuffers } from '../buffer-utils.js'\nimport { ICryptoProvider } from './abstract.js'\nimport { xorBuffer } from './utils.js'\n\n/**\n * Compute password hash as defined by MTProto.\n *\n * See https://core.telegram.org/api/srp#checking-the-password-with-srp\n *\n * @param crypto Crypto provider\n * @param password Password\n * @param salt1 Salt 1\n * @param salt2 Salt 2\n */\nexport async function computePasswordHash(\n crypto: ICryptoProvider,\n password: Uint8Array,\n salt1: Uint8Array,\n salt2: Uint8Array,\n): Promise<Uint8Array> {\n const SH = (data: Uint8Array, salt: Uint8Array) => crypto.sha256(concatBuffers([salt, data, salt]))\n const PH1 = (pwd: Uint8Array, salt1: Uint8Array, salt2: Uint8Array) => SH(SH(pwd, salt1), salt2)\n\n return SH(await crypto.pbkdf2(PH1(password, salt1, salt2), salt1, 100000), salt2)\n}\n\n/**\n * Compute new password SRP hash as defined by MTProto.\n *\n * @param crypto Crypto provider\n * @param algo KDF algorithm\n * @param password Password\n */\nexport async function computeNewPasswordHash(\n crypto: ICryptoProvider,\n algo: tl.RawPasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow,\n password: string,\n): Promise<Uint8Array> {\n const salt1 = new Uint8Array(algo.salt1.length + 32)\n salt1.set(algo.salt1)\n crypto.randomFill(salt1.subarray(algo.salt1.length))\n ;(algo as tl.Mutable<typeof algo>).salt1 = salt1\n\n const _x = await computePasswordHash(crypto, utf8EncodeToBuffer(password), algo.salt1, algo.salt2)\n\n const g = BigInt(algo.g)\n const p = bufferToBigInt(algo.p)\n const x = bufferToBigInt(_x)\n\n return bigIntToBuffer(bigIntModPow(g, x, p), 256)\n}\n\n/**\n * Compute SRP check parameters for 2fa password as defined by MTProto.\n *\n * @param crypto Crypto provider\n * @param request SRP request\n * @param password 2fa password\n */\nexport async function computeSrpParams(\n crypto: ICryptoProvider,\n request: tl.account.RawPassword,\n password: string,\n): Promise<tl.RawInputCheckPasswordSRP> {\n // nice naming thx durov\n if (\n !request.currentAlgo ||\n request.currentAlgo._ !== 'passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow'\n ) {\n throw new MtUnsupportedError(`Unknown algo ${request.currentAlgo?._}`)\n }\n\n const algo = request.currentAlgo\n\n // here and after: underscored variables are buffers, non-underscored are bigInts\n\n if (!request.srpB) {\n throw new MtSecurityError('SRP_B is not present in the request')\n }\n\n if (!request.srpId) {\n throw new MtSecurityError('SRP_ID is not present in the request')\n }\n\n const g = BigInt(algo.g)\n const _g = bigIntToBuffer(g, 256)\n const p = bufferToBigInt(algo.p)\n const gB = bufferToBigInt(request.srpB)\n\n const a = bufferToBigInt(crypto.randomBytes(256))\n const gA = bigIntModPow(g, a, p)\n const _gA = bigIntToBuffer(gA, 256)\n\n const H = (data: Uint8Array) => crypto.sha256(data)\n\n const _k = crypto.sha256(concatBuffers([algo.p, _g]))\n const _u = crypto.sha256(concatBuffers([_gA, request.srpB]))\n const _x = await computePasswordHash(crypto, utf8EncodeToBuffer(password), algo.salt1, algo.salt2)\n const k = bufferToBigInt(_k)\n const u = bufferToBigInt(_u)\n const x = bufferToBigInt(_x)\n\n const v = bigIntModPow(g, x, p)\n const kV = (k * v) % p\n\n let t = gB - kV\n if (t < 0n) t += p\n const sA = bigIntModPow(t, a + u * x, p)\n const _kA = H(bigIntToBuffer(sA, 256))\n\n const _M1 = H(concatBuffers([xorBuffer(H(algo.p), H(_g)), H(algo.salt1), H(algo.salt2), _gA, request.srpB, _kA]))\n\n return {\n _: 'inputCheckPasswordSRP',\n srpId: request.srpId,\n A: _gA,\n M1: _M1,\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const long_1 = __importDefault(require("long"));
7
+ const vitest_1 = require("vitest");
8
+ const test_1 = require("@mtcute/test");
9
+ const tl_runtime_1 = require("@mtcute/tl-runtime");
10
+ const index_js_1 = require("./index.js");
11
+ // a real-world request from an account with "qwe123" password
12
+ const fakeAlgo = {
13
+ _: 'passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow',
14
+ salt1: (0, tl_runtime_1.hexDecodeToBuffer)('9b3accc457c0d5288e8cff31eb21094048bc11902f6614dbb9afb839ee7641c37619537d8ebe749e'),
15
+ salt2: (0, tl_runtime_1.hexDecodeToBuffer)('6c619bb0786dc4ed1bf211d23f6e4065'),
16
+ g: 3,
17
+ p: (0, tl_runtime_1.hexDecodeToBuffer)('c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f' +
18
+ '48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c37' +
19
+ '20fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f64' +
20
+ '2477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4' +
21
+ 'a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754' +
22
+ 'fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4' +
23
+ 'e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f' +
24
+ '0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b'),
25
+ };
26
+ const fakeRequest = {
27
+ _: 'account.password',
28
+ hasRecovery: false,
29
+ hasSecureValues: false,
30
+ hasPassword: true,
31
+ currentAlgo: fakeAlgo,
32
+ srpB: (0, tl_runtime_1.hexDecodeToBuffer)('1476a7b5991d7f028bbee33b3455cad3f2cd0eb3737409fcce92fa7d4cd5c733' +
33
+ 'ec6d2cb3454e587d4c17eda2fd7ef9a57327215f38292cc8bd5dc77d3e1d31cd' +
34
+ 'dae2652f8347c4b0093f7c78242f70e6cc13137ee7acc257a49855a63113db8f' +
35
+ '163992b9101551f3b6f7eb5d196cee3647c359553b1bcbe82ba8933c0fb1ac35' +
36
+ '0243c535b8e634613e1f626ba8a6d141ef957c859e71a117b557c0298bfbb107' +
37
+ 'c91f71f5b4275fded58289aa1e87c612f44b7aa0b5e0de7def4458f58db80019' +
38
+ 'd2e7b181eb66dc270374af2d160dd0c53edd677b2701694d71ea8718c49df6a9' +
39
+ 'dbe2cbae051ffc1986336cd26f11a8ab426dfe0813d7b3f4eedf4e34182ccc3a'),
40
+ srpId: long_1.default.fromBits(-2046015018, 875006452),
41
+ newAlgo: {
42
+ _: 'passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow',
43
+ salt1: (0, tl_runtime_1.hexDecodeToBuffer)('9b3accc457c0d528'),
44
+ salt2: (0, tl_runtime_1.hexDecodeToBuffer)('6c619bb0786dc4ed1bf211d23f6e4065'),
45
+ g: 3,
46
+ p: (0, tl_runtime_1.hexDecodeToBuffer)('c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f' +
47
+ '48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c37' +
48
+ '20fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f64' +
49
+ '2477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4' +
50
+ 'a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754' +
51
+ 'fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4' +
52
+ 'e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f' +
53
+ '0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b'),
54
+ },
55
+ newSecureAlgo: {
56
+ _: 'securePasswordKdfAlgoPBKDF2HMACSHA512iter100000',
57
+ salt: (0, tl_runtime_1.hexDecodeToBuffer)('fdd59abc0bffb24d'),
58
+ },
59
+ secureRandom: new Uint8Array(), // unused
60
+ };
61
+ const password = 'qwe123';
62
+ (0, vitest_1.describe)('SRP', () => {
63
+ (0, vitest_1.it)('should correctly compute password hash as defined by MTProto', async () => {
64
+ const crypto = await (0, test_1.defaultTestCryptoProvider)();
65
+ const hash = await (0, index_js_1.computePasswordHash)(crypto, (0, tl_runtime_1.utf8EncodeToBuffer)(password), fakeAlgo.salt1, fakeAlgo.salt2);
66
+ (0, vitest_1.expect)((0, tl_runtime_1.hexEncode)(hash)).toEqual('750f1fe282965e63ce17b98427b35549fb864465211840f6a7c1f2fb657cc33b');
67
+ });
68
+ (0, vitest_1.it)('should correctly compute new password hash as defined by MTProto', async () => {
69
+ const crypto = await (0, test_1.defaultTestCryptoProvider)();
70
+ const hash = await (0, index_js_1.computeNewPasswordHash)(crypto, fakeAlgo, '123qwe');
71
+ (0, vitest_1.expect)((0, tl_runtime_1.hexEncode)(hash)).toEqual('2540539ceeffd4543cd845bf319b8392e6b17bf7cf26bafcf6282ce9ae795368' +
72
+ '4ff49469c2863b17e6d65ddb16ae6f60bc07cc254c00e5ba389292f6cea0b3aa' +
73
+ 'c459d1d08984d65319df8c5d124042169bbe2ab8c0c93bc7178827f2ea84e7c3' +
74
+ 'a4f2660099fb6a4c38984c914283d3015278369521a4b81ecf927669b8c89746' +
75
+ 'ef49ec7b019af7f3addc746362f298d96409bef4677b9c3d8e5b5afe7a44c0bc' +
76
+ '130ebc7a79b5d5980966d88d3d9eba511b101b0703abd86df7410cd120edad12' +
77
+ '2a7a3ccad92d906dbf6f43bba13555bafb626b45551275f3626a4ae26a14908d' +
78
+ '38d640680e501f52bd08a0e3ff9d9185eebdae890c167459449b2c205b3ecde4');
79
+ });
80
+ (0, vitest_1.it)('should correctly compute srp parameters as defined by MTProto', async () => {
81
+ const crypto = await (0, test_1.defaultTestCryptoProvider)();
82
+ const params = await (0, index_js_1.computeSrpParams)(crypto, fakeRequest, password);
83
+ (0, vitest_1.expect)(params.srpId).toEqual(fakeRequest.srpId);
84
+ (0, vitest_1.expect)((0, tl_runtime_1.hexEncode)(params.A)).toEqual('363976f55edb57cc5cc0c4aaca9b7539eff98a43a93fa84be34860d18ac3a80f' +
85
+ 'ffd57c4617896ff667677d0552a079eb189d25d147ec96edd4495c946a18652d' +
86
+ '31d78eede40a8b29da340c19b32ccac78f8482406e392102c03d850d1db87223' +
87
+ '2c144bfacadb58856971aafb70ca3aac4efa7f73977ddc50dfc0a2c76c0ac950' +
88
+ '728d58b8480fa89c701703855148fadd885aaf1ca313ae3a3b2942de58a9a6fb' +
89
+ '9e3e65c7ac7a1b7f4e6aa4742b957f81927bd8cc761b76f90229dec34d6f15d3' +
90
+ '4fa454aa69d9219d9c5fa3625f5c6f1ac03892a70aa17269c76cd9bf2949a961' +
91
+ 'fad2a71e5fa961824b32db037130c7e9aad4c1e9f02ebc5b832622f98b59597e');
92
+ (0, vitest_1.expect)((0, tl_runtime_1.hexEncode)(params.M1)).toEqual('25a91b21c634ad670a144165a9829192d152e131a716f676abc48cd817f508c6');
93
+ });
94
+ });
95
+ //# sourceMappingURL=password.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password.test.js","sourceRoot":"","sources":["../../../../src/utils/crypto/password.test.ts"],"names":[],"mappings":"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","sourcesContent":["import Long from 'long'\nimport { describe, expect, it } from 'vitest'\n\nimport { defaultTestCryptoProvider } from '@mtcute/test'\nimport { tl } from '@mtcute/tl'\nimport { hexDecodeToBuffer, hexEncode, utf8EncodeToBuffer } from '@mtcute/tl-runtime'\n\nimport { computeNewPasswordHash, computePasswordHash, computeSrpParams } from './index.js'\n\n// a real-world request from an account with \"qwe123\" password\nconst fakeAlgo: tl.RawPasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow = {\n _: 'passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow',\n salt1: hexDecodeToBuffer('9b3accc457c0d5288e8cff31eb21094048bc11902f6614dbb9afb839ee7641c37619537d8ebe749e'),\n salt2: hexDecodeToBuffer('6c619bb0786dc4ed1bf211d23f6e4065'),\n g: 3,\n p: hexDecodeToBuffer(\n 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f' +\n '48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c37' +\n '20fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f64' +\n '2477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4' +\n 'a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754' +\n 'fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4' +\n 'e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f' +\n '0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b',\n ),\n}\nconst fakeRequest: tl.account.RawPassword = {\n _: 'account.password',\n hasRecovery: false,\n hasSecureValues: false,\n hasPassword: true,\n currentAlgo: fakeAlgo,\n srpB: hexDecodeToBuffer(\n '1476a7b5991d7f028bbee33b3455cad3f2cd0eb3737409fcce92fa7d4cd5c733' +\n 'ec6d2cb3454e587d4c17eda2fd7ef9a57327215f38292cc8bd5dc77d3e1d31cd' +\n 'dae2652f8347c4b0093f7c78242f70e6cc13137ee7acc257a49855a63113db8f' +\n '163992b9101551f3b6f7eb5d196cee3647c359553b1bcbe82ba8933c0fb1ac35' +\n '0243c535b8e634613e1f626ba8a6d141ef957c859e71a117b557c0298bfbb107' +\n 'c91f71f5b4275fded58289aa1e87c612f44b7aa0b5e0de7def4458f58db80019' +\n 'd2e7b181eb66dc270374af2d160dd0c53edd677b2701694d71ea8718c49df6a9' +\n 'dbe2cbae051ffc1986336cd26f11a8ab426dfe0813d7b3f4eedf4e34182ccc3a',\n ),\n srpId: Long.fromBits(-2046015018, 875006452),\n newAlgo: {\n _: 'passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow',\n salt1: hexDecodeToBuffer('9b3accc457c0d528'),\n salt2: hexDecodeToBuffer('6c619bb0786dc4ed1bf211d23f6e4065'),\n g: 3,\n p: hexDecodeToBuffer(\n 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f' +\n '48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c37' +\n '20fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f64' +\n '2477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4' +\n 'a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754' +\n 'fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4' +\n 'e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f' +\n '0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b',\n ),\n },\n newSecureAlgo: {\n _: 'securePasswordKdfAlgoPBKDF2HMACSHA512iter100000',\n salt: hexDecodeToBuffer('fdd59abc0bffb24d'),\n },\n secureRandom: new Uint8Array(), // unused\n}\nconst password = 'qwe123'\n\ndescribe('SRP', () => {\n it('should correctly compute password hash as defined by MTProto', async () => {\n const crypto = await defaultTestCryptoProvider()\n const hash = await computePasswordHash(crypto, utf8EncodeToBuffer(password), fakeAlgo.salt1, fakeAlgo.salt2)\n\n expect(hexEncode(hash)).toEqual('750f1fe282965e63ce17b98427b35549fb864465211840f6a7c1f2fb657cc33b')\n })\n\n it('should correctly compute new password hash as defined by MTProto', async () => {\n const crypto = await defaultTestCryptoProvider()\n const hash = await computeNewPasswordHash(crypto, fakeAlgo, '123qwe')\n\n expect(hexEncode(hash)).toEqual(\n '2540539ceeffd4543cd845bf319b8392e6b17bf7cf26bafcf6282ce9ae795368' +\n '4ff49469c2863b17e6d65ddb16ae6f60bc07cc254c00e5ba389292f6cea0b3aa' +\n 'c459d1d08984d65319df8c5d124042169bbe2ab8c0c93bc7178827f2ea84e7c3' +\n 'a4f2660099fb6a4c38984c914283d3015278369521a4b81ecf927669b8c89746' +\n 'ef49ec7b019af7f3addc746362f298d96409bef4677b9c3d8e5b5afe7a44c0bc' +\n '130ebc7a79b5d5980966d88d3d9eba511b101b0703abd86df7410cd120edad12' +\n '2a7a3ccad92d906dbf6f43bba13555bafb626b45551275f3626a4ae26a14908d' +\n '38d640680e501f52bd08a0e3ff9d9185eebdae890c167459449b2c205b3ecde4',\n )\n })\n\n it('should correctly compute srp parameters as defined by MTProto', async () => {\n const crypto = await defaultTestCryptoProvider()\n const params = await computeSrpParams(crypto, fakeRequest, password)\n\n expect(params.srpId).toEqual(fakeRequest.srpId)\n expect(hexEncode(params.A)).toEqual(\n '363976f55edb57cc5cc0c4aaca9b7539eff98a43a93fa84be34860d18ac3a80f' +\n 'ffd57c4617896ff667677d0552a079eb189d25d147ec96edd4495c946a18652d' +\n '31d78eede40a8b29da340c19b32ccac78f8482406e392102c03d850d1db87223' +\n '2c144bfacadb58856971aafb70ca3aac4efa7f73977ddc50dfc0a2c76c0ac950' +\n '728d58b8480fa89c701703855148fadd885aaf1ca313ae3a3b2942de58a9a6fb' +\n '9e3e65c7ac7a1b7f4e6aa4742b957f81927bd8cc761b76f90229dec34d6f15d3' +\n '4fa454aa69d9219d9c5fa3625f5c6f1ac03892a70aa17269c76cd9bf2949a961' +\n 'fad2a71e5fa961824b32db037130c7e9aad4c1e9f02ebc5b832622f98b59597e',\n )\n expect(hexEncode(params.M1)).toEqual('25a91b21c634ad670a144165a9829192d152e131a716f676abc48cd817f508c6')\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const tl_runtime_1 = require("@mtcute/tl-runtime");
5
+ const utils_js_1 = require("./utils.js");
6
+ (0, vitest_1.describe)('xorBuffer', () => {
7
+ (0, vitest_1.it)('should xor buffers without modifying original', () => {
8
+ const data = (0, tl_runtime_1.utf8EncodeToBuffer)('hello');
9
+ const key = (0, tl_runtime_1.utf8EncodeToBuffer)('xor');
10
+ const xored = (0, utils_js_1.xorBuffer)(data, key);
11
+ (0, vitest_1.expect)(data.toString()).eq('hello');
12
+ (0, vitest_1.expect)(key.toString()).eq('xor');
13
+ (0, vitest_1.expect)((0, tl_runtime_1.hexEncode)(xored)).eq('100a1e6c6f');
14
+ });
15
+ (0, vitest_1.it)('should be deterministic', () => {
16
+ const data = (0, tl_runtime_1.utf8EncodeToBuffer)('hello');
17
+ const key = (0, tl_runtime_1.utf8EncodeToBuffer)('xor');
18
+ const xored1 = (0, utils_js_1.xorBuffer)(data, key);
19
+ (0, vitest_1.expect)((0, tl_runtime_1.hexEncode)(xored1)).eq('100a1e6c6f');
20
+ const xored2 = (0, utils_js_1.xorBuffer)(data, key);
21
+ (0, vitest_1.expect)((0, tl_runtime_1.hexEncode)(xored2)).eq('100a1e6c6f');
22
+ });
23
+ (0, vitest_1.it)('second call should decode content', () => {
24
+ const data = (0, tl_runtime_1.utf8EncodeToBuffer)('hello');
25
+ const key = (0, tl_runtime_1.utf8EncodeToBuffer)('xor');
26
+ const xored1 = (0, utils_js_1.xorBuffer)(data, key);
27
+ (0, vitest_1.expect)((0, tl_runtime_1.hexEncode)(xored1)).eq('100a1e6c6f');
28
+ const xored2 = (0, utils_js_1.xorBuffer)(xored1, key);
29
+ (0, vitest_1.expect)((0, tl_runtime_1.utf8Decode)(xored2)).eq('hello');
30
+ });
31
+ });
32
+ (0, vitest_1.describe)('xorBufferInPlace', () => {
33
+ (0, vitest_1.it)('should xor buffers by modifying original', () => {
34
+ const data = (0, tl_runtime_1.utf8EncodeToBuffer)('hello');
35
+ const key = (0, tl_runtime_1.utf8EncodeToBuffer)('xor');
36
+ (0, utils_js_1.xorBufferInPlace)(data, key);
37
+ (0, vitest_1.expect)((0, tl_runtime_1.hexEncode)(data)).eq('100a1e6c6f');
38
+ (0, vitest_1.expect)(key.toString()).eq('xor');
39
+ });
40
+ (0, vitest_1.it)('second call should decode content', () => {
41
+ const data = (0, tl_runtime_1.utf8EncodeToBuffer)('hello');
42
+ const key = (0, tl_runtime_1.utf8EncodeToBuffer)('xor');
43
+ (0, utils_js_1.xorBufferInPlace)(data, key);
44
+ (0, vitest_1.expect)((0, tl_runtime_1.hexEncode)(data)).eq('100a1e6c6f');
45
+ (0, utils_js_1.xorBufferInPlace)(data, key);
46
+ (0, vitest_1.expect)(data.toString()).eq('hello');
47
+ });
48
+ });
49
+ //# sourceMappingURL=utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../../../src/utils/crypto/utils.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { hexEncode, utf8Decode, utf8EncodeToBuffer } from '@mtcute/tl-runtime'\n\nimport { xorBuffer, xorBufferInPlace } from './utils.js'\n\ndescribe('xorBuffer', () => {\n it('should xor buffers without modifying original', () => {\n const data = utf8EncodeToBuffer('hello')\n const key = utf8EncodeToBuffer('xor')\n\n const xored = xorBuffer(data, key)\n expect(data.toString()).eq('hello')\n expect(key.toString()).eq('xor')\n expect(hexEncode(xored)).eq('100a1e6c6f')\n })\n\n it('should be deterministic', () => {\n const data = utf8EncodeToBuffer('hello')\n const key = utf8EncodeToBuffer('xor')\n\n const xored1 = xorBuffer(data, key)\n expect(hexEncode(xored1)).eq('100a1e6c6f')\n\n const xored2 = xorBuffer(data, key)\n expect(hexEncode(xored2)).eq('100a1e6c6f')\n })\n\n it('second call should decode content', () => {\n const data = utf8EncodeToBuffer('hello')\n const key = utf8EncodeToBuffer('xor')\n\n const xored1 = xorBuffer(data, key)\n expect(hexEncode(xored1)).eq('100a1e6c6f')\n\n const xored2 = xorBuffer(xored1, key)\n expect(utf8Decode(xored2)).eq('hello')\n })\n})\n\ndescribe('xorBufferInPlace', () => {\n it('should xor buffers by modifying original', () => {\n const data = utf8EncodeToBuffer('hello')\n const key = utf8EncodeToBuffer('xor')\n\n xorBufferInPlace(data, key)\n expect(hexEncode(data)).eq('100a1e6c6f')\n expect(key.toString()).eq('xor')\n })\n\n it('second call should decode content', () => {\n const data = utf8EncodeToBuffer('hello')\n const key = utf8EncodeToBuffer('xor')\n\n xorBufferInPlace(data, key)\n expect(hexEncode(data)).eq('100a1e6c6f')\n\n xorBufferInPlace(data, key)\n expect(data.toString()).eq('hello')\n })\n})\n"]}
@@ -0,0 +1,22 @@
1
+ import { InitInput } from '@mtcute/wasm';
2
+ import { BaseCryptoProvider, IAesCtr, ICryptoProvider, IEncryptionScheme } from './abstract.js';
3
+ export interface WasmCryptoProviderOptions {
4
+ /**
5
+ * WASM blob to use for crypto operations.
6
+ *
7
+ * Must conform to `@mtcute/wasm` interface.
8
+ */
9
+ wasmInput?: InitInput;
10
+ }
11
+ export declare abstract class WasmCryptoProvider extends BaseCryptoProvider implements Partial<ICryptoProvider> {
12
+ readonly wasmInput?: InitInput;
13
+ abstract randomFill(buf: Uint8Array): void;
14
+ constructor(params?: WasmCryptoProviderOptions);
15
+ initialize(): Promise<void>;
16
+ sha1(data: Uint8Array): Uint8Array;
17
+ sha256(data: Uint8Array): Uint8Array;
18
+ createAesCtr(key: Uint8Array, iv: Uint8Array): IAesCtr;
19
+ createAesIge(key: Uint8Array, iv: Uint8Array): IEncryptionScheme;
20
+ gzip(data: Uint8Array, maxSize: number): Uint8Array | null;
21
+ gunzip(data: Uint8Array): Uint8Array;
22
+ }
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WasmCryptoProvider = void 0;
4
+ const wasm_1 = require("@mtcute/wasm");
5
+ const abstract_js_1 = require("./abstract.js");
6
+ class WasmCryptoProvider extends abstract_js_1.BaseCryptoProvider {
7
+ constructor(params) {
8
+ super();
9
+ this.wasmInput = params?.wasmInput;
10
+ }
11
+ initialize() {
12
+ return (0, wasm_1.initAsync)(this.wasmInput);
13
+ }
14
+ sha1(data) {
15
+ return (0, wasm_1.sha1)(data);
16
+ }
17
+ sha256(data) {
18
+ return (0, wasm_1.sha256)(data);
19
+ }
20
+ createAesCtr(key, iv) {
21
+ const ctx = (0, wasm_1.createCtr256)(key, iv);
22
+ return {
23
+ process: (data) => (0, wasm_1.ctr256)(ctx, data),
24
+ close: () => (0, wasm_1.freeCtr256)(ctx),
25
+ };
26
+ }
27
+ createAesIge(key, iv) {
28
+ return {
29
+ encrypt: (data) => (0, wasm_1.ige256Encrypt)(data, key, iv),
30
+ decrypt: (data) => (0, wasm_1.ige256Decrypt)(data, key, iv),
31
+ };
32
+ }
33
+ gzip(data, maxSize) {
34
+ return (0, wasm_1.deflateMaxSize)(data, maxSize);
35
+ }
36
+ gunzip(data) {
37
+ return (0, wasm_1.gunzip)(data);
38
+ }
39
+ }
40
+ exports.WasmCryptoProvider = WasmCryptoProvider;
41
+ //# sourceMappingURL=wasm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wasm.js","sourceRoot":"","sources":["../../../../src/utils/crypto/wasm.ts"],"names":[],"mappings":";;;AAAA,uCAYqB;AAErB,+CAA+F;AAW/F,MAAsB,kBAAmB,SAAQ,gCAAkB;IAK/D,YAAY,MAAkC;QAC1C,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,SAAS,GAAG,MAAM,EAAE,SAAS,CAAA;IACtC,CAAC;IAED,UAAU;QACN,OAAO,IAAA,gBAAS,EAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACpC,CAAC;IAED,IAAI,CAAC,IAAgB;QACjB,OAAO,IAAA,WAAI,EAAC,IAAI,CAAC,CAAA;IACrB,CAAC;IAED,MAAM,CAAC,IAAgB;QACnB,OAAO,IAAA,aAAM,EAAC,IAAI,CAAC,CAAA;IACvB,CAAC;IAED,YAAY,CAAC,GAAe,EAAE,EAAc;QACxC,MAAM,GAAG,GAAG,IAAA,mBAAY,EAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QAEjC,OAAO;YACH,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,aAAM,EAAC,GAAG,EAAE,IAAI,CAAC;YACpC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAA,iBAAU,EAAC,GAAG,CAAC;SAC/B,CAAA;IACL,CAAC;IAED,YAAY,CAAC,GAAe,EAAE,EAAc;QACxC,OAAO;YACH,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,oBAAa,EAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;YAC/C,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,oBAAa,EAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;SAClD,CAAA;IACL,CAAC;IAED,IAAI,CAAC,IAAgB,EAAE,OAAe;QAClC,OAAO,IAAA,qBAAc,EAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACxC,CAAC;IAED,MAAM,CAAC,IAAgB;QACnB,OAAO,IAAA,aAAM,EAAC,IAAI,CAAC,CAAA;IACvB,CAAC;CACJ;AA7CD,gDA6CC","sourcesContent":["import {\n createCtr256,\n ctr256,\n deflateMaxSize,\n freeCtr256,\n gunzip,\n ige256Decrypt,\n ige256Encrypt,\n initAsync,\n InitInput,\n sha1,\n sha256,\n} from '@mtcute/wasm'\n\nimport { BaseCryptoProvider, IAesCtr, ICryptoProvider, IEncryptionScheme } from './abstract.js'\n\nexport interface WasmCryptoProviderOptions {\n /**\n * WASM blob to use for crypto operations.\n *\n * Must conform to `@mtcute/wasm` interface.\n */\n wasmInput?: InitInput\n}\n\nexport abstract class WasmCryptoProvider extends BaseCryptoProvider implements Partial<ICryptoProvider> {\n readonly wasmInput?: InitInput\n\n abstract randomFill(buf: Uint8Array): void\n\n constructor(params?: WasmCryptoProviderOptions) {\n super()\n this.wasmInput = params?.wasmInput\n }\n\n initialize(): Promise<void> {\n return initAsync(this.wasmInput)\n }\n\n sha1(data: Uint8Array): Uint8Array {\n return sha1(data)\n }\n\n sha256(data: Uint8Array): Uint8Array {\n return sha256(data)\n }\n\n createAesCtr(key: Uint8Array, iv: Uint8Array): IAesCtr {\n const ctx = createCtr256(key, iv)\n\n return {\n process: (data) => ctr256(ctx, data),\n close: () => freeCtr256(ctx),\n }\n }\n\n createAesIge(key: Uint8Array, iv: Uint8Array): IEncryptionScheme {\n return {\n encrypt: (data) => ige256Encrypt(data, key, iv),\n decrypt: (data) => ige256Decrypt(data, key, iv),\n }\n }\n\n gzip(data: Uint8Array, maxSize: number): Uint8Array | null {\n return deflateMaxSize(data, maxSize)\n }\n\n gunzip(data: Uint8Array): Uint8Array {\n return gunzip(data)\n }\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import { ICryptoProvider } from './abstract.js';
2
+ import { WasmCryptoProvider, WasmCryptoProviderOptions } from './wasm.js';
3
+ export declare class WebCryptoProvider extends WasmCryptoProvider implements ICryptoProvider {
4
+ readonly crypto: Crypto;
5
+ constructor(params?: WasmCryptoProviderOptions & {
6
+ crypto?: Crypto;
7
+ });
8
+ pbkdf2(password: Uint8Array, salt: Uint8Array, iterations: number, keylen?: number | undefined, algo?: string | undefined): Promise<Uint8Array>;
9
+ hmacSha256(data: Uint8Array, key: Uint8Array): Promise<Uint8Array>;
10
+ randomFill(buf: Uint8Array): void;
11
+ }
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebCryptoProvider = void 0;
4
+ const wasm_js_1 = require("./wasm.js");
5
+ const ALGO_TO_SUBTLE = {
6
+ sha256: 'SHA-256',
7
+ sha1: 'SHA-1',
8
+ sha512: 'SHA-512',
9
+ };
10
+ class WebCryptoProvider extends wasm_js_1.WasmCryptoProvider {
11
+ constructor(params) {
12
+ super(params);
13
+ const crypto = params?.crypto ?? globalThis.crypto;
14
+ if (!crypto || !crypto.subtle) {
15
+ throw new Error('WebCrypto is not available');
16
+ }
17
+ this.crypto = crypto;
18
+ }
19
+ async pbkdf2(password, salt, iterations, keylen, algo) {
20
+ const keyMaterial = await this.crypto.subtle.importKey('raw', password, 'PBKDF2', false, ['deriveBits']);
21
+ return this.crypto.subtle
22
+ .deriveBits({
23
+ name: 'PBKDF2',
24
+ salt,
25
+ iterations,
26
+ hash: algo ? ALGO_TO_SUBTLE[algo] : 'SHA-512',
27
+ }, keyMaterial, (keylen || 64) * 8)
28
+ .then((result) => new Uint8Array(result));
29
+ }
30
+ async hmacSha256(data, key) {
31
+ const keyMaterial = await this.crypto.subtle.importKey('raw', key, { name: 'HMAC', hash: { name: 'SHA-256' } }, false, ['sign']);
32
+ const res = await this.crypto.subtle.sign({ name: 'HMAC' }, keyMaterial, data);
33
+ return new Uint8Array(res);
34
+ }
35
+ randomFill(buf) {
36
+ this.crypto.getRandomValues(buf);
37
+ }
38
+ }
39
+ exports.WebCryptoProvider = WebCryptoProvider;
40
+ //# sourceMappingURL=web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../../../src/utils/crypto/web.ts"],"names":[],"mappings":";;;AACA,uCAAyE;AAEzE,MAAM,cAAc,GAA2B;IAC3C,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,OAAO;IACb,MAAM,EAAE,SAAS;CACpB,CAAA;AAED,MAAa,iBAAkB,SAAQ,4BAAkB;IAGrD,YAAY,MAAwD;QAChE,KAAK,CAAC,MAAM,CAAC,CAAA;QACb,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,UAAU,CAAC,MAAM,CAAA;QAElD,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YAC3B,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAA;SAChD;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACxB,CAAC;IAED,KAAK,CAAC,MAAM,CACR,QAAoB,EACpB,IAAgB,EAChB,UAAkB,EAClB,MAA2B,EAC3B,IAAyB;QAEzB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,YAAY,CAAC,CAAC,CAAA;QAExG,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM;aACpB,UAAU,CACP;YACI,IAAI,EAAE,QAAQ;YACd,IAAI;YACJ,UAAU;YACV,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAChD,EACD,WAAW,EACX,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,CAAC,CACrB;aACA,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAA;IACjD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAgB,EAAE,GAAe;QAC9C,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAClD,KAAK,EACL,GAAG,EACH,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAC3C,KAAK,EACL,CAAC,MAAM,CAAC,CACX,CAAA;QAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,CAAA;QAE9E,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAA;IAC9B,CAAC;IAED,UAAU,CAAC,GAAe;QACtB,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;IACpC,CAAC;CACJ;AArDD,8CAqDC","sourcesContent":["import { ICryptoProvider } from './abstract.js'\nimport { WasmCryptoProvider, WasmCryptoProviderOptions } from './wasm.js'\n\nconst ALGO_TO_SUBTLE: Record<string, string> = {\n sha256: 'SHA-256',\n sha1: 'SHA-1',\n sha512: 'SHA-512',\n}\n\nexport class WebCryptoProvider extends WasmCryptoProvider implements ICryptoProvider {\n readonly crypto: Crypto\n\n constructor(params?: WasmCryptoProviderOptions & { crypto?: Crypto }) {\n super(params)\n const crypto = params?.crypto ?? globalThis.crypto\n\n if (!crypto || !crypto.subtle) {\n throw new Error('WebCrypto is not available')\n }\n this.crypto = crypto\n }\n\n async pbkdf2(\n password: Uint8Array,\n salt: Uint8Array,\n iterations: number,\n keylen?: number | undefined,\n algo?: string | undefined,\n ): Promise<Uint8Array> {\n const keyMaterial = await this.crypto.subtle.importKey('raw', password, 'PBKDF2', false, ['deriveBits'])\n\n return this.crypto.subtle\n .deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: algo ? ALGO_TO_SUBTLE[algo] : 'SHA-512',\n },\n keyMaterial,\n (keylen || 64) * 8,\n )\n .then((result) => new Uint8Array(result))\n }\n\n async hmacSha256(data: Uint8Array, key: Uint8Array): Promise<Uint8Array> {\n const keyMaterial = await this.crypto.subtle.importKey(\n 'raw',\n key,\n { name: 'HMAC', hash: { name: 'SHA-256' } },\n false,\n ['sign'],\n )\n\n const res = await this.crypto.subtle.sign({ name: 'HMAC' }, keyMaterial, data)\n\n return new Uint8Array(res)\n }\n\n randomFill(buf: Uint8Array): void {\n this.crypto.getRandomValues(buf)\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const test_1 = require("@mtcute/test");
5
+ const web_js_1 = require("./web.js");
6
+ (0, vitest_1.describe)('WebCryptoProvider', async () => {
7
+ let crypto = globalThis.crypto;
8
+ if (!crypto && typeof process !== 'undefined') {
9
+ crypto = await import('crypto').then((m) => m.webcrypto);
10
+ }
11
+ if (!crypto) {
12
+ console.warn('Skipping WebCryptoProvider tests (no webcrypto)');
13
+ return;
14
+ }
15
+ (0, test_1.testCryptoProvider)(new web_js_1.WebCryptoProvider({ crypto }));
16
+ });
17
+ //# sourceMappingURL=web.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.test.js","sourceRoot":"","sources":["../../../../src/utils/crypto/web.test.ts"],"names":[],"mappings":";;AAAA,mCAAiC;AAEjC,uCAAiD;AAEjD,qCAA4C;AAE5C,IAAA,iBAAQ,EAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;IACrC,IAAI,MAAM,GAAG,UAAU,CAAC,MAAM,CAAA;IAE9B,IAAI,CAAC,MAAM,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE;QAC3C,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAmB,CAAC,CAAA;KACrE;IAED,IAAI,CAAC,MAAM,EAAE;QACT,OAAO,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;QAE/D,OAAM;KACT;IAED,IAAA,yBAAkB,EAAC,IAAI,0BAAiB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;AACzD,CAAC,CAAC,CAAA","sourcesContent":["import { describe } from 'vitest'\n\nimport { testCryptoProvider } from '@mtcute/test'\n\nimport { WebCryptoProvider } from './web.js'\n\ndescribe('WebCryptoProvider', async () => {\n let crypto = globalThis.crypto\n\n if (!crypto && typeof process !== 'undefined') {\n crypto = await import('crypto').then((m) => m.webcrypto as Crypto)\n }\n\n if (!crypto) {\n console.warn('Skipping WebCryptoProvider tests (no webcrypto)')\n\n return\n }\n\n testCryptoProvider(new WebCryptoProvider({ crypto }))\n})\n"]}
@@ -10,7 +10,7 @@ export declare class Deque<T> {
10
10
  protected _head: number;
11
11
  protected _tail: number;
12
12
  protected _capacity: number;
13
- constructor(minCapacity?: number, maxLength?: number);
13
+ constructor(maxLength?: number, minCapacity?: number);
14
14
  protected _resize(): void;
15
15
  pushBack(item: T): void;
16
16
  pushFront(item: T): void;
@@ -16,14 +16,16 @@ function arraycopy(src, srcPos, dest, destPos, length) {
16
16
  * Based on Java implementation
17
17
  */
18
18
  class Deque {
19
- constructor(minCapacity = MIN_INITIAL_CAPACITY, maxLength = Infinity) {
19
+ constructor(maxLength = Infinity, minCapacity = maxLength === Infinity ? MIN_INITIAL_CAPACITY : maxLength) {
20
20
  this.maxLength = maxLength;
21
21
  this._head = 0;
22
22
  this._tail = 0;
23
23
  let capacity = minCapacity;
24
- if (capacity >= MIN_INITIAL_CAPACITY) {
24
+ if (capacity < MIN_INITIAL_CAPACITY) {
25
+ capacity = MIN_INITIAL_CAPACITY;
26
+ }
27
+ if (capacity !== MIN_INITIAL_CAPACITY) {
25
28
  // Find the best power of two to hold elements.
26
- // >= because array can't be full
27
29
  capacity |= capacity >>> 1;
28
30
  capacity |= capacity >>> 2;
29
31
  capacity |= capacity >>> 4;
@@ -107,6 +109,8 @@ class Deque {
107
109
  }
108
110
  toArray() {
109
111
  const sz = this.length;
112
+ if (sz === 0)
113
+ return [];
110
114
  const arr = new Array(sz);
111
115
  if (this._head < this._tail) {
112
116
  // copy as-is, head to tail
@@ -183,6 +187,8 @@ class Deque {
183
187
  }
184
188
  *iter() {
185
189
  const sz = this.length;
190
+ if (sz === 0)
191
+ return;
186
192
  if (this._head < this._tail) {
187
193
  // head to tail
188
194
  for (let i = 0; i < sz; i++) {
@@ -1 +1 @@
1
- {"version":3,"file":"deque.js","sourceRoot":"","sources":["../../../src/utils/deque.ts"],"names":[],"mappings":"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","sourcesContent":["// ^^ because of performance reasons\nconst MIN_INITIAL_CAPACITY = 8\n\n// System.arraycopy from java\nfunction arraycopy<T>(src: T[], srcPos: number, dest: T[], destPos: number, length: number) {\n for (let i = 0; i < length; i++) {\n dest[destPos + i] = src[srcPos + i]\n }\n}\n\n/**\n * Deque implementation.\n * `undefined` values are not allowed\n *\n * Based on Java implementation\n */\nexport class Deque<T> {\n // another implementation variant would be to use\n // blocks of fixed size instead of a single array\n // to avoid copying stuff around\n protected _elements: (T | undefined)[]\n protected _head = 0\n protected _tail = 0\n protected _capacity: number\n\n constructor(\n minCapacity = MIN_INITIAL_CAPACITY,\n readonly maxLength = Infinity,\n ) {\n let capacity = minCapacity\n\n if (capacity >= MIN_INITIAL_CAPACITY) {\n // Find the best power of two to hold elements.\n // >= because array can't be full\n capacity |= capacity >>> 1\n capacity |= capacity >>> 2\n capacity |= capacity >>> 4\n capacity |= capacity >>> 8\n capacity |= capacity >>> 16\n capacity += 1\n\n if (capacity < 0) {\n // too many\n capacity >>>= 1\n }\n }\n\n this._elements = new Array<T | undefined>(capacity)\n this._capacity = capacity\n }\n\n protected _resize() {\n const p = this._head\n const n = this._capacity\n const r = n - p // number of elements to the right of the head\n\n const newCapacity = n << 1\n if (newCapacity < 0) throw new Error('Deque is too big')\n\n const arr = new Array<T | undefined>(newCapacity)\n\n // copy items to the new array\n // copy head till the end of arr\n arraycopy(this._elements, p, arr, 0, r)\n // copy from start to tail\n arraycopy(this._elements, 0, arr, r, p)\n\n this._elements = arr\n this._head = 0\n this._tail = n\n this._capacity = newCapacity\n }\n\n pushBack(item: T): void {\n if (item === undefined) throw new Error('item can not be undefined')\n\n this._elements[this._tail] = item\n\n if ((this._tail = (this._tail + 1) & (this._capacity - 1)) === this._head) {\n this._resize()\n }\n\n if (this.length > this.maxLength) {\n this.popFront()\n }\n }\n\n pushFront(item: T): void {\n if (item === undefined) throw new Error('item can not be undefined')\n\n this._elements[(this._head = (this._head - 1) & (this._capacity - 1))] = item\n\n if (this._head === this._tail) {\n this._resize()\n }\n\n if (this.length > this.maxLength) {\n this.popBack()\n }\n }\n\n popFront(): T | undefined {\n const h = this._head\n const res = this._elements[h]\n if (res === undefined) return undefined\n\n this._elements[h] = undefined\n this._head = (h + 1) & (this._capacity - 1)\n\n return res\n }\n\n popBack(): T | undefined {\n const t = (this._tail - 1) & (this._capacity - 1)\n const res = this._elements[t]\n if (res === undefined) return undefined\n\n this._elements[t] = undefined\n this._tail = t\n\n return res\n }\n\n peekFront(): T | undefined {\n return this._elements[this._head]\n }\n\n peekBack(): T | undefined {\n return this._elements[(this._tail - 1) & (this._capacity - 1)]\n }\n\n get length(): number {\n return (this._tail - this._head) & (this._capacity - 1)\n }\n\n toArray(): T[] {\n const sz = this.length\n const arr = new Array(sz)\n\n if (this._head < this._tail) {\n // copy as-is, head to tail\n arraycopy(this._elements, this._head, arr, 0, sz)\n } else {\n const headPortion = this._capacity - this._head\n\n // copy from head to end\n arraycopy(this._elements, this._head, arr, 0, headPortion)\n // copy from start to tail\n arraycopy(this._elements, 0, arr, headPortion, this._tail)\n }\n\n return arr as T[]\n }\n\n protected _delete(i: number): void {\n const els = this._elements\n const mask = this._capacity - 1\n const h = this._head\n const t = this._tail\n const front = (i - h) & mask\n const back = (t - i) & mask\n\n if (front < back) {\n if (h <= i) {\n arraycopy(els, h, els, h + 1, front)\n } else {\n // wrap\n arraycopy(els, 0, els, 1, i)\n els[0] = els[mask]\n arraycopy(els, h, els, h + 1, mask - h)\n }\n els[h] = undefined\n this._head = (h + 1) & mask\n } else if (i < t) {\n // copy null tail as well\n arraycopy(els, i + 1, els, i, back)\n this._tail = t - 1\n } else {\n // wrap\n arraycopy(els, i + 1, els, i, mask - i)\n els[mask] = els[0]\n arraycopy(els, 1, els, 0, t)\n this._tail = (t - 1) & mask\n }\n }\n\n remove(item: T): void {\n const mask = this._capacity - 1\n let i = this._head\n let val: T | undefined\n\n while ((val = this._elements[i]) !== undefined) {\n if (item === val) {\n this._delete(i)\n\n return\n }\n i = (i + 1) & mask\n }\n }\n\n removeBy(pred: (it: T) => boolean): void {\n const mask = this._capacity - 1\n let i = this._head\n let val: T | undefined\n\n while ((val = this._elements[i]) !== undefined) {\n if (pred(val)) {\n this._delete(i)\n\n return\n }\n i = (i + 1) & mask\n }\n }\n\n at(idx: number): T | undefined {\n return this._elements[(this._head + idx) & (this._capacity - 1)]\n }\n\n *iter(): IterableIterator<T> {\n const sz = this.length\n\n if (this._head < this._tail) {\n // head to tail\n for (let i = 0; i < sz; i++) {\n yield this._elements[this._head + i]!\n }\n } else {\n const headPortion = this._capacity - this._head\n\n // head to end\n for (let i = 0; i < headPortion; i++) {\n yield this._elements[this._head + i]!\n }\n // start to tail\n for (let i = 0; i < this._tail; i++) {\n yield this._elements[i]!\n }\n }\n }\n\n clear(): void {\n this._elements = new Array<T | undefined>(this._capacity)\n this._head = this._tail = 0\n }\n}\n"]}
1
+ {"version":3,"file":"deque.js","sourceRoot":"","sources":["../../../src/utils/deque.ts"],"names":[],"mappings":";;;AAAA,oCAAoC;AACpC,MAAM,oBAAoB,GAAG,CAAC,CAAA;AAE9B,6BAA6B;AAC7B,SAAS,SAAS,CAAI,GAAQ,EAAE,MAAc,EAAE,IAAS,EAAE,OAAe,EAAE,MAAc;IACtF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;QAC7B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;KACtC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAa,KAAK;IASd,YACa,YAAY,QAAQ,EAC7B,WAAW,GAAG,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,SAAS;QAD9D,cAAS,GAAT,SAAS,CAAW;QALvB,UAAK,GAAG,CAAC,CAAA;QACT,UAAK,GAAG,CAAC,CAAA;QAOf,IAAI,QAAQ,GAAG,WAAW,CAAA;QAE1B,IAAI,QAAQ,GAAG,oBAAoB,EAAE;YACjC,QAAQ,GAAG,oBAAoB,CAAA;SAClC;QACD,IAAI,QAAQ,KAAK,oBAAoB,EAAE;YACnC,+CAA+C;YAC/C,QAAQ,IAAI,QAAQ,KAAK,CAAC,CAAA;YAC1B,QAAQ,IAAI,QAAQ,KAAK,CAAC,CAAA;YAC1B,QAAQ,IAAI,QAAQ,KAAK,CAAC,CAAA;YAC1B,QAAQ,IAAI,QAAQ,KAAK,CAAC,CAAA;YAC1B,QAAQ,IAAI,QAAQ,KAAK,EAAE,CAAA;YAC3B,QAAQ,IAAI,CAAC,CAAA;YAEb,IAAI,QAAQ,GAAG,CAAC,EAAE;gBACd,WAAW;gBACX,QAAQ,MAAM,CAAC,CAAA;aAClB;SACJ;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,KAAK,CAAgB,QAAQ,CAAC,CAAA;QACnD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;IAC7B,CAAC;IAES,OAAO;QACb,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAA;QACpB,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAA;QACxB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA,CAAC,8CAA8C;QAE9D,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,CAAA;QAC1B,IAAI,WAAW,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;QAExD,MAAM,GAAG,GAAG,IAAI,KAAK,CAAgB,WAAW,CAAC,CAAA;QAEjD,8BAA8B;QAC9B,gCAAgC;QAChC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QACvC,0BAA0B;QAC1B,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAEvC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAA;QACpB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;QACd,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;QACd,IAAI,CAAC,SAAS,GAAG,WAAW,CAAA;IAChC,CAAC;IAED,QAAQ,CAAC,IAAO;QACZ,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;QAEpE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAA;QAEjC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE;YACvE,IAAI,CAAC,OAAO,EAAE,CAAA;SACjB;QAED,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE;YAC9B,IAAI,CAAC,QAAQ,EAAE,CAAA;SAClB;IACL,CAAC;IAED,SAAS,CAAC,IAAO;QACb,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;QAEpE,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;QAE7E,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE;YAC3B,IAAI,CAAC,OAAO,EAAE,CAAA;SACjB;QAED,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE;YAC9B,IAAI,CAAC,OAAO,EAAE,CAAA;SACjB;IACL,CAAC;IAED,QAAQ;QACJ,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAA;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QAC7B,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,SAAS,CAAA;QAEvC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAA;QAC7B,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAA;QAE3C,OAAO,GAAG,CAAA;IACd,CAAC;IAED,OAAO;QACH,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAA;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QAC7B,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,SAAS,CAAA;QAEvC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAA;QAC7B,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;QAEd,OAAO,GAAG,CAAA;IACd,CAAC;IAED,SAAS;QACL,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACrC,CAAC;IAED,QAAQ;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAA;IAClE,CAAC;IAED,IAAI,MAAM;QACN,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAA;IAC3D,CAAC;IAED,OAAO;QACH,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAA;QACtB,IAAI,EAAE,KAAK,CAAC;YAAE,OAAO,EAAE,CAAA;QAEvB,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,CAAA;QAEzB,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;YACzB,2BAA2B;YAC3B,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;SACpD;aAAM;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAA;YAE/C,wBAAwB;YACxB,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,WAAW,CAAC,CAAA;YAC1D,0BAA0B;YAC1B,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;SAC7D;QAED,OAAO,GAAU,CAAA;IACrB,CAAC;IAES,OAAO,CAAC,CAAS;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAA;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;QAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAA;QACpB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAA;QACpB,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAA;QAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAA;QAE3B,IAAI,KAAK,GAAG,IAAI,EAAE;YACd,IAAI,CAAC,IAAI,CAAC,EAAE;gBACR,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAA;aACvC;iBAAM;gBACH,OAAO;gBACP,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;gBAC5B,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAA;gBAClB,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAA;aAC1C;YACD,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAA;YAClB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAA;SAC9B;aAAM,IAAI,CAAC,GAAG,CAAC,EAAE;YACd,yBAAyB;YACzB,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;YACnC,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAA;SACrB;aAAM;YACH,OAAO;YACP,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAA;YACvC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;YAClB,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YAC5B,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAA;SAC9B;IACL,CAAC;IAED,MAAM,CAAC,IAAO;QACV,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;QAC/B,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAA;QAClB,IAAI,GAAkB,CAAA;QAEtB,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE;YAC5C,IAAI,IAAI,KAAK,GAAG,EAAE;gBACd,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;gBAEf,OAAM;aACT;YACD,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAA;SACrB;IACL,CAAC;IAED,QAAQ,CAAC,IAAwB;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;QAC/B,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAA;QAClB,IAAI,GAAkB,CAAA;QAEtB,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE;YAC5C,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE;gBACX,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;gBAEf,OAAM;aACT;YACD,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAA;SACrB;IACL,CAAC;IAED,EAAE,CAAC,GAAW;QACV,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAA;IACpE,CAAC;IAED,CAAC,IAAI;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAA;QACtB,IAAI,EAAE,KAAK,CAAC;YAAE,OAAM;QAEpB,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;YACzB,eAAe;YACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;gBACzB,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAE,CAAA;aACxC;SACJ;aAAM;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAA;YAE/C,cAAc;YACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;gBAClC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAE,CAAA;aACxC;YACD,gBAAgB;YAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;gBACjC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAE,CAAA;aAC3B;SACJ;IACL,CAAC;IAED,KAAK;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,KAAK,CAAgB,IAAI,CAAC,SAAS,CAAC,CAAA;QACzD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;IAC/B,CAAC;CACJ;AA3OD,sBA2OC","sourcesContent":["// ^^ because of performance reasons\nconst MIN_INITIAL_CAPACITY = 8\n\n// System.arraycopy from java\nfunction arraycopy<T>(src: T[], srcPos: number, dest: T[], destPos: number, length: number) {\n for (let i = 0; i < length; i++) {\n dest[destPos + i] = src[srcPos + i]\n }\n}\n\n/**\n * Deque implementation.\n * `undefined` values are not allowed\n *\n * Based on Java implementation\n */\nexport class Deque<T> {\n // another implementation variant would be to use\n // blocks of fixed size instead of a single array\n // to avoid copying stuff around\n protected _elements: (T | undefined)[]\n protected _head = 0\n protected _tail = 0\n protected _capacity: number\n\n constructor(\n readonly maxLength = Infinity,\n minCapacity = maxLength === Infinity ? MIN_INITIAL_CAPACITY : maxLength,\n ) {\n let capacity = minCapacity\n\n if (capacity < MIN_INITIAL_CAPACITY) {\n capacity = MIN_INITIAL_CAPACITY\n }\n if (capacity !== MIN_INITIAL_CAPACITY) {\n // Find the best power of two to hold elements.\n capacity |= capacity >>> 1\n capacity |= capacity >>> 2\n capacity |= capacity >>> 4\n capacity |= capacity >>> 8\n capacity |= capacity >>> 16\n capacity += 1\n\n if (capacity < 0) {\n // too many\n capacity >>>= 1\n }\n }\n\n this._elements = new Array<T | undefined>(capacity)\n this._capacity = capacity\n }\n\n protected _resize() {\n const p = this._head\n const n = this._capacity\n const r = n - p // number of elements to the right of the head\n\n const newCapacity = n << 1\n if (newCapacity < 0) throw new Error('Deque is too big')\n\n const arr = new Array<T | undefined>(newCapacity)\n\n // copy items to the new array\n // copy head till the end of arr\n arraycopy(this._elements, p, arr, 0, r)\n // copy from start to tail\n arraycopy(this._elements, 0, arr, r, p)\n\n this._elements = arr\n this._head = 0\n this._tail = n\n this._capacity = newCapacity\n }\n\n pushBack(item: T): void {\n if (item === undefined) throw new Error('item can not be undefined')\n\n this._elements[this._tail] = item\n\n if ((this._tail = (this._tail + 1) & (this._capacity - 1)) === this._head) {\n this._resize()\n }\n\n if (this.length > this.maxLength) {\n this.popFront()\n }\n }\n\n pushFront(item: T): void {\n if (item === undefined) throw new Error('item can not be undefined')\n\n this._elements[(this._head = (this._head - 1) & (this._capacity - 1))] = item\n\n if (this._head === this._tail) {\n this._resize()\n }\n\n if (this.length > this.maxLength) {\n this.popBack()\n }\n }\n\n popFront(): T | undefined {\n const h = this._head\n const res = this._elements[h]\n if (res === undefined) return undefined\n\n this._elements[h] = undefined\n this._head = (h + 1) & (this._capacity - 1)\n\n return res\n }\n\n popBack(): T | undefined {\n const t = (this._tail - 1) & (this._capacity - 1)\n const res = this._elements[t]\n if (res === undefined) return undefined\n\n this._elements[t] = undefined\n this._tail = t\n\n return res\n }\n\n peekFront(): T | undefined {\n return this._elements[this._head]\n }\n\n peekBack(): T | undefined {\n return this._elements[(this._tail - 1) & (this._capacity - 1)]\n }\n\n get length(): number {\n return (this._tail - this._head) & (this._capacity - 1)\n }\n\n toArray(): T[] {\n const sz = this.length\n if (sz === 0) return []\n\n const arr = new Array(sz)\n\n if (this._head < this._tail) {\n // copy as-is, head to tail\n arraycopy(this._elements, this._head, arr, 0, sz)\n } else {\n const headPortion = this._capacity - this._head\n\n // copy from head to end\n arraycopy(this._elements, this._head, arr, 0, headPortion)\n // copy from start to tail\n arraycopy(this._elements, 0, arr, headPortion, this._tail)\n }\n\n return arr as T[]\n }\n\n protected _delete(i: number): void {\n const els = this._elements\n const mask = this._capacity - 1\n const h = this._head\n const t = this._tail\n const front = (i - h) & mask\n const back = (t - i) & mask\n\n if (front < back) {\n if (h <= i) {\n arraycopy(els, h, els, h + 1, front)\n } else {\n // wrap\n arraycopy(els, 0, els, 1, i)\n els[0] = els[mask]\n arraycopy(els, h, els, h + 1, mask - h)\n }\n els[h] = undefined\n this._head = (h + 1) & mask\n } else if (i < t) {\n // copy null tail as well\n arraycopy(els, i + 1, els, i, back)\n this._tail = t - 1\n } else {\n // wrap\n arraycopy(els, i + 1, els, i, mask - i)\n els[mask] = els[0]\n arraycopy(els, 1, els, 0, t)\n this._tail = (t - 1) & mask\n }\n }\n\n remove(item: T): void {\n const mask = this._capacity - 1\n let i = this._head\n let val: T | undefined\n\n while ((val = this._elements[i]) !== undefined) {\n if (item === val) {\n this._delete(i)\n\n return\n }\n i = (i + 1) & mask\n }\n }\n\n removeBy(pred: (it: T) => boolean): void {\n const mask = this._capacity - 1\n let i = this._head\n let val: T | undefined\n\n while ((val = this._elements[i]) !== undefined) {\n if (pred(val)) {\n this._delete(i)\n\n return\n }\n i = (i + 1) & mask\n }\n }\n\n at(idx: number): T | undefined {\n return this._elements[(this._head + idx) & (this._capacity - 1)]\n }\n\n *iter(): IterableIterator<T> {\n const sz = this.length\n if (sz === 0) return\n\n if (this._head < this._tail) {\n // head to tail\n for (let i = 0; i < sz; i++) {\n yield this._elements[this._head + i]!\n }\n } else {\n const headPortion = this._capacity - this._head\n\n // head to end\n for (let i = 0; i < headPortion; i++) {\n yield this._elements[this._head + i]!\n }\n // start to tail\n for (let i = 0; i < this._tail; i++) {\n yield this._elements[i]!\n }\n }\n }\n\n clear(): void {\n this._elements = new Array<T | undefined>(this._capacity)\n this._head = this._tail = 0\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};