zapo-js 0.1.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 +235 -0
- package/dist/appstate/WaAppStateCrypto.js +202 -0
- package/dist/appstate/WaAppStateSyncClient.js +808 -0
- package/dist/appstate/WaAppStateSyncResponseParser.js +71 -0
- package/dist/appstate/constants.js +23 -0
- package/dist/appstate/index.js +28 -0
- package/dist/appstate/store/sqlite.js +55 -0
- package/dist/appstate/types.js +2 -0
- package/dist/appstate/utils.js +84 -0
- package/dist/auth/WaAuthClient.js +266 -0
- package/dist/auth/flow/WaAuthCredentialsFlow.js +123 -0
- package/dist/auth/index.js +27 -0
- package/dist/auth/pairing/WaPairingCodeCrypto.js +75 -0
- package/dist/auth/pairing/WaPairingFlow.js +328 -0
- package/dist/auth/pairing/WaQrFlow.js +86 -0
- package/dist/auth/pairing/constants.js +5 -0
- package/dist/auth/types.js +2 -0
- package/dist/client/WaClient.js +749 -0
- package/dist/client/WaClientFactory.js +381 -0
- package/dist/client/coordinators/WaGroupCoordinator.js +191 -0
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +315 -0
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +1061 -0
- package/dist/client/coordinators/WaPassiveTasksCoordinator.js +200 -0
- package/dist/client/coordinators/WaRetryCoordinator.js +494 -0
- package/dist/client/coordinators/WaStreamControlCoordinator.js +123 -0
- package/dist/client/dirty.js +254 -0
- package/dist/client/events/chat.js +226 -0
- package/dist/client/events/group.js +410 -0
- package/dist/client/history-sync.js +122 -0
- package/dist/client/incoming.js +236 -0
- package/dist/client/index.js +5 -0
- package/dist/client/mailbox.js +49 -0
- package/dist/client/messages.js +152 -0
- package/dist/client/types.js +2 -0
- package/dist/crypto/core/constants.js +4 -0
- package/dist/crypto/core/encoding.js +29 -0
- package/dist/crypto/core/hkdf.js +26 -0
- package/dist/crypto/core/index.js +43 -0
- package/dist/crypto/core/keys.js +73 -0
- package/dist/crypto/core/nonce.js +18 -0
- package/dist/crypto/core/primitives.js +121 -0
- package/dist/crypto/core/random.js +32 -0
- package/dist/crypto/curves/Ed25519.js +42 -0
- package/dist/crypto/curves/X25519.js +64 -0
- package/dist/crypto/curves/constants.js +6 -0
- package/dist/crypto/curves/types.js +9 -0
- package/dist/crypto/index.js +22 -0
- package/dist/crypto/math/constants.js +44 -0
- package/dist/crypto/math/edwards.js +64 -0
- package/dist/crypto/math/le.js +20 -0
- package/dist/crypto/math/mod.js +38 -0
- package/dist/crypto/math/types.js +2 -0
- package/dist/esm/appstate/WaAppStateCrypto.js +198 -0
- package/dist/esm/appstate/WaAppStateSyncClient.js +803 -0
- package/dist/esm/appstate/WaAppStateSyncResponseParser.js +67 -0
- package/dist/esm/appstate/constants.js +20 -0
- package/dist/esm/appstate/index.js +6 -0
- package/dist/esm/appstate/store/sqlite.js +49 -0
- package/dist/esm/appstate/types.js +1 -0
- package/dist/esm/appstate/utils.js +75 -0
- package/dist/esm/auth/WaAuthClient.js +262 -0
- package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +118 -0
- package/dist/esm/auth/index.js +5 -0
- package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +71 -0
- package/dist/esm/auth/pairing/WaPairingFlow.js +324 -0
- package/dist/esm/auth/pairing/WaQrFlow.js +82 -0
- package/dist/esm/auth/pairing/constants.js +2 -0
- package/dist/esm/auth/types.js +1 -0
- package/dist/esm/client/WaClient.js +745 -0
- package/dist/esm/client/WaClientFactory.js +377 -0
- package/dist/esm/client/coordinators/WaGroupCoordinator.js +188 -0
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +311 -0
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +1057 -0
- package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +196 -0
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +490 -0
- package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +120 -0
- package/dist/esm/client/dirty.js +250 -0
- package/dist/esm/client/events/chat.js +223 -0
- package/dist/esm/client/events/group.js +407 -0
- package/dist/esm/client/history-sync.js +119 -0
- package/dist/esm/client/incoming.js +227 -0
- package/dist/esm/client/index.js +1 -0
- package/dist/esm/client/mailbox.js +46 -0
- package/dist/esm/client/messages.js +148 -0
- package/dist/esm/client/types.js +1 -0
- package/dist/esm/crypto/core/constants.js +1 -0
- package/dist/esm/crypto/core/encoding.js +25 -0
- package/dist/esm/crypto/core/hkdf.js +22 -0
- package/dist/esm/crypto/core/index.js +11 -0
- package/dist/esm/crypto/core/keys.js +66 -0
- package/dist/esm/crypto/core/nonce.js +15 -0
- package/dist/esm/crypto/core/primitives.js +102 -0
- package/dist/esm/crypto/core/random.js +28 -0
- package/dist/esm/crypto/curves/Ed25519.js +38 -0
- package/dist/esm/crypto/curves/X25519.js +58 -0
- package/dist/esm/crypto/curves/constants.js +3 -0
- package/dist/esm/crypto/curves/types.js +6 -0
- package/dist/esm/crypto/index.js +3 -0
- package/dist/esm/crypto/math/constants.js +41 -0
- package/dist/esm/crypto/math/edwards.js +60 -0
- package/dist/esm/crypto/math/le.js +16 -0
- package/dist/esm/crypto/math/mod.js +31 -0
- package/dist/esm/crypto/math/types.js +1 -0
- package/dist/esm/index.js +6 -0
- package/dist/esm/infra/log/ConsoleLogger.js +40 -0
- package/dist/esm/infra/log/PinoLogger.js +73 -0
- package/dist/esm/infra/log/types.js +1 -0
- package/dist/esm/infra/perf/BoundedTaskQueue.js +62 -0
- package/dist/esm/media/WaMediaCrypto.js +224 -0
- package/dist/esm/media/WaMediaTransferClient.js +361 -0
- package/dist/esm/media/conn.js +33 -0
- package/dist/esm/media/constants.js +18 -0
- package/dist/esm/media/index.js +3 -0
- package/dist/esm/media/types.js +1 -0
- package/dist/esm/message/WaMessageClient.js +210 -0
- package/dist/esm/message/ack.js +46 -0
- package/dist/esm/message/content.js +20 -0
- package/dist/esm/message/device-sent.js +49 -0
- package/dist/esm/message/incoming.js +318 -0
- package/dist/esm/message/index.js +2 -0
- package/dist/esm/message/padding.js +20 -0
- package/dist/esm/message/phash.js +25 -0
- package/dist/esm/message/types.js +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/proto.js +3 -0
- package/dist/esm/protocol/appstate.js +34 -0
- package/dist/esm/protocol/auth.js +12 -0
- package/dist/esm/protocol/browser.js +41 -0
- package/dist/esm/protocol/constants.js +11 -0
- package/dist/esm/protocol/defaults.js +27 -0
- package/dist/esm/protocol/dirty.js +26 -0
- package/dist/esm/protocol/group.js +5 -0
- package/dist/esm/protocol/index.js +11 -0
- package/dist/esm/protocol/jid.js +94 -0
- package/dist/esm/protocol/media.js +20 -0
- package/dist/esm/protocol/message.js +16 -0
- package/dist/esm/protocol/nodes.js +83 -0
- package/dist/esm/protocol/notification.js +50 -0
- package/dist/esm/protocol/stream.js +60 -0
- package/dist/esm/retry/constants.js +20 -0
- package/dist/esm/retry/index.js +5 -0
- package/dist/esm/retry/outbound.js +83 -0
- package/dist/esm/retry/parse.js +130 -0
- package/dist/esm/retry/reason.js +50 -0
- package/dist/esm/retry/replay.js +177 -0
- package/dist/esm/retry/types.js +1 -0
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +185 -0
- package/dist/esm/signal/api/SignalDigestSyncApi.js +179 -0
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +111 -0
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +141 -0
- package/dist/esm/signal/api/SignalRotateKeyApi.js +59 -0
- package/dist/esm/signal/api/SignalSessionSyncApi.js +187 -0
- package/dist/esm/signal/api/codec.js +23 -0
- package/dist/esm/signal/api/constants.js +9 -0
- package/dist/esm/signal/api/prekeys.js +9 -0
- package/dist/esm/signal/constants.js +16 -0
- package/dist/esm/signal/crypto/WaAdvSignature.js +60 -0
- package/dist/esm/signal/crypto/constants.js +8 -0
- package/dist/esm/signal/group/SenderKeyChain.js +97 -0
- package/dist/esm/signal/group/SenderKeyCodec.js +46 -0
- package/dist/esm/signal/group/SenderKeyManager.js +176 -0
- package/dist/esm/signal/index.js +11 -0
- package/dist/esm/signal/registration/keygen.js +31 -0
- package/dist/esm/signal/registration/utils.js +16 -0
- package/dist/esm/signal/session/SignalProtocol.js +122 -0
- package/dist/esm/signal/session/SignalRatchet.js +260 -0
- package/dist/esm/signal/session/SignalSerializer.js +63 -0
- package/dist/esm/signal/session/SignalSession.js +153 -0
- package/dist/esm/signal/store/sqlite.js +310 -0
- package/dist/esm/signal/types.js +1 -0
- package/dist/esm/store/contracts/appstate.store.js +1 -0
- package/dist/esm/store/contracts/auth.store.js +1 -0
- package/dist/esm/store/contracts/contact.store.js +1 -0
- package/dist/esm/store/contracts/device-list.store.js +1 -0
- package/dist/esm/store/contracts/message.store.js +1 -0
- package/dist/esm/store/contracts/participants.store.js +1 -0
- package/dist/esm/store/contracts/retry.store.js +1 -0
- package/dist/esm/store/contracts/sender-key.store.js +1 -0
- package/dist/esm/store/contracts/signal.store.js +1 -0
- package/dist/esm/store/contracts/thread.store.js +1 -0
- package/dist/esm/store/createStore.js +278 -0
- package/dist/esm/store/index.js +20 -0
- package/dist/esm/store/noop.store.js +43 -0
- package/dist/esm/store/providers/memory/appstate.store.js +101 -0
- package/dist/esm/store/providers/memory/contact.store.js +23 -0
- package/dist/esm/store/providers/memory/device-list.store.js +86 -0
- package/dist/esm/store/providers/memory/message.store.js +40 -0
- package/dist/esm/store/providers/memory/participants.store.js +61 -0
- package/dist/esm/store/providers/memory/retry.store.js +71 -0
- package/dist/esm/store/providers/memory/sender-key.store.js +88 -0
- package/dist/esm/store/providers/memory/signal.store.js +170 -0
- package/dist/esm/store/providers/memory/thread.store.js +34 -0
- package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +37 -0
- package/dist/esm/store/providers/sqlite/appstate.store.js +169 -0
- package/dist/esm/store/providers/sqlite/auth.store.js +176 -0
- package/dist/esm/store/providers/sqlite/connection.js +240 -0
- package/dist/esm/store/providers/sqlite/contact.store.js +61 -0
- package/dist/esm/store/providers/sqlite/device-list.store.js +155 -0
- package/dist/esm/store/providers/sqlite/message.store.js +119 -0
- package/dist/esm/store/providers/sqlite/migrations.js +347 -0
- package/dist/esm/store/providers/sqlite/participants.store.js +85 -0
- package/dist/esm/store/providers/sqlite/retry.store.js +144 -0
- package/dist/esm/store/providers/sqlite/sender-key.store.js +203 -0
- package/dist/esm/store/providers/sqlite/signal.store.js +353 -0
- package/dist/esm/store/providers/sqlite/thread.store.js +72 -0
- package/dist/esm/store/types.js +1 -0
- package/dist/esm/transport/WaComms.js +527 -0
- package/dist/esm/transport/WaWebSocket.js +361 -0
- package/dist/esm/transport/binary/constants.js +96 -0
- package/dist/esm/transport/binary/decoder.js +275 -0
- package/dist/esm/transport/binary/encoder.js +210 -0
- package/dist/esm/transport/binary/index.js +4 -0
- package/dist/esm/transport/binary/tokens.js +1280 -0
- package/dist/esm/transport/index.js +6 -0
- package/dist/esm/transport/keepalive/WaKeepAlive.js +141 -0
- package/dist/esm/transport/node/WaNodeOrchestrator.js +143 -0
- package/dist/esm/transport/node/WaNodeTransport.js +64 -0
- package/dist/esm/transport/node/builders/accountSync.js +101 -0
- package/dist/esm/transport/node/builders/group.js +47 -0
- package/dist/esm/transport/node/builders/index.js +7 -0
- package/dist/esm/transport/node/builders/media.js +10 -0
- package/dist/esm/transport/node/builders/message.js +317 -0
- package/dist/esm/transport/node/builders/pairing.js +130 -0
- package/dist/esm/transport/node/builders/prekeys.js +102 -0
- package/dist/esm/transport/node/builders/retry.js +116 -0
- package/dist/esm/transport/node/helpers.js +37 -0
- package/dist/esm/transport/node/query.js +53 -0
- package/dist/esm/transport/node/xml.js +39 -0
- package/dist/esm/transport/noise/WaClientPayload.js +162 -0
- package/dist/esm/transport/noise/WaFrameCodec.js +121 -0
- package/dist/esm/transport/noise/WaNoiseCert.js +74 -0
- package/dist/esm/transport/noise/WaNoiseHandshake.js +57 -0
- package/dist/esm/transport/noise/WaNoiseSession.js +322 -0
- package/dist/esm/transport/noise/WaNoiseSocket.js +17 -0
- package/dist/esm/transport/noise/constants.js +8 -0
- package/dist/esm/transport/noise/types.js +1 -0
- package/dist/esm/transport/stream/parse.js +91 -0
- package/dist/esm/transport/types.js +1 -0
- package/dist/esm/util/async.js +5 -0
- package/dist/esm/util/base64.js +18 -0
- package/dist/esm/util/bytes.js +275 -0
- package/dist/esm/util/coercion.js +56 -0
- package/dist/esm/util/collections.js +27 -0
- package/dist/esm/util/primitives.js +32 -0
- package/dist/esm/util/runtime.js +15 -0
- package/dist/esm/util/signal-address.js +5 -0
- package/dist/index.js +52 -0
- package/dist/infra/log/ConsoleLogger.js +44 -0
- package/dist/infra/log/PinoLogger.js +111 -0
- package/dist/infra/log/types.js +2 -0
- package/dist/infra/perf/BoundedTaskQueue.js +67 -0
- package/dist/media/WaMediaCrypto.js +228 -0
- package/dist/media/WaMediaTransferClient.js +365 -0
- package/dist/media/conn.js +36 -0
- package/dist/media/constants.js +21 -0
- package/dist/media/index.js +9 -0
- package/dist/media/types.js +2 -0
- package/dist/message/WaMessageClient.js +214 -0
- package/dist/message/ack.js +52 -0
- package/dist/message/content.js +24 -0
- package/dist/message/device-sent.js +53 -0
- package/dist/message/incoming.js +321 -0
- package/dist/message/index.js +20 -0
- package/dist/message/padding.js +24 -0
- package/dist/message/phash.js +28 -0
- package/dist/message/types.js +2 -0
- package/dist/proto.js +5 -0
- package/dist/protocol/appstate.js +37 -0
- package/dist/protocol/auth.js +15 -0
- package/dist/protocol/browser.js +45 -0
- package/dist/protocol/constants.js +46 -0
- package/dist/protocol/defaults.js +30 -0
- package/dist/protocol/dirty.js +29 -0
- package/dist/protocol/group.js +8 -0
- package/dist/protocol/index.js +53 -0
- package/dist/protocol/jid.js +107 -0
- package/dist/protocol/media.js +24 -0
- package/dist/protocol/message.js +19 -0
- package/dist/protocol/nodes.js +86 -0
- package/dist/protocol/notification.js +53 -0
- package/dist/protocol/stream.js +63 -0
- package/dist/retry/constants.js +23 -0
- package/dist/retry/index.js +19 -0
- package/dist/retry/outbound.js +88 -0
- package/dist/retry/parse.js +133 -0
- package/dist/retry/reason.js +53 -0
- package/dist/retry/replay.js +181 -0
- package/dist/retry/types.js +2 -0
- package/dist/signal/api/SignalDeviceSyncApi.js +189 -0
- package/dist/signal/api/SignalDigestSyncApi.js +183 -0
- package/dist/signal/api/SignalIdentitySyncApi.js +115 -0
- package/dist/signal/api/SignalMissingPreKeysSyncApi.js +145 -0
- package/dist/signal/api/SignalRotateKeyApi.js +63 -0
- package/dist/signal/api/SignalSessionSyncApi.js +191 -0
- package/dist/signal/api/codec.js +27 -0
- package/dist/signal/api/constants.js +12 -0
- package/dist/signal/api/prekeys.js +16 -0
- package/dist/signal/constants.js +19 -0
- package/dist/signal/crypto/WaAdvSignature.js +72 -0
- package/dist/signal/crypto/constants.js +11 -0
- package/dist/signal/group/SenderKeyChain.js +101 -0
- package/dist/signal/group/SenderKeyCodec.js +50 -0
- package/dist/signal/group/SenderKeyManager.js +180 -0
- package/dist/signal/index.js +29 -0
- package/dist/signal/registration/keygen.js +37 -0
- package/dist/signal/registration/utils.js +19 -0
- package/dist/signal/session/SignalProtocol.js +126 -0
- package/dist/signal/session/SignalRatchet.js +268 -0
- package/dist/signal/session/SignalSerializer.js +69 -0
- package/dist/signal/session/SignalSession.js +165 -0
- package/dist/signal/store/sqlite.js +324 -0
- package/dist/signal/types.js +2 -0
- package/dist/store/contracts/appstate.store.js +2 -0
- package/dist/store/contracts/auth.store.js +2 -0
- package/dist/store/contracts/contact.store.js +2 -0
- package/dist/store/contracts/device-list.store.js +2 -0
- package/dist/store/contracts/message.store.js +2 -0
- package/dist/store/contracts/participants.store.js +2 -0
- package/dist/store/contracts/retry.store.js +2 -0
- package/dist/store/contracts/sender-key.store.js +2 -0
- package/dist/store/contracts/signal.store.js +2 -0
- package/dist/store/contracts/thread.store.js +2 -0
- package/dist/store/createStore.js +281 -0
- package/dist/store/index.js +43 -0
- package/dist/store/noop.store.js +46 -0
- package/dist/store/providers/memory/appstate.store.js +105 -0
- package/dist/store/providers/memory/contact.store.js +27 -0
- package/dist/store/providers/memory/device-list.store.js +90 -0
- package/dist/store/providers/memory/message.store.js +44 -0
- package/dist/store/providers/memory/participants.store.js +65 -0
- package/dist/store/providers/memory/retry.store.js +75 -0
- package/dist/store/providers/memory/sender-key.store.js +92 -0
- package/dist/store/providers/memory/signal.store.js +174 -0
- package/dist/store/providers/memory/thread.store.js +38 -0
- package/dist/store/providers/sqlite/BaseSqliteStore.js +41 -0
- package/dist/store/providers/sqlite/appstate.store.js +173 -0
- package/dist/store/providers/sqlite/auth.store.js +180 -0
- package/dist/store/providers/sqlite/connection.js +276 -0
- package/dist/store/providers/sqlite/contact.store.js +65 -0
- package/dist/store/providers/sqlite/device-list.store.js +159 -0
- package/dist/store/providers/sqlite/message.store.js +123 -0
- package/dist/store/providers/sqlite/migrations.js +350 -0
- package/dist/store/providers/sqlite/participants.store.js +89 -0
- package/dist/store/providers/sqlite/retry.store.js +148 -0
- package/dist/store/providers/sqlite/sender-key.store.js +207 -0
- package/dist/store/providers/sqlite/signal.store.js +357 -0
- package/dist/store/providers/sqlite/thread.store.js +76 -0
- package/dist/store/types.js +2 -0
- package/dist/transport/WaComms.js +531 -0
- package/dist/transport/WaWebSocket.js +365 -0
- package/dist/transport/binary/constants.js +99 -0
- package/dist/transport/binary/decoder.js +279 -0
- package/dist/transport/binary/encoder.js +214 -0
- package/dist/transport/binary/index.js +23 -0
- package/dist/transport/binary/tokens.js +1283 -0
- package/dist/transport/index.js +18 -0
- package/dist/transport/keepalive/WaKeepAlive.js +145 -0
- package/dist/transport/node/WaNodeOrchestrator.js +147 -0
- package/dist/transport/node/WaNodeTransport.js +68 -0
- package/dist/transport/node/builders/accountSync.js +110 -0
- package/dist/transport/node/builders/group.js +52 -0
- package/dist/transport/node/builders/index.js +39 -0
- package/dist/transport/node/builders/media.js +13 -0
- package/dist/transport/node/builders/message.js +328 -0
- package/dist/transport/node/builders/pairing.js +137 -0
- package/dist/transport/node/builders/prekeys.js +107 -0
- package/dist/transport/node/builders/retry.js +119 -0
- package/dist/transport/node/helpers.js +46 -0
- package/dist/transport/node/query.js +59 -0
- package/dist/transport/node/xml.js +42 -0
- package/dist/transport/noise/WaClientPayload.js +166 -0
- package/dist/transport/noise/WaFrameCodec.js +125 -0
- package/dist/transport/noise/WaNoiseCert.js +77 -0
- package/dist/transport/noise/WaNoiseHandshake.js +61 -0
- package/dist/transport/noise/WaNoiseSession.js +326 -0
- package/dist/transport/noise/WaNoiseSocket.js +21 -0
- package/dist/transport/noise/constants.js +11 -0
- package/dist/transport/noise/types.js +2 -0
- package/dist/transport/stream/parse.js +97 -0
- package/dist/transport/types.js +2 -0
- package/dist/types/appstate/WaAppStateCrypto.d.ts +59 -0
- package/dist/types/appstate/WaAppStateSyncClient.d.ts +63 -0
- package/dist/types/appstate/WaAppStateSyncResponseParser.d.ts +12 -0
- package/dist/types/appstate/constants.d.ts +14 -0
- package/dist/types/appstate/index.d.ts +7 -0
- package/dist/types/appstate/store/sqlite.d.ts +21 -0
- package/dist/types/appstate/types.d.ts +66 -0
- package/dist/types/appstate/utils.d.ts +10 -0
- package/dist/types/auth/WaAuthClient.d.ts +61 -0
- package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +14 -0
- package/dist/types/auth/index.d.ts +6 -0
- package/dist/types/auth/pairing/WaPairingCodeCrypto.d.ts +17 -0
- package/dist/types/auth/pairing/WaPairingFlow.d.ts +48 -0
- package/dist/types/auth/pairing/WaQrFlow.d.ts +23 -0
- package/dist/types/auth/pairing/constants.d.ts +2 -0
- package/dist/types/auth/types.d.ts +48 -0
- package/dist/types/client/WaClient.d.ts +97 -0
- package/dist/types/client/WaClientFactory.d.ts +83 -0
- package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +48 -0
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +60 -0
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +90 -0
- package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +43 -0
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +61 -0
- package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +17 -0
- package/dist/types/client/dirty.d.ts +17 -0
- package/dist/types/client/events/chat.d.ts +3 -0
- package/dist/types/client/events/group.d.ts +7 -0
- package/dist/types/client/history-sync.d.ts +17 -0
- package/dist/types/client/incoming.d.ts +35 -0
- package/dist/types/client/index.d.ts +2 -0
- package/dist/types/client/mailbox.d.ts +12 -0
- package/dist/types/client/messages.d.ts +17 -0
- package/dist/types/client/types.d.ts +235 -0
- package/dist/types/crypto/core/constants.d.ts +1 -0
- package/dist/types/crypto/core/encoding.d.ts +11 -0
- package/dist/types/crypto/core/hkdf.d.ts +8 -0
- package/dist/types/crypto/core/index.d.ts +11 -0
- package/dist/types/crypto/core/keys.d.ts +20 -0
- package/dist/types/crypto/core/nonce.d.ts +5 -0
- package/dist/types/crypto/core/primitives.d.ts +25 -0
- package/dist/types/crypto/core/random.d.ts +8 -0
- package/dist/types/crypto/curves/Ed25519.d.ts +7 -0
- package/dist/types/crypto/curves/X25519.d.ts +8 -0
- package/dist/types/crypto/curves/constants.d.ts +2 -0
- package/dist/types/crypto/curves/types.d.ts +10 -0
- package/dist/types/crypto/index.d.ts +3 -0
- package/dist/types/crypto/math/constants.d.ts +7 -0
- package/dist/types/crypto/math/edwards.d.ts +3 -0
- package/dist/types/crypto/math/le.d.ts +2 -0
- package/dist/types/crypto/math/mod.d.ts +5 -0
- package/dist/types/crypto/math/types.d.ts +6 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/infra/log/ConsoleLogger.d.ts +11 -0
- package/dist/types/infra/log/PinoLogger.d.ts +30 -0
- package/dist/types/infra/log/types.d.ts +9 -0
- package/dist/types/infra/perf/BoundedTaskQueue.d.ts +19 -0
- package/dist/types/media/WaMediaCrypto.d.ts +12 -0
- package/dist/types/media/WaMediaTransferClient.d.ts +81 -0
- package/dist/types/media/conn.d.ts +3 -0
- package/dist/types/media/constants.d.ts +10 -0
- package/dist/types/media/index.d.ts +4 -0
- package/dist/types/media/types.d.ts +56 -0
- package/dist/types/message/WaMessageClient.d.ts +29 -0
- package/dist/types/message/ack.d.ts +5 -0
- package/dist/types/message/content.d.ts +4 -0
- package/dist/types/message/device-sent.d.ts +3 -0
- package/dist/types/message/incoming.d.ts +18 -0
- package/dist/types/message/index.d.ts +2 -0
- package/dist/types/message/padding.d.ts +2 -0
- package/dist/types/message/phash.d.ts +1 -0
- package/dist/types/message/types.d.ts +58 -0
- package/dist/types/proto.d.ts +2 -0
- package/dist/types/protocol/appstate.d.ts +34 -0
- package/dist/types/protocol/auth.d.ts +12 -0
- package/dist/types/protocol/browser.d.ts +22 -0
- package/dist/types/protocol/constants.d.ts +11 -0
- package/dist/types/protocol/defaults.d.ts +26 -0
- package/dist/types/protocol/dirty.d.ts +15 -0
- package/dist/types/protocol/group.d.ts +6 -0
- package/dist/types/protocol/index.d.ts +11 -0
- package/dist/types/protocol/jid.d.ts +19 -0
- package/dist/types/protocol/media.d.ts +15 -0
- package/dist/types/protocol/message.d.ts +16 -0
- package/dist/types/protocol/nodes.d.ts +83 -0
- package/dist/types/protocol/notification.d.ts +50 -0
- package/dist/types/protocol/stream.d.ts +60 -0
- package/dist/types/retry/constants.d.ts +21 -0
- package/dist/types/retry/index.d.ts +7 -0
- package/dist/types/retry/outbound.d.ts +4 -0
- package/dist/types/retry/parse.d.ts +3 -0
- package/dist/types/retry/reason.d.ts +2 -0
- package/dist/types/retry/replay.d.ts +30 -0
- package/dist/types/retry/types.d.ts +70 -0
- package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +31 -0
- package/dist/types/signal/api/SignalDigestSyncApi.d.ts +27 -0
- package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +26 -0
- package/dist/types/signal/api/SignalMissingPreKeysSyncApi.d.ts +39 -0
- package/dist/types/signal/api/SignalRotateKeyApi.d.ts +22 -0
- package/dist/types/signal/api/SignalSessionSyncApi.d.ts +38 -0
- package/dist/types/signal/api/codec.d.ts +3 -0
- package/dist/types/signal/api/constants.d.ts +9 -0
- package/dist/types/signal/api/prekeys.d.ts +6 -0
- package/dist/types/signal/constants.d.ts +14 -0
- package/dist/types/signal/crypto/WaAdvSignature.d.ts +7 -0
- package/dist/types/signal/crypto/constants.d.ts +5 -0
- package/dist/types/signal/group/SenderKeyChain.d.ts +11 -0
- package/dist/types/signal/group/SenderKeyCodec.d.ts +14 -0
- package/dist/types/signal/group/SenderKeyManager.d.ts +22 -0
- package/dist/types/signal/index.d.ts +12 -0
- package/dist/types/signal/registration/keygen.d.ts +5 -0
- package/dist/types/signal/registration/utils.d.ts +9 -0
- package/dist/types/signal/session/SignalProtocol.d.ts +22 -0
- package/dist/types/signal/session/SignalRatchet.d.ts +25 -0
- package/dist/types/signal/session/SignalSerializer.d.ts +6 -0
- package/dist/types/signal/session/SignalSession.d.ts +43 -0
- package/dist/types/signal/store/sqlite.d.ts +72 -0
- package/dist/types/signal/types.d.ts +110 -0
- package/dist/types/store/contracts/appstate.store.d.ts +22 -0
- package/dist/types/store/contracts/auth.store.d.ts +6 -0
- package/dist/types/store/contracts/contact.store.d.ts +14 -0
- package/dist/types/store/contracts/device-list.store.d.ts +16 -0
- package/dist/types/store/contracts/message.store.d.ts +18 -0
- package/dist/types/store/contracts/participants.store.d.ts +14 -0
- package/dist/types/store/contracts/retry.store.d.ts +11 -0
- package/dist/types/store/contracts/sender-key.store.d.ts +16 -0
- package/dist/types/store/contracts/signal.store.d.ts +31 -0
- package/dist/types/store/contracts/thread.store.d.ts +17 -0
- package/dist/types/store/createStore.d.ts +2 -0
- package/dist/types/store/index.d.ts +31 -0
- package/dist/types/store/noop.store.d.ts +10 -0
- package/dist/types/store/providers/memory/appstate.store.d.ts +21 -0
- package/dist/types/store/providers/memory/contact.store.d.ts +13 -0
- package/dist/types/store/providers/memory/device-list.store.d.ts +20 -0
- package/dist/types/store/providers/memory/message.store.d.ts +14 -0
- package/dist/types/store/providers/memory/participants.store.d.ts +18 -0
- package/dist/types/store/providers/memory/retry.store.d.ts +18 -0
- package/dist/types/store/providers/memory/sender-key.store.d.ts +28 -0
- package/dist/types/store/providers/memory/signal.store.d.ts +51 -0
- package/dist/types/store/providers/memory/thread.store.d.ts +14 -0
- package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +12 -0
- package/dist/types/store/providers/sqlite/appstate.store.d.ts +15 -0
- package/dist/types/store/providers/sqlite/auth.store.d.ts +10 -0
- package/dist/types/store/providers/sqlite/connection.d.ts +10 -0
- package/dist/types/store/providers/sqlite/contact.store.d.ts +10 -0
- package/dist/types/store/providers/sqlite/device-list.store.d.ts +18 -0
- package/dist/types/store/providers/sqlite/message.store.d.ts +11 -0
- package/dist/types/store/providers/sqlite/migrations.d.ts +3 -0
- package/dist/types/store/providers/sqlite/participants.store.d.ts +13 -0
- package/dist/types/store/providers/sqlite/retry.store.d.ts +16 -0
- package/dist/types/store/providers/sqlite/sender-key.store.d.ts +25 -0
- package/dist/types/store/providers/sqlite/signal.store.d.ts +46 -0
- package/dist/types/store/providers/sqlite/thread.store.d.ts +11 -0
- package/dist/types/store/types.d.ts +103 -0
- package/dist/types/transport/WaComms.d.ts +61 -0
- package/dist/types/transport/WaWebSocket.d.ts +36 -0
- package/dist/types/transport/binary/constants.d.ts +49 -0
- package/dist/types/transport/binary/decoder.d.ts +3 -0
- package/dist/types/transport/binary/encoder.d.ts +3 -0
- package/dist/types/transport/binary/index.d.ts +4 -0
- package/dist/types/transport/binary/tokens.d.ts +11 -0
- package/dist/types/transport/index.d.ts +7 -0
- package/dist/types/transport/keepalive/WaKeepAlive.d.ts +39 -0
- package/dist/types/transport/node/WaNodeOrchestrator.d.ts +28 -0
- package/dist/types/transport/node/WaNodeTransport.d.ts +22 -0
- package/dist/types/transport/node/builders/accountSync.d.ts +11 -0
- package/dist/types/transport/node/builders/group.d.ts +16 -0
- package/dist/types/transport/node/builders/index.d.ts +7 -0
- package/dist/types/transport/node/builders/media.d.ts +2 -0
- package/dist/types/transport/node/builders/message.d.ts +52 -0
- package/dist/types/transport/node/builders/pairing.d.ts +18 -0
- package/dist/types/transport/node/builders/prekeys.d.ts +5 -0
- package/dist/types/transport/node/builders/retry.d.ts +18 -0
- package/dist/types/transport/node/helpers.d.ts +8 -0
- package/dist/types/transport/node/query.d.ts +10 -0
- package/dist/types/transport/node/xml.d.ts +2 -0
- package/dist/types/transport/noise/WaClientPayload.d.ts +3 -0
- package/dist/types/transport/noise/WaFrameCodec.d.ts +9 -0
- package/dist/types/transport/noise/WaNoiseCert.d.ts +1 -0
- package/dist/types/transport/noise/WaNoiseHandshake.d.ts +14 -0
- package/dist/types/transport/noise/WaNoiseSession.d.ts +33 -0
- package/dist/types/transport/noise/WaNoiseSocket.d.ts +10 -0
- package/dist/types/transport/noise/constants.d.ts +7 -0
- package/dist/types/transport/noise/types.d.ts +23 -0
- package/dist/types/transport/stream/parse.d.ts +23 -0
- package/dist/types/transport/types.d.ts +71 -0
- package/dist/types/util/async.d.ts +1 -0
- package/dist/types/util/base64.d.ts +4 -0
- package/dist/types/util/bytes.d.ts +28 -0
- package/dist/types/util/coercion.d.ts +8 -0
- package/dist/types/util/collections.d.ts +3 -0
- package/dist/types/util/primitives.d.ts +7 -0
- package/dist/types/util/runtime.d.ts +2 -0
- package/dist/types/util/signal-address.d.ts +2 -0
- package/dist/util/async.js +8 -0
- package/dist/util/base64.js +24 -0
- package/dist/util/bytes.js +291 -0
- package/dist/util/coercion.js +66 -0
- package/dist/util/collections.js +32 -0
- package/dist/util/primitives.js +37 -0
- package/dist/util/runtime.js +19 -0
- package/dist/util/signal-address.js +8 -0
- package/package.json +150 -0
- package/proto/index.d.ts +10861 -0
- package/proto/index.js +1 -0
- package/scripts/check-node-version.cjs +55 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { BaseSqliteStore } from '../../providers/sqlite/BaseSqliteStore.js';
|
|
2
|
+
import { asNumber, asOptionalString, asString } from '../../../util/coercion.js';
|
|
3
|
+
function decodeContactRow(row) {
|
|
4
|
+
return {
|
|
5
|
+
jid: asString(row.jid, 'mailbox_contacts.jid'),
|
|
6
|
+
displayName: asOptionalString(row.display_name, 'mailbox_contacts.display_name'),
|
|
7
|
+
pushName: asOptionalString(row.push_name, 'mailbox_contacts.push_name'),
|
|
8
|
+
lid: asOptionalString(row.lid, 'mailbox_contacts.lid'),
|
|
9
|
+
phoneNumber: asOptionalString(row.phone_number, 'mailbox_contacts.phone_number'),
|
|
10
|
+
lastUpdatedMs: asNumber(row.last_updated_ms, 'mailbox_contacts.last_updated_ms')
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export class WaContactSqliteStore extends BaseSqliteStore {
|
|
14
|
+
constructor(options) {
|
|
15
|
+
super(options, ['mailbox']);
|
|
16
|
+
}
|
|
17
|
+
async upsert(record) {
|
|
18
|
+
const db = await this.getConnection();
|
|
19
|
+
db.run(`INSERT INTO mailbox_contacts (
|
|
20
|
+
session_id,
|
|
21
|
+
jid,
|
|
22
|
+
display_name,
|
|
23
|
+
push_name,
|
|
24
|
+
lid,
|
|
25
|
+
phone_number,
|
|
26
|
+
last_updated_ms
|
|
27
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
28
|
+
ON CONFLICT(session_id, jid) DO UPDATE SET
|
|
29
|
+
display_name=COALESCE(excluded.display_name, mailbox_contacts.display_name),
|
|
30
|
+
push_name=COALESCE(excluded.push_name, mailbox_contacts.push_name),
|
|
31
|
+
lid=COALESCE(excluded.lid, mailbox_contacts.lid),
|
|
32
|
+
phone_number=COALESCE(excluded.phone_number, mailbox_contacts.phone_number),
|
|
33
|
+
last_updated_ms=excluded.last_updated_ms`, [
|
|
34
|
+
this.options.sessionId,
|
|
35
|
+
record.jid,
|
|
36
|
+
record.displayName ?? null,
|
|
37
|
+
record.pushName ?? null,
|
|
38
|
+
record.lid ?? null,
|
|
39
|
+
record.phoneNumber ?? null,
|
|
40
|
+
record.lastUpdatedMs
|
|
41
|
+
]);
|
|
42
|
+
}
|
|
43
|
+
async getByJid(jid) {
|
|
44
|
+
const db = await this.getConnection();
|
|
45
|
+
const row = db.get(`SELECT jid, display_name, push_name, lid, phone_number, last_updated_ms
|
|
46
|
+
FROM mailbox_contacts
|
|
47
|
+
WHERE session_id = ? AND jid = ?`, [this.options.sessionId, jid]);
|
|
48
|
+
return row ? decodeContactRow(row) : null;
|
|
49
|
+
}
|
|
50
|
+
async deleteByJid(jid) {
|
|
51
|
+
const db = await this.getConnection();
|
|
52
|
+
db.run(`DELETE FROM mailbox_contacts
|
|
53
|
+
WHERE session_id = ? AND jid = ?`, [this.options.sessionId, jid]);
|
|
54
|
+
const row = db.get('SELECT changes() AS total', []);
|
|
55
|
+
return row ? Number(row.total) : 0;
|
|
56
|
+
}
|
|
57
|
+
async clear() {
|
|
58
|
+
const db = await this.getConnection();
|
|
59
|
+
db.run('DELETE FROM mailbox_contacts WHERE session_id = ?', [this.options.sessionId]);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { BaseSqliteStore } from '../../providers/sqlite/BaseSqliteStore.js';
|
|
2
|
+
import { asNumber, asString, resolvePositive } from '../../../util/coercion.js';
|
|
3
|
+
const DEFAULTS = Object.freeze({
|
|
4
|
+
ttlMs: 5 * 60 * 1000,
|
|
5
|
+
batchSize: 500
|
|
6
|
+
});
|
|
7
|
+
export class WaDeviceListSqliteStore extends BaseSqliteStore {
|
|
8
|
+
constructor(options, ttlMs = DEFAULTS.ttlMs, batchSize) {
|
|
9
|
+
super(options, ['deviceList']);
|
|
10
|
+
this.ttlMs = ttlMs;
|
|
11
|
+
this.batchSize = resolvePositive(batchSize, DEFAULTS.batchSize, 'deviceList.sqlite.batchSize');
|
|
12
|
+
}
|
|
13
|
+
getTtlMs() {
|
|
14
|
+
return this.ttlMs;
|
|
15
|
+
}
|
|
16
|
+
async upsertUserDevices(snapshot) {
|
|
17
|
+
const db = await this.getConnection();
|
|
18
|
+
this.upsertUserDevicesRow(db, snapshot);
|
|
19
|
+
}
|
|
20
|
+
async upsertUserDevicesBatch(snapshots) {
|
|
21
|
+
if (snapshots.length === 0) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
await this.withTransaction((db) => {
|
|
25
|
+
for (const snapshot of snapshots) {
|
|
26
|
+
this.upsertUserDevicesRow(db, snapshot);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
async getUserDevices(userJid, nowMs = Date.now()) {
|
|
31
|
+
const db = await this.getConnection();
|
|
32
|
+
const row = db.get(`SELECT user_jid, device_jids_json, updated_at_ms, expires_at_ms
|
|
33
|
+
FROM device_list_cache
|
|
34
|
+
WHERE session_id = ? AND user_jid = ?`, [this.options.sessionId, userJid]);
|
|
35
|
+
if (!row) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const expiresAtMs = asNumber(row.expires_at_ms, 'device_list_cache.expires_at_ms');
|
|
39
|
+
if (expiresAtMs <= nowMs) {
|
|
40
|
+
db.run(`DELETE FROM device_list_cache
|
|
41
|
+
WHERE session_id = ? AND user_jid = ?`, [this.options.sessionId, userJid]);
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
userJid: asString(row.user_jid, 'device_list_cache.user_jid'),
|
|
46
|
+
deviceJids: decodeDeviceJids(row.device_jids_json),
|
|
47
|
+
updatedAtMs: asNumber(row.updated_at_ms, 'device_list_cache.updated_at_ms')
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
async getUserDevicesBatch(userJids, nowMs = Date.now()) {
|
|
51
|
+
if (userJids.length === 0) {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
const uniqueUserJids = [...new Set(userJids)];
|
|
55
|
+
return this.withTransaction((db) => {
|
|
56
|
+
const activeByUserJid = new Map();
|
|
57
|
+
const expiredUserJids = [];
|
|
58
|
+
for (let start = 0; start < uniqueUserJids.length; start += this.batchSize) {
|
|
59
|
+
const end = Math.min(start + this.batchSize, uniqueUserJids.length);
|
|
60
|
+
const batchLength = end - start;
|
|
61
|
+
const placeholders = new Array(batchLength).fill('?').join(', ');
|
|
62
|
+
const params = [this.options.sessionId];
|
|
63
|
+
for (let index = start; index < end; index += 1) {
|
|
64
|
+
params.push(uniqueUserJids[index]);
|
|
65
|
+
}
|
|
66
|
+
const rows = db.all(`SELECT user_jid, device_jids_json, updated_at_ms, expires_at_ms
|
|
67
|
+
FROM device_list_cache
|
|
68
|
+
WHERE session_id = ? AND user_jid IN (${placeholders})`, params);
|
|
69
|
+
for (const row of rows) {
|
|
70
|
+
const userJid = asString(row.user_jid, 'device_list_cache.user_jid');
|
|
71
|
+
const expiresAtMs = asNumber(row.expires_at_ms, 'device_list_cache.expires_at_ms');
|
|
72
|
+
if (expiresAtMs <= nowMs) {
|
|
73
|
+
expiredUserJids.push(userJid);
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
activeByUserJid.set(userJid, {
|
|
77
|
+
userJid,
|
|
78
|
+
deviceJids: decodeDeviceJids(row.device_jids_json),
|
|
79
|
+
updatedAtMs: asNumber(row.updated_at_ms, 'device_list_cache.updated_at_ms')
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (expiredUserJids.length > 0) {
|
|
84
|
+
this.deleteUserDevicesByJids(db, expiredUserJids);
|
|
85
|
+
}
|
|
86
|
+
return userJids.map((userJid) => activeByUserJid.get(userJid) ?? null);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
async deleteUserDevices(userJid) {
|
|
90
|
+
const db = await this.getConnection();
|
|
91
|
+
db.run(`DELETE FROM device_list_cache
|
|
92
|
+
WHERE session_id = ? AND user_jid = ?`, [this.options.sessionId, userJid]);
|
|
93
|
+
const row = db.get('SELECT changes() AS total', []);
|
|
94
|
+
return row ? Number(row.total) : 0;
|
|
95
|
+
}
|
|
96
|
+
async cleanupExpired(nowMs) {
|
|
97
|
+
const db = await this.getConnection();
|
|
98
|
+
db.run(`DELETE FROM device_list_cache
|
|
99
|
+
WHERE session_id = ? AND expires_at_ms <= ?`, [this.options.sessionId, nowMs]);
|
|
100
|
+
const row = db.get('SELECT changes() AS total', []);
|
|
101
|
+
return row ? Number(row.total) : 0;
|
|
102
|
+
}
|
|
103
|
+
async clear() {
|
|
104
|
+
const db = await this.getConnection();
|
|
105
|
+
db.run('DELETE FROM device_list_cache WHERE session_id = ?', [this.options.sessionId]);
|
|
106
|
+
}
|
|
107
|
+
upsertUserDevicesRow(db, snapshot) {
|
|
108
|
+
db.run(`INSERT INTO device_list_cache (
|
|
109
|
+
session_id,
|
|
110
|
+
user_jid,
|
|
111
|
+
device_jids_json,
|
|
112
|
+
updated_at_ms,
|
|
113
|
+
expires_at_ms
|
|
114
|
+
) VALUES (?, ?, ?, ?, ?)
|
|
115
|
+
ON CONFLICT(session_id, user_jid) DO UPDATE SET
|
|
116
|
+
device_jids_json=excluded.device_jids_json,
|
|
117
|
+
updated_at_ms=excluded.updated_at_ms,
|
|
118
|
+
expires_at_ms=excluded.expires_at_ms`, [
|
|
119
|
+
this.options.sessionId,
|
|
120
|
+
snapshot.userJid,
|
|
121
|
+
JSON.stringify(snapshot.deviceJids),
|
|
122
|
+
snapshot.updatedAtMs,
|
|
123
|
+
snapshot.updatedAtMs + this.ttlMs
|
|
124
|
+
]);
|
|
125
|
+
}
|
|
126
|
+
deleteUserDevicesByJids(db, userJids) {
|
|
127
|
+
if (userJids.length === 0) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
for (let start = 0; start < userJids.length; start += this.batchSize) {
|
|
131
|
+
const end = Math.min(start + this.batchSize, userJids.length);
|
|
132
|
+
const batchLength = end - start;
|
|
133
|
+
const placeholders = new Array(batchLength).fill('?').join(', ');
|
|
134
|
+
const params = [this.options.sessionId];
|
|
135
|
+
for (let index = start; index < end; index += 1) {
|
|
136
|
+
params.push(userJids[index]);
|
|
137
|
+
}
|
|
138
|
+
db.run(`DELETE FROM device_list_cache
|
|
139
|
+
WHERE session_id = ? AND user_jid IN (${placeholders})`, params);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function decodeDeviceJids(raw) {
|
|
144
|
+
const json = asString(raw, 'device_list_cache.device_jids_json');
|
|
145
|
+
const parsed = JSON.parse(json);
|
|
146
|
+
if (!Array.isArray(parsed)) {
|
|
147
|
+
throw new Error('device_list_cache.device_jids_json must be an array');
|
|
148
|
+
}
|
|
149
|
+
return parsed.filter((entry) => {
|
|
150
|
+
if (typeof entry !== 'string') {
|
|
151
|
+
throw new Error('device_list_cache.device_jids_json entry must be string');
|
|
152
|
+
}
|
|
153
|
+
return true;
|
|
154
|
+
});
|
|
155
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { BaseSqliteStore } from '../../providers/sqlite/BaseSqliteStore.js';
|
|
2
|
+
import { asOptionalBytes, asOptionalNumber, asOptionalString, asString } from '../../../util/coercion.js';
|
|
3
|
+
import { normalizeQueryLimit } from '../../../util/collections.js';
|
|
4
|
+
function decodeMessageRow(row) {
|
|
5
|
+
return {
|
|
6
|
+
id: asString(row.message_id, 'mailbox_messages.message_id'),
|
|
7
|
+
threadJid: asString(row.thread_jid, 'mailbox_messages.thread_jid'),
|
|
8
|
+
senderJid: asOptionalString(row.sender_jid, 'mailbox_messages.sender_jid'),
|
|
9
|
+
participantJid: asOptionalString(row.participant_jid, 'mailbox_messages.participant_jid'),
|
|
10
|
+
fromMe: Number(row.from_me) === 1,
|
|
11
|
+
timestampMs: asOptionalNumber(row.timestamp_ms, 'mailbox_messages.timestamp_ms'),
|
|
12
|
+
encType: asOptionalString(row.enc_type, 'mailbox_messages.enc_type'),
|
|
13
|
+
plaintext: asOptionalBytes(row.plaintext, 'mailbox_messages.plaintext'),
|
|
14
|
+
messageBytes: asOptionalBytes(row.message_bytes, 'mailbox_messages.message_bytes')
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export class WaMessageSqliteStore extends BaseSqliteStore {
|
|
18
|
+
constructor(options) {
|
|
19
|
+
super(options, ['mailbox']);
|
|
20
|
+
}
|
|
21
|
+
async upsert(record) {
|
|
22
|
+
const db = await this.getConnection();
|
|
23
|
+
db.run(`INSERT INTO mailbox_messages (
|
|
24
|
+
session_id,
|
|
25
|
+
message_id,
|
|
26
|
+
thread_jid,
|
|
27
|
+
sender_jid,
|
|
28
|
+
participant_jid,
|
|
29
|
+
from_me,
|
|
30
|
+
timestamp_ms,
|
|
31
|
+
enc_type,
|
|
32
|
+
plaintext,
|
|
33
|
+
message_bytes
|
|
34
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
35
|
+
ON CONFLICT(session_id, message_id) DO UPDATE SET
|
|
36
|
+
thread_jid=excluded.thread_jid,
|
|
37
|
+
sender_jid=excluded.sender_jid,
|
|
38
|
+
participant_jid=excluded.participant_jid,
|
|
39
|
+
from_me=excluded.from_me,
|
|
40
|
+
timestamp_ms=excluded.timestamp_ms,
|
|
41
|
+
enc_type=excluded.enc_type,
|
|
42
|
+
plaintext=excluded.plaintext,
|
|
43
|
+
message_bytes=excluded.message_bytes`, [
|
|
44
|
+
this.options.sessionId,
|
|
45
|
+
record.id,
|
|
46
|
+
record.threadJid,
|
|
47
|
+
record.senderJid ?? null,
|
|
48
|
+
record.participantJid ?? null,
|
|
49
|
+
record.fromMe ? 1 : 0,
|
|
50
|
+
record.timestampMs ?? null,
|
|
51
|
+
record.encType ?? null,
|
|
52
|
+
record.plaintext ?? null,
|
|
53
|
+
record.messageBytes ?? null
|
|
54
|
+
]);
|
|
55
|
+
}
|
|
56
|
+
async getById(id) {
|
|
57
|
+
const db = await this.getConnection();
|
|
58
|
+
const row = db.get(`SELECT
|
|
59
|
+
message_id,
|
|
60
|
+
thread_jid,
|
|
61
|
+
sender_jid,
|
|
62
|
+
participant_jid,
|
|
63
|
+
from_me,
|
|
64
|
+
timestamp_ms,
|
|
65
|
+
enc_type,
|
|
66
|
+
plaintext,
|
|
67
|
+
message_bytes
|
|
68
|
+
FROM mailbox_messages
|
|
69
|
+
WHERE session_id = ? AND message_id = ?`, [this.options.sessionId, id]);
|
|
70
|
+
return row ? decodeMessageRow(row) : null;
|
|
71
|
+
}
|
|
72
|
+
async listByThread(threadJid, limit, beforeTimestampMs) {
|
|
73
|
+
const db = await this.getConnection();
|
|
74
|
+
const normalizedLimit = normalizeQueryLimit(limit, 50);
|
|
75
|
+
const rows = beforeTimestampMs === undefined
|
|
76
|
+
? db.all(`SELECT
|
|
77
|
+
message_id,
|
|
78
|
+
thread_jid,
|
|
79
|
+
sender_jid,
|
|
80
|
+
participant_jid,
|
|
81
|
+
from_me,
|
|
82
|
+
timestamp_ms,
|
|
83
|
+
enc_type,
|
|
84
|
+
plaintext,
|
|
85
|
+
message_bytes
|
|
86
|
+
FROM mailbox_messages
|
|
87
|
+
WHERE session_id = ? AND thread_jid = ?
|
|
88
|
+
ORDER BY timestamp_ms DESC, message_id DESC
|
|
89
|
+
LIMIT ?`, [this.options.sessionId, threadJid, normalizedLimit])
|
|
90
|
+
: db.all(`SELECT
|
|
91
|
+
message_id,
|
|
92
|
+
thread_jid,
|
|
93
|
+
sender_jid,
|
|
94
|
+
participant_jid,
|
|
95
|
+
from_me,
|
|
96
|
+
timestamp_ms,
|
|
97
|
+
enc_type,
|
|
98
|
+
plaintext,
|
|
99
|
+
message_bytes
|
|
100
|
+
FROM mailbox_messages
|
|
101
|
+
WHERE session_id = ?
|
|
102
|
+
AND thread_jid = ?
|
|
103
|
+
AND timestamp_ms < ?
|
|
104
|
+
ORDER BY timestamp_ms DESC, message_id DESC
|
|
105
|
+
LIMIT ?`, [this.options.sessionId, threadJid, beforeTimestampMs, normalizedLimit]);
|
|
106
|
+
return rows.map(decodeMessageRow);
|
|
107
|
+
}
|
|
108
|
+
async deleteById(id) {
|
|
109
|
+
const db = await this.getConnection();
|
|
110
|
+
db.run(`DELETE FROM mailbox_messages
|
|
111
|
+
WHERE session_id = ? AND message_id = ?`, [this.options.sessionId, id]);
|
|
112
|
+
const row = db.get('SELECT changes() AS total', []);
|
|
113
|
+
return row ? Number(row.total) : 0;
|
|
114
|
+
}
|
|
115
|
+
async clear() {
|
|
116
|
+
const db = await this.getConnection();
|
|
117
|
+
db.run('DELETE FROM mailbox_messages WHERE session_id = ?', [this.options.sessionId]);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
const SQLITE_MIGRATIONS = [
|
|
2
|
+
{
|
|
3
|
+
id: '0001_auth_credentials_schema',
|
|
4
|
+
domain: 'auth',
|
|
5
|
+
up: (db) => {
|
|
6
|
+
db.exec(`
|
|
7
|
+
CREATE TABLE IF NOT EXISTS auth_credentials (
|
|
8
|
+
session_id TEXT PRIMARY KEY,
|
|
9
|
+
noise_pub_key BLOB NOT NULL,
|
|
10
|
+
noise_priv_key BLOB NOT NULL,
|
|
11
|
+
registration_id INTEGER NOT NULL,
|
|
12
|
+
identity_pub_key BLOB NOT NULL,
|
|
13
|
+
identity_priv_key BLOB NOT NULL,
|
|
14
|
+
signed_prekey_id INTEGER NOT NULL,
|
|
15
|
+
signed_prekey_pub_key BLOB NOT NULL,
|
|
16
|
+
signed_prekey_priv_key BLOB NOT NULL,
|
|
17
|
+
signed_prekey_signature BLOB NOT NULL,
|
|
18
|
+
adv_secret_key BLOB NOT NULL,
|
|
19
|
+
signed_identity BLOB,
|
|
20
|
+
me_jid TEXT,
|
|
21
|
+
me_lid TEXT,
|
|
22
|
+
me_display_name TEXT,
|
|
23
|
+
companion_enc_static BLOB,
|
|
24
|
+
platform TEXT,
|
|
25
|
+
server_static_key BLOB,
|
|
26
|
+
server_has_prekeys INTEGER,
|
|
27
|
+
routing_info BLOB,
|
|
28
|
+
last_success_ts INTEGER,
|
|
29
|
+
props_version INTEGER,
|
|
30
|
+
ab_props_version INTEGER,
|
|
31
|
+
connection_location TEXT,
|
|
32
|
+
account_creation_ts INTEGER
|
|
33
|
+
);
|
|
34
|
+
`);
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
id: '0001_signal_schema',
|
|
39
|
+
domain: 'signal',
|
|
40
|
+
up: (db) => {
|
|
41
|
+
db.exec(`
|
|
42
|
+
CREATE TABLE IF NOT EXISTS signal_meta (
|
|
43
|
+
session_id TEXT PRIMARY KEY,
|
|
44
|
+
server_has_prekeys INTEGER NOT NULL DEFAULT 0,
|
|
45
|
+
next_prekey_id INTEGER NOT NULL DEFAULT 1
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
CREATE TABLE IF NOT EXISTS signal_registration (
|
|
49
|
+
session_id TEXT PRIMARY KEY,
|
|
50
|
+
registration_id INTEGER NOT NULL,
|
|
51
|
+
identity_pub_key BLOB NOT NULL,
|
|
52
|
+
identity_priv_key BLOB NOT NULL
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
CREATE TABLE IF NOT EXISTS signal_signed_prekey (
|
|
56
|
+
session_id TEXT PRIMARY KEY,
|
|
57
|
+
key_id INTEGER NOT NULL,
|
|
58
|
+
pub_key BLOB NOT NULL,
|
|
59
|
+
priv_key BLOB NOT NULL,
|
|
60
|
+
signature BLOB NOT NULL,
|
|
61
|
+
uploaded INTEGER NOT NULL DEFAULT 0
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
CREATE TABLE IF NOT EXISTS signal_prekey (
|
|
65
|
+
session_id TEXT NOT NULL,
|
|
66
|
+
key_id INTEGER NOT NULL,
|
|
67
|
+
pub_key BLOB NOT NULL,
|
|
68
|
+
priv_key BLOB NOT NULL,
|
|
69
|
+
uploaded INTEGER NOT NULL DEFAULT 0,
|
|
70
|
+
PRIMARY KEY (session_id, key_id)
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
CREATE TABLE IF NOT EXISTS signal_session (
|
|
74
|
+
session_id TEXT NOT NULL,
|
|
75
|
+
user TEXT NOT NULL,
|
|
76
|
+
server TEXT NOT NULL,
|
|
77
|
+
device INTEGER NOT NULL,
|
|
78
|
+
record BLOB NOT NULL,
|
|
79
|
+
PRIMARY KEY (session_id, user, server, device)
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
CREATE TABLE IF NOT EXISTS signal_identity (
|
|
83
|
+
session_id TEXT NOT NULL,
|
|
84
|
+
user TEXT NOT NULL,
|
|
85
|
+
server TEXT NOT NULL,
|
|
86
|
+
device INTEGER NOT NULL,
|
|
87
|
+
identity_key BLOB NOT NULL,
|
|
88
|
+
PRIMARY KEY (session_id, user, server, device)
|
|
89
|
+
);
|
|
90
|
+
`);
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
id: '0001_sender_key_schema',
|
|
95
|
+
domain: 'senderKey',
|
|
96
|
+
up: (db) => {
|
|
97
|
+
db.exec(`
|
|
98
|
+
CREATE TABLE IF NOT EXISTS sender_keys (
|
|
99
|
+
session_id TEXT NOT NULL,
|
|
100
|
+
group_id TEXT NOT NULL,
|
|
101
|
+
sender_user TEXT NOT NULL,
|
|
102
|
+
sender_server TEXT NOT NULL,
|
|
103
|
+
sender_device INTEGER NOT NULL,
|
|
104
|
+
record BLOB NOT NULL,
|
|
105
|
+
PRIMARY KEY (session_id, group_id, sender_user, sender_server, sender_device)
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
CREATE TABLE IF NOT EXISTS sender_key_distribution (
|
|
109
|
+
session_id TEXT NOT NULL,
|
|
110
|
+
group_id TEXT NOT NULL,
|
|
111
|
+
sender_user TEXT NOT NULL,
|
|
112
|
+
sender_server TEXT NOT NULL,
|
|
113
|
+
sender_device INTEGER NOT NULL,
|
|
114
|
+
key_id INTEGER NOT NULL,
|
|
115
|
+
timestamp_ms INTEGER NOT NULL,
|
|
116
|
+
PRIMARY KEY (session_id, group_id, sender_user, sender_server, sender_device)
|
|
117
|
+
);
|
|
118
|
+
`);
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
id: '0001_appstate_schema',
|
|
123
|
+
domain: 'appState',
|
|
124
|
+
up: (db) => {
|
|
125
|
+
db.exec(`
|
|
126
|
+
CREATE TABLE IF NOT EXISTS appstate_sync_keys (
|
|
127
|
+
session_id TEXT NOT NULL,
|
|
128
|
+
key_id BLOB NOT NULL,
|
|
129
|
+
key_data BLOB NOT NULL,
|
|
130
|
+
timestamp INTEGER NOT NULL,
|
|
131
|
+
fingerprint BLOB,
|
|
132
|
+
key_epoch INTEGER,
|
|
133
|
+
PRIMARY KEY (session_id, key_id)
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
CREATE TABLE IF NOT EXISTS appstate_collection_versions (
|
|
137
|
+
session_id TEXT NOT NULL,
|
|
138
|
+
collection TEXT NOT NULL,
|
|
139
|
+
version INTEGER NOT NULL,
|
|
140
|
+
hash BLOB NOT NULL,
|
|
141
|
+
PRIMARY KEY (session_id, collection)
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
CREATE TABLE IF NOT EXISTS appstate_collection_index_values (
|
|
145
|
+
session_id TEXT NOT NULL,
|
|
146
|
+
collection TEXT NOT NULL,
|
|
147
|
+
index_mac_hex TEXT NOT NULL,
|
|
148
|
+
value_mac BLOB NOT NULL,
|
|
149
|
+
PRIMARY KEY (session_id, collection, index_mac_hex)
|
|
150
|
+
);
|
|
151
|
+
`);
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
id: '0003_retry_message_schema',
|
|
156
|
+
domain: 'retry',
|
|
157
|
+
up: (db) => {
|
|
158
|
+
db.exec(`
|
|
159
|
+
CREATE TABLE IF NOT EXISTS retry_outbound_messages (
|
|
160
|
+
session_id TEXT NOT NULL,
|
|
161
|
+
message_id TEXT NOT NULL,
|
|
162
|
+
to_jid TEXT NOT NULL,
|
|
163
|
+
participant_jid TEXT,
|
|
164
|
+
recipient_jid TEXT,
|
|
165
|
+
message_type TEXT NOT NULL,
|
|
166
|
+
replay_mode TEXT NOT NULL,
|
|
167
|
+
replay_payload BLOB NOT NULL,
|
|
168
|
+
state TEXT NOT NULL,
|
|
169
|
+
created_at_ms INTEGER NOT NULL,
|
|
170
|
+
updated_at_ms INTEGER NOT NULL,
|
|
171
|
+
expires_at_ms INTEGER NOT NULL,
|
|
172
|
+
PRIMARY KEY (session_id, message_id)
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
CREATE INDEX IF NOT EXISTS retry_outbound_messages_by_expiry
|
|
176
|
+
ON retry_outbound_messages (session_id, expires_at_ms);
|
|
177
|
+
CREATE INDEX IF NOT EXISTS retry_outbound_messages_by_state
|
|
178
|
+
ON retry_outbound_messages (session_id, state);
|
|
179
|
+
|
|
180
|
+
CREATE TABLE IF NOT EXISTS retry_inbound_counters (
|
|
181
|
+
session_id TEXT NOT NULL,
|
|
182
|
+
message_id TEXT NOT NULL,
|
|
183
|
+
requester_jid TEXT NOT NULL,
|
|
184
|
+
retry_count INTEGER NOT NULL,
|
|
185
|
+
updated_at_ms INTEGER NOT NULL,
|
|
186
|
+
expires_at_ms INTEGER NOT NULL,
|
|
187
|
+
PRIMARY KEY (session_id, message_id, requester_jid)
|
|
188
|
+
);
|
|
189
|
+
|
|
190
|
+
CREATE INDEX IF NOT EXISTS retry_inbound_counters_by_expiry
|
|
191
|
+
ON retry_inbound_counters (session_id, expires_at_ms);
|
|
192
|
+
`);
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
id: '0004_mailbox_schema',
|
|
197
|
+
domain: 'mailbox',
|
|
198
|
+
up: (db) => {
|
|
199
|
+
db.exec(`
|
|
200
|
+
CREATE TABLE IF NOT EXISTS mailbox_messages (
|
|
201
|
+
session_id TEXT NOT NULL,
|
|
202
|
+
message_id TEXT NOT NULL,
|
|
203
|
+
thread_jid TEXT NOT NULL,
|
|
204
|
+
sender_jid TEXT,
|
|
205
|
+
participant_jid TEXT,
|
|
206
|
+
from_me INTEGER NOT NULL,
|
|
207
|
+
timestamp_ms INTEGER,
|
|
208
|
+
enc_type TEXT,
|
|
209
|
+
plaintext BLOB,
|
|
210
|
+
message_bytes BLOB,
|
|
211
|
+
PRIMARY KEY (session_id, message_id)
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
CREATE INDEX IF NOT EXISTS mailbox_messages_by_thread_timestamp
|
|
215
|
+
ON mailbox_messages (session_id, thread_jid, timestamp_ms DESC);
|
|
216
|
+
|
|
217
|
+
CREATE TABLE IF NOT EXISTS mailbox_threads (
|
|
218
|
+
session_id TEXT NOT NULL,
|
|
219
|
+
jid TEXT NOT NULL,
|
|
220
|
+
name TEXT,
|
|
221
|
+
unread_count INTEGER,
|
|
222
|
+
archived INTEGER,
|
|
223
|
+
pinned INTEGER,
|
|
224
|
+
mute_end_ms INTEGER,
|
|
225
|
+
marked_as_unread INTEGER,
|
|
226
|
+
ephemeral_expiration INTEGER,
|
|
227
|
+
PRIMARY KEY (session_id, jid)
|
|
228
|
+
);
|
|
229
|
+
|
|
230
|
+
CREATE TABLE IF NOT EXISTS mailbox_contacts (
|
|
231
|
+
session_id TEXT NOT NULL,
|
|
232
|
+
jid TEXT NOT NULL,
|
|
233
|
+
display_name TEXT,
|
|
234
|
+
push_name TEXT,
|
|
235
|
+
lid TEXT,
|
|
236
|
+
phone_number TEXT,
|
|
237
|
+
last_updated_ms INTEGER NOT NULL,
|
|
238
|
+
PRIMARY KEY (session_id, jid)
|
|
239
|
+
);
|
|
240
|
+
`);
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
id: '0005_participants_cache_schema',
|
|
245
|
+
domain: 'participants',
|
|
246
|
+
up: (db) => {
|
|
247
|
+
db.exec(`
|
|
248
|
+
CREATE TABLE IF NOT EXISTS group_participants_cache (
|
|
249
|
+
session_id TEXT NOT NULL,
|
|
250
|
+
group_jid TEXT NOT NULL,
|
|
251
|
+
participants_json TEXT NOT NULL,
|
|
252
|
+
updated_at_ms INTEGER NOT NULL,
|
|
253
|
+
expires_at_ms INTEGER NOT NULL,
|
|
254
|
+
PRIMARY KEY (session_id, group_jid)
|
|
255
|
+
);
|
|
256
|
+
|
|
257
|
+
CREATE INDEX IF NOT EXISTS group_participants_cache_by_expiry
|
|
258
|
+
ON group_participants_cache (session_id, expires_at_ms);
|
|
259
|
+
`);
|
|
260
|
+
}
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
id: '0006_device_list_cache_schema',
|
|
264
|
+
domain: 'deviceList',
|
|
265
|
+
up: (db) => {
|
|
266
|
+
db.exec(`
|
|
267
|
+
CREATE TABLE IF NOT EXISTS device_list_cache (
|
|
268
|
+
session_id TEXT NOT NULL,
|
|
269
|
+
user_jid TEXT NOT NULL,
|
|
270
|
+
device_jids_json TEXT NOT NULL,
|
|
271
|
+
updated_at_ms INTEGER NOT NULL,
|
|
272
|
+
expires_at_ms INTEGER NOT NULL,
|
|
273
|
+
PRIMARY KEY (session_id, user_jid)
|
|
274
|
+
);
|
|
275
|
+
|
|
276
|
+
CREATE INDEX IF NOT EXISTS device_list_cache_by_expiry
|
|
277
|
+
ON device_list_cache (session_id, expires_at_ms);
|
|
278
|
+
`);
|
|
279
|
+
}
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
id: '0007_signal_signed_prekey_rotation_ts',
|
|
283
|
+
domain: 'signal',
|
|
284
|
+
up: (db) => {
|
|
285
|
+
db.exec(`
|
|
286
|
+
ALTER TABLE signal_meta
|
|
287
|
+
ADD COLUMN signed_prekey_rotation_ts INTEGER;
|
|
288
|
+
`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
];
|
|
292
|
+
function isMigrationAlreadyAppliedRace(error) {
|
|
293
|
+
if (!(error instanceof Error)) {
|
|
294
|
+
return false;
|
|
295
|
+
}
|
|
296
|
+
return error.message.includes('UNIQUE constraint failed: wa_migrations.id');
|
|
297
|
+
}
|
|
298
|
+
function ensureMigrationTable(db) {
|
|
299
|
+
db.exec(`
|
|
300
|
+
CREATE TABLE IF NOT EXISTS wa_migrations (
|
|
301
|
+
id TEXT PRIMARY KEY,
|
|
302
|
+
applied_at INTEGER NOT NULL
|
|
303
|
+
);
|
|
304
|
+
`);
|
|
305
|
+
}
|
|
306
|
+
function hasMigration(db, id) {
|
|
307
|
+
const row = db.get(`SELECT id
|
|
308
|
+
FROM wa_migrations
|
|
309
|
+
WHERE id = ?`, [id]);
|
|
310
|
+
return !!row;
|
|
311
|
+
}
|
|
312
|
+
function hasDomain(domainSet, migration) {
|
|
313
|
+
return domainSet.has(migration.domain);
|
|
314
|
+
}
|
|
315
|
+
export async function ensureSqliteMigrations(db, domains) {
|
|
316
|
+
ensureMigrationTable(db);
|
|
317
|
+
const domainSet = new Set(domains);
|
|
318
|
+
if (domainSet.size === 0) {
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
for (const migration of SQLITE_MIGRATIONS) {
|
|
322
|
+
if (!hasDomain(domainSet, migration)) {
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
if (hasMigration(db, migration.id)) {
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
db.exec('BEGIN');
|
|
329
|
+
try {
|
|
330
|
+
if (hasMigration(db, migration.id)) {
|
|
331
|
+
db.exec('COMMIT');
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
db.run(`INSERT INTO wa_migrations (id, applied_at)
|
|
335
|
+
VALUES (?, ?)`, [migration.id, Date.now()]);
|
|
336
|
+
migration.up(db);
|
|
337
|
+
db.exec('COMMIT');
|
|
338
|
+
}
|
|
339
|
+
catch (error) {
|
|
340
|
+
db.exec('ROLLBACK');
|
|
341
|
+
if (isMigrationAlreadyAppliedRace(error)) {
|
|
342
|
+
continue;
|
|
343
|
+
}
|
|
344
|
+
throw error;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|