zapo-js 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -4
- package/dist/appstate/WaAppStateCrypto.js +1 -1
- package/dist/appstate/WaAppStateSyncClient.js +138 -93
- package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
- package/dist/appstate/index.js +8 -6
- package/dist/appstate/utils.js +0 -5
- package/dist/auth/WaAuthClient.js +36 -47
- package/dist/auth/flow/WaAuthCredentialsFlow.js +7 -7
- package/dist/auth/index.js +1 -6
- package/dist/auth/pairing/WaPairingCodeCrypto.js +6 -4
- package/dist/auth/pairing/WaPairingFlow.js +13 -3
- package/dist/client/WaClient.js +225 -101
- package/dist/client/WaClientFactory.js +294 -44
- package/dist/client/connection/WaConnectionManager.js +19 -10
- package/dist/client/coordinators/WaBusinessCoordinator.js +241 -0
- package/dist/client/coordinators/WaGroupCoordinator.js +11 -7
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +1 -0
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +292 -99
- package/dist/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
- package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
- package/dist/client/coordinators/WaProfileCoordinator.js +212 -0
- package/dist/client/coordinators/WaRetryCoordinator.js +179 -27
- package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
- package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +166 -0
- package/dist/client/dirty.js +40 -20
- package/dist/client/events/devices.js +72 -0
- package/dist/client/events/group.js +3 -11
- package/dist/client/events/identity.js +22 -0
- package/dist/client/events/privacy-token.js +39 -0
- package/dist/client/history-sync.js +50 -9
- package/dist/client/incoming.js +37 -7
- package/dist/client/mailbox.js +24 -23
- package/dist/client/messages.js +107 -31
- package/dist/client/messaging/fanout.js +21 -11
- package/dist/client/messaging/participants.js +6 -4
- package/dist/client/persistence/WriteBehindPersistence.js +129 -0
- package/dist/client/tokens/cs-token.js +50 -0
- package/dist/client/tokens/tc-token.js +25 -0
- package/dist/crypto/core/index.js +2 -2
- package/dist/crypto/core/keys.js +4 -4
- package/dist/crypto/core/nonce.js +2 -0
- package/dist/crypto/core/primitives.js +0 -8
- package/dist/crypto/core/random.js +22 -0
- package/dist/crypto/curves/X25519.js +25 -6
- package/dist/crypto/index.js +3 -0
- package/dist/crypto/math/constants.js +13 -36
- package/dist/crypto/math/edwards.js +171 -44
- package/dist/crypto/math/fe.js +706 -0
- package/dist/crypto/math/mod.js +10 -3
- package/dist/esm/appstate/WaAppStateCrypto.js +1 -1
- package/dist/esm/appstate/WaAppStateSyncClient.js +138 -93
- package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
- package/dist/esm/appstate/index.js +2 -2
- package/dist/esm/appstate/utils.js +2 -5
- package/dist/esm/auth/WaAuthClient.js +36 -47
- package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +7 -7
- package/dist/esm/auth/index.js +0 -2
- package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +6 -4
- package/dist/esm/auth/pairing/WaPairingFlow.js +14 -4
- package/dist/esm/client/WaClient.js +225 -101
- package/dist/esm/client/WaClientFactory.js +295 -45
- package/dist/esm/client/connection/WaConnectionManager.js +19 -10
- package/dist/esm/client/coordinators/WaBusinessCoordinator.js +238 -0
- package/dist/esm/client/coordinators/WaGroupCoordinator.js +11 -7
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +1 -0
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +295 -102
- package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
- package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
- package/dist/esm/client/coordinators/WaProfileCoordinator.js +209 -0
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +181 -29
- package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
- package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +162 -0
- package/dist/esm/client/dirty.js +40 -20
- package/dist/esm/client/events/devices.js +68 -0
- package/dist/esm/client/events/group.js +3 -11
- package/dist/esm/client/events/identity.js +19 -0
- package/dist/esm/client/events/privacy-token.js +36 -0
- package/dist/esm/client/history-sync.js +50 -9
- package/dist/esm/client/incoming.js +38 -8
- package/dist/esm/client/mailbox.js +24 -23
- package/dist/esm/client/messages.js +108 -32
- package/dist/esm/client/messaging/fanout.js +22 -12
- package/dist/esm/client/messaging/participants.js +6 -4
- package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
- package/dist/esm/client/tokens/cs-token.js +46 -0
- package/dist/esm/client/tokens/tc-token.js +18 -0
- package/dist/esm/crypto/core/index.js +2 -2
- package/dist/esm/crypto/core/keys.js +1 -1
- package/dist/esm/crypto/core/nonce.js +2 -0
- package/dist/esm/crypto/core/primitives.js +0 -7
- package/dist/esm/crypto/core/random.js +22 -1
- package/dist/esm/crypto/curves/X25519.js +25 -6
- package/dist/esm/crypto/index.js +1 -0
- package/dist/esm/crypto/math/constants.js +12 -35
- package/dist/esm/crypto/math/edwards.js +174 -47
- package/dist/esm/crypto/math/fe.js +691 -0
- package/dist/esm/crypto/math/mod.js +10 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
- package/dist/esm/infra/perf/BoundedTaskQueue.js +3 -1
- package/dist/esm/infra/perf/PromiseDedup.js +20 -0
- package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
- package/dist/esm/infra/perf/StoreLock.js +77 -0
- package/dist/esm/media/WaMediaCrypto.js +95 -13
- package/dist/esm/media/WaMediaTransferClient.js +39 -47
- package/dist/esm/media/constants.js +2 -1
- package/dist/esm/message/WaMessageClient.js +26 -19
- package/dist/esm/message/content.js +195 -9
- package/dist/esm/message/icdc.js +76 -0
- package/dist/esm/message/incoming.js +24 -12
- package/dist/esm/message/phash.js +3 -1
- package/dist/esm/message/reporting-token.js +14 -27
- package/dist/esm/protocol/appstate.js +9 -40
- package/dist/esm/protocol/browser.js +10 -18
- package/dist/esm/protocol/constants.js +5 -3
- package/dist/esm/protocol/defaults.js +6 -0
- package/dist/esm/protocol/index.js +1 -2
- package/dist/esm/protocol/jid.js +105 -36
- package/dist/esm/protocol/message.js +61 -1
- package/dist/esm/protocol/nodes.js +2 -0
- package/dist/esm/protocol/notification.js +3 -1
- package/dist/esm/protocol/privacy-token.js +17 -0
- package/dist/esm/protocol/privacy.js +55 -0
- package/dist/esm/protocol/stream.js +26 -1
- package/dist/esm/retry/codec.js +216 -0
- package/dist/esm/retry/constants.js +1 -1
- package/dist/esm/retry/index.js +2 -2
- package/dist/esm/retry/parse.js +50 -30
- package/dist/esm/retry/replay.js +11 -7
- package/dist/esm/retry/tracker.js +50 -12
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +49 -32
- package/dist/esm/signal/api/SignalDigestSyncApi.js +13 -9
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +26 -11
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +18 -7
- package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
- package/dist/esm/signal/api/SignalSessionSyncApi.js +16 -7
- package/dist/esm/signal/api/result-map.js +10 -0
- package/dist/esm/signal/constants.js +0 -4
- package/dist/esm/signal/crypto/WaAdvSignature.js +12 -6
- package/dist/esm/signal/{store/sqlite.js → encoding.js} +78 -24
- package/dist/esm/signal/group/SenderKeyCodec.js +3 -2
- package/dist/esm/signal/group/SenderKeyManager.js +125 -106
- package/dist/esm/signal/index.js +1 -0
- package/dist/esm/signal/registration/keygen.js +6 -2
- package/dist/esm/signal/registration/utils.js +1 -0
- package/dist/esm/signal/session/SignalProtocol.js +150 -74
- package/dist/esm/signal/session/resolver.js +137 -102
- package/dist/esm/store/contracts/privacy-token.store.js +1 -0
- package/dist/esm/store/createStore.js +101 -187
- package/dist/esm/store/index.js +1 -10
- package/dist/esm/store/locks/appstate.lock.js +26 -0
- package/dist/esm/store/locks/auth.lock.js +15 -0
- package/dist/esm/store/locks/contact.lock.js +20 -0
- package/dist/esm/store/locks/device-list.lock.js +20 -0
- package/dist/esm/store/locks/message.lock.js +21 -0
- package/dist/esm/store/locks/participants.lock.js +20 -0
- package/dist/esm/store/locks/privacy-token.lock.js +18 -0
- package/dist/esm/store/locks/retry.lock.js +29 -0
- package/dist/esm/store/locks/sender-key.lock.js +52 -0
- package/dist/esm/store/locks/signal.lock.js +63 -0
- package/dist/esm/store/locks/thread.lock.js +21 -0
- package/dist/esm/store/noop.store.js +1 -1
- package/dist/esm/store/providers/memory/appstate.store.js +22 -24
- package/dist/esm/store/providers/memory/device-list.store.js +10 -5
- package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
- package/dist/esm/store/providers/memory/retry.store.js +77 -2
- package/dist/esm/store/providers/memory/sender-key.store.js +6 -1
- package/dist/esm/store/providers/memory/signal.store.js +36 -19
- package/dist/esm/transport/WaComms.js +3 -1
- package/dist/esm/transport/WaWebSocket.js +0 -6
- package/dist/esm/transport/binary/constants.js +0 -30
- package/dist/esm/transport/binary/decoder.js +4 -4
- package/dist/esm/transport/binary/encoder.js +8 -15
- package/dist/esm/transport/binary/index.js +0 -1
- package/dist/esm/transport/node/WaNodeOrchestrator.js +25 -19
- package/dist/esm/transport/node/builders/business.js +129 -0
- package/dist/esm/transport/node/builders/global.js +370 -0
- package/dist/esm/transport/node/builders/index.js +5 -2
- package/dist/esm/transport/node/builders/message.js +63 -239
- package/dist/esm/transport/node/builders/pairing.js +0 -24
- package/dist/esm/transport/node/builders/privacy-token.js +41 -0
- package/dist/esm/transport/node/builders/privacy.js +48 -0
- package/dist/esm/transport/node/builders/profile.js +70 -0
- package/dist/esm/transport/node/builders/retry.js +10 -22
- package/dist/esm/transport/node/builders/usync.js +6 -2
- package/dist/esm/transport/node/helpers.js +19 -1
- package/dist/esm/transport/node/usync.js +3 -33
- package/dist/esm/transport/node/xml.js +35 -14
- package/dist/esm/transport/noise/WaClientPayload.js +10 -10
- package/dist/esm/transport/noise/WaNoiseCert.js +3 -3
- package/dist/esm/transport/noise/WaNoiseSession.js +64 -23
- package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
- package/dist/esm/transport/stream/parse.js +8 -4
- package/dist/esm/util/bytes.js +22 -18
- package/dist/esm/util/index.js +5 -0
- package/dist/esm/util/primitives.js +3 -2
- package/dist/index.js +7 -1
- package/dist/infra/perf/BackgroundQueue.js +482 -0
- package/dist/infra/perf/BoundedTaskQueue.js +3 -1
- package/dist/infra/perf/PromiseDedup.js +24 -0
- package/dist/infra/perf/SharedExclusiveGate.js +113 -0
- package/dist/infra/perf/StoreLock.js +81 -0
- package/dist/media/WaMediaCrypto.js +94 -12
- package/dist/media/WaMediaTransferClient.js +39 -47
- package/dist/media/constants.js +2 -1
- package/dist/message/WaMessageClient.js +26 -19
- package/dist/message/content.js +198 -9
- package/dist/message/icdc.js +81 -0
- package/dist/message/incoming.js +24 -12
- package/dist/message/phash.js +3 -1
- package/dist/message/reporting-token.js +14 -28
- package/dist/protocol/appstate.js +10 -41
- package/dist/protocol/browser.js +10 -18
- package/dist/protocol/constants.js +21 -2
- package/dist/protocol/defaults.js +6 -0
- package/dist/protocol/index.js +8 -5
- package/dist/protocol/jid.js +111 -36
- package/dist/protocol/message.js +62 -2
- package/dist/protocol/nodes.js +2 -0
- package/dist/protocol/notification.js +3 -1
- package/dist/protocol/privacy-token.js +20 -0
- package/dist/protocol/privacy.js +58 -0
- package/dist/protocol/stream.js +27 -2
- package/dist/retry/codec.js +220 -0
- package/dist/retry/constants.js +1 -1
- package/dist/retry/index.js +5 -5
- package/dist/retry/parse.js +51 -30
- package/dist/retry/replay.js +10 -6
- package/dist/retry/tracker.js +50 -12
- package/dist/signal/api/SignalDeviceSyncApi.js +48 -31
- package/dist/signal/api/SignalDigestSyncApi.js +13 -9
- package/dist/signal/api/SignalIdentitySyncApi.js +25 -10
- package/dist/signal/api/SignalMissingPreKeysSyncApi.js +17 -6
- package/dist/signal/api/SignalRotateKeyApi.js +4 -2
- package/dist/signal/api/SignalSessionSyncApi.js +16 -7
- package/dist/signal/api/result-map.js +13 -0
- package/dist/signal/constants.js +1 -5
- package/dist/signal/crypto/WaAdvSignature.js +11 -5
- package/dist/signal/{store/sqlite.js → encoding.js} +79 -25
- package/dist/signal/group/SenderKeyCodec.js +4 -3
- package/dist/signal/group/SenderKeyManager.js +125 -106
- package/dist/signal/index.js +13 -1
- package/dist/signal/registration/keygen.js +6 -2
- package/dist/signal/registration/utils.js +1 -0
- package/dist/signal/session/SignalProtocol.js +150 -74
- package/dist/signal/session/resolver.js +135 -100
- package/dist/store/contracts/privacy-token.store.js +2 -0
- package/dist/store/createStore.js +101 -187
- package/dist/store/index.js +15 -33
- package/dist/store/locks/appstate.lock.js +29 -0
- package/dist/store/locks/auth.lock.js +18 -0
- package/dist/store/locks/contact.lock.js +23 -0
- package/dist/store/locks/device-list.lock.js +23 -0
- package/dist/store/locks/message.lock.js +24 -0
- package/dist/store/locks/participants.lock.js +23 -0
- package/dist/store/locks/privacy-token.lock.js +21 -0
- package/dist/store/locks/retry.lock.js +32 -0
- package/dist/store/locks/sender-key.lock.js +55 -0
- package/dist/store/locks/signal.lock.js +66 -0
- package/dist/store/locks/thread.lock.js +24 -0
- package/dist/store/noop.store.js +1 -1
- package/dist/store/providers/memory/appstate.store.js +22 -24
- package/dist/store/providers/memory/device-list.store.js +10 -5
- package/dist/store/providers/memory/privacy-token.store.js +47 -0
- package/dist/store/providers/memory/retry.store.js +77 -2
- package/dist/store/providers/memory/sender-key.store.js +6 -1
- package/dist/store/providers/memory/signal.store.js +36 -19
- package/dist/transport/WaComms.js +3 -1
- package/dist/transport/WaWebSocket.js +0 -6
- package/dist/transport/binary/constants.js +1 -31
- package/dist/transport/binary/decoder.js +4 -4
- package/dist/transport/binary/encoder.js +8 -15
- package/dist/transport/binary/index.js +0 -4
- package/dist/transport/node/WaNodeOrchestrator.js +24 -18
- package/dist/transport/node/builders/business.js +137 -0
- package/dist/transport/node/builders/global.js +375 -0
- package/dist/transport/node/builders/index.js +18 -9
- package/dist/transport/node/builders/message.js +64 -245
- package/dist/transport/node/builders/pairing.js +0 -26
- package/dist/transport/node/builders/privacy-token.js +46 -0
- package/dist/transport/node/builders/privacy.js +55 -0
- package/dist/transport/node/builders/profile.js +78 -0
- package/dist/transport/node/builders/retry.js +9 -21
- package/dist/transport/node/builders/usync.js +6 -2
- package/dist/transport/node/helpers.js +20 -1
- package/dist/transport/node/usync.js +2 -32
- package/dist/transport/node/xml.js +35 -14
- package/dist/transport/noise/WaClientPayload.js +13 -13
- package/dist/transport/noise/WaNoiseCert.js +2 -2
- package/dist/transport/noise/WaNoiseSession.js +64 -23
- package/dist/transport/noise/WaNoiseSocket.js +8 -4
- package/dist/transport/stream/parse.js +7 -3
- package/dist/types/appstate/encoding.d.ts +7 -0
- package/dist/types/appstate/index.d.ts +3 -3
- package/dist/types/appstate/utils.d.ts +0 -2
- package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +1 -1
- package/dist/types/auth/index.d.ts +0 -2
- package/dist/types/auth/types.d.ts +1 -0
- package/dist/types/client/WaClient.d.ts +27 -12
- package/dist/types/client/WaClientFactory.d.ts +12 -4
- package/dist/types/client/connection/WaConnectionManager.d.ts +2 -0
- package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +3 -1
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +14 -0
- package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -0
- package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
- package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +36 -0
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +6 -0
- package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
- package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +45 -0
- package/dist/types/client/events/devices.d.ts +20 -0
- package/dist/types/client/events/identity.d.ts +9 -0
- package/dist/types/client/events/privacy-token.d.ts +7 -0
- package/dist/types/client/history-sync.d.ts +9 -6
- package/dist/types/client/incoming.d.ts +3 -1
- package/dist/types/client/index.d.ts +1 -1
- package/dist/types/client/mailbox.d.ts +3 -5
- package/dist/types/client/messages.d.ts +1 -2
- package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
- package/dist/types/client/tokens/cs-token.d.ts +10 -0
- package/dist/types/client/tokens/tc-token.d.ts +5 -0
- package/dist/types/client/types.d.ts +51 -3
- package/dist/types/crypto/core/index.d.ts +2 -2
- package/dist/types/crypto/core/nonce.d.ts +2 -0
- package/dist/types/crypto/core/primitives.d.ts +0 -1
- package/dist/types/crypto/core/random.d.ts +1 -0
- package/dist/types/crypto/index.d.ts +1 -0
- package/dist/types/crypto/math/constants.d.ts +4 -2
- package/dist/types/crypto/math/fe.d.ts +30 -0
- package/dist/types/crypto/math/mod.d.ts +0 -2
- package/dist/types/crypto/math/types.d.ts +11 -4
- package/dist/types/index.d.ts +5 -3
- package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
- package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
- package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
- package/dist/types/infra/perf/StoreLock.d.ts +10 -0
- package/dist/types/media/WaMediaCrypto.d.ts +3 -2
- package/dist/types/media/WaMediaTransferClient.d.ts +3 -12
- package/dist/types/media/constants.d.ts +1 -1
- package/dist/types/media/index.d.ts +1 -1
- package/dist/types/media/types.d.ts +10 -2
- package/dist/types/message/content.d.ts +8 -0
- package/dist/types/message/icdc.d.ts +13 -0
- package/dist/types/message/reporting-token.d.ts +0 -1
- package/dist/types/message/types.d.ts +45 -6
- package/dist/types/protocol/appstate.d.ts +0 -11
- package/dist/types/protocol/constants.d.ts +7 -3
- package/dist/types/protocol/defaults.d.ts +6 -0
- package/dist/types/protocol/index.d.ts +1 -2
- package/dist/types/protocol/jid.d.ts +19 -2
- package/dist/types/protocol/message.d.ts +60 -0
- package/dist/types/protocol/nodes.d.ts +2 -0
- package/dist/types/protocol/notification.d.ts +2 -0
- package/dist/types/protocol/privacy-token.d.ts +17 -0
- package/dist/types/protocol/privacy.d.ts +75 -0
- package/dist/types/protocol/stream.d.ts +30 -0
- package/dist/types/retry/codec.d.ts +3 -0
- package/dist/types/retry/index.d.ts +3 -3
- package/dist/types/retry/parse.d.ts +5 -2
- package/dist/types/retry/tracker.d.ts +1 -0
- package/dist/types/retry/types.d.ts +6 -1
- package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +2 -1
- package/dist/types/signal/api/SignalDigestSyncApi.d.ts +6 -0
- package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +2 -0
- package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
- package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
- package/dist/types/signal/api/result-map.d.ts +1 -0
- package/dist/types/signal/constants.d.ts +0 -3
- package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +3 -3
- package/dist/types/signal/group/SenderKeyManager.d.ts +10 -5
- package/dist/types/signal/index.d.ts +2 -0
- package/dist/types/signal/session/SignalProtocol.d.ts +10 -4
- package/dist/types/signal/session/resolver.d.ts +7 -2
- package/dist/types/store/contracts/appstate.store.d.ts +1 -1
- package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
- package/dist/types/store/contracts/retry.store.d.ts +7 -0
- package/dist/types/store/contracts/signal.store.d.ts +7 -0
- package/dist/types/store/createStore.d.ts +1 -1
- package/dist/types/store/index.d.ts +5 -13
- package/dist/types/store/locks/appstate.lock.d.ts +3 -0
- package/dist/types/store/locks/auth.lock.d.ts +3 -0
- package/dist/types/store/locks/contact.lock.d.ts +3 -0
- package/dist/types/store/locks/device-list.lock.d.ts +2 -0
- package/dist/types/store/locks/message.lock.d.ts +3 -0
- package/dist/types/store/locks/participants.lock.d.ts +2 -0
- package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
- package/dist/types/store/locks/retry.lock.d.ts +2 -0
- package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
- package/dist/types/store/locks/signal.lock.d.ts +3 -0
- package/dist/types/store/locks/thread.lock.d.ts +3 -0
- package/dist/types/store/providers/memory/appstate.store.d.ts +1 -1
- package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
- package/dist/types/store/providers/memory/retry.store.d.ts +8 -0
- package/dist/types/store/providers/memory/signal.store.d.ts +2 -1
- package/dist/types/store/types.d.ts +49 -61
- package/dist/types/transport/WaWebSocket.d.ts +0 -1
- package/dist/types/transport/binary/constants.d.ts +0 -30
- package/dist/types/transport/binary/index.d.ts +0 -1
- package/dist/types/transport/node/WaNodeOrchestrator.d.ts +3 -4
- package/dist/types/transport/node/builders/business.d.ts +29 -0
- package/dist/types/transport/node/builders/global.d.ts +102 -0
- package/dist/types/transport/node/builders/index.d.ts +5 -2
- package/dist/types/transport/node/builders/message.d.ts +8 -7
- package/dist/types/transport/node/builders/pairing.d.ts +0 -2
- package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
- package/dist/types/transport/node/builders/privacy.d.ts +7 -0
- package/dist/types/transport/node/builders/profile.d.ts +8 -0
- package/dist/types/transport/node/builders/retry.d.ts +0 -1
- package/dist/types/transport/node/helpers.d.ts +5 -0
- package/dist/types/transport/noise/WaNoiseSession.d.ts +3 -2
- package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
- package/dist/types/util/bytes.d.ts +1 -1
- package/dist/types/util/index.d.ts +5 -0
- package/dist/types/util/primitives.d.ts +0 -1
- package/dist/util/bytes.js +22 -18
- package/dist/util/index.js +23 -0
- package/dist/util/primitives.js +2 -2
- package/package.json +29 -7
- package/proto/index.js +1 -1
- package/dist/crypto/core/constants.js +0 -4
- package/dist/esm/crypto/core/constants.js +0 -1
- package/dist/esm/retry/outbound.js +0 -82
- package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
- package/dist/esm/store/providers/sqlite/appstate.store.js +0 -250
- package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
- package/dist/esm/store/providers/sqlite/connection.js +0 -245
- package/dist/esm/store/providers/sqlite/contact.store.js +0 -74
- package/dist/esm/store/providers/sqlite/device-list.store.js +0 -127
- package/dist/esm/store/providers/sqlite/message.store.js +0 -132
- package/dist/esm/store/providers/sqlite/migrations.js +0 -347
- package/dist/esm/store/providers/sqlite/participants.store.js +0 -77
- package/dist/esm/store/providers/sqlite/retry.store.js +0 -141
- package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -198
- package/dist/esm/store/providers/sqlite/signal.store.js +0 -435
- package/dist/esm/store/providers/sqlite/table-names.js +0 -107
- package/dist/esm/store/providers/sqlite/thread.store.js +0 -85
- package/dist/retry/outbound.js +0 -87
- package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
- package/dist/store/providers/sqlite/appstate.store.js +0 -254
- package/dist/store/providers/sqlite/auth.store.js +0 -180
- package/dist/store/providers/sqlite/connection.js +0 -281
- package/dist/store/providers/sqlite/contact.store.js +0 -78
- package/dist/store/providers/sqlite/device-list.store.js +0 -131
- package/dist/store/providers/sqlite/message.store.js +0 -136
- package/dist/store/providers/sqlite/migrations.js +0 -350
- package/dist/store/providers/sqlite/participants.store.js +0 -81
- package/dist/store/providers/sqlite/retry.store.js +0 -145
- package/dist/store/providers/sqlite/sender-key.store.js +0 -202
- package/dist/store/providers/sqlite/signal.store.js +0 -439
- package/dist/store/providers/sqlite/table-names.js +0 -113
- package/dist/store/providers/sqlite/thread.store.js +0 -89
- package/dist/types/appstate/store/sqlite.d.ts +0 -7
- package/dist/types/crypto/core/constants.d.ts +0 -1
- package/dist/types/retry/outbound.d.ts +0 -4
- package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
- package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -17
- package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
- package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
- package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -12
- package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -15
- package/dist/types/store/providers/sqlite/message.store.d.ts +0 -13
- package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
- package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -12
- package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -15
- package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -24
- package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -53
- package/dist/types/store/providers/sqlite/table-names.d.ts +0 -5
- package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -13
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { createCipheriv, createDecipheriv, createHash, createHmac } from 'node:crypto';
|
|
2
2
|
import { once } from 'node:events';
|
|
3
|
+
import { createWriteStream } from 'node:fs';
|
|
4
|
+
import { stat, unlink } from 'node:fs/promises';
|
|
5
|
+
import { tmpdir } from 'node:os';
|
|
6
|
+
import { join } from 'node:path';
|
|
3
7
|
import { PassThrough } from 'node:stream';
|
|
4
8
|
import { hkdf } from '../crypto/core/hkdf.js';
|
|
5
9
|
import { aesCbcDecrypt, aesCbcEncrypt, hmacSign, importAesCbcKey, importHmacKey, sha256 } from '../crypto/core/primitives.js';
|
|
6
10
|
import { randomBytesAsync } from '../crypto/core/random.js';
|
|
7
11
|
import { ENC_KEY_END, ENC_KEY_START, HMAC_TRUNCATED_SIZE, IV_SIZE, MAC_KEY_END, MAC_KEY_START, MEDIA_HKDF_SIZE } from './constants.js';
|
|
8
12
|
import { WA_APP_STATE_KEY_TYPES, getWaMediaHkdfInfo } from '../protocol/constants.js';
|
|
9
|
-
import { assertByteLength, concatBytes, EMPTY_BYTES,
|
|
13
|
+
import { assertByteLength, concatBytes, EMPTY_BYTES, toChunkBytes, toBytesView, uint8Equal, uint8TimingSafeEqual } from '../util/bytes.js';
|
|
10
14
|
import { toError } from '../util/primitives.js';
|
|
11
15
|
export class WaMediaCrypto {
|
|
12
16
|
static async generateMediaKey() {
|
|
@@ -77,17 +81,22 @@ export class WaMediaCrypto {
|
|
|
77
81
|
const metadata = pumpEncryption(plaintext, encrypted, keys);
|
|
78
82
|
return { encrypted, metadata };
|
|
79
83
|
}
|
|
80
|
-
static async
|
|
81
|
-
const
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
84
|
+
static async encryptToFile(mediaType, mediaKey, plaintext) {
|
|
85
|
+
const keys = await WaMediaCrypto.deriveKeys(mediaType, mediaKey);
|
|
86
|
+
const filePath = join(tmpdir(), `zapo-enc-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
87
|
+
const output = createWriteStream(filePath);
|
|
88
|
+
try {
|
|
89
|
+
const metadata = await pumpEncryptionToWritable(plaintext, output, keys);
|
|
90
|
+
const fileSize = (await stat(filePath)).size;
|
|
91
|
+
return { filePath, fileSize, ...metadata };
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
await unlink(filePath).catch(() => undefined);
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
static async cleanupEncryptedFile(filePath) {
|
|
99
|
+
await unlink(filePath).catch(() => undefined);
|
|
91
100
|
}
|
|
92
101
|
static async decryptReadable(encrypted, options) {
|
|
93
102
|
const keys = await WaMediaCrypto.deriveKeys(options.mediaType, options.mediaKey);
|
|
@@ -108,6 +117,7 @@ async function pumpEncryption(plaintext, encrypted, keys) {
|
|
|
108
117
|
const encHash = createHash('sha256');
|
|
109
118
|
const hmac = createHmac('sha256', keys.macKey);
|
|
110
119
|
const cipher = createCipheriv('aes-256-cbc', keys.encKey, keys.iv);
|
|
120
|
+
let plaintextLength = 0;
|
|
111
121
|
hmac.update(keys.iv);
|
|
112
122
|
try {
|
|
113
123
|
for await (const chunk of plaintext) {
|
|
@@ -115,6 +125,7 @@ async function pumpEncryption(plaintext, encrypted, keys) {
|
|
|
115
125
|
if (plainChunk.byteLength === 0) {
|
|
116
126
|
continue;
|
|
117
127
|
}
|
|
128
|
+
plaintextLength += plainChunk.byteLength;
|
|
118
129
|
plainHash.update(plainChunk);
|
|
119
130
|
const encryptedChunk = cipher.update(plainChunk);
|
|
120
131
|
if (encryptedChunk.byteLength > 0) {
|
|
@@ -135,7 +146,8 @@ async function pumpEncryption(plaintext, encrypted, keys) {
|
|
|
135
146
|
encrypted.end();
|
|
136
147
|
return {
|
|
137
148
|
fileSha256: toBytesView(plainHash.digest()),
|
|
138
|
-
fileEncSha256: toBytesView(encHash.digest())
|
|
149
|
+
fileEncSha256: toBytesView(encHash.digest()),
|
|
150
|
+
plaintextLength
|
|
139
151
|
};
|
|
140
152
|
}
|
|
141
153
|
catch (error) {
|
|
@@ -144,6 +156,76 @@ async function pumpEncryption(plaintext, encrypted, keys) {
|
|
|
144
156
|
throw normalized;
|
|
145
157
|
}
|
|
146
158
|
}
|
|
159
|
+
async function writeChunkToWritable(stream, chunk) {
|
|
160
|
+
if (chunk.byteLength === 0) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if (stream.write(chunk)) {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
await new Promise((resolve, reject) => {
|
|
167
|
+
const onDrain = () => {
|
|
168
|
+
stream.off('error', onError);
|
|
169
|
+
resolve();
|
|
170
|
+
};
|
|
171
|
+
const onError = (err) => {
|
|
172
|
+
stream.off('drain', onDrain);
|
|
173
|
+
reject(err);
|
|
174
|
+
};
|
|
175
|
+
stream.once('drain', onDrain);
|
|
176
|
+
stream.once('error', onError);
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
async function endWritable(stream) {
|
|
180
|
+
return new Promise((resolve, reject) => {
|
|
181
|
+
stream.on('error', reject);
|
|
182
|
+
stream.end(() => resolve());
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
async function pumpEncryptionToWritable(plaintext, output, keys) {
|
|
186
|
+
const plainHash = createHash('sha256');
|
|
187
|
+
const encHash = createHash('sha256');
|
|
188
|
+
const hmac = createHmac('sha256', keys.macKey);
|
|
189
|
+
const cipher = createCipheriv('aes-256-cbc', keys.encKey, keys.iv);
|
|
190
|
+
let plaintextLength = 0;
|
|
191
|
+
hmac.update(keys.iv);
|
|
192
|
+
try {
|
|
193
|
+
for await (const chunk of plaintext) {
|
|
194
|
+
const plainChunk = toChunkBytes(chunk);
|
|
195
|
+
if (plainChunk.byteLength === 0) {
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
plaintextLength += plainChunk.byteLength;
|
|
199
|
+
plainHash.update(plainChunk);
|
|
200
|
+
const encryptedChunk = cipher.update(plainChunk);
|
|
201
|
+
if (encryptedChunk.byteLength > 0) {
|
|
202
|
+
hmac.update(encryptedChunk);
|
|
203
|
+
encHash.update(encryptedChunk);
|
|
204
|
+
await writeChunkToWritable(output, encryptedChunk);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
const encryptedFinal = cipher.final();
|
|
208
|
+
if (encryptedFinal.byteLength > 0) {
|
|
209
|
+
hmac.update(encryptedFinal);
|
|
210
|
+
encHash.update(encryptedFinal);
|
|
211
|
+
await writeChunkToWritable(output, encryptedFinal);
|
|
212
|
+
}
|
|
213
|
+
const signature = hmac.digest().subarray(0, HMAC_TRUNCATED_SIZE);
|
|
214
|
+
encHash.update(signature);
|
|
215
|
+
await writeChunkToWritable(output, signature);
|
|
216
|
+
await endWritable(output);
|
|
217
|
+
return {
|
|
218
|
+
fileSha256: toBytesView(plainHash.digest()),
|
|
219
|
+
fileEncSha256: toBytesView(encHash.digest()),
|
|
220
|
+
plaintextLength
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
const normalized = toError(error);
|
|
225
|
+
output.destroy(normalized);
|
|
226
|
+
throw normalized;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
147
229
|
async function pumpDecryption(encrypted, plaintext, keys, options) {
|
|
148
230
|
const plainHash = createHash('sha256');
|
|
149
231
|
const encHash = createHash('sha256');
|
|
@@ -86,14 +86,16 @@ export class WaMediaTransferClient {
|
|
|
86
86
|
urls: urls.length,
|
|
87
87
|
timeoutMs
|
|
88
88
|
});
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
89
|
+
const result = await this.fetchWithFallback(urls, timeoutMs, request.signal, (url, signal) => this.transferRequest(url, {
|
|
90
|
+
method: 'GET',
|
|
91
|
+
headers,
|
|
92
|
+
signal
|
|
93
|
+
}, dispatcher, agent));
|
|
94
|
+
this.logger?.trace('media download stream response', {
|
|
95
|
+
url: result.url,
|
|
96
|
+
status: result.status
|
|
96
97
|
});
|
|
98
|
+
return result;
|
|
97
99
|
}
|
|
98
100
|
async downloadBytes(request) {
|
|
99
101
|
const response = await this.downloadStream(request);
|
|
@@ -101,7 +103,9 @@ export class WaMediaTransferClient {
|
|
|
101
103
|
if (!response.body) {
|
|
102
104
|
return EMPTY_BYTES;
|
|
103
105
|
}
|
|
104
|
-
return
|
|
106
|
+
return readAllBytes(response.body, {
|
|
107
|
+
maxBytes: request.maxBytes ?? this.defaultMaxReadBytes
|
|
108
|
+
});
|
|
105
109
|
}
|
|
106
110
|
async uploadStream(request) {
|
|
107
111
|
const bodyIsBytes = request.body instanceof Uint8Array;
|
|
@@ -125,26 +129,28 @@ export class WaMediaTransferClient {
|
|
|
125
129
|
timeoutMs,
|
|
126
130
|
method
|
|
127
131
|
});
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
send: async (url, signal) => {
|
|
131
|
-
if (bodyIsBytes) {
|
|
132
|
-
return this.transferRequest(url, {
|
|
133
|
-
method,
|
|
134
|
-
headers,
|
|
135
|
-
signal,
|
|
136
|
-
body: request.body
|
|
137
|
-
}, dispatcher, agent);
|
|
138
|
-
}
|
|
132
|
+
const result = await this.fetchWithFallback(uploadUrls, timeoutMs, request.signal, async (url, signal) => {
|
|
133
|
+
if (bodyIsBytes) {
|
|
139
134
|
return this.transferRequest(url, {
|
|
140
135
|
method,
|
|
141
136
|
headers,
|
|
142
137
|
signal,
|
|
143
|
-
body: request.body
|
|
144
|
-
duplex: 'half'
|
|
138
|
+
body: request.body
|
|
145
139
|
}, dispatcher, agent);
|
|
146
140
|
}
|
|
141
|
+
return this.transferRequest(url, {
|
|
142
|
+
method,
|
|
143
|
+
headers,
|
|
144
|
+
signal,
|
|
145
|
+
body: request.body,
|
|
146
|
+
duplex: 'half'
|
|
147
|
+
}, dispatcher, agent);
|
|
148
|
+
});
|
|
149
|
+
this.logger?.trace('media upload stream response', {
|
|
150
|
+
url: result.url,
|
|
151
|
+
status: result.status
|
|
147
152
|
});
|
|
153
|
+
return result;
|
|
148
154
|
}
|
|
149
155
|
async uploadEncrypted(request) {
|
|
150
156
|
this.logger?.info('media encrypted upload start', {
|
|
@@ -181,7 +187,8 @@ export class WaMediaTransferClient {
|
|
|
181
187
|
transfer,
|
|
182
188
|
mediaKey,
|
|
183
189
|
fileSha256: metadata.fileSha256,
|
|
184
|
-
fileEncSha256: metadata.fileEncSha256
|
|
190
|
+
fileEncSha256: metadata.fileEncSha256,
|
|
191
|
+
plaintextLength: metadata.plaintextLength
|
|
185
192
|
};
|
|
186
193
|
}
|
|
187
194
|
async downloadAndDecrypt(request) {
|
|
@@ -190,8 +197,12 @@ export class WaMediaTransferClient {
|
|
|
190
197
|
});
|
|
191
198
|
const decrypted = await this.downloadAndDecryptStream(request);
|
|
192
199
|
try {
|
|
193
|
-
const plaintext = await
|
|
194
|
-
|
|
200
|
+
const [plaintext] = await Promise.all([
|
|
201
|
+
readAllBytes(decrypted.plaintext, {
|
|
202
|
+
maxBytes: request.maxBytes ?? this.defaultMaxReadBytes
|
|
203
|
+
}),
|
|
204
|
+
decrypted.metadata
|
|
205
|
+
]);
|
|
195
206
|
this.logger?.info('media encrypted download completed', {
|
|
196
207
|
byteLength: plaintext.byteLength
|
|
197
208
|
});
|
|
@@ -225,7 +236,7 @@ export class WaMediaTransferClient {
|
|
|
225
236
|
if (!response.body) {
|
|
226
237
|
return EMPTY_BYTES;
|
|
227
238
|
}
|
|
228
|
-
return
|
|
239
|
+
return readAllBytes(response.body, { maxBytes: maxBytes ?? this.defaultMaxReadBytes });
|
|
229
240
|
}
|
|
230
241
|
async transferRequest(url, init, dispatcher, agent) {
|
|
231
242
|
if (agent) {
|
|
@@ -246,7 +257,7 @@ export class WaMediaTransferClient {
|
|
|
246
257
|
return {
|
|
247
258
|
status: response.status,
|
|
248
259
|
ok: response.ok,
|
|
249
|
-
headers:
|
|
260
|
+
headers: Object.fromEntries(response.headers.entries()),
|
|
250
261
|
body: response.body
|
|
251
262
|
? Readable.fromWeb(response.body)
|
|
252
263
|
: null,
|
|
@@ -362,14 +373,6 @@ export class WaMediaTransferClient {
|
|
|
362
373
|
timeoutMs: request.timeoutMs ?? this.defaultTimeoutMs
|
|
363
374
|
};
|
|
364
375
|
}
|
|
365
|
-
async executeTransfer(urls, timeoutMs, signal, options) {
|
|
366
|
-
const result = await this.fetchWithFallback(urls, timeoutMs, signal, options.send);
|
|
367
|
-
this.logger?.trace(options.responseLog, {
|
|
368
|
-
url: result.url,
|
|
369
|
-
status: result.status
|
|
370
|
-
});
|
|
371
|
-
return result;
|
|
372
|
-
}
|
|
373
376
|
async prepareEncryptedUpload(request, mediaKey) {
|
|
374
377
|
if (request.plaintext instanceof Uint8Array) {
|
|
375
378
|
const encrypted = await WaMediaCrypto.encryptBytes(request.mediaType, mediaKey, request.plaintext);
|
|
@@ -378,7 +381,8 @@ export class WaMediaTransferClient {
|
|
|
378
381
|
contentLength: encrypted.ciphertextHmac.byteLength,
|
|
379
382
|
metadata: Promise.resolve({
|
|
380
383
|
fileSha256: encrypted.fileSha256,
|
|
381
|
-
fileEncSha256: encrypted.fileEncSha256
|
|
384
|
+
fileEncSha256: encrypted.fileEncSha256,
|
|
385
|
+
plaintextLength: request.plaintext.byteLength
|
|
382
386
|
}),
|
|
383
387
|
cleanup: async () => undefined
|
|
384
388
|
};
|
|
@@ -432,11 +436,6 @@ export class WaMediaTransferClient {
|
|
|
432
436
|
}
|
|
433
437
|
return resolved;
|
|
434
438
|
}
|
|
435
|
-
readAllBytesWithLimit(stream, maxBytes) {
|
|
436
|
-
return readAllBytes(stream, {
|
|
437
|
-
maxBytes: maxBytes ?? this.defaultMaxReadBytes
|
|
438
|
-
});
|
|
439
|
-
}
|
|
440
439
|
async fetchWithFallback(urls, timeoutMs, signal, send) {
|
|
441
440
|
let lastError = null;
|
|
442
441
|
for (let index = 0; index < urls.length; index += 1) {
|
|
@@ -506,13 +505,6 @@ export class WaMediaTransferClient {
|
|
|
506
505
|
}
|
|
507
506
|
};
|
|
508
507
|
}
|
|
509
|
-
headersToRecord(headers) {
|
|
510
|
-
const output = {};
|
|
511
|
-
headers.forEach((value, key) => {
|
|
512
|
-
output[key] = value;
|
|
513
|
-
});
|
|
514
|
-
return output;
|
|
515
|
-
}
|
|
516
508
|
async drainBody(body) {
|
|
517
509
|
if (!body) {
|
|
518
510
|
return;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { describeAckNode, isAckOrReceiptNode, isNegativeAckNode, isRetryableNegativeAck } from './ack.js';
|
|
2
2
|
import { WA_DEFAULTS, WA_MESSAGE_TAGS, WA_MESSAGE_TYPES, WA_NODE_TAGS } from '../protocol/constants.js';
|
|
3
|
+
import { buildReceiptNode } from '../transport/node/builders/global.js';
|
|
3
4
|
import { delay } from '../util/async.js';
|
|
4
5
|
import { parseOptionalInt, toError } from '../util/primitives.js';
|
|
5
6
|
const WA_RETRYABLE_PUBLISH_ERROR_RE = /timeout|socket|connection|closed/i;
|
|
@@ -112,6 +113,9 @@ export class WaMessageClient {
|
|
|
112
113
|
if (input.id) {
|
|
113
114
|
attrs.id = input.id;
|
|
114
115
|
}
|
|
116
|
+
if (input.edit) {
|
|
117
|
+
attrs.edit = input.edit;
|
|
118
|
+
}
|
|
115
119
|
if (input.category) {
|
|
116
120
|
attrs.category = input.category;
|
|
117
121
|
}
|
|
@@ -131,6 +135,9 @@ export class WaMessageClient {
|
|
|
131
135
|
v: WA_MESSAGE_TYPES.ENC_VERSION,
|
|
132
136
|
type: input.encType
|
|
133
137
|
};
|
|
138
|
+
if (input.mediatype) {
|
|
139
|
+
encAttrs.mediatype = input.mediatype;
|
|
140
|
+
}
|
|
134
141
|
if (input.encCount !== undefined && input.encCount > 0) {
|
|
135
142
|
encAttrs.count = String(Math.trunc(input.encCount));
|
|
136
143
|
}
|
|
@@ -148,6 +155,9 @@ export class WaMessageClient {
|
|
|
148
155
|
content: input.deviceIdentity
|
|
149
156
|
});
|
|
150
157
|
}
|
|
158
|
+
if (input.metaNode) {
|
|
159
|
+
content.push(input.metaNode);
|
|
160
|
+
}
|
|
151
161
|
const node = {
|
|
152
162
|
tag: WA_MESSAGE_TAGS.MESSAGE,
|
|
153
163
|
attrs,
|
|
@@ -156,29 +166,26 @@ export class WaMessageClient {
|
|
|
156
166
|
return node;
|
|
157
167
|
}
|
|
158
168
|
async sendReceipt(input) {
|
|
159
|
-
const
|
|
169
|
+
const node = buildReceiptNode({
|
|
170
|
+
kind: 'outbound',
|
|
160
171
|
to: input.to,
|
|
161
172
|
id: input.id,
|
|
162
|
-
type: input.type ?? 'read'
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
attrs.t = input.t;
|
|
172
|
-
}
|
|
173
|
-
this.logger.debug('sending receipt node', {
|
|
174
|
-
to: attrs.to,
|
|
175
|
-
id: attrs.id,
|
|
176
|
-
type: attrs.type
|
|
173
|
+
type: input.type ?? 'read',
|
|
174
|
+
participant: input.participant,
|
|
175
|
+
recipient: input.recipient,
|
|
176
|
+
category: input.category,
|
|
177
|
+
from: input.from,
|
|
178
|
+
t: input.t,
|
|
179
|
+
peerParticipantPn: input.peerParticipantPn,
|
|
180
|
+
listIds: input.listIds,
|
|
181
|
+
content: input.content ? [...input.content] : undefined
|
|
177
182
|
});
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
attrs
|
|
183
|
+
this.logger.debug('sending receipt node', {
|
|
184
|
+
to: node.attrs.to,
|
|
185
|
+
id: node.attrs.id,
|
|
186
|
+
type: node.attrs.type
|
|
181
187
|
});
|
|
188
|
+
await this.sendNode(node);
|
|
182
189
|
}
|
|
183
190
|
isRetryablePublishError(error) {
|
|
184
191
|
return WA_RETRYABLE_PUBLISH_ERROR_RE.test(error.message);
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { proto } from '../proto.js';
|
|
2
|
+
import { WA_EDIT_ATTRS, WA_ENC_MEDIA_TYPES, WA_EVENT_META_TYPES, WA_POLL_META_TYPES, WA_STANZA_MSG_TYPES } from '../protocol/constants.js';
|
|
1
3
|
export function isSendMediaMessage(content) {
|
|
2
4
|
return (!!content &&
|
|
3
5
|
typeof content === 'object' &&
|
|
@@ -5,16 +7,200 @@ export function isSendMediaMessage(content) {
|
|
|
5
7
|
'media' in content &&
|
|
6
8
|
'mimetype' in content);
|
|
7
9
|
}
|
|
10
|
+
function unwrapMessage(message) {
|
|
11
|
+
let msg = message;
|
|
12
|
+
for (;;) {
|
|
13
|
+
const inner = msg.ephemeralMessage?.message ??
|
|
14
|
+
msg.groupMentionedMessage?.message ??
|
|
15
|
+
msg.botInvokeMessage?.message ??
|
|
16
|
+
msg.deviceSentMessage?.message ??
|
|
17
|
+
msg.viewOnceMessage?.message ??
|
|
18
|
+
msg.viewOnceMessageV2?.message ??
|
|
19
|
+
msg.documentWithCaptionMessage?.message;
|
|
20
|
+
if (!inner)
|
|
21
|
+
return msg;
|
|
22
|
+
msg = inner;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
8
25
|
export function resolveMessageTypeAttr(message) {
|
|
9
|
-
|
|
10
|
-
|
|
26
|
+
const msg = unwrapMessage(message);
|
|
27
|
+
if (msg.reactionMessage || msg.encReactionMessage) {
|
|
28
|
+
return WA_STANZA_MSG_TYPES.REACTION;
|
|
29
|
+
}
|
|
30
|
+
if (msg.eventMessage ||
|
|
31
|
+
msg.encEventResponseMessage ||
|
|
32
|
+
msg.secretEncryptedMessage?.secretEncType ===
|
|
33
|
+
proto.Message.SecretEncryptedMessage.SecretEncType.EVENT_EDIT) {
|
|
34
|
+
return WA_STANZA_MSG_TYPES.EVENT;
|
|
35
|
+
}
|
|
36
|
+
if (msg.pollCreationMessage ||
|
|
37
|
+
msg.pollCreationMessageV2 ||
|
|
38
|
+
msg.pollCreationMessageV3 ||
|
|
39
|
+
msg.pollCreationMessageV5 ||
|
|
40
|
+
msg.pollUpdateMessage ||
|
|
41
|
+
msg.secretEncryptedMessage?.secretEncType ===
|
|
42
|
+
proto.Message.SecretEncryptedMessage.SecretEncType.POLL_EDIT ||
|
|
43
|
+
msg.secretEncryptedMessage?.secretEncType ===
|
|
44
|
+
proto.Message.SecretEncryptedMessage.SecretEncType.POLL_ADD_OPTION) {
|
|
45
|
+
return WA_STANZA_MSG_TYPES.POLL;
|
|
46
|
+
}
|
|
47
|
+
if (msg.extendedTextMessage?.matchedText && msg.extendedTextMessage.matchedText.trim() !== '') {
|
|
48
|
+
return WA_STANZA_MSG_TYPES.MEDIA;
|
|
49
|
+
}
|
|
50
|
+
if ((msg.conversation !== undefined && msg.conversation !== null) ||
|
|
51
|
+
(msg.extendedTextMessage && !msg.extendedTextMessage.matchedText) ||
|
|
52
|
+
msg.protocolMessage ||
|
|
53
|
+
msg.interactiveMessage ||
|
|
54
|
+
msg.keepInChatMessage ||
|
|
55
|
+
msg.requestPhoneNumberMessage ||
|
|
56
|
+
msg.editedMessage ||
|
|
57
|
+
msg.pinInChatMessage ||
|
|
58
|
+
msg.encCommentMessage ||
|
|
59
|
+
msg.newsletterAdminInviteMessage ||
|
|
60
|
+
msg.pollResultSnapshotMessage ||
|
|
61
|
+
msg.pollResultSnapshotMessageV3 ||
|
|
62
|
+
msg.templateButtonReplyMessage ||
|
|
63
|
+
msg.messageHistoryNotice ||
|
|
64
|
+
msg.secretEncryptedMessage?.secretEncType ===
|
|
65
|
+
proto.Message.SecretEncryptedMessage.SecretEncType.MESSAGE_EDIT ||
|
|
66
|
+
msg.secretEncryptedMessage?.secretEncType ===
|
|
67
|
+
proto.Message.SecretEncryptedMessage.SecretEncType.MESSAGE_SCHEDULE) {
|
|
68
|
+
return WA_STANZA_MSG_TYPES.TEXT;
|
|
69
|
+
}
|
|
70
|
+
return WA_STANZA_MSG_TYPES.MEDIA;
|
|
71
|
+
}
|
|
72
|
+
const REVOKED_REACTION_TEXT = '';
|
|
73
|
+
export function resolveEditAttr(message, subtype) {
|
|
74
|
+
const msg = unwrapMessage(message);
|
|
75
|
+
if (msg.protocolMessage) {
|
|
76
|
+
const protocolType = msg.protocolMessage.type;
|
|
77
|
+
if (protocolType === proto.Message.ProtocolMessage.Type.REVOKE) {
|
|
78
|
+
return subtype === 'admin_revoke'
|
|
79
|
+
? WA_EDIT_ATTRS.ADMIN_REVOKE
|
|
80
|
+
: WA_EDIT_ATTRS.SENDER_REVOKE;
|
|
81
|
+
}
|
|
82
|
+
if (protocolType === proto.Message.ProtocolMessage.Type.MESSAGE_EDIT) {
|
|
83
|
+
return WA_EDIT_ATTRS.MESSAGE_EDIT;
|
|
84
|
+
}
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
if (msg.secretEncryptedMessage) {
|
|
88
|
+
const encType = msg.secretEncryptedMessage.secretEncType;
|
|
89
|
+
if (encType === proto.Message.SecretEncryptedMessage.SecretEncType.EVENT_EDIT ||
|
|
90
|
+
encType === proto.Message.SecretEncryptedMessage.SecretEncType.MESSAGE_EDIT) {
|
|
91
|
+
return WA_EDIT_ATTRS.MESSAGE_EDIT;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (msg.editedMessage) {
|
|
95
|
+
return WA_EDIT_ATTRS.MESSAGE_EDIT;
|
|
96
|
+
}
|
|
97
|
+
if (msg.reactionMessage) {
|
|
98
|
+
if (msg.reactionMessage.text === REVOKED_REACTION_TEXT) {
|
|
99
|
+
return WA_EDIT_ATTRS.SENDER_REVOKE;
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
if (msg.keepInChatMessage) {
|
|
104
|
+
if (msg.keepInChatMessage.key?.fromMe === true &&
|
|
105
|
+
msg.keepInChatMessage.keepType === proto.KeepType.UNDO_KEEP_FOR_ALL) {
|
|
106
|
+
return WA_EDIT_ATTRS.SENDER_REVOKE;
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
if (msg.pinInChatMessage) {
|
|
111
|
+
return WA_EDIT_ATTRS.PIN_IN_CHAT;
|
|
112
|
+
}
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
export function resolveEncMediaType(message) {
|
|
116
|
+
const msg = unwrapMessage(message);
|
|
117
|
+
if (msg.imageMessage)
|
|
118
|
+
return WA_ENC_MEDIA_TYPES.IMAGE;
|
|
119
|
+
if (msg.stickerMessage)
|
|
120
|
+
return WA_ENC_MEDIA_TYPES.STICKER;
|
|
121
|
+
if (msg.locationMessage) {
|
|
122
|
+
return msg.locationMessage.isLive
|
|
123
|
+
? WA_ENC_MEDIA_TYPES.LIVE_LOCATION
|
|
124
|
+
: WA_ENC_MEDIA_TYPES.LOCATION;
|
|
125
|
+
}
|
|
126
|
+
if (msg.contactMessage)
|
|
127
|
+
return WA_ENC_MEDIA_TYPES.VCARD;
|
|
128
|
+
if (msg.contactsArrayMessage)
|
|
129
|
+
return WA_ENC_MEDIA_TYPES.CONTACT_ARRAY;
|
|
130
|
+
if (msg.documentMessage)
|
|
131
|
+
return WA_ENC_MEDIA_TYPES.DOCUMENT;
|
|
132
|
+
if (msg.audioMessage) {
|
|
133
|
+
return msg.audioMessage.ptt ? WA_ENC_MEDIA_TYPES.PTT : WA_ENC_MEDIA_TYPES.AUDIO;
|
|
134
|
+
}
|
|
135
|
+
if (msg.videoMessage) {
|
|
136
|
+
return msg.videoMessage.gifPlayback ? WA_ENC_MEDIA_TYPES.GIF : WA_ENC_MEDIA_TYPES.VIDEO;
|
|
137
|
+
}
|
|
138
|
+
if (msg.ptvMessage)
|
|
139
|
+
return WA_ENC_MEDIA_TYPES.PTV;
|
|
140
|
+
if (msg.buttonsMessage)
|
|
141
|
+
return WA_ENC_MEDIA_TYPES.BUTTON;
|
|
142
|
+
if (msg.buttonsResponseMessage)
|
|
143
|
+
return WA_ENC_MEDIA_TYPES.BUTTON_RESPONSE;
|
|
144
|
+
if (msg.listMessage)
|
|
145
|
+
return WA_ENC_MEDIA_TYPES.LIST;
|
|
146
|
+
if (msg.listResponseMessage)
|
|
147
|
+
return WA_ENC_MEDIA_TYPES.LIST_RESPONSE;
|
|
148
|
+
if (msg.orderMessage)
|
|
149
|
+
return WA_ENC_MEDIA_TYPES.ORDER;
|
|
150
|
+
if (msg.productMessage)
|
|
151
|
+
return WA_ENC_MEDIA_TYPES.PRODUCT;
|
|
152
|
+
if (msg.groupInviteMessage)
|
|
153
|
+
return WA_ENC_MEDIA_TYPES.URL;
|
|
154
|
+
if (msg.interactiveResponseMessage)
|
|
155
|
+
return WA_ENC_MEDIA_TYPES.NATIVE_FLOW_RESPONSE;
|
|
156
|
+
if (msg.messageHistoryBundle)
|
|
157
|
+
return WA_ENC_MEDIA_TYPES.GROUP_HISTORY;
|
|
158
|
+
if (msg.extendedTextMessage?.matchedText && msg.extendedTextMessage.matchedText.trim() !== '') {
|
|
159
|
+
return WA_ENC_MEDIA_TYPES.URL;
|
|
160
|
+
}
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
export function resolveMetaAttrs(message) {
|
|
164
|
+
const msg = unwrapMessage(message);
|
|
165
|
+
let polltype;
|
|
166
|
+
let eventType;
|
|
167
|
+
let viewOnce;
|
|
168
|
+
if (msg.pollCreationMessage || msg.pollCreationMessageV2 || msg.pollCreationMessageV3) {
|
|
169
|
+
polltype = WA_POLL_META_TYPES.CREATION;
|
|
170
|
+
}
|
|
171
|
+
else if (msg.pollUpdateMessage) {
|
|
172
|
+
polltype = WA_POLL_META_TYPES.VOTE;
|
|
173
|
+
}
|
|
174
|
+
else if (msg.secretEncryptedMessage?.secretEncType ===
|
|
175
|
+
proto.Message.SecretEncryptedMessage.SecretEncType.POLL_EDIT) {
|
|
176
|
+
polltype = WA_POLL_META_TYPES.EDIT;
|
|
177
|
+
}
|
|
178
|
+
else if (msg.secretEncryptedMessage?.secretEncType ===
|
|
179
|
+
proto.Message.SecretEncryptedMessage.SecretEncType.POLL_ADD_OPTION) {
|
|
180
|
+
polltype = WA_POLL_META_TYPES.EDIT;
|
|
181
|
+
}
|
|
182
|
+
if (msg.eventMessage) {
|
|
183
|
+
eventType = WA_EVENT_META_TYPES.CREATION;
|
|
184
|
+
}
|
|
185
|
+
else if (msg.encEventResponseMessage) {
|
|
186
|
+
eventType = WA_EVENT_META_TYPES.RESPONSE;
|
|
187
|
+
}
|
|
188
|
+
else if (msg.secretEncryptedMessage?.secretEncType ===
|
|
189
|
+
proto.Message.SecretEncryptedMessage.SecretEncType.EVENT_EDIT) {
|
|
190
|
+
eventType = WA_EVENT_META_TYPES.EDIT;
|
|
191
|
+
}
|
|
192
|
+
if (message.viewOnceMessage || message.viewOnceMessageV2) {
|
|
193
|
+
viewOnce = 'true';
|
|
11
194
|
}
|
|
12
|
-
if (
|
|
13
|
-
|
|
14
|
-
message.audioMessage ||
|
|
15
|
-
message.documentMessage ||
|
|
16
|
-
message.stickerMessage) {
|
|
17
|
-
return 'media';
|
|
195
|
+
if (!polltype && !eventType && !viewOnce) {
|
|
196
|
+
return null;
|
|
18
197
|
}
|
|
19
|
-
|
|
198
|
+
const attrs = {};
|
|
199
|
+
if (polltype)
|
|
200
|
+
attrs.polltype = polltype;
|
|
201
|
+
if (eventType)
|
|
202
|
+
attrs.event_type = eventType;
|
|
203
|
+
if (viewOnce)
|
|
204
|
+
attrs.view_once = viewOnce;
|
|
205
|
+
return attrs;
|
|
20
206
|
}
|