zapo-js 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (589) hide show
  1. package/README.md +20 -4
  2. package/dist/appstate/WaAppStateCrypto.js +19 -26
  3. package/dist/appstate/WaAppStateSyncClient.js +293 -181
  4. package/dist/appstate/WaAppStateSyncResponseParser.js +16 -5
  5. package/dist/appstate/constants.js +4 -3
  6. package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
  7. package/dist/appstate/index.js +8 -6
  8. package/dist/appstate/utils.js +9 -34
  9. package/dist/auth/WaAuthClient.js +43 -61
  10. package/dist/auth/flow/WaAuthCredentialsFlow.js +22 -15
  11. package/dist/auth/index.js +1 -8
  12. package/dist/auth/pairing/WaPairingCodeCrypto.js +6 -4
  13. package/dist/auth/pairing/WaPairingFlow.js +34 -26
  14. package/dist/auth/pairing/WaQrFlow.js +37 -24
  15. package/dist/client/WaClient.js +275 -324
  16. package/dist/client/WaClientFactory.js +500 -133
  17. package/dist/client/connection/WaConnectionManager.js +301 -0
  18. package/dist/client/connection/WaKeyShareCoordinator.js +63 -0
  19. package/dist/client/connection/WaReceiptQueue.js +51 -0
  20. package/dist/client/coordinators/WaAppStateMutationCoordinator.js +471 -0
  21. package/dist/client/coordinators/WaBusinessCoordinator.js +241 -0
  22. package/dist/client/coordinators/WaGroupCoordinator.js +30 -16
  23. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +21 -27
  24. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +439 -701
  25. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  26. package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
  27. package/dist/client/coordinators/WaProfileCoordinator.js +212 -0
  28. package/dist/client/coordinators/WaRetryCoordinator.js +242 -57
  29. package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
  30. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +166 -0
  31. package/dist/client/dirty.js +74 -48
  32. package/dist/client/events/chat.js +4 -3
  33. package/dist/client/events/devices.js +72 -0
  34. package/dist/client/events/group.js +62 -47
  35. package/dist/client/events/identity.js +22 -0
  36. package/dist/client/events/privacy-token.js +39 -0
  37. package/dist/client/history-sync.js +94 -63
  38. package/dist/client/incoming.js +60 -27
  39. package/dist/client/mailbox.js +24 -23
  40. package/dist/client/messages.js +107 -31
  41. package/dist/client/messaging/fanout.js +199 -0
  42. package/dist/client/messaging/key-protocol.js +130 -0
  43. package/dist/client/messaging/participants.js +193 -0
  44. package/dist/client/persistence/WriteBehindPersistence.js +129 -0
  45. package/dist/client/tokens/cs-token.js +50 -0
  46. package/dist/client/tokens/tc-token.js +25 -0
  47. package/dist/crypto/core/hkdf.js +3 -8
  48. package/dist/crypto/core/index.js +2 -5
  49. package/dist/crypto/core/keys.js +6 -7
  50. package/dist/crypto/core/nonce.js +2 -0
  51. package/dist/crypto/core/primitives.js +12 -23
  52. package/dist/crypto/core/random.js +26 -23
  53. package/dist/crypto/curves/Ed25519.js +7 -8
  54. package/dist/crypto/curves/X25519.js +38 -22
  55. package/dist/crypto/index.js +1 -3
  56. package/dist/crypto/math/constants.js +13 -36
  57. package/dist/crypto/math/edwards.js +171 -44
  58. package/dist/crypto/math/fe.js +706 -0
  59. package/dist/crypto/math/mod.js +10 -3
  60. package/dist/esm/appstate/WaAppStateCrypto.js +7 -14
  61. package/dist/esm/appstate/WaAppStateSyncClient.js +284 -172
  62. package/dist/esm/appstate/WaAppStateSyncResponseParser.js +17 -6
  63. package/dist/esm/appstate/constants.js +3 -2
  64. package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
  65. package/dist/esm/appstate/index.js +2 -2
  66. package/dist/esm/appstate/utils.js +8 -30
  67. package/dist/esm/auth/WaAuthClient.js +43 -61
  68. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +22 -15
  69. package/dist/esm/auth/index.js +0 -3
  70. package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +6 -4
  71. package/dist/esm/auth/pairing/WaPairingFlow.js +28 -20
  72. package/dist/esm/auth/pairing/WaQrFlow.js +37 -24
  73. package/dist/esm/client/WaClient.js +275 -324
  74. package/dist/esm/client/WaClientFactory.js +501 -134
  75. package/dist/esm/client/connection/WaConnectionManager.js +297 -0
  76. package/dist/esm/client/connection/WaKeyShareCoordinator.js +59 -0
  77. package/dist/esm/client/connection/WaReceiptQueue.js +47 -0
  78. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +467 -0
  79. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +238 -0
  80. package/dist/esm/client/coordinators/WaGroupCoordinator.js +23 -9
  81. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +21 -27
  82. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +443 -705
  83. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  84. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
  85. package/dist/esm/client/coordinators/WaProfileCoordinator.js +209 -0
  86. package/dist/esm/client/coordinators/WaRetryCoordinator.js +244 -59
  87. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
  88. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +162 -0
  89. package/dist/esm/client/dirty.js +69 -43
  90. package/dist/esm/client/events/chat.js +4 -3
  91. package/dist/esm/client/events/devices.js +68 -0
  92. package/dist/esm/client/events/group.js +53 -39
  93. package/dist/esm/client/events/identity.js +19 -0
  94. package/dist/esm/client/events/privacy-token.js +36 -0
  95. package/dist/esm/client/history-sync.js +91 -60
  96. package/dist/esm/client/incoming.js +61 -28
  97. package/dist/esm/client/mailbox.js +24 -23
  98. package/dist/esm/client/messages.js +108 -32
  99. package/dist/esm/client/messaging/fanout.js +196 -0
  100. package/dist/esm/client/messaging/key-protocol.js +127 -0
  101. package/dist/esm/client/messaging/participants.js +190 -0
  102. package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
  103. package/dist/esm/client/tokens/cs-token.js +46 -0
  104. package/dist/esm/client/tokens/tc-token.js +18 -0
  105. package/dist/esm/crypto/core/hkdf.js +3 -8
  106. package/dist/esm/crypto/core/index.js +2 -3
  107. package/dist/esm/crypto/core/keys.js +3 -4
  108. package/dist/esm/crypto/core/nonce.js +2 -0
  109. package/dist/esm/crypto/core/primitives.js +12 -22
  110. package/dist/esm/crypto/core/random.js +25 -23
  111. package/dist/esm/crypto/curves/Ed25519.js +4 -5
  112. package/dist/esm/crypto/curves/X25519.js +35 -19
  113. package/dist/esm/crypto/index.js +0 -1
  114. package/dist/esm/crypto/math/constants.js +12 -35
  115. package/dist/esm/crypto/math/edwards.js +174 -47
  116. package/dist/esm/crypto/math/fe.js +691 -0
  117. package/dist/esm/crypto/math/mod.js +10 -1
  118. package/dist/esm/index.js +1 -1
  119. package/dist/esm/infra/log/ConsoleLogger.js +18 -17
  120. package/dist/esm/infra/log/PinoLogger.js +15 -9
  121. package/dist/esm/infra/log/types.js +11 -1
  122. package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
  123. package/dist/esm/infra/perf/BoundedTaskQueue.js +16 -18
  124. package/dist/esm/infra/perf/PromiseDedup.js +20 -0
  125. package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
  126. package/dist/esm/infra/perf/StoreLock.js +77 -0
  127. package/dist/esm/media/WaMediaCrypto.js +96 -16
  128. package/dist/esm/media/WaMediaTransferClient.js +251 -91
  129. package/dist/esm/media/conn.js +10 -6
  130. package/dist/esm/media/constants.js +6 -2
  131. package/dist/esm/message/WaMessageClient.js +30 -32
  132. package/dist/esm/message/ack.js +6 -6
  133. package/dist/esm/message/addon-crypto.js +59 -0
  134. package/dist/esm/message/content.js +195 -9
  135. package/dist/esm/message/icdc.js +76 -0
  136. package/dist/esm/message/incoming.js +129 -122
  137. package/dist/esm/message/index.js +2 -0
  138. package/dist/esm/message/phash.js +3 -1
  139. package/dist/esm/message/reporting-token.js +425 -0
  140. package/dist/esm/message/use-case-secret.js +49 -0
  141. package/dist/esm/protocol/appstate.js +27 -0
  142. package/dist/esm/protocol/browser.js +10 -18
  143. package/dist/esm/protocol/constants.js +6 -3
  144. package/dist/esm/protocol/defaults.js +6 -0
  145. package/dist/esm/protocol/index.js +2 -11
  146. package/dist/esm/protocol/jid.js +133 -52
  147. package/dist/esm/protocol/media.js +3 -3
  148. package/dist/esm/protocol/message.js +61 -1
  149. package/dist/esm/protocol/nodes.js +4 -0
  150. package/dist/esm/protocol/notification.js +3 -1
  151. package/dist/esm/protocol/privacy-token.js +17 -0
  152. package/dist/esm/protocol/privacy.js +55 -0
  153. package/dist/esm/protocol/stream.js +26 -1
  154. package/dist/esm/protocol/usync.js +11 -0
  155. package/dist/esm/retry/codec.js +216 -0
  156. package/dist/esm/retry/constants.js +1 -1
  157. package/dist/esm/retry/index.js +3 -2
  158. package/dist/esm/retry/parse.js +88 -86
  159. package/dist/esm/retry/replay.js +54 -51
  160. package/dist/esm/retry/tracker.js +94 -0
  161. package/dist/esm/signal/api/SignalDeviceSyncApi.js +276 -92
  162. package/dist/esm/signal/api/SignalDigestSyncApi.js +17 -8
  163. package/dist/esm/signal/api/SignalIdentitySyncApi.js +67 -37
  164. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +86 -67
  165. package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
  166. package/dist/esm/signal/api/SignalSessionSyncApi.js +36 -34
  167. package/dist/esm/signal/api/result-map.js +10 -0
  168. package/dist/esm/signal/constants.js +0 -4
  169. package/dist/esm/signal/crypto/WaAdvSignature.js +13 -9
  170. package/dist/esm/signal/{store/sqlite.js → encoding.js} +93 -60
  171. package/dist/esm/signal/group/SenderKeyChain.js +28 -23
  172. package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
  173. package/dist/esm/signal/group/SenderKeyManager.js +144 -115
  174. package/dist/esm/signal/index.js +2 -0
  175. package/dist/esm/signal/registration/keygen.js +6 -2
  176. package/dist/esm/signal/registration/utils.js +1 -0
  177. package/dist/esm/signal/session/SignalProtocol.js +164 -53
  178. package/dist/esm/signal/session/SignalRatchet.js +24 -15
  179. package/dist/esm/signal/session/SignalSession.js +14 -9
  180. package/dist/esm/signal/session/resolver.js +221 -0
  181. package/dist/esm/store/contracts/privacy-token.store.js +1 -0
  182. package/dist/esm/store/createStore.js +100 -188
  183. package/dist/esm/store/index.js +1 -10
  184. package/dist/esm/store/locks/appstate.lock.js +26 -0
  185. package/dist/esm/store/locks/auth.lock.js +15 -0
  186. package/dist/esm/store/locks/contact.lock.js +20 -0
  187. package/dist/esm/store/locks/device-list.lock.js +20 -0
  188. package/dist/esm/store/locks/message.lock.js +21 -0
  189. package/dist/esm/store/locks/participants.lock.js +20 -0
  190. package/dist/esm/store/locks/privacy-token.lock.js +18 -0
  191. package/dist/esm/store/locks/retry.lock.js +29 -0
  192. package/dist/esm/store/locks/sender-key.lock.js +52 -0
  193. package/dist/esm/store/locks/signal.lock.js +63 -0
  194. package/dist/esm/store/locks/thread.lock.js +21 -0
  195. package/dist/esm/store/noop.store.js +4 -7
  196. package/dist/esm/store/providers/memory/appstate.store.js +38 -16
  197. package/dist/esm/store/providers/memory/contact.store.js +5 -0
  198. package/dist/esm/store/providers/memory/device-list.store.js +12 -34
  199. package/dist/esm/store/providers/memory/message.store.js +11 -5
  200. package/dist/esm/store/providers/memory/participants.store.js +1 -8
  201. package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
  202. package/dist/esm/store/providers/memory/retry.store.js +77 -2
  203. package/dist/esm/store/providers/memory/sender-key.store.js +11 -8
  204. package/dist/esm/store/providers/memory/signal.store.js +47 -18
  205. package/dist/esm/store/providers/memory/thread.store.js +5 -0
  206. package/dist/esm/transport/WaComms.js +28 -24
  207. package/dist/esm/transport/WaWebSocket.js +115 -18
  208. package/dist/esm/transport/binary/constants.js +0 -30
  209. package/dist/esm/transport/binary/decoder.js +8 -8
  210. package/dist/esm/transport/binary/encoder.js +10 -9
  211. package/dist/esm/transport/binary/index.js +0 -1
  212. package/dist/esm/transport/index.js +1 -0
  213. package/dist/esm/transport/keepalive/WaKeepAlive.js +2 -8
  214. package/dist/esm/transport/node/WaNodeOrchestrator.js +25 -21
  215. package/dist/esm/transport/node/WaNodeTransport.js +0 -3
  216. package/dist/esm/transport/node/builders/{accountSync.js → account-sync.js} +16 -36
  217. package/dist/esm/transport/node/builders/business.js +129 -0
  218. package/dist/esm/transport/node/builders/global.js +370 -0
  219. package/dist/esm/transport/node/builders/index.js +7 -3
  220. package/dist/esm/transport/node/builders/message.js +63 -230
  221. package/dist/esm/transport/node/builders/pairing.js +2 -27
  222. package/dist/esm/transport/node/builders/privacy-token.js +41 -0
  223. package/dist/esm/transport/node/builders/privacy.js +48 -0
  224. package/dist/esm/transport/node/builders/profile.js +70 -0
  225. package/dist/esm/transport/node/builders/retry.js +10 -22
  226. package/dist/esm/transport/node/builders/usync.js +45 -0
  227. package/dist/esm/transport/node/helpers.js +125 -5
  228. package/dist/esm/transport/node/usync.js +5 -0
  229. package/dist/esm/transport/node/xml.js +35 -14
  230. package/dist/esm/transport/noise/WaClientPayload.js +10 -10
  231. package/dist/esm/transport/noise/WaFrameCodec.js +48 -33
  232. package/dist/esm/transport/noise/WaNoiseCert.js +4 -7
  233. package/dist/esm/transport/noise/WaNoiseSession.js +77 -29
  234. package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
  235. package/dist/esm/transport/proxy.js +27 -0
  236. package/dist/esm/transport/stream/parse.js +17 -48
  237. package/dist/esm/util/bytes.js +67 -45
  238. package/dist/esm/util/coercion.js +6 -14
  239. package/dist/esm/util/index.js +5 -0
  240. package/dist/esm/util/primitives.js +40 -14
  241. package/dist/index.js +7 -1
  242. package/dist/infra/log/ConsoleLogger.js +18 -17
  243. package/dist/infra/log/PinoLogger.js +15 -9
  244. package/dist/infra/log/types.js +12 -0
  245. package/dist/infra/perf/BackgroundQueue.js +482 -0
  246. package/dist/infra/perf/BoundedTaskQueue.js +16 -18
  247. package/dist/infra/perf/PromiseDedup.js +24 -0
  248. package/dist/infra/perf/SharedExclusiveGate.js +113 -0
  249. package/dist/infra/perf/StoreLock.js +81 -0
  250. package/dist/media/WaMediaCrypto.js +95 -15
  251. package/dist/media/WaMediaTransferClient.js +284 -91
  252. package/dist/media/conn.js +10 -6
  253. package/dist/media/constants.js +6 -2
  254. package/dist/message/WaMessageClient.js +31 -33
  255. package/dist/message/ack.js +6 -6
  256. package/dist/message/addon-crypto.js +65 -0
  257. package/dist/message/content.js +198 -9
  258. package/dist/message/icdc.js +81 -0
  259. package/dist/message/incoming.js +127 -120
  260. package/dist/message/index.js +2 -0
  261. package/dist/message/phash.js +3 -1
  262. package/dist/message/reporting-token.js +429 -0
  263. package/dist/message/use-case-secret.js +55 -0
  264. package/dist/protocol/appstate.js +28 -1
  265. package/dist/protocol/browser.js +10 -18
  266. package/dist/protocol/constants.js +26 -1
  267. package/dist/protocol/defaults.js +6 -0
  268. package/dist/protocol/index.js +23 -42
  269. package/dist/protocol/jid.js +140 -52
  270. package/dist/protocol/media.js +3 -3
  271. package/dist/protocol/message.js +62 -2
  272. package/dist/protocol/nodes.js +4 -0
  273. package/dist/protocol/notification.js +3 -1
  274. package/dist/protocol/privacy-token.js +20 -0
  275. package/dist/protocol/privacy.js +58 -0
  276. package/dist/protocol/stream.js +27 -2
  277. package/dist/protocol/usync.js +14 -0
  278. package/dist/retry/codec.js +220 -0
  279. package/dist/retry/constants.js +1 -1
  280. package/dist/retry/index.js +7 -5
  281. package/dist/retry/parse.js +88 -85
  282. package/dist/retry/replay.js +52 -49
  283. package/dist/retry/tracker.js +97 -0
  284. package/dist/signal/api/SignalDeviceSyncApi.js +273 -89
  285. package/dist/signal/api/SignalDigestSyncApi.js +17 -8
  286. package/dist/signal/api/SignalIdentitySyncApi.js +66 -36
  287. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +82 -63
  288. package/dist/signal/api/SignalRotateKeyApi.js +4 -2
  289. package/dist/signal/api/SignalSessionSyncApi.js +36 -34
  290. package/dist/signal/api/result-map.js +13 -0
  291. package/dist/signal/constants.js +1 -5
  292. package/dist/signal/crypto/WaAdvSignature.js +11 -7
  293. package/dist/signal/{store/sqlite.js → encoding.js} +94 -61
  294. package/dist/signal/group/SenderKeyChain.js +27 -22
  295. package/dist/signal/group/SenderKeyCodec.js +5 -6
  296. package/dist/signal/group/SenderKeyManager.js +144 -115
  297. package/dist/signal/index.js +15 -1
  298. package/dist/signal/registration/keygen.js +6 -2
  299. package/dist/signal/registration/utils.js +1 -0
  300. package/dist/signal/session/SignalProtocol.js +164 -53
  301. package/dist/signal/session/SignalRatchet.js +24 -15
  302. package/dist/signal/session/SignalSession.js +14 -9
  303. package/dist/signal/session/resolver.js +224 -0
  304. package/dist/store/contracts/privacy-token.store.js +2 -0
  305. package/dist/store/createStore.js +100 -188
  306. package/dist/store/index.js +15 -33
  307. package/dist/store/locks/appstate.lock.js +29 -0
  308. package/dist/store/locks/auth.lock.js +18 -0
  309. package/dist/store/locks/contact.lock.js +23 -0
  310. package/dist/store/locks/device-list.lock.js +23 -0
  311. package/dist/store/locks/message.lock.js +24 -0
  312. package/dist/store/locks/participants.lock.js +23 -0
  313. package/dist/store/locks/privacy-token.lock.js +21 -0
  314. package/dist/store/locks/retry.lock.js +32 -0
  315. package/dist/store/locks/sender-key.lock.js +55 -0
  316. package/dist/store/locks/signal.lock.js +66 -0
  317. package/dist/store/locks/thread.lock.js +24 -0
  318. package/dist/store/noop.store.js +4 -7
  319. package/dist/store/providers/memory/appstate.store.js +36 -14
  320. package/dist/store/providers/memory/contact.store.js +5 -0
  321. package/dist/store/providers/memory/device-list.store.js +12 -34
  322. package/dist/store/providers/memory/message.store.js +11 -5
  323. package/dist/store/providers/memory/participants.store.js +1 -8
  324. package/dist/store/providers/memory/privacy-token.store.js +47 -0
  325. package/dist/store/providers/memory/retry.store.js +77 -2
  326. package/dist/store/providers/memory/sender-key.store.js +14 -11
  327. package/dist/store/providers/memory/signal.store.js +54 -25
  328. package/dist/store/providers/memory/thread.store.js +5 -0
  329. package/dist/transport/WaComms.js +30 -26
  330. package/dist/transport/WaWebSocket.js +148 -18
  331. package/dist/transport/binary/constants.js +1 -31
  332. package/dist/transport/binary/decoder.js +8 -8
  333. package/dist/transport/binary/encoder.js +10 -9
  334. package/dist/transport/binary/index.js +0 -4
  335. package/dist/transport/index.js +7 -1
  336. package/dist/transport/keepalive/WaKeepAlive.js +1 -7
  337. package/dist/transport/node/WaNodeOrchestrator.js +25 -21
  338. package/dist/transport/node/WaNodeTransport.js +0 -3
  339. package/dist/transport/node/builders/{accountSync.js → account-sync.js} +15 -35
  340. package/dist/transport/node/builders/business.js +137 -0
  341. package/dist/transport/node/builders/global.js +375 -0
  342. package/dist/transport/node/builders/index.js +29 -17
  343. package/dist/transport/node/builders/message.js +64 -236
  344. package/dist/transport/node/builders/pairing.js +2 -29
  345. package/dist/transport/node/builders/privacy-token.js +46 -0
  346. package/dist/transport/node/builders/privacy.js +55 -0
  347. package/dist/transport/node/builders/profile.js +78 -0
  348. package/dist/transport/node/builders/retry.js +9 -21
  349. package/dist/transport/node/builders/usync.js +49 -0
  350. package/dist/transport/node/helpers.js +131 -4
  351. package/dist/transport/node/usync.js +8 -0
  352. package/dist/transport/node/xml.js +35 -14
  353. package/dist/transport/noise/WaClientPayload.js +13 -13
  354. package/dist/transport/noise/WaFrameCodec.js +47 -32
  355. package/dist/transport/noise/WaNoiseCert.js +5 -8
  356. package/dist/transport/noise/WaNoiseSession.js +77 -29
  357. package/dist/transport/noise/WaNoiseSocket.js +8 -4
  358. package/dist/transport/proxy.js +34 -0
  359. package/dist/transport/stream/parse.js +20 -52
  360. package/dist/types/appstate/WaAppStateCrypto.d.ts +0 -1
  361. package/dist/types/appstate/WaAppStateSyncClient.d.ts +5 -2
  362. package/dist/types/appstate/constants.d.ts +1 -0
  363. package/dist/types/appstate/encoding.d.ts +7 -0
  364. package/dist/types/appstate/index.d.ts +3 -3
  365. package/dist/types/appstate/utils.d.ts +0 -3
  366. package/dist/types/auth/WaAuthClient.d.ts +10 -12
  367. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +1 -1
  368. package/dist/types/auth/index.d.ts +0 -4
  369. package/dist/types/auth/pairing/WaQrFlow.d.ts +1 -1
  370. package/dist/types/auth/types.d.ts +7 -9
  371. package/dist/types/client/WaClient.d.ts +42 -25
  372. package/dist/types/client/WaClientFactory.d.ts +33 -26
  373. package/dist/types/client/connection/WaConnectionManager.d.ts +66 -0
  374. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +14 -0
  375. package/dist/types/client/connection/WaReceiptQueue.d.ts +13 -0
  376. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +46 -0
  377. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
  378. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +3 -2
  379. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +29 -38
  380. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -0
  381. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
  382. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +36 -0
  383. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +8 -0
  384. package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
  385. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +45 -0
  386. package/dist/types/client/dirty.d.ts +1 -0
  387. package/dist/types/client/events/devices.d.ts +20 -0
  388. package/dist/types/client/events/group.d.ts +2 -1
  389. package/dist/types/client/events/identity.d.ts +9 -0
  390. package/dist/types/client/events/privacy-token.d.ts +7 -0
  391. package/dist/types/client/history-sync.d.ts +9 -6
  392. package/dist/types/client/incoming.d.ts +3 -1
  393. package/dist/types/client/index.d.ts +1 -1
  394. package/dist/types/client/mailbox.d.ts +3 -5
  395. package/dist/types/client/messages.d.ts +1 -2
  396. package/dist/types/client/messaging/fanout.d.ts +14 -0
  397. package/dist/types/client/messaging/key-protocol.d.ts +18 -0
  398. package/dist/types/client/messaging/participants.d.ts +13 -0
  399. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
  400. package/dist/types/client/tokens/cs-token.d.ts +10 -0
  401. package/dist/types/client/tokens/tc-token.d.ts +5 -0
  402. package/dist/types/client/types.d.ts +75 -4
  403. package/dist/types/crypto/core/hkdf.d.ts +0 -6
  404. package/dist/types/crypto/core/index.d.ts +2 -3
  405. package/dist/types/crypto/core/nonce.d.ts +2 -0
  406. package/dist/types/crypto/core/primitives.d.ts +0 -1
  407. package/dist/types/crypto/core/random.d.ts +2 -7
  408. package/dist/types/crypto/index.d.ts +0 -1
  409. package/dist/types/crypto/math/constants.d.ts +4 -2
  410. package/dist/types/crypto/math/fe.d.ts +30 -0
  411. package/dist/types/crypto/math/mod.d.ts +0 -2
  412. package/dist/types/crypto/math/types.d.ts +11 -4
  413. package/dist/types/index.d.ts +5 -3
  414. package/dist/types/infra/log/ConsoleLogger.d.ts +2 -1
  415. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  416. package/dist/types/infra/log/types.d.ts +1 -0
  417. package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
  418. package/dist/types/infra/perf/BoundedTaskQueue.d.ts +1 -1
  419. package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
  420. package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
  421. package/dist/types/infra/perf/StoreLock.d.ts +10 -0
  422. package/dist/types/media/WaMediaCrypto.d.ts +3 -2
  423. package/dist/types/media/WaMediaTransferClient.d.ts +16 -15
  424. package/dist/types/media/constants.d.ts +1 -1
  425. package/dist/types/media/index.d.ts +1 -1
  426. package/dist/types/media/types.d.ts +15 -2
  427. package/dist/types/message/addon-crypto.d.ts +25 -0
  428. package/dist/types/message/content.d.ts +8 -0
  429. package/dist/types/message/icdc.d.ts +13 -0
  430. package/dist/types/message/index.d.ts +2 -0
  431. package/dist/types/message/reporting-token.d.ts +18 -0
  432. package/dist/types/message/types.d.ts +45 -6
  433. package/dist/types/message/use-case-secret.d.ts +20 -0
  434. package/dist/types/protocol/appstate.d.ts +47 -0
  435. package/dist/types/protocol/constants.d.ts +8 -3
  436. package/dist/types/protocol/defaults.d.ts +6 -0
  437. package/dist/types/protocol/index.d.ts +2 -11
  438. package/dist/types/protocol/jid.d.ts +22 -5
  439. package/dist/types/protocol/message.d.ts +60 -0
  440. package/dist/types/protocol/nodes.d.ts +4 -0
  441. package/dist/types/protocol/notification.d.ts +2 -0
  442. package/dist/types/protocol/privacy-token.d.ts +17 -0
  443. package/dist/types/protocol/privacy.d.ts +75 -0
  444. package/dist/types/protocol/stream.d.ts +30 -0
  445. package/dist/types/protocol/usync.d.ts +11 -0
  446. package/dist/types/retry/codec.d.ts +3 -0
  447. package/dist/types/retry/index.d.ts +4 -3
  448. package/dist/types/retry/parse.d.ts +5 -2
  449. package/dist/types/retry/replay.d.ts +0 -4
  450. package/dist/types/retry/tracker.d.ts +20 -0
  451. package/dist/types/retry/types.d.ts +10 -4
  452. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +15 -2
  453. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +6 -0
  454. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +2 -0
  455. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
  456. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
  457. package/dist/types/signal/api/result-map.d.ts +1 -0
  458. package/dist/types/signal/constants.d.ts +0 -3
  459. package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +3 -3
  460. package/dist/types/signal/group/SenderKeyCodec.d.ts +4 -6
  461. package/dist/types/signal/group/SenderKeyManager.d.ts +10 -5
  462. package/dist/types/signal/index.d.ts +3 -0
  463. package/dist/types/signal/session/SignalProtocol.d.ts +19 -4
  464. package/dist/types/signal/session/resolver.d.ts +22 -0
  465. package/dist/types/store/contracts/appstate.store.d.ts +4 -1
  466. package/dist/types/store/contracts/contact.store.d.ts +1 -0
  467. package/dist/types/store/contracts/device-list.store.d.ts +0 -3
  468. package/dist/types/store/contracts/message.store.d.ts +1 -0
  469. package/dist/types/store/contracts/participants.store.d.ts +0 -1
  470. package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
  471. package/dist/types/store/contracts/retry.store.d.ts +7 -0
  472. package/dist/types/store/contracts/sender-key.store.d.ts +0 -1
  473. package/dist/types/store/contracts/signal.store.d.ts +13 -0
  474. package/dist/types/store/contracts/thread.store.d.ts +1 -0
  475. package/dist/types/store/createStore.d.ts +1 -1
  476. package/dist/types/store/index.d.ts +5 -13
  477. package/dist/types/store/locks/appstate.lock.d.ts +3 -0
  478. package/dist/types/store/locks/auth.lock.d.ts +3 -0
  479. package/dist/types/store/locks/contact.lock.d.ts +3 -0
  480. package/dist/types/store/locks/device-list.lock.d.ts +2 -0
  481. package/dist/types/store/locks/message.lock.d.ts +3 -0
  482. package/dist/types/store/locks/participants.lock.d.ts +2 -0
  483. package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
  484. package/dist/types/store/locks/retry.lock.d.ts +2 -0
  485. package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
  486. package/dist/types/store/locks/signal.lock.d.ts +3 -0
  487. package/dist/types/store/locks/thread.lock.d.ts +3 -0
  488. package/dist/types/store/providers/memory/appstate.store.d.ts +3 -1
  489. package/dist/types/store/providers/memory/contact.store.d.ts +1 -0
  490. package/dist/types/store/providers/memory/device-list.store.d.ts +0 -3
  491. package/dist/types/store/providers/memory/message.store.d.ts +1 -0
  492. package/dist/types/store/providers/memory/participants.store.d.ts +0 -1
  493. package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
  494. package/dist/types/store/providers/memory/retry.store.d.ts +8 -0
  495. package/dist/types/store/providers/memory/sender-key.store.d.ts +0 -1
  496. package/dist/types/store/providers/memory/signal.store.d.ts +8 -1
  497. package/dist/types/store/providers/memory/thread.store.d.ts +1 -0
  498. package/dist/types/store/types.d.ts +49 -58
  499. package/dist/types/transport/WaWebSocket.d.ts +3 -1
  500. package/dist/types/transport/binary/constants.d.ts +0 -30
  501. package/dist/types/transport/binary/index.d.ts +0 -1
  502. package/dist/types/transport/index.d.ts +2 -1
  503. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +0 -1
  504. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +3 -4
  505. package/dist/types/transport/node/WaNodeTransport.d.ts +0 -9
  506. package/dist/types/transport/node/builders/business.d.ts +29 -0
  507. package/dist/types/transport/node/builders/global.d.ts +102 -0
  508. package/dist/types/transport/node/builders/group.d.ts +4 -6
  509. package/dist/types/transport/node/builders/index.d.ts +7 -3
  510. package/dist/types/transport/node/builders/message.d.ts +20 -30
  511. package/dist/types/transport/node/builders/pairing.d.ts +0 -2
  512. package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
  513. package/dist/types/transport/node/builders/privacy.d.ts +7 -0
  514. package/dist/types/transport/node/builders/profile.d.ts +8 -0
  515. package/dist/types/transport/node/builders/retry.d.ts +2 -5
  516. package/dist/types/transport/node/builders/usync.d.ts +21 -0
  517. package/dist/types/transport/node/helpers.d.ts +13 -0
  518. package/dist/types/transport/node/usync.d.ts +2 -0
  519. package/dist/types/transport/noise/WaFrameCodec.d.ts +3 -0
  520. package/dist/types/transport/noise/WaNoiseSession.d.ts +4 -2
  521. package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
  522. package/dist/types/transport/proxy.d.ts +6 -0
  523. package/dist/types/transport/stream/parse.d.ts +0 -1
  524. package/dist/types/transport/types.d.ts +18 -1
  525. package/dist/types/util/bytes.d.ts +5 -0
  526. package/dist/types/util/index.d.ts +5 -0
  527. package/dist/types/util/primitives.d.ts +2 -0
  528. package/dist/util/bytes.js +72 -46
  529. package/dist/util/coercion.js +6 -14
  530. package/dist/util/index.js +23 -0
  531. package/dist/util/primitives.js +42 -14
  532. package/package.json +52 -9
  533. package/proto/index.js +1 -1
  534. package/dist/crypto/core/constants.js +0 -4
  535. package/dist/crypto/core/encoding.js +0 -29
  536. package/dist/esm/crypto/core/constants.js +0 -1
  537. package/dist/esm/crypto/core/encoding.js +0 -25
  538. package/dist/esm/retry/outbound.js +0 -83
  539. package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
  540. package/dist/esm/store/providers/sqlite/appstate.store.js +0 -169
  541. package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
  542. package/dist/esm/store/providers/sqlite/connection.js +0 -240
  543. package/dist/esm/store/providers/sqlite/contact.store.js +0 -61
  544. package/dist/esm/store/providers/sqlite/device-list.store.js +0 -155
  545. package/dist/esm/store/providers/sqlite/message.store.js +0 -119
  546. package/dist/esm/store/providers/sqlite/migrations.js +0 -347
  547. package/dist/esm/store/providers/sqlite/participants.store.js +0 -85
  548. package/dist/esm/store/providers/sqlite/retry.store.js +0 -144
  549. package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -203
  550. package/dist/esm/store/providers/sqlite/signal.store.js +0 -353
  551. package/dist/esm/store/providers/sqlite/thread.store.js +0 -72
  552. package/dist/esm/util/base64.js +0 -18
  553. package/dist/esm/util/signal-address.js +0 -5
  554. package/dist/retry/outbound.js +0 -88
  555. package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
  556. package/dist/store/providers/sqlite/appstate.store.js +0 -173
  557. package/dist/store/providers/sqlite/auth.store.js +0 -180
  558. package/dist/store/providers/sqlite/connection.js +0 -276
  559. package/dist/store/providers/sqlite/contact.store.js +0 -65
  560. package/dist/store/providers/sqlite/device-list.store.js +0 -159
  561. package/dist/store/providers/sqlite/message.store.js +0 -123
  562. package/dist/store/providers/sqlite/migrations.js +0 -350
  563. package/dist/store/providers/sqlite/participants.store.js +0 -89
  564. package/dist/store/providers/sqlite/retry.store.js +0 -148
  565. package/dist/store/providers/sqlite/sender-key.store.js +0 -207
  566. package/dist/store/providers/sqlite/signal.store.js +0 -357
  567. package/dist/store/providers/sqlite/thread.store.js +0 -76
  568. package/dist/types/appstate/store/sqlite.d.ts +0 -21
  569. package/dist/types/crypto/core/constants.d.ts +0 -1
  570. package/dist/types/crypto/core/encoding.d.ts +0 -11
  571. package/dist/types/retry/outbound.d.ts +0 -4
  572. package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
  573. package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -15
  574. package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
  575. package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
  576. package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -10
  577. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -18
  578. package/dist/types/store/providers/sqlite/message.store.d.ts +0 -11
  579. package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
  580. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -13
  581. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -16
  582. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -25
  583. package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -46
  584. package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -11
  585. package/dist/types/util/base64.d.ts +0 -4
  586. package/dist/types/util/signal-address.d.ts +0 -2
  587. package/dist/util/base64.js +0 -24
  588. package/dist/util/signal-address.js +0 -8
  589. /package/dist/types/transport/node/builders/{accountSync.d.ts → account-sync.d.ts} +0 -0
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SenderKeyMemoryStore = void 0;
4
+ const jid_1 = require("../../../protocol/jid");
4
5
  const coercion_1 = require("../../../util/coercion");
