zapo-js 0.1.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.
- package/README.md +235 -0
- package/dist/appstate/WaAppStateCrypto.js +202 -0
- package/dist/appstate/WaAppStateSyncClient.js +808 -0
- package/dist/appstate/WaAppStateSyncResponseParser.js +71 -0
- package/dist/appstate/constants.js +23 -0
- package/dist/appstate/index.js +28 -0
- package/dist/appstate/store/sqlite.js +55 -0
- package/dist/appstate/types.js +2 -0
- package/dist/appstate/utils.js +84 -0
- package/dist/auth/WaAuthClient.js +266 -0
- package/dist/auth/flow/WaAuthCredentialsFlow.js +123 -0
- package/dist/auth/index.js +27 -0
- package/dist/auth/pairing/WaPairingCodeCrypto.js +75 -0
- package/dist/auth/pairing/WaPairingFlow.js +328 -0
- package/dist/auth/pairing/WaQrFlow.js +86 -0
- package/dist/auth/pairing/constants.js +5 -0
- package/dist/auth/types.js +2 -0
- package/dist/client/WaClient.js +749 -0
- package/dist/client/WaClientFactory.js +381 -0
- package/dist/client/coordinators/WaGroupCoordinator.js +191 -0
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +315 -0
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +1061 -0
- package/dist/client/coordinators/WaPassiveTasksCoordinator.js +200 -0
- package/dist/client/coordinators/WaRetryCoordinator.js +494 -0
- package/dist/client/coordinators/WaStreamControlCoordinator.js +123 -0
- package/dist/client/dirty.js +254 -0
- package/dist/client/events/chat.js +226 -0
- package/dist/client/events/group.js +410 -0
- package/dist/client/history-sync.js +122 -0
- package/dist/client/incoming.js +236 -0
- package/dist/client/index.js +5 -0
- package/dist/client/mailbox.js +49 -0
- package/dist/client/messages.js +152 -0
- package/dist/client/types.js +2 -0
- package/dist/crypto/core/constants.js +4 -0
- package/dist/crypto/core/encoding.js +29 -0
- package/dist/crypto/core/hkdf.js +26 -0
- package/dist/crypto/core/index.js +43 -0
- package/dist/crypto/core/keys.js +73 -0
- package/dist/crypto/core/nonce.js +18 -0
- package/dist/crypto/core/primitives.js +121 -0
- package/dist/crypto/core/random.js +32 -0
- package/dist/crypto/curves/Ed25519.js +42 -0
- package/dist/crypto/curves/X25519.js +64 -0
- package/dist/crypto/curves/constants.js +6 -0
- package/dist/crypto/curves/types.js +9 -0
- package/dist/crypto/index.js +22 -0
- package/dist/crypto/math/constants.js +44 -0
- package/dist/crypto/math/edwards.js +64 -0
- package/dist/crypto/math/le.js +20 -0
- package/dist/crypto/math/mod.js +38 -0
- package/dist/crypto/math/types.js +2 -0
- package/dist/esm/appstate/WaAppStateCrypto.js +198 -0
- package/dist/esm/appstate/WaAppStateSyncClient.js +803 -0
- package/dist/esm/appstate/WaAppStateSyncResponseParser.js +67 -0
- package/dist/esm/appstate/constants.js +20 -0
- package/dist/esm/appstate/index.js +6 -0
- package/dist/esm/appstate/store/sqlite.js +49 -0
- package/dist/esm/appstate/types.js +1 -0
- package/dist/esm/appstate/utils.js +75 -0
- package/dist/esm/auth/WaAuthClient.js +262 -0
- package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +118 -0
- package/dist/esm/auth/index.js +5 -0
- package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +71 -0
- package/dist/esm/auth/pairing/WaPairingFlow.js +324 -0
- package/dist/esm/auth/pairing/WaQrFlow.js +82 -0
- package/dist/esm/auth/pairing/constants.js +2 -0
- package/dist/esm/auth/types.js +1 -0
- package/dist/esm/client/WaClient.js +745 -0
- package/dist/esm/client/WaClientFactory.js +377 -0
- package/dist/esm/client/coordinators/WaGroupCoordinator.js +188 -0
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +311 -0
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +1057 -0
- package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +196 -0
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +490 -0
- package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +120 -0
- package/dist/esm/client/dirty.js +250 -0
- package/dist/esm/client/events/chat.js +223 -0
- package/dist/esm/client/events/group.js +407 -0
- package/dist/esm/client/history-sync.js +119 -0
- package/dist/esm/client/incoming.js +227 -0
- package/dist/esm/client/index.js +1 -0
- package/dist/esm/client/mailbox.js +46 -0
- package/dist/esm/client/messages.js +148 -0
- package/dist/esm/client/types.js +1 -0
- package/dist/esm/crypto/core/constants.js +1 -0
- package/dist/esm/crypto/core/encoding.js +25 -0
- package/dist/esm/crypto/core/hkdf.js +22 -0
- package/dist/esm/crypto/core/index.js +11 -0
- package/dist/esm/crypto/core/keys.js +66 -0
- package/dist/esm/crypto/core/nonce.js +15 -0
- package/dist/esm/crypto/core/primitives.js +102 -0
- package/dist/esm/crypto/core/random.js +28 -0
- package/dist/esm/crypto/curves/Ed25519.js +38 -0
- package/dist/esm/crypto/curves/X25519.js +58 -0
- package/dist/esm/crypto/curves/constants.js +3 -0
- package/dist/esm/crypto/curves/types.js +6 -0
- package/dist/esm/crypto/index.js +3 -0
- package/dist/esm/crypto/math/constants.js +41 -0
- package/dist/esm/crypto/math/edwards.js +60 -0
- package/dist/esm/crypto/math/le.js +16 -0
- package/dist/esm/crypto/math/mod.js +31 -0
- package/dist/esm/crypto/math/types.js +1 -0
- package/dist/esm/index.js +6 -0
- package/dist/esm/infra/log/ConsoleLogger.js +40 -0
- package/dist/esm/infra/log/PinoLogger.js +73 -0
- package/dist/esm/infra/log/types.js +1 -0
- package/dist/esm/infra/perf/BoundedTaskQueue.js +62 -0
- package/dist/esm/media/WaMediaCrypto.js +224 -0
- package/dist/esm/media/WaMediaTransferClient.js +361 -0
- package/dist/esm/media/conn.js +33 -0
- package/dist/esm/media/constants.js +18 -0
- package/dist/esm/media/index.js +3 -0
- package/dist/esm/media/types.js +1 -0
- package/dist/esm/message/WaMessageClient.js +210 -0
- package/dist/esm/message/ack.js +46 -0
- package/dist/esm/message/content.js +20 -0
- package/dist/esm/message/device-sent.js +49 -0
- package/dist/esm/message/incoming.js +318 -0
- package/dist/esm/message/index.js +2 -0
- package/dist/esm/message/padding.js +20 -0
- package/dist/esm/message/phash.js +25 -0
- package/dist/esm/message/types.js +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/proto.js +3 -0
- package/dist/esm/protocol/appstate.js +34 -0
- package/dist/esm/protocol/auth.js +12 -0
- package/dist/esm/protocol/browser.js +41 -0
- package/dist/esm/protocol/constants.js +11 -0
- package/dist/esm/protocol/defaults.js +27 -0
- package/dist/esm/protocol/dirty.js +26 -0
- package/dist/esm/protocol/group.js +5 -0
- package/dist/esm/protocol/index.js +11 -0
- package/dist/esm/protocol/jid.js +94 -0
- package/dist/esm/protocol/media.js +20 -0
- package/dist/esm/protocol/message.js +16 -0
- package/dist/esm/protocol/nodes.js +83 -0
- package/dist/esm/protocol/notification.js +50 -0
- package/dist/esm/protocol/stream.js +60 -0
- package/dist/esm/retry/constants.js +20 -0
- package/dist/esm/retry/index.js +5 -0
- package/dist/esm/retry/outbound.js +83 -0
- package/dist/esm/retry/parse.js +130 -0
- package/dist/esm/retry/reason.js +50 -0
- package/dist/esm/retry/replay.js +177 -0
- package/dist/esm/retry/types.js +1 -0
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +185 -0
- package/dist/esm/signal/api/SignalDigestSyncApi.js +179 -0
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +111 -0
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +141 -0
- package/dist/esm/signal/api/SignalRotateKeyApi.js +59 -0
- package/dist/esm/signal/api/SignalSessionSyncApi.js +187 -0
- package/dist/esm/signal/api/codec.js +23 -0
- package/dist/esm/signal/api/constants.js +9 -0
- package/dist/esm/signal/api/prekeys.js +9 -0
- package/dist/esm/signal/constants.js +16 -0
- package/dist/esm/signal/crypto/WaAdvSignature.js +60 -0
- package/dist/esm/signal/crypto/constants.js +8 -0
- package/dist/esm/signal/group/SenderKeyChain.js +97 -0
- package/dist/esm/signal/group/SenderKeyCodec.js +46 -0
- package/dist/esm/signal/group/SenderKeyManager.js +176 -0
- package/dist/esm/signal/index.js +11 -0
- package/dist/esm/signal/registration/keygen.js +31 -0
- package/dist/esm/signal/registration/utils.js +16 -0
- package/dist/esm/signal/session/SignalProtocol.js +122 -0
- package/dist/esm/signal/session/SignalRatchet.js +260 -0
- package/dist/esm/signal/session/SignalSerializer.js +63 -0
- package/dist/esm/signal/session/SignalSession.js +153 -0
- package/dist/esm/signal/store/sqlite.js +310 -0
- package/dist/esm/signal/types.js +1 -0
- package/dist/esm/store/contracts/appstate.store.js +1 -0
- package/dist/esm/store/contracts/auth.store.js +1 -0
- package/dist/esm/store/contracts/contact.store.js +1 -0
- package/dist/esm/store/contracts/device-list.store.js +1 -0
- package/dist/esm/store/contracts/message.store.js +1 -0
- package/dist/esm/store/contracts/participants.store.js +1 -0
- package/dist/esm/store/contracts/retry.store.js +1 -0
- package/dist/esm/store/contracts/sender-key.store.js +1 -0
- package/dist/esm/store/contracts/signal.store.js +1 -0
- package/dist/esm/store/contracts/thread.store.js +1 -0
- package/dist/esm/store/createStore.js +278 -0
- package/dist/esm/store/index.js +20 -0
- package/dist/esm/store/noop.store.js +43 -0
- package/dist/esm/store/providers/memory/appstate.store.js +101 -0
- package/dist/esm/store/providers/memory/contact.store.js +23 -0
- package/dist/esm/store/providers/memory/device-list.store.js +86 -0
- package/dist/esm/store/providers/memory/message.store.js +40 -0
- package/dist/esm/store/providers/memory/participants.store.js +61 -0
- package/dist/esm/store/providers/memory/retry.store.js +71 -0
- package/dist/esm/store/providers/memory/sender-key.store.js +88 -0
- package/dist/esm/store/providers/memory/signal.store.js +170 -0
- package/dist/esm/store/providers/memory/thread.store.js +34 -0
- package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +37 -0
- package/dist/esm/store/providers/sqlite/appstate.store.js +169 -0
- package/dist/esm/store/providers/sqlite/auth.store.js +176 -0
- package/dist/esm/store/providers/sqlite/connection.js +240 -0
- package/dist/esm/store/providers/sqlite/contact.store.js +61 -0
- package/dist/esm/store/providers/sqlite/device-list.store.js +155 -0
- package/dist/esm/store/providers/sqlite/message.store.js +119 -0
- package/dist/esm/store/providers/sqlite/migrations.js +347 -0
- package/dist/esm/store/providers/sqlite/participants.store.js +85 -0
- package/dist/esm/store/providers/sqlite/retry.store.js +144 -0
- package/dist/esm/store/providers/sqlite/sender-key.store.js +203 -0
- package/dist/esm/store/providers/sqlite/signal.store.js +353 -0
- package/dist/esm/store/providers/sqlite/thread.store.js +72 -0
- package/dist/esm/store/types.js +1 -0
- package/dist/esm/transport/WaComms.js +527 -0
- package/dist/esm/transport/WaWebSocket.js +361 -0
- package/dist/esm/transport/binary/constants.js +96 -0
- package/dist/esm/transport/binary/decoder.js +275 -0
- package/dist/esm/transport/binary/encoder.js +210 -0
- package/dist/esm/transport/binary/index.js +4 -0
- package/dist/esm/transport/binary/tokens.js +1280 -0
- package/dist/esm/transport/index.js +6 -0
- package/dist/esm/transport/keepalive/WaKeepAlive.js +141 -0
- package/dist/esm/transport/node/WaNodeOrchestrator.js +143 -0
- package/dist/esm/transport/node/WaNodeTransport.js +64 -0
- package/dist/esm/transport/node/builders/accountSync.js +101 -0
- package/dist/esm/transport/node/builders/group.js +47 -0
- package/dist/esm/transport/node/builders/index.js +7 -0
- package/dist/esm/transport/node/builders/media.js +10 -0
- package/dist/esm/transport/node/builders/message.js +317 -0
- package/dist/esm/transport/node/builders/pairing.js +130 -0
- package/dist/esm/transport/node/builders/prekeys.js +102 -0
- package/dist/esm/transport/node/builders/retry.js +116 -0
- package/dist/esm/transport/node/helpers.js +37 -0
- package/dist/esm/transport/node/query.js +53 -0
- package/dist/esm/transport/node/xml.js +39 -0
- package/dist/esm/transport/noise/WaClientPayload.js +162 -0
- package/dist/esm/transport/noise/WaFrameCodec.js +121 -0
- package/dist/esm/transport/noise/WaNoiseCert.js +74 -0
- package/dist/esm/transport/noise/WaNoiseHandshake.js +57 -0
- package/dist/esm/transport/noise/WaNoiseSession.js +322 -0
- package/dist/esm/transport/noise/WaNoiseSocket.js +17 -0
- package/dist/esm/transport/noise/constants.js +8 -0
- package/dist/esm/transport/noise/types.js +1 -0
- package/dist/esm/transport/stream/parse.js +91 -0
- package/dist/esm/transport/types.js +1 -0
- package/dist/esm/util/async.js +5 -0
- package/dist/esm/util/base64.js +18 -0
- package/dist/esm/util/bytes.js +275 -0
- package/dist/esm/util/coercion.js +56 -0
- package/dist/esm/util/collections.js +27 -0
- package/dist/esm/util/primitives.js +32 -0
- package/dist/esm/util/runtime.js +15 -0
- package/dist/esm/util/signal-address.js +5 -0
- package/dist/index.js +52 -0
- package/dist/infra/log/ConsoleLogger.js +44 -0
- package/dist/infra/log/PinoLogger.js +111 -0
- package/dist/infra/log/types.js +2 -0
- package/dist/infra/perf/BoundedTaskQueue.js +67 -0
- package/dist/media/WaMediaCrypto.js +228 -0
- package/dist/media/WaMediaTransferClient.js +365 -0
- package/dist/media/conn.js +36 -0
- package/dist/media/constants.js +21 -0
- package/dist/media/index.js +9 -0
- package/dist/media/types.js +2 -0
- package/dist/message/WaMessageClient.js +214 -0
- package/dist/message/ack.js +52 -0
- package/dist/message/content.js +24 -0
- package/dist/message/device-sent.js +53 -0
- package/dist/message/incoming.js +321 -0
- package/dist/message/index.js +20 -0
- package/dist/message/padding.js +24 -0
- package/dist/message/phash.js +28 -0
- package/dist/message/types.js +2 -0
- package/dist/proto.js +5 -0
- package/dist/protocol/appstate.js +37 -0
- package/dist/protocol/auth.js +15 -0
- package/dist/protocol/browser.js +45 -0
- package/dist/protocol/constants.js +46 -0
- package/dist/protocol/defaults.js +30 -0
- package/dist/protocol/dirty.js +29 -0
- package/dist/protocol/group.js +8 -0
- package/dist/protocol/index.js +53 -0
- package/dist/protocol/jid.js +107 -0
- package/dist/protocol/media.js +24 -0
- package/dist/protocol/message.js +19 -0
- package/dist/protocol/nodes.js +86 -0
- package/dist/protocol/notification.js +53 -0
- package/dist/protocol/stream.js +63 -0
- package/dist/retry/constants.js +23 -0
- package/dist/retry/index.js +19 -0
- package/dist/retry/outbound.js +88 -0
- package/dist/retry/parse.js +133 -0
- package/dist/retry/reason.js +53 -0
- package/dist/retry/replay.js +181 -0
- package/dist/retry/types.js +2 -0
- package/dist/signal/api/SignalDeviceSyncApi.js +189 -0
- package/dist/signal/api/SignalDigestSyncApi.js +183 -0
- package/dist/signal/api/SignalIdentitySyncApi.js +115 -0
- package/dist/signal/api/SignalMissingPreKeysSyncApi.js +145 -0
- package/dist/signal/api/SignalRotateKeyApi.js +63 -0
- package/dist/signal/api/SignalSessionSyncApi.js +191 -0
- package/dist/signal/api/codec.js +27 -0
- package/dist/signal/api/constants.js +12 -0
- package/dist/signal/api/prekeys.js +16 -0
- package/dist/signal/constants.js +19 -0
- package/dist/signal/crypto/WaAdvSignature.js +72 -0
- package/dist/signal/crypto/constants.js +11 -0
- package/dist/signal/group/SenderKeyChain.js +101 -0
- package/dist/signal/group/SenderKeyCodec.js +50 -0
- package/dist/signal/group/SenderKeyManager.js +180 -0
- package/dist/signal/index.js +29 -0
- package/dist/signal/registration/keygen.js +37 -0
- package/dist/signal/registration/utils.js +19 -0
- package/dist/signal/session/SignalProtocol.js +126 -0
- package/dist/signal/session/SignalRatchet.js +268 -0
- package/dist/signal/session/SignalSerializer.js +69 -0
- package/dist/signal/session/SignalSession.js +165 -0
- package/dist/signal/store/sqlite.js +324 -0
- package/dist/signal/types.js +2 -0
- package/dist/store/contracts/appstate.store.js +2 -0
- package/dist/store/contracts/auth.store.js +2 -0
- package/dist/store/contracts/contact.store.js +2 -0
- package/dist/store/contracts/device-list.store.js +2 -0
- package/dist/store/contracts/message.store.js +2 -0
- package/dist/store/contracts/participants.store.js +2 -0
- package/dist/store/contracts/retry.store.js +2 -0
- package/dist/store/contracts/sender-key.store.js +2 -0
- package/dist/store/contracts/signal.store.js +2 -0
- package/dist/store/contracts/thread.store.js +2 -0
- package/dist/store/createStore.js +281 -0
- package/dist/store/index.js +43 -0
- package/dist/store/noop.store.js +46 -0
- package/dist/store/providers/memory/appstate.store.js +105 -0
- package/dist/store/providers/memory/contact.store.js +27 -0
- package/dist/store/providers/memory/device-list.store.js +90 -0
- package/dist/store/providers/memory/message.store.js +44 -0
- package/dist/store/providers/memory/participants.store.js +65 -0
- package/dist/store/providers/memory/retry.store.js +75 -0
- package/dist/store/providers/memory/sender-key.store.js +92 -0
- package/dist/store/providers/memory/signal.store.js +174 -0
- package/dist/store/providers/memory/thread.store.js +38 -0
- package/dist/store/providers/sqlite/BaseSqliteStore.js +41 -0
- package/dist/store/providers/sqlite/appstate.store.js +173 -0
- package/dist/store/providers/sqlite/auth.store.js +180 -0
- package/dist/store/providers/sqlite/connection.js +276 -0
- package/dist/store/providers/sqlite/contact.store.js +65 -0
- package/dist/store/providers/sqlite/device-list.store.js +159 -0
- package/dist/store/providers/sqlite/message.store.js +123 -0
- package/dist/store/providers/sqlite/migrations.js +350 -0
- package/dist/store/providers/sqlite/participants.store.js +89 -0
- package/dist/store/providers/sqlite/retry.store.js +148 -0
- package/dist/store/providers/sqlite/sender-key.store.js +207 -0
- package/dist/store/providers/sqlite/signal.store.js +357 -0
- package/dist/store/providers/sqlite/thread.store.js +76 -0
- package/dist/store/types.js +2 -0
- package/dist/transport/WaComms.js +531 -0
- package/dist/transport/WaWebSocket.js +365 -0
- package/dist/transport/binary/constants.js +99 -0
- package/dist/transport/binary/decoder.js +279 -0
- package/dist/transport/binary/encoder.js +214 -0
- package/dist/transport/binary/index.js +23 -0
- package/dist/transport/binary/tokens.js +1283 -0
- package/dist/transport/index.js +18 -0
- package/dist/transport/keepalive/WaKeepAlive.js +145 -0
- package/dist/transport/node/WaNodeOrchestrator.js +147 -0
- package/dist/transport/node/WaNodeTransport.js +68 -0
- package/dist/transport/node/builders/accountSync.js +110 -0
- package/dist/transport/node/builders/group.js +52 -0
- package/dist/transport/node/builders/index.js +39 -0
- package/dist/transport/node/builders/media.js +13 -0
- package/dist/transport/node/builders/message.js +328 -0
- package/dist/transport/node/builders/pairing.js +137 -0
- package/dist/transport/node/builders/prekeys.js +107 -0
- package/dist/transport/node/builders/retry.js +119 -0
- package/dist/transport/node/helpers.js +46 -0
- package/dist/transport/node/query.js +59 -0
- package/dist/transport/node/xml.js +42 -0
- package/dist/transport/noise/WaClientPayload.js +166 -0
- package/dist/transport/noise/WaFrameCodec.js +125 -0
- package/dist/transport/noise/WaNoiseCert.js +77 -0
- package/dist/transport/noise/WaNoiseHandshake.js +61 -0
- package/dist/transport/noise/WaNoiseSession.js +326 -0
- package/dist/transport/noise/WaNoiseSocket.js +21 -0
- package/dist/transport/noise/constants.js +11 -0
- package/dist/transport/noise/types.js +2 -0
- package/dist/transport/stream/parse.js +97 -0
- package/dist/transport/types.js +2 -0
- package/dist/types/appstate/WaAppStateCrypto.d.ts +59 -0
- package/dist/types/appstate/WaAppStateSyncClient.d.ts +63 -0
- package/dist/types/appstate/WaAppStateSyncResponseParser.d.ts +12 -0
- package/dist/types/appstate/constants.d.ts +14 -0
- package/dist/types/appstate/index.d.ts +7 -0
- package/dist/types/appstate/store/sqlite.d.ts +21 -0
- package/dist/types/appstate/types.d.ts +66 -0
- package/dist/types/appstate/utils.d.ts +10 -0
- package/dist/types/auth/WaAuthClient.d.ts +61 -0
- package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +14 -0
- package/dist/types/auth/index.d.ts +6 -0
- package/dist/types/auth/pairing/WaPairingCodeCrypto.d.ts +17 -0
- package/dist/types/auth/pairing/WaPairingFlow.d.ts +48 -0
- package/dist/types/auth/pairing/WaQrFlow.d.ts +23 -0
- package/dist/types/auth/pairing/constants.d.ts +2 -0
- package/dist/types/auth/types.d.ts +48 -0
- package/dist/types/client/WaClient.d.ts +97 -0
- package/dist/types/client/WaClientFactory.d.ts +83 -0
- package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +48 -0
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +60 -0
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +90 -0
- package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +43 -0
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +61 -0
- package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +17 -0
- package/dist/types/client/dirty.d.ts +17 -0
- package/dist/types/client/events/chat.d.ts +3 -0
- package/dist/types/client/events/group.d.ts +7 -0
- package/dist/types/client/history-sync.d.ts +17 -0
- package/dist/types/client/incoming.d.ts +35 -0
- package/dist/types/client/index.d.ts +2 -0
- package/dist/types/client/mailbox.d.ts +12 -0
- package/dist/types/client/messages.d.ts +17 -0
- package/dist/types/client/types.d.ts +235 -0
- package/dist/types/crypto/core/constants.d.ts +1 -0
- package/dist/types/crypto/core/encoding.d.ts +11 -0
- package/dist/types/crypto/core/hkdf.d.ts +8 -0
- package/dist/types/crypto/core/index.d.ts +11 -0
- package/dist/types/crypto/core/keys.d.ts +20 -0
- package/dist/types/crypto/core/nonce.d.ts +5 -0
- package/dist/types/crypto/core/primitives.d.ts +25 -0
- package/dist/types/crypto/core/random.d.ts +8 -0
- package/dist/types/crypto/curves/Ed25519.d.ts +7 -0
- package/dist/types/crypto/curves/X25519.d.ts +8 -0
- package/dist/types/crypto/curves/constants.d.ts +2 -0
- package/dist/types/crypto/curves/types.d.ts +10 -0
- package/dist/types/crypto/index.d.ts +3 -0
- package/dist/types/crypto/math/constants.d.ts +7 -0
- package/dist/types/crypto/math/edwards.d.ts +3 -0
- package/dist/types/crypto/math/le.d.ts +2 -0
- package/dist/types/crypto/math/mod.d.ts +5 -0
- package/dist/types/crypto/math/types.d.ts +6 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/infra/log/ConsoleLogger.d.ts +11 -0
- package/dist/types/infra/log/PinoLogger.d.ts +30 -0
- package/dist/types/infra/log/types.d.ts +9 -0
- package/dist/types/infra/perf/BoundedTaskQueue.d.ts +19 -0
- package/dist/types/media/WaMediaCrypto.d.ts +12 -0
- package/dist/types/media/WaMediaTransferClient.d.ts +81 -0
- package/dist/types/media/conn.d.ts +3 -0
- package/dist/types/media/constants.d.ts +10 -0
- package/dist/types/media/index.d.ts +4 -0
- package/dist/types/media/types.d.ts +56 -0
- package/dist/types/message/WaMessageClient.d.ts +29 -0
- package/dist/types/message/ack.d.ts +5 -0
- package/dist/types/message/content.d.ts +4 -0
- package/dist/types/message/device-sent.d.ts +3 -0
- package/dist/types/message/incoming.d.ts +18 -0
- package/dist/types/message/index.d.ts +2 -0
- package/dist/types/message/padding.d.ts +2 -0
- package/dist/types/message/phash.d.ts +1 -0
- package/dist/types/message/types.d.ts +58 -0
- package/dist/types/proto.d.ts +2 -0
- package/dist/types/protocol/appstate.d.ts +34 -0
- package/dist/types/protocol/auth.d.ts +12 -0
- package/dist/types/protocol/browser.d.ts +22 -0
- package/dist/types/protocol/constants.d.ts +11 -0
- package/dist/types/protocol/defaults.d.ts +26 -0
- package/dist/types/protocol/dirty.d.ts +15 -0
- package/dist/types/protocol/group.d.ts +6 -0
- package/dist/types/protocol/index.d.ts +11 -0
- package/dist/types/protocol/jid.d.ts +19 -0
- package/dist/types/protocol/media.d.ts +15 -0
- package/dist/types/protocol/message.d.ts +16 -0
- package/dist/types/protocol/nodes.d.ts +83 -0
- package/dist/types/protocol/notification.d.ts +50 -0
- package/dist/types/protocol/stream.d.ts +60 -0
- package/dist/types/retry/constants.d.ts +21 -0
- package/dist/types/retry/index.d.ts +7 -0
- package/dist/types/retry/outbound.d.ts +4 -0
- package/dist/types/retry/parse.d.ts +3 -0
- package/dist/types/retry/reason.d.ts +2 -0
- package/dist/types/retry/replay.d.ts +30 -0
- package/dist/types/retry/types.d.ts +70 -0
- package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +31 -0
- package/dist/types/signal/api/SignalDigestSyncApi.d.ts +27 -0
- package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +26 -0
- package/dist/types/signal/api/SignalMissingPreKeysSyncApi.d.ts +39 -0
- package/dist/types/signal/api/SignalRotateKeyApi.d.ts +22 -0
- package/dist/types/signal/api/SignalSessionSyncApi.d.ts +38 -0
- package/dist/types/signal/api/codec.d.ts +3 -0
- package/dist/types/signal/api/constants.d.ts +9 -0
- package/dist/types/signal/api/prekeys.d.ts +6 -0
- package/dist/types/signal/constants.d.ts +14 -0
- package/dist/types/signal/crypto/WaAdvSignature.d.ts +7 -0
- package/dist/types/signal/crypto/constants.d.ts +5 -0
- package/dist/types/signal/group/SenderKeyChain.d.ts +11 -0
- package/dist/types/signal/group/SenderKeyCodec.d.ts +14 -0
- package/dist/types/signal/group/SenderKeyManager.d.ts +22 -0
- package/dist/types/signal/index.d.ts +12 -0
- package/dist/types/signal/registration/keygen.d.ts +5 -0
- package/dist/types/signal/registration/utils.d.ts +9 -0
- package/dist/types/signal/session/SignalProtocol.d.ts +22 -0
- package/dist/types/signal/session/SignalRatchet.d.ts +25 -0
- package/dist/types/signal/session/SignalSerializer.d.ts +6 -0
- package/dist/types/signal/session/SignalSession.d.ts +43 -0
- package/dist/types/signal/store/sqlite.d.ts +72 -0
- package/dist/types/signal/types.d.ts +110 -0
- package/dist/types/store/contracts/appstate.store.d.ts +22 -0
- package/dist/types/store/contracts/auth.store.d.ts +6 -0
- package/dist/types/store/contracts/contact.store.d.ts +14 -0
- package/dist/types/store/contracts/device-list.store.d.ts +16 -0
- package/dist/types/store/contracts/message.store.d.ts +18 -0
- package/dist/types/store/contracts/participants.store.d.ts +14 -0
- package/dist/types/store/contracts/retry.store.d.ts +11 -0
- package/dist/types/store/contracts/sender-key.store.d.ts +16 -0
- package/dist/types/store/contracts/signal.store.d.ts +31 -0
- package/dist/types/store/contracts/thread.store.d.ts +17 -0
- package/dist/types/store/createStore.d.ts +2 -0
- package/dist/types/store/index.d.ts +31 -0
- package/dist/types/store/noop.store.d.ts +10 -0
- package/dist/types/store/providers/memory/appstate.store.d.ts +21 -0
- package/dist/types/store/providers/memory/contact.store.d.ts +13 -0
- package/dist/types/store/providers/memory/device-list.store.d.ts +20 -0
- package/dist/types/store/providers/memory/message.store.d.ts +14 -0
- package/dist/types/store/providers/memory/participants.store.d.ts +18 -0
- package/dist/types/store/providers/memory/retry.store.d.ts +18 -0
- package/dist/types/store/providers/memory/sender-key.store.d.ts +28 -0
- package/dist/types/store/providers/memory/signal.store.d.ts +51 -0
- package/dist/types/store/providers/memory/thread.store.d.ts +14 -0
- package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +12 -0
- package/dist/types/store/providers/sqlite/appstate.store.d.ts +15 -0
- package/dist/types/store/providers/sqlite/auth.store.d.ts +10 -0
- package/dist/types/store/providers/sqlite/connection.d.ts +10 -0
- package/dist/types/store/providers/sqlite/contact.store.d.ts +10 -0
- package/dist/types/store/providers/sqlite/device-list.store.d.ts +18 -0
- package/dist/types/store/providers/sqlite/message.store.d.ts +11 -0
- package/dist/types/store/providers/sqlite/migrations.d.ts +3 -0
- package/dist/types/store/providers/sqlite/participants.store.d.ts +13 -0
- package/dist/types/store/providers/sqlite/retry.store.d.ts +16 -0
- package/dist/types/store/providers/sqlite/sender-key.store.d.ts +25 -0
- package/dist/types/store/providers/sqlite/signal.store.d.ts +46 -0
- package/dist/types/store/providers/sqlite/thread.store.d.ts +11 -0
- package/dist/types/store/types.d.ts +103 -0
- package/dist/types/transport/WaComms.d.ts +61 -0
- package/dist/types/transport/WaWebSocket.d.ts +36 -0
- package/dist/types/transport/binary/constants.d.ts +49 -0
- package/dist/types/transport/binary/decoder.d.ts +3 -0
- package/dist/types/transport/binary/encoder.d.ts +3 -0
- package/dist/types/transport/binary/index.d.ts +4 -0
- package/dist/types/transport/binary/tokens.d.ts +11 -0
- package/dist/types/transport/index.d.ts +7 -0
- package/dist/types/transport/keepalive/WaKeepAlive.d.ts +39 -0
- package/dist/types/transport/node/WaNodeOrchestrator.d.ts +28 -0
- package/dist/types/transport/node/WaNodeTransport.d.ts +22 -0
- package/dist/types/transport/node/builders/accountSync.d.ts +11 -0
- package/dist/types/transport/node/builders/group.d.ts +16 -0
- package/dist/types/transport/node/builders/index.d.ts +7 -0
- package/dist/types/transport/node/builders/media.d.ts +2 -0
- package/dist/types/transport/node/builders/message.d.ts +52 -0
- package/dist/types/transport/node/builders/pairing.d.ts +18 -0
- package/dist/types/transport/node/builders/prekeys.d.ts +5 -0
- package/dist/types/transport/node/builders/retry.d.ts +18 -0
- package/dist/types/transport/node/helpers.d.ts +8 -0
- package/dist/types/transport/node/query.d.ts +10 -0
- package/dist/types/transport/node/xml.d.ts +2 -0
- package/dist/types/transport/noise/WaClientPayload.d.ts +3 -0
- package/dist/types/transport/noise/WaFrameCodec.d.ts +9 -0
- package/dist/types/transport/noise/WaNoiseCert.d.ts +1 -0
- package/dist/types/transport/noise/WaNoiseHandshake.d.ts +14 -0
- package/dist/types/transport/noise/WaNoiseSession.d.ts +33 -0
- package/dist/types/transport/noise/WaNoiseSocket.d.ts +10 -0
- package/dist/types/transport/noise/constants.d.ts +7 -0
- package/dist/types/transport/noise/types.d.ts +23 -0
- package/dist/types/transport/stream/parse.d.ts +23 -0
- package/dist/types/transport/types.d.ts +71 -0
- package/dist/types/util/async.d.ts +1 -0
- package/dist/types/util/base64.d.ts +4 -0
- package/dist/types/util/bytes.d.ts +28 -0
- package/dist/types/util/coercion.d.ts +8 -0
- package/dist/types/util/collections.d.ts +3 -0
- package/dist/types/util/primitives.d.ts +7 -0
- package/dist/types/util/runtime.d.ts +2 -0
- package/dist/types/util/signal-address.d.ts +2 -0
- package/dist/util/async.js +8 -0
- package/dist/util/base64.js +24 -0
- package/dist/util/bytes.js +291 -0
- package/dist/util/coercion.js +66 -0
- package/dist/util/collections.js +32 -0
- package/dist/util/primitives.js +37 -0
- package/dist/util/runtime.js +19 -0
- package/dist/util/signal-address.js +8 -0
- package/package.json +150 -0
- package/proto/index.d.ts +10861 -0
- package/proto/index.js +1 -0
- package/scripts/check-node-version.cjs +55 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createStreamControlHandler = createStreamControlHandler;
|
|
4
|
+
const constants_1 = require("../../protocol/constants");
|
|
5
|
+
const primitives_1 = require("../../util/primitives");
|
|
6
|
+
function createStreamControlHandler(options) {
|
|
7
|
+
const { logger, getComms, clearPendingQueries, clearMediaConnCache, disconnect, clearStoredCredentials, connect } = options;
|
|
8
|
+
let lifecyclePromise = null;
|
|
9
|
+
const runStreamControlLifecycle = (reason, action) => {
|
|
10
|
+
if (lifecyclePromise) {
|
|
11
|
+
logger.debug('stream-control lifecycle already running', { reason });
|
|
12
|
+
return lifecyclePromise;
|
|
13
|
+
}
|
|
14
|
+
lifecyclePromise = action().finally(() => {
|
|
15
|
+
lifecyclePromise = null;
|
|
16
|
+
});
|
|
17
|
+
return lifecyclePromise;
|
|
18
|
+
};
|
|
19
|
+
const restartBackendAfterStreamControl = async (reason) => {
|
|
20
|
+
logger.info('restarting backend after stream control', { reason });
|
|
21
|
+
try {
|
|
22
|
+
await connect();
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
logger.warn('failed to restart backend after stream control', {
|
|
26
|
+
reason,
|
|
27
|
+
message: (0, primitives_1.toError)(error).message
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
const resumeSocketDueToStreamError = async (reason) => {
|
|
32
|
+
const comms = getComms();
|
|
33
|
+
if (!comms) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
logger.info('resuming socket due to stream control node', { reason });
|
|
37
|
+
clearPendingQueries(new Error(`socket resume requested by ${reason}`));
|
|
38
|
+
clearMediaConnCache();
|
|
39
|
+
try {
|
|
40
|
+
await comms.closeSocketAndResume();
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
logger.warn('failed to resume socket for stream control node', {
|
|
44
|
+
reason,
|
|
45
|
+
message: (0, primitives_1.toError)(error).message
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const forceLoginDueToStreamError = async (code) => {
|
|
50
|
+
await runStreamControlLifecycle(`stream_error_code_${code}`, async () => {
|
|
51
|
+
logger.warn('received forced login stream error; starting login lifecycle', {
|
|
52
|
+
code
|
|
53
|
+
});
|
|
54
|
+
await disconnect();
|
|
55
|
+
await clearStoredCredentials();
|
|
56
|
+
await restartBackendAfterStreamControl(`stream_error_code_${code}`);
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
const disconnectDueToStreamError = async (reason) => {
|
|
60
|
+
await runStreamControlLifecycle(reason, async () => {
|
|
61
|
+
logger.warn('disconnecting due to stream control node', { reason });
|
|
62
|
+
await disconnect();
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
const logoutDueToStreamError = async (reason, shouldRestartBackend) => {
|
|
66
|
+
await runStreamControlLifecycle(reason, async () => {
|
|
67
|
+
logger.warn('logging out due to stream control node', {
|
|
68
|
+
reason,
|
|
69
|
+
shouldRestartBackend
|
|
70
|
+
});
|
|
71
|
+
await disconnect();
|
|
72
|
+
await clearStoredCredentials();
|
|
73
|
+
if (shouldRestartBackend) {
|
|
74
|
+
await restartBackendAfterStreamControl(reason);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
return {
|
|
79
|
+
handleStreamControlResult: async (result) => {
|
|
80
|
+
switch (result.kind) {
|
|
81
|
+
case 'xmlstreamend':
|
|
82
|
+
logger.info('received xmlstreamend stanza');
|
|
83
|
+
return;
|
|
84
|
+
case 'stream_error_code':
|
|
85
|
+
logger.warn('received stream:error with code', { code: result.code });
|
|
86
|
+
if (result.code >= 500 && result.code < 600) {
|
|
87
|
+
if (result.code === constants_1.WA_STREAM_SIGNALING.FORCE_LOGIN_CODE) {
|
|
88
|
+
await forceLoginDueToStreamError(result.code);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (result.code === constants_1.WA_STREAM_SIGNALING.FORCE_LOGOUT_CODE) {
|
|
92
|
+
await logoutDueToStreamError(`stream_error_code_${constants_1.WA_STREAM_SIGNALING.FORCE_LOGOUT_CODE}`, true);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
await resumeSocketDueToStreamError(`stream_error_code_${result.code}`);
|
|
97
|
+
return;
|
|
98
|
+
case 'stream_error_replaced':
|
|
99
|
+
logger.warn('received stream:error replaced, stopping client');
|
|
100
|
+
await disconnectDueToStreamError(constants_1.WA_DISCONNECT_REASONS.STREAM_ERROR_REPLACED);
|
|
101
|
+
return;
|
|
102
|
+
case 'stream_error_device_removed':
|
|
103
|
+
logger.warn('received stream:error device removed, logging out');
|
|
104
|
+
await logoutDueToStreamError(constants_1.WA_DISCONNECT_REASONS.STREAM_ERROR_DEVICE_REMOVED, false);
|
|
105
|
+
return;
|
|
106
|
+
case 'stream_error_ack':
|
|
107
|
+
logger.warn('received stream:error ack', { id: result.id });
|
|
108
|
+
await resumeSocketDueToStreamError(constants_1.WA_DISCONNECT_REASONS.STREAM_ERROR_ACK);
|
|
109
|
+
return;
|
|
110
|
+
case 'stream_error_xml_not_well_formed':
|
|
111
|
+
logger.warn('received stream:error xml-not-well-formed');
|
|
112
|
+
await resumeSocketDueToStreamError(constants_1.WA_DISCONNECT_REASONS.STREAM_ERROR_XML_NOT_WELL_FORMED);
|
|
113
|
+
return;
|
|
114
|
+
case 'stream_error_other':
|
|
115
|
+
logger.warn('received stream:error other');
|
|
116
|
+
await resumeSocketDueToStreamError(constants_1.WA_DISCONNECT_REASONS.STREAM_ERROR_OTHER);
|
|
117
|
+
return;
|
|
118
|
+
default:
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseDirtyBits = parseDirtyBits;
|
|
4
|
+
exports.handleDirtyBits = handleDirtyBits;
|
|
5
|
+
const _crypto_1 = require("../crypto/index.js");
|
|
6
|
+
const constants_1 = require("../protocol/constants");
|
|
7
|
+
const jid_1 = require("../protocol/jid");
|
|
8
|
+
const accountSync_1 = require("../transport/node/builders/accountSync");
|
|
9
|
+
const helpers_1 = require("../transport/node/helpers");
|
|
10
|
+
const query_1 = require("../transport/node/query");
|
|
11
|
+
const bytes_1 = require("../util/bytes");
|
|
12
|
+
const primitives_1 = require("../util/primitives");
|
|
13
|
+
const SUPPORTED_DIRTY_TYPES = new Set(constants_1.WA_SUPPORTED_DIRTY_TYPES);
|
|
14
|
+
const ACCOUNT_SYNC_PROTOCOL_SET = new Set(constants_1.WA_ACCOUNT_SYNC_PROTOCOLS);
|
|
15
|
+
function parseDirtyBitNode(node, logger) {
|
|
16
|
+
const type = node.attrs.type;
|
|
17
|
+
const timestamp = Number.parseInt(node.attrs.timestamp ?? '', 10);
|
|
18
|
+
if (!type || !Number.isFinite(timestamp)) {
|
|
19
|
+
logger.warn('received invalid dirty bit node', {
|
|
20
|
+
type,
|
|
21
|
+
timestamp: node.attrs.timestamp
|
|
22
|
+
});
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
const protocols = (0, helpers_1.getNodeChildren)(node).map((child) => child.tag);
|
|
26
|
+
return {
|
|
27
|
+
type,
|
|
28
|
+
timestamp,
|
|
29
|
+
protocols
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function splitDirtyBitsBySupport(dirtyBits) {
|
|
33
|
+
return {
|
|
34
|
+
supported: dirtyBits.filter((dirtyBit) => SUPPORTED_DIRTY_TYPES.has(dirtyBit.type)),
|
|
35
|
+
unsupported: dirtyBits.filter((dirtyBit) => !SUPPORTED_DIRTY_TYPES.has(dirtyBit.type))
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function resolveAccountSyncProtocols(protocols) {
|
|
39
|
+
const selected = protocols.filter((protocol) => ACCOUNT_SYNC_PROTOCOL_SET.has(protocol));
|
|
40
|
+
if (selected.length > 0) {
|
|
41
|
+
return selected;
|
|
42
|
+
}
|
|
43
|
+
return constants_1.WA_ACCOUNT_SYNC_PROTOCOLS;
|
|
44
|
+
}
|
|
45
|
+
function parseDirtyBits(nodes, logger) {
|
|
46
|
+
return nodes
|
|
47
|
+
.map((node) => parseDirtyBitNode(node, logger))
|
|
48
|
+
.filter((dirtyBit) => dirtyBit !== null);
|
|
49
|
+
}
|
|
50
|
+
async function handleDirtyBits(runtime, dirtyBits) {
|
|
51
|
+
const meJid = runtime.getCurrentCredentials()?.meJid ?? null;
|
|
52
|
+
if (!meJid) {
|
|
53
|
+
runtime.logger.trace('dirty bits skipped: session is not registered');
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const { supported, unsupported } = splitDirtyBitsBySupport(dirtyBits);
|
|
57
|
+
runtime.logger.info('handling dirty bits from info bulletin', {
|
|
58
|
+
supported: supported.map((entry) => entry.type).join(','),
|
|
59
|
+
unsupported: unsupported.map((entry) => entry.type).join(',')
|
|
60
|
+
});
|
|
61
|
+
const handledSupported = (await Promise.allSettled(supported.map(async (dirtyBit) => handleDirtyBit(runtime, dirtyBit)))).flatMap((result, index) => {
|
|
62
|
+
if (result.status === 'fulfilled') {
|
|
63
|
+
return [supported[index]];
|
|
64
|
+
}
|
|
65
|
+
runtime.logger.warn('failed handling dirty bit', {
|
|
66
|
+
type: supported[index].type,
|
|
67
|
+
message: (0, primitives_1.toError)(result.reason).message
|
|
68
|
+
});
|
|
69
|
+
return [];
|
|
70
|
+
});
|
|
71
|
+
await clearDirtyBits(runtime, unsupported.concat(handledSupported));
|
|
72
|
+
}
|
|
73
|
+
async function handleDirtyBit(runtime, dirtyBit) {
|
|
74
|
+
switch (dirtyBit.type) {
|
|
75
|
+
case constants_1.WA_DIRTY_TYPES.ACCOUNT_SYNC:
|
|
76
|
+
await handleAccountSyncDirtyBit(runtime, dirtyBit.protocols);
|
|
77
|
+
return;
|
|
78
|
+
case constants_1.WA_DIRTY_TYPES.SYNCD_APP_STATE:
|
|
79
|
+
await handleSyncdAppStateDirtyBit(runtime);
|
|
80
|
+
return;
|
|
81
|
+
case constants_1.WA_DIRTY_TYPES.GROUPS:
|
|
82
|
+
await syncGroupsDirtyBit(runtime);
|
|
83
|
+
return;
|
|
84
|
+
case constants_1.WA_DIRTY_TYPES.NEWSLETTER_METADATA:
|
|
85
|
+
await syncNewsletterMetadataDirtyBit(runtime);
|
|
86
|
+
return;
|
|
87
|
+
default:
|
|
88
|
+
runtime.logger.debug('received unsupported dirty bit', {
|
|
89
|
+
type: dirtyBit.type
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async function handleAccountSyncDirtyBit(runtime, protocols) {
|
|
94
|
+
const selectedProtocols = resolveAccountSyncProtocols(protocols);
|
|
95
|
+
runtime.logger.info('received account_sync dirty bit', {
|
|
96
|
+
protocols: selectedProtocols.join(',')
|
|
97
|
+
});
|
|
98
|
+
const failures = [];
|
|
99
|
+
await Promise.all(selectedProtocols.map(async (protocol) => {
|
|
100
|
+
try {
|
|
101
|
+
await runAccountSyncProtocol(runtime, protocol);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
failures.push(protocol);
|
|
105
|
+
runtime.logger.warn('account_sync protocol failed', {
|
|
106
|
+
protocol,
|
|
107
|
+
message: (0, primitives_1.toError)(error).message
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}));
|
|
111
|
+
if (failures.length > 0) {
|
|
112
|
+
throw new Error(`account_sync protocols failed: ${failures.join(',')}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async function runAccountSyncProtocol(runtime, protocol) {
|
|
116
|
+
switch (protocol) {
|
|
117
|
+
case constants_1.WA_DIRTY_PROTOCOLS.DEVICES:
|
|
118
|
+
await syncAccountDevicesDirtyBit(runtime);
|
|
119
|
+
return;
|
|
120
|
+
case constants_1.WA_DIRTY_PROTOCOLS.PICTURE:
|
|
121
|
+
await syncAccountPictureDirtyBit(runtime);
|
|
122
|
+
return;
|
|
123
|
+
case constants_1.WA_DIRTY_PROTOCOLS.PRIVACY:
|
|
124
|
+
await syncAccountPrivacyDirtyBit(runtime);
|
|
125
|
+
return;
|
|
126
|
+
case constants_1.WA_DIRTY_PROTOCOLS.BLOCKLIST:
|
|
127
|
+
await syncAccountBlocklistDirtyBit(runtime);
|
|
128
|
+
return;
|
|
129
|
+
case constants_1.WA_DIRTY_PROTOCOLS.NOTICE:
|
|
130
|
+
await syncAccountNoticeDirtyBit(runtime);
|
|
131
|
+
return;
|
|
132
|
+
default:
|
|
133
|
+
runtime.logger.debug('unsupported account_sync protocol', {
|
|
134
|
+
protocol
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async function handleSyncdAppStateDirtyBit(runtime) {
|
|
139
|
+
runtime.logger.info('received syncd_app_state dirty bit, starting sync');
|
|
140
|
+
await runtime.syncAppState();
|
|
141
|
+
}
|
|
142
|
+
async function syncAccountDevicesDirtyBit(runtime) {
|
|
143
|
+
const credentials = runtime.getCurrentCredentials();
|
|
144
|
+
const meJid = credentials?.meJid ?? null;
|
|
145
|
+
if (!meJid) {
|
|
146
|
+
runtime.logger.warn('account_sync devices skipped: meJid is missing');
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
const userJids = resolveAccountSyncDeviceTargets(credentials);
|
|
150
|
+
if (userJids.length === 0) {
|
|
151
|
+
runtime.logger.warn('account_sync devices skipped: no valid account_sync targets');
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
await runSyncQuery(runtime, {
|
|
155
|
+
queryContext: 'account_sync.devices',
|
|
156
|
+
node: (0, accountSync_1.buildAccountDevicesSyncIq)(userJids, await generateUsyncSid()),
|
|
157
|
+
logMessage: 'account_sync devices synchronized',
|
|
158
|
+
contextData: { meJid, targets: userJids.join(',') }
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
async function syncAccountPictureDirtyBit(runtime) {
|
|
162
|
+
const meJid = runtime.getCurrentCredentials()?.meJid ?? null;
|
|
163
|
+
if (!meJid) {
|
|
164
|
+
runtime.logger.warn('account_sync picture skipped: meJid is missing');
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const targetJid = (0, jid_1.toUserJid)(meJid);
|
|
168
|
+
const response = await runtime.queryWithContext('account_sync.picture', (0, accountSync_1.buildAccountPictureSyncIq)(targetJid), constants_1.WA_DEFAULTS.IQ_TIMEOUT_MS, { meJid, target: targetJid });
|
|
169
|
+
if (response.tag !== 'iq') {
|
|
170
|
+
throw new Error(`account_sync.picture returned non-iq node (${response.tag})`);
|
|
171
|
+
}
|
|
172
|
+
if (response.attrs.type === constants_1.WA_IQ_TYPES.RESULT) {
|
|
173
|
+
runtime.logger.debug('account_sync picture synchronized', {
|
|
174
|
+
meJid,
|
|
175
|
+
target: targetJid
|
|
176
|
+
});
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const iqError = (0, query_1.parseIqError)(response);
|
|
180
|
+
const isPictureMissing = (iqError.numericCode === 404 || iqError.code === '404') &&
|
|
181
|
+
iqError.text.toLowerCase() === 'item-not-found';
|
|
182
|
+
if (isPictureMissing) {
|
|
183
|
+
runtime.logger.debug('account_sync picture skipped: no profile picture found', {
|
|
184
|
+
meJid,
|
|
185
|
+
target: targetJid
|
|
186
|
+
});
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
throw new Error(`account_sync.picture iq failed (${iqError.code}: ${iqError.text})`);
|
|
190
|
+
}
|
|
191
|
+
async function syncAccountPrivacyDirtyBit(runtime) {
|
|
192
|
+
await runSyncQuery(runtime, {
|
|
193
|
+
queryContext: 'account_sync.privacy',
|
|
194
|
+
node: (0, accountSync_1.buildAccountPrivacySyncIq)(),
|
|
195
|
+
logMessage: 'account_sync privacy synchronized'
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
async function syncAccountBlocklistDirtyBit(runtime) {
|
|
199
|
+
await runSyncQuery(runtime, {
|
|
200
|
+
queryContext: 'account_sync.blocklist',
|
|
201
|
+
node: (0, accountSync_1.buildAccountBlocklistSyncIq)(),
|
|
202
|
+
logMessage: 'account_sync blocklist synchronized'
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
async function syncAccountNoticeDirtyBit(runtime) {
|
|
206
|
+
runtime.logger.info('account_sync notice protocol received (no GraphQL/MEX job configured)');
|
|
207
|
+
}
|
|
208
|
+
async function syncGroupsDirtyBit(runtime) {
|
|
209
|
+
await runSyncQuery(runtime, {
|
|
210
|
+
queryContext: 'dirty.groups',
|
|
211
|
+
assertContext: 'groups',
|
|
212
|
+
node: (0, accountSync_1.buildGroupsDirtySyncIq)(),
|
|
213
|
+
logMessage: 'groups dirty sync completed'
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
async function syncNewsletterMetadataDirtyBit(runtime) {
|
|
217
|
+
runtime.logger.info('newsletter_metadata dirty bit received (GraphQL/MEX sync intentionally disabled)');
|
|
218
|
+
await runtime.queryWithContext('dirty.newsletter_metadata', (0, accountSync_1.buildNewsletterMetadataSyncIq)(), constants_1.WA_DEFAULTS.IQ_TIMEOUT_MS);
|
|
219
|
+
}
|
|
220
|
+
async function generateUsyncSid() {
|
|
221
|
+
return (0, bytes_1.bytesToHex)(await (0, _crypto_1.randomBytesAsync)(8));
|
|
222
|
+
}
|
|
223
|
+
function resolveAccountSyncDeviceTargets(credentials) {
|
|
224
|
+
if (!credentials?.meJid) {
|
|
225
|
+
return [];
|
|
226
|
+
}
|
|
227
|
+
const dedup = new Set();
|
|
228
|
+
dedup.add((0, jid_1.toUserJid)(credentials.meJid));
|
|
229
|
+
if (credentials.meLid && credentials.meLid.includes('@')) {
|
|
230
|
+
dedup.add((0, jid_1.toUserJid)(credentials.meLid));
|
|
231
|
+
}
|
|
232
|
+
return [...dedup];
|
|
233
|
+
}
|
|
234
|
+
async function runSyncQuery(runtime, args) {
|
|
235
|
+
const response = await runtime.queryWithContext(args.queryContext, args.node, constants_1.WA_DEFAULTS.IQ_TIMEOUT_MS, args.contextData);
|
|
236
|
+
(0, query_1.assertIqResult)(response, args.assertContext ?? args.queryContext);
|
|
237
|
+
runtime.logger.debug(args.logMessage, args.contextData);
|
|
238
|
+
}
|
|
239
|
+
async function clearDirtyBits(runtime, dirtyBits) {
|
|
240
|
+
try {
|
|
241
|
+
await runtime.queryWithContext('dirty.clear', (0, accountSync_1.buildClearDirtyBitsIq)(dirtyBits), constants_1.WA_DEFAULTS.IQ_TIMEOUT_MS, {
|
|
242
|
+
count: dirtyBits.length
|
|
243
|
+
});
|
|
244
|
+
runtime.logger.info('dirty bits cleared', {
|
|
245
|
+
count: dirtyBits.length
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
runtime.logger.warn('failed to clear dirty bits', {
|
|
250
|
+
count: dirtyBits.length,
|
|
251
|
+
message: (0, primitives_1.toError)(error).message
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseChatEventFromAppStateMutation = parseChatEventFromAppStateMutation;
|
|
4
|
+
function parseChatEventFromAppStateMutation(mutation) {
|
|
5
|
+
const value = mutation.value;
|
|
6
|
+
const parsedIndex = parseMutationIndex(mutation.index);
|
|
7
|
+
if (!parsedIndex?.chatJid) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
const syncActionValueKey = value ? findPresentSyncActionValueKey(value) : null;
|
|
11
|
+
const baseEvent = {
|
|
12
|
+
source: mutation.source,
|
|
13
|
+
collection: mutation.collection,
|
|
14
|
+
operation: mutation.operation,
|
|
15
|
+
mutationIndex: mutation.index,
|
|
16
|
+
indexAction: parsedIndex?.action,
|
|
17
|
+
indexParts: parsedIndex?.parts,
|
|
18
|
+
syncActionValueKey: syncActionValueKey ?? undefined,
|
|
19
|
+
chatJid: parsedIndex?.chatJid,
|
|
20
|
+
timestamp: mutation.timestamp,
|
|
21
|
+
version: mutation.version
|
|
22
|
+
};
|
|
23
|
+
if (value?.archiveChatAction) {
|
|
24
|
+
return {
|
|
25
|
+
...baseEvent,
|
|
26
|
+
action: 'archive',
|
|
27
|
+
...pickOptionalPrimitive('archived', value.archiveChatAction.archived, 'boolean')
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
if (value?.muteAction) {
|
|
31
|
+
return {
|
|
32
|
+
...baseEvent,
|
|
33
|
+
action: 'mute',
|
|
34
|
+
...pickOptionalPrimitive('muted', value.muteAction.muted, 'boolean'),
|
|
35
|
+
...pickOptionalPrimitive('muteEndTimestampMs', parseOptionalLong(value.muteAction.muteEndTimestamp), 'number')
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
if (value?.pinAction) {
|
|
39
|
+
return {
|
|
40
|
+
...baseEvent,
|
|
41
|
+
action: 'pin',
|
|
42
|
+
...pickOptionalPrimitive('pinned', value.pinAction.pinned, 'boolean')
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
if (value?.markChatAsReadAction) {
|
|
46
|
+
return {
|
|
47
|
+
...baseEvent,
|
|
48
|
+
action: 'mark_read',
|
|
49
|
+
...pickOptionalPrimitive('read', value.markChatAsReadAction.read, 'boolean')
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (value?.clearChatAction) {
|
|
53
|
+
return {
|
|
54
|
+
...baseEvent,
|
|
55
|
+
action: 'clear',
|
|
56
|
+
...pickOptionalPrimitive('deleteStarred', parseIndexFlag(parsedIndex?.parts[2]), 'boolean'),
|
|
57
|
+
...pickOptionalPrimitive('deleteMedia', parseIndexFlag(parsedIndex?.parts[3]), 'boolean')
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
if (value?.deleteChatAction) {
|
|
61
|
+
return {
|
|
62
|
+
...baseEvent,
|
|
63
|
+
action: 'delete',
|
|
64
|
+
...pickOptionalPrimitive('deleteMedia', parseIndexFlag(parsedIndex?.parts[2]), 'boolean')
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
if (value?.lockChatAction) {
|
|
68
|
+
return {
|
|
69
|
+
...baseEvent,
|
|
70
|
+
action: 'lock',
|
|
71
|
+
...pickOptionalPrimitive('locked', value.lockChatAction.locked, 'boolean')
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
if (value?.chatAssignment) {
|
|
75
|
+
return {
|
|
76
|
+
...baseEvent,
|
|
77
|
+
action: 'chat_assignment',
|
|
78
|
+
...pickOptionalPrimitive('deviceAgentId', value.chatAssignment.deviceAgentID, 'string')
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
const fallbackAction = normalizeIndexAction(parsedIndex?.action) ??
|
|
82
|
+
normalizeValueActionKey(syncActionValueKey);
|
|
83
|
+
if (!fallbackAction) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
...baseEvent,
|
|
88
|
+
action: fallbackAction
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function parseMutationIndex(index) {
|
|
92
|
+
let parsed;
|
|
93
|
+
try {
|
|
94
|
+
parsed = JSON.parse(index);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
if (!Array.isArray(parsed) || parsed.length === 0) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
const parts = [];
|
|
103
|
+
for (const item of parsed) {
|
|
104
|
+
if (typeof item === 'string') {
|
|
105
|
+
parts.push(item);
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (typeof item === 'number' || typeof item === 'boolean') {
|
|
109
|
+
parts.push(String(item));
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
action: parts[0],
|
|
116
|
+
parts,
|
|
117
|
+
chatJid: extractChatJid(parts)
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function normalizeIndexAction(indexAction) {
|
|
121
|
+
if (!indexAction) {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
switch (indexAction) {
|
|
125
|
+
case 'archive':
|
|
126
|
+
return 'archive';
|
|
127
|
+
case 'mute':
|
|
128
|
+
return 'mute';
|
|
129
|
+
case 'pin':
|
|
130
|
+
case 'pin_v1':
|
|
131
|
+
return 'pin';
|
|
132
|
+
case 'markChatAsRead':
|
|
133
|
+
return 'mark_read';
|
|
134
|
+
case 'clearChat':
|
|
135
|
+
return 'clear';
|
|
136
|
+
case 'deleteChat':
|
|
137
|
+
return 'delete';
|
|
138
|
+
case 'lock':
|
|
139
|
+
return 'lock';
|
|
140
|
+
case 'agentChatAssignment':
|
|
141
|
+
return 'chat_assignment';
|
|
142
|
+
default:
|
|
143
|
+
return toSnakeCase(indexAction);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function normalizeValueActionKey(syncActionValueKey) {
|
|
147
|
+
if (!syncActionValueKey) {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
switch (syncActionValueKey) {
|
|
151
|
+
case 'archiveChatAction':
|
|
152
|
+
return 'archive';
|
|
153
|
+
case 'muteAction':
|
|
154
|
+
return 'mute';
|
|
155
|
+
case 'pinAction':
|
|
156
|
+
return 'pin';
|
|
157
|
+
case 'markChatAsReadAction':
|
|
158
|
+
return 'mark_read';
|
|
159
|
+
case 'clearChatAction':
|
|
160
|
+
return 'clear';
|
|
161
|
+
case 'deleteChatAction':
|
|
162
|
+
return 'delete';
|
|
163
|
+
case 'lockChatAction':
|
|
164
|
+
return 'lock';
|
|
165
|
+
case 'chatAssignment':
|
|
166
|
+
return 'chat_assignment';
|
|
167
|
+
default:
|
|
168
|
+
return toSnakeCase(syncActionValueKey.endsWith('Action')
|
|
169
|
+
? syncActionValueKey.slice(0, -'Action'.length)
|
|
170
|
+
: syncActionValueKey);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
function parseOptionalLong(value) {
|
|
174
|
+
if (value === null || value === undefined) {
|
|
175
|
+
return undefined;
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
const parsed = typeof value === 'number' ? value : value.toNumber();
|
|
179
|
+
if (!Number.isFinite(parsed) || !Number.isSafeInteger(parsed)) {
|
|
180
|
+
return undefined;
|
|
181
|
+
}
|
|
182
|
+
return parsed;
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
return undefined;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function parseIndexFlag(value) {
|
|
189
|
+
if (value === '1') {
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
if (value === '0') {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
return undefined;
|
|
196
|
+
}
|
|
197
|
+
function extractChatJid(parts) {
|
|
198
|
+
for (let index = 1; index < parts.length; index += 1) {
|
|
199
|
+
const value = parts[index];
|
|
200
|
+
if (value.includes('@')) {
|
|
201
|
+
return value;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return undefined;
|
|
205
|
+
}
|
|
206
|
+
function findPresentSyncActionValueKey(value) {
|
|
207
|
+
for (const [key, keyValue] of Object.entries(value)) {
|
|
208
|
+
if (key === 'timestamp') {
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
if (keyValue === null || keyValue === undefined) {
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
return key;
|
|
215
|
+
}
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
function toSnakeCase(value) {
|
|
219
|
+
return value
|
|
220
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1_$2')
|
|
221
|
+
.replace(/-/g, '_')
|
|
222
|
+
.toLowerCase();
|
|
223
|
+
}
|
|
224
|
+
function pickOptionalPrimitive(key, value, type) {
|
|
225
|
+
return typeof value === type ? { [key]: value } : {};
|
|
226
|
+
}
|