zapo-js 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -4
- package/dist/appstate/WaAppStateCrypto.js +1 -1
- package/dist/appstate/WaAppStateSyncClient.js +138 -93
- package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
- package/dist/appstate/index.js +8 -6
- package/dist/appstate/utils.js +0 -5
- package/dist/auth/WaAuthClient.js +36 -47
- package/dist/auth/flow/WaAuthCredentialsFlow.js +7 -7
- package/dist/auth/index.js +1 -6
- package/dist/auth/pairing/WaPairingCodeCrypto.js +6 -4
- package/dist/auth/pairing/WaPairingFlow.js +13 -3
- package/dist/client/WaClient.js +225 -101
- package/dist/client/WaClientFactory.js +294 -44
- package/dist/client/connection/WaConnectionManager.js +19 -10
- package/dist/client/coordinators/WaBusinessCoordinator.js +241 -0
- package/dist/client/coordinators/WaGroupCoordinator.js +11 -7
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +1 -0
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +292 -99
- package/dist/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
- package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
- package/dist/client/coordinators/WaProfileCoordinator.js +212 -0
- package/dist/client/coordinators/WaRetryCoordinator.js +179 -27
- package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
- package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +166 -0
- package/dist/client/dirty.js +40 -20
- package/dist/client/events/devices.js +72 -0
- package/dist/client/events/group.js +3 -11
- package/dist/client/events/identity.js +22 -0
- package/dist/client/events/privacy-token.js +39 -0
- package/dist/client/history-sync.js +50 -9
- package/dist/client/incoming.js +37 -7
- package/dist/client/mailbox.js +24 -23
- package/dist/client/messages.js +107 -31
- package/dist/client/messaging/fanout.js +21 -11
- package/dist/client/messaging/participants.js +6 -4
- package/dist/client/persistence/WriteBehindPersistence.js +129 -0
- package/dist/client/tokens/cs-token.js +50 -0
- package/dist/client/tokens/tc-token.js +25 -0
- package/dist/crypto/core/index.js +2 -2
- package/dist/crypto/core/keys.js +4 -4
- package/dist/crypto/core/nonce.js +2 -0
- package/dist/crypto/core/primitives.js +0 -8
- package/dist/crypto/core/random.js +22 -0
- package/dist/crypto/curves/X25519.js +25 -6
- package/dist/crypto/index.js +3 -0
- package/dist/crypto/math/constants.js +13 -36
- package/dist/crypto/math/edwards.js +171 -44
- package/dist/crypto/math/fe.js +706 -0
- package/dist/crypto/math/mod.js +10 -3
- package/dist/esm/appstate/WaAppStateCrypto.js +1 -1
- package/dist/esm/appstate/WaAppStateSyncClient.js +138 -93
- package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
- package/dist/esm/appstate/index.js +2 -2
- package/dist/esm/appstate/utils.js +2 -5
- package/dist/esm/auth/WaAuthClient.js +36 -47
- package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +7 -7
- package/dist/esm/auth/index.js +0 -2
- package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +6 -4
- package/dist/esm/auth/pairing/WaPairingFlow.js +14 -4
- package/dist/esm/client/WaClient.js +225 -101
- package/dist/esm/client/WaClientFactory.js +295 -45
- package/dist/esm/client/connection/WaConnectionManager.js +19 -10
- package/dist/esm/client/coordinators/WaBusinessCoordinator.js +238 -0
- package/dist/esm/client/coordinators/WaGroupCoordinator.js +11 -7
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +1 -0
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +295 -102
- package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
- package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
- package/dist/esm/client/coordinators/WaProfileCoordinator.js +209 -0
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +181 -29
- package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
- package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +162 -0
- package/dist/esm/client/dirty.js +40 -20
- package/dist/esm/client/events/devices.js +68 -0
- package/dist/esm/client/events/group.js +3 -11
- package/dist/esm/client/events/identity.js +19 -0
- package/dist/esm/client/events/privacy-token.js +36 -0
- package/dist/esm/client/history-sync.js +50 -9
- package/dist/esm/client/incoming.js +38 -8
- package/dist/esm/client/mailbox.js +24 -23
- package/dist/esm/client/messages.js +108 -32
- package/dist/esm/client/messaging/fanout.js +22 -12
- package/dist/esm/client/messaging/participants.js +6 -4
- package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
- package/dist/esm/client/tokens/cs-token.js +46 -0
- package/dist/esm/client/tokens/tc-token.js +18 -0
- package/dist/esm/crypto/core/index.js +2 -2
- package/dist/esm/crypto/core/keys.js +1 -1
- package/dist/esm/crypto/core/nonce.js +2 -0
- package/dist/esm/crypto/core/primitives.js +0 -7
- package/dist/esm/crypto/core/random.js +22 -1
- package/dist/esm/crypto/curves/X25519.js +25 -6
- package/dist/esm/crypto/index.js +1 -0
- package/dist/esm/crypto/math/constants.js +12 -35
- package/dist/esm/crypto/math/edwards.js +174 -47
- package/dist/esm/crypto/math/fe.js +691 -0
- package/dist/esm/crypto/math/mod.js +10 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
- package/dist/esm/infra/perf/BoundedTaskQueue.js +3 -1
- package/dist/esm/infra/perf/PromiseDedup.js +20 -0
- package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
- package/dist/esm/infra/perf/StoreLock.js +77 -0
- package/dist/esm/media/WaMediaCrypto.js +95 -13
- package/dist/esm/media/WaMediaTransferClient.js +39 -47
- package/dist/esm/media/constants.js +2 -1
- package/dist/esm/message/WaMessageClient.js +26 -19
- package/dist/esm/message/content.js +195 -9
- package/dist/esm/message/icdc.js +76 -0
- package/dist/esm/message/incoming.js +24 -12
- package/dist/esm/message/phash.js +3 -1
- package/dist/esm/message/reporting-token.js +14 -27
- package/dist/esm/protocol/appstate.js +9 -40
- package/dist/esm/protocol/browser.js +10 -18
- package/dist/esm/protocol/constants.js +5 -3
- package/dist/esm/protocol/defaults.js +6 -0
- package/dist/esm/protocol/index.js +1 -2
- package/dist/esm/protocol/jid.js +105 -36
- package/dist/esm/protocol/message.js +61 -1
- package/dist/esm/protocol/nodes.js +2 -0
- package/dist/esm/protocol/notification.js +3 -1
- package/dist/esm/protocol/privacy-token.js +17 -0
- package/dist/esm/protocol/privacy.js +55 -0
- package/dist/esm/protocol/stream.js +26 -1
- package/dist/esm/retry/codec.js +216 -0
- package/dist/esm/retry/constants.js +1 -1
- package/dist/esm/retry/index.js +2 -2
- package/dist/esm/retry/parse.js +50 -30
- package/dist/esm/retry/replay.js +11 -7
- package/dist/esm/retry/tracker.js +50 -12
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +49 -32
- package/dist/esm/signal/api/SignalDigestSyncApi.js +13 -9
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +26 -11
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +18 -7
- package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
- package/dist/esm/signal/api/SignalSessionSyncApi.js +16 -7
- package/dist/esm/signal/api/result-map.js +10 -0
- package/dist/esm/signal/constants.js +0 -4
- package/dist/esm/signal/crypto/WaAdvSignature.js +12 -6
- package/dist/esm/signal/{store/sqlite.js → encoding.js} +78 -24
- package/dist/esm/signal/group/SenderKeyCodec.js +3 -2
- package/dist/esm/signal/group/SenderKeyManager.js +125 -106
- package/dist/esm/signal/index.js +1 -0
- package/dist/esm/signal/registration/keygen.js +6 -2
- package/dist/esm/signal/registration/utils.js +1 -0
- package/dist/esm/signal/session/SignalProtocol.js +150 -74
- package/dist/esm/signal/session/resolver.js +137 -102
- package/dist/esm/store/contracts/privacy-token.store.js +1 -0
- package/dist/esm/store/createStore.js +101 -187
- package/dist/esm/store/index.js +1 -10
- package/dist/esm/store/locks/appstate.lock.js +26 -0
- package/dist/esm/store/locks/auth.lock.js +15 -0
- package/dist/esm/store/locks/contact.lock.js +20 -0
- package/dist/esm/store/locks/device-list.lock.js +20 -0
- package/dist/esm/store/locks/message.lock.js +21 -0
- package/dist/esm/store/locks/participants.lock.js +20 -0
- package/dist/esm/store/locks/privacy-token.lock.js +18 -0
- package/dist/esm/store/locks/retry.lock.js +29 -0
- package/dist/esm/store/locks/sender-key.lock.js +52 -0
- package/dist/esm/store/locks/signal.lock.js +63 -0
- package/dist/esm/store/locks/thread.lock.js +21 -0
- package/dist/esm/store/noop.store.js +1 -1
- package/dist/esm/store/providers/memory/appstate.store.js +22 -24
- package/dist/esm/store/providers/memory/device-list.store.js +10 -5
- package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
- package/dist/esm/store/providers/memory/retry.store.js +77 -2
- package/dist/esm/store/providers/memory/sender-key.store.js +6 -1
- package/dist/esm/store/providers/memory/signal.store.js +36 -19
- package/dist/esm/transport/WaComms.js +3 -1
- package/dist/esm/transport/WaWebSocket.js +0 -6
- package/dist/esm/transport/binary/constants.js +0 -30
- package/dist/esm/transport/binary/decoder.js +4 -4
- package/dist/esm/transport/binary/encoder.js +8 -15
- package/dist/esm/transport/binary/index.js +0 -1
- package/dist/esm/transport/node/WaNodeOrchestrator.js +25 -19
- package/dist/esm/transport/node/builders/business.js +129 -0
- package/dist/esm/transport/node/builders/global.js +370 -0
- package/dist/esm/transport/node/builders/index.js +5 -2
- package/dist/esm/transport/node/builders/message.js +63 -239
- package/dist/esm/transport/node/builders/pairing.js +0 -24
- package/dist/esm/transport/node/builders/privacy-token.js +41 -0
- package/dist/esm/transport/node/builders/privacy.js +48 -0
- package/dist/esm/transport/node/builders/profile.js +70 -0
- package/dist/esm/transport/node/builders/retry.js +10 -22
- package/dist/esm/transport/node/builders/usync.js +6 -2
- package/dist/esm/transport/node/helpers.js +19 -1
- package/dist/esm/transport/node/usync.js +3 -33
- package/dist/esm/transport/node/xml.js +35 -14
- package/dist/esm/transport/noise/WaClientPayload.js +10 -10
- package/dist/esm/transport/noise/WaNoiseCert.js +3 -3
- package/dist/esm/transport/noise/WaNoiseSession.js +64 -23
- package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
- package/dist/esm/transport/stream/parse.js +8 -4
- package/dist/esm/util/bytes.js +22 -18
- package/dist/esm/util/index.js +5 -0
- package/dist/esm/util/primitives.js +3 -2
- package/dist/index.js +7 -1
- package/dist/infra/perf/BackgroundQueue.js +482 -0
- package/dist/infra/perf/BoundedTaskQueue.js +3 -1
- package/dist/infra/perf/PromiseDedup.js +24 -0
- package/dist/infra/perf/SharedExclusiveGate.js +113 -0
- package/dist/infra/perf/StoreLock.js +81 -0
- package/dist/media/WaMediaCrypto.js +94 -12
- package/dist/media/WaMediaTransferClient.js +39 -47
- package/dist/media/constants.js +2 -1
- package/dist/message/WaMessageClient.js +26 -19
- package/dist/message/content.js +198 -9
- package/dist/message/icdc.js +81 -0
- package/dist/message/incoming.js +24 -12
- package/dist/message/phash.js +3 -1
- package/dist/message/reporting-token.js +14 -28
- package/dist/protocol/appstate.js +10 -41
- package/dist/protocol/browser.js +10 -18
- package/dist/protocol/constants.js +21 -2
- package/dist/protocol/defaults.js +6 -0
- package/dist/protocol/index.js +8 -5
- package/dist/protocol/jid.js +111 -36
- package/dist/protocol/message.js +62 -2
- package/dist/protocol/nodes.js +2 -0
- package/dist/protocol/notification.js +3 -1
- package/dist/protocol/privacy-token.js +20 -0
- package/dist/protocol/privacy.js +58 -0
- package/dist/protocol/stream.js +27 -2
- package/dist/retry/codec.js +220 -0
- package/dist/retry/constants.js +1 -1
- package/dist/retry/index.js +5 -5
- package/dist/retry/parse.js +51 -30
- package/dist/retry/replay.js +10 -6
- package/dist/retry/tracker.js +50 -12
- package/dist/signal/api/SignalDeviceSyncApi.js +48 -31
- package/dist/signal/api/SignalDigestSyncApi.js +13 -9
- package/dist/signal/api/SignalIdentitySyncApi.js +25 -10
- package/dist/signal/api/SignalMissingPreKeysSyncApi.js +17 -6
- package/dist/signal/api/SignalRotateKeyApi.js +4 -2
- package/dist/signal/api/SignalSessionSyncApi.js +16 -7
- package/dist/signal/api/result-map.js +13 -0
- package/dist/signal/constants.js +1 -5
- package/dist/signal/crypto/WaAdvSignature.js +11 -5
- package/dist/signal/{store/sqlite.js → encoding.js} +79 -25
- package/dist/signal/group/SenderKeyCodec.js +4 -3
- package/dist/signal/group/SenderKeyManager.js +125 -106
- package/dist/signal/index.js +13 -1
- package/dist/signal/registration/keygen.js +6 -2
- package/dist/signal/registration/utils.js +1 -0
- package/dist/signal/session/SignalProtocol.js +150 -74
- package/dist/signal/session/resolver.js +135 -100
- package/dist/store/contracts/privacy-token.store.js +2 -0
- package/dist/store/createStore.js +101 -187
- package/dist/store/index.js +15 -33
- package/dist/store/locks/appstate.lock.js +29 -0
- package/dist/store/locks/auth.lock.js +18 -0
- package/dist/store/locks/contact.lock.js +23 -0
- package/dist/store/locks/device-list.lock.js +23 -0
- package/dist/store/locks/message.lock.js +24 -0
- package/dist/store/locks/participants.lock.js +23 -0
- package/dist/store/locks/privacy-token.lock.js +21 -0
- package/dist/store/locks/retry.lock.js +32 -0
- package/dist/store/locks/sender-key.lock.js +55 -0
- package/dist/store/locks/signal.lock.js +66 -0
- package/dist/store/locks/thread.lock.js +24 -0
- package/dist/store/noop.store.js +1 -1
- package/dist/store/providers/memory/appstate.store.js +22 -24
- package/dist/store/providers/memory/device-list.store.js +10 -5
- package/dist/store/providers/memory/privacy-token.store.js +47 -0
- package/dist/store/providers/memory/retry.store.js +77 -2
- package/dist/store/providers/memory/sender-key.store.js +6 -1
- package/dist/store/providers/memory/signal.store.js +36 -19
- package/dist/transport/WaComms.js +3 -1
- package/dist/transport/WaWebSocket.js +0 -6
- package/dist/transport/binary/constants.js +1 -31
- package/dist/transport/binary/decoder.js +4 -4
- package/dist/transport/binary/encoder.js +8 -15
- package/dist/transport/binary/index.js +0 -4
- package/dist/transport/node/WaNodeOrchestrator.js +24 -18
- package/dist/transport/node/builders/business.js +137 -0
- package/dist/transport/node/builders/global.js +375 -0
- package/dist/transport/node/builders/index.js +18 -9
- package/dist/transport/node/builders/message.js +64 -245
- package/dist/transport/node/builders/pairing.js +0 -26
- package/dist/transport/node/builders/privacy-token.js +46 -0
- package/dist/transport/node/builders/privacy.js +55 -0
- package/dist/transport/node/builders/profile.js +78 -0
- package/dist/transport/node/builders/retry.js +9 -21
- package/dist/transport/node/builders/usync.js +6 -2
- package/dist/transport/node/helpers.js +20 -1
- package/dist/transport/node/usync.js +2 -32
- package/dist/transport/node/xml.js +35 -14
- package/dist/transport/noise/WaClientPayload.js +13 -13
- package/dist/transport/noise/WaNoiseCert.js +2 -2
- package/dist/transport/noise/WaNoiseSession.js +64 -23
- package/dist/transport/noise/WaNoiseSocket.js +8 -4
- package/dist/transport/stream/parse.js +7 -3
- package/dist/types/appstate/encoding.d.ts +7 -0
- package/dist/types/appstate/index.d.ts +3 -3
- package/dist/types/appstate/utils.d.ts +0 -2
- package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +1 -1
- package/dist/types/auth/index.d.ts +0 -2
- package/dist/types/auth/types.d.ts +1 -0
- package/dist/types/client/WaClient.d.ts +27 -12
- package/dist/types/client/WaClientFactory.d.ts +12 -4
- package/dist/types/client/connection/WaConnectionManager.d.ts +2 -0
- package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +3 -1
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +14 -0
- package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -0
- package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
- package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +36 -0
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +6 -0
- package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
- package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +45 -0
- package/dist/types/client/events/devices.d.ts +20 -0
- package/dist/types/client/events/identity.d.ts +9 -0
- package/dist/types/client/events/privacy-token.d.ts +7 -0
- package/dist/types/client/history-sync.d.ts +9 -6
- package/dist/types/client/incoming.d.ts +3 -1
- package/dist/types/client/index.d.ts +1 -1
- package/dist/types/client/mailbox.d.ts +3 -5
- package/dist/types/client/messages.d.ts +1 -2
- package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
- package/dist/types/client/tokens/cs-token.d.ts +10 -0
- package/dist/types/client/tokens/tc-token.d.ts +5 -0
- package/dist/types/client/types.d.ts +51 -3
- package/dist/types/crypto/core/index.d.ts +2 -2
- package/dist/types/crypto/core/nonce.d.ts +2 -0
- package/dist/types/crypto/core/primitives.d.ts +0 -1
- package/dist/types/crypto/core/random.d.ts +1 -0
- package/dist/types/crypto/index.d.ts +1 -0
- package/dist/types/crypto/math/constants.d.ts +4 -2
- package/dist/types/crypto/math/fe.d.ts +30 -0
- package/dist/types/crypto/math/mod.d.ts +0 -2
- package/dist/types/crypto/math/types.d.ts +11 -4
- package/dist/types/index.d.ts +5 -3
- package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
- package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
- package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
- package/dist/types/infra/perf/StoreLock.d.ts +10 -0
- package/dist/types/media/WaMediaCrypto.d.ts +3 -2
- package/dist/types/media/WaMediaTransferClient.d.ts +3 -12
- package/dist/types/media/constants.d.ts +1 -1
- package/dist/types/media/index.d.ts +1 -1
- package/dist/types/media/types.d.ts +10 -2
- package/dist/types/message/content.d.ts +8 -0
- package/dist/types/message/icdc.d.ts +13 -0
- package/dist/types/message/reporting-token.d.ts +0 -1
- package/dist/types/message/types.d.ts +45 -6
- package/dist/types/protocol/appstate.d.ts +0 -11
- package/dist/types/protocol/constants.d.ts +7 -3
- package/dist/types/protocol/defaults.d.ts +6 -0
- package/dist/types/protocol/index.d.ts +1 -2
- package/dist/types/protocol/jid.d.ts +19 -2
- package/dist/types/protocol/message.d.ts +60 -0
- package/dist/types/protocol/nodes.d.ts +2 -0
- package/dist/types/protocol/notification.d.ts +2 -0
- package/dist/types/protocol/privacy-token.d.ts +17 -0
- package/dist/types/protocol/privacy.d.ts +75 -0
- package/dist/types/protocol/stream.d.ts +30 -0
- package/dist/types/retry/codec.d.ts +3 -0
- package/dist/types/retry/index.d.ts +3 -3
- package/dist/types/retry/parse.d.ts +5 -2
- package/dist/types/retry/tracker.d.ts +1 -0
- package/dist/types/retry/types.d.ts +6 -1
- package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +2 -1
- package/dist/types/signal/api/SignalDigestSyncApi.d.ts +6 -0
- package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +2 -0
- package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
- package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
- package/dist/types/signal/api/result-map.d.ts +1 -0
- package/dist/types/signal/constants.d.ts +0 -3
- package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +3 -3
- package/dist/types/signal/group/SenderKeyManager.d.ts +10 -5
- package/dist/types/signal/index.d.ts +2 -0
- package/dist/types/signal/session/SignalProtocol.d.ts +10 -4
- package/dist/types/signal/session/resolver.d.ts +7 -2
- package/dist/types/store/contracts/appstate.store.d.ts +1 -1
- package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
- package/dist/types/store/contracts/retry.store.d.ts +7 -0
- package/dist/types/store/contracts/signal.store.d.ts +7 -0
- package/dist/types/store/createStore.d.ts +1 -1
- package/dist/types/store/index.d.ts +5 -13
- package/dist/types/store/locks/appstate.lock.d.ts +3 -0
- package/dist/types/store/locks/auth.lock.d.ts +3 -0
- package/dist/types/store/locks/contact.lock.d.ts +3 -0
- package/dist/types/store/locks/device-list.lock.d.ts +2 -0
- package/dist/types/store/locks/message.lock.d.ts +3 -0
- package/dist/types/store/locks/participants.lock.d.ts +2 -0
- package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
- package/dist/types/store/locks/retry.lock.d.ts +2 -0
- package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
- package/dist/types/store/locks/signal.lock.d.ts +3 -0
- package/dist/types/store/locks/thread.lock.d.ts +3 -0
- package/dist/types/store/providers/memory/appstate.store.d.ts +1 -1
- package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
- package/dist/types/store/providers/memory/retry.store.d.ts +8 -0
- package/dist/types/store/providers/memory/signal.store.d.ts +2 -1
- package/dist/types/store/types.d.ts +49 -61
- package/dist/types/transport/WaWebSocket.d.ts +0 -1
- package/dist/types/transport/binary/constants.d.ts +0 -30
- package/dist/types/transport/binary/index.d.ts +0 -1
- package/dist/types/transport/node/WaNodeOrchestrator.d.ts +3 -4
- package/dist/types/transport/node/builders/business.d.ts +29 -0
- package/dist/types/transport/node/builders/global.d.ts +102 -0
- package/dist/types/transport/node/builders/index.d.ts +5 -2
- package/dist/types/transport/node/builders/message.d.ts +8 -7
- package/dist/types/transport/node/builders/pairing.d.ts +0 -2
- package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
- package/dist/types/transport/node/builders/privacy.d.ts +7 -0
- package/dist/types/transport/node/builders/profile.d.ts +8 -0
- package/dist/types/transport/node/builders/retry.d.ts +0 -1
- package/dist/types/transport/node/helpers.d.ts +5 -0
- package/dist/types/transport/noise/WaNoiseSession.d.ts +3 -2
- package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
- package/dist/types/util/bytes.d.ts +1 -1
- package/dist/types/util/index.d.ts +5 -0
- package/dist/types/util/primitives.d.ts +0 -1
- package/dist/util/bytes.js +22 -18
- package/dist/util/index.js +23 -0
- package/dist/util/primitives.js +2 -2
- package/package.json +29 -7
- package/proto/index.js +1 -1
- package/dist/crypto/core/constants.js +0 -4
- package/dist/esm/crypto/core/constants.js +0 -1
- package/dist/esm/retry/outbound.js +0 -82
- package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
- package/dist/esm/store/providers/sqlite/appstate.store.js +0 -250
- package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
- package/dist/esm/store/providers/sqlite/connection.js +0 -245
- package/dist/esm/store/providers/sqlite/contact.store.js +0 -74
- package/dist/esm/store/providers/sqlite/device-list.store.js +0 -127
- package/dist/esm/store/providers/sqlite/message.store.js +0 -132
- package/dist/esm/store/providers/sqlite/migrations.js +0 -347
- package/dist/esm/store/providers/sqlite/participants.store.js +0 -77
- package/dist/esm/store/providers/sqlite/retry.store.js +0 -141
- package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -198
- package/dist/esm/store/providers/sqlite/signal.store.js +0 -435
- package/dist/esm/store/providers/sqlite/table-names.js +0 -107
- package/dist/esm/store/providers/sqlite/thread.store.js +0 -85
- package/dist/retry/outbound.js +0 -87
- package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
- package/dist/store/providers/sqlite/appstate.store.js +0 -254
- package/dist/store/providers/sqlite/auth.store.js +0 -180
- package/dist/store/providers/sqlite/connection.js +0 -281
- package/dist/store/providers/sqlite/contact.store.js +0 -78
- package/dist/store/providers/sqlite/device-list.store.js +0 -131
- package/dist/store/providers/sqlite/message.store.js +0 -136
- package/dist/store/providers/sqlite/migrations.js +0 -350
- package/dist/store/providers/sqlite/participants.store.js +0 -81
- package/dist/store/providers/sqlite/retry.store.js +0 -145
- package/dist/store/providers/sqlite/sender-key.store.js +0 -202
- package/dist/store/providers/sqlite/signal.store.js +0 -439
- package/dist/store/providers/sqlite/table-names.js +0 -113
- package/dist/store/providers/sqlite/thread.store.js +0 -89
- package/dist/types/appstate/store/sqlite.d.ts +0 -7
- package/dist/types/crypto/core/constants.d.ts +0 -1
- package/dist/types/retry/outbound.d.ts +0 -4
- package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
- package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -17
- package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
- package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
- package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -12
- package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -15
- package/dist/types/store/providers/sqlite/message.store.d.ts +0 -13
- package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
- package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -12
- package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -15
- package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -24
- package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -53
- package/dist/types/store/providers/sqlite/table-names.d.ts +0 -5
- package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -13
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SignalDeviceSyncApi = void 0;
|
|
4
|
+
const PromiseDedup_1 = require("../../infra/perf/PromiseDedup");
|
|
4
5
|
const constants_1 = require("../../protocol/constants");
|
|
5
6
|
const jid_1 = require("../../protocol/jid");
|
|
6
7
|
const usync_1 = require("../../transport/node/builders/usync");
|
|
@@ -9,6 +10,7 @@ const query_1 = require("../../transport/node/query");
|
|
|
9
10
|
const usync_2 = require("../../transport/node/usync");
|
|
10
11
|
class SignalDeviceSyncApi {
|
|
11
12
|
constructor(options) {
|
|
13
|
+
this.syncDedup = new PromiseDedup_1.PromiseDedup();
|
|
12
14
|
this.logger = options.logger;
|
|
13
15
|
this.query = options.query;
|
|
14
16
|
this.deviceListStore = options.deviceListStore;
|
|
@@ -17,11 +19,15 @@ class SignalDeviceSyncApi {
|
|
|
17
19
|
this.hostDomain = options.hostDomain ?? constants_1.WA_DEFAULTS.HOST_DOMAIN;
|
|
18
20
|
this.generateSid = options.generateSid ?? (0, usync_2.createUsyncSidGenerator)();
|
|
19
21
|
}
|
|
20
|
-
|
|
22
|
+
syncDeviceList(userJids, timeoutMs = this.defaultTimeoutMs) {
|
|
21
23
|
const normalizedUsers = this.normalizeUsers(userJids);
|
|
22
24
|
if (normalizedUsers.length === 0) {
|
|
23
|
-
return [];
|
|
25
|
+
return Promise.resolve([]);
|
|
24
26
|
}
|
|
27
|
+
const dedupKey = normalizedUsers.join(',');
|
|
28
|
+
return this.syncDedup.run(dedupKey, () => this.syncDeviceListInternal(normalizedUsers, timeoutMs));
|
|
29
|
+
}
|
|
30
|
+
async syncDeviceListInternal(normalizedUsers, timeoutMs) {
|
|
25
31
|
const nowMs = Date.now();
|
|
26
32
|
const cachedByUser = new Map();
|
|
27
33
|
const usersToQuery = this.deviceListStore
|
|
@@ -126,16 +132,19 @@ class SignalDeviceSyncApi {
|
|
|
126
132
|
}
|
|
127
133
|
async collectUsersToQuery(normalizedUsers, nowMs, cachedByUser, store) {
|
|
128
134
|
const records = await store.getUserDevicesBatch(normalizedUsers, nowMs);
|
|
129
|
-
const usersToQuery =
|
|
135
|
+
const usersToQuery = new Array(normalizedUsers.length);
|
|
136
|
+
let usersToQueryCount = 0;
|
|
130
137
|
for (let index = 0; index < normalizedUsers.length; index += 1) {
|
|
131
138
|
const userJid = normalizedUsers[index];
|
|
132
139
|
const record = records[index];
|
|
133
140
|
if (!record) {
|
|
134
|
-
usersToQuery
|
|
141
|
+
usersToQuery[usersToQueryCount] = userJid;
|
|
142
|
+
usersToQueryCount += 1;
|
|
135
143
|
continue;
|
|
136
144
|
}
|
|
137
145
|
cachedByUser.set(userJid, record.deviceJids);
|
|
138
146
|
}
|
|
147
|
+
usersToQuery.length = usersToQueryCount;
|
|
139
148
|
return usersToQuery;
|
|
140
149
|
}
|
|
141
150
|
makeDeviceSyncRequest(userJids, sid) {
|
|
@@ -204,7 +213,8 @@ class SignalDeviceSyncApi {
|
|
|
204
213
|
}
|
|
205
214
|
const requestedSet = new Set(requestedUsers);
|
|
206
215
|
const userNodes = (0, helpers_1.getNodeChildrenByTag)(listNode, constants_1.WA_NODE_TAGS.USER);
|
|
207
|
-
const parsed =
|
|
216
|
+
const parsed = new Array(userNodes.length);
|
|
217
|
+
let parsedCount = 0;
|
|
208
218
|
for (let index = 0; index < userNodes.length; index += 1) {
|
|
209
219
|
const userNode = userNodes[index];
|
|
210
220
|
const userJid = userNode.attrs.jid;
|
|
@@ -215,11 +225,13 @@ class SignalDeviceSyncApi {
|
|
|
215
225
|
if (!requestedSet.has(normalizedUserJid)) {
|
|
216
226
|
continue;
|
|
217
227
|
}
|
|
218
|
-
parsed
|
|
228
|
+
parsed[parsedCount] = {
|
|
219
229
|
jid: normalizedUserJid,
|
|
220
|
-
deviceJids: this.parseUserDeviceJids(userNode, normalizedUserJid)
|
|
221
|
-
}
|
|
230
|
+
deviceJids: this.parseUserDeviceJids(userNode, userJid, normalizedUserJid)
|
|
231
|
+
};
|
|
232
|
+
parsedCount += 1;
|
|
222
233
|
}
|
|
234
|
+
parsed.length = parsedCount;
|
|
223
235
|
return parsed;
|
|
224
236
|
}
|
|
225
237
|
parseLidSyncResponse(node, requestedUsers) {
|
|
@@ -234,7 +246,8 @@ class SignalDeviceSyncApi {
|
|
|
234
246
|
}
|
|
235
247
|
const requestedSet = new Set(requestedUsers);
|
|
236
248
|
const userNodes = (0, helpers_1.getNodeChildrenByTag)(listNode, constants_1.WA_NODE_TAGS.USER);
|
|
237
|
-
const parsed =
|
|
249
|
+
const parsed = new Array(userNodes.length);
|
|
250
|
+
let parsedCount = 0;
|
|
238
251
|
for (let index = 0; index < userNodes.length; index += 1) {
|
|
239
252
|
const userNode = userNodes[index];
|
|
240
253
|
const userJid = userNode.attrs.jid;
|
|
@@ -253,7 +266,8 @@ class SignalDeviceSyncApi {
|
|
|
253
266
|
const lidNode = (0, helpers_1.findNodeChild)(userNode, constants_1.WA_NODE_TAGS.LID);
|
|
254
267
|
const contactNode = (0, helpers_1.findNodeChild)(userNode, constants_1.WA_NODE_TAGS.CONTACT);
|
|
255
268
|
if (!lidNode) {
|
|
256
|
-
parsed
|
|
269
|
+
parsed[parsedCount] = this.buildLidSyncResult(normalizedUserJid, normalizedPhoneJid, contactNode, null);
|
|
270
|
+
parsedCount += 1;
|
|
257
271
|
continue;
|
|
258
272
|
}
|
|
259
273
|
const errorNode = (0, helpers_1.findNodeChild)(lidNode, constants_1.WA_NODE_TAGS.ERROR);
|
|
@@ -263,12 +277,15 @@ class SignalDeviceSyncApi {
|
|
|
263
277
|
code: errorNode.attrs.code,
|
|
264
278
|
text: errorNode.attrs.text
|
|
265
279
|
});
|
|
266
|
-
parsed
|
|
280
|
+
parsed[parsedCount] = this.buildLidSyncResult(normalizedUserJid, normalizedPhoneJid, contactNode, null);
|
|
281
|
+
parsedCount += 1;
|
|
267
282
|
continue;
|
|
268
283
|
}
|
|
269
284
|
const lidJid = lidNode.attrs.val ? this.normalizeUserJid(lidNode.attrs.val) : null;
|
|
270
|
-
parsed
|
|
285
|
+
parsed[parsedCount] = this.buildLidSyncResult(normalizedUserJid, normalizedPhoneJid, contactNode, lidJid);
|
|
286
|
+
parsedCount += 1;
|
|
271
287
|
}
|
|
288
|
+
parsed.length = parsedCount;
|
|
272
289
|
return parsed;
|
|
273
290
|
}
|
|
274
291
|
buildLidSyncResult(jid, phoneJid, contactNode, lidJid) {
|
|
@@ -294,7 +311,7 @@ class SignalDeviceSyncApi {
|
|
|
294
311
|
}
|
|
295
312
|
return contactNode.attrs.type === 'in';
|
|
296
313
|
}
|
|
297
|
-
parseUserDeviceJids(userNode,
|
|
314
|
+
parseUserDeviceJids(userNode, rawUserJid, normalizedUserJid) {
|
|
298
315
|
const devicesNode = (0, helpers_1.findNodeChild)(userNode, constants_1.WA_NODE_TAGS.DEVICES);
|
|
299
316
|
if (!devicesNode) {
|
|
300
317
|
return [];
|
|
@@ -302,7 +319,7 @@ class SignalDeviceSyncApi {
|
|
|
302
319
|
const errorNode = (0, helpers_1.findNodeChild)(devicesNode, constants_1.WA_NODE_TAGS.ERROR);
|
|
303
320
|
if (errorNode) {
|
|
304
321
|
this.logger.warn('signal device sync user error', {
|
|
305
|
-
jid:
|
|
322
|
+
jid: normalizedUserJid,
|
|
306
323
|
code: errorNode.attrs.code,
|
|
307
324
|
text: errorNode.attrs.text
|
|
308
325
|
});
|
|
@@ -312,7 +329,8 @@ class SignalDeviceSyncApi {
|
|
|
312
329
|
if (!deviceListNode) {
|
|
313
330
|
return [];
|
|
314
331
|
}
|
|
315
|
-
const
|
|
332
|
+
const parsedNormalizedUser = (0, jid_1.splitJid)(normalizedUserJid);
|
|
333
|
+
const parsedRawUser = (0, jid_1.splitJid)(rawUserJid);
|
|
316
334
|
const dedup = new Set();
|
|
317
335
|
for (const deviceNode of (0, helpers_1.getNodeChildrenByTag)(deviceListNode, 'device')) {
|
|
318
336
|
const parsedId = deviceNode.attrs.id
|
|
@@ -321,16 +339,17 @@ class SignalDeviceSyncApi {
|
|
|
321
339
|
if (!Number.isSafeInteger(parsedId) || parsedId < 0) {
|
|
322
340
|
continue;
|
|
323
341
|
}
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
342
|
+
const isHostedDevice = (0, jid_1.isHostedDeviceId)(parsedId) || deviceNode.attrs.is_hosted === 'true';
|
|
343
|
+
dedup.add((0, jid_1.buildDeviceJid)(parsedNormalizedUser.user, parsedNormalizedUser.server, parsedId, {
|
|
344
|
+
rawServer: parsedRawUser.server,
|
|
345
|
+
isHosted: isHostedDevice
|
|
346
|
+
}));
|
|
329
347
|
}
|
|
330
|
-
return
|
|
348
|
+
return Array.from(dedup);
|
|
331
349
|
}
|
|
332
350
|
normalizeUsers(userJids) {
|
|
333
|
-
const normalized =
|
|
351
|
+
const normalized = new Array(userJids.length);
|
|
352
|
+
let normalizedCount = 0;
|
|
334
353
|
const dedup = new Set();
|
|
335
354
|
for (let index = 0; index < userJids.length; index += 1) {
|
|
336
355
|
const normalizedJid = this.normalizeUserJid(userJids[index]);
|
|
@@ -338,19 +357,17 @@ class SignalDeviceSyncApi {
|
|
|
338
357
|
continue;
|
|
339
358
|
}
|
|
340
359
|
dedup.add(normalizedJid);
|
|
341
|
-
normalized
|
|
360
|
+
normalized[normalizedCount] = normalizedJid;
|
|
361
|
+
normalizedCount += 1;
|
|
342
362
|
}
|
|
363
|
+
normalized.length = normalizedCount;
|
|
343
364
|
return normalized;
|
|
344
365
|
}
|
|
345
366
|
normalizeUserJid(jid) {
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
if (deviceId === 0) {
|
|
351
|
-
return `${user}@${server}`;
|
|
352
|
-
}
|
|
353
|
-
return `${user}:${deviceId}@${server}`;
|
|
367
|
+
return (0, jid_1.toUserJid)(jid, {
|
|
368
|
+
canonicalizeSignalServer: true,
|
|
369
|
+
hostDomain: this.hostDomain
|
|
370
|
+
});
|
|
354
371
|
}
|
|
355
372
|
}
|
|
356
373
|
exports.SignalDeviceSyncApi = SignalDeviceSyncApi;
|
|
@@ -17,8 +17,10 @@ class SignalDigestSyncApi {
|
|
|
17
17
|
options.defaultTimeoutMs ?? constants_1.WA_DEFAULTS.SIGNAL_FETCH_KEY_BUNDLES_TIMEOUT_MS;
|
|
18
18
|
this.hostDomain = options.hostDomain ?? constants_1.WA_DEFAULTS.HOST_DOMAIN;
|
|
19
19
|
}
|
|
20
|
-
async validateLocalKeyBundle(timeoutMs = this.defaultTimeoutMs) {
|
|
21
|
-
|
|
20
|
+
async validateLocalKeyBundle(prefetchedOrTimeout, timeoutMs = this.defaultTimeoutMs) {
|
|
21
|
+
const prefetched = typeof prefetchedOrTimeout === 'number' ? undefined : prefetchedOrTimeout;
|
|
22
|
+
const effectiveTimeoutMs = typeof prefetchedOrTimeout === 'number' ? prefetchedOrTimeout : timeoutMs;
|
|
23
|
+
this.logger.debug('signal digest query request', { timeoutMs: effectiveTimeoutMs });
|
|
22
24
|
const response = await this.query({
|
|
23
25
|
tag: constants_1.WA_NODE_TAGS.IQ,
|
|
24
26
|
attrs: {
|
|
@@ -32,7 +34,7 @@ class SignalDigestSyncApi {
|
|
|
32
34
|
attrs: {}
|
|
33
35
|
}
|
|
34
36
|
]
|
|
35
|
-
},
|
|
37
|
+
}, effectiveTimeoutMs);
|
|
36
38
|
if (response.tag !== constants_1.WA_NODE_TAGS.IQ) {
|
|
37
39
|
throw new Error(`invalid signal digest response tag: ${response.tag}`);
|
|
38
40
|
}
|
|
@@ -61,10 +63,12 @@ class SignalDigestSyncApi {
|
|
|
61
63
|
preKeyCount: digest.preKeyIds.length
|
|
62
64
|
};
|
|
63
65
|
}
|
|
64
|
-
const [registrationInfo, signedPreKey] =
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
const [registrationInfo, signedPreKey] = prefetched
|
|
67
|
+
? [prefetched.registrationInfo, prefetched.signedPreKey]
|
|
68
|
+
: await Promise.all([
|
|
69
|
+
this.signalStore.getRegistrationInfo(),
|
|
70
|
+
this.signalStore.getSignedPreKey()
|
|
71
|
+
]);
|
|
68
72
|
if (!registrationInfo || !signedPreKey) {
|
|
69
73
|
return {
|
|
70
74
|
valid: false,
|
|
@@ -164,11 +168,11 @@ class SignalDigestSyncApi {
|
|
|
164
168
|
const signedKeyId = (0, codec_1.parseUint)((0, codec_1.decodeExactLength)(signedKeyIdNode.content, 'signal digest skey.id', constants_2.SIGNAL_KEY_ID_LENGTH), 'signal digest skey.id');
|
|
165
169
|
const signedKeyPublicKey = (0, codec_1.decodeExactLength)(signedKeyValueNode.content, 'signal digest skey.value', constants_2.SIGNAL_KEY_DATA_LENGTH);
|
|
166
170
|
const signedKeySignature = (0, codec_1.decodeExactLength)(signedKeySignatureNode.content, 'signal digest skey.signature', constants_2.SIGNAL_SIGNATURE_LENGTH);
|
|
167
|
-
const preKeyIds = [];
|
|
168
171
|
const listChildren = (0, helpers_1.getNodeChildren)(listNode);
|
|
172
|
+
const preKeyIds = new Array(listChildren.length);
|
|
169
173
|
for (let index = 0; index < listChildren.length; index += 1) {
|
|
170
174
|
const child = listChildren[index];
|
|
171
|
-
preKeyIds
|
|
175
|
+
preKeyIds[index] = (0, codec_1.parseUint)((0, codec_1.decodeExactLength)(child.content, `signal digest list[${index}]`, constants_2.SIGNAL_KEY_ID_LENGTH), `signal digest list[${index}]`);
|
|
172
176
|
}
|
|
173
177
|
const hash = (0, helpers_1.decodeNodeContentBase64OrBytes)(hashNode.content, 'signal digest hash');
|
|
174
178
|
return {
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SignalIdentitySyncApi = void 0;
|
|
4
4
|
const keys_1 = require("../../crypto/core/keys");
|
|
5
|
+
const PromiseDedup_1 = require("../../infra/perf/PromiseDedup");
|
|
5
6
|
const constants_1 = require("../../protocol/constants");
|
|
6
7
|
const jid_1 = require("../../protocol/jid");
|
|
7
8
|
const codec_1 = require("../api/codec");
|
|
@@ -10,6 +11,7 @@ const helpers_1 = require("../../transport/node/helpers");
|
|
|
10
11
|
const query_1 = require("../../transport/node/query");
|
|
11
12
|
class SignalIdentitySyncApi {
|
|
12
13
|
constructor(options) {
|
|
14
|
+
this.syncDedup = new PromiseDedup_1.PromiseDedup();
|
|
13
15
|
this.logger = options.logger;
|
|
14
16
|
this.query = options.query;
|
|
15
17
|
this.signalStore = options.signalStore;
|
|
@@ -17,17 +19,24 @@ class SignalIdentitySyncApi {
|
|
|
17
19
|
options.defaultTimeoutMs ?? constants_1.WA_DEFAULTS.SIGNAL_FETCH_KEY_BUNDLES_TIMEOUT_MS;
|
|
18
20
|
this.hostDomain = options.hostDomain ?? constants_1.WA_DEFAULTS.HOST_DOMAIN;
|
|
19
21
|
}
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
+
syncIdentityKeys(targetJids, timeoutMs = this.defaultTimeoutMs) {
|
|
23
|
+
const dedupKey = `${timeoutMs}:${targetJids.join(',')}`;
|
|
24
|
+
return this.syncDedup.run(dedupKey, () => this.syncIdentityKeysInternal(targetJids, timeoutMs));
|
|
25
|
+
}
|
|
26
|
+
async syncIdentityKeysInternal(targetJids, timeoutMs) {
|
|
27
|
+
const normalizedTargets = new Array(targetJids.length);
|
|
28
|
+
let normalizedTargetsCount = 0;
|
|
22
29
|
const dedup = new Set();
|
|
23
30
|
for (let index = 0; index < targetJids.length; index += 1) {
|
|
24
|
-
const normalized = (0, jid_1.
|
|
31
|
+
const normalized = (0, jid_1.canonicalizeSignalJid)(targetJids[index], this.hostDomain);
|
|
25
32
|
if (dedup.has(normalized)) {
|
|
26
33
|
continue;
|
|
27
34
|
}
|
|
28
35
|
dedup.add(normalized);
|
|
29
|
-
normalizedTargets
|
|
36
|
+
normalizedTargets[normalizedTargetsCount] = normalized;
|
|
37
|
+
normalizedTargetsCount += 1;
|
|
30
38
|
}
|
|
39
|
+
normalizedTargets.length = normalizedTargetsCount;
|
|
31
40
|
if (normalizedTargets.length === 0) {
|
|
32
41
|
return [];
|
|
33
42
|
}
|
|
@@ -86,10 +95,13 @@ class SignalIdentitySyncApi {
|
|
|
86
95
|
}
|
|
87
96
|
const requested = new Set(requestedJids);
|
|
88
97
|
const userNodes = (0, helpers_1.getNodeChildrenByTag)(listNode, constants_1.WA_NODE_TAGS.USER);
|
|
89
|
-
const parsed =
|
|
98
|
+
const parsed = new Array(userNodes.length);
|
|
99
|
+
let parsedCount = 0;
|
|
90
100
|
for (let index = 0; index < userNodes.length; index += 1) {
|
|
91
101
|
const userNode = userNodes[index];
|
|
92
|
-
const jid = userNode.attrs.jid
|
|
102
|
+
const jid = userNode.attrs.jid
|
|
103
|
+
? (0, jid_1.canonicalizeSignalJid)(userNode.attrs.jid, this.hostDomain)
|
|
104
|
+
: '';
|
|
93
105
|
if (!jid || !requested.has(jid)) {
|
|
94
106
|
continue;
|
|
95
107
|
}
|
|
@@ -112,18 +124,21 @@ class SignalIdentitySyncApi {
|
|
|
112
124
|
? (0, codec_1.parseUint)((0, codec_1.decodeExactLength)(typeNode.content, 'identity sync type', constants_2.SIGNAL_KEY_BUNDLE_TYPE_LENGTH), 'identity sync type')
|
|
113
125
|
: undefined;
|
|
114
126
|
if (parsedType === undefined) {
|
|
115
|
-
parsed
|
|
127
|
+
parsed[parsedCount] = {
|
|
116
128
|
jid,
|
|
117
129
|
identity
|
|
118
|
-
}
|
|
130
|
+
};
|
|
131
|
+
parsedCount += 1;
|
|
119
132
|
continue;
|
|
120
133
|
}
|
|
121
|
-
parsed
|
|
134
|
+
parsed[parsedCount] = {
|
|
122
135
|
jid,
|
|
123
136
|
identity,
|
|
124
137
|
type: parsedType
|
|
125
|
-
}
|
|
138
|
+
};
|
|
139
|
+
parsedCount += 1;
|
|
126
140
|
}
|
|
141
|
+
parsed.length = parsedCount;
|
|
127
142
|
return parsed;
|
|
128
143
|
}
|
|
129
144
|
}
|
|
@@ -6,8 +6,12 @@ const jid_1 = require("../../protocol/jid");
|
|
|
6
6
|
const codec_1 = require("../api/codec");
|
|
7
7
|
const constants_2 = require("../api/constants");
|
|
8
8
|
const prekeys_1 = require("../api/prekeys");
|
|
9
|
+
const result_map_1 = require("../api/result-map");
|
|
9
10
|
const helpers_1 = require("../../transport/node/helpers");
|
|
10
11
|
const query_1 = require("../../transport/node/query");
|
|
12
|
+
function isMissingPreKeysUserResultPreferred(result) {
|
|
13
|
+
return 'devices' in result;
|
|
14
|
+
}
|
|
11
15
|
class SignalMissingPreKeysSyncApi {
|
|
12
16
|
constructor(options) {
|
|
13
17
|
this.logger = options.logger;
|
|
@@ -38,31 +42,38 @@ class SignalMissingPreKeysSyncApi {
|
|
|
38
42
|
}
|
|
39
43
|
const users = (0, helpers_1.getNodeChildrenByTag)(listNode, constants_1.WA_NODE_TAGS.USER);
|
|
40
44
|
const parsedByJid = new Map();
|
|
45
|
+
const parsedByCanonicalJid = new Map();
|
|
41
46
|
for (let index = 0; index < users.length; index += 1) {
|
|
42
47
|
const userNode = users[index];
|
|
43
48
|
const userJid = userNode.attrs.jid;
|
|
44
49
|
if (!userJid) {
|
|
45
50
|
continue;
|
|
46
51
|
}
|
|
52
|
+
const canonicalUserJid = (0, jid_1.toUserJid)(userJid, {
|
|
53
|
+
canonicalizeSignalServer: true
|
|
54
|
+
});
|
|
47
55
|
const userErrorNode = (0, helpers_1.findNodeChild)(userNode, constants_1.WA_NODE_TAGS.ERROR);
|
|
48
56
|
if (userErrorNode) {
|
|
49
57
|
const parsedCode = Number.parseInt(userErrorNode.attrs.code ?? '', 10);
|
|
50
|
-
|
|
58
|
+
(0, result_map_1.registerParsedResultByRawAndCanonicalKey)(parsedByJid, parsedByCanonicalJid, userJid, canonicalUserJid, {
|
|
51
59
|
userJid,
|
|
52
60
|
errorCode: Number.isSafeInteger(parsedCode) ? parsedCode : undefined,
|
|
53
61
|
errorText: userErrorNode.attrs.text ?? userErrorNode.attrs.type ?? 'unknown'
|
|
54
|
-
});
|
|
62
|
+
}, isMissingPreKeysUserResultPreferred);
|
|
55
63
|
continue;
|
|
56
64
|
}
|
|
57
|
-
|
|
65
|
+
(0, result_map_1.registerParsedResultByRawAndCanonicalKey)(parsedByJid, parsedByCanonicalJid, userJid, canonicalUserJid, {
|
|
58
66
|
userJid,
|
|
59
|
-
devices: this.parseUserDevices(userNode,
|
|
60
|
-
});
|
|
67
|
+
devices: this.parseUserDevices(userNode, canonicalUserJid)
|
|
68
|
+
}, isMissingPreKeysUserResultPreferred);
|
|
61
69
|
}
|
|
62
70
|
const results = new Array(requestedTargets.length);
|
|
63
71
|
for (let index = 0; index < requestedTargets.length; index += 1) {
|
|
64
72
|
const target = requestedTargets[index];
|
|
65
|
-
results[index] = parsedByJid.get(target.userJid) ??
|
|
73
|
+
results[index] = parsedByJid.get(target.userJid) ??
|
|
74
|
+
parsedByCanonicalJid.get((0, jid_1.toUserJid)(target.userJid, {
|
|
75
|
+
canonicalizeSignalServer: true
|
|
76
|
+
})) ?? {
|
|
66
77
|
userJid: target.userJid,
|
|
67
78
|
errorText: 'missing user in key_fetch response'
|
|
68
79
|
};
|
|
@@ -13,11 +13,13 @@ class SignalRotateKeyApi {
|
|
|
13
13
|
this.defaultTimeoutMs = options.defaultTimeoutMs ?? constants_1.WA_DEFAULTS.IQ_TIMEOUT_MS;
|
|
14
14
|
}
|
|
15
15
|
async rotateSignedPreKey(timeoutMs = this.defaultTimeoutMs) {
|
|
16
|
-
const registrationInfo = await
|
|
16
|
+
const [registrationInfo, currentSignedPreKey] = await Promise.all([
|
|
17
|
+
this.signalStore.getRegistrationInfo(),
|
|
18
|
+
this.signalStore.getSignedPreKey()
|
|
19
|
+
]);
|
|
17
20
|
if (!registrationInfo) {
|
|
18
21
|
throw new Error('signal rotate key requires registration info');
|
|
19
22
|
}
|
|
20
|
-
const currentSignedPreKey = await this.signalStore.getSignedPreKey();
|
|
21
23
|
const nextSignedPreKey = await (0, keygen_1.generateSignedPreKey)(currentSignedPreKey ? currentSignedPreKey.keyId + 1 : 1, registrationInfo.identityKeyPair.privKey);
|
|
22
24
|
await this.signalStore.setSignedPreKey(nextSignedPreKey);
|
|
23
25
|
this.logger.info('signal signed prekey uploading', {
|
|
@@ -2,10 +2,15 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SignalSessionSyncApi = void 0;
|
|
4
4
|
const constants_1 = require("../../protocol/constants");
|
|
5
|
+
const jid_1 = require("../../protocol/jid");
|
|
5
6
|
const codec_1 = require("../api/codec");
|
|
6
7
|
const constants_2 = require("../api/constants");
|
|
8
|
+
const result_map_1 = require("../api/result-map");
|
|
7
9
|
const helpers_1 = require("../../transport/node/helpers");
|
|
8
10
|
const query_1 = require("../../transport/node/query");
|
|
11
|
+
function isKeyBundleResultPreferred(result) {
|
|
12
|
+
return 'bundle' in result;
|
|
13
|
+
}
|
|
9
14
|
class SignalSessionSyncApi {
|
|
10
15
|
constructor(options) {
|
|
11
16
|
this.logger = options.logger;
|
|
@@ -44,9 +49,11 @@ class SignalSessionSyncApi {
|
|
|
44
49
|
reasonIdentity: (previous?.reasonIdentity ?? false) || target.reasonIdentity === true
|
|
45
50
|
});
|
|
46
51
|
}
|
|
47
|
-
const mergedTargets =
|
|
52
|
+
const mergedTargets = new Array(targetByJid.size);
|
|
53
|
+
let mergedTargetsCount = 0;
|
|
48
54
|
for (const target of targetByJid.values()) {
|
|
49
|
-
mergedTargets
|
|
55
|
+
mergedTargets[mergedTargetsCount] = target;
|
|
56
|
+
mergedTargetsCount += 1;
|
|
50
57
|
}
|
|
51
58
|
const userNodes = new Array(mergedTargets.length);
|
|
52
59
|
for (let index = 0; index < mergedTargets.length; index += 1) {
|
|
@@ -90,6 +97,7 @@ class SignalSessionSyncApi {
|
|
|
90
97
|
throw new Error('key bundle response list is empty');
|
|
91
98
|
}
|
|
92
99
|
const parsedByJid = new Map();
|
|
100
|
+
const parsedByCanonicalJid = new Map();
|
|
93
101
|
for (let index = 0; index < userNodes.length; index += 1) {
|
|
94
102
|
const userNode = userNodes[index];
|
|
95
103
|
const jid = userNode.attrs.jid;
|
|
@@ -98,24 +106,25 @@ class SignalSessionSyncApi {
|
|
|
98
106
|
}
|
|
99
107
|
const userErrorNode = (0, helpers_1.findNodeChild)(userNode, constants_1.WA_NODE_TAGS.ERROR);
|
|
100
108
|
if (userErrorNode) {
|
|
101
|
-
parsedByJid.
|
|
109
|
+
(0, result_map_1.registerParsedResultByRawAndCanonicalKey)(parsedByJid, parsedByCanonicalJid, jid, (0, jid_1.canonicalizeSignalJid)(jid, this.hostDomain), {
|
|
102
110
|
jid,
|
|
103
111
|
errorCode: userErrorNode.attrs.code,
|
|
104
112
|
errorText: userErrorNode.attrs.text ?? 'unknown'
|
|
105
|
-
});
|
|
113
|
+
}, isKeyBundleResultPreferred);
|
|
106
114
|
continue;
|
|
107
115
|
}
|
|
108
116
|
const parsed = this.parseUserKeyBundle(userNode);
|
|
109
|
-
parsedByJid.
|
|
117
|
+
(0, result_map_1.registerParsedResultByRawAndCanonicalKey)(parsedByJid, parsedByCanonicalJid, jid, (0, jid_1.canonicalizeSignalJid)(jid, this.hostDomain), {
|
|
110
118
|
jid,
|
|
111
119
|
bundle: parsed.bundle,
|
|
112
120
|
...(parsed.deviceIdentity ? { deviceIdentity: parsed.deviceIdentity } : {})
|
|
113
|
-
});
|
|
121
|
+
}, isKeyBundleResultPreferred);
|
|
114
122
|
}
|
|
115
123
|
const output = new Array(requestedTargets.length);
|
|
116
124
|
for (let index = 0; index < requestedTargets.length; index += 1) {
|
|
117
125
|
const target = requestedTargets[index];
|
|
118
|
-
output[index] = parsedByJid.get(target.jid) ??
|
|
126
|
+
output[index] = parsedByJid.get(target.jid) ??
|
|
127
|
+
parsedByCanonicalJid.get((0, jid_1.canonicalizeSignalJid)(target.jid, this.hostDomain)) ?? {
|
|
119
128
|
jid: target.jid,
|
|
120
129
|
errorText: 'missing key bundle user in response'
|
|
121
130
|
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerParsedResultByRawAndCanonicalKey = registerParsedResultByRawAndCanonicalKey;
|
|
4
|
+
function mergePreferredParsedResult(target, key, next, isPreferred) {
|
|
5
|
+
const current = target.get(key);
|
|
6
|
+
if (!current || !isPreferred(current)) {
|
|
7
|
+
target.set(key, next);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function registerParsedResultByRawAndCanonicalKey(parsedByRawKey, parsedByCanonicalKey, rawKey, canonicalKey, result, isPreferred) {
|
|
11
|
+
mergePreferredParsedResult(parsedByRawKey, rawKey, result, isPreferred);
|
|
12
|
+
mergePreferredParsedResult(parsedByCanonicalKey, canonicalKey, result, isPreferred);
|
|
13
|
+
}
|
package/dist/signal/constants.js
CHANGED
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SIGNAL_PREFIX = exports.WHISPER_GROUP_INFO = exports.CHAIN_KEY_LABEL = exports.MESSAGE_KEY_LABEL = exports.SENDER_KEY_FUTURE_MESSAGES_MAX = exports.FUTURE_MESSAGES_MAX = exports.MAX_UNUSED_KEYS = exports.MAX_PREV_SESSIONS = exports.
|
|
4
|
-
const constants_1 = require("../crypto/core/constants");
|
|
3
|
+
exports.SIGNAL_PREFIX = exports.WHISPER_GROUP_INFO = exports.CHAIN_KEY_LABEL = exports.MESSAGE_KEY_LABEL = exports.SENDER_KEY_FUTURE_MESSAGES_MAX = exports.FUTURE_MESSAGES_MAX = exports.MAX_UNUSED_KEYS = exports.MAX_PREV_SESSIONS = exports.SIGNAL_MAC_SIZE = exports.SIGNAL_GROUP_VERSION = exports.SIGNAL_VERSION = void 0;
|
|
5
4
|
const bytes_1 = require("../util/bytes");
|
|
6
5
|
exports.SIGNAL_VERSION = 3;
|
|
7
6
|
exports.SIGNAL_GROUP_VERSION = 3;
|
|
8
|
-
exports.SERIALIZED_PUB_KEY_PREFIX = constants_1.SERIALIZED_PUB_KEY_PREFIX;
|
|
9
|
-
exports.KEY_TYPE_CURVE25519 = 5;
|
|
10
7
|
exports.SIGNAL_MAC_SIZE = 8;
|
|
11
|
-
exports.SIGNATURE_SIZE = 64;
|
|
12
8
|
exports.MAX_PREV_SESSIONS = 40;
|
|
13
9
|
exports.MAX_UNUSED_KEYS = 2000;
|
|
14
10
|
exports.FUTURE_MESSAGES_MAX = 2000;
|
|
@@ -19,18 +19,24 @@ Object.defineProperty(exports, "ADV_PREFIX_DEVICE_SIGNATURE", { enumerable: true
|
|
|
19
19
|
Object.defineProperty(exports, "ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE", { enumerable: true, get: function () { return constants_2.ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE; } });
|
|
20
20
|
Object.defineProperty(exports, "ADV_PREFIX_HOSTED_DEVICE_SIGNATURE", { enumerable: true, get: function () { return constants_2.ADV_PREFIX_HOSTED_DEVICE_SIGNATURE; } });
|
|
21
21
|
async function verifySignalSignature(publicKey, message, signature) {
|
|
22
|
-
if (
|
|
22
|
+
if (signature.length !== 64) {
|
|
23
23
|
return false;
|
|
24
24
|
}
|
|
25
25
|
if ((signature[63] & 0x60) !== 0) {
|
|
26
26
|
return false;
|
|
27
27
|
}
|
|
28
|
-
const
|
|
29
|
-
const
|
|
30
|
-
|
|
28
|
+
const signatureLastByteIndex = 63;
|
|
29
|
+
const originalSignatureLastByte = signature[signatureLastByteIndex];
|
|
30
|
+
const signBit = originalSignatureLastByte & 0x80;
|
|
31
|
+
signature[signatureLastByteIndex] = originalSignatureLastByte & 0x7f;
|
|
31
32
|
const curvePublic = (0, _crypto_1.toRawPubKey)(publicKey);
|
|
32
33
|
const edPublic = (0, X25519_1.montgomeryToEdwardsPublic)(curvePublic, signBit);
|
|
33
|
-
|
|
34
|
+
try {
|
|
35
|
+
return await _crypto_1.Ed25519.verify(message, signature, edPublic);
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
signature[signatureLastByteIndex] = originalSignatureLastByte;
|
|
39
|
+
}
|
|
34
40
|
}
|
|
35
41
|
async function signSignalMessage(privateKey, message) {
|
|
36
42
|
(0, bytes_1.assertByteLength)(privateKey, 32, `invalid curve25519 private key length ${privateKey.length}`);
|