zapo-js 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -7
- package/dist/appstate/WaAppStateCrypto.js +18 -25
- package/dist/appstate/WaAppStateSyncClient.js +181 -114
- package/dist/appstate/WaAppStateSyncResponseParser.js +16 -5
- package/dist/appstate/constants.js +4 -3
- package/dist/appstate/utils.js +10 -30
- package/dist/auth/WaAuthClient.js +48 -55
- package/dist/auth/flow/WaAuthCredentialsFlow.js +21 -14
- package/dist/auth/index.js +1 -3
- package/dist/auth/pairing/WaPairingFlow.js +21 -23
- package/dist/auth/pairing/WaQrFlow.js +37 -24
- package/dist/client/WaClient.js +103 -276
- package/dist/client/WaClientFactory.js +227 -110
- package/dist/client/connection/WaConnectionManager.js +292 -0
- package/dist/client/connection/WaKeyShareCoordinator.js +63 -0
- package/dist/client/connection/WaReceiptQueue.js +51 -0
- package/dist/client/coordinators/WaAppStateMutationCoordinator.js +471 -0
- package/dist/client/coordinators/WaGroupCoordinator.js +27 -17
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +20 -27
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +231 -686
- package/dist/client/coordinators/WaRetryCoordinator.js +70 -37
- package/dist/client/dirty.js +35 -29
- package/dist/client/events/chat.js +4 -3
- package/dist/client/events/group.js +59 -36
- package/dist/client/history-sync.js +53 -63
- package/dist/client/incoming.js +23 -20
- package/dist/client/mailbox.js +8 -8
- package/dist/client/messages.js +4 -4
- package/dist/client/messaging/fanout.js +189 -0
- package/dist/client/messaging/key-protocol.js +130 -0
- package/dist/client/messaging/participants.js +191 -0
- package/dist/crypto/core/hkdf.js +3 -8
- package/dist/crypto/core/index.js +1 -4
- package/dist/crypto/core/keys.js +2 -3
- package/dist/crypto/core/primitives.js +12 -15
- package/dist/crypto/core/random.js +7 -26
- package/dist/crypto/curves/Ed25519.js +7 -8
- package/dist/crypto/curves/X25519.js +13 -16
- package/dist/crypto/index.js +0 -5
- package/dist/esm/appstate/WaAppStateCrypto.js +6 -13
- package/dist/esm/appstate/WaAppStateSyncClient.js +174 -107
- package/dist/esm/appstate/WaAppStateSyncResponseParser.js +17 -6
- package/dist/esm/appstate/constants.js +3 -2
- package/dist/esm/appstate/utils.js +8 -27
- package/dist/esm/auth/WaAuthClient.js +48 -55
- package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +21 -14
- package/dist/esm/auth/index.js +0 -1
- package/dist/esm/auth/pairing/WaPairingFlow.js +14 -16
- package/dist/esm/auth/pairing/WaQrFlow.js +37 -24
- package/dist/esm/client/WaClient.js +103 -276
- package/dist/esm/client/WaClientFactory.js +227 -110
- package/dist/esm/client/connection/WaConnectionManager.js +288 -0
- package/dist/esm/client/connection/WaKeyShareCoordinator.js +59 -0
- package/dist/esm/client/connection/WaReceiptQueue.js +47 -0
- package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +467 -0
- package/dist/esm/client/coordinators/WaGroupCoordinator.js +20 -10
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +20 -27
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +232 -687
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +71 -38
- package/dist/esm/client/dirty.js +30 -24
- package/dist/esm/client/events/chat.js +4 -3
- package/dist/esm/client/events/group.js +50 -28
- package/dist/esm/client/history-sync.js +50 -60
- package/dist/esm/client/incoming.js +23 -20
- package/dist/esm/client/mailbox.js +8 -8
- package/dist/esm/client/messages.js +1 -1
- package/dist/esm/client/messaging/fanout.js +186 -0
- package/dist/esm/client/messaging/key-protocol.js +127 -0
- package/dist/esm/client/messaging/participants.js +188 -0
- package/dist/esm/crypto/core/hkdf.js +3 -8
- package/dist/esm/crypto/core/index.js +0 -1
- package/dist/esm/crypto/core/keys.js +2 -3
- package/dist/esm/crypto/core/primitives.js +12 -15
- package/dist/esm/crypto/core/random.js +6 -25
- package/dist/esm/crypto/curves/Ed25519.js +4 -5
- package/dist/esm/crypto/curves/X25519.js +10 -13
- package/dist/esm/crypto/index.js +0 -2
- package/dist/esm/infra/log/ConsoleLogger.js +18 -17
- package/dist/esm/infra/log/PinoLogger.js +15 -9
- package/dist/esm/infra/log/types.js +11 -1
- package/dist/esm/infra/perf/BoundedTaskQueue.js +13 -17
- package/dist/esm/media/WaMediaCrypto.js +2 -4
- package/dist/esm/media/WaMediaTransferClient.js +226 -58
- package/dist/esm/media/conn.js +10 -6
- package/dist/esm/media/constants.js +4 -1
- package/dist/esm/message/WaMessageClient.js +4 -13
- package/dist/esm/message/ack.js +6 -6
- package/dist/esm/message/addon-crypto.js +59 -0
- package/dist/esm/message/incoming.js +106 -111
- package/dist/esm/message/index.js +2 -0
- package/dist/esm/message/reporting-token.js +438 -0
- package/dist/esm/message/use-case-secret.js +49 -0
- package/dist/esm/protocol/appstate.js +58 -0
- package/dist/esm/protocol/constants.js +2 -1
- package/dist/esm/protocol/index.js +2 -10
- package/dist/esm/protocol/jid.js +63 -51
- package/dist/esm/protocol/media.js +3 -3
- package/dist/esm/protocol/nodes.js +2 -0
- package/dist/esm/protocol/usync.js +11 -0
- package/dist/esm/retry/index.js +1 -0
- package/dist/esm/retry/outbound.js +4 -5
- package/dist/esm/retry/parse.js +58 -76
- package/dist/esm/retry/replay.js +48 -49
- package/dist/esm/retry/tracker.js +56 -0
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +249 -82
- package/dist/esm/signal/api/SignalDigestSyncApi.js +6 -1
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +49 -34
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +70 -62
- package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -30
- package/dist/esm/signal/crypto/WaAdvSignature.js +3 -5
- package/dist/esm/signal/group/SenderKeyChain.js +28 -23
- package/dist/esm/signal/group/SenderKeyCodec.js +2 -4
- package/dist/esm/signal/group/SenderKeyManager.js +26 -16
- package/dist/esm/signal/index.js +1 -0
- package/dist/esm/signal/session/SignalProtocol.js +49 -14
- package/dist/esm/signal/session/SignalRatchet.js +24 -15
- package/dist/esm/signal/session/SignalSession.js +14 -9
- package/dist/esm/signal/session/resolver.js +186 -0
- package/dist/esm/signal/store/sqlite.js +16 -37
- package/dist/esm/store/createStore.js +16 -18
- package/dist/esm/store/noop.store.js +3 -6
- package/dist/esm/store/providers/memory/appstate.store.js +30 -6
- package/dist/esm/store/providers/memory/contact.store.js +5 -0
- package/dist/esm/store/providers/memory/device-list.store.js +3 -30
- package/dist/esm/store/providers/memory/message.store.js +11 -5
- package/dist/esm/store/providers/memory/participants.store.js +1 -8
- package/dist/esm/store/providers/memory/sender-key.store.js +5 -7
- package/dist/esm/store/providers/memory/signal.store.js +13 -1
- package/dist/esm/store/providers/memory/thread.store.js +5 -0
- package/dist/esm/store/providers/sqlite/appstate.store.js +82 -1
- package/dist/esm/store/providers/sqlite/connection.js +18 -13
- package/dist/esm/store/providers/sqlite/contact.store.js +31 -18
- package/dist/esm/store/providers/sqlite/device-list.store.js +7 -35
- package/dist/esm/store/providers/sqlite/message.store.js +45 -32
- package/dist/esm/store/providers/sqlite/migrations.js +1 -1
- package/dist/esm/store/providers/sqlite/participants.store.js +1 -9
- package/dist/esm/store/providers/sqlite/retry.store.js +8 -11
- package/dist/esm/store/providers/sqlite/sender-key.store.js +25 -30
- package/dist/esm/store/providers/sqlite/signal.store.js +104 -22
- package/dist/esm/store/providers/sqlite/table-names.js +107 -0
- package/dist/esm/store/providers/sqlite/thread.store.js +35 -22
- package/dist/esm/transport/WaComms.js +25 -23
- package/dist/esm/transport/WaWebSocket.js +115 -12
- package/dist/esm/transport/binary/decoder.js +4 -4
- package/dist/esm/transport/binary/encoder.js +12 -4
- package/dist/esm/transport/index.js +1 -0
- package/dist/esm/transport/keepalive/WaKeepAlive.js +2 -8
- package/dist/esm/transport/node/WaNodeOrchestrator.js +2 -4
- package/dist/esm/transport/node/WaNodeTransport.js +0 -3
- package/dist/esm/transport/node/builders/{accountSync.js → account-sync.js} +16 -36
- package/dist/esm/transport/node/builders/index.js +2 -1
- package/dist/esm/transport/node/builders/message.js +9 -0
- package/dist/esm/transport/node/builders/pairing.js +4 -5
- package/dist/esm/transport/node/builders/usync.js +41 -0
- package/dist/esm/transport/node/helpers.js +107 -5
- package/dist/esm/transport/node/usync.js +35 -0
- package/dist/esm/transport/noise/WaFrameCodec.js +48 -33
- package/dist/esm/transport/noise/WaNoiseCert.js +3 -6
- package/dist/esm/transport/noise/WaNoiseSession.js +17 -10
- package/dist/esm/transport/proxy.js +27 -0
- package/dist/esm/transport/stream/parse.js +13 -48
- package/dist/esm/util/bytes.js +50 -32
- package/dist/esm/util/coercion.js +6 -14
- package/dist/esm/util/primitives.js +39 -14
- package/dist/infra/log/ConsoleLogger.js +18 -17
- package/dist/infra/log/PinoLogger.js +15 -9
- package/dist/infra/log/types.js +12 -0
- package/dist/infra/perf/BoundedTaskQueue.js +13 -17
- package/dist/media/WaMediaCrypto.js +1 -3
- package/dist/media/WaMediaTransferClient.js +259 -58
- package/dist/media/conn.js +10 -6
- package/dist/media/constants.js +4 -1
- package/dist/message/WaMessageClient.js +5 -14
- package/dist/message/ack.js +6 -6
- package/dist/message/addon-crypto.js +65 -0
- package/dist/message/incoming.js +104 -109
- package/dist/message/index.js +2 -0
- package/dist/message/reporting-token.js +443 -0
- package/dist/message/use-case-secret.js +55 -0
- package/dist/protocol/appstate.js +59 -1
- package/dist/protocol/constants.js +7 -1
- package/dist/protocol/index.js +20 -42
- package/dist/protocol/jid.js +64 -51
- package/dist/protocol/media.js +3 -3
- package/dist/protocol/nodes.js +2 -0
- package/dist/protocol/usync.js +14 -0
- package/dist/retry/index.js +3 -1
- package/dist/retry/outbound.js +6 -7
- package/dist/retry/parse.js +57 -75
- package/dist/retry/replay.js +46 -47
- package/dist/retry/tracker.js +59 -0
- package/dist/signal/api/SignalDeviceSyncApi.js +247 -80
- package/dist/signal/api/SignalDigestSyncApi.js +6 -1
- package/dist/signal/api/SignalIdentitySyncApi.js +49 -34
- package/dist/signal/api/SignalMissingPreKeysSyncApi.js +67 -59
- package/dist/signal/api/SignalSessionSyncApi.js +23 -30
- package/dist/signal/crypto/WaAdvSignature.js +2 -4
- package/dist/signal/group/SenderKeyChain.js +27 -22
- package/dist/signal/group/SenderKeyCodec.js +1 -3
- package/dist/signal/group/SenderKeyManager.js +26 -16
- package/dist/signal/index.js +3 -1
- package/dist/signal/session/SignalProtocol.js +49 -14
- package/dist/signal/session/SignalRatchet.js +24 -15
- package/dist/signal/session/SignalSession.js +14 -9
- package/dist/signal/session/resolver.js +189 -0
- package/dist/signal/store/sqlite.js +16 -37
- package/dist/store/createStore.js +16 -18
- package/dist/store/noop.store.js +3 -6
- package/dist/store/providers/memory/appstate.store.js +28 -4
- package/dist/store/providers/memory/contact.store.js +5 -0
- package/dist/store/providers/memory/device-list.store.js +3 -30
- package/dist/store/providers/memory/message.store.js +11 -5
- package/dist/store/providers/memory/participants.store.js +1 -8
- package/dist/store/providers/memory/sender-key.store.js +8 -10
- package/dist/store/providers/memory/signal.store.js +21 -9
- package/dist/store/providers/memory/thread.store.js +5 -0
- package/dist/store/providers/sqlite/appstate.store.js +81 -0
- package/dist/store/providers/sqlite/connection.js +18 -13
- package/dist/store/providers/sqlite/contact.store.js +31 -18
- package/dist/store/providers/sqlite/device-list.store.js +7 -35
- package/dist/store/providers/sqlite/message.store.js +45 -32
- package/dist/store/providers/sqlite/migrations.js +1 -1
- package/dist/store/providers/sqlite/participants.store.js +1 -9
- package/dist/store/providers/sqlite/retry.store.js +8 -11
- package/dist/store/providers/sqlite/sender-key.store.js +24 -29
- package/dist/store/providers/sqlite/signal.store.js +105 -23
- package/dist/store/providers/sqlite/table-names.js +113 -0
- package/dist/store/providers/sqlite/thread.store.js +35 -22
- package/dist/transport/WaComms.js +27 -25
- package/dist/transport/WaWebSocket.js +148 -12
- package/dist/transport/binary/decoder.js +4 -4
- package/dist/transport/binary/encoder.js +12 -4
- package/dist/transport/index.js +7 -1
- package/dist/transport/keepalive/WaKeepAlive.js +1 -7
- package/dist/transport/node/WaNodeOrchestrator.js +2 -4
- package/dist/transport/node/WaNodeTransport.js +0 -3
- package/dist/transport/node/builders/{accountSync.js → account-sync.js} +15 -35
- package/dist/transport/node/builders/index.js +12 -9
- package/dist/transport/node/builders/message.js +9 -0
- package/dist/transport/node/builders/pairing.js +4 -5
- package/dist/transport/node/builders/usync.js +45 -0
- package/dist/transport/node/helpers.js +112 -4
- package/dist/transport/node/usync.js +38 -0
- package/dist/transport/noise/WaFrameCodec.js +47 -32
- package/dist/transport/noise/WaNoiseCert.js +5 -8
- package/dist/transport/noise/WaNoiseSession.js +17 -10
- package/dist/transport/proxy.js +34 -0
- package/dist/transport/stream/parse.js +17 -53
- package/dist/types/appstate/WaAppStateCrypto.d.ts +0 -1
- package/dist/types/appstate/WaAppStateSyncClient.d.ts +5 -2
- package/dist/types/appstate/constants.d.ts +1 -0
- package/dist/types/appstate/store/sqlite.d.ts +4 -18
- package/dist/types/appstate/utils.d.ts +0 -1
- package/dist/types/auth/WaAuthClient.d.ts +10 -12
- package/dist/types/auth/index.d.ts +0 -2
- package/dist/types/auth/pairing/WaQrFlow.d.ts +1 -1
- package/dist/types/auth/types.d.ts +6 -9
- package/dist/types/client/WaClient.d.ts +27 -25
- package/dist/types/client/WaClientFactory.d.ts +22 -23
- package/dist/types/client/connection/WaConnectionManager.d.ts +64 -0
- package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +14 -0
- package/dist/types/client/connection/WaReceiptQueue.d.ts +13 -0
- package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +46 -0
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +0 -1
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +18 -41
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +2 -0
- package/dist/types/client/dirty.d.ts +1 -0
- package/dist/types/client/events/group.d.ts +2 -1
- package/dist/types/client/index.d.ts +1 -1
- package/dist/types/client/messaging/fanout.d.ts +14 -0
- package/dist/types/client/messaging/key-protocol.d.ts +18 -0
- package/dist/types/client/messaging/participants.d.ts +13 -0
- package/dist/types/client/types.d.ts +24 -1
- package/dist/types/crypto/core/hkdf.d.ts +0 -6
- package/dist/types/crypto/core/index.d.ts +0 -1
- package/dist/types/crypto/core/random.d.ts +1 -7
- package/dist/types/crypto/index.d.ts +0 -2
- package/dist/types/index.d.ts +1 -1
- package/dist/types/infra/log/ConsoleLogger.d.ts +2 -1
- package/dist/types/infra/log/PinoLogger.d.ts +1 -1
- package/dist/types/infra/log/types.d.ts +1 -0
- package/dist/types/infra/perf/BoundedTaskQueue.d.ts +1 -1
- package/dist/types/media/WaMediaTransferClient.d.ts +13 -3
- package/dist/types/media/types.d.ts +5 -0
- package/dist/types/message/addon-crypto.d.ts +25 -0
- package/dist/types/message/index.d.ts +2 -0
- package/dist/types/message/reporting-token.d.ts +19 -0
- package/dist/types/message/use-case-secret.d.ts +20 -0
- package/dist/types/protocol/appstate.d.ts +58 -0
- package/dist/types/protocol/constants.d.ts +2 -1
- package/dist/types/protocol/index.d.ts +2 -10
- package/dist/types/protocol/jid.d.ts +3 -3
- package/dist/types/protocol/nodes.d.ts +2 -0
- package/dist/types/protocol/usync.d.ts +11 -0
- package/dist/types/retry/index.d.ts +1 -0
- package/dist/types/retry/replay.d.ts +0 -4
- package/dist/types/retry/tracker.d.ts +19 -0
- package/dist/types/retry/types.d.ts +4 -3
- package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +13 -1
- package/dist/types/signal/group/SenderKeyCodec.d.ts +4 -6
- package/dist/types/signal/index.d.ts +1 -0
- package/dist/types/signal/session/SignalProtocol.d.ts +9 -0
- package/dist/types/signal/session/resolver.d.ts +17 -0
- package/dist/types/store/contracts/appstate.store.d.ts +3 -0
- package/dist/types/store/contracts/contact.store.d.ts +1 -0
- package/dist/types/store/contracts/device-list.store.d.ts +0 -3
- package/dist/types/store/contracts/message.store.d.ts +1 -0
- package/dist/types/store/contracts/participants.store.d.ts +0 -1
- package/dist/types/store/contracts/sender-key.store.d.ts +0 -1
- package/dist/types/store/contracts/signal.store.d.ts +6 -0
- package/dist/types/store/contracts/thread.store.d.ts +1 -0
- package/dist/types/store/index.d.ts +1 -1
- package/dist/types/store/providers/memory/appstate.store.d.ts +2 -0
- package/dist/types/store/providers/memory/contact.store.d.ts +1 -0
- package/dist/types/store/providers/memory/device-list.store.d.ts +0 -3
- package/dist/types/store/providers/memory/message.store.d.ts +1 -0
- package/dist/types/store/providers/memory/participants.store.d.ts +0 -1
- package/dist/types/store/providers/memory/sender-key.store.d.ts +0 -1
- package/dist/types/store/providers/memory/signal.store.d.ts +6 -0
- package/dist/types/store/providers/memory/thread.store.d.ts +1 -0
- package/dist/types/store/providers/sqlite/appstate.store.d.ts +2 -0
- package/dist/types/store/providers/sqlite/contact.store.d.ts +2 -0
- package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -3
- package/dist/types/store/providers/sqlite/message.store.d.ts +2 -0
- package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -1
- package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -1
- package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -1
- package/dist/types/store/providers/sqlite/signal.store.d.ts +7 -0
- package/dist/types/store/providers/sqlite/table-names.d.ts +5 -0
- package/dist/types/store/providers/sqlite/thread.store.d.ts +2 -0
- package/dist/types/store/types.d.ts +3 -0
- package/dist/types/transport/WaWebSocket.d.ts +3 -0
- package/dist/types/transport/index.d.ts +2 -1
- package/dist/types/transport/keepalive/WaKeepAlive.d.ts +0 -1
- package/dist/types/transport/node/WaNodeTransport.d.ts +0 -9
- package/dist/types/transport/node/builders/group.d.ts +4 -6
- package/dist/types/transport/node/builders/index.d.ts +2 -1
- package/dist/types/transport/node/builders/message.d.ts +14 -25
- package/dist/types/transport/node/builders/retry.d.ts +2 -4
- package/dist/types/transport/node/builders/usync.d.ts +21 -0
- package/dist/types/transport/node/helpers.d.ts +8 -0
- package/dist/types/transport/node/usync.d.ts +2 -0
- package/dist/types/transport/noise/WaFrameCodec.d.ts +3 -0
- package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -0
- package/dist/types/transport/proxy.d.ts +6 -0
- package/dist/types/transport/stream/parse.d.ts +0 -1
- package/dist/types/transport/types.d.ts +18 -1
- package/dist/types/util/bytes.d.ts +5 -0
- package/dist/types/util/primitives.d.ts +3 -0
- package/dist/util/bytes.js +55 -33
- package/dist/util/coercion.js +6 -14
- package/dist/util/primitives.js +42 -14
- package/package.json +27 -9
- package/proto/index.d.ts +1090 -1048
- package/proto/index.js +1 -1
- package/scripts/check-node-version.cjs +0 -1
- package/dist/crypto/core/encoding.js +0 -29
- package/dist/esm/crypto/core/encoding.js +0 -25
- package/dist/esm/util/base64.js +0 -18
- package/dist/esm/util/signal-address.js +0 -5
- package/dist/types/crypto/core/encoding.d.ts +0 -11
- package/dist/types/util/base64.d.ts +0 -4
- package/dist/types/util/signal-address.d.ts +0 -2
- package/dist/util/base64.js +0 -24
- package/dist/util/signal-address.js +0 -8
- /package/dist/types/transport/node/builders/{accountSync.d.ts → account-sync.d.ts} +0 -0
|
@@ -13,12 +13,16 @@ const keygen_1 = require("../../signal/registration/keygen");
|
|
|
13
13
|
const message_1 = require("../../transport/node/builders/message");
|
|
14
14
|
const retry_1 = require("../../transport/node/builders/retry");
|
|
15
15
|
const primitives_1 = require("../../util/primitives");
|
|
16
|
+
const RETRY_CLEANUP_INTERVAL_MS = 30000;
|
|
16
17
|
function getRetryReasonName(code) {
|
|
17
18
|
if (code === undefined) {
|
|
18
19
|
return undefined;
|
|
19
20
|
}
|
|
20
|
-
const
|
|
21
|
-
|
|
21
|
+
for (const reasonName in constants_2.RETRY_REASON) {
|
|
22
|
+
if (constants_2.RETRY_REASON[reasonName] === code)
|
|
23
|
+
return reasonName;
|
|
24
|
+
}
|
|
25
|
+
return 'unknown';
|
|
22
26
|
}
|
|
23
27
|
function getRemoteRetryReasonLogFields(reason) {
|
|
24
28
|
return {
|
|
@@ -29,6 +33,7 @@ function getRemoteRetryReasonLogFields(reason) {
|
|
|
29
33
|
}
|
|
30
34
|
class WaRetryCoordinator {
|
|
31
35
|
constructor(options) {
|
|
36
|
+
this.nextRetryCleanupAtMs = 0;
|
|
32
37
|
this.logger = options.logger;
|
|
33
38
|
this.retryStore = options.retryStore;
|
|
34
39
|
this.retryTtlMs = this.retryStore.getTtlMs?.() ?? constants_2.RETRY_OUTBOUND_TTL_MS;
|
|
@@ -75,7 +80,7 @@ class WaRetryCoordinator {
|
|
|
75
80
|
return;
|
|
76
81
|
}
|
|
77
82
|
try {
|
|
78
|
-
await this.
|
|
83
|
+
await this.maybeCleanupRetryStore(Date.now());
|
|
79
84
|
const request = (0, parse_1.parseRetryReceiptRequest)(receiptNode);
|
|
80
85
|
if (!request) {
|
|
81
86
|
return;
|
|
@@ -100,10 +105,7 @@ class WaRetryCoordinator {
|
|
|
100
105
|
}
|
|
101
106
|
async prepareDecryptFailureRetry(context, error) {
|
|
102
107
|
const nowMs = Date.now();
|
|
103
|
-
const
|
|
104
|
-
this.retryStore.cleanupExpired(nowMs),
|
|
105
|
-
this.signalStore.getRegistrationInfo()
|
|
106
|
-
]);
|
|
108
|
+
const registrationInfo = await this.signalStore.getRegistrationInfo();
|
|
107
109
|
if (!registrationInfo) {
|
|
108
110
|
this.logger.warn('retry receipt skipped: missing local registration info', {
|
|
109
111
|
id: context.stanzaId,
|
|
@@ -198,6 +200,21 @@ class WaRetryCoordinator {
|
|
|
198
200
|
});
|
|
199
201
|
return null;
|
|
200
202
|
}
|
|
203
|
+
let requesterAddress;
|
|
204
|
+
let requesterNormalizedDeviceJid;
|
|
205
|
+
try {
|
|
206
|
+
requesterAddress = (0, jid_1.parseSignalAddressFromJid)(requesterJid);
|
|
207
|
+
requesterNormalizedDeviceJid = (0, jid_1.normalizeDeviceJid)(requesterJid);
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
this.logger.info('retry request rejected: invalid requester jid', {
|
|
211
|
+
id: request.stanzaId,
|
|
212
|
+
originalMsgId: request.originalMsgId,
|
|
213
|
+
requester: requesterJid,
|
|
214
|
+
message: (0, primitives_1.toError)(error).message
|
|
215
|
+
});
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
201
218
|
if (request.retryCount >= constants_2.MAX_RETRY_ATTEMPTS) {
|
|
202
219
|
this.logger.info('retry request rejected: retry count exceeded', {
|
|
203
220
|
id: request.stanzaId,
|
|
@@ -217,7 +234,7 @@ class WaRetryCoordinator {
|
|
|
217
234
|
});
|
|
218
235
|
return null;
|
|
219
236
|
}
|
|
220
|
-
const sessionReady = await this.updateLocalSessionFromRetryRequest(request, requesterJid);
|
|
237
|
+
const sessionReady = await this.updateLocalSessionFromRetryRequest(request, requesterJid, requesterAddress, requesterNormalizedDeviceJid);
|
|
221
238
|
if (!sessionReady) {
|
|
222
239
|
this.logger.info('retry request rejected: missing compatible session', {
|
|
223
240
|
id: request.stanzaId,
|
|
@@ -228,7 +245,7 @@ class WaRetryCoordinator {
|
|
|
228
245
|
});
|
|
229
246
|
return null;
|
|
230
247
|
}
|
|
231
|
-
const authorization = await this.authorizeRetryRequest(request, outbound, requesterJid);
|
|
248
|
+
const authorization = await this.authorizeRetryRequest(request, outbound, requesterJid, requesterAddress, requesterNormalizedDeviceJid);
|
|
232
249
|
if (!authorization.authorized) {
|
|
233
250
|
this.logger.info('retry request rejected', {
|
|
234
251
|
id: request.stanzaId,
|
|
@@ -242,6 +259,8 @@ class WaRetryCoordinator {
|
|
|
242
259
|
}
|
|
243
260
|
return {
|
|
244
261
|
requesterJid,
|
|
262
|
+
requesterAddress,
|
|
263
|
+
requesterNormalizedDeviceJid,
|
|
245
264
|
outbound
|
|
246
265
|
};
|
|
247
266
|
}
|
|
@@ -274,7 +293,7 @@ class WaRetryCoordinator {
|
|
|
274
293
|
}
|
|
275
294
|
async runRetryTaskSerialized(messageId, task) {
|
|
276
295
|
const previous = this.retryProcessingByMessageId.get(messageId) ?? Promise.resolve();
|
|
277
|
-
const current = previous.
|
|
296
|
+
const current = previous.then(task, task);
|
|
278
297
|
const tracker = current.then(() => undefined, () => undefined);
|
|
279
298
|
this.retryProcessingByMessageId.set(messageId, tracker);
|
|
280
299
|
try {
|
|
@@ -314,18 +333,17 @@ class WaRetryCoordinator {
|
|
|
314
333
|
: undefined
|
|
315
334
|
};
|
|
316
335
|
}
|
|
317
|
-
async updateLocalSessionFromRetryRequest(request, requesterJid) {
|
|
318
|
-
await this.markRetryRequesterSenderKeyAsStale(request, requesterJid);
|
|
319
|
-
const
|
|
320
|
-
const currentSession = await this.signalStore.getSession(address);
|
|
336
|
+
async updateLocalSessionFromRetryRequest(request, requesterJid, requesterAddress, requesterNormalizedDeviceJid) {
|
|
337
|
+
await this.markRetryRequesterSenderKeyAsStale(request, requesterJid, requesterAddress);
|
|
338
|
+
const currentSession = await this.signalStore.getSession(requesterAddress);
|
|
321
339
|
if (currentSession && request.regId > 0 && currentSession.remote.regId !== request.regId) {
|
|
322
|
-
await this.signalStore.deleteSession(
|
|
340
|
+
await this.signalStore.deleteSession(requesterAddress);
|
|
323
341
|
}
|
|
324
342
|
if (request.keyBundle) {
|
|
325
|
-
if (!request.keyBundle.key) {
|
|
343
|
+
if (!request.keyBundle.key || !request.keyBundle.skey.signature) {
|
|
326
344
|
return false;
|
|
327
345
|
}
|
|
328
|
-
await this.signalProtocol.establishOutgoingSession(
|
|
346
|
+
await this.signalProtocol.establishOutgoingSession(requesterAddress, {
|
|
329
347
|
regId: request.regId,
|
|
330
348
|
identity: request.keyBundle.identity,
|
|
331
349
|
signedKey: {
|
|
@@ -340,23 +358,22 @@ class WaRetryCoordinator {
|
|
|
340
358
|
});
|
|
341
359
|
return true;
|
|
342
360
|
}
|
|
343
|
-
const hasSession = await this.signalProtocol.hasSession(
|
|
361
|
+
const hasSession = await this.signalProtocol.hasSession(requesterAddress);
|
|
344
362
|
if (hasSession) {
|
|
345
363
|
return true;
|
|
346
364
|
}
|
|
347
|
-
const fetched = await this.fetchMissingPreKeysSession(requesterJid, request.regId);
|
|
365
|
+
const fetched = await this.fetchMissingPreKeysSession(requesterJid, requesterAddress, requesterNormalizedDeviceJid, request.regId);
|
|
348
366
|
if (!fetched) {
|
|
349
367
|
return false;
|
|
350
368
|
}
|
|
351
|
-
await this.signalProtocol.establishOutgoingSession(
|
|
369
|
+
await this.signalProtocol.establishOutgoingSession(requesterAddress, fetched);
|
|
352
370
|
return true;
|
|
353
371
|
}
|
|
354
|
-
async markRetryRequesterSenderKeyAsStale(request, requesterJid) {
|
|
372
|
+
async markRetryRequesterSenderKeyAsStale(request, requesterJid, requesterAddress) {
|
|
355
373
|
if (!(0, jid_1.isGroupOrBroadcastJid)(request.from)) {
|
|
356
374
|
return;
|
|
357
375
|
}
|
|
358
376
|
try {
|
|
359
|
-
const requesterAddress = (0, jid_1.parseSignalAddressFromJid)(requesterJid);
|
|
360
377
|
const deleted = await this.senderKeyStore.markForgetSenderKey(request.from, [
|
|
361
378
|
requesterAddress
|
|
362
379
|
]);
|
|
@@ -374,12 +391,11 @@ class WaRetryCoordinator {
|
|
|
374
391
|
});
|
|
375
392
|
}
|
|
376
393
|
}
|
|
377
|
-
async fetchMissingPreKeysSession(requesterJid, requesterRegistrationId) {
|
|
394
|
+
async fetchMissingPreKeysSession(requesterJid, requesterAddress, requesterNormalizedDeviceJid, requesterRegistrationId) {
|
|
378
395
|
try {
|
|
379
|
-
const requesterAddress = (0, jid_1.parseSignalAddressFromJid)(requesterJid);
|
|
380
396
|
const results = await this.signalMissingPreKeysSync.fetchMissingPreKeys([
|
|
381
397
|
{
|
|
382
|
-
userJid:
|
|
398
|
+
userJid: `${requesterAddress.user}@${requesterAddress.server}`,
|
|
383
399
|
devices: [
|
|
384
400
|
{
|
|
385
401
|
deviceId: requesterAddress.device,
|
|
@@ -396,8 +412,7 @@ class WaRetryCoordinator {
|
|
|
396
412
|
});
|
|
397
413
|
return null;
|
|
398
414
|
}
|
|
399
|
-
const
|
|
400
|
-
const matched = first.devices.find((device) => (0, jid_1.normalizeDeviceJid)(device.deviceJid) === requesterDeviceJid);
|
|
415
|
+
const matched = first.devices.find((device) => (0, jid_1.normalizeDeviceJid)(device.deviceJid) === requesterNormalizedDeviceJid);
|
|
401
416
|
if (!matched) {
|
|
402
417
|
this.logger.warn('missing prekeys fetch did not return requested device', {
|
|
403
418
|
requester: requesterJid,
|
|
@@ -415,7 +430,7 @@ class WaRetryCoordinator {
|
|
|
415
430
|
return null;
|
|
416
431
|
}
|
|
417
432
|
}
|
|
418
|
-
async authorizeRetryRequest(request, outbound, requesterJid) {
|
|
433
|
+
async authorizeRetryRequest(request, outbound, requesterJid, requesterAddress, requesterNormalizedDeviceJid) {
|
|
419
434
|
if (outbound.state === 'ineligible') {
|
|
420
435
|
return { authorized: false, reason: `state_${outbound.state}` };
|
|
421
436
|
}
|
|
@@ -423,25 +438,29 @@ class WaRetryCoordinator {
|
|
|
423
438
|
if (!isGroupOutbound && (outbound.state === 'read' || outbound.state === 'played')) {
|
|
424
439
|
return { authorized: false, reason: `state_${outbound.state}` };
|
|
425
440
|
}
|
|
426
|
-
const requesterAuthorized = await this.isRequesterAuthorizedDevice(requesterJid);
|
|
441
|
+
const requesterAuthorized = await this.isRequesterAuthorizedDevice(requesterJid, requesterAddress, requesterNormalizedDeviceJid);
|
|
427
442
|
if (!requesterAuthorized) {
|
|
428
443
|
return { authorized: false, reason: 'requester_device_not_authorized' };
|
|
429
444
|
}
|
|
430
445
|
return { authorized: true };
|
|
431
446
|
}
|
|
432
|
-
async isRequesterAuthorizedDevice(requesterJid) {
|
|
447
|
+
async isRequesterAuthorizedDevice(requesterJid, requesterAddress, requesterNormalizedDeviceJid) {
|
|
433
448
|
try {
|
|
434
|
-
const requesterUser =
|
|
449
|
+
const requesterUser = `${requesterAddress.user}@${requesterAddress.server}`;
|
|
450
|
+
if (requesterNormalizedDeviceJid === (0, jid_1.normalizeDeviceJid)(requesterUser)) {
|
|
451
|
+
return true;
|
|
452
|
+
}
|
|
435
453
|
const synced = await this.signalDeviceSync.syncDeviceList([requesterUser]);
|
|
436
454
|
const target = synced.find((entry) => entry.jid === requesterUser);
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
455
|
+
if (!target) {
|
|
456
|
+
return false;
|
|
457
|
+
}
|
|
458
|
+
for (let index = 0; index < target.deviceJids.length; index += 1) {
|
|
459
|
+
if ((0, jid_1.normalizeDeviceJid)(target.deviceJids[index]) === requesterNormalizedDeviceJid) {
|
|
460
|
+
return true;
|
|
442
461
|
}
|
|
443
462
|
}
|
|
444
|
-
return
|
|
463
|
+
return false;
|
|
445
464
|
}
|
|
446
465
|
catch (error) {
|
|
447
466
|
this.logger.warn('retry authorization failed while syncing requester device list', {
|
|
@@ -490,5 +509,19 @@ class WaRetryCoordinator {
|
|
|
490
509
|
});
|
|
491
510
|
}
|
|
492
511
|
}
|
|
512
|
+
async maybeCleanupRetryStore(nowMs) {
|
|
513
|
+
if (nowMs < this.nextRetryCleanupAtMs) {
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
516
|
+
this.nextRetryCleanupAtMs = nowMs + RETRY_CLEANUP_INTERVAL_MS;
|
|
517
|
+
try {
|
|
518
|
+
await this.retryStore.cleanupExpired(nowMs);
|
|
519
|
+
}
|
|
520
|
+
catch (error) {
|
|
521
|
+
this.logger.warn('retry store cleanup failed', {
|
|
522
|
+
message: (0, primitives_1.toError)(error).message
|
|
523
|
+
});
|
|
524
|
+
}
|
|
525
|
+
}
|
|
493
526
|
}
|
|
494
527
|
exports.WaRetryCoordinator = WaRetryCoordinator;
|
package/dist/client/dirty.js
CHANGED
|
@@ -2,13 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parseDirtyBits = parseDirtyBits;
|
|
4
4
|
exports.handleDirtyBits = handleDirtyBits;
|
|
5
|
-
const _crypto_1 = require("../crypto/index.js");
|
|
6
5
|
const constants_1 = require("../protocol/constants");
|
|
7
6
|
const jid_1 = require("../protocol/jid");
|
|
8
|
-
const
|
|
7
|
+
const account_sync_1 = require("../transport/node/builders/account-sync");
|
|
9
8
|
const helpers_1 = require("../transport/node/helpers");
|
|
10
9
|
const query_1 = require("../transport/node/query");
|
|
11
|
-
const bytes_1 = require("../util/bytes");
|
|
12
10
|
const primitives_1 = require("../util/primitives");
|
|
13
11
|
const SUPPORTED_DIRTY_TYPES = new Set(constants_1.WA_SUPPORTED_DIRTY_TYPES);
|
|
14
12
|
const ACCOUNT_SYNC_PROTOCOL_SET = new Set(constants_1.WA_ACCOUNT_SYNC_PROTOCOLS);
|
|
@@ -22,19 +20,13 @@ function parseDirtyBitNode(node, logger) {
|
|
|
22
20
|
});
|
|
23
21
|
return null;
|
|
24
22
|
}
|
|
25
|
-
const protocols = (0, helpers_1.
|
|
23
|
+
const protocols = (0, helpers_1.getNodeChildrenTags)(node);
|
|
26
24
|
return {
|
|
27
25
|
type,
|
|
28
26
|
timestamp,
|
|
29
27
|
protocols
|
|
30
28
|
};
|
|
31
29
|
}
|
|
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
30
|
function resolveAccountSyncProtocols(protocols) {
|
|
39
31
|
const selected = protocols.filter((protocol) => ACCOUNT_SYNC_PROTOCOL_SET.has(protocol));
|
|
40
32
|
if (selected.length > 0) {
|
|
@@ -43,9 +35,15 @@ function resolveAccountSyncProtocols(protocols) {
|
|
|
43
35
|
return constants_1.WA_ACCOUNT_SYNC_PROTOCOLS;
|
|
44
36
|
}
|
|
45
37
|
function parseDirtyBits(nodes, logger) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
38
|
+
const parsed = [];
|
|
39
|
+
for (const node of nodes) {
|
|
40
|
+
const dirtyBit = parseDirtyBitNode(node, logger);
|
|
41
|
+
if (!dirtyBit) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
parsed.push(dirtyBit);
|
|
45
|
+
}
|
|
46
|
+
return parsed;
|
|
49
47
|
}
|
|
50
48
|
async function handleDirtyBits(runtime, dirtyBits) {
|
|
51
49
|
const meJid = runtime.getCurrentCredentials()?.meJid ?? null;
|
|
@@ -53,22 +51,33 @@ async function handleDirtyBits(runtime, dirtyBits) {
|
|
|
53
51
|
runtime.logger.trace('dirty bits skipped: session is not registered');
|
|
54
52
|
return;
|
|
55
53
|
}
|
|
56
|
-
const
|
|
54
|
+
const supported = [];
|
|
55
|
+
const unsupported = [];
|
|
56
|
+
for (const dirtyBit of dirtyBits) {
|
|
57
|
+
if (SUPPORTED_DIRTY_TYPES.has(dirtyBit.type)) {
|
|
58
|
+
supported.push(dirtyBit);
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
unsupported.push(dirtyBit);
|
|
62
|
+
}
|
|
57
63
|
runtime.logger.info('handling dirty bits from info bulletin', {
|
|
58
64
|
supported: supported.map((entry) => entry.type).join(','),
|
|
59
65
|
unsupported: unsupported.map((entry) => entry.type).join(',')
|
|
60
66
|
});
|
|
61
|
-
const
|
|
67
|
+
const clearableDirtyBits = [...unsupported];
|
|
68
|
+
const settledSupported = await Promise.allSettled(supported.map(async (dirtyBit) => handleDirtyBit(runtime, dirtyBit)));
|
|
69
|
+
for (let index = 0; index < settledSupported.length; index += 1) {
|
|
70
|
+
const result = settledSupported[index];
|
|
62
71
|
if (result.status === 'fulfilled') {
|
|
63
|
-
|
|
72
|
+
clearableDirtyBits.push(supported[index]);
|
|
73
|
+
continue;
|
|
64
74
|
}
|
|
65
75
|
runtime.logger.warn('failed handling dirty bit', {
|
|
66
76
|
type: supported[index].type,
|
|
67
77
|
message: (0, primitives_1.toError)(result.reason).message
|
|
68
78
|
});
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
await clearDirtyBits(runtime, unsupported.concat(handledSupported));
|
|
79
|
+
}
|
|
80
|
+
await clearDirtyBits(runtime, clearableDirtyBits);
|
|
72
81
|
}
|
|
73
82
|
async function handleDirtyBit(runtime, dirtyBit) {
|
|
74
83
|
switch (dirtyBit.type) {
|
|
@@ -153,7 +162,7 @@ async function syncAccountDevicesDirtyBit(runtime) {
|
|
|
153
162
|
}
|
|
154
163
|
await runSyncQuery(runtime, {
|
|
155
164
|
queryContext: 'account_sync.devices',
|
|
156
|
-
node: (0,
|
|
165
|
+
node: (0, account_sync_1.buildAccountDevicesSyncIq)(userJids, await runtime.generateUsyncSid()),
|
|
157
166
|
logMessage: 'account_sync devices synchronized',
|
|
158
167
|
contextData: { meJid, targets: userJids.join(',') }
|
|
159
168
|
});
|
|
@@ -165,7 +174,7 @@ async function syncAccountPictureDirtyBit(runtime) {
|
|
|
165
174
|
return;
|
|
166
175
|
}
|
|
167
176
|
const targetJid = (0, jid_1.toUserJid)(meJid);
|
|
168
|
-
const response = await runtime.queryWithContext('account_sync.picture', (0,
|
|
177
|
+
const response = await runtime.queryWithContext('account_sync.picture', (0, account_sync_1.buildAccountPictureSyncIq)(targetJid), constants_1.WA_DEFAULTS.IQ_TIMEOUT_MS, { meJid, target: targetJid });
|
|
169
178
|
if (response.tag !== 'iq') {
|
|
170
179
|
throw new Error(`account_sync.picture returned non-iq node (${response.tag})`);
|
|
171
180
|
}
|
|
@@ -191,14 +200,14 @@ async function syncAccountPictureDirtyBit(runtime) {
|
|
|
191
200
|
async function syncAccountPrivacyDirtyBit(runtime) {
|
|
192
201
|
await runSyncQuery(runtime, {
|
|
193
202
|
queryContext: 'account_sync.privacy',
|
|
194
|
-
node: (0,
|
|
203
|
+
node: (0, account_sync_1.buildAccountPrivacySyncIq)(),
|
|
195
204
|
logMessage: 'account_sync privacy synchronized'
|
|
196
205
|
});
|
|
197
206
|
}
|
|
198
207
|
async function syncAccountBlocklistDirtyBit(runtime) {
|
|
199
208
|
await runSyncQuery(runtime, {
|
|
200
209
|
queryContext: 'account_sync.blocklist',
|
|
201
|
-
node: (0,
|
|
210
|
+
node: (0, account_sync_1.buildAccountBlocklistSyncIq)(),
|
|
202
211
|
logMessage: 'account_sync blocklist synchronized'
|
|
203
212
|
});
|
|
204
213
|
}
|
|
@@ -209,16 +218,13 @@ async function syncGroupsDirtyBit(runtime) {
|
|
|
209
218
|
await runSyncQuery(runtime, {
|
|
210
219
|
queryContext: 'dirty.groups',
|
|
211
220
|
assertContext: 'groups',
|
|
212
|
-
node: (0,
|
|
221
|
+
node: (0, account_sync_1.buildGroupsDirtySyncIq)(),
|
|
213
222
|
logMessage: 'groups dirty sync completed'
|
|
214
223
|
});
|
|
215
224
|
}
|
|
216
225
|
async function syncNewsletterMetadataDirtyBit(runtime) {
|
|
217
226
|
runtime.logger.info('newsletter_metadata dirty bit received (GraphQL/MEX sync intentionally disabled)');
|
|
218
|
-
await runtime.queryWithContext('dirty.newsletter_metadata', (0,
|
|
219
|
-
}
|
|
220
|
-
async function generateUsyncSid() {
|
|
221
|
-
return (0, bytes_1.bytesToHex)(await (0, _crypto_1.randomBytesAsync)(8));
|
|
227
|
+
await runtime.queryWithContext('dirty.newsletter_metadata', (0, account_sync_1.buildNewsletterMetadataSyncIq)(), constants_1.WA_DEFAULTS.IQ_TIMEOUT_MS);
|
|
222
228
|
}
|
|
223
229
|
function resolveAccountSyncDeviceTargets(credentials) {
|
|
224
230
|
if (!credentials?.meJid) {
|
|
@@ -238,7 +244,7 @@ async function runSyncQuery(runtime, args) {
|
|
|
238
244
|
}
|
|
239
245
|
async function clearDirtyBits(runtime, dirtyBits) {
|
|
240
246
|
try {
|
|
241
|
-
await runtime.queryWithContext('dirty.clear', (0,
|
|
247
|
+
await runtime.queryWithContext('dirty.clear', (0, account_sync_1.buildClearDirtyBitsIq)(dirtyBits), constants_1.WA_DEFAULTS.IQ_TIMEOUT_MS, {
|
|
242
248
|
count: dirtyBits.length
|
|
243
249
|
});
|
|
244
250
|
runtime.logger.info('dirty bits cleared', {
|
|
@@ -78,8 +78,7 @@ function parseChatEventFromAppStateMutation(mutation) {
|
|
|
78
78
|
...pickOptionalPrimitive('deviceAgentId', value.chatAssignment.deviceAgentID, 'string')
|
|
79
79
|
};
|
|
80
80
|
}
|
|
81
|
-
const fallbackAction = normalizeIndexAction(parsedIndex?.action) ??
|
|
82
|
-
normalizeValueActionKey(syncActionValueKey);
|
|
81
|
+
const fallbackAction = normalizeIndexAction(parsedIndex?.action) ?? normalizeValueActionKey(syncActionValueKey);
|
|
83
82
|
if (!fallbackAction) {
|
|
84
83
|
return null;
|
|
85
84
|
}
|
|
@@ -204,10 +203,12 @@ function extractChatJid(parts) {
|
|
|
204
203
|
return undefined;
|
|
205
204
|
}
|
|
206
205
|
function findPresentSyncActionValueKey(value) {
|
|
207
|
-
|
|
206
|
+
const valueRecord = value;
|
|
207
|
+
for (const key in valueRecord) {
|
|
208
208
|
if (key === 'timestamp') {
|
|
209
209
|
continue;
|
|
210
210
|
}
|
|
211
|
+
const keyValue = valueRecord[key];
|
|
211
212
|
if (keyValue === null || keyValue === undefined) {
|
|
212
213
|
continue;
|
|
213
214
|
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseParticipants = parseParticipants;
|
|
3
4
|
exports.parseGroupNotificationEvents = parseGroupNotificationEvents;
|
|
4
5
|
const constants_1 = require("../../protocol/constants");
|
|
5
6
|
const nodes_1 = require("../../protocol/nodes");
|
|
6
7
|
const helpers_1 = require("../../transport/node/helpers");
|
|
7
|
-
const parse_1 = require("../../transport/stream/parse");
|
|
8
8
|
const bytes_1 = require("../../util/bytes");
|
|
9
|
+
const primitives_1 = require("../../util/primitives");
|
|
9
10
|
function readNodeTextContent(node) {
|
|
10
11
|
if (!node) {
|
|
11
12
|
return undefined;
|
|
@@ -19,30 +20,42 @@ function readNodeTextContent(node) {
|
|
|
19
20
|
return undefined;
|
|
20
21
|
}
|
|
21
22
|
function parseParticipants(node) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
23
|
+
const participants = [];
|
|
24
|
+
for (const participantNode of (0, helpers_1.getNodeChildrenByTag)(node, nodes_1.WA_NODE_TAGS.PARTICIPANT)) {
|
|
25
|
+
participants.push({
|
|
26
|
+
jid: participantNode.attrs.jid,
|
|
27
|
+
role: participantNode.attrs.type,
|
|
28
|
+
lidJid: participantNode.attrs.lid,
|
|
29
|
+
phoneJid: participantNode.attrs.phone_number,
|
|
30
|
+
displayName: participantNode.attrs.display_name,
|
|
31
|
+
username: participantNode.attrs.username,
|
|
32
|
+
expirationSeconds: (0, primitives_1.parseOptionalInt)(participantNode.attrs.expiration)
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return participants;
|
|
31
36
|
}
|
|
32
37
|
function parseLinkedGroups(node) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
38
|
+
const groups = [];
|
|
39
|
+
for (const groupNode of (0, helpers_1.getNodeChildrenByTag)(node, nodes_1.WA_NODE_TAGS.GROUP)) {
|
|
40
|
+
groups.push({
|
|
41
|
+
jid: groupNode.attrs.jid,
|
|
42
|
+
subject: groupNode.attrs.subject,
|
|
43
|
+
subjectTimestampSeconds: (0, primitives_1.parseOptionalInt)(groupNode.attrs.s_t),
|
|
44
|
+
hiddenSubgroup: (0, helpers_1.findNodeChild)(groupNode, 'hidden_group') !== undefined
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
return groups;
|
|
39
48
|
}
|
|
40
49
|
function parseMembershipRequests(node) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
50
|
+
const requests = [];
|
|
51
|
+
for (const requestNode of (0, helpers_1.getNodeChildrenByTag)(node, 'requested_user')) {
|
|
52
|
+
requests.push({
|
|
53
|
+
jid: requestNode.attrs.jid,
|
|
54
|
+
username: requestNode.attrs.username,
|
|
55
|
+
phoneJid: requestNode.attrs.phone_number
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return requests;
|
|
46
59
|
}
|
|
47
60
|
function parseSubgroupSuggestion(node) {
|
|
48
61
|
const subjectNode = (0, helpers_1.findNodeChild)(node, nodes_1.WA_NODE_TAGS.SUBJECT);
|
|
@@ -57,20 +70,26 @@ function parseSubgroupSuggestion(node) {
|
|
|
57
70
|
ownerJid: node.attrs.creator,
|
|
58
71
|
subject: readNodeTextContent(subjectNode),
|
|
59
72
|
description: readNodeTextContent(descriptionBodyNode),
|
|
60
|
-
timestampSeconds: (0,
|
|
73
|
+
timestampSeconds: (0, primitives_1.parseOptionalInt)(node.attrs.creation),
|
|
61
74
|
isExistingGroup: readNodeTextContent(isExistingGroupNode) === undefined
|
|
62
75
|
? undefined
|
|
63
76
|
: readNodeTextContent(isExistingGroupNode) === 'true',
|
|
64
77
|
participantCount: participantCountNode
|
|
65
|
-
? (0,
|
|
78
|
+
? (0, primitives_1.parseOptionalInt)(readNodeTextContent(participantCountNode))
|
|
66
79
|
: undefined,
|
|
67
80
|
reason: node.attrs.reason
|
|
68
81
|
};
|
|
69
82
|
}
|
|
70
83
|
function parseSubgroupSuggestions(node) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
84
|
+
const suggestions = [];
|
|
85
|
+
for (const suggestionNode of (0, helpers_1.getNodeChildrenByTag)(node, 'sub_group_suggestion')) {
|
|
86
|
+
const suggestion = parseSubgroupSuggestion(suggestionNode);
|
|
87
|
+
if (!suggestion) {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
suggestions.push(suggestion);
|
|
91
|
+
}
|
|
92
|
+
return suggestions;
|
|
74
93
|
}
|
|
75
94
|
function createBaseGroupEvent(notificationNode, actionNode) {
|
|
76
95
|
return {
|
|
@@ -81,7 +100,7 @@ function createBaseGroupEvent(notificationNode, actionNode) {
|
|
|
81
100
|
stanzaType: notificationNode.attrs.type,
|
|
82
101
|
groupJid: notificationNode.attrs.from,
|
|
83
102
|
authorJid: notificationNode.attrs.participant,
|
|
84
|
-
timestampSeconds: (0,
|
|
103
|
+
timestampSeconds: (0, primitives_1.parseOptionalInt)(notificationNode.attrs.t)
|
|
85
104
|
};
|
|
86
105
|
}
|
|
87
106
|
function createUnhandledStanzaEvent(notificationNode, reason) {
|
|
@@ -121,7 +140,7 @@ function parseCreateGroupAction(notificationNode, actionNode) {
|
|
|
121
140
|
creatorPhoneJid: groupNode.attrs.creator_pn,
|
|
122
141
|
creatorUsername: groupNode.attrs.creator_username,
|
|
123
142
|
creatorCountryCode: groupNode.attrs.creator_country_code,
|
|
124
|
-
creationSeconds: (0,
|
|
143
|
+
creationSeconds: (0, primitives_1.parseOptionalInt)(groupNode.attrs.creation),
|
|
125
144
|
announceEnabled: (0, helpers_1.findNodeChild)(groupNode, nodes_1.WA_NODE_TAGS.ANNOUNCEMENT) !== undefined,
|
|
126
145
|
restrictEnabled: (0, helpers_1.findNodeChild)(groupNode, nodes_1.WA_NODE_TAGS.LOCKED) !== undefined,
|
|
127
146
|
noFrequentlyForwardedEnabled: (0, helpers_1.findNodeChild)(groupNode, constants_1.WA_GROUP_NOTIFICATION_TAGS.NO_FREQUENTLY_FORWARDED) !==
|
|
@@ -135,12 +154,11 @@ function parseCreateGroupAction(notificationNode, actionNode) {
|
|
|
135
154
|
hasCapi: (0, helpers_1.findNodeChild)(groupNode, 'capi') !== undefined,
|
|
136
155
|
limitSharingEnabled: (0, helpers_1.findNodeChild)(groupNode, constants_1.WA_GROUP_NOTIFICATION_TAGS.LIMIT_SHARING_ENABLED) !==
|
|
137
156
|
undefined,
|
|
138
|
-
size: (0,
|
|
139
|
-
ephemeralDuration: (0,
|
|
157
|
+
size: (0, primitives_1.parseOptionalInt)(groupNode.attrs.size),
|
|
158
|
+
ephemeralDuration: (0, primitives_1.parseOptionalInt)((0, helpers_1.findNodeChild)(groupNode, nodes_1.WA_NODE_TAGS.EPHEMERAL)?.attrs.expiration),
|
|
140
159
|
disappearingTrigger: (0, helpers_1.findNodeChild)(groupNode, nodes_1.WA_NODE_TAGS.EPHEMERAL)?.attrs.trigger,
|
|
141
160
|
membershipApprovalEnabled: groupJoinNode?.attrs.state === 'on',
|
|
142
|
-
allowNonAdminSubGroupCreation: (0, helpers_1.findNodeChild)(groupNode, constants_1.WA_GROUP_NOTIFICATION_TAGS.ALLOW_NON_ADMIN_SUB_GROUP_CREATION) !==
|
|
143
|
-
undefined,
|
|
161
|
+
allowNonAdminSubGroupCreation: (0, helpers_1.findNodeChild)(groupNode, constants_1.WA_GROUP_NOTIFICATION_TAGS.ALLOW_NON_ADMIN_SUB_GROUP_CREATION) !== undefined,
|
|
144
162
|
linkedParentGroupJid: (0, helpers_1.findNodeChild)(groupNode, 'linked_parent')?.attrs.jid ??
|
|
145
163
|
(0, helpers_1.findNodeChild)(groupNode, 'parent')?.attrs.jid
|
|
146
164
|
}
|
|
@@ -212,7 +230,7 @@ function parseGroupActionNode(notificationNode, actionNode) {
|
|
|
212
230
|
details: {
|
|
213
231
|
subjectOwnerPhoneJid: actionNode.attrs.s_o_pn,
|
|
214
232
|
subjectOwnerUsername: actionNode.attrs.s_o_username,
|
|
215
|
-
subjectTimestampSeconds: (0,
|
|
233
|
+
subjectTimestampSeconds: (0, primitives_1.parseOptionalInt)(actionNode.attrs.s_t)
|
|
216
234
|
}
|
|
217
235
|
};
|
|
218
236
|
case constants_1.WA_GROUP_NOTIFICATION_TAGS.DESCRIPTION: {
|
|
@@ -227,7 +245,12 @@ function parseGroupActionNode(notificationNode, actionNode) {
|
|
|
227
245
|
};
|
|
228
246
|
}
|
|
229
247
|
case constants_1.WA_GROUP_NOTIFICATION_TAGS.LOCKED:
|
|
230
|
-
return {
|
|
248
|
+
return {
|
|
249
|
+
...baseEvent,
|
|
250
|
+
action: 'restrict',
|
|
251
|
+
enabled: true,
|
|
252
|
+
mode: actionNode.attrs.threshold
|
|
253
|
+
};
|
|
231
254
|
case constants_1.WA_GROUP_NOTIFICATION_TAGS.UNLOCKED:
|
|
232
255
|
return { ...baseEvent, action: 'restrict', enabled: false };
|
|
233
256
|
case constants_1.WA_GROUP_NOTIFICATION_TAGS.ANNOUNCEMENT:
|
|
@@ -244,7 +267,7 @@ function parseGroupActionNode(notificationNode, actionNode) {
|
|
|
244
267
|
return {
|
|
245
268
|
...baseEvent,
|
|
246
269
|
action: 'ephemeral',
|
|
247
|
-
expirationSeconds: (0,
|
|
270
|
+
expirationSeconds: (0, primitives_1.parseOptionalInt)(actionNode.attrs.expiration),
|
|
248
271
|
mode: actionNode.attrs.trigger
|
|
249
272
|
};
|
|
250
273
|
case constants_1.WA_GROUP_NOTIFICATION_TAGS.NOT_EPHEMERAL:
|
|
@@ -263,7 +286,7 @@ function parseGroupActionNode(notificationNode, actionNode) {
|
|
|
263
286
|
return {
|
|
264
287
|
...baseEvent,
|
|
265
288
|
action: 'growth_locked',
|
|
266
|
-
expirationSeconds: (0,
|
|
289
|
+
expirationSeconds: (0, primitives_1.parseOptionalInt)(actionNode.attrs.expiration),
|
|
267
290
|
mode: actionNode.attrs.type
|
|
268
291
|
};
|
|
269
292
|
case constants_1.WA_GROUP_NOTIFICATION_TAGS.GROWTH_UNLOCKED:
|