zapo-js 0.1.0 → 0.1.2
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 -7
- package/dist/appstate/WaAppStateCrypto.js +18 -25
- package/dist/appstate/WaAppStateSyncClient.js +181 -114
- package/dist/appstate/WaAppStateSyncResponseParser.js +16 -5
- package/dist/appstate/constants.js +4 -3
- package/dist/appstate/utils.js +10 -30
- package/dist/auth/WaAuthClient.js +48 -55
- package/dist/auth/flow/WaAuthCredentialsFlow.js +21 -14
- package/dist/auth/index.js +1 -3
- package/dist/auth/pairing/WaPairingFlow.js +21 -23
- package/dist/auth/pairing/WaQrFlow.js +37 -24
- package/dist/client/WaClient.js +103 -276
- package/dist/client/WaClientFactory.js +227 -110
- package/dist/client/connection/WaConnectionManager.js +292 -0
- package/dist/client/connection/WaKeyShareCoordinator.js +63 -0
- package/dist/client/connection/WaReceiptQueue.js +51 -0
- package/dist/client/coordinators/WaAppStateMutationCoordinator.js +471 -0
- package/dist/client/coordinators/WaGroupCoordinator.js +27 -17
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +20 -27
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +231 -686
- package/dist/client/coordinators/WaRetryCoordinator.js +70 -37
- package/dist/client/dirty.js +35 -29
- package/dist/client/events/chat.js +4 -3
- package/dist/client/events/group.js +59 -36
- package/dist/client/history-sync.js +53 -63
- package/dist/client/incoming.js +23 -20
- package/dist/client/mailbox.js +8 -8
- package/dist/client/messages.js +4 -4
- package/dist/client/messaging/fanout.js +189 -0
- package/dist/client/messaging/key-protocol.js +130 -0
- package/dist/client/messaging/participants.js +191 -0
- package/dist/crypto/core/hkdf.js +3 -8
- package/dist/crypto/core/index.js +1 -4
- package/dist/crypto/core/keys.js +2 -3
- package/dist/crypto/core/primitives.js +12 -15
- package/dist/crypto/core/random.js +7 -26
- package/dist/crypto/curves/Ed25519.js +7 -8
- package/dist/crypto/curves/X25519.js +13 -16
- package/dist/crypto/index.js +0 -5
- package/dist/esm/appstate/WaAppStateCrypto.js +6 -13
- package/dist/esm/appstate/WaAppStateSyncClient.js +174 -107
- package/dist/esm/appstate/WaAppStateSyncResponseParser.js +17 -6
- package/dist/esm/appstate/constants.js +3 -2
- package/dist/esm/appstate/utils.js +8 -27
- package/dist/esm/auth/WaAuthClient.js +48 -55
- package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +21 -14
- package/dist/esm/auth/index.js +0 -1
- package/dist/esm/auth/pairing/WaPairingFlow.js +14 -16
- package/dist/esm/auth/pairing/WaQrFlow.js +37 -24
- package/dist/esm/client/WaClient.js +103 -276
- package/dist/esm/client/WaClientFactory.js +227 -110
- package/dist/esm/client/connection/WaConnectionManager.js +288 -0
- package/dist/esm/client/connection/WaKeyShareCoordinator.js +59 -0
- package/dist/esm/client/connection/WaReceiptQueue.js +47 -0
- package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +467 -0
- package/dist/esm/client/coordinators/WaGroupCoordinator.js +20 -10
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +20 -27
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +232 -687
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +71 -38
- package/dist/esm/client/dirty.js +30 -24
- package/dist/esm/client/events/chat.js +4 -3
- package/dist/esm/client/events/group.js +50 -28
- package/dist/esm/client/history-sync.js +50 -60
- package/dist/esm/client/incoming.js +23 -20
- package/dist/esm/client/mailbox.js +8 -8
- package/dist/esm/client/messages.js +1 -1
- package/dist/esm/client/messaging/fanout.js +186 -0
- package/dist/esm/client/messaging/key-protocol.js +127 -0
- package/dist/esm/client/messaging/participants.js +188 -0
- package/dist/esm/crypto/core/hkdf.js +3 -8
- package/dist/esm/crypto/core/index.js +0 -1
- package/dist/esm/crypto/core/keys.js +2 -3
- package/dist/esm/crypto/core/primitives.js +12 -15
- package/dist/esm/crypto/core/random.js +6 -25
- package/dist/esm/crypto/curves/Ed25519.js +4 -5
- package/dist/esm/crypto/curves/X25519.js +10 -13
- package/dist/esm/crypto/index.js +0 -2
- package/dist/esm/infra/log/ConsoleLogger.js +18 -17
- package/dist/esm/infra/log/PinoLogger.js +15 -9
- package/dist/esm/infra/log/types.js +11 -1
- package/dist/esm/infra/perf/BoundedTaskQueue.js +13 -17
- package/dist/esm/media/WaMediaCrypto.js +2 -4
- package/dist/esm/media/WaMediaTransferClient.js +226 -58
- package/dist/esm/media/conn.js +10 -6
- package/dist/esm/media/constants.js +4 -1
- package/dist/esm/message/WaMessageClient.js +4 -13
- package/dist/esm/message/ack.js +6 -6
- package/dist/esm/message/addon-crypto.js +59 -0
- package/dist/esm/message/incoming.js +106 -111
- package/dist/esm/message/index.js +2 -0
- package/dist/esm/message/reporting-token.js +438 -0
- package/dist/esm/message/use-case-secret.js +49 -0
- package/dist/esm/protocol/appstate.js +58 -0
- package/dist/esm/protocol/constants.js +2 -1
- package/dist/esm/protocol/index.js +2 -10
- package/dist/esm/protocol/jid.js +63 -51
- package/dist/esm/protocol/media.js +3 -3
- package/dist/esm/protocol/nodes.js +2 -0
- package/dist/esm/protocol/usync.js +11 -0
- package/dist/esm/retry/index.js +1 -0
- package/dist/esm/retry/outbound.js +4 -5
- package/dist/esm/retry/parse.js +58 -76
- package/dist/esm/retry/replay.js +48 -49
- package/dist/esm/retry/tracker.js +56 -0
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +249 -82
- package/dist/esm/signal/api/SignalDigestSyncApi.js +6 -1
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +49 -34
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +70 -62
- package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -30
- package/dist/esm/signal/crypto/WaAdvSignature.js +3 -5
- package/dist/esm/signal/group/SenderKeyChain.js +28 -23
- package/dist/esm/signal/group/SenderKeyCodec.js +2 -4
- package/dist/esm/signal/group/SenderKeyManager.js +26 -16
- package/dist/esm/signal/index.js +1 -0
- package/dist/esm/signal/session/SignalProtocol.js +49 -14
- package/dist/esm/signal/session/SignalRatchet.js +24 -15
- package/dist/esm/signal/session/SignalSession.js +14 -9
- package/dist/esm/signal/session/resolver.js +186 -0
- package/dist/esm/signal/store/sqlite.js +16 -37
- package/dist/esm/store/createStore.js +16 -18
- package/dist/esm/store/noop.store.js +3 -6
- package/dist/esm/store/providers/memory/appstate.store.js +30 -6
- package/dist/esm/store/providers/memory/contact.store.js +5 -0
- package/dist/esm/store/providers/memory/device-list.store.js +3 -30
- package/dist/esm/store/providers/memory/message.store.js +11 -5
- package/dist/esm/store/providers/memory/participants.store.js +1 -8
- package/dist/esm/store/providers/memory/sender-key.store.js +5 -7
- package/dist/esm/store/providers/memory/signal.store.js +13 -1
- package/dist/esm/store/providers/memory/thread.store.js +5 -0
- package/dist/esm/store/providers/sqlite/appstate.store.js +82 -1
- package/dist/esm/store/providers/sqlite/connection.js +18 -13
- package/dist/esm/store/providers/sqlite/contact.store.js +31 -18
- package/dist/esm/store/providers/sqlite/device-list.store.js +7 -35
- package/dist/esm/store/providers/sqlite/message.store.js +45 -32
- package/dist/esm/store/providers/sqlite/migrations.js +1 -1
- package/dist/esm/store/providers/sqlite/participants.store.js +1 -9
- package/dist/esm/store/providers/sqlite/retry.store.js +8 -11
- package/dist/esm/store/providers/sqlite/sender-key.store.js +25 -30
- package/dist/esm/store/providers/sqlite/signal.store.js +104 -22
- package/dist/esm/store/providers/sqlite/table-names.js +107 -0
- package/dist/esm/store/providers/sqlite/thread.store.js +35 -22
- package/dist/esm/transport/WaComms.js +25 -23
- package/dist/esm/transport/WaWebSocket.js +115 -12
- package/dist/esm/transport/binary/decoder.js +4 -4
- package/dist/esm/transport/binary/encoder.js +12 -4
- package/dist/esm/transport/index.js +1 -0
- package/dist/esm/transport/keepalive/WaKeepAlive.js +2 -8
- package/dist/esm/transport/node/WaNodeOrchestrator.js +2 -4
- package/dist/esm/transport/node/WaNodeTransport.js +0 -3
- package/dist/esm/transport/node/builders/{accountSync.js → account-sync.js} +16 -36
- package/dist/esm/transport/node/builders/index.js +2 -1
- package/dist/esm/transport/node/builders/message.js +9 -0
- package/dist/esm/transport/node/builders/pairing.js +4 -5
- package/dist/esm/transport/node/builders/usync.js +41 -0
- package/dist/esm/transport/node/helpers.js +107 -5
- package/dist/esm/transport/node/usync.js +35 -0
- package/dist/esm/transport/noise/WaFrameCodec.js +48 -33
- package/dist/esm/transport/noise/WaNoiseCert.js +3 -6
- package/dist/esm/transport/noise/WaNoiseSession.js +17 -10
- package/dist/esm/transport/proxy.js +27 -0
- package/dist/esm/transport/stream/parse.js +13 -48
- package/dist/esm/util/bytes.js +50 -32
- package/dist/esm/util/coercion.js +6 -14
- package/dist/esm/util/primitives.js +39 -14
- package/dist/infra/log/ConsoleLogger.js +18 -17
- package/dist/infra/log/PinoLogger.js +15 -9
- package/dist/infra/log/types.js +12 -0
- package/dist/infra/perf/BoundedTaskQueue.js +13 -17
- package/dist/media/WaMediaCrypto.js +1 -3
- package/dist/media/WaMediaTransferClient.js +259 -58
- package/dist/media/conn.js +10 -6
- package/dist/media/constants.js +4 -1
- package/dist/message/WaMessageClient.js +5 -14
- package/dist/message/ack.js +6 -6
- package/dist/message/addon-crypto.js +65 -0
- package/dist/message/incoming.js +104 -109
- package/dist/message/index.js +2 -0
- package/dist/message/reporting-token.js +443 -0
- package/dist/message/use-case-secret.js +55 -0
- package/dist/protocol/appstate.js +59 -1
- package/dist/protocol/constants.js +7 -1
- package/dist/protocol/index.js +20 -42
- package/dist/protocol/jid.js +64 -51
- package/dist/protocol/media.js +3 -3
- package/dist/protocol/nodes.js +2 -0
- package/dist/protocol/usync.js +14 -0
- package/dist/retry/index.js +3 -1
- package/dist/retry/outbound.js +6 -7
- package/dist/retry/parse.js +57 -75
- package/dist/retry/replay.js +46 -47
- package/dist/retry/tracker.js +59 -0
- package/dist/signal/api/SignalDeviceSyncApi.js +247 -80
- package/dist/signal/api/SignalDigestSyncApi.js +6 -1
- package/dist/signal/api/SignalIdentitySyncApi.js +49 -34
- package/dist/signal/api/SignalMissingPreKeysSyncApi.js +67 -59
- package/dist/signal/api/SignalSessionSyncApi.js +23 -30
- package/dist/signal/crypto/WaAdvSignature.js +2 -4
- package/dist/signal/group/SenderKeyChain.js +27 -22
- package/dist/signal/group/SenderKeyCodec.js +1 -3
- package/dist/signal/group/SenderKeyManager.js +26 -16
- package/dist/signal/index.js +3 -1
- package/dist/signal/session/SignalProtocol.js +49 -14
- package/dist/signal/session/SignalRatchet.js +24 -15
- package/dist/signal/session/SignalSession.js +14 -9
- package/dist/signal/session/resolver.js +189 -0
- package/dist/signal/store/sqlite.js +16 -37
- package/dist/store/createStore.js +16 -18
- package/dist/store/noop.store.js +3 -6
- package/dist/store/providers/memory/appstate.store.js +28 -4
- package/dist/store/providers/memory/contact.store.js +5 -0
- package/dist/store/providers/memory/device-list.store.js +3 -30
- package/dist/store/providers/memory/message.store.js +11 -5
- package/dist/store/providers/memory/participants.store.js +1 -8
- package/dist/store/providers/memory/sender-key.store.js +8 -10
- package/dist/store/providers/memory/signal.store.js +21 -9
- package/dist/store/providers/memory/thread.store.js +5 -0
- package/dist/store/providers/sqlite/appstate.store.js +81 -0
- package/dist/store/providers/sqlite/connection.js +18 -13
- package/dist/store/providers/sqlite/contact.store.js +31 -18
- package/dist/store/providers/sqlite/device-list.store.js +7 -35
- package/dist/store/providers/sqlite/message.store.js +45 -32
- package/dist/store/providers/sqlite/migrations.js +1 -1
- package/dist/store/providers/sqlite/participants.store.js +1 -9
- package/dist/store/providers/sqlite/retry.store.js +8 -11
- package/dist/store/providers/sqlite/sender-key.store.js +24 -29
- package/dist/store/providers/sqlite/signal.store.js +105 -23
- package/dist/store/providers/sqlite/table-names.js +113 -0
- package/dist/store/providers/sqlite/thread.store.js +35 -22
- package/dist/transport/WaComms.js +27 -25
- package/dist/transport/WaWebSocket.js +148 -12
- package/dist/transport/binary/decoder.js +4 -4
- package/dist/transport/binary/encoder.js +12 -4
- package/dist/transport/index.js +7 -1
- package/dist/transport/keepalive/WaKeepAlive.js +1 -7
- package/dist/transport/node/WaNodeOrchestrator.js +2 -4
- package/dist/transport/node/WaNodeTransport.js +0 -3
- package/dist/transport/node/builders/{accountSync.js → account-sync.js} +15 -35
- package/dist/transport/node/builders/index.js +12 -9
- package/dist/transport/node/builders/message.js +9 -0
- package/dist/transport/node/builders/pairing.js +4 -5
- package/dist/transport/node/builders/usync.js +45 -0
- package/dist/transport/node/helpers.js +112 -4
- package/dist/transport/node/usync.js +38 -0
- package/dist/transport/noise/WaFrameCodec.js +47 -32
- package/dist/transport/noise/WaNoiseCert.js +5 -8
- package/dist/transport/noise/WaNoiseSession.js +17 -10
- package/dist/transport/proxy.js +34 -0
- package/dist/transport/stream/parse.js +17 -53
- package/dist/types/appstate/WaAppStateCrypto.d.ts +0 -1
- package/dist/types/appstate/WaAppStateSyncClient.d.ts +5 -2
- package/dist/types/appstate/constants.d.ts +1 -0
- package/dist/types/appstate/store/sqlite.d.ts +4 -18
- package/dist/types/appstate/utils.d.ts +0 -1
- package/dist/types/auth/WaAuthClient.d.ts +10 -12
- package/dist/types/auth/index.d.ts +0 -2
- package/dist/types/auth/pairing/WaQrFlow.d.ts +1 -1
- package/dist/types/auth/types.d.ts +6 -9
- package/dist/types/client/WaClient.d.ts +27 -25
- package/dist/types/client/WaClientFactory.d.ts +22 -23
- package/dist/types/client/connection/WaConnectionManager.d.ts +64 -0
- package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +14 -0
- package/dist/types/client/connection/WaReceiptQueue.d.ts +13 -0
- package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +46 -0
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +0 -1
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +18 -41
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +2 -0
- package/dist/types/client/dirty.d.ts +1 -0
- package/dist/types/client/events/group.d.ts +2 -1
- package/dist/types/client/index.d.ts +1 -1
- package/dist/types/client/messaging/fanout.d.ts +14 -0
- package/dist/types/client/messaging/key-protocol.d.ts +18 -0
- package/dist/types/client/messaging/participants.d.ts +13 -0
- package/dist/types/client/types.d.ts +24 -1
- package/dist/types/crypto/core/hkdf.d.ts +0 -6
- package/dist/types/crypto/core/index.d.ts +0 -1
- package/dist/types/crypto/core/random.d.ts +1 -7
- package/dist/types/crypto/index.d.ts +0 -2
- package/dist/types/index.d.ts +1 -1
- package/dist/types/infra/log/ConsoleLogger.d.ts +2 -1
- package/dist/types/infra/log/PinoLogger.d.ts +1 -1
- package/dist/types/infra/log/types.d.ts +1 -0
- package/dist/types/infra/perf/BoundedTaskQueue.d.ts +1 -1
- package/dist/types/media/WaMediaTransferClient.d.ts +13 -3
- package/dist/types/media/types.d.ts +5 -0
- package/dist/types/message/addon-crypto.d.ts +25 -0
- package/dist/types/message/index.d.ts +2 -0
- package/dist/types/message/reporting-token.d.ts +19 -0
- package/dist/types/message/use-case-secret.d.ts +20 -0
- package/dist/types/protocol/appstate.d.ts +58 -0
- package/dist/types/protocol/constants.d.ts +2 -1
- package/dist/types/protocol/index.d.ts +2 -10
- package/dist/types/protocol/jid.d.ts +3 -3
- package/dist/types/protocol/nodes.d.ts +2 -0
- package/dist/types/protocol/usync.d.ts +11 -0
- package/dist/types/retry/index.d.ts +1 -0
- package/dist/types/retry/replay.d.ts +0 -4
- package/dist/types/retry/tracker.d.ts +19 -0
- package/dist/types/retry/types.d.ts +4 -3
- package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +13 -1
- package/dist/types/signal/group/SenderKeyCodec.d.ts +4 -6
- package/dist/types/signal/index.d.ts +1 -0
- package/dist/types/signal/session/SignalProtocol.d.ts +9 -0
- package/dist/types/signal/session/resolver.d.ts +17 -0
- package/dist/types/store/contracts/appstate.store.d.ts +3 -0
- package/dist/types/store/contracts/contact.store.d.ts +1 -0
- package/dist/types/store/contracts/device-list.store.d.ts +0 -3
- package/dist/types/store/contracts/message.store.d.ts +1 -0
- package/dist/types/store/contracts/participants.store.d.ts +0 -1
- package/dist/types/store/contracts/sender-key.store.d.ts +0 -1
- package/dist/types/store/contracts/signal.store.d.ts +6 -0
- package/dist/types/store/contracts/thread.store.d.ts +1 -0
- package/dist/types/store/index.d.ts +1 -1
- package/dist/types/store/providers/memory/appstate.store.d.ts +2 -0
- package/dist/types/store/providers/memory/contact.store.d.ts +1 -0
- package/dist/types/store/providers/memory/device-list.store.d.ts +0 -3
- package/dist/types/store/providers/memory/message.store.d.ts +1 -0
- package/dist/types/store/providers/memory/participants.store.d.ts +0 -1
- package/dist/types/store/providers/memory/sender-key.store.d.ts +0 -1
- package/dist/types/store/providers/memory/signal.store.d.ts +6 -0
- package/dist/types/store/providers/memory/thread.store.d.ts +1 -0
- package/dist/types/store/providers/sqlite/appstate.store.d.ts +2 -0
- package/dist/types/store/providers/sqlite/contact.store.d.ts +2 -0
- package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -3
- package/dist/types/store/providers/sqlite/message.store.d.ts +2 -0
- package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -1
- package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -1
- package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -1
- package/dist/types/store/providers/sqlite/signal.store.d.ts +7 -0
- package/dist/types/store/providers/sqlite/table-names.d.ts +5 -0
- package/dist/types/store/providers/sqlite/thread.store.d.ts +2 -0
- package/dist/types/store/types.d.ts +3 -0
- package/dist/types/transport/WaWebSocket.d.ts +3 -0
- package/dist/types/transport/index.d.ts +2 -1
- package/dist/types/transport/keepalive/WaKeepAlive.d.ts +0 -1
- package/dist/types/transport/node/WaNodeTransport.d.ts +0 -9
- package/dist/types/transport/node/builders/group.d.ts +4 -6
- package/dist/types/transport/node/builders/index.d.ts +2 -1
- package/dist/types/transport/node/builders/message.d.ts +14 -25
- package/dist/types/transport/node/builders/retry.d.ts +2 -4
- package/dist/types/transport/node/builders/usync.d.ts +21 -0
- package/dist/types/transport/node/helpers.d.ts +8 -0
- package/dist/types/transport/node/usync.d.ts +2 -0
- package/dist/types/transport/noise/WaFrameCodec.d.ts +3 -0
- package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -0
- package/dist/types/transport/proxy.d.ts +6 -0
- package/dist/types/transport/stream/parse.d.ts +0 -1
- package/dist/types/transport/types.d.ts +18 -1
- package/dist/types/util/bytes.d.ts +5 -0
- package/dist/types/util/primitives.d.ts +3 -0
- package/dist/util/bytes.js +55 -33
- package/dist/util/coercion.js +6 -14
- package/dist/util/primitives.js +42 -14
- package/package.json +27 -9
- package/proto/index.d.ts +1090 -1048
- package/proto/index.js +1 -1
- package/scripts/check-node-version.cjs +0 -1
- package/dist/crypto/core/encoding.js +0 -29
- package/dist/esm/crypto/core/encoding.js +0 -25
- package/dist/esm/util/base64.js +0 -18
- package/dist/esm/util/signal-address.js +0 -5
- package/dist/types/crypto/core/encoding.d.ts +0 -11
- package/dist/types/util/base64.d.ts +0 -4
- package/dist/types/util/signal-address.d.ts +0 -2
- package/dist/util/base64.js +0 -24
- package/dist/util/signal-address.js +0 -8
- /package/dist/types/transport/node/builders/{accountSync.d.ts → account-sync.d.ts} +0 -0
|
@@ -1,4 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.WaMediaTransferClient = void 0;
|
|
4
37
|
const node_stream_1 = require("node:stream");
|
|
@@ -7,27 +40,95 @@ const WaMediaCrypto_1 = require("./WaMediaCrypto");
|
|
|
7
40
|
const constants_2 = require("../protocol/constants");
|
|
8
41
|
const bytes_1 = require("../util/bytes");
|
|
9
42
|
const primitives_1 = require("../util/primitives");
|
|
43
|
+
const GOT_OPTIONAL_MODULE = 'got';
|
|
44
|
+
function normalizeHeaderRecord(headers) {
|
|
45
|
+
if (!headers) {
|
|
46
|
+
return {};
|
|
47
|
+
}
|
|
48
|
+
const normalized = {};
|
|
49
|
+
for (const key in headers) {
|
|
50
|
+
normalized[key.toLowerCase()] = headers[key];
|
|
51
|
+
}
|
|
52
|
+
return normalized;
|
|
53
|
+
}
|
|
54
|
+
function asOptionalGotModule(loaded) {
|
|
55
|
+
if (loaded && typeof loaded === 'object') {
|
|
56
|
+
const direct = loaded.stream;
|
|
57
|
+
if (typeof direct === 'function') {
|
|
58
|
+
return loaded;
|
|
59
|
+
}
|
|
60
|
+
const fallback = loaded.default;
|
|
61
|
+
if (fallback &&
|
|
62
|
+
typeof fallback === 'object' &&
|
|
63
|
+
'stream' in fallback &&
|
|
64
|
+
typeof fallback.stream === 'function') {
|
|
65
|
+
return fallback;
|
|
66
|
+
}
|
|
67
|
+
if (typeof fallback === 'function' && 'stream' in fallback) {
|
|
68
|
+
const maybeStream = fallback.stream;
|
|
69
|
+
if (typeof maybeStream === 'function') {
|
|
70
|
+
return fallback;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (typeof loaded === 'function' && 'stream' in loaded) {
|
|
75
|
+
const maybeStream = loaded.stream;
|
|
76
|
+
if (typeof maybeStream === 'function') {
|
|
77
|
+
return loaded;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
async function loadOptionalGotModule() {
|
|
83
|
+
try {
|
|
84
|
+
const loaded = await Promise.resolve(`${GOT_OPTIONAL_MODULE}`).then(s => __importStar(require(s)));
|
|
85
|
+
const module = asOptionalGotModule(loaded);
|
|
86
|
+
if (module) {
|
|
87
|
+
return module;
|
|
88
|
+
}
|
|
89
|
+
throw new Error('invalid got module export');
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
const normalized = (0, primitives_1.toError)(error);
|
|
93
|
+
const code = normalized.code;
|
|
94
|
+
const message = normalized.message ?? '';
|
|
95
|
+
const isModuleNotFound = (code === 'ERR_MODULE_NOT_FOUND' || code === 'MODULE_NOT_FOUND') &&
|
|
96
|
+
(message.includes(`'${GOT_OPTIONAL_MODULE}'`) ||
|
|
97
|
+
message.includes(`"${GOT_OPTIONAL_MODULE}"`));
|
|
98
|
+
if (isModuleNotFound) {
|
|
99
|
+
throw new Error('optional dependency "got" is not installed. Install with: npm i got');
|
|
100
|
+
}
|
|
101
|
+
throw normalized;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
10
104
|
class WaMediaTransferClient {
|
|
11
105
|
constructor(options = {}) {
|
|
12
106
|
this.logger = options.logger;
|
|
13
107
|
this.defaultHosts = options.defaultHosts ?? constants_1.DEFAULT_MEDIA_HOSTS;
|
|
14
108
|
this.defaultTimeoutMs = options.defaultTimeoutMs ?? constants_2.WA_DEFAULTS.MEDIA_TIMEOUT_MS;
|
|
15
109
|
this.defaultMaxReadBytes = options.defaultMaxReadBytes;
|
|
16
|
-
this.defaultHeaders = options.defaultHeaders
|
|
110
|
+
this.defaultHeaders = normalizeHeaderRecord(options.defaultHeaders);
|
|
111
|
+
this.defaultUploadDispatcher = options.defaultUploadDispatcher;
|
|
112
|
+
this.defaultDownloadDispatcher = options.defaultDownloadDispatcher;
|
|
113
|
+
this.defaultUploadAgent = options.defaultUploadAgent;
|
|
114
|
+
this.defaultDownloadAgent = options.defaultDownloadAgent;
|
|
115
|
+
this.gotModulePromise = null;
|
|
17
116
|
}
|
|
18
117
|
async downloadStream(request) {
|
|
19
118
|
const { urls, headers, timeoutMs } = this.resolveTransferRequest(request);
|
|
119
|
+
const dispatcher = request.dispatcher ?? this.defaultDownloadDispatcher;
|
|
120
|
+
const agent = request.agent ?? this.defaultDownloadAgent;
|
|
20
121
|
this.logger?.debug('media download stream start', {
|
|
21
122
|
urls: urls.length,
|
|
22
123
|
timeoutMs
|
|
23
124
|
});
|
|
24
125
|
return this.executeTransfer(urls, timeoutMs, request.signal, {
|
|
25
126
|
responseLog: 'media download stream response',
|
|
26
|
-
send: (url, signal) =>
|
|
127
|
+
send: (url, signal) => this.transferRequest(url, {
|
|
27
128
|
method: 'GET',
|
|
28
129
|
headers,
|
|
29
130
|
signal
|
|
30
|
-
})
|
|
131
|
+
}, dispatcher, agent)
|
|
31
132
|
});
|
|
32
133
|
}
|
|
33
134
|
async downloadBytes(request) {
|
|
@@ -46,6 +147,8 @@ class WaMediaTransferClient {
|
|
|
46
147
|
? String(request.contentLength)
|
|
47
148
|
: undefined
|
|
48
149
|
});
|
|
150
|
+
const dispatcher = request.dispatcher ?? this.defaultUploadDispatcher;
|
|
151
|
+
const agent = request.agent ?? this.defaultUploadAgent;
|
|
49
152
|
const uploadUrls = bodyIsBytes ? urls : urls.slice(0, 1);
|
|
50
153
|
if (!bodyIsBytes && urls.length > 1) {
|
|
51
154
|
this.logger?.warn('upload stream fallback disabled for non-replayable body', {
|
|
@@ -62,20 +165,20 @@ class WaMediaTransferClient {
|
|
|
62
165
|
responseLog: 'media upload stream response',
|
|
63
166
|
send: async (url, signal) => {
|
|
64
167
|
if (bodyIsBytes) {
|
|
65
|
-
return
|
|
168
|
+
return this.transferRequest(url, {
|
|
66
169
|
method,
|
|
67
170
|
headers,
|
|
68
171
|
signal,
|
|
69
172
|
body: request.body
|
|
70
|
-
});
|
|
173
|
+
}, dispatcher, agent);
|
|
71
174
|
}
|
|
72
|
-
return
|
|
175
|
+
return this.transferRequest(url, {
|
|
73
176
|
method,
|
|
74
177
|
headers,
|
|
75
178
|
signal,
|
|
76
179
|
body: request.body,
|
|
77
180
|
duplex: 'half'
|
|
78
|
-
});
|
|
181
|
+
}, dispatcher, agent);
|
|
79
182
|
}
|
|
80
183
|
});
|
|
81
184
|
}
|
|
@@ -92,6 +195,8 @@ class WaMediaTransferClient {
|
|
|
92
195
|
directPath: request.directPath,
|
|
93
196
|
hosts: request.hosts,
|
|
94
197
|
headers: request.headers,
|
|
198
|
+
dispatcher: request.dispatcher,
|
|
199
|
+
agent: request.agent,
|
|
95
200
|
timeoutMs: request.timeoutMs,
|
|
96
201
|
signal: request.signal,
|
|
97
202
|
method: request.method,
|
|
@@ -121,10 +226,8 @@ class WaMediaTransferClient {
|
|
|
121
226
|
});
|
|
122
227
|
const decrypted = await this.downloadAndDecryptStream(request);
|
|
123
228
|
try {
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
decrypted.metadata
|
|
127
|
-
]);
|
|
229
|
+
const plaintext = await this.readAllBytesWithLimit(decrypted.plaintext, request.maxBytes);
|
|
230
|
+
await decrypted.metadata;
|
|
128
231
|
this.logger?.info('media encrypted download completed', {
|
|
129
232
|
byteLength: plaintext.byteLength
|
|
130
233
|
});
|
|
@@ -160,11 +263,133 @@ class WaMediaTransferClient {
|
|
|
160
263
|
}
|
|
161
264
|
return this.readAllBytesWithLimit(response.body, maxBytes);
|
|
162
265
|
}
|
|
266
|
+
async transferRequest(url, init, dispatcher, agent) {
|
|
267
|
+
if (agent) {
|
|
268
|
+
return this.gotWithAgent(url, init, agent);
|
|
269
|
+
}
|
|
270
|
+
return this.fetchWithDispatcher(url, init, dispatcher);
|
|
271
|
+
}
|
|
272
|
+
async fetchWithDispatcher(url, init, dispatcher) {
|
|
273
|
+
const response = !dispatcher
|
|
274
|
+
? await fetch(url, init)
|
|
275
|
+
: await fetch(url, {
|
|
276
|
+
...init,
|
|
277
|
+
dispatcher
|
|
278
|
+
});
|
|
279
|
+
return this.toFetchTransferResponse(response);
|
|
280
|
+
}
|
|
281
|
+
toFetchTransferResponse(response) {
|
|
282
|
+
return {
|
|
283
|
+
status: response.status,
|
|
284
|
+
ok: response.ok,
|
|
285
|
+
headers: this.headersToRecord(response.headers),
|
|
286
|
+
body: response.body
|
|
287
|
+
? node_stream_1.Readable.fromWeb(response.body)
|
|
288
|
+
: null,
|
|
289
|
+
cancel: async () => {
|
|
290
|
+
if (!response.body) {
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
try {
|
|
294
|
+
await response.body.cancel();
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
// ignore cancel errors from remote resets
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
async gotWithAgent(url, init, agent) {
|
|
303
|
+
const got = await this.loadGotModule();
|
|
304
|
+
const urlObj = new URL(url);
|
|
305
|
+
const gotAgent = urlObj.protocol === 'http:'
|
|
306
|
+
? { http: agent }
|
|
307
|
+
: urlObj.protocol === 'https:'
|
|
308
|
+
? { https: agent }
|
|
309
|
+
: { http: agent, https: agent };
|
|
310
|
+
return new Promise((resolve, reject) => {
|
|
311
|
+
const request = got.stream(url, {
|
|
312
|
+
method: init.method,
|
|
313
|
+
headers: (init.headers ?? {}),
|
|
314
|
+
body: init.body,
|
|
315
|
+
signal: init.signal,
|
|
316
|
+
throwHttpErrors: false,
|
|
317
|
+
retry: { limit: 0 },
|
|
318
|
+
agent: gotAgent
|
|
319
|
+
});
|
|
320
|
+
const onError = (error) => {
|
|
321
|
+
request.off('response', onResponse);
|
|
322
|
+
reject((0, primitives_1.toError)(error));
|
|
323
|
+
};
|
|
324
|
+
const onResponse = (incoming) => {
|
|
325
|
+
request.off('error', onError);
|
|
326
|
+
resolve(this.toGotTransferResponse(incoming));
|
|
327
|
+
};
|
|
328
|
+
request.once('error', onError);
|
|
329
|
+
request.once('response', onResponse);
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
async loadGotModule() {
|
|
333
|
+
if (!this.gotModulePromise) {
|
|
334
|
+
this.gotModulePromise = loadOptionalGotModule().catch((error) => {
|
|
335
|
+
this.gotModulePromise = null;
|
|
336
|
+
throw error;
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
return this.gotModulePromise;
|
|
340
|
+
}
|
|
341
|
+
toGotTransferResponse(incoming) {
|
|
342
|
+
if (!incoming || typeof incoming !== 'object') {
|
|
343
|
+
throw new Error('invalid got response object');
|
|
344
|
+
}
|
|
345
|
+
const stream = incoming;
|
|
346
|
+
const status = typeof stream.statusCode === 'number' &&
|
|
347
|
+
Number.isFinite(stream.statusCode) &&
|
|
348
|
+
stream.statusCode >= 100 &&
|
|
349
|
+
stream.statusCode <= 599
|
|
350
|
+
? stream.statusCode
|
|
351
|
+
: 500;
|
|
352
|
+
const headers = {};
|
|
353
|
+
if (stream.headers && typeof stream.headers === 'object') {
|
|
354
|
+
const input = stream.headers;
|
|
355
|
+
for (const key in input) {
|
|
356
|
+
const value = input[key];
|
|
357
|
+
if (typeof value === 'string') {
|
|
358
|
+
headers[key] = value;
|
|
359
|
+
continue;
|
|
360
|
+
}
|
|
361
|
+
if (Array.isArray(value)) {
|
|
362
|
+
headers[key] = value.join(', ');
|
|
363
|
+
continue;
|
|
364
|
+
}
|
|
365
|
+
if (value !== undefined && value !== null) {
|
|
366
|
+
headers[key] = String(value);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
return {
|
|
371
|
+
status,
|
|
372
|
+
ok: status >= 200 && status < 300,
|
|
373
|
+
headers,
|
|
374
|
+
body: stream,
|
|
375
|
+
cancel: async () => {
|
|
376
|
+
stream.destroy();
|
|
377
|
+
}
|
|
378
|
+
};
|
|
379
|
+
}
|
|
163
380
|
resolveTransferRequest(request, extraHeaders) {
|
|
164
|
-
const headers = this.
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
headers[key.toLowerCase()] =
|
|
381
|
+
const headers = { ...this.defaultHeaders };
|
|
382
|
+
if (request.headers) {
|
|
383
|
+
for (const key in request.headers) {
|
|
384
|
+
headers[key.toLowerCase()] = request.headers[key];
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
if (extraHeaders) {
|
|
388
|
+
for (const key in extraHeaders) {
|
|
389
|
+
const value = extraHeaders[key];
|
|
390
|
+
if (value !== undefined) {
|
|
391
|
+
headers[key.toLowerCase()] = value;
|
|
392
|
+
}
|
|
168
393
|
}
|
|
169
394
|
}
|
|
170
395
|
return {
|
|
@@ -177,9 +402,9 @@ class WaMediaTransferClient {
|
|
|
177
402
|
const result = await this.fetchWithFallback(urls, timeoutMs, signal, options.send);
|
|
178
403
|
this.logger?.trace(options.responseLog, {
|
|
179
404
|
url: result.url,
|
|
180
|
-
status: result.
|
|
405
|
+
status: result.status
|
|
181
406
|
});
|
|
182
|
-
return
|
|
407
|
+
return result;
|
|
183
408
|
}
|
|
184
409
|
async prepareEncryptedUpload(request, mediaKey) {
|
|
185
410
|
if (request.plaintext instanceof Uint8Array) {
|
|
@@ -222,34 +447,26 @@ class WaMediaTransferClient {
|
|
|
222
447
|
}
|
|
223
448
|
resolveUrls(url, directPath, hosts) {
|
|
224
449
|
const resolved = [];
|
|
225
|
-
if (url)
|
|
450
|
+
if (url && resolved.indexOf(url) === -1)
|
|
226
451
|
resolved.push(url);
|
|
227
|
-
}
|
|
228
452
|
if (directPath) {
|
|
229
453
|
if (directPath.startsWith('https://') || directPath.startsWith('http://')) {
|
|
230
|
-
resolved.
|
|
454
|
+
if (resolved.indexOf(directPath) === -1)
|
|
455
|
+
resolved.push(directPath);
|
|
231
456
|
}
|
|
232
457
|
else {
|
|
233
458
|
const normalizedPath = directPath.startsWith('/') ? directPath : `/${directPath}`;
|
|
234
459
|
for (const host of hosts ?? this.defaultHosts) {
|
|
235
|
-
|
|
460
|
+
const candidate = `https://${host}${normalizedPath}`;
|
|
461
|
+
if (resolved.indexOf(candidate) === -1)
|
|
462
|
+
resolved.push(candidate);
|
|
236
463
|
}
|
|
237
464
|
}
|
|
238
465
|
}
|
|
239
466
|
if (resolved.length === 0) {
|
|
240
467
|
throw new Error('missing transfer url/directPath');
|
|
241
468
|
}
|
|
242
|
-
return
|
|
243
|
-
}
|
|
244
|
-
mergeHeaders(headers) {
|
|
245
|
-
const merged = {};
|
|
246
|
-
for (const [key, value] of Object.entries(this.defaultHeaders)) {
|
|
247
|
-
merged[key.toLowerCase()] = value;
|
|
248
|
-
}
|
|
249
|
-
for (const [key, value] of Object.entries(headers ?? {})) {
|
|
250
|
-
merged[key.toLowerCase()] = value;
|
|
251
|
-
}
|
|
252
|
-
return merged;
|
|
469
|
+
return resolved;
|
|
253
470
|
}
|
|
254
471
|
readAllBytesWithLimit(stream, maxBytes) {
|
|
255
472
|
return (0, bytes_1.readAllBytes)(stream, {
|
|
@@ -265,9 +482,15 @@ class WaMediaTransferClient {
|
|
|
265
482
|
const response = await send(url, abort.signal);
|
|
266
483
|
const shouldFallback = response.status >= 500 && index < urls.length - 1;
|
|
267
484
|
if (!shouldFallback) {
|
|
268
|
-
return {
|
|
485
|
+
return {
|
|
486
|
+
url,
|
|
487
|
+
status: response.status,
|
|
488
|
+
ok: response.ok,
|
|
489
|
+
headers: response.headers,
|
|
490
|
+
body: response.body
|
|
491
|
+
};
|
|
269
492
|
}
|
|
270
|
-
await
|
|
493
|
+
await response.cancel();
|
|
271
494
|
this.logger?.warn('transfer fallback to next host', {
|
|
272
495
|
url,
|
|
273
496
|
status: response.status
|
|
@@ -319,35 +542,13 @@ class WaMediaTransferClient {
|
|
|
319
542
|
}
|
|
320
543
|
};
|
|
321
544
|
}
|
|
322
|
-
toResponse(url, response) {
|
|
323
|
-
return {
|
|
324
|
-
url,
|
|
325
|
-
status: response.status,
|
|
326
|
-
ok: response.ok,
|
|
327
|
-
headers: this.headersToRecord(response.headers),
|
|
328
|
-
body: response.body
|
|
329
|
-
? node_stream_1.Readable.fromWeb(response.body)
|
|
330
|
-
: null
|
|
331
|
-
};
|
|
332
|
-
}
|
|
333
545
|
headersToRecord(headers) {
|
|
334
546
|
const output = {};
|
|
335
|
-
|
|
547
|
+
headers.forEach((value, key) => {
|
|
336
548
|
output[key] = value;
|
|
337
|
-
}
|
|
549
|
+
});
|
|
338
550
|
return output;
|
|
339
551
|
}
|
|
340
|
-
async cancelWebBody(body) {
|
|
341
|
-
if (!body) {
|
|
342
|
-
return;
|
|
343
|
-
}
|
|
344
|
-
try {
|
|
345
|
-
await body.cancel();
|
|
346
|
-
}
|
|
347
|
-
catch {
|
|
348
|
-
// ignore cancel errors from remote resets
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
552
|
async drainBody(body) {
|
|
352
553
|
if (!body) {
|
|
353
554
|
return;
|
package/dist/media/conn.js
CHANGED
|
@@ -19,12 +19,16 @@ function parseMediaConnResponse(node, nowMs) {
|
|
|
19
19
|
throw new Error('media_conn response has invalid ttl');
|
|
20
20
|
}
|
|
21
21
|
const expiresAtMs = ttlRaw >= 1000000000 ? ttlRaw * 1000 : nowMs + ttlRaw * 1000;
|
|
22
|
-
const hosts =
|
|
23
|
-
|
|
24
|
-
hostname
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
const hosts = [];
|
|
23
|
+
for (const host of (0, helpers_1.getNodeChildrenByTag)(mediaConnNode, constants_1.WA_NODE_TAGS.HOST)) {
|
|
24
|
+
const hostname = host.attrs.hostname;
|
|
25
|
+
if (hostname) {
|
|
26
|
+
hosts.push({
|
|
27
|
+
hostname,
|
|
28
|
+
isFallback: host.attrs.type === 'fallback'
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
28
32
|
if (hosts.length === 0) {
|
|
29
33
|
throw new Error('media_conn response contains no hosts');
|
|
30
34
|
}
|
package/dist/media/constants.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MEDIA_UPLOAD_PATHS = exports.HMAC_TRUNCATED_SIZE = exports.MAC_KEY_END = exports.MAC_KEY_START = exports.ENC_KEY_END = exports.ENC_KEY_START = exports.IV_SIZE = exports.MEDIA_HKDF_SIZE = exports.MEDIA_CONN_CACHE_GRACE_MS = exports.DEFAULT_MEDIA_HOSTS = void 0;
|
|
4
|
-
exports.DEFAULT_MEDIA_HOSTS = [
|
|
4
|
+
exports.DEFAULT_MEDIA_HOSTS = Object.freeze([
|
|
5
|
+
'mmg.whatsapp.net',
|
|
6
|
+
'mmg-fallback.whatsapp.net'
|
|
7
|
+
]);
|
|
5
8
|
exports.MEDIA_CONN_CACHE_GRACE_MS = 30000;
|
|
6
9
|
exports.MEDIA_HKDF_SIZE = 112;
|
|
7
10
|
exports.IV_SIZE = 16;
|
|
@@ -3,9 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.WaMessageClient = void 0;
|
|
4
4
|
const ack_1 = require("./ack");
|
|
5
5
|
const constants_1 = require("../protocol/constants");
|
|
6
|
-
const parse_1 = require("../transport/stream/parse");
|
|
7
6
|
const async_1 = require("../util/async");
|
|
8
7
|
const primitives_1 = require("../util/primitives");
|
|
8
|
+
const WA_RETRYABLE_PUBLISH_ERROR_RE = /timeout|socket|connection|closed/i;
|
|
9
9
|
class MessagePublishNackError extends Error {
|
|
10
10
|
constructor(message, retryable) {
|
|
11
11
|
super(message);
|
|
@@ -105,12 +105,7 @@ class WaMessageClient {
|
|
|
105
105
|
}
|
|
106
106
|
async sendEncrypted(input) {
|
|
107
107
|
const node = this.buildEncryptedMessageNode(input);
|
|
108
|
-
this.
|
|
109
|
-
to: node.attrs.to,
|
|
110
|
-
type: node.attrs.type,
|
|
111
|
-
id: node.attrs.id
|
|
112
|
-
});
|
|
113
|
-
await this.sendNode(node);
|
|
108
|
+
await this.sendMessageNode(node);
|
|
114
109
|
}
|
|
115
110
|
buildEncryptedMessageNode(input) {
|
|
116
111
|
const attrs = {
|
|
@@ -189,11 +184,7 @@ class WaMessageClient {
|
|
|
189
184
|
});
|
|
190
185
|
}
|
|
191
186
|
isRetryablePublishError(error) {
|
|
192
|
-
|
|
193
|
-
return (message.includes('timeout') ||
|
|
194
|
-
message.includes('socket') ||
|
|
195
|
-
message.includes('connection') ||
|
|
196
|
-
message.includes('closed'));
|
|
187
|
+
return WA_RETRYABLE_PUBLISH_ERROR_RE.test(error.message);
|
|
197
188
|
}
|
|
198
189
|
extractAckMetadata(ackNode) {
|
|
199
190
|
const addressingModeRaw = ackNode.attrs.addressing_mode;
|
|
@@ -206,8 +197,8 @@ class WaMessageClient {
|
|
|
206
197
|
phash: ackNode.attrs.phash,
|
|
207
198
|
refreshLid: ackNode.attrs.refresh_lid === 'true',
|
|
208
199
|
addressingMode,
|
|
209
|
-
count: (0,
|
|
210
|
-
error: (0,
|
|
200
|
+
count: (0, primitives_1.parseOptionalInt)(ackNode.attrs.count),
|
|
201
|
+
error: (0, primitives_1.parseOptionalInt)(ackNode.attrs.error)
|
|
211
202
|
};
|
|
212
203
|
}
|
|
213
204
|
}
|
package/dist/message/ack.js
CHANGED
|
@@ -31,22 +31,22 @@ function isRetryableNegativeAck(node) {
|
|
|
31
31
|
return false;
|
|
32
32
|
}
|
|
33
33
|
function describeAckNode(node) {
|
|
34
|
-
|
|
34
|
+
let description = `tag=${node.tag}`;
|
|
35
35
|
const id = node.attrs.id;
|
|
36
36
|
const type = node.attrs.type;
|
|
37
37
|
const ackClass = node.attrs.class;
|
|
38
38
|
const code = node.attrs.code;
|
|
39
39
|
if (id) {
|
|
40
|
-
|
|
40
|
+
description += ` id=${id}`;
|
|
41
41
|
}
|
|
42
42
|
if (type) {
|
|
43
|
-
|
|
43
|
+
description += ` type=${type}`;
|
|
44
44
|
}
|
|
45
45
|
if (ackClass) {
|
|
46
|
-
|
|
46
|
+
description += ` class=${ackClass}`;
|
|
47
47
|
}
|
|
48
48
|
if (code) {
|
|
49
|
-
|
|
49
|
+
description += ` code=${code}`;
|
|
50
50
|
}
|
|
51
|
-
return
|
|
51
|
+
return description;
|
|
52
52
|
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.shouldUseAddonAdditionalData = shouldUseAddonAdditionalData;
|
|
4
|
+
exports.buildAddonAdditionalData = buildAddonAdditionalData;
|
|
5
|
+
exports.encryptAddonPayload = encryptAddonPayload;
|
|
6
|
+
exports.decryptAddonPayload = decryptAddonPayload;
|
|
7
|
+
const _crypto_1 = require("../crypto/index.js");
|
|
8
|
+
const use_case_secret_1 = require("./use-case-secret");
|
|
9
|
+
const bytes_1 = require("../util/bytes");
|
|
10
|
+
const WA_ADDON_ENCRYPTION_NONCE_BYTES = 12;
|
|
11
|
+
function shouldUseAddonAdditionalData(modificationType) {
|
|
12
|
+
return (modificationType === use_case_secret_1.WA_USE_CASE_SECRET_MODIFICATION_TYPES.POLL_VOTE ||
|
|
13
|
+
modificationType === use_case_secret_1.WA_USE_CASE_SECRET_MODIFICATION_TYPES.EVENT_RESPONSE);
|
|
14
|
+
}
|
|
15
|
+
function buildAddonAdditionalData(stanzaId, addOnSenderJid) {
|
|
16
|
+
if (!stanzaId.trim()) {
|
|
17
|
+
throw new Error('stanza id must be a non-empty string');
|
|
18
|
+
}
|
|
19
|
+
if (!addOnSenderJid.trim()) {
|
|
20
|
+
throw new Error('addon sender jid must be a non-empty string');
|
|
21
|
+
}
|
|
22
|
+
return bytes_1.TEXT_ENCODER.encode(`${stanzaId}\u0000${addOnSenderJid}`);
|
|
23
|
+
}
|
|
24
|
+
async function encryptAddonPayload(input) {
|
|
25
|
+
const secret = await (0, use_case_secret_1.createUseCaseSecret)({
|
|
26
|
+
messageSecret: (0, use_case_secret_1.assertMessageSecret)(input.messageSecret),
|
|
27
|
+
stanzaId: input.stanzaId,
|
|
28
|
+
parentMsgOriginalSender: input.parentMsgOriginalSender,
|
|
29
|
+
modificationSender: input.modificationSender,
|
|
30
|
+
modificationType: input.modificationType
|
|
31
|
+
});
|
|
32
|
+
const key = await (0, _crypto_1.importAesGcmKey)(secret, ['encrypt']);
|
|
33
|
+
const iv = assertAddonIv(input.iv);
|
|
34
|
+
const additionalData = resolveAddonAdditionalData(input);
|
|
35
|
+
return (0, _crypto_1.aesGcmEncrypt)(key, iv, (0, bytes_1.toBytesView)(input.payload), additionalData);
|
|
36
|
+
}
|
|
37
|
+
async function decryptAddonPayload(input) {
|
|
38
|
+
const secret = await (0, use_case_secret_1.createUseCaseSecret)({
|
|
39
|
+
messageSecret: (0, use_case_secret_1.assertMessageSecret)(input.messageSecret),
|
|
40
|
+
stanzaId: input.stanzaId,
|
|
41
|
+
parentMsgOriginalSender: input.parentMsgOriginalSender,
|
|
42
|
+
modificationSender: input.modificationSender,
|
|
43
|
+
modificationType: input.modificationType
|
|
44
|
+
});
|
|
45
|
+
const key = await (0, _crypto_1.importAesGcmKey)(secret, ['decrypt']);
|
|
46
|
+
const iv = assertAddonIv(input.iv);
|
|
47
|
+
const additionalData = resolveAddonAdditionalData(input);
|
|
48
|
+
return (0, _crypto_1.aesGcmDecrypt)(key, iv, (0, bytes_1.toBytesView)(input.ciphertext), additionalData);
|
|
49
|
+
}
|
|
50
|
+
function assertAddonIv(iv) {
|
|
51
|
+
const normalized = (0, bytes_1.toBytesView)(iv);
|
|
52
|
+
if (normalized.byteLength !== WA_ADDON_ENCRYPTION_NONCE_BYTES) {
|
|
53
|
+
throw new Error(`addon iv must be ${WA_ADDON_ENCRYPTION_NONCE_BYTES} bytes (got ${normalized.byteLength})`);
|
|
54
|
+
}
|
|
55
|
+
return normalized;
|
|
56
|
+
}
|
|
57
|
+
function resolveAddonAdditionalData(input) {
|
|
58
|
+
if (input.additionalData) {
|
|
59
|
+
return (0, bytes_1.toBytesView)(input.additionalData);
|
|
60
|
+
}
|
|
61
|
+
if (!shouldUseAddonAdditionalData(input.modificationType)) {
|
|
62
|
+
return bytes_1.EMPTY_BYTES;
|
|
63
|
+
}
|
|
64
|
+
return buildAddonAdditionalData(input.stanzaId, input.modificationSender);
|
|
65
|
+
}
|