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
|
@@ -2,29 +2,38 @@ import { withAppStateLock } from './locks/appstate.lock.js';
|
|
|
2
2
|
import { withAuthLock } from './locks/auth.lock.js';
|
|
3
3
|
import { withContactLock } from './locks/contact.lock.js';
|
|
4
4
|
import { withDeviceListLock } from './locks/device-list.lock.js';
|
|
5
|
+
import { withIdentityLock } from './locks/identity.lock.js';
|
|
6
|
+
import { withMessageSecretLock } from './locks/message-secret.lock.js';
|
|
5
7
|
import { withMessageLock } from './locks/message.lock.js';
|
|
6
8
|
import { withParticipantsLock } from './locks/participants.lock.js';
|
|
9
|
+
import { withPreKeyLock } from './locks/pre-key.lock.js';
|
|
7
10
|
import { withPrivacyTokenLock } from './locks/privacy-token.lock.js';
|
|
8
11
|
import { withRetryLock } from './locks/retry.lock.js';
|
|
9
12
|
import { withSenderKeyLock } from './locks/sender-key.lock.js';
|
|
13
|
+
import { withSessionLock } from './locks/session.lock.js';
|
|
10
14
|
import { withSignalLock } from './locks/signal.lock.js';
|
|
11
15
|
import { withThreadLock } from './locks/thread.lock.js';
|
|
12
|
-
import { NOOP_CONTACT_STORE, NOOP_DEVICE_LIST_STORE, NOOP_MESSAGE_STORE, NOOP_PARTICIPANTS_STORE, NOOP_THREAD_STORE } from './noop.store.js';
|
|
16
|
+
import { NOOP_CONTACT_STORE, NOOP_DEVICE_LIST_STORE, NOOP_MESSAGE_SECRET_STORE, NOOP_MESSAGE_STORE, NOOP_PARTICIPANTS_STORE, NOOP_RETRY_STORE, NOOP_THREAD_STORE } from './noop.store.js';
|
|
13
17
|
import { WaAppStateMemoryStore } from './providers/memory/appstate.store.js';
|
|
14
18
|
import { WaContactMemoryStore } from './providers/memory/contact.store.js';
|
|
15
19
|
import { WaDeviceListMemoryStore } from './providers/memory/device-list.store.js';
|
|
20
|
+
import { WaIdentityMemoryStore } from './providers/memory/identity.store.js';
|
|
21
|
+
import { WaMessageSecretMemoryStore } from './providers/memory/message-secret.store.js';
|
|
16
22
|
import { WaMessageMemoryStore } from './providers/memory/message.store.js';
|
|
17
23
|
import { WaParticipantsMemoryStore } from './providers/memory/participants.store.js';
|
|
24
|
+
import { WaPreKeyMemoryStore } from './providers/memory/pre-key.store.js';
|
|
18
25
|
import { WaPrivacyTokenMemoryStore } from './providers/memory/privacy-token.store.js';
|
|
19
26
|
import { WaRetryMemoryStore } from './providers/memory/retry.store.js';
|
|
20
27
|
import { SenderKeyMemoryStore } from './providers/memory/sender-key.store.js';
|
|
28
|
+
import { WaSessionMemoryStore } from './providers/memory/session.store.js';
|
|
21
29
|
import { WaSignalMemoryStore } from './providers/memory/signal.store.js';
|
|
22
30
|
import { WaThreadMemoryStore } from './providers/memory/thread.store.js';
|
|
23
31
|
import { resolvePositive } from '../util/coercion.js';
|
|
24
32
|
const DEFAULT_CACHE_TTLS_MS = Object.freeze({
|
|
25
33
|
retryMs: 60 * 1000,
|
|
26
34
|
participantsMs: 5 * 60 * 1000,
|
|
27
|
-
deviceListMs: 5 * 60 * 1000
|
|
35
|
+
deviceListMs: 5 * 60 * 1000,
|
|
36
|
+
messageSecretMs: 30 * 60 * 1000
|
|
28
37
|
});
|
|
29
38
|
function hasDestroy(value) {
|
|
30
39
|
return (!!value &&
|
|
@@ -58,7 +67,8 @@ export function createStore(options) {
|
|
|
58
67
|
const cacheTtlsMs = Object.freeze({
|
|
59
68
|
retry: resolvePositive(options.memory?.cacheTtlMs?.retryMs, DEFAULT_CACHE_TTLS_MS.retryMs, 'memory.cacheTtlMs.retryMs'),
|
|
60
69
|
participants: resolvePositive(options.memory?.cacheTtlMs?.participantsMs, DEFAULT_CACHE_TTLS_MS.participantsMs, 'memory.cacheTtlMs.participantsMs'),
|
|
61
|
-
deviceList: resolvePositive(options.memory?.cacheTtlMs?.deviceListMs, DEFAULT_CACHE_TTLS_MS.deviceListMs, 'memory.cacheTtlMs.deviceListMs')
|
|
70
|
+
deviceList: resolvePositive(options.memory?.cacheTtlMs?.deviceListMs, DEFAULT_CACHE_TTLS_MS.deviceListMs, 'memory.cacheTtlMs.deviceListMs'),
|
|
71
|
+
messageSecret: resolvePositive(options.memory?.cacheTtlMs?.messageSecretMs, DEFAULT_CACHE_TTLS_MS.messageSecretMs, 'memory.cacheTtlMs.messageSecretMs')
|
|
62
72
|
});
|
|
63
73
|
const sessions = new Map();
|
|
64
74
|
let storeDestroyed = false;
|
|
@@ -78,9 +88,10 @@ export function createStore(options) {
|
|
|
78
88
|
const rawAuth = resolveStore(id, backends, providers.auth, 'auth', 'stores', () => {
|
|
79
89
|
throw new Error('providers.auth is required — register a backend or set providers.auth');
|
|
80
90
|
});
|
|
81
|
-
const rawSignal = resolveStore(id, backends, providers.signal ?? 'memory', 'signal', 'stores', () => new WaSignalMemoryStore(
|
|
82
|
-
|
|
83
|
-
|
|
91
|
+
const rawSignal = resolveStore(id, backends, providers.signal ?? 'memory', 'signal', 'stores', () => new WaSignalMemoryStore());
|
|
92
|
+
const rawPreKey = resolveStore(id, backends, providers.preKey ?? 'memory', 'preKey', 'stores', () => new WaPreKeyMemoryStore({ maxPreKeys: ml.signalPreKeys }));
|
|
93
|
+
const rawSession = resolveStore(id, backends, providers.session ?? 'memory', 'session', 'stores', () => new WaSessionMemoryStore({ maxSessions: ml.signalSessions }));
|
|
94
|
+
const rawIdentity = resolveStore(id, backends, providers.identity ?? 'memory', 'identity', 'stores', () => new WaIdentityMemoryStore({
|
|
84
95
|
maxRemoteIdentities: ml.signalRemoteIdentities
|
|
85
96
|
}));
|
|
86
97
|
const rawSenderKey = resolveStore(id, backends, providers.senderKey ?? 'memory', 'senderKey', 'stores', () => new SenderKeyMemoryStore({
|
|
@@ -101,7 +112,12 @@ export function createStore(options) {
|
|
|
101
112
|
? new WaContactMemoryStore({ maxContacts: ml.contacts })
|
|
102
113
|
: NOOP_CONTACT_STORE);
|
|
103
114
|
const rawPrivacyToken = resolveStore(id, backends, providers.privacyToken ?? 'memory', 'privacyToken', 'stores', () => new WaPrivacyTokenMemoryStore(ml.privacyTokens));
|
|
104
|
-
const rawRetry = resolveStore(id, backends, cacheProviders.retry ?? 'memory', 'retry', 'caches', () =>
|
|
115
|
+
const rawRetry = resolveStore(id, backends, cacheProviders.retry ?? 'memory', 'retry', 'caches', () => cacheProviders.retry === 'memory' || !cacheProviders.retry
|
|
116
|
+
? new WaRetryMemoryStore(cacheTtlsMs.retry, {
|
|
117
|
+
maxOutboundMessages: ml.retryOutboundMessages,
|
|
118
|
+
maxInboundCounters: ml.retryInboundCounters
|
|
119
|
+
})
|
|
120
|
+
: NOOP_RETRY_STORE);
|
|
105
121
|
const rawParticipants = resolveStore(id, backends, cacheProviders.participants ?? 'memory', 'participants', 'caches', () => cacheProviders.participants === 'memory'
|
|
106
122
|
? new WaParticipantsMemoryStore(cacheTtlsMs.participants, {
|
|
107
123
|
maxGroups: ml.participantsGroups
|
|
@@ -112,14 +128,23 @@ export function createStore(options) {
|
|
|
112
128
|
maxUsers: ml.deviceListUsers
|
|
113
129
|
})
|
|
114
130
|
: NOOP_DEVICE_LIST_STORE);
|
|
131
|
+
const rawMessageSecret = resolveStore(id, backends, cacheProviders.messageSecret ?? 'none', 'messageSecret', 'caches', () => cacheProviders.messageSecret === 'memory'
|
|
132
|
+
? new WaMessageSecretMemoryStore(cacheTtlsMs.messageSecret, {
|
|
133
|
+
maxSecrets: ml.messageSecrets
|
|
134
|
+
})
|
|
135
|
+
: NOOP_MESSAGE_SECRET_STORE);
|
|
115
136
|
const authStore = withAuthLock(rawAuth);
|
|
116
137
|
const signalStore = withSignalLock(rawSignal);
|
|
138
|
+
const preKeyStore = withPreKeyLock(rawPreKey);
|
|
139
|
+
const sessionStore = withSessionLock(rawSession);
|
|
140
|
+
const identityStore = withIdentityLock(rawIdentity);
|
|
117
141
|
const senderKeyStore = withSenderKeyLock(rawSenderKey);
|
|
118
142
|
const appStateStore = withAppStateLock(rawAppState);
|
|
119
143
|
const retryStore = withRetryLock(rawRetry);
|
|
120
144
|
const participantsStore = withParticipantsLock(rawParticipants);
|
|
121
145
|
const deviceListStore = withDeviceListLock(rawDeviceList);
|
|
122
146
|
const messageStore = withMessageLock(rawMessages);
|
|
147
|
+
const messageSecretStore = withMessageSecretLock(rawMessageSecret);
|
|
123
148
|
const threadStore = withThreadLock(rawThreads);
|
|
124
149
|
const contactStore = withContactLock(rawContacts);
|
|
125
150
|
const privacyTokenStore = withPrivacyTokenLock(rawPrivacyToken);
|
|
@@ -132,12 +157,14 @@ export function createStore(options) {
|
|
|
132
157
|
await Promise.all([
|
|
133
158
|
retryStore.clear(),
|
|
134
159
|
participantsStore.clear(),
|
|
135
|
-
deviceListStore.clear()
|
|
160
|
+
deviceListStore.clear(),
|
|
161
|
+
messageSecretStore.clear()
|
|
136
162
|
]);
|
|
137
163
|
await Promise.all([
|
|
138
164
|
destroyIfSupported(retryStore),
|
|
139
165
|
destroyIfSupported(participantsStore),
|
|
140
|
-
destroyIfSupported(deviceListStore)
|
|
166
|
+
destroyIfSupported(deviceListStore),
|
|
167
|
+
destroyIfSupported(messageSecretStore)
|
|
141
168
|
]);
|
|
142
169
|
};
|
|
143
170
|
const destroy = async () => {
|
|
@@ -148,6 +175,9 @@ export function createStore(options) {
|
|
|
148
175
|
await Promise.all([
|
|
149
176
|
destroyIfSupported(authStore),
|
|
150
177
|
destroyIfSupported(signalStore),
|
|
178
|
+
destroyIfSupported(preKeyStore),
|
|
179
|
+
destroyIfSupported(sessionStore),
|
|
180
|
+
destroyIfSupported(identityStore),
|
|
151
181
|
destroyIfSupported(senderKeyStore),
|
|
152
182
|
destroyIfSupported(appStateStore),
|
|
153
183
|
destroyIfSupported(messageStore),
|
|
@@ -156,23 +186,27 @@ export function createStore(options) {
|
|
|
156
186
|
destroyIfSupported(privacyTokenStore)
|
|
157
187
|
]);
|
|
158
188
|
};
|
|
159
|
-
const
|
|
189
|
+
const storeSession = {
|
|
160
190
|
auth: authStore,
|
|
161
191
|
signal: signalStore,
|
|
192
|
+
preKey: preKeyStore,
|
|
193
|
+
session: sessionStore,
|
|
194
|
+
identity: identityStore,
|
|
162
195
|
senderKey: senderKeyStore,
|
|
163
196
|
appState: appStateStore,
|
|
164
197
|
retry: retryStore,
|
|
165
198
|
participants: participantsStore,
|
|
166
199
|
deviceList: deviceListStore,
|
|
167
200
|
messages: messageStore,
|
|
201
|
+
messageSecret: messageSecretStore,
|
|
168
202
|
threads: threadStore,
|
|
169
203
|
contacts: contactStore,
|
|
170
204
|
privacyToken: privacyTokenStore,
|
|
171
205
|
destroyCaches,
|
|
172
206
|
destroy
|
|
173
207
|
};
|
|
174
|
-
sessions.set(id,
|
|
175
|
-
return
|
|
208
|
+
sessions.set(id, storeSession);
|
|
209
|
+
return storeSession;
|
|
176
210
|
},
|
|
177
211
|
async destroyCaches() {
|
|
178
212
|
const list = Array.from(sessions.values());
|
|
@@ -185,6 +219,8 @@ export function createStore(options) {
|
|
|
185
219
|
const list = Array.from(sessions.values());
|
|
186
220
|
sessions.clear();
|
|
187
221
|
await Promise.all(list.map((s) => s.destroy()));
|
|
222
|
+
const uniqueBackends = new Set(Object.values(backends));
|
|
223
|
+
await Promise.all(Array.from(uniqueBackends, (backend) => destroyIfSupported(backend)));
|
|
188
224
|
}
|
|
189
225
|
};
|
|
190
226
|
}
|
package/dist/esm/store/index.js
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
export { createStore } from './createStore.js';
|
|
2
2
|
export { WaAppStateMemoryStore } from './providers/memory/appstate.store.js';
|
|
3
3
|
export { WaSignalMemoryStore } from './providers/memory/signal.store.js';
|
|
4
|
+
export { WaPreKeyMemoryStore } from './providers/memory/pre-key.store.js';
|
|
5
|
+
export { WaSessionMemoryStore } from './providers/memory/session.store.js';
|
|
6
|
+
export { WaIdentityMemoryStore } from './providers/memory/identity.store.js';
|
|
4
7
|
export { SenderKeyMemoryStore } from './providers/memory/sender-key.store.js';
|
|
5
8
|
export { WaRetryMemoryStore } from './providers/memory/retry.store.js';
|
|
6
9
|
export { WaParticipantsMemoryStore } from './providers/memory/participants.store.js';
|
|
7
10
|
export { WaDeviceListMemoryStore } from './providers/memory/device-list.store.js';
|
|
8
11
|
export { WaContactMemoryStore } from './providers/memory/contact.store.js';
|
|
12
|
+
export { WaMessageSecretMemoryStore } from './providers/memory/message-secret.store.js';
|
|
9
13
|
export { WaMessageMemoryStore } from './providers/memory/message.store.js';
|
|
10
14
|
export { WaThreadMemoryStore } from './providers/memory/thread.store.js';
|
|
11
15
|
export { WaPrivacyTokenMemoryStore } from './providers/memory/privacy-token.store.js';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { SharedExclusiveGate } from '../../infra/perf/SharedExclusiveGate.js';
|
|
2
|
+
export function withIdentityLock(store) {
|
|
3
|
+
const gate = new SharedExclusiveGate();
|
|
4
|
+
const destroyStore = store;
|
|
5
|
+
return {
|
|
6
|
+
getRemoteIdentity: (address) => gate.runShared(() => store.getRemoteIdentity(address)),
|
|
7
|
+
getRemoteIdentities: (addresses) => gate.runShared(() => store.getRemoteIdentities(addresses)),
|
|
8
|
+
setRemoteIdentity: (address, identityKey) => gate.runShared(() => store.setRemoteIdentity(address, identityKey)),
|
|
9
|
+
setRemoteIdentities: (entries) => gate.runShared(() => store.setRemoteIdentities(entries)),
|
|
10
|
+
clear: () => gate.runExclusive(() => store.clear()),
|
|
11
|
+
destroy: async () => {
|
|
12
|
+
await gate.close();
|
|
13
|
+
await destroyStore.destroy?.();
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { SharedExclusiveGate } from '../../infra/perf/SharedExclusiveGate.js';
|
|
2
|
+
export function withMessageSecretLock(store) {
|
|
3
|
+
const gate = new SharedExclusiveGate();
|
|
4
|
+
const destroyStore = store;
|
|
5
|
+
return {
|
|
6
|
+
get: (messageId, nowMs) => gate.runShared(() => store.get(messageId, nowMs)),
|
|
7
|
+
getBatch: (messageIds, nowMs) => gate.runShared(() => store.getBatch(messageIds, nowMs)),
|
|
8
|
+
set: (messageId, entry) => gate.runShared(() => store.set(messageId, entry)),
|
|
9
|
+
setBatch: (entries) => gate.runShared(() => store.setBatch(entries)),
|
|
10
|
+
cleanupExpired: (nowMs) => gate.runExclusive(() => store.cleanupExpired(nowMs)),
|
|
11
|
+
clear: () => gate.runExclusive(() => store.clear()),
|
|
12
|
+
destroy: async () => {
|
|
13
|
+
await gate.close();
|
|
14
|
+
await destroyStore.destroy?.();
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { SharedExclusiveGate } from '../../infra/perf/SharedExclusiveGate.js';
|
|
2
|
+
import { StoreLock } from '../../infra/perf/StoreLock.js';
|
|
3
|
+
const WA_PREKEY_KEY = 'prekey:prekeys';
|
|
4
|
+
const WA_PREKEY_SERVER_KEY = 'prekey:serverHasPreKeys';
|
|
5
|
+
const WA_PREKEY_CLEAR_KEY = 'prekey:clear';
|
|
6
|
+
export function withPreKeyLock(store) {
|
|
7
|
+
const lock = new StoreLock();
|
|
8
|
+
const gate = new SharedExclusiveGate();
|
|
9
|
+
const destroyStore = store;
|
|
10
|
+
return {
|
|
11
|
+
putPreKey: (record) => gate.runShared(() => lock.run(WA_PREKEY_KEY, () => store.putPreKey(record))),
|
|
12
|
+
getOrGenPreKeys: (count, generator) => gate.runShared(() => lock.run(WA_PREKEY_KEY, () => store.getOrGenPreKeys(count, generator))),
|
|
13
|
+
getPreKeyById: (keyId) => gate.runShared(() => store.getPreKeyById(keyId)),
|
|
14
|
+
getPreKeysById: (keyIds) => gate.runShared(() => store.getPreKeysById(keyIds)),
|
|
15
|
+
consumePreKeyById: (keyId) => gate.runShared(() => lock.run(WA_PREKEY_KEY, () => store.consumePreKeyById(keyId))),
|
|
16
|
+
getOrGenSinglePreKey: (generator) => gate.runShared(() => lock.run(WA_PREKEY_KEY, () => store.getOrGenSinglePreKey(generator))),
|
|
17
|
+
markKeyAsUploaded: (keyId) => gate.runShared(() => lock.run(WA_PREKEY_KEY, () => store.markKeyAsUploaded(keyId))),
|
|
18
|
+
setServerHasPreKeys: (value) => gate.runShared(() => lock.run(WA_PREKEY_SERVER_KEY, () => store.setServerHasPreKeys(value))),
|
|
19
|
+
getServerHasPreKeys: () => gate.runShared(() => store.getServerHasPreKeys()),
|
|
20
|
+
clear: () => gate.runExclusive(() => lock.run(WA_PREKEY_CLEAR_KEY, () => store.clear())),
|
|
21
|
+
destroy: async () => {
|
|
22
|
+
await gate.close();
|
|
23
|
+
await lock.shutdown();
|
|
24
|
+
await destroyStore.destroy?.();
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { SharedExclusiveGate } from '../../infra/perf/SharedExclusiveGate.js';
|
|
2
|
+
export function withSessionLock(store) {
|
|
3
|
+
const gate = new SharedExclusiveGate();
|
|
4
|
+
const destroyStore = store;
|
|
5
|
+
return {
|
|
6
|
+
hasSession: (address) => gate.runShared(() => store.hasSession(address)),
|
|
7
|
+
hasSessions: (addresses) => gate.runShared(() => store.hasSessions(addresses)),
|
|
8
|
+
getSession: (address) => gate.runShared(() => store.getSession(address)),
|
|
9
|
+
getSessionsBatch: (addresses) => gate.runShared(() => store.getSessionsBatch(addresses)),
|
|
10
|
+
setSession: (address, session) => gate.runShared(() => store.setSession(address, session)),
|
|
11
|
+
setSessionsBatch: (entries) => gate.runShared(() => store.setSessionsBatch(entries)),
|
|
12
|
+
deleteSession: (address) => gate.runShared(() => store.deleteSession(address)),
|
|
13
|
+
clear: () => gate.runExclusive(() => store.clear()),
|
|
14
|
+
destroy: async () => {
|
|
15
|
+
await gate.close();
|
|
16
|
+
await destroyStore.destroy?.();
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
}
|
|
@@ -2,8 +2,6 @@ import { SharedExclusiveGate } from '../../infra/perf/SharedExclusiveGate.js';
|
|
|
2
2
|
import { StoreLock } from '../../infra/perf/StoreLock.js';
|
|
3
3
|
const WA_SIGNAL_REGISTRATION_KEY = 'signal:registration';
|
|
4
4
|
const WA_SIGNAL_SIGNED_PREKEY_KEY = 'signal:signedPreKey';
|
|
5
|
-
const WA_SIGNAL_PREKEYS_KEY = 'signal:prekeys';
|
|
6
|
-
const WA_SIGNAL_SERVER_HAS_PREKEYS_KEY = 'signal:serverHasPreKeys';
|
|
7
5
|
const WA_SIGNAL_CLEAR_KEY = 'signal:clear';
|
|
8
6
|
export function withSignalLock(store) {
|
|
9
7
|
const lock = new StoreLock();
|
|
@@ -28,28 +26,6 @@ export function withSignalLock(store) {
|
|
|
28
26
|
getSignedPreKeyById: (keyId) => gate.runShared(() => store.getSignedPreKeyById(keyId)),
|
|
29
27
|
setSignedPreKeyRotationTs: (value) => gate.runShared(() => lock.run(WA_SIGNAL_SIGNED_PREKEY_KEY, () => store.setSignedPreKeyRotationTs(value))),
|
|
30
28
|
getSignedPreKeyRotationTs: () => gate.runShared(() => store.getSignedPreKeyRotationTs()),
|
|
31
|
-
putPreKey: (record) => gate.runShared(() => lock.run(WA_SIGNAL_PREKEYS_KEY, () => store.putPreKey(record))),
|
|
32
|
-
getOrGenPreKeys: (count, generator) => gate.runShared(() => lock.run(WA_SIGNAL_PREKEYS_KEY, () => store.getOrGenPreKeys(count, generator))),
|
|
33
|
-
getPreKeyById: (keyId) => gate.runShared(() => store.getPreKeyById(keyId)),
|
|
34
|
-
getPreKeysById: (keyIds) => gate.runShared(() => store.getPreKeysById(keyIds)),
|
|
35
|
-
consumePreKeyById: (keyId) => gate.runShared(() => lock.run(WA_SIGNAL_PREKEYS_KEY, () => store.consumePreKeyById(keyId))),
|
|
36
|
-
getOrGenSinglePreKey: (generator) => gate.runShared(() => lock.run(WA_SIGNAL_PREKEYS_KEY, () => store.getOrGenSinglePreKey(generator))),
|
|
37
|
-
markKeyAsUploaded: (keyId) => gate.runShared(() => lock.run(WA_SIGNAL_PREKEYS_KEY, () => store.markKeyAsUploaded(keyId))),
|
|
38
|
-
setServerHasPreKeys: (value) => gate.runShared(() => lock.run(WA_SIGNAL_SERVER_HAS_PREKEYS_KEY, () => store.setServerHasPreKeys(value))),
|
|
39
|
-
getServerHasPreKeys: () => gate.runShared(() => store.getServerHasPreKeys()),
|
|
40
|
-
getSignalMeta: () => gate.runShared(() => store.getSignalMeta()),
|
|
41
|
-
hasSession: (address) => gate.runShared(() => store.hasSession(address)),
|
|
42
|
-
hasSessions: (addresses) => gate.runShared(() => store.hasSessions(addresses)),
|
|
43
|
-
getSession: (address) => gate.runShared(() => store.getSession(address)),
|
|
44
|
-
getSessionsBatch: (addresses) => gate.runShared(() => store.getSessionsBatch(addresses)),
|
|
45
|
-
// Session and identity read-modify-write semantics are serialized in SignalProtocol per address.
|
|
46
|
-
setSession: (address, session) => gate.runShared(() => store.setSession(address, session)),
|
|
47
|
-
setSessionsBatch: (entries) => gate.runShared(() => store.setSessionsBatch(entries)),
|
|
48
|
-
deleteSession: (address) => gate.runShared(() => store.deleteSession(address)),
|
|
49
|
-
getRemoteIdentity: (address) => gate.runShared(() => store.getRemoteIdentity(address)),
|
|
50
|
-
getRemoteIdentities: (addresses) => gate.runShared(() => store.getRemoteIdentities(addresses)),
|
|
51
|
-
setRemoteIdentity: (address, identityKey) => gate.runShared(() => store.setRemoteIdentity(address, identityKey)),
|
|
52
|
-
setRemoteIdentities: (entries) => gate.runShared(() => store.setRemoteIdentities(entries)),
|
|
53
29
|
clear: () => gate.runExclusive(() => lock.run(WA_SIGNAL_CLEAR_KEY, async () => {
|
|
54
30
|
await store.clear();
|
|
55
31
|
cachedRegInfo = undefined;
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
const EMPTY_STORE_LIST = Object.freeze([]);
|
|
2
|
+
export const NOOP_MESSAGE_SECRET_STORE = Object.freeze({
|
|
3
|
+
get: async (_messageId) => null,
|
|
4
|
+
getBatch: async (messageIds) => new Array(messageIds.length).fill(null),
|
|
5
|
+
set: async (_messageId, _entry) => { },
|
|
6
|
+
setBatch: async (_entries) => { },
|
|
7
|
+
cleanupExpired: async (_nowMs) => 0,
|
|
8
|
+
clear: async () => { }
|
|
9
|
+
});
|
|
2
10
|
export const NOOP_MESSAGE_STORE = Object.freeze({
|
|
3
11
|
upsert: async (_record) => { },
|
|
4
12
|
upsertBatch: async (_records) => { },
|
|
@@ -22,6 +30,18 @@ export const NOOP_CONTACT_STORE = Object.freeze({
|
|
|
22
30
|
deleteByJid: async (_jid) => 0,
|
|
23
31
|
clear: async () => { }
|
|
24
32
|
});
|
|
33
|
+
export const NOOP_RETRY_STORE = Object.freeze({
|
|
34
|
+
getOutboundRequesterStatus: async () => null,
|
|
35
|
+
upsertOutboundMessage: async (_record) => { },
|
|
36
|
+
deleteOutboundMessage: async (_messageId) => 0,
|
|
37
|
+
getOutboundMessage: async (_messageId) => null,
|
|
38
|
+
updateOutboundMessageState: async () => { },
|
|
39
|
+
markOutboundRequesterDelivered: async () => { },
|
|
40
|
+
incrementInboundCounter: async () => 0,
|
|
41
|
+
cleanupExpired: async (_nowMs) => 0,
|
|
42
|
+
clear: async () => { },
|
|
43
|
+
destroy: async () => { }
|
|
44
|
+
});
|
|
25
45
|
export const NOOP_PARTICIPANTS_STORE = Object.freeze({
|
|
26
46
|
upsertGroupParticipants: async (_snapshot) => { },
|
|
27
47
|
getGroupParticipants: async (_groupJid, _nowMs) => null,
|
|
@@ -6,6 +6,9 @@ const DEFAULTS = Object.freeze({
|
|
|
6
6
|
});
|
|
7
7
|
export class WaDeviceListMemoryStore {
|
|
8
8
|
constructor(ttlMs = DEFAULTS.ttlMs, options = {}) {
|
|
9
|
+
if (!Number.isFinite(ttlMs) || ttlMs <= 0) {
|
|
10
|
+
throw new Error('device-list ttlMs must be a positive finite number');
|
|
11
|
+
}
|
|
9
12
|
this.records = new Map();
|
|
10
13
|
this.ttlMs = ttlMs;
|
|
11
14
|
this.maxUsers = resolvePositive(options.maxUsers, DEFAULTS.maxUsers, 'WaDeviceListMemoryStoreOptions.maxUsers');
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { signalAddressKey } from '../../../protocol/jid.js';
|
|
2
|
+
import { resolvePositive } from '../../../util/coercion.js';
|
|
3
|
+
import { setBoundedMapEntry } from '../../../util/collections.js';
|
|
4
|
+
const DEFAULT_MAX_REMOTE_IDENTITIES = 8192;
|
|
5
|
+
export class WaIdentityMemoryStore {
|
|
6
|
+
constructor(options = {}) {
|
|
7
|
+
this.remoteIdentities = new Map();
|
|
8
|
+
this.maxRemoteIdentities = resolvePositive(options.maxRemoteIdentities, DEFAULT_MAX_REMOTE_IDENTITIES, 'WaIdentityMemoryStoreOptions.maxRemoteIdentities');
|
|
9
|
+
}
|
|
10
|
+
async getRemoteIdentity(address) {
|
|
11
|
+
return this.remoteIdentities.get(signalAddressKey(address)) ?? null;
|
|
12
|
+
}
|
|
13
|
+
async getRemoteIdentities(addresses) {
|
|
14
|
+
const result = new Array(addresses.length);
|
|
15
|
+
for (let i = 0; i < addresses.length; i += 1) {
|
|
16
|
+
result[i] = this.remoteIdentities.get(signalAddressKey(addresses[i])) ?? null;
|
|
17
|
+
}
|
|
18
|
+
return result;
|
|
19
|
+
}
|
|
20
|
+
async setRemoteIdentity(address, identityKey) {
|
|
21
|
+
setBoundedMapEntry(this.remoteIdentities, signalAddressKey(address), identityKey, this.maxRemoteIdentities);
|
|
22
|
+
}
|
|
23
|
+
async setRemoteIdentities(entries) {
|
|
24
|
+
for (const entry of entries) {
|
|
25
|
+
setBoundedMapEntry(this.remoteIdentities, signalAddressKey(entry.address), entry.identityKey, this.maxRemoteIdentities);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async clear() {
|
|
29
|
+
this.remoteIdentities.clear();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { resolvePositive } from '../../../util/coercion.js';
|
|
2
|
+
import { resolveCleanupIntervalMs, setBoundedMapEntry } from '../../../util/collections.js';
|
|
3
|
+
const DEFAULTS = Object.freeze({
|
|
4
|
+
ttlMs: 30 * 60 * 1000,
|
|
5
|
+
maxSecrets: 10000
|
|
6
|
+
});
|
|
7
|
+
export class WaMessageSecretMemoryStore {
|
|
8
|
+
constructor(ttlMs = DEFAULTS.ttlMs, options = {}) {
|
|
9
|
+
if (!Number.isFinite(ttlMs) || ttlMs <= 0) {
|
|
10
|
+
throw new Error('message-secret ttlMs must be a positive finite number');
|
|
11
|
+
}
|
|
12
|
+
this.secrets = new Map();
|
|
13
|
+
this.ttlMs = ttlMs;
|
|
14
|
+
this.maxSecrets = resolvePositive(options.maxSecrets, DEFAULTS.maxSecrets, 'WaMessageSecretMemoryStoreOptions.maxSecrets');
|
|
15
|
+
this.cleanupTimer = setInterval(() => {
|
|
16
|
+
void this.cleanupExpired(Date.now());
|
|
17
|
+
}, resolveCleanupIntervalMs(ttlMs));
|
|
18
|
+
this.cleanupTimer.unref();
|
|
19
|
+
}
|
|
20
|
+
async get(messageId, nowMs = Date.now()) {
|
|
21
|
+
const cached = this.secrets.get(messageId);
|
|
22
|
+
if (!cached)
|
|
23
|
+
return null;
|
|
24
|
+
if (cached.expiresAtMs <= nowMs) {
|
|
25
|
+
this.secrets.delete(messageId);
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
return { secret: cached.secret, senderJid: cached.senderJid };
|
|
29
|
+
}
|
|
30
|
+
async getBatch(messageIds, nowMs = Date.now()) {
|
|
31
|
+
const result = new Array(messageIds.length);
|
|
32
|
+
for (let i = 0; i < messageIds.length; i += 1) {
|
|
33
|
+
const cached = this.secrets.get(messageIds[i]);
|
|
34
|
+
if (!cached) {
|
|
35
|
+
result[i] = null;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (cached.expiresAtMs <= nowMs) {
|
|
39
|
+
this.secrets.delete(messageIds[i]);
|
|
40
|
+
result[i] = null;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
result[i] = { secret: cached.secret, senderJid: cached.senderJid };
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
async set(messageId, entry) {
|
|
48
|
+
setBoundedMapEntry(this.secrets, messageId, {
|
|
49
|
+
secret: entry.secret,
|
|
50
|
+
senderJid: entry.senderJid,
|
|
51
|
+
expiresAtMs: Date.now() + this.ttlMs
|
|
52
|
+
}, this.maxSecrets);
|
|
53
|
+
}
|
|
54
|
+
async setBatch(entries) {
|
|
55
|
+
const nowMs = Date.now();
|
|
56
|
+
for (let i = 0; i < entries.length; i += 1) {
|
|
57
|
+
setBoundedMapEntry(this.secrets, entries[i].messageId, {
|
|
58
|
+
secret: entries[i].entry.secret,
|
|
59
|
+
senderJid: entries[i].entry.senderJid,
|
|
60
|
+
expiresAtMs: nowMs + this.ttlMs
|
|
61
|
+
}, this.maxSecrets);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async cleanupExpired(nowMs) {
|
|
65
|
+
let removed = 0;
|
|
66
|
+
for (const [messageId, entry] of this.secrets) {
|
|
67
|
+
if (entry.expiresAtMs > nowMs)
|
|
68
|
+
continue;
|
|
69
|
+
this.secrets.delete(messageId);
|
|
70
|
+
removed += 1;
|
|
71
|
+
}
|
|
72
|
+
return removed;
|
|
73
|
+
}
|
|
74
|
+
async clear() {
|
|
75
|
+
this.secrets.clear();
|
|
76
|
+
}
|
|
77
|
+
async destroy() {
|
|
78
|
+
clearInterval(this.cleanupTimer);
|
|
79
|
+
this.secrets.clear();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -6,6 +6,9 @@ const DEFAULTS = Object.freeze({
|
|
|
6
6
|
});
|
|
7
7
|
export class WaParticipantsMemoryStore {
|
|
8
8
|
constructor(ttlMs = DEFAULTS.ttlMs, options = {}) {
|
|
9
|
+
if (!Number.isFinite(ttlMs) || ttlMs <= 0) {
|
|
10
|
+
throw new Error('participants ttlMs must be a positive finite number');
|
|
11
|
+
}
|
|
9
12
|
this.records = new Map();
|
|
10
13
|
this.ttlMs = ttlMs;
|
|
11
14
|
this.maxGroups = resolvePositive(options.maxGroups, DEFAULTS.maxGroups, 'WaParticipantsMemoryStoreOptions.maxGroups');
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { resolvePositive } from '../../../util/coercion.js';
|
|
2
|
+
import { setBoundedMapEntry } from '../../../util/collections.js';
|
|
3
|
+
const DEFAULT_MAX_PRE_KEYS = 4096;
|
|
4
|
+
export class WaPreKeyMemoryStore {
|
|
5
|
+
constructor(options = {}) {
|
|
6
|
+
this.preKeys = new Map();
|
|
7
|
+
this.uploadedPreKeys = new Set();
|
|
8
|
+
this.serverHasPreKeys = false;
|
|
9
|
+
this.nextPreKeyId = 1;
|
|
10
|
+
this.maxPreKeys = resolvePositive(options.maxPreKeys, DEFAULT_MAX_PRE_KEYS, 'WaPreKeyMemoryStoreOptions.maxPreKeys');
|
|
11
|
+
}
|
|
12
|
+
async putPreKey(record) {
|
|
13
|
+
setBoundedMapEntry(this.preKeys, record.keyId, record, this.maxPreKeys, (keyId) => {
|
|
14
|
+
this.uploadedPreKeys.delete(keyId);
|
|
15
|
+
});
|
|
16
|
+
if (record.keyId >= this.nextPreKeyId) {
|
|
17
|
+
this.nextPreKeyId = record.keyId + 1;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async getOrGenPreKeys(count, generator) {
|
|
21
|
+
if (!Number.isSafeInteger(count) || count <= 0) {
|
|
22
|
+
throw new Error(`invalid prekey count: ${count}`);
|
|
23
|
+
}
|
|
24
|
+
const available = [];
|
|
25
|
+
const availableKeyIds = [];
|
|
26
|
+
for (const keyId of this.preKeys.keys()) {
|
|
27
|
+
if (!this.uploadedPreKeys.has(keyId)) {
|
|
28
|
+
availableKeyIds.push(keyId);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
availableKeyIds.sort((left, right) => left - right);
|
|
32
|
+
for (let index = 0; index < availableKeyIds.length; index += 1) {
|
|
33
|
+
const keyId = availableKeyIds[index];
|
|
34
|
+
const record = this.preKeys.get(keyId);
|
|
35
|
+
if (!record) {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
available.push(record);
|
|
39
|
+
if (available.length >= count) {
|
|
40
|
+
return available;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
while (available.length < count) {
|
|
44
|
+
const record = await generator(this.nextPreKeyId++);
|
|
45
|
+
setBoundedMapEntry(this.preKeys, record.keyId, record, this.maxPreKeys, (keyId) => {
|
|
46
|
+
this.uploadedPreKeys.delete(keyId);
|
|
47
|
+
});
|
|
48
|
+
available.push(record);
|
|
49
|
+
}
|
|
50
|
+
return available;
|
|
51
|
+
}
|
|
52
|
+
async getPreKeyById(keyId) {
|
|
53
|
+
return this.preKeys.get(keyId) ?? null;
|
|
54
|
+
}
|
|
55
|
+
async getPreKeysById(keyIds) {
|
|
56
|
+
const result = new Array(keyIds.length);
|
|
57
|
+
for (let i = 0; i < keyIds.length; i += 1) {
|
|
58
|
+
result[i] = this.preKeys.get(keyIds[i]) ?? null;
|
|
59
|
+
}
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
async consumePreKeyById(keyId) {
|
|
63
|
+
const record = this.preKeys.get(keyId) ?? null;
|
|
64
|
+
if (!record) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
this.preKeys.delete(keyId);
|
|
68
|
+
this.uploadedPreKeys.delete(keyId);
|
|
69
|
+
return record;
|
|
70
|
+
}
|
|
71
|
+
async getOrGenSinglePreKey(generator) {
|
|
72
|
+
const preKeys = await this.getOrGenPreKeys(1, generator);
|
|
73
|
+
return preKeys[0];
|
|
74
|
+
}
|
|
75
|
+
async markKeyAsUploaded(keyId) {
|
|
76
|
+
if (keyId < 0 || keyId >= this.nextPreKeyId) {
|
|
77
|
+
throw new Error(`prekey ${keyId} is out of boundary`);
|
|
78
|
+
}
|
|
79
|
+
for (const candidate of this.preKeys.keys()) {
|
|
80
|
+
if (candidate <= keyId) {
|
|
81
|
+
this.uploadedPreKeys.add(candidate);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async setServerHasPreKeys(value) {
|
|
86
|
+
this.serverHasPreKeys = value;
|
|
87
|
+
}
|
|
88
|
+
async getServerHasPreKeys() {
|
|
89
|
+
return this.serverHasPreKeys;
|
|
90
|
+
}
|
|
91
|
+
async clear() {
|
|
92
|
+
this.preKeys.clear();
|
|
93
|
+
this.uploadedPreKeys.clear();
|
|
94
|
+
this.serverHasPreKeys = false;
|
|
95
|
+
this.nextPreKeyId = 1;
|
|
96
|
+
}
|
|
97
|
+
}
|