5
6
  const collections_1 = require("../../../util/collections");
6
- const signal_address_1 = require("../../../util/signal-address");
7
7
  const DEFAULT_SENDER_KEY_STORE_LIMITS = Object.freeze({
8
8
  senderKeys: 8192,
9
9
  senderDistributions: 8192
@@ -48,12 +48,13 @@ class SenderKeyMemoryStore {
48
48
  const record = this.senderKeys.get(this.makeKey(groupId, sender));
49
49
  return record ?? null;
50
50
  }
51
- async getDeviceSenderKeyDistribution(groupId, sender) {
52
- const record = this.senderDistributions.get(this.makeKey(groupId, sender));
53
- return record ?? null;
54
- }
55
51
  async getDeviceSenderKeyDistributions(groupId, senders) {
56
- return senders.map((sender) => this.senderDistributions.get(this.makeKey(groupId, sender)) ?? null);
52
+ const records = new Array(senders.length);
53
+ for (let index = 0; index < senders.length; index += 1) {
54
+ records[index] =
55
+ this.senderDistributions.get(this.makeKey(groupId, senders[index])) ?? null;
56
+ }
57
+ return records;
57
58
  }
58
59
  async deleteDeviceSenderKey(target, groupId) {
59
60
  let deleted = 0;
@@ -63,8 +64,10 @@ class SenderKeyMemoryStore {
63
64
  }
64
65
  async markForgetSenderKey(groupId, participants) {
65
66
  let deleted = 0;
66
- for (const participant of participants) {
67
- deleted += await this.deleteDeviceSenderKey(participant, groupId);
67
+ for (let index = 0; index < participants.length; index += 1) {
68
+ const participant = participants[index];
69
+ deleted += this.deleteMatching(this.senderKeys, participant, groupId);
70
+ deleted += this.deleteMatching(this.senderDistributions, participant, groupId);
68
71
  }
69
72
  return deleted;
70
73
  }
@@ -74,10 +77,10 @@ class SenderKeyMemoryStore {
74
77
  }
75
78
  deleteMatching(map, target, groupId) {
76
79
  let deleted = 0;
77
- const targetAddressKey = (0, signal_address_1.signalAddressKey)(target);
80
+ const targetAddressKey = (0, jid_1.signalAddressKey)(target);
78
81
  for (const [key, record] of map.entries()) {
79
82
  const sameGroup = groupId ? record.groupId === groupId : true;
80
- const sameAddress = (0, signal_address_1.signalAddressKey)(record.sender) === targetAddressKey;
83
+ const sameAddress = (0, jid_1.signalAddressKey)(record.sender) === targetAddressKey;
81
84
  if (sameGroup && sameAddress) {
82
85
  map.delete(key);
83
86
  deleted += 1;
@@ -86,7 +89,7 @@ class SenderKeyMemoryStore {
86
89
  return deleted;
87
90
  }
88
91
  makeKey(groupId, sender) {
89
- return `${groupId}|${(0, signal_address_1.signalAddressKey)(sender)}`;
92
+ return `${groupId}|${(0, jid_1.signalAddressKey)(sender)}`;
90
93
  }
91
94
  }
92
95
  exports.SenderKeyMemoryStore = SenderKeyMemoryStore;
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.WaSignalMemoryStore = void 0;
4
+ const jid_1 = require("../../../protocol/jid");
4
5
  const coercion_1 = require("../../../util/coercion");
5
6
  const collections_1 = require("../../../util/collections");
6
- const signal_address_1 = require("../../../util/signal-address");
7
7
  const DEFAULT_SIGNAL_STORE_LIMITS = Object.freeze({
8
8
  preKeys: 4096,
9
9
  sessions: 8192,
@@ -61,12 +61,15 @@ class WaSignalMemoryStore {
61
61
  throw new Error(`invalid prekey count: ${count}`);
62
62
  }
63
63
  const available = [];
64
- const sortedIds = [...this.preKeys.keys()].sort((left, right) => left - right);
65
- for (let index = 0; index < sortedIds.length; index += 1) {
66
- const keyId = sortedIds[index];
67
- if (this.uploadedPreKeys.has(keyId)) {
68
- continue;
64
+ const availableKeyIds = [];
65
+ for (const keyId of this.preKeys.keys()) {
66
+ if (!this.uploadedPreKeys.has(keyId)) {
67
+ availableKeyIds.push(keyId);
69
68
  }
69
+ }
70
+ availableKeyIds.sort((left, right) => left - right);
71
+ for (let index = 0; index < availableKeyIds.length; index += 1) {
72
+ const keyId = availableKeyIds[index];
70
73
  const record = this.preKeys.get(keyId);
71
74
  if (!record) {
72
75
  continue;
@@ -89,7 +92,11 @@ class WaSignalMemoryStore {
89
92
  return this.preKeys.get(keyId) ?? null;
90
93
  }
91
94
  async getPreKeysById(keyIds) {
92
- return keyIds.map((keyId) => this.preKeys.get(keyId) ?? null);
95
+ const result = new Array(keyIds.length);
96
+ for (let i = 0; i < keyIds.length; i += 1) {
97
+ result[i] = this.preKeys.get(keyIds[i]) ?? null;
98
+ }
99
+ return result;
93
100
  }
94
101
  async consumePreKeyById(keyId) {
95
102
  const record = this.preKeys.get(keyId) ?? null;
@@ -120,30 +127,62 @@ class WaSignalMemoryStore {
120
127
  async getServerHasPreKeys() {
121
128
  return this.serverHasPreKeys;
122
129
  }
130
+ async getSignalMeta() {
131
+ return {
132
+ serverHasPreKeys: this.serverHasPreKeys,
133
+ signedPreKeyRotationTs: this.signedPreKeyRotationTs,
134
+ registrationInfo: this.registrationInfo,
135
+ signedPreKey: this.signedPreKey
136
+ };
137
+ }
123
138
  async hasSession(address) {
124
- return this.signalSessions.has((0, signal_address_1.signalAddressKey)(address));
139
+ return this.signalSessions.has((0, jid_1.signalAddressKey)(address));
125
140
  }
126
141
  async hasSessions(addresses) {
127
- return addresses.map((address) => this.signalSessions.has((0, signal_address_1.signalAddressKey)(address)));
142
+ const result = new Array(addresses.length);
143
+ for (let i = 0; i < addresses.length; i += 1) {
144
+ result[i] = this.signalSessions.has((0, jid_1.signalAddressKey)(addresses[i]));
145
+ }
146
+ return result;
128
147
  }
129
148
  async getSession(address) {
130
- return this.signalSessions.get((0, signal_address_1.signalAddressKey)(address)) ?? null;
149
+ return this.signalSessions.get((0, jid_1.signalAddressKey)(address)) ?? null;
150
+ }
151
+ async getSessionsBatch(addresses) {
152
+ const result = new Array(addresses.length);
153
+ for (let i = 0; i < addresses.length; i += 1) {
154
+ result[i] = this.signalSessions.get((0, jid_1.signalAddressKey)(addresses[i])) ?? null;
155
+ }
156
+ return result;
131
157
  }
132
158
  async setSession(address, session) {
133
- (0, collections_1.setBoundedMapEntry)(this.signalSessions, (0, signal_address_1.signalAddressKey)(address), session, this.maxSessions);
159
+ (0, collections_1.setBoundedMapEntry)(this.signalSessions, (0, jid_1.signalAddressKey)(address), session, this.maxSessions);
160
+ }
161
+ async setSessionsBatch(entries) {
162
+ for (let index = 0; index < entries.length; index += 1) {
163
+ const entry = entries[index];
164
+ (0, collections_1.setBoundedMapEntry)(this.signalSessions, (0, jid_1.signalAddressKey)(entry.address), entry.session, this.maxSessions);
165
+ }
134
166
  }
135
167
  async deleteSession(address) {
136
- this.signalSessions.delete((0, signal_address_1.signalAddressKey)(address));
168
+ this.signalSessions.delete((0, jid_1.signalAddressKey)(address));
137
169
  }
138
170
  async getRemoteIdentity(address) {
139
- return this.remoteIdentities.get((0, signal_address_1.signalAddressKey)(address)) ?? null;
171
+ return this.remoteIdentities.get((0, jid_1.signalAddressKey)(address)) ?? null;
172
+ }
173
+ async getRemoteIdentities(addresses) {
174
+ const result = new Array(addresses.length);
175
+ for (let i = 0; i < addresses.length; i += 1) {
176
+ result[i] = this.remoteIdentities.get((0, jid_1.signalAddressKey)(addresses[i])) ?? null;
177
+ }
178
+ return result;
140
179
  }
141
180
  async setRemoteIdentity(address, identityKey) {
142
- (0, collections_1.setBoundedMapEntry)(this.remoteIdentities, (0, signal_address_1.signalAddressKey)(address), identityKey, this.maxRemoteIdentities);
181
+ (0, collections_1.setBoundedMapEntry)(this.remoteIdentities, (0, jid_1.signalAddressKey)(address), identityKey, this.maxRemoteIdentities);
143
182
  }
144
183
  async setRemoteIdentities(entries) {
145
184
  for (const entry of entries) {
146
- (0, collections_1.setBoundedMapEntry)(this.remoteIdentities, (0, signal_address_1.signalAddressKey)(entry.address), entry.identityKey, this.maxRemoteIdentities);
185
+ (0, collections_1.setBoundedMapEntry)(this.remoteIdentities, (0, jid_1.signalAddressKey)(entry.address), entry.identityKey, this.maxRemoteIdentities);
147
186
  }
148
187
  }
149
188
  async clear() {
@@ -158,17 +197,7 @@ class WaSignalMemoryStore {
158
197
  this.nextPreKeyId = 1;
159
198
  }
160
199
  addUploadedPreKey(keyId) {
161
- if (this.uploadedPreKeys.has(keyId)) {
162
- this.uploadedPreKeys.delete(keyId);
163
- }
164
200
  this.uploadedPreKeys.add(keyId);
165
- while (this.uploadedPreKeys.size > this.maxPreKeys) {
166
- const oldest = this.uploadedPreKeys.values().next().value;
167
- if (oldest === undefined) {
168
- break;
169
- }
170
- this.uploadedPreKeys.delete(oldest);
171
- }
172
201
  }
173
202
  }
174
203
  exports.WaSignalMemoryStore = WaSignalMemoryStore;
@@ -14,6 +14,11 @@ class WaThreadMemoryStore {
14
14
  async upsert(record) {
15
15
  (0, collections_1.setBoundedMapEntry)(this.threads, record.jid, record, this.maxThreads);
16
16
  }
17
+ async upsertBatch(records) {
18
+ for (const record of records) {
19
+ (0, collections_1.setBoundedMapEntry)(this.threads, record.jid, record, this.maxThreads);
20
+ }
21
+ }
17
22
  async getByJid(jid) {
18
23
  return this.threads.get(jid) ?? null;
19
24
  }
@@ -6,8 +6,8 @@ const BoundedTaskQueue_1 = require("../infra/perf/BoundedTaskQueue");
6
6
  const constants_1 = require("../protocol/constants");
7
7
  const WaNoiseSession_1 = require("./noise/WaNoiseSession");
8
8
  const WaWebSocket_1 = require("./WaWebSocket");
9
- const base64_1 = require("../util/base64");
10
9
  const bytes_1 = require("../util/bytes");
10
+ const bytes_2 = require("../util/bytes");
11
11
  const primitives_1 = require("../util/primitives");
12
12
  const WA_FRAME_HANDLER_QUEUE_MAX_SIZE = 4096;
13
13
  const WA_FRAME_HANDLER_MAX_CONCURRENCY = 8;
@@ -30,6 +30,8 @@ class WaComms {
30
30
  url: this.config.url,
31
31
  urls: this.config.urls,
32
32
  protocols: this.config.protocols,
33
+ dispatcher: this.config.dispatcher,
34
+ agent: this.config.agent,
33
35
  timeoutIntervalMs: this.config.timeoutIntervalMs
34
36
  }, logger);
35
37
  this.socket.setHandlers({
@@ -80,7 +82,7 @@ class WaComms {
80
82
  if (!routingInfo || routingInfo.byteLength === 0) {
81
83
  return config;
82
84
  }
83
- const edValue = (0, base64_1.bytesToBase64UrlSafe)(routingInfo);
85
+ const edValue = (0, bytes_1.bytesToBase64UrlSafe)(routingInfo);
84
86
  const appendEd = (url) => {
85
87
  try {
86
88
  const parsed = new URL(url);
@@ -147,9 +149,7 @@ class WaComms {
147
149
  startHandlingRequests() {
148
150
  this.handlingRequests = true;
149
151
  this.logger.debug('comms request handling enabled');
150
- this.frameProcessingQueue = this.frameProcessingQueue
151
- .catch(() => undefined)
152
- .then(async () => this.flushPendingFrames());
152
+ this.frameProcessingQueue = this.frameProcessingQueue.then(() => this.flushPendingFrames(), () => this.flushPendingFrames());
153
153
  }
154
154
  async stopComms() {
155
155
  this.logger.info('comms stop requested');
@@ -275,9 +275,7 @@ class WaComms {
275
275
  });
276
276
  }
277
277
  onSocketMessage(payload) {
278
- this.frameProcessingQueue = this.frameProcessingQueue
279
- .catch(() => undefined)
280
- .then(async () => this.processSocketPayload(payload));
278
+ this.frameProcessingQueue = this.frameProcessingQueue.then(() => this.processSocketPayload(payload), () => this.processSocketPayload(payload));
281
279
  }
282
280
  async processSocketPayload(payload) {
283
281
  if (!this.noiseSession) {
@@ -342,7 +340,7 @@ class WaComms {
342
340
  this.noiseSession = null;
343
341
  throw error;
344
342
  }
345
- const buffered = await session.pushWireChunk(bytes_1.EMPTY_BYTES);
343
+ const buffered = await session.pushWireChunk(bytes_2.EMPTY_BYTES);
346
344
  this.routeDecodedFrames(buffered);
347
345
  this.resumeHandshakeFailures = 0;
348
346
  this.lastServerStaticKey = session.getServerStaticKey();
@@ -404,7 +402,9 @@ class WaComms {
404
402
  this.schedulePendingFramesOverflowClose();
405
403
  return false;
406
404
  }
407
- this.pendingFrames.push(...frames);
405
+ for (let i = 0; i < frames.length; i += 1) {
406
+ this.pendingFrames.push(frames[i]);
407
+ }
408
408
  this.pendingFramesByteLength = nextBytes;
409
409
  return true;
410
410
  }
@@ -426,20 +426,19 @@ class WaComms {
426
426
  }
427
427
  scheduleDecodedFrame(frame) {
428
428
  void this.frameHandlerQueue
429
- .enqueue(async () => this.onDecodedFrame(frame))
429
+ .enqueue(() => this.onDecodedFrame(frame))
430
430
  .catch((error) => {
431
- const normalized = (0, primitives_1.toError)(error);
432
- this.logger.error('failed to enqueue decoded frame handler', {
433
- message: normalized.message
434
- });
435
- if (!(error instanceof BoundedTaskQueue_1.BoundedTaskQueueFullError)) {
431
+ if (error instanceof BoundedTaskQueue_1.BoundedTaskQueueFullError) {
432
+ this.logger.warn('frame handler queue is full, resuming socket to preserve bounds', {
433
+ pending: this.frameHandlerQueue.pending(),
434
+ inFlight: this.frameHandlerQueue.inFlight()
435
+ });
436
+ void this.closeSocketAndResume();
436
437
  return;
437
438
  }
438
- this.logger.warn('frame handler queue is full, processing frame inline', {
439
- pending: this.frameHandlerQueue.pending(),
440
- inFlight: this.frameHandlerQueue.inFlight()
439
+ this.logger.error('failed to enqueue decoded frame handler', {
440
+ message: (0, primitives_1.toError)(error).message
441
441
  });
442
- void this.onDecodedFrame(frame);
443
442
  });
444
443
  }
445
444
  scheduleReconnect() {
@@ -463,12 +462,16 @@ class WaComms {
463
462
  this.reconnectTimer = null;
464
463
  }
465
464
  removeWaiter(reject) {
466
- const index = this.waiters.findIndex((entry) => entry.reject === reject);
467
- if (index === -1) {
465
+ for (let index = 0; index < this.waiters.length; index += 1) {
466
+ const waiter = this.waiters[index];
467
+ if (waiter.reject !== reject) {
468
+ continue;
469
+ }
470
+ clearTimeout(waiter.timer);
471
+ this.waiters[index] = this.waiters[this.waiters.length - 1];
472
+ this.waiters.pop();
468
473
  return;
469
474
  }
470
- const [waiter] = this.waiters.splice(index, 1);
471
- clearTimeout(waiter.timer);
472
475
  }
473
476
  withStickyRoutingCookie(headers) {
474
477
  const out = headers ? { ...headers } : {};
@@ -521,11 +524,12 @@ class WaComms {
521
524
  }
522
525
  }
523
526
  drainWaiters(drain) {
524
- const waiters = this.waiters.splice(0, this.waiters.length);
525
- for (const waiter of waiters) {
527
+ for (let index = this.waiters.length - 1; index >= 0; index -= 1) {
528
+ const waiter = this.waiters[index];
526
529
  clearTimeout(waiter.timer);
527
530
  drain(waiter);
528
531
  }
532
+ this.waiters.length = 0;
529
533
  }
530
534
  }
531
535
  exports.WaComms = WaComms;
@@ -1,10 +1,82 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.WaWebSocket = void 0;
4
37
  const ConsoleLogger_1 = require("../infra/log/ConsoleLogger");
5
38
  const constants_1 = require("../protocol/constants");
6
39
  const bytes_1 = require("../util/bytes");
7
40
  const primitives_1 = require("../util/primitives");
41
+ const WS_OPTIONAL_MODULE = 'ws';
42
+ function asOptionalNodeWsConstructor(loaded) {
43
+ if (loaded && typeof loaded === 'object') {
44
+ const direct = loaded.WebSocket;
45
+ if (typeof direct === 'function') {
46
+ return direct;
47
+ }
48
+ const fallback = loaded.default;
49
+ if (typeof fallback === 'function') {
50
+ return fallback;
51
+ }
52
+ }
53
+ if (typeof loaded === 'function') {
54
+ return loaded;
55
+ }
56
+ return null;
57
+ }
58
+ async function loadOptionalNodeWsConstructor() {
59
+ try {
60
+ const loaded = await Promise.resolve(`${WS_OPTIONAL_MODULE}`).then(s => __importStar(require(s)));
61
+ const constructor = asOptionalNodeWsConstructor(loaded);
62
+ if (constructor) {
63
+ return constructor;
64
+ }
65
+ throw new Error('invalid ws module export');
66
+ }
67
+ catch (error) {
68
+ const normalized = (0, primitives_1.toError)(error);
69
+ const code = normalized.code;
70
+ const message = normalized.message ?? '';
71
+ const isModuleNotFound = (code === 'ERR_MODULE_NOT_FOUND' || code === 'MODULE_NOT_FOUND') &&
72
+ (message.includes(`'${WS_OPTIONAL_MODULE}'`) ||
73
+ message.includes(`"${WS_OPTIONAL_MODULE}"`));
74
+ if (isModuleNotFound) {
75
+ throw new Error('optional dependency "ws" is not installed. Install with: npm i ws');
76
+ }
77
+ throw normalized;
78
+ }
79
+ }
8
80
  function resolveWebSocketConstructor() {
9
81
  const ctor = globalThis
10
82
  .WebSocket;
@@ -16,12 +88,13 @@ function resolveWebSocketConstructor() {
16
88
  function resolveSocketUrls(config) {
17
89
  const preferredUrls = config.urls;
18
90
  if (preferredUrls && preferredUrls.length > 0) {
19
- return Object.freeze(Array.from(new Set(preferredUrls)));
91
+ const unique = [];
92
+ for (const url of preferredUrls)
93
+ if (unique.indexOf(url) === -1)
94
+ unique.push(url);
95
+ return Object.freeze(unique);
20
96
  }
21
- if (config.url) {
22
- return Object.freeze([config.url]);
23
- }
24
- return constants_1.WA_DEFAULTS.CHAT_SOCKET_URLS;
97
+ return config.url ? Object.freeze([config.url]) : constants_1.WA_DEFAULTS.CHAT_SOCKET_URLS;
25
98
  }
26
99
  function resolveSocketRuntime() {
27
100
  const maybeNodeProcess = globalThis.process;
@@ -44,6 +117,7 @@ class WaWebSocket {
44
117
  this.handlers = {};
45
118
  this.socket = null;
46
119
  this.closeWaiter = null;
120
+ this.nodeWsCtorPromise = null;
47
121
  }
48
122
  setHandlers(handlers) {
49
123
  this.handlers = handlers;
@@ -55,12 +129,6 @@ class WaWebSocket {
55
129
  return (this.socket?.readyState === constants_1.WA_READY_STATES.CONNECTING ||
56
130
  this.connectingSockets.size > 0);
57
131
  }
58
- getReadyState() {
59
- if (this.connectingSockets.size > 0) {
60
- return constants_1.WA_READY_STATES.CONNECTING;
61
- }
62
- return this.socket?.readyState ?? constants_1.WA_READY_STATES.CLOSED;
63
- }
64
132
  async open() {
65
133
  if (this.isOpen()) {
66
134
  this.logger.trace('socket open skipped: already open');
@@ -147,7 +215,7 @@ class WaWebSocket {
147
215
  socket.send(data);
148
216
  }
149
217
  async openSingle(url) {
150
- const pending = this.createPendingSocket(url);
218
+ const pending = await this.createPendingSocket(url);
151
219
  return new Promise((resolve, reject) => {
152
220
  this.bindPendingSocket(pending, {
153
221
  onOpen: () => {
@@ -169,7 +237,20 @@ class WaWebSocket {
169
237
  });
170
238
  }
171
239
  async openConcurrently(urls) {
172
- const pendingSockets = urls.map((url) => this.createPendingSocket(url));
240
+ const setupResults = await Promise.allSettled(urls.map((url) => this.createPendingSocket(url)));
241
+ const pendingSockets = [];
242
+ let setupError = null;
243
+ for (const result of setupResults) {
244
+ if (result.status === 'fulfilled') {
245
+ pendingSockets.push(result.value);
246
+ continue;
247
+ }
248
+ setupError = setupError ?? (0, primitives_1.toError)(result.reason);
249
+ }
250
+ if (setupError) {
251
+ this.releasePendingSocketsAfterSetupFailure(pendingSockets);
252
+ throw setupError;
253
+ }
173
254
  return new Promise((resolve, reject) => {
174
255
  let done = false;
175
256
  let failedCount = 0;
@@ -213,6 +294,14 @@ class WaWebSocket {
213
294
  }
214
295
  });
215
296
  }
297
+ releasePendingSocketsAfterSetupFailure(entries) {
298
+ for (const entry of entries) {
299
+ if (!this.settlePendingSocket(entry)) {
300
+ continue;
301
+ }
302
+ this.closeSocketSafe(entry.socket, 1000, 'connect_setup_failed');
303
+ }
304
+ }
216
305
  bindRuntimeHandlers(socket) {
217
306
  socket.onmessage = (event) => {
218
307
  void this.handleMessage(event.data);
@@ -260,8 +349,8 @@ class WaWebSocket {
260
349
  }
261
350
  return null;
262
351
  }
263
- createPendingSocket(url) {
264
- const socket = this.createRawSocket(url);
352
+ async createPendingSocket(url) {
353
+ const socket = await this.createRawSocket(url);
265
354
  socket.binaryType = 'arraybuffer';
266
355
  this.connectingSockets.add(socket);
267
356
  return {
@@ -354,12 +443,53 @@ class WaWebSocket {
354
443
  // no-op
355
444
  }
356
445
  }
357
- createRawSocket(url) {
446
+ async createRawSocket(url) {
358
447
  const headers = this.config.headers;
359
- if (this.socketRuntime === 'node' && headers && Object.keys(headers).length > 0) {
360
- return new this.webSocketCtor(url, this.config.protocols, { headers });
448
+ const dispatcher = this.config.dispatcher;
449
+ const agent = this.config.agent;
450
+ let hasHeaders = false;
451
+ if (headers) {
452
+ for (const key in headers) {
453
+ if (Object.prototype.hasOwnProperty.call(headers, key)) {
454
+ hasHeaders = true;
455
+ break;
456
+ }
457
+ }
458
+ }
459
+ if (this.socketRuntime === 'node' && agent) {
460
+ const nodeWsCtor = await this.resolveNodeWsConstructor();
461
+ return new nodeWsCtor(url, this.config.protocols, {
462
+ headers,
463
+ agent
464
+ });
465
+ }
466
+ if (this.socketRuntime === 'node' && (hasHeaders || dispatcher || agent)) {
467
+ const globalWebSocketCtor = globalThis.WebSocket;
468
+ if (globalWebSocketCtor && this.webSocketCtor === globalWebSocketCtor) {
469
+ const init = {
470
+ protocols: this.config.protocols,
471
+ headers,
472
+ dispatcher,
473
+ agent
474
+ };
475
+ return new this.webSocketCtor(url, init);
476
+ }
477
+ return new this.webSocketCtor(url, this.config.protocols, {
478
+ headers,
479
+ dispatcher,
480
+ agent
481
+ });
361
482
  }
362
483
  return new this.webSocketCtor(url, this.config.protocols);
363
484
  }
485
+ async resolveNodeWsConstructor() {
486
+ if (!this.nodeWsCtorPromise) {
487
+ this.nodeWsCtorPromise = loadOptionalNodeWsConstructor().catch((error) => {
488
+ this.nodeWsCtorPromise = null;
489
+ throw error;
490
+ });
491
+ }
492
+ return this.nodeWsCtorPromise;
493
+ }
364
494
  }
365
495
  exports.WaWebSocket = WaWebSocket;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WAP_DECODE_CONSTANTS = exports.WAP_ENCODE_CONSTANTS = exports.DICTIONARY_TOKEN_MAPS = exports.SINGLE_BYTE_TOKEN_MAP = exports.HEX_ALPHABET = exports.NIBBLE_ALPHABET = exports.NIBBLE_8 = exports.BINARY_32 = exports.BINARY_20 = exports.BINARY_8 = exports.HEX_8 = exports.JID_PAIR = exports.LIST_16 = exports.LIST_8 = exports.JID_U = exports.JID_FB = exports.JID_INTEROP = exports.DICTIONARY_3 = exports.DICTIONARY_0 = exports.STREAM_END = exports.LIST_EMPTY = void 0;
3
+ exports.DICTIONARY_TOKEN_MAPS = exports.SINGLE_BYTE_TOKEN_MAP = exports.HEX_ALPHABET = exports.NIBBLE_ALPHABET = exports.NIBBLE_8 = exports.BINARY_32 = exports.BINARY_20 = exports.BINARY_8 = exports.HEX_8 = exports.JID_PAIR = exports.LIST_16 = exports.LIST_8 = exports.JID_U = exports.JID_FB = exports.JID_INTEROP = exports.DICTIONARY_3 = exports.DICTIONARY_0 = exports.STREAM_END = exports.LIST_EMPTY = void 0;
4
4
  const tokens_1 = require("../binary/tokens");
5
5
  exports.LIST_EMPTY = 0;
6
6
  exports.STREAM_END = 2;
@@ -67,33 +67,3 @@ exports.DICTIONARY_TOKEN_MAPS = tokens_1.DICTIONARIES.map((dictionary) => {
67
67
  }
68
68
  return map;
69
69
  });
70
- exports.WAP_ENCODE_CONSTANTS = Object.freeze({
71
- LIST_EMPTY: exports.LIST_EMPTY,
72
- LIST_8: exports.LIST_8,
73
- LIST_16: exports.LIST_16,
74
- JID_PAIR: exports.JID_PAIR,
75
- HEX_8: exports.HEX_8,
76
- BINARY_8: exports.BINARY_8,
77
- BINARY_20: exports.BINARY_20,
78
- BINARY_32: exports.BINARY_32,
79
- NIBBLE_8: exports.NIBBLE_8,
80
- DICTIONARY_0: exports.DICTIONARY_0,
81
- DICTIONARY_3: exports.DICTIONARY_3
82
- });
83
- exports.WAP_DECODE_CONSTANTS = Object.freeze({
84
- LIST_EMPTY: exports.LIST_EMPTY,
85
- LIST_8: exports.LIST_8,
86
- LIST_16: exports.LIST_16,
87
- JID_PAIR: exports.JID_PAIR,
88
- JID_FB: exports.JID_FB,
89
- JID_INTEROP: exports.JID_INTEROP,
90
- JID_U: exports.JID_U,
91
- HEX_8: exports.HEX_8,
92
- BINARY_8: exports.BINARY_8,
93
- BINARY_20: exports.BINARY_20,
94
- BINARY_32: exports.BINARY_32,
95
- NIBBLE_8: exports.NIBBLE_8,
96
- DICTIONARY_0: exports.DICTIONARY_0,
97
- DICTIONARY_3: exports.DICTIONARY_3,
98
- STREAM_END: exports.STREAM_END
99
- });
@@ -63,22 +63,22 @@ function parsePacked(reader, alphabet) {
63
63
  const odd = (lengthByte & 0x80) !== 0;
64
64
  const byteCount = lengthByte & 0x7f;
65
65
  const outLength = byteCount * 2 - (odd ? 1 : 0);
66
- const chars = new Array(outLength);
66
+ const buf = new Uint8Array(outLength);
67
67
  let outIndex = 0;
68
68
  for (let i = 0; i < byteCount; i += 1) {
69
69
  const packed = reader.readUint8();
70
70
  const high = (packed >>> 4) & 0x0f;
71
71
  const low = packed & 0x0f;
72
72
  if (outIndex < outLength) {
73
- chars[outIndex] = alphabet[high];
73
+ buf[outIndex] = alphabet[high].charCodeAt(0);
74
74
  outIndex += 1;
75
75
  }
76
76
  if (outIndex < outLength) {
77
- chars[outIndex] = alphabet[low];
77
+ buf[outIndex] = alphabet[low].charCodeAt(0);
78
78
  outIndex += 1;
79
79
  }
80
80
  }
81
- return chars.join('');
81
+ return bytes_1.TEXT_DECODER.decode(buf);
82
82
  }
83
83
  function readBinary(reader, token) {
84
84
  if (token === constants_2.BINARY_8) {
@@ -242,10 +242,10 @@ function decodeNodeInternal(reader) {
242
242
  }
243
243
  }
244
244
  }
245
- if (content === null || content === undefined) {
246
- return { tag: tagValue, attrs };
247
- }
248
- return { tag: tagValue, attrs, content };
245
+ const node = content === null || content === undefined
246
+ ? { tag: tagValue, attrs }
247
+ : { tag: tagValue, attrs, content };
248
+ return node;
249
249
  }
250
250
  function decodeBinaryNode(data) {
251
251
  const reader = new ByteReader(data);