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,120 @@
|
|
|
1
|
+
import { WA_DISCONNECT_REASONS, WA_STREAM_SIGNALING } from '../../protocol/constants.js';
|
|
2
|
+
import { toError } from '../../util/primitives.js';
|
|
3
|
+
export function createStreamControlHandler(options) {
|
|
4
|
+
const { logger, getComms, clearPendingQueries, clearMediaConnCache, disconnect, clearStoredCredentials, connect } = options;
|
|
5
|
+
let lifecyclePromise = null;
|
|
6
|
+
const runStreamControlLifecycle = (reason, action) => {
|
|
7
|
+
if (lifecyclePromise) {
|
|
8
|
+
logger.debug('stream-control lifecycle already running', { reason });
|
|
9
|
+
return lifecyclePromise;
|
|
10
|
+
}
|
|
11
|
+
lifecyclePromise = action().finally(() => {
|
|
12
|
+
lifecyclePromise = null;
|
|
13
|
+
});
|
|
14
|
+
return lifecyclePromise;
|
|
15
|
+
};
|
|
16
|
+
const restartBackendAfterStreamControl = async (reason) => {
|
|
17
|
+
logger.info('restarting backend after stream control', { reason });
|
|
18
|
+
try {
|
|
19
|
+
await connect();
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
logger.warn('failed to restart backend after stream control', {
|
|
23
|
+
reason,
|
|
24
|
+
message: toError(error).message
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
const resumeSocketDueToStreamError = async (reason) => {
|
|
29
|
+
const comms = getComms();
|
|
30
|
+
if (!comms) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
logger.info('resuming socket due to stream control node', { reason });
|
|
34
|
+
clearPendingQueries(new Error(`socket resume requested by ${reason}`));
|
|
35
|
+
clearMediaConnCache();
|
|
36
|
+
try {
|
|
37
|
+
await comms.closeSocketAndResume();
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
logger.warn('failed to resume socket for stream control node', {
|
|
41
|
+
reason,
|
|
42
|
+
message: toError(error).message
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
const forceLoginDueToStreamError = async (code) => {
|
|
47
|
+
await runStreamControlLifecycle(`stream_error_code_${code}`, async () => {
|
|
48
|
+
logger.warn('received forced login stream error; starting login lifecycle', {
|
|
49
|
+
code
|
|
50
|
+
});
|
|
51
|
+
await disconnect();
|
|
52
|
+
await clearStoredCredentials();
|
|
53
|
+
await restartBackendAfterStreamControl(`stream_error_code_${code}`);
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
const disconnectDueToStreamError = async (reason) => {
|
|
57
|
+
await runStreamControlLifecycle(reason, async () => {
|
|
58
|
+
logger.warn('disconnecting due to stream control node', { reason });
|
|
59
|
+
await disconnect();
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
const logoutDueToStreamError = async (reason, shouldRestartBackend) => {
|
|
63
|
+
await runStreamControlLifecycle(reason, async () => {
|
|
64
|
+
logger.warn('logging out due to stream control node', {
|
|
65
|
+
reason,
|
|
66
|
+
shouldRestartBackend
|
|
67
|
+
});
|
|
68
|
+
await disconnect();
|
|
69
|
+
await clearStoredCredentials();
|
|
70
|
+
if (shouldRestartBackend) {
|
|
71
|
+
await restartBackendAfterStreamControl(reason);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
return {
|
|
76
|
+
handleStreamControlResult: async (result) => {
|
|
77
|
+
switch (result.kind) {
|
|
78
|
+
case 'xmlstreamend':
|
|
79
|
+
logger.info('received xmlstreamend stanza');
|
|
80
|
+
return;
|
|
81
|
+
case 'stream_error_code':
|
|
82
|
+
logger.warn('received stream:error with code', { code: result.code });
|
|
83
|
+
if (result.code >= 500 && result.code < 600) {
|
|
84
|
+
if (result.code === WA_STREAM_SIGNALING.FORCE_LOGIN_CODE) {
|
|
85
|
+
await forceLoginDueToStreamError(result.code);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (result.code === WA_STREAM_SIGNALING.FORCE_LOGOUT_CODE) {
|
|
89
|
+
await logoutDueToStreamError(`stream_error_code_${WA_STREAM_SIGNALING.FORCE_LOGOUT_CODE}`, true);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
await resumeSocketDueToStreamError(`stream_error_code_${result.code}`);
|
|
94
|
+
return;
|
|
95
|
+
case 'stream_error_replaced':
|
|
96
|
+
logger.warn('received stream:error replaced, stopping client');
|
|
97
|
+
await disconnectDueToStreamError(WA_DISCONNECT_REASONS.STREAM_ERROR_REPLACED);
|
|
98
|
+
return;
|
|
99
|
+
case 'stream_error_device_removed':
|
|
100
|
+
logger.warn('received stream:error device removed, logging out');
|
|
101
|
+
await logoutDueToStreamError(WA_DISCONNECT_REASONS.STREAM_ERROR_DEVICE_REMOVED, false);
|
|
102
|
+
return;
|
|
103
|
+
case 'stream_error_ack':
|
|
104
|
+
logger.warn('received stream:error ack', { id: result.id });
|
|
105
|
+
await resumeSocketDueToStreamError(WA_DISCONNECT_REASONS.STREAM_ERROR_ACK);
|
|
106
|
+
return;
|
|
107
|
+
case 'stream_error_xml_not_well_formed':
|
|
108
|
+
logger.warn('received stream:error xml-not-well-formed');
|
|
109
|
+
await resumeSocketDueToStreamError(WA_DISCONNECT_REASONS.STREAM_ERROR_XML_NOT_WELL_FORMED);
|
|
110
|
+
return;
|
|
111
|
+
case 'stream_error_other':
|
|
112
|
+
logger.warn('received stream:error other');
|
|
113
|
+
await resumeSocketDueToStreamError(WA_DISCONNECT_REASONS.STREAM_ERROR_OTHER);
|
|
114
|
+
return;
|
|
115
|
+
default:
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { randomBytesAsync } from '../crypto/index.js';
|
|
2
|
+
import { WA_ACCOUNT_SYNC_PROTOCOLS, WA_DEFAULTS, WA_DIRTY_PROTOCOLS, WA_DIRTY_TYPES, WA_IQ_TYPES, WA_SUPPORTED_DIRTY_TYPES } from '../protocol/constants.js';
|
|
3
|
+
import { toUserJid } from '../protocol/jid.js';
|
|
4
|
+
import { buildAccountBlocklistSyncIq, buildAccountDevicesSyncIq, buildAccountPictureSyncIq, buildAccountPrivacySyncIq, buildClearDirtyBitsIq, buildGroupsDirtySyncIq, buildNewsletterMetadataSyncIq } from '../transport/node/builders/accountSync.js';
|
|
5
|
+
import { getNodeChildren } from '../transport/node/helpers.js';
|
|
6
|
+
import { assertIqResult, parseIqError } from '../transport/node/query.js';
|
|
7
|
+
import { bytesToHex } from '../util/bytes.js';
|
|
8
|
+
import { toError } from '../util/primitives.js';
|
|
9
|
+
const SUPPORTED_DIRTY_TYPES = new Set(WA_SUPPORTED_DIRTY_TYPES);
|
|
10
|
+
const ACCOUNT_SYNC_PROTOCOL_SET = new Set(WA_ACCOUNT_SYNC_PROTOCOLS);
|
|
11
|
+
function parseDirtyBitNode(node, logger) {
|
|
12
|
+
const type = node.attrs.type;
|
|
13
|
+
const timestamp = Number.parseInt(node.attrs.timestamp ?? '', 10);
|
|
14
|
+
if (!type || !Number.isFinite(timestamp)) {
|
|
15
|
+
logger.warn('received invalid dirty bit node', {
|
|
16
|
+
type,
|
|
17
|
+
timestamp: node.attrs.timestamp
|
|
18
|
+
});
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
const protocols = getNodeChildren(node).map((child) => child.tag);
|
|
22
|
+
return {
|
|
23
|
+
type,
|
|
24
|
+
timestamp,
|
|
25
|
+
protocols
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function splitDirtyBitsBySupport(dirtyBits) {
|
|
29
|
+
return {
|
|
30
|
+
supported: dirtyBits.filter((dirtyBit) => SUPPORTED_DIRTY_TYPES.has(dirtyBit.type)),
|
|
31
|
+
unsupported: dirtyBits.filter((dirtyBit) => !SUPPORTED_DIRTY_TYPES.has(dirtyBit.type))
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function resolveAccountSyncProtocols(protocols) {
|
|
35
|
+
const selected = protocols.filter((protocol) => ACCOUNT_SYNC_PROTOCOL_SET.has(protocol));
|
|
36
|
+
if (selected.length > 0) {
|
|
37
|
+
return selected;
|
|
38
|
+
}
|
|
39
|
+
return WA_ACCOUNT_SYNC_PROTOCOLS;
|
|
40
|
+
}
|
|
41
|
+
export function parseDirtyBits(nodes, logger) {
|
|
42
|
+
return nodes
|
|
43
|
+
.map((node) => parseDirtyBitNode(node, logger))
|
|
44
|
+
.filter((dirtyBit) => dirtyBit !== null);
|
|
45
|
+
}
|
|
46
|
+
export async function handleDirtyBits(runtime, dirtyBits) {
|
|
47
|
+
const meJid = runtime.getCurrentCredentials()?.meJid ?? null;
|
|
48
|
+
if (!meJid) {
|
|
49
|
+
runtime.logger.trace('dirty bits skipped: session is not registered');
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const { supported, unsupported } = splitDirtyBitsBySupport(dirtyBits);
|
|
53
|
+
runtime.logger.info('handling dirty bits from info bulletin', {
|
|
54
|
+
supported: supported.map((entry) => entry.type).join(','),
|
|
55
|
+
unsupported: unsupported.map((entry) => entry.type).join(',')
|
|
56
|
+
});
|
|
57
|
+
const handledSupported = (await Promise.allSettled(supported.map(async (dirtyBit) => handleDirtyBit(runtime, dirtyBit)))).flatMap((result, index) => {
|
|
58
|
+
if (result.status === 'fulfilled') {
|
|
59
|
+
return [supported[index]];
|
|
60
|
+
}
|
|
61
|
+
runtime.logger.warn('failed handling dirty bit', {
|
|
62
|
+
type: supported[index].type,
|
|
63
|
+
message: toError(result.reason).message
|
|
64
|
+
});
|
|
65
|
+
return [];
|
|
66
|
+
});
|
|
67
|
+
await clearDirtyBits(runtime, unsupported.concat(handledSupported));
|
|
68
|
+
}
|
|
69
|
+
async function handleDirtyBit(runtime, dirtyBit) {
|
|
70
|
+
switch (dirtyBit.type) {
|
|
71
|
+
case WA_DIRTY_TYPES.ACCOUNT_SYNC:
|
|
72
|
+
await handleAccountSyncDirtyBit(runtime, dirtyBit.protocols);
|
|
73
|
+
return;
|
|
74
|
+
case WA_DIRTY_TYPES.SYNCD_APP_STATE:
|
|
75
|
+
await handleSyncdAppStateDirtyBit(runtime);
|
|
76
|
+
return;
|
|
77
|
+
case WA_DIRTY_TYPES.GROUPS:
|
|
78
|
+
await syncGroupsDirtyBit(runtime);
|
|
79
|
+
return;
|
|
80
|
+
case WA_DIRTY_TYPES.NEWSLETTER_METADATA:
|
|
81
|
+
await syncNewsletterMetadataDirtyBit(runtime);
|
|
82
|
+
return;
|
|
83
|
+
default:
|
|
84
|
+
runtime.logger.debug('received unsupported dirty bit', {
|
|
85
|
+
type: dirtyBit.type
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async function handleAccountSyncDirtyBit(runtime, protocols) {
|
|
90
|
+
const selectedProtocols = resolveAccountSyncProtocols(protocols);
|
|
91
|
+
runtime.logger.info('received account_sync dirty bit', {
|
|
92
|
+
protocols: selectedProtocols.join(',')
|
|
93
|
+
});
|
|
94
|
+
const failures = [];
|
|
95
|
+
await Promise.all(selectedProtocols.map(async (protocol) => {
|
|
96
|
+
try {
|
|
97
|
+
await runAccountSyncProtocol(runtime, protocol);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
failures.push(protocol);
|
|
101
|
+
runtime.logger.warn('account_sync protocol failed', {
|
|
102
|
+
protocol,
|
|
103
|
+
message: toError(error).message
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}));
|
|
107
|
+
if (failures.length > 0) {
|
|
108
|
+
throw new Error(`account_sync protocols failed: ${failures.join(',')}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async function runAccountSyncProtocol(runtime, protocol) {
|
|
112
|
+
switch (protocol) {
|
|
113
|
+
case WA_DIRTY_PROTOCOLS.DEVICES:
|
|
114
|
+
await syncAccountDevicesDirtyBit(runtime);
|
|
115
|
+
return;
|
|
116
|
+
case WA_DIRTY_PROTOCOLS.PICTURE:
|
|
117
|
+
await syncAccountPictureDirtyBit(runtime);
|
|
118
|
+
return;
|
|
119
|
+
case WA_DIRTY_PROTOCOLS.PRIVACY:
|
|
120
|
+
await syncAccountPrivacyDirtyBit(runtime);
|
|
121
|
+
return;
|
|
122
|
+
case WA_DIRTY_PROTOCOLS.BLOCKLIST:
|
|
123
|
+
await syncAccountBlocklistDirtyBit(runtime);
|
|
124
|
+
return;
|
|
125
|
+
case WA_DIRTY_PROTOCOLS.NOTICE:
|
|
126
|
+
await syncAccountNoticeDirtyBit(runtime);
|
|
127
|
+
return;
|
|
128
|
+
default:
|
|
129
|
+
runtime.logger.debug('unsupported account_sync protocol', {
|
|
130
|
+
protocol
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async function handleSyncdAppStateDirtyBit(runtime) {
|
|
135
|
+
runtime.logger.info('received syncd_app_state dirty bit, starting sync');
|
|
136
|
+
await runtime.syncAppState();
|
|
137
|
+
}
|
|
138
|
+
async function syncAccountDevicesDirtyBit(runtime) {
|
|
139
|
+
const credentials = runtime.getCurrentCredentials();
|
|
140
|
+
const meJid = credentials?.meJid ?? null;
|
|
141
|
+
if (!meJid) {
|
|
142
|
+
runtime.logger.warn('account_sync devices skipped: meJid is missing');
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const userJids = resolveAccountSyncDeviceTargets(credentials);
|
|
146
|
+
if (userJids.length === 0) {
|
|
147
|
+
runtime.logger.warn('account_sync devices skipped: no valid account_sync targets');
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
await runSyncQuery(runtime, {
|
|
151
|
+
queryContext: 'account_sync.devices',
|
|
152
|
+
node: buildAccountDevicesSyncIq(userJids, await generateUsyncSid()),
|
|
153
|
+
logMessage: 'account_sync devices synchronized',
|
|
154
|
+
contextData: { meJid, targets: userJids.join(',') }
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
async function syncAccountPictureDirtyBit(runtime) {
|
|
158
|
+
const meJid = runtime.getCurrentCredentials()?.meJid ?? null;
|
|
159
|
+
if (!meJid) {
|
|
160
|
+
runtime.logger.warn('account_sync picture skipped: meJid is missing');
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const targetJid = toUserJid(meJid);
|
|
164
|
+
const response = await runtime.queryWithContext('account_sync.picture', buildAccountPictureSyncIq(targetJid), WA_DEFAULTS.IQ_TIMEOUT_MS, { meJid, target: targetJid });
|
|
165
|
+
if (response.tag !== 'iq') {
|
|
166
|
+
throw new Error(`account_sync.picture returned non-iq node (${response.tag})`);
|
|
167
|
+
}
|
|
168
|
+
if (response.attrs.type === WA_IQ_TYPES.RESULT) {
|
|
169
|
+
runtime.logger.debug('account_sync picture synchronized', {
|
|
170
|
+
meJid,
|
|
171
|
+
target: targetJid
|
|
172
|
+
});
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
const iqError = parseIqError(response);
|
|
176
|
+
const isPictureMissing = (iqError.numericCode === 404 || iqError.code === '404') &&
|
|
177
|
+
iqError.text.toLowerCase() === 'item-not-found';
|
|
178
|
+
if (isPictureMissing) {
|
|
179
|
+
runtime.logger.debug('account_sync picture skipped: no profile picture found', {
|
|
180
|
+
meJid,
|
|
181
|
+
target: targetJid
|
|
182
|
+
});
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
throw new Error(`account_sync.picture iq failed (${iqError.code}: ${iqError.text})`);
|
|
186
|
+
}
|
|
187
|
+
async function syncAccountPrivacyDirtyBit(runtime) {
|
|
188
|
+
await runSyncQuery(runtime, {
|
|
189
|
+
queryContext: 'account_sync.privacy',
|
|
190
|
+
node: buildAccountPrivacySyncIq(),
|
|
191
|
+
logMessage: 'account_sync privacy synchronized'
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
async function syncAccountBlocklistDirtyBit(runtime) {
|
|
195
|
+
await runSyncQuery(runtime, {
|
|
196
|
+
queryContext: 'account_sync.blocklist',
|
|
197
|
+
node: buildAccountBlocklistSyncIq(),
|
|
198
|
+
logMessage: 'account_sync blocklist synchronized'
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
async function syncAccountNoticeDirtyBit(runtime) {
|
|
202
|
+
runtime.logger.info('account_sync notice protocol received (no GraphQL/MEX job configured)');
|
|
203
|
+
}
|
|
204
|
+
async function syncGroupsDirtyBit(runtime) {
|
|
205
|
+
await runSyncQuery(runtime, {
|
|
206
|
+
queryContext: 'dirty.groups',
|
|
207
|
+
assertContext: 'groups',
|
|
208
|
+
node: buildGroupsDirtySyncIq(),
|
|
209
|
+
logMessage: 'groups dirty sync completed'
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
async function syncNewsletterMetadataDirtyBit(runtime) {
|
|
213
|
+
runtime.logger.info('newsletter_metadata dirty bit received (GraphQL/MEX sync intentionally disabled)');
|
|
214
|
+
await runtime.queryWithContext('dirty.newsletter_metadata', buildNewsletterMetadataSyncIq(), WA_DEFAULTS.IQ_TIMEOUT_MS);
|
|
215
|
+
}
|
|
216
|
+
async function generateUsyncSid() {
|
|
217
|
+
return bytesToHex(await randomBytesAsync(8));
|
|
218
|
+
}
|
|
219
|
+
function resolveAccountSyncDeviceTargets(credentials) {
|
|
220
|
+
if (!credentials?.meJid) {
|
|
221
|
+
return [];
|
|
222
|
+
}
|
|
223
|
+
const dedup = new Set();
|
|
224
|
+
dedup.add(toUserJid(credentials.meJid));
|
|
225
|
+
if (credentials.meLid && credentials.meLid.includes('@')) {
|
|
226
|
+
dedup.add(toUserJid(credentials.meLid));
|
|
227
|
+
}
|
|
228
|
+
return [...dedup];
|
|
229
|
+
}
|
|
230
|
+
async function runSyncQuery(runtime, args) {
|
|
231
|
+
const response = await runtime.queryWithContext(args.queryContext, args.node, WA_DEFAULTS.IQ_TIMEOUT_MS, args.contextData);
|
|
232
|
+
assertIqResult(response, args.assertContext ?? args.queryContext);
|
|
233
|
+
runtime.logger.debug(args.logMessage, args.contextData);
|
|
234
|
+
}
|
|
235
|
+
async function clearDirtyBits(runtime, dirtyBits) {
|
|
236
|
+
try {
|
|
237
|
+
await runtime.queryWithContext('dirty.clear', buildClearDirtyBitsIq(dirtyBits), WA_DEFAULTS.IQ_TIMEOUT_MS, {
|
|
238
|
+
count: dirtyBits.length
|
|
239
|
+
});
|
|
240
|
+
runtime.logger.info('dirty bits cleared', {
|
|
241
|
+
count: dirtyBits.length
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
runtime.logger.warn('failed to clear dirty bits', {
|
|
246
|
+
count: dirtyBits.length,
|
|
247
|
+
message: toError(error).message
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
export function parseChatEventFromAppStateMutation(mutation) {
|
|
2
|
+
const value = mutation.value;
|
|
3
|
+
const parsedIndex = parseMutationIndex(mutation.index);
|
|
4
|
+
if (!parsedIndex?.chatJid) {
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
7
|
+
const syncActionValueKey = value ? findPresentSyncActionValueKey(value) : null;
|
|
8
|
+
const baseEvent = {
|
|
9
|
+
source: mutation.source,
|
|
10
|
+
collection: mutation.collection,
|
|
11
|
+
operation: mutation.operation,
|
|
12
|
+
mutationIndex: mutation.index,
|
|
13
|
+
indexAction: parsedIndex?.action,
|
|
14
|
+
indexParts: parsedIndex?.parts,
|
|
15
|
+
syncActionValueKey: syncActionValueKey ?? undefined,
|
|
16
|
+
chatJid: parsedIndex?.chatJid,
|
|
17
|
+
timestamp: mutation.timestamp,
|
|
18
|
+
version: mutation.version
|
|
19
|
+
};
|
|
20
|
+
if (value?.archiveChatAction) {
|
|
21
|
+
return {
|
|
22
|
+
...baseEvent,
|
|
23
|
+
action: 'archive',
|
|
24
|
+
...pickOptionalPrimitive('archived', value.archiveChatAction.archived, 'boolean')
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
if (value?.muteAction) {
|
|
28
|
+
return {
|
|
29
|
+
...baseEvent,
|
|
30
|
+
action: 'mute',
|
|
31
|
+
...pickOptionalPrimitive('muted', value.muteAction.muted, 'boolean'),
|
|
32
|
+
...pickOptionalPrimitive('muteEndTimestampMs', parseOptionalLong(value.muteAction.muteEndTimestamp), 'number')
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
if (value?.pinAction) {
|
|
36
|
+
return {
|
|
37
|
+
...baseEvent,
|
|
38
|
+
action: 'pin',
|
|
39
|
+
...pickOptionalPrimitive('pinned', value.pinAction.pinned, 'boolean')
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
if (value?.markChatAsReadAction) {
|
|
43
|
+
return {
|
|
44
|
+
...baseEvent,
|
|
45
|
+
action: 'mark_read',
|
|
46
|
+
...pickOptionalPrimitive('read', value.markChatAsReadAction.read, 'boolean')
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
if (value?.clearChatAction) {
|
|
50
|
+
return {
|
|
51
|
+
...baseEvent,
|
|
52
|
+
action: 'clear',
|
|
53
|
+
...pickOptionalPrimitive('deleteStarred', parseIndexFlag(parsedIndex?.parts[2]), 'boolean'),
|
|
54
|
+
...pickOptionalPrimitive('deleteMedia', parseIndexFlag(parsedIndex?.parts[3]), 'boolean')
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
if (value?.deleteChatAction) {
|
|
58
|
+
return {
|
|
59
|
+
...baseEvent,
|
|
60
|
+
action: 'delete',
|
|
61
|
+
...pickOptionalPrimitive('deleteMedia', parseIndexFlag(parsedIndex?.parts[2]), 'boolean')
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
if (value?.lockChatAction) {
|
|
65
|
+
return {
|
|
66
|
+
...baseEvent,
|
|
67
|
+
action: 'lock',
|
|
68
|
+
...pickOptionalPrimitive('locked', value.lockChatAction.locked, 'boolean')
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
if (value?.chatAssignment) {
|
|
72
|
+
return {
|
|
73
|
+
...baseEvent,
|
|
74
|
+
action: 'chat_assignment',
|
|
75
|
+
...pickOptionalPrimitive('deviceAgentId', value.chatAssignment.deviceAgentID, 'string')
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
const fallbackAction = normalizeIndexAction(parsedIndex?.action) ??
|
|
79
|
+
normalizeValueActionKey(syncActionValueKey);
|
|
80
|
+
if (!fallbackAction) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
...baseEvent,
|
|
85
|
+
action: fallbackAction
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function parseMutationIndex(index) {
|
|
89
|
+
let parsed;
|
|
90
|
+
try {
|
|
91
|
+
parsed = JSON.parse(index);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
if (!Array.isArray(parsed) || parsed.length === 0) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
const parts = [];
|
|
100
|
+
for (const item of parsed) {
|
|
101
|
+
if (typeof item === 'string') {
|
|
102
|
+
parts.push(item);
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (typeof item === 'number' || typeof item === 'boolean') {
|
|
106
|
+
parts.push(String(item));
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
action: parts[0],
|
|
113
|
+
parts,
|
|
114
|
+
chatJid: extractChatJid(parts)
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
function normalizeIndexAction(indexAction) {
|
|
118
|
+
if (!indexAction) {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
switch (indexAction) {
|
|
122
|
+
case 'archive':
|
|
123
|
+
return 'archive';
|
|
124
|
+
case 'mute':
|
|
125
|
+
return 'mute';
|
|
126
|
+
case 'pin':
|
|
127
|
+
case 'pin_v1':
|
|
128
|
+
return 'pin';
|
|
129
|
+
case 'markChatAsRead':
|
|
130
|
+
return 'mark_read';
|
|
131
|
+
case 'clearChat':
|
|
132
|
+
return 'clear';
|
|
133
|
+
case 'deleteChat':
|
|
134
|
+
return 'delete';
|
|
135
|
+
case 'lock':
|
|
136
|
+
return 'lock';
|
|
137
|
+
case 'agentChatAssignment':
|
|
138
|
+
return 'chat_assignment';
|
|
139
|
+
default:
|
|
140
|
+
return toSnakeCase(indexAction);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function normalizeValueActionKey(syncActionValueKey) {
|
|
144
|
+
if (!syncActionValueKey) {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
switch (syncActionValueKey) {
|
|
148
|
+
case 'archiveChatAction':
|
|
149
|
+
return 'archive';
|
|
150
|
+
case 'muteAction':
|
|
151
|
+
return 'mute';
|
|
152
|
+
case 'pinAction':
|
|
153
|
+
return 'pin';
|
|
154
|
+
case 'markChatAsReadAction':
|
|
155
|
+
return 'mark_read';
|
|
156
|
+
case 'clearChatAction':
|
|
157
|
+
return 'clear';
|
|
158
|
+
case 'deleteChatAction':
|
|
159
|
+
return 'delete';
|
|
160
|
+
case 'lockChatAction':
|
|
161
|
+
return 'lock';
|
|
162
|
+
case 'chatAssignment':
|
|
163
|
+
return 'chat_assignment';
|
|
164
|
+
default:
|
|
165
|
+
return toSnakeCase(syncActionValueKey.endsWith('Action')
|
|
166
|
+
? syncActionValueKey.slice(0, -'Action'.length)
|
|
167
|
+
: syncActionValueKey);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
function parseOptionalLong(value) {
|
|
171
|
+
if (value === null || value === undefined) {
|
|
172
|
+
return undefined;
|
|
173
|
+
}
|
|
174
|
+
try {
|
|
175
|
+
const parsed = typeof value === 'number' ? value : value.toNumber();
|
|
176
|
+
if (!Number.isFinite(parsed) || !Number.isSafeInteger(parsed)) {
|
|
177
|
+
return undefined;
|
|
178
|
+
}
|
|
179
|
+
return parsed;
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return undefined;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function parseIndexFlag(value) {
|
|
186
|
+
if (value === '1') {
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
189
|
+
if (value === '0') {
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
return undefined;
|
|
193
|
+
}
|
|
194
|
+
function extractChatJid(parts) {
|
|
195
|
+
for (let index = 1; index < parts.length; index += 1) {
|
|
196
|
+
const value = parts[index];
|
|
197
|
+
if (value.includes('@')) {
|
|
198
|
+
return value;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return undefined;
|
|
202
|
+
}
|
|
203
|
+
function findPresentSyncActionValueKey(value) {
|
|
204
|
+
for (const [key, keyValue] of Object.entries(value)) {
|
|
205
|
+
if (key === 'timestamp') {
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
if (keyValue === null || keyValue === undefined) {
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
return key;
|
|
212
|
+
}
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
function toSnakeCase(value) {
|
|
216
|
+
return value
|
|
217
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1_$2')
|
|
218
|
+
.replace(/-/g, '_')
|
|
219
|
+
.toLowerCase();
|
|
220
|
+
}
|
|
221
|
+
function pickOptionalPrimitive(key, value, type) {
|
|
222
|
+
return typeof value === type ? { [key]: value } : {};
|
|
223
|
+
}
|