zapo-js 0.1.1 → 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 +8 -0
- 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 +26 -5
- 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
package/dist/protocol/jid.js
CHANGED
|
@@ -11,36 +11,57 @@ exports.toUserJid = toUserJid;
|
|
|
11
11
|
exports.normalizeDeviceJid = normalizeDeviceJid;
|
|
12
12
|
exports.getLoginIdentity = getLoginIdentity;
|
|
13
13
|
exports.parsePhoneJid = parsePhoneJid;
|
|
14
|
+
exports.signalAddressKey = signalAddressKey;
|
|
14
15
|
const constants_1 = require("./constants");
|
|
15
|
-
function
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
function scanJid(jid) {
|
|
17
|
+
let atIndex = -1;
|
|
18
|
+
let colonIndex = -1;
|
|
19
|
+
let dotIndex = -1;
|
|
20
|
+
for (let index = 0; index < jid.length; index++) {
|
|
21
|
+
const code = jid.charCodeAt(index);
|
|
22
|
+
if (code === 64) {
|
|
23
|
+
atIndex = index;
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
26
|
+
if (code === 58 && colonIndex === -1)
|
|
27
|
+
colonIndex = index;
|
|
28
|
+
else if (code === 46 && dotIndex === -1 && colonIndex === -1)
|
|
29
|
+
dotIndex = index;
|
|
19
30
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
31
|
+
if (atIndex < 1 || atIndex >= jid.length - 1)
|
|
32
|
+
throw new Error(`invalid jid: ${jid}`);
|
|
33
|
+
return { atIndex, colonIndex, dotIndex };
|
|
34
|
+
}
|
|
35
|
+
function splitJid(jid) {
|
|
36
|
+
const { atIndex } = scanJid(jid);
|
|
37
|
+
return { user: jid.slice(0, atIndex), server: jid.slice(atIndex + 1) };
|
|
24
38
|
}
|
|
25
39
|
function normalizeRecipientJid(to) {
|
|
26
40
|
const input = to.trim();
|
|
27
|
-
if (input.length === 0)
|
|
41
|
+
if (input.length === 0)
|
|
28
42
|
throw new Error('recipient cannot be empty');
|
|
43
|
+
let hasDash = false;
|
|
44
|
+
let digits = '';
|
|
45
|
+
for (let index = 0; index < input.length; index += 1) {
|
|
46
|
+
const code = input.charCodeAt(index);
|
|
47
|
+
if (code === 64)
|
|
48
|
+
return input;
|
|
49
|
+
if (code === 45) {
|
|
50
|
+
hasDash = true;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (code >= 48 && code <= 57)
|
|
54
|
+
digits += input[index];
|
|
29
55
|
}
|
|
30
|
-
if (
|
|
31
|
-
return input;
|
|
32
|
-
}
|
|
33
|
-
if (input.includes('-')) {
|
|
56
|
+
if (hasDash)
|
|
34
57
|
return `${input}@${constants_1.WA_DEFAULTS.GROUP_SERVER}`;
|
|
35
|
-
|
|
36
|
-
const digits = input.replace(/\D/g, '');
|
|
37
|
-
if (digits.length === 0) {
|
|
58
|
+
if (digits.length === 0)
|
|
38
59
|
throw new Error(`invalid recipient: ${to}`);
|
|
39
|
-
}
|
|
40
60
|
return `${digits}@${constants_1.WA_DEFAULTS.HOST_DOMAIN}`;
|
|
41
61
|
}
|
|
42
62
|
function isJidType(jid, type) {
|
|
43
|
-
|
|
63
|
+
const atIndex = jid.length - type.length - 1;
|
|
64
|
+
return atIndex >= 1 && jid.charCodeAt(atIndex) === 64 && jid.endsWith(type);
|
|
44
65
|
}
|
|
45
66
|
function isGroupJid(jid) {
|
|
46
67
|
return isJidType(jid, constants_1.WA_DEFAULTS.GROUP_SERVER);
|
|
@@ -52,26 +73,14 @@ function isGroupOrBroadcastJid(jid) {
|
|
|
52
73
|
return isGroupJid(jid) || isBroadcastJid(jid);
|
|
53
74
|
}
|
|
54
75
|
function parseSignalAddressFromJid(jid) {
|
|
55
|
-
const
|
|
56
|
-
const
|
|
57
|
-
if (colonIndex === -1)
|
|
58
|
-
return {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
device: 0
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
const user = parsed.user.slice(0, colonIndex);
|
|
65
|
-
const deviceRaw = parsed.user.slice(colonIndex + 1);
|
|
66
|
-
const device = Number.parseInt(deviceRaw, 10);
|
|
67
|
-
if (!Number.isFinite(device) || device < 0) {
|
|
76
|
+
const { atIndex, colonIndex } = scanJid(jid);
|
|
77
|
+
const server = jid.slice(atIndex + 1);
|
|
78
|
+
if (colonIndex === -1)
|
|
79
|
+
return { user: jid.slice(0, atIndex), server, device: 0 };
|
|
80
|
+
const device = Number.parseInt(jid.slice(colonIndex + 1, atIndex), 10);
|
|
81
|
+
if (!Number.isFinite(device) || device < 0)
|
|
68
82
|
throw new Error(`invalid jid device: ${jid}`);
|
|
69
|
-
}
|
|
70
|
-
return {
|
|
71
|
-
user,
|
|
72
|
-
server: parsed.server,
|
|
73
|
-
device
|
|
74
|
-
};
|
|
83
|
+
return { user: jid.slice(0, colonIndex), server, device };
|
|
75
84
|
}
|
|
76
85
|
function toUserJid(jid) {
|
|
77
86
|
const address = parseSignalAddressFromJid(jid);
|
|
@@ -79,29 +88,33 @@ function toUserJid(jid) {
|
|
|
79
88
|
}
|
|
80
89
|
function normalizeDeviceJid(jid) {
|
|
81
90
|
const address = parseSignalAddressFromJid(jid);
|
|
82
|
-
if (address.device === 0)
|
|
91
|
+
if (address.device === 0)
|
|
83
92
|
return `${address.user}@${address.server}`;
|
|
84
|
-
}
|
|
85
93
|
return `${address.user}:${address.device}@${address.server}`;
|
|
86
94
|
}
|
|
87
95
|
function getLoginIdentity(meJid) {
|
|
88
|
-
const
|
|
89
|
-
const
|
|
90
|
-
const
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
if (!Number.isSafeInteger(username) || username <= 0) {
|
|
96
|
+
const { atIndex, colonIndex, dotIndex } = scanJid(meJid);
|
|
97
|
+
const userEndIndex = dotIndex === -1 ? (colonIndex === -1 ? atIndex : colonIndex) : dotIndex;
|
|
98
|
+
const username = Number.parseInt(meJid.slice(0, userEndIndex), 10);
|
|
99
|
+
const device = colonIndex === -1 ? 0 : Number.parseInt(meJid.slice(colonIndex + 1, atIndex), 10);
|
|
100
|
+
if (!Number.isSafeInteger(username) || username <= 0)
|
|
94
101
|
throw new Error(`invalid numeric username from ${meJid}`);
|
|
95
|
-
|
|
96
|
-
if (!Number.isSafeInteger(device) || device < 0) {
|
|
102
|
+
if (!Number.isSafeInteger(device) || device < 0)
|
|
97
103
|
throw new Error(`invalid device from ${meJid}`);
|
|
98
|
-
}
|
|
99
104
|
return { username, device };
|
|
100
105
|
}
|
|
101
106
|
function parsePhoneJid(input) {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
107
|
+
let digits = '';
|
|
108
|
+
for (let index = 0; index < input.length; index += 1) {
|
|
109
|
+
const code = input.charCodeAt(index);
|
|
110
|
+
if (code >= 48 && code <= 57)
|
|
111
|
+
digits += input[index];
|
|
105
112
|
}
|
|
113
|
+
if (!digits)
|
|
114
|
+
throw new Error('phone number is empty after normalization');
|
|
106
115
|
return `${digits}@${constants_1.WA_DEFAULTS.HOST_DOMAIN}`;
|
|
107
116
|
}
|
|
117
|
+
function signalAddressKey(address) {
|
|
118
|
+
const server = address.server ?? constants_1.WA_DEFAULTS.HOST_DOMAIN;
|
|
119
|
+
return `${address.user}|${server}|${address.device}`;
|
|
120
|
+
}
|
package/dist/protocol/media.js
CHANGED
|
@@ -17,8 +17,8 @@ exports.WA_MEDIA_HKDF_INFO = Object.freeze({
|
|
|
17
17
|
});
|
|
18
18
|
exports.WA_PREVIEW_MEDIA_HKDF_INFO = 'Messenger Preview Keys';
|
|
19
19
|
function getWaMediaHkdfInfo(mediaType) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
const info = exports.WA_MEDIA_HKDF_INFO[mediaType];
|
|
21
|
+
if (info !== undefined)
|
|
22
|
+
return info;
|
|
23
23
|
throw new Error(`unsupported media type: ${mediaType}`);
|
|
24
24
|
}
|
package/dist/protocol/nodes.js
CHANGED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WA_USYNC_DEFAULTS = exports.WA_USYNC_CONTEXTS = exports.WA_USYNC_MODES = void 0;
|
|
4
|
+
exports.WA_USYNC_MODES = Object.freeze({
|
|
5
|
+
QUERY: 'query'
|
|
6
|
+
});
|
|
7
|
+
exports.WA_USYNC_CONTEXTS = Object.freeze({
|
|
8
|
+
INTERACTIVE: 'interactive',
|
|
9
|
+
NOTIFICATION: 'notification'
|
|
10
|
+
});
|
|
11
|
+
exports.WA_USYNC_DEFAULTS = Object.freeze({
|
|
12
|
+
INDEX: '0',
|
|
13
|
+
LAST: 'true'
|
|
14
|
+
});
|
package/dist/retry/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.WaRetryReplayService = exports.pickRetryStateMax = exports.encodeRetryReplayPayload = exports.decodeRetryReplayPayload = exports.parseRetryReceiptRequest = exports.mapRetryReasonFromError = exports.RETRY_RECEIPT_VERSION = exports.RETRY_REASON = exports.RETRY_OUTBOUND_TTL_MS = exports.RETRY_KEYS_MIN_COUNT = exports.MAX_RETRY_ATTEMPTS = void 0;
|
|
3
|
+
exports.createOutboundRetryTracker = exports.WaRetryReplayService = exports.pickRetryStateMax = exports.encodeRetryReplayPayload = exports.decodeRetryReplayPayload = exports.parseRetryReceiptRequest = exports.mapRetryReasonFromError = exports.RETRY_RECEIPT_VERSION = exports.RETRY_REASON = exports.RETRY_OUTBOUND_TTL_MS = exports.RETRY_KEYS_MIN_COUNT = exports.MAX_RETRY_ATTEMPTS = void 0;
|
|
4
4
|
var constants_1 = require("./constants");
|
|
5
5
|
Object.defineProperty(exports, "MAX_RETRY_ATTEMPTS", { enumerable: true, get: function () { return constants_1.MAX_RETRY_ATTEMPTS; } });
|
|
6
6
|
Object.defineProperty(exports, "RETRY_KEYS_MIN_COUNT", { enumerable: true, get: function () { return constants_1.RETRY_KEYS_MIN_COUNT; } });
|
|
@@ -17,3 +17,5 @@ Object.defineProperty(exports, "encodeRetryReplayPayload", { enumerable: true, g
|
|
|
17
17
|
Object.defineProperty(exports, "pickRetryStateMax", { enumerable: true, get: function () { return outbound_1.pickRetryStateMax; } });
|
|
18
18
|
var replay_1 = require("./replay");
|
|
19
19
|
Object.defineProperty(exports, "WaRetryReplayService", { enumerable: true, get: function () { return replay_1.WaRetryReplayService; } });
|
|
20
|
+
var tracker_1 = require("./tracker");
|
|
21
|
+
Object.defineProperty(exports, "createOutboundRetryTracker", { enumerable: true, get: function () { return tracker_1.createOutboundRetryTracker; } });
|
package/dist/retry/outbound.js
CHANGED
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.encodeRetryReplayPayload = encodeRetryReplayPayload;
|
|
4
4
|
exports.decodeRetryReplayPayload = decodeRetryReplayPayload;
|
|
5
5
|
exports.pickRetryStateMax = pickRetryStateMax;
|
|
6
|
-
const base64_1 = require("../util/base64");
|
|
7
6
|
const bytes_1 = require("../util/bytes");
|
|
8
7
|
function requireObject(value) {
|
|
9
8
|
if (!value || typeof value !== 'object') {
|
|
@@ -23,7 +22,7 @@ function encodeRetryReplayPayload(payload) {
|
|
|
23
22
|
mode: payload.mode,
|
|
24
23
|
to: payload.to,
|
|
25
24
|
type: payload.type,
|
|
26
|
-
plaintext: (0,
|
|
25
|
+
plaintext: (0, bytes_1.bytesToBase64)(payload.plaintext)
|
|
27
26
|
}
|
|
28
27
|
: payload.mode === 'encrypted'
|
|
29
28
|
? {
|
|
@@ -31,12 +30,12 @@ function encodeRetryReplayPayload(payload) {
|
|
|
31
30
|
to: payload.to,
|
|
32
31
|
type: payload.type,
|
|
33
32
|
encType: payload.encType,
|
|
34
|
-
ciphertext: (0,
|
|
33
|
+
ciphertext: (0, bytes_1.bytesToBase64)(payload.ciphertext),
|
|
35
34
|
participant: payload.participant
|
|
36
35
|
}
|
|
37
36
|
: {
|
|
38
37
|
mode: payload.mode,
|
|
39
|
-
node: (0,
|
|
38
|
+
node: (0, bytes_1.bytesToBase64)(payload.node)
|
|
40
39
|
};
|
|
41
40
|
return bytes_1.TEXT_ENCODER.encode(JSON.stringify(serialized));
|
|
42
41
|
}
|
|
@@ -49,7 +48,7 @@ function decodeRetryReplayPayload(raw) {
|
|
|
49
48
|
mode,
|
|
50
49
|
to: requireString(parsed.to, 'to'),
|
|
51
50
|
type: requireString(parsed.type, 'type'),
|
|
52
|
-
plaintext: (0,
|
|
51
|
+
plaintext: (0, bytes_1.base64ToBytesChecked)(requireString(parsed.plaintext, 'plaintext'), 'retry.plaintext')
|
|
53
52
|
};
|
|
54
53
|
}
|
|
55
54
|
if (mode === 'encrypted') {
|
|
@@ -62,7 +61,7 @@ function decodeRetryReplayPayload(raw) {
|
|
|
62
61
|
to: requireString(parsed.to, 'to'),
|
|
63
62
|
type: requireString(parsed.type, 'type'),
|
|
64
63
|
encType,
|
|
65
|
-
ciphertext: (0,
|
|
64
|
+
ciphertext: (0, bytes_1.base64ToBytesChecked)(requireString(parsed.ciphertext, 'ciphertext'), 'retry.ciphertext'),
|
|
66
65
|
participant: parsed.participant === undefined
|
|
67
66
|
? undefined
|
|
68
67
|
: requireString(parsed.participant, 'participant')
|
|
@@ -71,7 +70,7 @@ function decodeRetryReplayPayload(raw) {
|
|
|
71
70
|
if (mode === 'opaque_node') {
|
|
72
71
|
return {
|
|
73
72
|
mode,
|
|
74
|
-
node: (0,
|
|
73
|
+
node: (0, bytes_1.base64ToBytesChecked)(requireString(parsed.node, 'node'), 'retry.node')
|
|
75
74
|
};
|
|
76
75
|
}
|
|
77
76
|
throw new Error(`invalid retry replay payload mode: ${mode}`);
|
package/dist/retry/parse.js
CHANGED
|
@@ -4,7 +4,7 @@ exports.parseRetryReceiptRequest = parseRetryReceiptRequest;
|
|
|
4
4
|
const constants_1 = require("../protocol/constants");
|
|
5
5
|
const constants_2 = require("../signal/api/constants");
|
|
6
6
|
const helpers_1 = require("../transport/node/helpers");
|
|
7
|
-
const
|
|
7
|
+
const primitives_1 = require("../util/primitives");
|
|
8
8
|
function parseFixedLengthBytes(value, byteLength, field) {
|
|
9
9
|
const out = (0, helpers_1.decodeNodeContentBase64OrBytes)(value, field);
|
|
10
10
|
if (out.byteLength !== byteLength) {
|
|
@@ -13,81 +13,62 @@ function parseFixedLengthBytes(value, byteLength, field) {
|
|
|
13
13
|
return out;
|
|
14
14
|
}
|
|
15
15
|
function parseBigEndianUint(bytes, field) {
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
switch (bytes.byteLength) {
|
|
17
|
+
case 1:
|
|
18
|
+
return bytes[0];
|
|
19
|
+
case 2:
|
|
20
|
+
return (bytes[0] << 8) | bytes[1];
|
|
21
|
+
case 3:
|
|
22
|
+
return ((bytes[0] << 16) | (bytes[1] << 8) | bytes[2]) >>> 0;
|
|
23
|
+
case 4:
|
|
24
|
+
return ((bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3]) >>> 0;
|
|
25
|
+
default:
|
|
26
|
+
throw new Error(`${field} has invalid byte length`);
|
|
18
27
|
}
|
|
19
|
-
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
20
|
-
if (bytes.byteLength === 1) {
|
|
21
|
-
return view.getUint8(0);
|
|
22
|
-
}
|
|
23
|
-
if (bytes.byteLength === 2) {
|
|
24
|
-
return view.getUint16(0);
|
|
25
|
-
}
|
|
26
|
-
return bytes.byteLength === 3 ? (view.getUint16(0) << 8) | view.getUint8(2) : view.getUint32(0);
|
|
27
|
-
}
|
|
28
|
-
function parseRetryType(value) {
|
|
29
|
-
if (value === 'retry' || value === 'enc_rekey_retry') {
|
|
30
|
-
return value;
|
|
31
|
-
}
|
|
32
|
-
return null;
|
|
33
28
|
}
|
|
34
|
-
function
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
return 0;
|
|
38
|
-
}
|
|
39
|
-
if (parsed < 0) {
|
|
40
|
-
throw new Error('retry count must be >= 0');
|
|
41
|
-
}
|
|
42
|
-
return parsed;
|
|
43
|
-
}
|
|
44
|
-
function parseRetryReason(value) {
|
|
45
|
-
const parsed = (0, parse_1.parseOptionalInt)(value);
|
|
46
|
-
if (parsed === undefined) {
|
|
47
|
-
return undefined;
|
|
48
|
-
}
|
|
49
|
-
if (parsed < 0) {
|
|
50
|
-
throw new Error('retry reason must be >= 0');
|
|
29
|
+
function requireNode(node, message) {
|
|
30
|
+
if (!node) {
|
|
31
|
+
throw new Error(message);
|
|
51
32
|
}
|
|
52
|
-
return
|
|
33
|
+
return node;
|
|
53
34
|
}
|
|
54
35
|
function parseRetryKeyBundle(node) {
|
|
55
36
|
if (!node) {
|
|
56
37
|
return undefined;
|
|
57
38
|
}
|
|
58
|
-
const identityNode = (0, helpers_1.
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
39
|
+
const [identityNode, signedKeyNode, keyNode, deviceIdentityNode] = (0, helpers_1.findNodeChildrenByTags)(node, [constants_1.WA_NODE_TAGS.IDENTITY, constants_1.WA_NODE_TAGS.SKEY, constants_1.WA_NODE_TAGS.KEY, constants_1.WA_NODE_TAGS.DEVICE_IDENTITY]);
|
|
40
|
+
const identity = requireNode(identityNode, 'retry keys section missing identity or skey');
|
|
41
|
+
const signedKey = requireNode(signedKeyNode, 'retry keys section missing identity or skey');
|
|
42
|
+
const [signedKeyIdNode, signedKeyValueNode, signedKeySignatureNode] = (0, helpers_1.findNodeChildrenByTags)(signedKey, [constants_1.WA_NODE_TAGS.ID, constants_1.WA_NODE_TAGS.VALUE, constants_1.WA_NODE_TAGS.SIGNATURE]);
|
|
43
|
+
const signedKeyId = requireNode(signedKeyIdNode, 'retry keys section has incomplete skey');
|
|
44
|
+
const signedKeyValue = requireNode(signedKeyValueNode, 'retry keys section has incomplete skey');
|
|
45
|
+
const signedKeySignature = requireNode(signedKeySignatureNode, 'retry keys section has incomplete skey');
|
|
46
|
+
let keyIdNode;
|
|
47
|
+
let keyValueNode;
|
|
48
|
+
if (keyNode) {
|
|
49
|
+
const keyNodes = (0, helpers_1.findNodeChildrenByTags)(keyNode, [constants_1.WA_NODE_TAGS.ID, constants_1.WA_NODE_TAGS.VALUE]);
|
|
50
|
+
keyIdNode = keyNodes[0];
|
|
51
|
+
keyValueNode = keyNodes[1];
|
|
52
|
+
}
|
|
53
|
+
const keyId = keyNode ? requireNode(keyIdNode, 'retry keys section has incomplete key') : null;
|
|
54
|
+
const keyValue = keyNode
|
|
55
|
+
? requireNode(keyValueNode, 'retry keys section has incomplete key')
|
|
56
|
+
: null;
|
|
76
57
|
return {
|
|
77
|
-
identity: parseFixedLengthBytes(
|
|
58
|
+
identity: parseFixedLengthBytes(identity.content, constants_2.SIGNAL_KEY_DATA_LENGTH, 'retry.keys.identity'),
|
|
78
59
|
deviceIdentity: deviceIdentityNode
|
|
79
60
|
? (0, helpers_1.decodeNodeContentBase64OrBytes)(deviceIdentityNode.content, 'retry.keys.device-identity')
|
|
80
61
|
: undefined,
|
|
81
|
-
key:
|
|
62
|
+
key: keyId && keyValue
|
|
82
63
|
? {
|
|
83
|
-
id: parseBigEndianUint(parseFixedLengthBytes(
|
|
84
|
-
publicKey: parseFixedLengthBytes(
|
|
64
|
+
id: parseBigEndianUint(parseFixedLengthBytes(keyId.content, constants_2.SIGNAL_KEY_ID_LENGTH, 'retry.keys.key.id'), 'retry.keys.key.id'),
|
|
65
|
+
publicKey: parseFixedLengthBytes(keyValue.content, constants_2.SIGNAL_KEY_DATA_LENGTH, 'retry.keys.key.value')
|
|
85
66
|
}
|
|
86
67
|
: undefined,
|
|
87
68
|
skey: {
|
|
88
|
-
id: parseBigEndianUint(parseFixedLengthBytes(
|
|
89
|
-
publicKey: parseFixedLengthBytes(
|
|
90
|
-
signature: parseFixedLengthBytes(
|
|
69
|
+
id: parseBigEndianUint(parseFixedLengthBytes(signedKeyId.content, constants_2.SIGNAL_KEY_ID_LENGTH, 'retry.keys.skey.id'), 'retry.keys.skey.id'),
|
|
70
|
+
publicKey: parseFixedLengthBytes(signedKeyValue.content, constants_2.SIGNAL_KEY_DATA_LENGTH, 'retry.keys.skey.value'),
|
|
71
|
+
signature: parseFixedLengthBytes(signedKeySignature.content, constants_2.SIGNAL_SIGNATURE_LENGTH, 'retry.keys.skey.signature')
|
|
91
72
|
}
|
|
92
73
|
};
|
|
93
74
|
}
|
|
@@ -95,7 +76,9 @@ function parseRetryReceiptRequest(node) {
|
|
|
95
76
|
if (node.tag !== constants_1.WA_MESSAGE_TAGS.RECEIPT) {
|
|
96
77
|
return null;
|
|
97
78
|
}
|
|
98
|
-
const receiptType =
|
|
79
|
+
const receiptType = node.attrs.type === 'retry' || node.attrs.type === 'enc_rekey_retry'
|
|
80
|
+
? node.attrs.type
|
|
81
|
+
: null;
|
|
99
82
|
if (!receiptType) {
|
|
100
83
|
return null;
|
|
101
84
|
}
|
|
@@ -104,19 +87,18 @@ function parseRetryReceiptRequest(node) {
|
|
|
104
87
|
if (!stanzaId || !from) {
|
|
105
88
|
throw new Error('retry receipt is missing id/from attrs');
|
|
106
89
|
}
|
|
107
|
-
const retryNode = (0, helpers_1.
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
const originalMsgId = retryNode.attrs.id;
|
|
90
|
+
const [retryNode, registrationNode, keysNode] = (0, helpers_1.findNodeChildrenByTags)(node, [
|
|
91
|
+
'retry',
|
|
92
|
+
constants_1.WA_NODE_TAGS.REGISTRATION,
|
|
93
|
+
'keys'
|
|
94
|
+
]);
|
|
95
|
+
const retry = requireNode(retryNode, 'retry receipt is missing retry child');
|
|
96
|
+
const registrationNodeValue = requireNode(registrationNode, 'retry receipt is missing registration child');
|
|
97
|
+
const originalMsgId = retry.attrs.id;
|
|
116
98
|
if (!originalMsgId) {
|
|
117
99
|
throw new Error('retry receipt is missing retry.id');
|
|
118
100
|
}
|
|
119
|
-
const registration = parseFixedLengthBytes(
|
|
101
|
+
const registration = parseFixedLengthBytes(registrationNodeValue.content, constants_2.SIGNAL_REGISTRATION_ID_LENGTH, 'retry.registration');
|
|
120
102
|
return {
|
|
121
103
|
type: receiptType,
|
|
122
104
|
stanzaId,
|
|
@@ -124,10 +106,10 @@ function parseRetryReceiptRequest(node) {
|
|
|
124
106
|
participant: node.attrs.participant,
|
|
125
107
|
recipient: node.attrs.recipient,
|
|
126
108
|
originalMsgId,
|
|
127
|
-
retryCount:
|
|
128
|
-
retryReason:
|
|
129
|
-
t:
|
|
109
|
+
retryCount: (0, primitives_1.parseOptionalInt)(retry.attrs.count) ?? 0,
|
|
110
|
+
retryReason: (0, primitives_1.parseOptionalInt)(retry.attrs.error ?? node.attrs.error),
|
|
111
|
+
t: retry.attrs.t ?? node.attrs.t,
|
|
130
112
|
regId: parseBigEndianUint(registration, 'retry.registration'),
|
|
131
|
-
keyBundle: parseRetryKeyBundle(
|
|
113
|
+
keyBundle: parseRetryKeyBundle(keysNode)
|
|
132
114
|
};
|
|
133
115
|
}
|
package/dist/retry/replay.js
CHANGED
|
@@ -16,17 +16,19 @@ class WaRetryReplayService {
|
|
|
16
16
|
}
|
|
17
17
|
async resendOutboundMessage(outbound, requesterJid, retryCount) {
|
|
18
18
|
const payload = (0, outbound_1.decodeRetryReplayPayload)(outbound.replayPayload);
|
|
19
|
+
const requesterAddress = (0, jid_1.parseSignalAddressFromJid)(requesterJid);
|
|
20
|
+
const normalizedRequesterJid = (0, jid_1.normalizeDeviceJid)(requesterJid);
|
|
19
21
|
if (payload.mode === 'plaintext') {
|
|
20
|
-
return this.resendPlaintextPayload(outbound, payload, requesterJid, retryCount);
|
|
22
|
+
return this.resendPlaintextPayload(outbound, payload, requesterJid, requesterAddress, retryCount);
|
|
21
23
|
}
|
|
22
24
|
if (payload.mode === 'encrypted') {
|
|
23
|
-
return this.resendEncryptedPayload(outbound, payload, requesterJid, retryCount);
|
|
25
|
+
return this.resendEncryptedPayload(outbound, payload, requesterJid, normalizedRequesterJid, retryCount);
|
|
24
26
|
}
|
|
25
|
-
return this.resendOpaquePayload(outbound, payload,
|
|
27
|
+
return this.resendOpaquePayload(outbound, payload, normalizedRequesterJid);
|
|
26
28
|
}
|
|
27
|
-
async resendPlaintextPayload(outbound, payload, requesterJid, retryCount) {
|
|
29
|
+
async resendPlaintextPayload(outbound, payload, requesterJid, requesterAddress, retryCount) {
|
|
28
30
|
if ((0, jid_1.isGroupOrBroadcastJid)(payload.to)) {
|
|
29
|
-
return this.resendGroupPlaintextPayload(outbound, payload, requesterJid);
|
|
31
|
+
return this.resendGroupPlaintextPayload(outbound, payload, requesterJid, requesterAddress);
|
|
30
32
|
}
|
|
31
33
|
let payloadUserJid;
|
|
32
34
|
let requesterUserJid;
|
|
@@ -40,8 +42,8 @@ class WaRetryReplayService {
|
|
|
40
42
|
if (payloadUserJid !== requesterUserJid) {
|
|
41
43
|
return 'ineligible';
|
|
42
44
|
}
|
|
43
|
-
const encrypted = await this.signalProtocol.encryptMessage(
|
|
44
|
-
await this.messageClient.sendEncrypted({
|
|
45
|
+
const encrypted = await this.options.signalProtocol.encryptMessage(requesterAddress, payload.plaintext);
|
|
46
|
+
await this.options.messageClient.sendEncrypted({
|
|
45
47
|
to: requesterJid,
|
|
46
48
|
encType: encrypted.type,
|
|
47
49
|
ciphertext: encrypted.ciphertext,
|
|
@@ -51,15 +53,15 @@ class WaRetryReplayService {
|
|
|
51
53
|
});
|
|
52
54
|
return 'resent';
|
|
53
55
|
}
|
|
54
|
-
async resendGroupPlaintextPayload(outbound, payload, requesterJid) {
|
|
56
|
+
async resendGroupPlaintextPayload(outbound, payload, requesterJid, requesterAddress) {
|
|
55
57
|
const plaintext = (await this.maybeWrapGroupRetryPlaintextForSelfDevice(payload, requesterJid)) ??
|
|
56
58
|
payload.plaintext;
|
|
57
|
-
const encrypted = await this.signalProtocol.encryptMessage(
|
|
59
|
+
const encrypted = await this.options.signalProtocol.encryptMessage(requesterAddress, plaintext);
|
|
58
60
|
let deviceIdentity;
|
|
59
61
|
if (encrypted.type === 'pkmsg') {
|
|
60
|
-
const signedIdentity = this.getCurrentSignedIdentity();
|
|
62
|
+
const signedIdentity = this.options.getCurrentSignedIdentity();
|
|
61
63
|
if (!signedIdentity) {
|
|
62
|
-
this.logger.warn('retry request rejected: missing signed identity for pkmsg group retry');
|
|
64
|
+
this.options.logger.warn('retry request rejected: missing signed identity for pkmsg group retry');
|
|
63
65
|
return 'ineligible';
|
|
64
66
|
}
|
|
65
67
|
deviceIdentity = _proto_1.proto.ADVSignedDeviceIdentity.encode(signedIdentity).finish();
|
|
@@ -69,22 +71,22 @@ class WaRetryReplayService {
|
|
|
69
71
|
type: payload.type,
|
|
70
72
|
id: outbound.messageId,
|
|
71
73
|
requesterJid,
|
|
72
|
-
addressingMode:
|
|
74
|
+
addressingMode: requesterAddress.server === 'lid' ? 'lid' : 'pn',
|
|
73
75
|
encType: encrypted.type,
|
|
74
76
|
ciphertext: encrypted.ciphertext,
|
|
75
77
|
deviceIdentity
|
|
76
78
|
});
|
|
77
|
-
await this.messageClient.sendMessageNode(retryNode);
|
|
79
|
+
await this.options.messageClient.sendMessageNode(retryNode);
|
|
78
80
|
return 'resent';
|
|
79
81
|
}
|
|
80
|
-
async resendEncryptedPayload(outbound, payload, requesterJid, retryCount) {
|
|
82
|
+
async resendEncryptedPayload(outbound, payload, requesterJid, normalizedRequesterJid, retryCount) {
|
|
81
83
|
if (payload.encType === 'skmsg') {
|
|
82
84
|
return 'ineligible';
|
|
83
85
|
}
|
|
84
|
-
if ((0, jid_1.normalizeDeviceJid)(payload.to) !==
|
|
86
|
+
if ((0, jid_1.normalizeDeviceJid)(payload.to) !== normalizedRequesterJid) {
|
|
85
87
|
return 'ineligible';
|
|
86
88
|
}
|
|
87
|
-
await this.messageClient.sendEncrypted({
|
|
89
|
+
await this.options.messageClient.sendEncrypted({
|
|
88
90
|
to: requesterJid,
|
|
89
91
|
encType: payload.encType,
|
|
90
92
|
ciphertext: payload.ciphertext,
|
|
@@ -95,8 +97,11 @@ class WaRetryReplayService {
|
|
|
95
97
|
});
|
|
96
98
|
return 'resent';
|
|
97
99
|
}
|
|
98
|
-
async resendOpaquePayload(outbound, payload,
|
|
100
|
+
async resendOpaquePayload(outbound, payload, normalizedRequesterJid) {
|
|
99
101
|
const decoded = (0, binary_1.decodeBinaryNode)(payload.node);
|
|
102
|
+
if (!this.isOpaqueReplayCompatible(decoded, normalizedRequesterJid)) {
|
|
103
|
+
return 'ineligible';
|
|
104
|
+
}
|
|
100
105
|
const replayNode = decoded.attrs.id === outbound.messageId
|
|
101
106
|
? decoded
|
|
102
107
|
: {
|
|
@@ -106,10 +111,7 @@ class WaRetryReplayService {
|
|
|
106
111
|
id: outbound.messageId
|
|
107
112
|
}
|
|
108
113
|
};
|
|
109
|
-
|
|
110
|
-
return 'ineligible';
|
|
111
|
-
}
|
|
112
|
-
await this.messageClient.sendMessageNode(replayNode);
|
|
114
|
+
await this.options.messageClient.sendMessageNode(replayNode);
|
|
113
115
|
return 'resent';
|
|
114
116
|
}
|
|
115
117
|
async maybeWrapGroupRetryPlaintextForSelfDevice(payload, requesterJid) {
|
|
@@ -123,7 +125,7 @@ class WaRetryReplayService {
|
|
|
123
125
|
return (0, padding_1.writeRandomPadMax16)(_proto_1.proto.Message.encode(wrapped).finish());
|
|
124
126
|
}
|
|
125
127
|
catch (error) {
|
|
126
|
-
this.logger.warn('retry request failed to wrap deviceSent payload for self requester', {
|
|
128
|
+
this.options.logger.warn('retry request failed to wrap deviceSent payload for self requester', {
|
|
127
129
|
requester: requesterJid,
|
|
128
130
|
to: payload.to,
|
|
129
131
|
message: (0, primitives_1.toError)(error).message
|
|
@@ -143,38 +145,35 @@ class WaRetryReplayService {
|
|
|
143
145
|
}
|
|
144
146
|
return false;
|
|
145
147
|
}
|
|
146
|
-
|
|
147
|
-
return this.options.logger;
|
|
148
|
-
}
|
|
149
|
-
get messageClient() {
|
|
150
|
-
return this.options.messageClient;
|
|
151
|
-
}
|
|
152
|
-
get signalProtocol() {
|
|
153
|
-
return this.options.signalProtocol;
|
|
154
|
-
}
|
|
155
|
-
getCurrentSignedIdentity() {
|
|
156
|
-
return this.options.getCurrentSignedIdentity();
|
|
157
|
-
}
|
|
158
|
-
isOpaqueReplayCompatible(node, requesterJid) {
|
|
159
|
-
const requester = (0, jid_1.normalizeDeviceJid)(requesterJid);
|
|
148
|
+
isOpaqueReplayCompatible(node, normalizedRequesterJid) {
|
|
160
149
|
const participantsNode = (0, helpers_1.findNodeChild)(node, 'participants');
|
|
161
150
|
if (participantsNode) {
|
|
162
|
-
const
|
|
163
|
-
|
|
164
|
-
|
|
151
|
+
const participantsContent = Array.isArray(participantsNode.content)
|
|
152
|
+
? participantsNode.content
|
|
153
|
+
: [];
|
|
154
|
+
let participantNode;
|
|
155
|
+
let participantCount = 0;
|
|
156
|
+
for (let index = 0; index < participantsContent.length; index++) {
|
|
157
|
+
const child = participantsContent[index];
|
|
158
|
+
if (child.tag !== 'to')
|
|
159
|
+
continue;
|
|
160
|
+
participantCount++;
|
|
161
|
+
if (participantCount > 1)
|
|
162
|
+
return false;
|
|
163
|
+
participantNode = child;
|
|
165
164
|
}
|
|
166
|
-
|
|
167
|
-
if (!participantJid) {
|
|
165
|
+
if (participantCount !== 1 || !participantNode)
|
|
168
166
|
return false;
|
|
169
|
-
|
|
170
|
-
|
|
167
|
+
const participantJid = participantNode.attrs.jid;
|
|
168
|
+
if (!participantJid)
|
|
169
|
+
return false;
|
|
170
|
+
return (0, jid_1.normalizeDeviceJid)(participantJid) === normalizedRequesterJid;
|
|
171
171
|
}
|
|
172
172
|
if (node.attrs.participant) {
|
|
173
|
-
return (0, jid_1.normalizeDeviceJid)(node.attrs.participant) ===
|
|
174
|
-
}
|
|
175
|
-
if (node.attrs.to) {
|
|
176
|
-
return (0, jid_1.normalizeDeviceJid)(node.attrs.to) === requester;
|
|
173
|
+
return (0, jid_1.normalizeDeviceJid)(node.attrs.participant) === normalizedRequesterJid;
|
|
177
174
|
}
|
|
175
|
+
if (node.attrs.to)
|
|
176
|
+
return (0, jid_1.normalizeDeviceJid)(node.attrs.to) === normalizedRequesterJid;
|
|
178
177
|
return false;
|
|
179
178
|
}
|
|
180
179
|
}
|