zapo-js 0.2.0 → 0.3.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 +7 -3
- package/dist/appstate/WaAppStateCrypto.js +49 -41
- package/dist/appstate/WaAppStateSyncClient.js +79 -42
- package/dist/appstate/index.js +2 -2
- package/dist/auth/WaAuthClient.js +20 -11
- package/dist/auth/{flow/WaAuthCredentialsFlow.js → credentials-flow.js} +83 -18
- package/dist/auth/pairing/WaPairingFlow.js +26 -29
- package/dist/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +29 -13
- package/dist/client/WaClient.js +115 -75
- package/dist/client/WaClientFactory.js +113 -30
- package/dist/client/connection/WaConnectionManager.js +4 -1
- package/dist/client/coordinators/WaAbPropsCoordinator.js +141 -0
- package/dist/client/coordinators/WaBusinessCoordinator.js +3 -12
- package/dist/client/coordinators/WaEmailCoordinator.js +63 -0
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +33 -8
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +55 -25
- package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
- package/dist/client/coordinators/WaPassiveTasksCoordinator.js +38 -20
- package/dist/client/coordinators/WaProfileCoordinator.js +3 -1
- package/dist/client/coordinators/WaRetryCoordinator.js +11 -9
- package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +22 -4
- package/dist/client/dirty.js +1 -1
- package/dist/client/events/abprops.js +43 -0
- package/dist/client/events/privacy-token.js +1 -2
- package/dist/client/events/registration.js +42 -0
- package/dist/client/incoming.js +37 -0
- package/dist/client/mailbox.js +17 -1
- package/dist/client/media.js +243 -0
- package/dist/client/messages.js +163 -86
- package/dist/crypto/core/index.js +4 -1
- package/dist/crypto/core/random.js +3 -9
- package/dist/crypto/core/xeddsa.js +57 -0
- package/dist/crypto/curves/X25519.js +18 -0
- package/dist/crypto/curves/constants.js +2 -1
- package/dist/esm/appstate/WaAppStateCrypto.js +39 -31
- package/dist/esm/appstate/WaAppStateSyncClient.js +68 -31
- package/dist/esm/appstate/index.js +1 -1
- package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +1 -1
- package/dist/esm/auth/WaAuthClient.js +17 -8
- package/dist/esm/auth/{flow/WaAuthCredentialsFlow.js → credentials-flow.js} +83 -18
- package/dist/esm/auth/pairing/WaPairingFlow.js +25 -28
- package/dist/esm/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +20 -6
- package/dist/esm/client/WaClient.js +116 -76
- package/dist/esm/client/WaClientFactory.js +114 -31
- package/dist/esm/client/connection/WaConnectionManager.js +4 -1
- package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +137 -0
- package/dist/esm/client/coordinators/WaBusinessCoordinator.js +4 -13
- package/dist/esm/client/coordinators/WaEmailCoordinator.js +60 -0
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +35 -10
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +47 -17
- package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
- package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +38 -20
- package/dist/esm/client/coordinators/WaProfileCoordinator.js +3 -1
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +11 -9
- package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +24 -6
- package/dist/esm/client/dirty.js +1 -1
- package/dist/esm/client/events/abprops.js +40 -0
- package/dist/esm/client/events/privacy-token.js +1 -2
- package/dist/esm/client/events/registration.js +39 -0
- package/dist/esm/client/incoming.js +36 -0
- package/dist/esm/client/mailbox.js +17 -1
- package/dist/esm/client/media.js +234 -0
- package/dist/esm/client/messages.js +162 -85
- package/dist/esm/crypto/core/index.js +1 -0
- package/dist/esm/crypto/core/random.js +2 -7
- package/dist/esm/crypto/core/xeddsa.js +53 -0
- package/dist/esm/crypto/curves/X25519.js +20 -2
- package/dist/esm/crypto/curves/constants.js +1 -0
- package/dist/esm/infra/perf/StoreLock.js +7 -4
- package/dist/esm/media/WaMediaCrypto.js +257 -62
- package/dist/esm/media/WaMediaTransferClient.js +47 -190
- package/dist/esm/media/constants.js +2 -0
- package/dist/esm/media/processor.js +1 -0
- package/dist/esm/message/addon-crypto.js +130 -3
- package/dist/esm/message/content.js +12 -6
- package/dist/esm/message/icdc.js +8 -8
- package/dist/esm/message/incoming.js +14 -12
- package/dist/esm/message/phash.js +32 -12
- package/dist/esm/message/reporting-token.js +3 -3
- package/dist/esm/message/use-case-secret.js +1 -1
- package/dist/esm/protocol/abprops.js +159 -0
- package/dist/esm/protocol/browser.js +14 -0
- package/dist/esm/protocol/constants.js +3 -1
- package/dist/esm/protocol/email.js +30 -0
- package/dist/esm/protocol/jid.js +44 -10
- package/dist/esm/protocol/nodes.js +6 -2
- package/dist/esm/protocol/notification.js +7 -1
- package/dist/esm/retry/reason.js +1 -1
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +5 -2
- package/dist/esm/signal/api/SignalDigestSyncApi.js +8 -6
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +4 -4
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +1 -1
- package/dist/esm/signal/api/SignalSessionSyncApi.js +1 -1
- package/dist/esm/signal/crypto/WaAdvSignature.js +5 -51
- package/dist/esm/signal/crypto/constants.js +0 -4
- package/dist/esm/signal/encoding.js +11 -54
- package/dist/esm/signal/group/SenderKeyChain.js +3 -3
- package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
- package/dist/esm/signal/group/SenderKeyManager.js +13 -10
- package/dist/esm/signal/registration/keygen.js +2 -3
- package/dist/esm/signal/registration/utils.js +2 -2
- package/dist/esm/signal/session/SignalProtocol.js +18 -17
- package/dist/esm/signal/session/SignalRatchet.js +21 -10
- package/dist/esm/signal/session/SignalSerializer.js +5 -6
- package/dist/esm/signal/session/SignalSession.js +11 -9
- package/dist/esm/signal/session/resolver.js +6 -6
- package/dist/esm/store/contracts/identity.store.js +1 -0
- package/dist/esm/store/contracts/message-secret.store.js +1 -0
- package/dist/esm/store/contracts/pre-key.store.js +1 -0
- package/dist/esm/store/contracts/session.store.js +1 -0
- package/dist/esm/store/createStore.js +48 -12
- package/dist/esm/store/index.js +4 -0
- package/dist/esm/store/locks/identity.lock.js +16 -0
- package/dist/esm/store/locks/message-secret.lock.js +17 -0
- package/dist/esm/store/locks/pre-key.lock.js +27 -0
- package/dist/esm/store/locks/session.lock.js +19 -0
- package/dist/esm/store/locks/signal.lock.js +0 -24
- package/dist/esm/store/noop.store.js +20 -0
- package/dist/esm/store/providers/memory/device-list.store.js +3 -0
- package/dist/esm/store/providers/memory/identity.store.js +31 -0
- package/dist/esm/store/providers/memory/message-secret.store.js +81 -0
- package/dist/esm/store/providers/memory/participants.store.js +3 -0
- package/dist/esm/store/providers/memory/pre-key.store.js +97 -0
- package/dist/esm/store/providers/memory/retry.store.js +25 -11
- package/dist/esm/store/providers/memory/session.store.js +45 -0
- package/dist/esm/store/providers/memory/signal.store.js +1 -164
- package/dist/esm/transport/WaComms.js +4 -3
- package/dist/esm/transport/WaWebSocket.js +9 -1
- package/dist/esm/transport/index.js +6 -0
- package/dist/esm/transport/keepalive/WaKeepAlive.js +17 -8
- package/dist/esm/transport/node/WaMobileTcpSocket.js +114 -0
- package/dist/esm/transport/node/WaNodeOrchestrator.js +17 -8
- package/dist/esm/transport/node/builders/abprops.js +20 -0
- package/dist/esm/transport/node/builders/device.js +11 -0
- package/dist/esm/transport/node/builders/email.js +65 -0
- package/dist/esm/transport/node/builders/offline.js +14 -0
- package/dist/esm/transport/node/builders/prekeys.js +37 -40
- package/dist/esm/transport/node/builders/presence.js +13 -0
- package/dist/esm/transport/node/builders/privacy-token.js +19 -23
- package/dist/esm/transport/node/builders/retry.js +1 -1
- package/dist/esm/transport/node/helpers.js +24 -0
- package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
- package/dist/esm/transport/node/mex/client.js +83 -0
- package/dist/esm/transport/node/mex/persist-ids.js +10 -0
- package/dist/esm/transport/noise/WaClientPayload.js +15 -10
- package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
- package/dist/esm/transport/noise/WaMobileClientPayload.js +53 -0
- package/dist/esm/transport/noise/WaNoiseCert.js +9 -27
- package/dist/esm/transport/noise/WaNoiseSession.js +12 -11
- package/dist/infra/perf/StoreLock.js +7 -4
- package/dist/media/WaMediaCrypto.js +253 -58
- package/dist/media/WaMediaTransferClient.js +50 -223
- package/dist/media/constants.js +3 -1
- package/dist/media/processor.js +2 -0
- package/dist/message/addon-crypto.js +131 -0
- package/dist/message/content.js +13 -5
- package/dist/message/icdc.js +8 -8
- package/dist/message/incoming.js +14 -12
- package/dist/message/phash.js +32 -12
- package/dist/message/reporting-token.js +2 -2
- package/dist/message/use-case-secret.js +1 -1
- package/dist/protocol/abprops.js +163 -0
- package/dist/protocol/browser.js +15 -0
- package/dist/protocol/constants.js +14 -2
- package/dist/protocol/email.js +33 -0
- package/dist/protocol/jid.js +45 -10
- package/dist/protocol/nodes.js +6 -2
- package/dist/protocol/notification.js +8 -2
- package/dist/retry/reason.js +1 -1
- package/dist/signal/api/SignalDeviceSyncApi.js +5 -2
- package/dist/signal/api/SignalDigestSyncApi.js +8 -6
- package/dist/signal/api/SignalIdentitySyncApi.js +4 -4
- package/dist/signal/crypto/WaAdvSignature.js +2 -50
- package/dist/signal/crypto/constants.js +1 -5
- package/dist/signal/encoding.js +11 -49
- package/dist/signal/group/SenderKeyChain.js +2 -2
- package/dist/signal/group/SenderKeyCodec.js +4 -5
- package/dist/signal/group/SenderKeyManager.js +12 -9
- package/dist/signal/registration/keygen.js +1 -2
- package/dist/signal/registration/utils.js +2 -2
- package/dist/signal/session/SignalProtocol.js +18 -17
- package/dist/signal/session/SignalRatchet.js +19 -8
- package/dist/signal/session/SignalSerializer.js +5 -6
- package/dist/signal/session/SignalSession.js +11 -9
- package/dist/signal/session/resolver.js +6 -6
- package/dist/store/contracts/identity.store.js +2 -0
- package/dist/store/contracts/message-secret.store.js +2 -0
- package/dist/store/contracts/pre-key.store.js +2 -0
- package/dist/store/contracts/session.store.js +2 -0
- package/dist/store/createStore.js +47 -11
- package/dist/store/index.js +9 -1
- package/dist/store/locks/identity.lock.js +19 -0
- package/dist/store/locks/message-secret.lock.js +20 -0
- package/dist/store/locks/pre-key.lock.js +30 -0
- package/dist/store/locks/session.lock.js +22 -0
- package/dist/store/locks/signal.lock.js +0 -24
- package/dist/store/noop.store.js +21 -1
- package/dist/store/providers/memory/device-list.store.js +3 -0
- package/dist/store/providers/memory/identity.store.js +35 -0
- package/dist/store/providers/memory/message-secret.store.js +85 -0
- package/dist/store/providers/memory/participants.store.js +3 -0
- package/dist/store/providers/memory/pre-key.store.js +101 -0
- package/dist/store/providers/memory/retry.store.js +24 -10
- package/dist/store/providers/memory/session.store.js +49 -0
- package/dist/store/providers/memory/signal.store.js +1 -164
- package/dist/transport/WaComms.js +4 -3
- package/dist/transport/WaWebSocket.js +9 -1
- package/dist/transport/index.js +17 -1
- package/dist/transport/keepalive/WaKeepAlive.js +17 -8
- package/dist/transport/node/WaMobileTcpSocket.js +118 -0
- package/dist/transport/node/WaNodeOrchestrator.js +16 -7
- package/dist/transport/node/builders/abprops.js +23 -0
- package/dist/transport/node/builders/device.js +14 -0
- package/dist/transport/node/builders/email.js +72 -0
- package/dist/transport/node/builders/offline.js +17 -0
- package/dist/transport/node/builders/prekeys.js +36 -39
- package/dist/transport/node/builders/presence.js +16 -0
- package/dist/transport/node/builders/privacy-token.js +18 -22
- package/dist/transport/node/builders/retry.js +1 -1
- package/dist/transport/node/helpers.js +26 -0
- package/dist/transport/node/mex/argo-decoder.js +189 -0
- package/dist/transport/node/mex/client.js +86 -0
- package/dist/transport/node/mex/persist-ids.js +13 -0
- package/dist/transport/noise/WaClientPayload.js +14 -9
- package/dist/transport/noise/WaFrameCodec.js +1 -1
- package/dist/transport/noise/WaMobileClientPayload.js +56 -0
- package/dist/transport/noise/WaNoiseCert.js +8 -26
- package/dist/transport/noise/WaNoiseSession.js +11 -10
- package/dist/types/appstate/WaAppStateCrypto.d.ts +11 -8
- package/dist/types/appstate/WaAppStateSyncClient.d.ts +6 -2
- package/dist/types/appstate/index.d.ts +1 -1
- package/dist/types/appstate/{WaAppStateSyncResponseParser.d.ts → response-parser.d.ts} +1 -1
- package/dist/types/appstate/types.d.ts +1 -1
- package/dist/types/auth/WaAuthClient.d.ts +9 -3
- package/dist/types/auth/credentials-flow.d.ts +20 -0
- package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
- package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +6 -1
- package/dist/types/auth/types.d.ts +40 -0
- package/dist/types/client/WaClient.d.ts +19 -8
- package/dist/types/client/WaClientFactory.d.ts +10 -4
- package/dist/types/client/coordinators/WaAbPropsCoordinator.d.ts +26 -0
- package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +1 -1
- package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +24 -0
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +6 -1
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +15 -2
- package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
- package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +13 -2
- package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +1 -1
- package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +4 -2
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +6 -0
- package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +11 -1
- package/dist/types/client/dirty.d.ts +3 -1
- package/dist/types/client/events/abprops.d.ts +14 -0
- package/dist/types/client/events/registration.d.ts +17 -0
- package/dist/types/client/incoming.d.ts +6 -1
- package/dist/types/client/mailbox.d.ts +2 -0
- package/dist/types/client/media.d.ts +31 -0
- package/dist/types/client/messages.d.ts +2 -0
- package/dist/types/client/persistence/WriteBehindPersistence.d.ts +1 -1
- package/dist/types/client/types.d.ts +100 -1
- package/dist/types/crypto/core/index.d.ts +1 -0
- package/dist/types/crypto/core/primitives.d.ts +1 -1
- package/dist/types/crypto/core/random.d.ts +1 -1
- package/dist/types/crypto/core/xeddsa.d.ts +2 -0
- package/dist/types/crypto/curves/constants.d.ts +1 -0
- package/dist/types/crypto/index.d.ts +1 -0
- package/dist/types/index.d.ts +2 -1
- package/dist/types/infra/log/ConsoleLogger.d.ts +1 -1
- package/dist/types/infra/log/PinoLogger.d.ts +1 -1
- package/dist/types/infra/perf/StoreLock.d.ts +1 -0
- package/dist/types/media/WaMediaCrypto.d.ts +15 -6
- package/dist/types/media/WaMediaTransferClient.d.ts +3 -11
- package/dist/types/media/constants.d.ts +2 -0
- package/dist/types/media/index.d.ts +1 -0
- package/dist/types/media/processor.d.ts +28 -0
- package/dist/types/media/types.d.ts +9 -3
- package/dist/types/message/addon-crypto.d.ts +34 -3
- package/dist/types/message/content.d.ts +3 -1
- package/dist/types/message/icdc.d.ts +4 -4
- package/dist/types/message/types.d.ts +16 -24
- package/dist/types/protocol/abprops.d.ts +142 -0
- package/dist/types/protocol/browser.d.ts +1 -0
- package/dist/types/protocol/constants.d.ts +5 -1
- package/dist/types/protocol/email.d.ts +32 -0
- package/dist/types/protocol/jid.d.ts +1 -0
- package/dist/types/protocol/nodes.d.ts +4 -0
- package/dist/types/protocol/notification.d.ts +6 -0
- package/dist/types/protocol/stream.d.ts +1 -0
- package/dist/types/retry/reason.d.ts +1 -1
- package/dist/types/signal/api/SignalDigestSyncApi.d.ts +3 -0
- package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +3 -3
- package/dist/types/signal/crypto/WaAdvSignature.d.ts +0 -2
- package/dist/types/signal/crypto/constants.d.ts +0 -1
- package/dist/types/signal/encoding.d.ts +7 -1
- package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
- package/dist/types/signal/group/SenderKeyManager.d.ts +7 -2
- package/dist/types/signal/registration/utils.d.ts +2 -1
- package/dist/types/signal/session/SignalProtocol.d.ts +11 -2
- package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
- package/dist/types/signal/session/resolver.d.ts +4 -2
- package/dist/types/signal/types.d.ts +16 -4
- package/dist/types/store/contracts/identity.store.d.ts +11 -0
- package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
- package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
- package/dist/types/store/contracts/session.store.d.ts +14 -0
- package/dist/types/store/contracts/signal.store.d.ts +1 -34
- package/dist/types/store/index.d.ts +9 -1
- package/dist/types/store/locks/identity.lock.d.ts +3 -0
- package/dist/types/store/locks/message-secret.lock.d.ts +3 -0
- package/dist/types/store/locks/pre-key.lock.d.ts +3 -0
- package/dist/types/store/locks/session.lock.d.ts +3 -0
- package/dist/types/store/noop.store.d.ts +4 -0
- package/dist/types/store/providers/memory/identity.store.d.ts +18 -0
- package/dist/types/store/providers/memory/message-secret.store.d.ts +21 -0
- package/dist/types/store/providers/memory/pre-key.store.d.ts +23 -0
- package/dist/types/store/providers/memory/retry.store.d.ts +7 -1
- package/dist/types/store/providers/memory/session.store.d.ts +21 -0
- package/dist/types/store/providers/memory/signal.store.d.ts +3 -45
- package/dist/types/store/providers/memory/thread.store.d.ts +1 -1
- package/dist/types/store/types.d.ts +21 -1
- package/dist/types/transport/WaWebSocket.d.ts +1 -0
- package/dist/types/transport/index.d.ts +8 -1
- package/dist/types/transport/keepalive/WaKeepAlive.d.ts +4 -1
- package/dist/types/transport/node/WaMobileTcpSocket.d.ts +18 -0
- package/dist/types/transport/node/WaNodeOrchestrator.d.ts +6 -2
- package/dist/types/transport/node/builders/abprops.d.ts +5 -0
- package/dist/types/transport/node/builders/device.d.ts +2 -0
- package/dist/types/transport/node/builders/email.d.ts +11 -0
- package/dist/types/transport/node/builders/offline.d.ts +2 -0
- package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
- package/dist/types/transport/node/builders/presence.d.ts +6 -0
- package/dist/types/transport/node/helpers.d.ts +3 -0
- package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
- package/dist/types/transport/node/mex/client.d.ts +18 -0
- package/dist/types/transport/node/mex/persist-ids.d.ts +14 -0
- package/dist/types/transport/noise/WaMobileClientPayload.d.ts +29 -0
- package/dist/types/transport/noise/WaNoiseCert.d.ts +7 -1
- package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -0
- package/dist/types/transport/types.d.ts +8 -0
- package/package.json +6 -4
- package/dist/auth/pairing/constants.js +0 -5
- package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
- package/dist/esm/auth/pairing/constants.js +0 -2
- package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
- package/dist/esm/transport/node/builders/index.js +0 -11
- package/dist/transport/node/builders/index.js +0 -51
- package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
- package/dist/types/auth/pairing/constants.d.ts +0 -2
- package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
- package/dist/types/transport/node/builders/index.d.ts +0 -11
- /package/dist/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +0 -0
|
@@ -7,7 +7,7 @@ const jid_1 = require("../../protocol/jid");
|
|
|
7
7
|
const bytes_1 = require("../../util/bytes");
|
|
8
8
|
const primitives_1 = require("../../util/primitives");
|
|
9
9
|
function createSignalSessionResolver(options) {
|
|
10
|
-
const { signalProtocol,
|
|
10
|
+
const { signalProtocol, sessionStore, identityStore, signalIdentitySync, signalSessionSync, logger } = options;
|
|
11
11
|
const dedup = new PromiseDedup_1.PromiseDedup();
|
|
12
12
|
const ensureSessionInternal = async (address, jid, expectedIdentity, reasonIdentity = false, prefetchedBundle) => {
|
|
13
13
|
const expectedSerializedIdentity = expectedIdentity
|
|
@@ -16,9 +16,9 @@ function createSignalSessionResolver(options) {
|
|
|
16
16
|
if (reasonIdentity) {
|
|
17
17
|
await signalIdentitySync.syncIdentityKeys([jid]);
|
|
18
18
|
}
|
|
19
|
-
if (await
|
|
19
|
+
if (await sessionStore.hasSession(address)) {
|
|
20
20
|
if (expectedSerializedIdentity) {
|
|
21
|
-
const storedIdentity = await
|
|
21
|
+
const storedIdentity = await identityStore.getRemoteIdentity(address);
|
|
22
22
|
if (!storedIdentity || !(0, bytes_1.uint8Equal)(storedIdentity, expectedSerializedIdentity)) {
|
|
23
23
|
throw new Error('identity mismatch');
|
|
24
24
|
}
|
|
@@ -41,7 +41,7 @@ function createSignalSessionResolver(options) {
|
|
|
41
41
|
}
|
|
42
42
|
const remoteIdentity = (0, keys_1.toSerializedPubKey)(fetched.bundle.identity);
|
|
43
43
|
if (reasonIdentity) {
|
|
44
|
-
const storedIdentity = await
|
|
44
|
+
const storedIdentity = await identityStore.getRemoteIdentity(address);
|
|
45
45
|
if (storedIdentity && !(0, bytes_1.uint8Equal)(remoteIdentity, storedIdentity)) {
|
|
46
46
|
throw new Error('identity mismatch');
|
|
47
47
|
}
|
|
@@ -99,7 +99,7 @@ function createSignalSessionResolver(options) {
|
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
|
-
const resolvedByIndex = (await
|
|
102
|
+
const resolvedByIndex = (await sessionStore.getSessionsBatch(normalizedTargetAddresses));
|
|
103
103
|
const collectResolvedTargets = () => {
|
|
104
104
|
const resolvedTargets = new Array(normalizedTargetJids.length);
|
|
105
105
|
let resolvedTargetCount = 0;
|
|
@@ -202,7 +202,7 @@ function createSignalSessionResolver(options) {
|
|
|
202
202
|
for (let i = 0; i < fallbackIndices.length; i++) {
|
|
203
203
|
fallbackAddresses[i] = normalizedTargetAddresses[fallbackIndices[i]];
|
|
204
204
|
}
|
|
205
|
-
const fallbackSessions = await
|
|
205
|
+
const fallbackSessions = await sessionStore.getSessionsBatch(fallbackAddresses);
|
|
206
206
|
for (let i = 0; i < fallbackIndices.length; i++) {
|
|
207
207
|
const session = fallbackSessions[i];
|
|
208
208
|
if (session) {
|
|
@@ -5,29 +5,38 @@ const appstate_lock_1 = require("./locks/appstate.lock");
|
|
|
5
5
|
const auth_lock_1 = require("./locks/auth.lock");
|
|
6
6
|
const contact_lock_1 = require("./locks/contact.lock");
|
|
7
7
|
const device_list_lock_1 = require("./locks/device-list.lock");
|
|
8
|
+
const identity_lock_1 = require("./locks/identity.lock");
|
|
9
|
+
const message_secret_lock_1 = require("./locks/message-secret.lock");
|
|
8
10
|
const message_lock_1 = require("./locks/message.lock");
|
|
9
11
|
const participants_lock_1 = require("./locks/participants.lock");
|
|
12
|
+
const pre_key_lock_1 = require("./locks/pre-key.lock");
|
|
10
13
|
const privacy_token_lock_1 = require("./locks/privacy-token.lock");
|
|
11
14
|
const retry_lock_1 = require("./locks/retry.lock");
|
|
12
15
|
const sender_key_lock_1 = require("./locks/sender-key.lock");
|
|
16
|
+
const session_lock_1 = require("./locks/session.lock");
|
|
13
17
|
const signal_lock_1 = require("./locks/signal.lock");
|
|
14
18
|
const thread_lock_1 = require("./locks/thread.lock");
|
|
15
19
|
const noop_store_1 = require("./noop.store");
|
|
16
20
|
const appstate_store_1 = require("./providers/memory/appstate.store");
|
|
17
21
|
const contact_store_1 = require("./providers/memory/contact.store");
|
|
18
22
|
const device_list_store_1 = require("./providers/memory/device-list.store");
|
|
23
|
+
const identity_store_1 = require("./providers/memory/identity.store");
|
|
24
|
+
const message_secret_store_1 = require("./providers/memory/message-secret.store");
|
|
19
25
|
const message_store_1 = require("./providers/memory/message.store");
|
|
20
26
|
const participants_store_1 = require("./providers/memory/participants.store");
|
|
27
|
+
const pre_key_store_1 = require("./providers/memory/pre-key.store");
|
|
21
28
|
const privacy_token_store_1 = require("./providers/memory/privacy-token.store");
|
|
22
29
|
const retry_store_1 = require("./providers/memory/retry.store");
|
|
23
30
|
const sender_key_store_1 = require("./providers/memory/sender-key.store");
|
|
31
|
+
const session_store_1 = require("./providers/memory/session.store");
|
|
24
32
|
const signal_store_1 = require("./providers/memory/signal.store");
|
|
25
33
|
const thread_store_1 = require("./providers/memory/thread.store");
|
|
26
34
|
const coercion_1 = require("../util/coercion");
|
|
27
35
|
const DEFAULT_CACHE_TTLS_MS = Object.freeze({
|
|
28
36
|
retryMs: 60 * 1000,
|
|
29
37
|
participantsMs: 5 * 60 * 1000,
|
|
30
|
-
deviceListMs: 5 * 60 * 1000
|
|
38
|
+
deviceListMs: 5 * 60 * 1000,
|
|
39
|
+
messageSecretMs: 30 * 60 * 1000
|
|
31
40
|
});
|
|
32
41
|
function hasDestroy(value) {
|
|
33
42
|
return (!!value &&
|
|
@@ -61,7 +70,8 @@ function createStore(options) {
|
|
|
61
70
|
const cacheTtlsMs = Object.freeze({
|
|
62
71
|
retry: (0, coercion_1.resolvePositive)(options.memory?.cacheTtlMs?.retryMs, DEFAULT_CACHE_TTLS_MS.retryMs, 'memory.cacheTtlMs.retryMs'),
|
|
63
72
|
participants: (0, coercion_1.resolvePositive)(options.memory?.cacheTtlMs?.participantsMs, DEFAULT_CACHE_TTLS_MS.participantsMs, 'memory.cacheTtlMs.participantsMs'),
|
|
64
|
-
deviceList: (0, coercion_1.resolvePositive)(options.memory?.cacheTtlMs?.deviceListMs, DEFAULT_CACHE_TTLS_MS.deviceListMs, 'memory.cacheTtlMs.deviceListMs')
|
|
73
|
+
deviceList: (0, coercion_1.resolvePositive)(options.memory?.cacheTtlMs?.deviceListMs, DEFAULT_CACHE_TTLS_MS.deviceListMs, 'memory.cacheTtlMs.deviceListMs'),
|
|
74
|
+
messageSecret: (0, coercion_1.resolvePositive)(options.memory?.cacheTtlMs?.messageSecretMs, DEFAULT_CACHE_TTLS_MS.messageSecretMs, 'memory.cacheTtlMs.messageSecretMs')
|
|
65
75
|
});
|
|
66
76
|
const sessions = new Map();
|
|
67
77
|
let storeDestroyed = false;
|
|
@@ -81,9 +91,10 @@ function createStore(options) {
|
|
|
81
91
|
const rawAuth = resolveStore(id, backends, providers.auth, 'auth', 'stores', () => {
|
|
82
92
|
throw new Error('providers.auth is required — register a backend or set providers.auth');
|
|
83
93
|
});
|
|
84
|
-
const rawSignal = resolveStore(id, backends, providers.signal ?? 'memory', 'signal', 'stores', () => new signal_store_1.WaSignalMemoryStore(
|
|
85
|
-
|
|
86
|
-
|
|
94
|
+
const rawSignal = resolveStore(id, backends, providers.signal ?? 'memory', 'signal', 'stores', () => new signal_store_1.WaSignalMemoryStore());
|
|
95
|
+
const rawPreKey = resolveStore(id, backends, providers.preKey ?? 'memory', 'preKey', 'stores', () => new pre_key_store_1.WaPreKeyMemoryStore({ maxPreKeys: ml.signalPreKeys }));
|
|
96
|
+
const rawSession = resolveStore(id, backends, providers.session ?? 'memory', 'session', 'stores', () => new session_store_1.WaSessionMemoryStore({ maxSessions: ml.signalSessions }));
|
|
97
|
+
const rawIdentity = resolveStore(id, backends, providers.identity ?? 'memory', 'identity', 'stores', () => new identity_store_1.WaIdentityMemoryStore({
|
|
87
98
|
maxRemoteIdentities: ml.signalRemoteIdentities
|
|
88
99
|
}));
|
|
89
100
|
const rawSenderKey = resolveStore(id, backends, providers.senderKey ?? 'memory', 'senderKey', 'stores', () => new sender_key_store_1.SenderKeyMemoryStore({
|
|
@@ -104,7 +115,12 @@ function createStore(options) {
|
|
|
104
115
|
? new contact_store_1.WaContactMemoryStore({ maxContacts: ml.contacts })
|
|
105
116
|
: noop_store_1.NOOP_CONTACT_STORE);
|
|
106
117
|
const rawPrivacyToken = resolveStore(id, backends, providers.privacyToken ?? 'memory', 'privacyToken', 'stores', () => new privacy_token_store_1.WaPrivacyTokenMemoryStore(ml.privacyTokens));
|
|
107
|
-
const rawRetry = resolveStore(id, backends, cacheProviders.retry ?? 'memory', 'retry', 'caches', () =>
|
|
118
|
+
const rawRetry = resolveStore(id, backends, cacheProviders.retry ?? 'memory', 'retry', 'caches', () => cacheProviders.retry === 'memory' || !cacheProviders.retry
|
|
119
|
+
? new retry_store_1.WaRetryMemoryStore(cacheTtlsMs.retry, {
|
|
120
|
+
maxOutboundMessages: ml.retryOutboundMessages,
|
|
121
|
+
maxInboundCounters: ml.retryInboundCounters
|
|
122
|
+
})
|
|
123
|
+
: noop_store_1.NOOP_RETRY_STORE);
|
|
108
124
|
const rawParticipants = resolveStore(id, backends, cacheProviders.participants ?? 'memory', 'participants', 'caches', () => cacheProviders.participants === 'memory'
|
|
109
125
|
? new participants_store_1.WaParticipantsMemoryStore(cacheTtlsMs.participants, {
|
|
110
126
|
maxGroups: ml.participantsGroups
|
|
@@ -115,14 +131,23 @@ function createStore(options) {
|
|
|
115
131
|
maxUsers: ml.deviceListUsers
|
|
116
132
|
})
|
|
117
133
|
: noop_store_1.NOOP_DEVICE_LIST_STORE);
|
|
134
|
+
const rawMessageSecret = resolveStore(id, backends, cacheProviders.messageSecret ?? 'none', 'messageSecret', 'caches', () => cacheProviders.messageSecret === 'memory'
|
|
135
|
+
? new message_secret_store_1.WaMessageSecretMemoryStore(cacheTtlsMs.messageSecret, {
|
|
136
|
+
maxSecrets: ml.messageSecrets
|
|
137
|
+
})
|
|
138
|
+
: noop_store_1.NOOP_MESSAGE_SECRET_STORE);
|
|
118
139
|
const authStore = (0, auth_lock_1.withAuthLock)(rawAuth);
|
|
119
140
|
const signalStore = (0, signal_lock_1.withSignalLock)(rawSignal);
|
|
141
|
+
const preKeyStore = (0, pre_key_lock_1.withPreKeyLock)(rawPreKey);
|
|
142
|
+
const sessionStore = (0, session_lock_1.withSessionLock)(rawSession);
|
|
143
|
+
const identityStore = (0, identity_lock_1.withIdentityLock)(rawIdentity);
|
|
120
144
|
const senderKeyStore = (0, sender_key_lock_1.withSenderKeyLock)(rawSenderKey);
|
|
121
145
|
const appStateStore = (0, appstate_lock_1.withAppStateLock)(rawAppState);
|
|
122
146
|
const retryStore = (0, retry_lock_1.withRetryLock)(rawRetry);
|
|
123
147
|
const participantsStore = (0, participants_lock_1.withParticipantsLock)(rawParticipants);
|
|
124
148
|
const deviceListStore = (0, device_list_lock_1.withDeviceListLock)(rawDeviceList);
|
|
125
149
|
const messageStore = (0, message_lock_1.withMessageLock)(rawMessages);
|
|
150
|
+
const messageSecretStore = (0, message_secret_lock_1.withMessageSecretLock)(rawMessageSecret);
|
|
126
151
|
const threadStore = (0, thread_lock_1.withThreadLock)(rawThreads);
|
|
127
152
|
const contactStore = (0, contact_lock_1.withContactLock)(rawContacts);
|
|
128
153
|
const privacyTokenStore = (0, privacy_token_lock_1.withPrivacyTokenLock)(rawPrivacyToken);
|
|
@@ -135,12 +160,14 @@ function createStore(options) {
|
|
|
135
160
|
await Promise.all([
|
|
136
161
|
retryStore.clear(),
|
|
137
162
|
participantsStore.clear(),
|
|
138
|
-
deviceListStore.clear()
|
|
163
|
+
deviceListStore.clear(),
|
|
164
|
+
messageSecretStore.clear()
|
|
139
165
|
]);
|
|
140
166
|
await Promise.all([
|
|
141
167
|
destroyIfSupported(retryStore),
|
|
142
168
|
destroyIfSupported(participantsStore),
|
|
143
|
-
destroyIfSupported(deviceListStore)
|
|
169
|
+
destroyIfSupported(deviceListStore),
|
|
170
|
+
destroyIfSupported(messageSecretStore)
|
|
144
171
|
]);
|
|
145
172
|
};
|
|
146
173
|
const destroy = async () => {
|
|
@@ -151,6 +178,9 @@ function createStore(options) {
|
|
|
151
178
|
await Promise.all([
|
|
152
179
|
destroyIfSupported(authStore),
|
|
153
180
|
destroyIfSupported(signalStore),
|
|
181
|
+
destroyIfSupported(preKeyStore),
|
|
182
|
+
destroyIfSupported(sessionStore),
|
|
183
|
+
destroyIfSupported(identityStore),
|
|
154
184
|
destroyIfSupported(senderKeyStore),
|
|
155
185
|
destroyIfSupported(appStateStore),
|
|
156
186
|
destroyIfSupported(messageStore),
|
|
@@ -159,23 +189,27 @@ function createStore(options) {
|
|
|
159
189
|
destroyIfSupported(privacyTokenStore)
|
|
160
190
|
]);
|
|
161
191
|
};
|
|
162
|
-
const
|
|
192
|
+
const storeSession = {
|
|
163
193
|
auth: authStore,
|
|
164
194
|
signal: signalStore,
|
|
195
|
+
preKey: preKeyStore,
|
|
196
|
+
session: sessionStore,
|
|
197
|
+
identity: identityStore,
|
|
165
198
|
senderKey: senderKeyStore,
|
|
166
199
|
appState: appStateStore,
|
|
167
200
|
retry: retryStore,
|
|
168
201
|
participants: participantsStore,
|
|
169
202
|
deviceList: deviceListStore,
|
|
170
203
|
messages: messageStore,
|
|
204
|
+
messageSecret: messageSecretStore,
|
|
171
205
|
threads: threadStore,
|
|
172
206
|
contacts: contactStore,
|
|
173
207
|
privacyToken: privacyTokenStore,
|
|
174
208
|
destroyCaches,
|
|
175
209
|
destroy
|
|
176
210
|
};
|
|
177
|
-
sessions.set(id,
|
|
178
|
-
return
|
|
211
|
+
sessions.set(id, storeSession);
|
|
212
|
+
return storeSession;
|
|
179
213
|
},
|
|
180
214
|
async destroyCaches() {
|
|
181
215
|
const list = Array.from(sessions.values());
|
|
@@ -188,6 +222,8 @@ function createStore(options) {
|
|
|
188
222
|
const list = Array.from(sessions.values());
|
|
189
223
|
sessions.clear();
|
|
190
224
|
await Promise.all(list.map((s) => s.destroy()));
|
|
225
|
+
const uniqueBackends = new Set(Object.values(backends));
|
|
226
|
+
await Promise.all(Array.from(uniqueBackends, (backend) => destroyIfSupported(backend)));
|
|
191
227
|
}
|
|
192
228
|
};
|
|
193
229
|
}
|
package/dist/store/index.js
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.WaPrivacyTokenMemoryStore = exports.WaThreadMemoryStore = exports.WaMessageMemoryStore = exports.WaContactMemoryStore = exports.WaDeviceListMemoryStore = exports.WaParticipantsMemoryStore = exports.WaRetryMemoryStore = exports.SenderKeyMemoryStore = exports.WaSignalMemoryStore = exports.WaAppStateMemoryStore = exports.createStore = void 0;
|
|
3
|
+
exports.WaPrivacyTokenMemoryStore = exports.WaThreadMemoryStore = exports.WaMessageMemoryStore = exports.WaMessageSecretMemoryStore = exports.WaContactMemoryStore = exports.WaDeviceListMemoryStore = exports.WaParticipantsMemoryStore = exports.WaRetryMemoryStore = exports.SenderKeyMemoryStore = exports.WaIdentityMemoryStore = exports.WaSessionMemoryStore = exports.WaPreKeyMemoryStore = exports.WaSignalMemoryStore = exports.WaAppStateMemoryStore = exports.createStore = void 0;
|
|
4
4
|
var createStore_1 = require("./createStore");
|
|
5
5
|
Object.defineProperty(exports, "createStore", { enumerable: true, get: function () { return createStore_1.createStore; } });
|
|
6
6
|
var appstate_store_1 = require("./providers/memory/appstate.store");
|
|
7
7
|
Object.defineProperty(exports, "WaAppStateMemoryStore", { enumerable: true, get: function () { return appstate_store_1.WaAppStateMemoryStore; } });
|
|
8
8
|
var signal_store_1 = require("./providers/memory/signal.store");
|
|
9
9
|
Object.defineProperty(exports, "WaSignalMemoryStore", { enumerable: true, get: function () { return signal_store_1.WaSignalMemoryStore; } });
|
|
10
|
+
var pre_key_store_1 = require("./providers/memory/pre-key.store");
|
|
11
|
+
Object.defineProperty(exports, "WaPreKeyMemoryStore", { enumerable: true, get: function () { return pre_key_store_1.WaPreKeyMemoryStore; } });
|
|
12
|
+
var session_store_1 = require("./providers/memory/session.store");
|
|
13
|
+
Object.defineProperty(exports, "WaSessionMemoryStore", { enumerable: true, get: function () { return session_store_1.WaSessionMemoryStore; } });
|
|
14
|
+
var identity_store_1 = require("./providers/memory/identity.store");
|
|
15
|
+
Object.defineProperty(exports, "WaIdentityMemoryStore", { enumerable: true, get: function () { return identity_store_1.WaIdentityMemoryStore; } });
|
|
10
16
|
var sender_key_store_1 = require("./providers/memory/sender-key.store");
|
|
11
17
|
Object.defineProperty(exports, "SenderKeyMemoryStore", { enumerable: true, get: function () { return sender_key_store_1.SenderKeyMemoryStore; } });
|
|
12
18
|
var retry_store_1 = require("./providers/memory/retry.store");
|
|
@@ -17,6 +23,8 @@ var device_list_store_1 = require("./providers/memory/device-list.store");
|
|
|
17
23
|
Object.defineProperty(exports, "WaDeviceListMemoryStore", { enumerable: true, get: function () { return device_list_store_1.WaDeviceListMemoryStore; } });
|
|
18
24
|
var contact_store_1 = require("./providers/memory/contact.store");
|
|
19
25
|
Object.defineProperty(exports, "WaContactMemoryStore", { enumerable: true, get: function () { return contact_store_1.WaContactMemoryStore; } });
|
|
26
|
+
var message_secret_store_1 = require("./providers/memory/message-secret.store");
|
|
27
|
+
Object.defineProperty(exports, "WaMessageSecretMemoryStore", { enumerable: true, get: function () { return message_secret_store_1.WaMessageSecretMemoryStore; } });
|
|
20
28
|
var message_store_1 = require("./providers/memory/message.store");
|
|
21
29
|
Object.defineProperty(exports, "WaMessageMemoryStore", { enumerable: true, get: function () { return message_store_1.WaMessageMemoryStore; } });
|
|
22
30
|
var thread_store_1 = require("./providers/memory/thread.store");
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withIdentityLock = withIdentityLock;
|
|
4
|
+
const SharedExclusiveGate_1 = require("../../infra/perf/SharedExclusiveGate");
|
|
5
|
+
function withIdentityLock(store) {
|
|
6
|
+
const gate = new SharedExclusiveGate_1.SharedExclusiveGate();
|
|
7
|
+
const destroyStore = store;
|
|
8
|
+
return {
|
|
9
|
+
getRemoteIdentity: (address) => gate.runShared(() => store.getRemoteIdentity(address)),
|
|
10
|
+
getRemoteIdentities: (addresses) => gate.runShared(() => store.getRemoteIdentities(addresses)),
|
|
11
|
+
setRemoteIdentity: (address, identityKey) => gate.runShared(() => store.setRemoteIdentity(address, identityKey)),
|
|
12
|
+
setRemoteIdentities: (entries) => gate.runShared(() => store.setRemoteIdentities(entries)),
|
|
13
|
+
clear: () => gate.runExclusive(() => store.clear()),
|
|
14
|
+
destroy: async () => {
|
|
15
|
+
await gate.close();
|
|
16
|
+
await destroyStore.destroy?.();
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withMessageSecretLock = withMessageSecretLock;
|
|
4
|
+
const SharedExclusiveGate_1 = require("../../infra/perf/SharedExclusiveGate");
|
|
5
|
+
function withMessageSecretLock(store) {
|
|
6
|
+
const gate = new SharedExclusiveGate_1.SharedExclusiveGate();
|
|
7
|
+
const destroyStore = store;
|
|
8
|
+
return {
|
|
9
|
+
get: (messageId, nowMs) => gate.runShared(() => store.get(messageId, nowMs)),
|
|
10
|
+
getBatch: (messageIds, nowMs) => gate.runShared(() => store.getBatch(messageIds, nowMs)),
|
|
11
|
+
set: (messageId, entry) => gate.runShared(() => store.set(messageId, entry)),
|
|
12
|
+
setBatch: (entries) => gate.runShared(() => store.setBatch(entries)),
|
|
13
|
+
cleanupExpired: (nowMs) => gate.runExclusive(() => store.cleanupExpired(nowMs)),
|
|
14
|
+
clear: () => gate.runExclusive(() => store.clear()),
|
|
15
|
+
destroy: async () => {
|
|
16
|
+
await gate.close();
|
|
17
|
+
await destroyStore.destroy?.();
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withPreKeyLock = withPreKeyLock;
|
|
4
|
+
const SharedExclusiveGate_1 = require("../../infra/perf/SharedExclusiveGate");
|
|
5
|
+
const StoreLock_1 = require("../../infra/perf/StoreLock");
|
|
6
|
+
const WA_PREKEY_KEY = 'prekey:prekeys';
|
|
7
|
+
const WA_PREKEY_SERVER_KEY = 'prekey:serverHasPreKeys';
|
|
8
|
+
const WA_PREKEY_CLEAR_KEY = 'prekey:clear';
|
|
9
|
+
function withPreKeyLock(store) {
|
|
10
|
+
const lock = new StoreLock_1.StoreLock();
|
|
11
|
+
const gate = new SharedExclusiveGate_1.SharedExclusiveGate();
|
|
12
|
+
const destroyStore = store;
|
|
13
|
+
return {
|
|
14
|
+
putPreKey: (record) => gate.runShared(() => lock.run(WA_PREKEY_KEY, () => store.putPreKey(record))),
|
|
15
|
+
getOrGenPreKeys: (count, generator) => gate.runShared(() => lock.run(WA_PREKEY_KEY, () => store.getOrGenPreKeys(count, generator))),
|
|
16
|
+
getPreKeyById: (keyId) => gate.runShared(() => store.getPreKeyById(keyId)),
|
|
17
|
+
getPreKeysById: (keyIds) => gate.runShared(() => store.getPreKeysById(keyIds)),
|
|
18
|
+
consumePreKeyById: (keyId) => gate.runShared(() => lock.run(WA_PREKEY_KEY, () => store.consumePreKeyById(keyId))),
|
|
19
|
+
getOrGenSinglePreKey: (generator) => gate.runShared(() => lock.run(WA_PREKEY_KEY, () => store.getOrGenSinglePreKey(generator))),
|
|
20
|
+
markKeyAsUploaded: (keyId) => gate.runShared(() => lock.run(WA_PREKEY_KEY, () => store.markKeyAsUploaded(keyId))),
|
|
21
|
+
setServerHasPreKeys: (value) => gate.runShared(() => lock.run(WA_PREKEY_SERVER_KEY, () => store.setServerHasPreKeys(value))),
|
|
22
|
+
getServerHasPreKeys: () => gate.runShared(() => store.getServerHasPreKeys()),
|
|
23
|
+
clear: () => gate.runExclusive(() => lock.run(WA_PREKEY_CLEAR_KEY, () => store.clear())),
|
|
24
|
+
destroy: async () => {
|
|
25
|
+
await gate.close();
|
|
26
|
+
await lock.shutdown();
|
|
27
|
+
await destroyStore.destroy?.();
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withSessionLock = withSessionLock;
|
|
4
|
+
const SharedExclusiveGate_1 = require("../../infra/perf/SharedExclusiveGate");
|
|
5
|
+
function withSessionLock(store) {
|
|
6
|
+
const gate = new SharedExclusiveGate_1.SharedExclusiveGate();
|
|
7
|
+
const destroyStore = store;
|
|
8
|
+
return {
|
|
9
|
+
hasSession: (address) => gate.runShared(() => store.hasSession(address)),
|
|
10
|
+
hasSessions: (addresses) => gate.runShared(() => store.hasSessions(addresses)),
|
|
11
|
+
getSession: (address) => gate.runShared(() => store.getSession(address)),
|
|
12
|
+
getSessionsBatch: (addresses) => gate.runShared(() => store.getSessionsBatch(addresses)),
|
|
13
|
+
setSession: (address, session) => gate.runShared(() => store.setSession(address, session)),
|
|
14
|
+
setSessionsBatch: (entries) => gate.runShared(() => store.setSessionsBatch(entries)),
|
|
15
|
+
deleteSession: (address) => gate.runShared(() => store.deleteSession(address)),
|
|
16
|
+
clear: () => gate.runExclusive(() => store.clear()),
|
|
17
|
+
destroy: async () => {
|
|
18
|
+
await gate.close();
|
|
19
|
+
await destroyStore.destroy?.();
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
@@ -5,8 +5,6 @@ const SharedExclusiveGate_1 = require("../../infra/perf/SharedExclusiveGate");
|
|
|
5
5
|
const StoreLock_1 = require("../../infra/perf/StoreLock");
|
|
6
6
|
const WA_SIGNAL_REGISTRATION_KEY = 'signal:registration';
|
|
7
7
|
const WA_SIGNAL_SIGNED_PREKEY_KEY = 'signal:signedPreKey';
|
|
8
|
-
const WA_SIGNAL_PREKEYS_KEY = 'signal:prekeys';
|
|
9
|
-
const WA_SIGNAL_SERVER_HAS_PREKEYS_KEY = 'signal:serverHasPreKeys';
|
|
10
8
|
const WA_SIGNAL_CLEAR_KEY = 'signal:clear';
|
|
11
9
|
function withSignalLock(store) {
|
|
12
10
|
const lock = new StoreLock_1.StoreLock();
|
|
@@ -31,28 +29,6 @@ function withSignalLock(store) {
|
|
|
31
29
|
getSignedPreKeyById: (keyId) => gate.runShared(() => store.getSignedPreKeyById(keyId)),
|
|
32
30
|
setSignedPreKeyRotationTs: (value) => gate.runShared(() => lock.run(WA_SIGNAL_SIGNED_PREKEY_KEY, () => store.setSignedPreKeyRotationTs(value))),
|
|
33
31
|
getSignedPreKeyRotationTs: () => gate.runShared(() => store.getSignedPreKeyRotationTs()),
|
|
34
|
-
putPreKey: (record) => gate.runShared(() => lock.run(WA_SIGNAL_PREKEYS_KEY, () => store.putPreKey(record))),
|
|
35
|
-
getOrGenPreKeys: (count, generator) => gate.runShared(() => lock.run(WA_SIGNAL_PREKEYS_KEY, () => store.getOrGenPreKeys(count, generator))),
|
|
36
|
-
getPreKeyById: (keyId) => gate.runShared(() => store.getPreKeyById(keyId)),
|
|
37
|
-
getPreKeysById: (keyIds) => gate.runShared(() => store.getPreKeysById(keyIds)),
|
|
38
|
-
consumePreKeyById: (keyId) => gate.runShared(() => lock.run(WA_SIGNAL_PREKEYS_KEY, () => store.consumePreKeyById(keyId))),
|
|
39
|
-
getOrGenSinglePreKey: (generator) => gate.runShared(() => lock.run(WA_SIGNAL_PREKEYS_KEY, () => store.getOrGenSinglePreKey(generator))),
|
|
40
|
-
markKeyAsUploaded: (keyId) => gate.runShared(() => lock.run(WA_SIGNAL_PREKEYS_KEY, () => store.markKeyAsUploaded(keyId))),
|
|
41
|
-
setServerHasPreKeys: (value) => gate.runShared(() => lock.run(WA_SIGNAL_SERVER_HAS_PREKEYS_KEY, () => store.setServerHasPreKeys(value))),
|
|
42
|
-
getServerHasPreKeys: () => gate.runShared(() => store.getServerHasPreKeys()),
|
|
43
|
-
getSignalMeta: () => gate.runShared(() => store.getSignalMeta()),
|
|
44
|
-
hasSession: (address) => gate.runShared(() => store.hasSession(address)),
|
|
45
|
-
hasSessions: (addresses) => gate.runShared(() => store.hasSessions(addresses)),
|
|
46
|
-
getSession: (address) => gate.runShared(() => store.getSession(address)),
|
|
47
|
-
getSessionsBatch: (addresses) => gate.runShared(() => store.getSessionsBatch(addresses)),
|
|
48
|
-
// Session and identity read-modify-write semantics are serialized in SignalProtocol per address.
|
|
49
|
-
setSession: (address, session) => gate.runShared(() => store.setSession(address, session)),
|
|
50
|
-
setSessionsBatch: (entries) => gate.runShared(() => store.setSessionsBatch(entries)),
|
|
51
|
-
deleteSession: (address) => gate.runShared(() => store.deleteSession(address)),
|
|
52
|
-
getRemoteIdentity: (address) => gate.runShared(() => store.getRemoteIdentity(address)),
|
|
53
|
-
getRemoteIdentities: (addresses) => gate.runShared(() => store.getRemoteIdentities(addresses)),
|
|
54
|
-
setRemoteIdentity: (address, identityKey) => gate.runShared(() => store.setRemoteIdentity(address, identityKey)),
|
|
55
|
-
setRemoteIdentities: (entries) => gate.runShared(() => store.setRemoteIdentities(entries)),
|
|
56
32
|
clear: () => gate.runExclusive(() => lock.run(WA_SIGNAL_CLEAR_KEY, async () => {
|
|
57
33
|
await store.clear();
|
|
58
34
|
cachedRegInfo = undefined;
|
package/dist/store/noop.store.js
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.NOOP_DEVICE_LIST_STORE = exports.NOOP_PARTICIPANTS_STORE = exports.NOOP_CONTACT_STORE = exports.NOOP_THREAD_STORE = exports.NOOP_MESSAGE_STORE = void 0;
|
|
3
|
+
exports.NOOP_DEVICE_LIST_STORE = exports.NOOP_PARTICIPANTS_STORE = exports.NOOP_RETRY_STORE = exports.NOOP_CONTACT_STORE = exports.NOOP_THREAD_STORE = exports.NOOP_MESSAGE_STORE = exports.NOOP_MESSAGE_SECRET_STORE = void 0;
|
|
4
4
|
const EMPTY_STORE_LIST = Object.freeze([]);
|
|
5
|
+
exports.NOOP_MESSAGE_SECRET_STORE = Object.freeze({
|
|
6
|
+
get: async (_messageId) => null,
|
|
7
|
+
getBatch: async (messageIds) => new Array(messageIds.length).fill(null),
|
|
8
|
+
set: async (_messageId, _entry) => { },
|
|
9
|
+
setBatch: async (_entries) => { },
|
|
10
|
+
cleanupExpired: async (_nowMs) => 0,
|
|
11
|
+
clear: async () => { }
|
|
12
|
+
});
|
|
5
13
|
exports.NOOP_MESSAGE_STORE = Object.freeze({
|
|
6
14
|
upsert: async (_record) => { },
|
|
7
15
|
upsertBatch: async (_records) => { },
|
|
@@ -25,6 +33,18 @@ exports.NOOP_CONTACT_STORE = Object.freeze({
|
|
|
25
33
|
deleteByJid: async (_jid) => 0,
|
|
26
34
|
clear: async () => { }
|
|
27
35
|
});
|
|
36
|
+
exports.NOOP_RETRY_STORE = Object.freeze({
|
|
37
|
+
getOutboundRequesterStatus: async () => null,
|
|
38
|
+
upsertOutboundMessage: async (_record) => { },
|
|
39
|
+
deleteOutboundMessage: async (_messageId) => 0,
|
|
40
|
+
getOutboundMessage: async (_messageId) => null,
|
|
41
|
+
updateOutboundMessageState: async () => { },
|
|
42
|
+
markOutboundRequesterDelivered: async () => { },
|
|
43
|
+
incrementInboundCounter: async () => 0,
|
|
44
|
+
cleanupExpired: async (_nowMs) => 0,
|
|
45
|
+
clear: async () => { },
|
|
46
|
+
destroy: async () => { }
|
|
47
|
+
});
|
|
28
48
|
exports.NOOP_PARTICIPANTS_STORE = Object.freeze({
|
|
29
49
|
upsertGroupParticipants: async (_snapshot) => { },
|
|
30
50
|
getGroupParticipants: async (_groupJid, _nowMs) => null,
|
|
@@ -9,6 +9,9 @@ const DEFAULTS = Object.freeze({
|
|
|
9
9
|
});
|
|
10
10
|
class WaDeviceListMemoryStore {
|
|
11
11
|
constructor(ttlMs = DEFAULTS.ttlMs, options = {}) {
|
|
12
|
+
if (!Number.isFinite(ttlMs) || ttlMs <= 0) {
|
|
13
|
+
throw new Error('device-list ttlMs must be a positive finite number');
|
|
14
|
+
}
|
|
12
15
|
this.records = new Map();
|
|
13
16
|
this.ttlMs = ttlMs;
|
|
14
17
|
this.maxUsers = (0, coercion_1.resolvePositive)(options.maxUsers, DEFAULTS.maxUsers, 'WaDeviceListMemoryStoreOptions.maxUsers');
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WaIdentityMemoryStore = void 0;
|
|
4
|
+
const jid_1 = require("../../../protocol/jid");
|
|
5
|
+
const coercion_1 = require("../../../util/coercion");
|
|
6
|
+
const collections_1 = require("../../../util/collections");
|
|
7
|
+
const DEFAULT_MAX_REMOTE_IDENTITIES = 8192;
|
|
8
|
+
class WaIdentityMemoryStore {
|
|
9
|
+
constructor(options = {}) {
|
|
10
|
+
this.remoteIdentities = new Map();
|
|
11
|
+
this.maxRemoteIdentities = (0, coercion_1.resolvePositive)(options.maxRemoteIdentities, DEFAULT_MAX_REMOTE_IDENTITIES, 'WaIdentityMemoryStoreOptions.maxRemoteIdentities');
|
|
12
|
+
}
|
|
13
|
+
async getRemoteIdentity(address) {
|
|
14
|
+
return this.remoteIdentities.get((0, jid_1.signalAddressKey)(address)) ?? null;
|
|
15
|
+
}
|
|
16
|
+
async getRemoteIdentities(addresses) {
|
|
17
|
+
const result = new Array(addresses.length);
|
|
18
|
+
for (let i = 0; i < addresses.length; i += 1) {
|
|
19
|
+
result[i] = this.remoteIdentities.get((0, jid_1.signalAddressKey)(addresses[i])) ?? null;
|
|
20
|
+
}
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
async setRemoteIdentity(address, identityKey) {
|
|
24
|
+
(0, collections_1.setBoundedMapEntry)(this.remoteIdentities, (0, jid_1.signalAddressKey)(address), identityKey, this.maxRemoteIdentities);
|
|
25
|
+
}
|
|
26
|
+
async setRemoteIdentities(entries) {
|
|
27
|
+
for (const entry of entries) {
|
|
28
|
+
(0, collections_1.setBoundedMapEntry)(this.remoteIdentities, (0, jid_1.signalAddressKey)(entry.address), entry.identityKey, this.maxRemoteIdentities);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async clear() {
|
|
32
|
+
this.remoteIdentities.clear();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.WaIdentityMemoryStore = WaIdentityMemoryStore;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WaMessageSecretMemoryStore = void 0;
|
|
4
|
+
const coercion_1 = require("../../../util/coercion");
|
|
5
|
+
const collections_1 = require("../../../util/collections");
|
|
6
|
+
const DEFAULTS = Object.freeze({
|
|
7
|
+
ttlMs: 30 * 60 * 1000,
|
|
8
|
+
maxSecrets: 10000
|
|
9
|
+
});
|
|
10
|
+
class WaMessageSecretMemoryStore {
|
|
11
|
+
constructor(ttlMs = DEFAULTS.ttlMs, options = {}) {
|
|
12
|
+
if (!Number.isFinite(ttlMs) || ttlMs <= 0) {
|
|
13
|
+
throw new Error('message-secret ttlMs must be a positive finite number');
|
|
14
|
+
}
|
|
15
|
+
this.secrets = new Map();
|
|
16
|
+
this.ttlMs = ttlMs;
|
|
17
|
+
this.maxSecrets = (0, coercion_1.resolvePositive)(options.maxSecrets, DEFAULTS.maxSecrets, 'WaMessageSecretMemoryStoreOptions.maxSecrets');
|
|
18
|
+
this.cleanupTimer = setInterval(() => {
|
|
19
|
+
void this.cleanupExpired(Date.now());
|
|
20
|
+
}, (0, collections_1.resolveCleanupIntervalMs)(ttlMs));
|
|
21
|
+
this.cleanupTimer.unref();
|
|
22
|
+
}
|
|
23
|
+
async get(messageId, nowMs = Date.now()) {
|
|
24
|
+
const cached = this.secrets.get(messageId);
|
|
25
|
+
if (!cached)
|
|
26
|
+
return null;
|
|
27
|
+
if (cached.expiresAtMs <= nowMs) {
|
|
28
|
+
this.secrets.delete(messageId);
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
return { secret: cached.secret, senderJid: cached.senderJid };
|
|
32
|
+
}
|
|
33
|
+
async getBatch(messageIds, nowMs = Date.now()) {
|
|
34
|
+
const result = new Array(messageIds.length);
|
|
35
|
+
for (let i = 0; i < messageIds.length; i += 1) {
|
|
36
|
+
const cached = this.secrets.get(messageIds[i]);
|
|
37
|
+
if (!cached) {
|
|
38
|
+
result[i] = null;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (cached.expiresAtMs <= nowMs) {
|
|
42
|
+
this.secrets.delete(messageIds[i]);
|
|
43
|
+
result[i] = null;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
result[i] = { secret: cached.secret, senderJid: cached.senderJid };
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
async set(messageId, entry) {
|
|
51
|
+
(0, collections_1.setBoundedMapEntry)(this.secrets, messageId, {
|
|
52
|
+
secret: entry.secret,
|
|
53
|
+
senderJid: entry.senderJid,
|
|
54
|
+
expiresAtMs: Date.now() + this.ttlMs
|
|
55
|
+
}, this.maxSecrets);
|
|
56
|
+
}
|
|
57
|
+
async setBatch(entries) {
|
|
58
|
+
const nowMs = Date.now();
|
|
59
|
+
for (let i = 0; i < entries.length; i += 1) {
|
|
60
|
+
(0, collections_1.setBoundedMapEntry)(this.secrets, entries[i].messageId, {
|
|
61
|
+
secret: entries[i].entry.secret,
|
|
62
|
+
senderJid: entries[i].entry.senderJid,
|
|
63
|
+
expiresAtMs: nowMs + this.ttlMs
|
|
64
|
+
}, this.maxSecrets);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async cleanupExpired(nowMs) {
|
|
68
|
+
let removed = 0;
|
|
69
|
+
for (const [messageId, entry] of this.secrets) {
|
|
70
|
+
if (entry.expiresAtMs > nowMs)
|
|
71
|
+
continue;
|
|
72
|
+
this.secrets.delete(messageId);
|
|
73
|
+
removed += 1;
|
|
74
|
+
}
|
|
75
|
+
return removed;
|
|
76
|
+
}
|
|
77
|
+
async clear() {
|
|
78
|
+
this.secrets.clear();
|
|
79
|
+
}
|
|
80
|
+
async destroy() {
|
|
81
|
+
clearInterval(this.cleanupTimer);
|
|
82
|
+
this.secrets.clear();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
exports.WaMessageSecretMemoryStore = WaMessageSecretMemoryStore;
|
|
@@ -9,6 +9,9 @@ const DEFAULTS = Object.freeze({
|
|
|
9
9
|
});
|
|
10
10
|
class WaParticipantsMemoryStore {
|
|
11
11
|
constructor(ttlMs = DEFAULTS.ttlMs, options = {}) {
|
|
12
|
+
if (!Number.isFinite(ttlMs) || ttlMs <= 0) {
|
|
13
|
+
throw new Error('participants ttlMs must be a positive finite number');
|
|
14
|
+
}
|
|
12
15
|
this.records = new Map();
|
|
13
16
|
this.ttlMs = ttlMs;
|
|
14
17
|
this.maxGroups = (0, coercion_1.resolvePositive)(options.maxGroups, DEFAULTS.maxGroups, 'WaParticipantsMemoryStoreOptions.maxGroups');
|