wowok 2.1.40 → 2.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/dist/cjs/bcs/bcs.js +1 -253
- package/dist/cjs/bcs/effects.js +1 -199
- package/dist/cjs/bcs/index.js +1 -51
- package/dist/cjs/bcs/pure.js +1 -36
- package/dist/cjs/bcs/type-tag-serializer.js +1 -104
- package/dist/cjs/bcs/types.js +1 -3
- package/dist/cjs/client/index.js +1 -4
- package/dist/cjs/client/network.js +1 -15
- package/dist/cjs/cryptography/index.js +1 -6
- package/dist/cjs/cryptography/intent.js +1 -14
- package/dist/cjs/cryptography/keypair.js +1 -74
- package/dist/cjs/cryptography/mnemonics.js +1 -20
- package/dist/cjs/cryptography/publickey.js +1 -80
- package/dist/cjs/cryptography/signature-scheme.js +1 -22
- package/dist/cjs/cryptography/signature.js +1 -41
- package/dist/cjs/experimental/cache.js +1 -58
- package/dist/cjs/experimental/client.js +1 -19
- package/dist/cjs/experimental/core.js +1 -80
- package/dist/cjs/experimental/errors.js +1 -24
- package/dist/cjs/experimental/index.js +1 -5
- package/dist/cjs/experimental/persistent-storage.js +1 -220
- package/dist/cjs/experimental/persistent-storage.test.js +1 -144
- package/dist/cjs/experimental/transports/utils.js +1 -96
- package/dist/cjs/experimental/types.js +1 -1
- package/dist/cjs/faucet/faucet.js +1 -99
- package/dist/cjs/faucet/index.js +1 -1
- package/dist/cjs/grpc/client.js +1 -42
- package/dist/cjs/grpc/core.js +1 -587
- package/dist/cjs/grpc/index.js +1 -2
- package/dist/cjs/grpc/proto/google/protobuf/any.js +1 -106
- package/dist/cjs/grpc/proto/google/protobuf/duration.js +1 -58
- package/dist/cjs/grpc/proto/google/protobuf/empty.js +1 -7
- package/dist/cjs/grpc/proto/google/protobuf/field_mask.js +1 -47
- package/dist/cjs/grpc/proto/google/protobuf/struct.js +1 -191
- package/dist/cjs/grpc/proto/google/protobuf/timestamp.js +1 -91
- package/dist/cjs/grpc/proto/google/rpc/error_details.js +1 -265
- package/dist/cjs/grpc/proto/google/rpc/status.js +1 -23
- package/dist/cjs/grpc/proto/sui/rpc/v2/argument.js +1 -46
- package/dist/cjs/grpc/proto/sui/rpc/v2/balance_change.js +1 -29
- package/dist/cjs/grpc/proto/sui/rpc/v2/bcs.js +1 -22
- package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint.js +1 -54
- package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint_contents.js +1 -60
- package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint_summary.js +1 -144
- package/dist/cjs/grpc/proto/sui/rpc/v2/effects.js +1 -271
- package/dist/cjs/grpc/proto/sui/rpc/v2/epoch.js +1 -64
- package/dist/cjs/grpc/proto/sui/rpc/v2/error_reason.js +1 -6
- package/dist/cjs/grpc/proto/sui/rpc/v2/event.js +1 -62
- package/dist/cjs/grpc/proto/sui/rpc/v2/executed_transaction.js +1 -64
- package/dist/cjs/grpc/proto/sui/rpc/v2/execution_status.js +1 -481
- package/dist/cjs/grpc/proto/sui/rpc/v2/gas_cost_summary.js +1 -40
- package/dist/cjs/grpc/proto/sui/rpc/v2/input.js +1 -61
- package/dist/cjs/grpc/proto/sui/rpc/v2/jwk.js +1 -57
- package/dist/cjs/grpc/proto/sui/rpc/v2/ledger_service.client.js +1 -39
- package/dist/cjs/grpc/proto/sui/rpc/v2/ledger_service.js +1 -329
- package/dist/cjs/grpc/proto/sui/rpc/v2/move_package.js +1 -447
- package/dist/cjs/grpc/proto/sui/rpc/v2/move_package_service.client.js +1 -27
- package/dist/cjs/grpc/proto/sui/rpc/v2/move_package_service.js +1 -206
- package/dist/cjs/grpc/proto/sui/rpc/v2/name_service.client.js +1 -19
- package/dist/cjs/grpc/proto/sui/rpc/v2/name_service.js +1 -109
- package/dist/cjs/grpc/proto/sui/rpc/v2/object.js +1 -90
- package/dist/cjs/grpc/proto/sui/rpc/v2/object_reference.js +1 -30
- package/dist/cjs/grpc/proto/sui/rpc/v2/owner.js +1 -39
- package/dist/cjs/grpc/proto/sui/rpc/v2/protocol_config.js +1 -30
- package/dist/cjs/grpc/proto/sui/rpc/v2/signature.js +1 -501
- package/dist/cjs/grpc/proto/sui/rpc/v2/signature_scheme.js +1 -10
- package/dist/cjs/grpc/proto/sui/rpc/v2/signature_verification_service.client.js +1 -15
- package/dist/cjs/grpc/proto/sui/rpc/v2/signature_verification_service.js +1 -62
- package/dist/cjs/grpc/proto/sui/rpc/v2/state_service.client.js +1 -31
- package/dist/cjs/grpc/proto/sui/rpc/v2/state_service.js +1 -504
- package/dist/cjs/grpc/proto/sui/rpc/v2/subscription_service.client.js +1 -15
- package/dist/cjs/grpc/proto/sui/rpc/v2/subscription_service.js +1 -37
- package/dist/cjs/grpc/proto/sui/rpc/v2/system_state.js +1 -709
- package/dist/cjs/grpc/proto/sui/rpc/v2/transaction.js +1 -950
- package/dist/cjs/grpc/proto/sui/rpc/v2/transaction_execution_service.client.js +1 -19
- package/dist/cjs/grpc/proto/sui/rpc/v2/transaction_execution_service.js +1 -144
- package/dist/cjs/index.js +1 -22
- package/dist/cjs/jsonRpc/client.js +1 -516
- package/dist/cjs/jsonRpc/core.js +1 -587
- package/dist/cjs/jsonRpc/errors.js +1 -38
- package/dist/cjs/jsonRpc/http-transport.js +1 -70
- package/dist/cjs/jsonRpc/index.js +1 -3
- package/dist/cjs/jsonRpc/json-rpc-resolver.js +1 -296
- package/dist/cjs/jsonRpc/rpc-websocket-client.js +1 -155
- package/dist/cjs/jsonRpc/types/chain.js +1 -1
- package/dist/cjs/jsonRpc/types/changes.js +1 -1
- package/dist/cjs/jsonRpc/types/coins.js +1 -1
- package/dist/cjs/jsonRpc/types/common.js +1 -1
- package/dist/cjs/jsonRpc/types/generated.js +1 -1
- package/dist/cjs/jsonRpc/types/index.js +1 -1
- package/dist/cjs/jsonRpc/types/params.js +1 -1
- package/dist/cjs/keypairs/ed25519/ed25519-hd-key.js +1 -58
- package/dist/cjs/keypairs/ed25519/index.js +1 -2
- package/dist/cjs/keypairs/ed25519/keypair.js +1 -90
- package/dist/cjs/keypairs/ed25519/publickey.js +1 -50
- package/dist/cjs/keypairs/index.js +1 -4
- package/dist/cjs/keypairs/passkey/index.js +1 -2
- package/dist/cjs/keypairs/passkey/keypair.js +1 -155
- package/dist/cjs/keypairs/passkey/publickey.js +1 -117
- package/dist/cjs/keypairs/passkey/types.js +1 -1
- package/dist/cjs/keypairs/secp256k1/index.js +1 -2
- package/dist/cjs/keypairs/secp256k1/keypair.js +1 -82
- package/dist/cjs/keypairs/secp256k1/publickey.js +1 -51
- package/dist/cjs/keypairs/secp256r1/index.js +1 -2
- package/dist/cjs/keypairs/secp256r1/keypair.js +1 -78
- package/dist/cjs/keypairs/secp256r1/publickey.js +1 -52
- package/dist/cjs/multisig/index.js +1 -2
- package/dist/cjs/multisig/publickey.js +1 -201
- package/dist/cjs/multisig/signer.js +1 -58
- package/dist/cjs/transactions/Arguments.js +1 -9
- package/dist/cjs/transactions/Commands.js +1 -102
- package/dist/cjs/transactions/Inputs.js +1 -52
- package/dist/cjs/transactions/ObjectCache.js +1 -205
- package/dist/cjs/transactions/Transaction.js +1 -574
- package/dist/cjs/transactions/TransactionData.js +1 -409
- package/dist/cjs/transactions/__tests__/Transaction.test.js +1 -160
- package/dist/cjs/transactions/__tests__/bcs.test.js +1 -182
- package/dist/cjs/transactions/data/internal.js +1 -169
- package/dist/cjs/transactions/data/v1.js +1 -469
- package/dist/cjs/transactions/data/v2.js +1 -97
- package/dist/cjs/transactions/executor/caching.js +1 -65
- package/dist/cjs/transactions/executor/parallel.js +1 -347
- package/dist/cjs/transactions/executor/queue.js +1 -59
- package/dist/cjs/transactions/executor/serial.js +1 -99
- package/dist/cjs/transactions/hash.js +1 -8
- package/dist/cjs/transactions/index.js +1 -12
- package/dist/cjs/transactions/intents/CoinWithBalance.js +1 -145
- package/dist/cjs/transactions/object.js +1 -87
- package/dist/cjs/transactions/plugins/NamedPackagesPlugin.js +1 -11
- package/dist/cjs/transactions/pure.js +1 -36
- package/dist/cjs/transactions/resolve.js +1 -69
- package/dist/cjs/transactions/serializer.js +1 -167
- package/dist/cjs/transactions/utils.js +1 -121
- package/dist/cjs/utils/constants.js +1 -18
- package/dist/cjs/utils/derived-objects.js +1 -8
- package/dist/cjs/utils/dynamic-fields.js +1 -17
- package/dist/cjs/utils/format.js +1 -11
- package/dist/cjs/utils/index.js +1 -8
- package/dist/cjs/utils/move-registry.js +1 -24
- package/dist/cjs/utils/sui-types.js +1 -66
- package/dist/cjs/utils/suins.js +1 -33
- package/dist/cjs/verify/index.js +1 -1
- package/dist/cjs/verify/verify.js +1 -87
- package/dist/cjs/version.js +1 -2
- package/dist/cjs/w/call/allocation.js +1 -345
- package/dist/cjs/w/call/arb.js +1 -103
- package/dist/cjs/w/call/arbitration.js +1 -1192
- package/dist/cjs/w/call/base.js +1 -293
- package/dist/cjs/w/call/contact.js +1 -345
- package/dist/cjs/w/call/demand.js +1 -681
- package/dist/cjs/w/call/entity.js +1 -173
- package/dist/cjs/w/call/guard-ins.js +1 -4449
- package/dist/cjs/w/call/guard.d.ts +113 -0
- package/dist/cjs/w/call/guard.js +1 -1048
- package/dist/cjs/w/call/index.js +1 -22
- package/dist/cjs/w/call/machine.js +1 -1127
- package/dist/cjs/w/call/order.js +1 -337
- package/dist/cjs/w/call/passport.js +1 -220
- package/dist/cjs/w/call/payment.js +1 -178
- package/dist/cjs/w/call/permission.js +1 -1162
- package/dist/cjs/w/call/personal.js +1 -139
- package/dist/cjs/w/call/progress.js +1 -678
- package/dist/cjs/w/call/proof.js +1 -66
- package/dist/cjs/w/call/repository.js +1 -1024
- package/dist/cjs/w/call/resource.js +1 -108
- package/dist/cjs/w/call/reward.js +1 -675
- package/dist/cjs/w/call/service.js +1 -1960
- package/dist/cjs/w/call/treasury.js +1 -873
- package/dist/cjs/w/call/util.d.ts +1 -0
- package/dist/cjs/w/call/util.js +1 -566
- package/dist/cjs/w/common.js +1 -571
- package/dist/cjs/w/exception.js +1 -618
- package/dist/cjs/w/index.js +1 -8
- package/dist/cjs/w/local/account.js +1 -656
- package/dist/cjs/w/local/cache.js +1 -161
- package/dist/cjs/w/local/config.js +1 -43
- package/dist/cjs/w/local/index.js +1 -228
- package/dist/cjs/w/local/local.js +1 -574
- package/dist/cjs/w/local/storage.js +1 -185
- package/dist/cjs/w/local/token.js +1 -131
- package/dist/cjs/w/local/util.js +1 -26
- package/dist/cjs/w/local/wip.js +1 -864
- package/dist/cjs/w/messenger/crypto.js +1 -380
- package/dist/cjs/w/messenger/index.js +1 -4
- package/dist/cjs/w/messenger/messenger-api.js +1 -1154
- package/dist/cjs/w/messenger/messenger-manager.js +1 -1003
- package/dist/cjs/w/messenger/messenger.js +1 -1093
- package/dist/cjs/w/messenger/server.js +1 -343
- package/dist/cjs/w/messenger/session.js +1 -628
- package/dist/cjs/w/messenger/storage.js +1 -1023
- package/dist/cjs/w/messenger/templates/wts-html-template.js +1 -371
- package/dist/cjs/w/messenger/types.js +1 -76
- package/dist/cjs/w/messenger/utils.js +1 -12
- package/dist/cjs/w/query/bult-in.js +1 -95
- package/dist/cjs/w/query/event.js +1 -137
- package/dist/cjs/w/query/index.js +1 -5
- package/dist/cjs/w/query/object.js +1 -1550
- package/dist/cjs/w/query/received.js +1 -62
- package/dist/cjs/w/query/util.js +1 -49
- package/dist/cjs/w/util.js +1 -587
- package/dist/esm/bcs/bcs.js +1 -253
- package/dist/esm/bcs/effects.js +1 -199
- package/dist/esm/bcs/index.js +1 -51
- package/dist/esm/bcs/pure.js +1 -36
- package/dist/esm/bcs/type-tag-serializer.js +1 -104
- package/dist/esm/bcs/types.js +1 -3
- package/dist/esm/client/index.js +1 -4
- package/dist/esm/client/network.js +1 -15
- package/dist/esm/cryptography/index.js +1 -6
- package/dist/esm/cryptography/intent.js +1 -14
- package/dist/esm/cryptography/keypair.js +1 -74
- package/dist/esm/cryptography/mnemonics.js +1 -20
- package/dist/esm/cryptography/publickey.js +1 -80
- package/dist/esm/cryptography/signature-scheme.js +1 -22
- package/dist/esm/cryptography/signature.js +1 -41
- package/dist/esm/experimental/cache.js +1 -58
- package/dist/esm/experimental/client.js +1 -19
- package/dist/esm/experimental/core.js +1 -80
- package/dist/esm/experimental/errors.js +1 -24
- package/dist/esm/experimental/index.js +1 -5
- package/dist/esm/experimental/persistent-storage.js +1 -220
- package/dist/esm/experimental/persistent-storage.test.js +1 -144
- package/dist/esm/experimental/transports/utils.js +1 -96
- package/dist/esm/experimental/types.js +1 -1
- package/dist/esm/faucet/faucet.js +1 -99
- package/dist/esm/faucet/index.js +1 -1
- package/dist/esm/grpc/client.js +1 -42
- package/dist/esm/grpc/core.js +1 -587
- package/dist/esm/grpc/index.js +1 -2
- package/dist/esm/grpc/proto/google/protobuf/any.js +1 -106
- package/dist/esm/grpc/proto/google/protobuf/duration.js +1 -58
- package/dist/esm/grpc/proto/google/protobuf/empty.js +1 -7
- package/dist/esm/grpc/proto/google/protobuf/field_mask.js +1 -47
- package/dist/esm/grpc/proto/google/protobuf/struct.js +1 -191
- package/dist/esm/grpc/proto/google/protobuf/timestamp.js +1 -91
- package/dist/esm/grpc/proto/google/rpc/error_details.js +1 -265
- package/dist/esm/grpc/proto/google/rpc/status.js +1 -23
- package/dist/esm/grpc/proto/sui/rpc/v2/argument.js +1 -46
- package/dist/esm/grpc/proto/sui/rpc/v2/balance_change.js +1 -29
- package/dist/esm/grpc/proto/sui/rpc/v2/bcs.js +1 -22
- package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint.js +1 -54
- package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint_contents.js +1 -60
- package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint_summary.js +1 -144
- package/dist/esm/grpc/proto/sui/rpc/v2/effects.js +1 -271
- package/dist/esm/grpc/proto/sui/rpc/v2/epoch.js +1 -64
- package/dist/esm/grpc/proto/sui/rpc/v2/error_reason.js +1 -6
- package/dist/esm/grpc/proto/sui/rpc/v2/event.js +1 -62
- package/dist/esm/grpc/proto/sui/rpc/v2/executed_transaction.js +1 -64
- package/dist/esm/grpc/proto/sui/rpc/v2/execution_status.js +1 -481
- package/dist/esm/grpc/proto/sui/rpc/v2/gas_cost_summary.js +1 -40
- package/dist/esm/grpc/proto/sui/rpc/v2/input.js +1 -61
- package/dist/esm/grpc/proto/sui/rpc/v2/jwk.js +1 -57
- package/dist/esm/grpc/proto/sui/rpc/v2/ledger_service.client.js +1 -39
- package/dist/esm/grpc/proto/sui/rpc/v2/ledger_service.js +1 -329
- package/dist/esm/grpc/proto/sui/rpc/v2/move_package.js +1 -447
- package/dist/esm/grpc/proto/sui/rpc/v2/move_package_service.client.js +1 -27
- package/dist/esm/grpc/proto/sui/rpc/v2/move_package_service.js +1 -206
- package/dist/esm/grpc/proto/sui/rpc/v2/name_service.client.js +1 -19
- package/dist/esm/grpc/proto/sui/rpc/v2/name_service.js +1 -109
- package/dist/esm/grpc/proto/sui/rpc/v2/object.js +1 -90
- package/dist/esm/grpc/proto/sui/rpc/v2/object_reference.js +1 -30
- package/dist/esm/grpc/proto/sui/rpc/v2/owner.js +1 -39
- package/dist/esm/grpc/proto/sui/rpc/v2/protocol_config.js +1 -30
- package/dist/esm/grpc/proto/sui/rpc/v2/signature.js +1 -501
- package/dist/esm/grpc/proto/sui/rpc/v2/signature_scheme.js +1 -10
- package/dist/esm/grpc/proto/sui/rpc/v2/signature_verification_service.client.js +1 -15
- package/dist/esm/grpc/proto/sui/rpc/v2/signature_verification_service.js +1 -62
- package/dist/esm/grpc/proto/sui/rpc/v2/state_service.client.js +1 -31
- package/dist/esm/grpc/proto/sui/rpc/v2/state_service.js +1 -504
- package/dist/esm/grpc/proto/sui/rpc/v2/subscription_service.client.js +1 -15
- package/dist/esm/grpc/proto/sui/rpc/v2/subscription_service.js +1 -37
- package/dist/esm/grpc/proto/sui/rpc/v2/system_state.js +1 -709
- package/dist/esm/grpc/proto/sui/rpc/v2/transaction.js +1 -950
- package/dist/esm/grpc/proto/sui/rpc/v2/transaction_execution_service.client.js +1 -19
- package/dist/esm/grpc/proto/sui/rpc/v2/transaction_execution_service.js +1 -144
- package/dist/esm/index.js +1 -22
- package/dist/esm/jsonRpc/client.js +1 -516
- package/dist/esm/jsonRpc/core.js +1 -587
- package/dist/esm/jsonRpc/errors.js +1 -38
- package/dist/esm/jsonRpc/http-transport.js +1 -70
- package/dist/esm/jsonRpc/index.js +1 -3
- package/dist/esm/jsonRpc/json-rpc-resolver.js +1 -296
- package/dist/esm/jsonRpc/rpc-websocket-client.js +1 -155
- package/dist/esm/jsonRpc/types/chain.js +1 -1
- package/dist/esm/jsonRpc/types/changes.js +1 -1
- package/dist/esm/jsonRpc/types/coins.js +1 -1
- package/dist/esm/jsonRpc/types/common.js +1 -1
- package/dist/esm/jsonRpc/types/generated.js +1 -1
- package/dist/esm/jsonRpc/types/index.js +1 -1
- package/dist/esm/jsonRpc/types/params.js +1 -1
- package/dist/esm/keypairs/ed25519/ed25519-hd-key.js +1 -58
- package/dist/esm/keypairs/ed25519/index.js +1 -2
- package/dist/esm/keypairs/ed25519/keypair.js +1 -90
- package/dist/esm/keypairs/ed25519/publickey.js +1 -50
- package/dist/esm/keypairs/index.js +1 -4
- package/dist/esm/keypairs/passkey/index.js +1 -2
- package/dist/esm/keypairs/passkey/keypair.js +1 -155
- package/dist/esm/keypairs/passkey/publickey.js +1 -117
- package/dist/esm/keypairs/passkey/types.js +1 -1
- package/dist/esm/keypairs/secp256k1/index.js +1 -2
- package/dist/esm/keypairs/secp256k1/keypair.js +1 -82
- package/dist/esm/keypairs/secp256k1/publickey.js +1 -51
- package/dist/esm/keypairs/secp256r1/index.js +1 -2
- package/dist/esm/keypairs/secp256r1/keypair.js +1 -78
- package/dist/esm/keypairs/secp256r1/publickey.js +1 -52
- package/dist/esm/multisig/index.js +1 -2
- package/dist/esm/multisig/publickey.js +1 -201
- package/dist/esm/multisig/signer.js +1 -58
- package/dist/esm/transactions/Arguments.js +1 -9
- package/dist/esm/transactions/Commands.js +1 -102
- package/dist/esm/transactions/Inputs.js +1 -52
- package/dist/esm/transactions/ObjectCache.js +1 -205
- package/dist/esm/transactions/Transaction.js +1 -574
- package/dist/esm/transactions/TransactionData.js +1 -409
- package/dist/esm/transactions/__tests__/Transaction.test.js +1 -160
- package/dist/esm/transactions/__tests__/bcs.test.js +1 -182
- package/dist/esm/transactions/data/internal.js +1 -169
- package/dist/esm/transactions/data/v1.js +1 -469
- package/dist/esm/transactions/data/v2.js +1 -97
- package/dist/esm/transactions/executor/caching.js +1 -65
- package/dist/esm/transactions/executor/parallel.js +1 -347
- package/dist/esm/transactions/executor/queue.js +1 -59
- package/dist/esm/transactions/executor/serial.js +1 -99
- package/dist/esm/transactions/hash.js +1 -8
- package/dist/esm/transactions/index.js +1 -12
- package/dist/esm/transactions/intents/CoinWithBalance.js +1 -145
- package/dist/esm/transactions/object.js +1 -87
- package/dist/esm/transactions/plugins/NamedPackagesPlugin.js +1 -11
- package/dist/esm/transactions/pure.js +1 -36
- package/dist/esm/transactions/resolve.js +1 -69
- package/dist/esm/transactions/serializer.js +1 -167
- package/dist/esm/transactions/utils.js +1 -121
- package/dist/esm/utils/constants.js +1 -18
- package/dist/esm/utils/derived-objects.js +1 -8
- package/dist/esm/utils/dynamic-fields.js +1 -17
- package/dist/esm/utils/format.js +1 -11
- package/dist/esm/utils/index.js +1 -8
- package/dist/esm/utils/move-registry.js +1 -24
- package/dist/esm/utils/sui-types.js +1 -66
- package/dist/esm/utils/suins.js +1 -33
- package/dist/esm/verify/index.js +1 -1
- package/dist/esm/verify/verify.js +1 -87
- package/dist/esm/version.js +1 -2
- package/dist/esm/w/call/allocation.js +1 -345
- package/dist/esm/w/call/arb.js +1 -103
- package/dist/esm/w/call/arbitration.js +1 -1192
- package/dist/esm/w/call/base.js +1 -293
- package/dist/esm/w/call/contact.js +1 -345
- package/dist/esm/w/call/demand.js +1 -681
- package/dist/esm/w/call/entity.js +1 -173
- package/dist/esm/w/call/guard-ins.js +1 -4449
- package/dist/esm/w/call/guard.d.ts +113 -0
- package/dist/esm/w/call/guard.js +1 -1048
- package/dist/esm/w/call/index.js +1 -22
- package/dist/esm/w/call/machine.js +1 -1127
- package/dist/esm/w/call/order.js +1 -337
- package/dist/esm/w/call/passport.js +1 -220
- package/dist/esm/w/call/payment.js +1 -178
- package/dist/esm/w/call/permission.js +1 -1162
- package/dist/esm/w/call/personal.js +1 -139
- package/dist/esm/w/call/progress.js +1 -678
- package/dist/esm/w/call/proof.js +1 -66
- package/dist/esm/w/call/repository.js +1 -1024
- package/dist/esm/w/call/resource.js +1 -108
- package/dist/esm/w/call/reward.js +1 -675
- package/dist/esm/w/call/service.js +1 -1960
- package/dist/esm/w/call/treasury.js +1 -873
- package/dist/esm/w/call/util.d.ts +1 -0
- package/dist/esm/w/call/util.js +1 -566
- package/dist/esm/w/common.js +1 -571
- package/dist/esm/w/exception.js +1 -618
- package/dist/esm/w/index.js +1 -8
- package/dist/esm/w/local/account.js +1 -656
- package/dist/esm/w/local/cache.js +1 -161
- package/dist/esm/w/local/config.js +1 -43
- package/dist/esm/w/local/index.js +1 -228
- package/dist/esm/w/local/local.js +1 -574
- package/dist/esm/w/local/storage.js +1 -185
- package/dist/esm/w/local/token.js +1 -131
- package/dist/esm/w/local/util.js +1 -26
- package/dist/esm/w/local/wip.js +1 -864
- package/dist/esm/w/messenger/crypto.js +1 -380
- package/dist/esm/w/messenger/index.js +1 -4
- package/dist/esm/w/messenger/messenger-api.js +1 -1154
- package/dist/esm/w/messenger/messenger-manager.js +1 -1003
- package/dist/esm/w/messenger/messenger.js +1 -1093
- package/dist/esm/w/messenger/server.js +1 -343
- package/dist/esm/w/messenger/session.js +1 -628
- package/dist/esm/w/messenger/storage.js +1 -1023
- package/dist/esm/w/messenger/templates/wts-html-template.js +1 -371
- package/dist/esm/w/messenger/types.js +1 -76
- package/dist/esm/w/messenger/utils.js +1 -12
- package/dist/esm/w/query/bult-in.js +1 -95
- package/dist/esm/w/query/event.js +1 -137
- package/dist/esm/w/query/index.js +1 -5
- package/dist/esm/w/query/object.js +1 -1550
- package/dist/esm/w/query/received.js +1 -62
- package/dist/esm/w/query/util.js +1 -49
- package/dist/esm/w/util.js +1 -587
- package/package.json +5 -2
|
@@ -1,1023 +1 @@
|
|
|
1
|
-
import Database from "better-sqlite3";
|
|
2
|
-
import * as path from "path";
|
|
3
|
-
import * as fs from "fs";
|
|
4
|
-
import { getWowDir } from "../local/util.js";
|
|
5
|
-
function getWowDirDynamic() {
|
|
6
|
-
return getWowDir();
|
|
7
|
-
}
|
|
8
|
-
function getMessengerDbDir() {
|
|
9
|
-
return path.join(getWowDirDynamic(), "messenger");
|
|
10
|
-
}
|
|
11
|
-
function ensureDirExists(dir) {
|
|
12
|
-
if (!fs.existsSync(dir)) {
|
|
13
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
function getUserDbPath(userAddress) {
|
|
17
|
-
const shortAddress = userAddress
|
|
18
|
-
.toLowerCase()
|
|
19
|
-
.replace(/^0x/, "")
|
|
20
|
-
.slice(0, 16);
|
|
21
|
-
const messengerDbDir = getMessengerDbDir();
|
|
22
|
-
ensureDirExists(messengerDbDir);
|
|
23
|
-
return path.join(messengerDbDir, `${shortAddress}.db`);
|
|
24
|
-
}
|
|
25
|
-
function getGlobalDbPath() {
|
|
26
|
-
const messengerDbDir = getMessengerDbDir();
|
|
27
|
-
ensureDirExists(messengerDbDir);
|
|
28
|
-
return path.join(messengerDbDir, "global.db");
|
|
29
|
-
}
|
|
30
|
-
const userDbInstances = new Map();
|
|
31
|
-
let globalDbInstance = null;
|
|
32
|
-
function getDatabase(userAddress) {
|
|
33
|
-
if (!userAddress) {
|
|
34
|
-
throw new Error("userAddress is required to get database");
|
|
35
|
-
}
|
|
36
|
-
const cached = userDbInstances.get(userAddress);
|
|
37
|
-
if (cached) {
|
|
38
|
-
return cached;
|
|
39
|
-
}
|
|
40
|
-
const dbPath = getUserDbPath(userAddress);
|
|
41
|
-
const db = new Database(dbPath);
|
|
42
|
-
db.pragma("journal_mode = WAL");
|
|
43
|
-
db.pragma("synchronous = NORMAL");
|
|
44
|
-
db.pragma("cache_size = -64000");
|
|
45
|
-
db.exec(`
|
|
46
|
-
CREATE TABLE IF NOT EXISTS signal_store (
|
|
47
|
-
store_type TEXT NOT NULL,
|
|
48
|
-
key TEXT NOT NULL,
|
|
49
|
-
value TEXT NOT NULL,
|
|
50
|
-
updated_at INTEGER DEFAULT (strftime('%s', 'now')),
|
|
51
|
-
PRIMARY KEY (store_type, key)
|
|
52
|
-
);
|
|
53
|
-
CREATE INDEX IF NOT EXISTS idx_signal_store_type ON signal_store(store_type);
|
|
54
|
-
`);
|
|
55
|
-
try {
|
|
56
|
-
db.exec(`
|
|
57
|
-
CREATE TABLE IF NOT EXISTS messages (
|
|
58
|
-
message_id TEXT PRIMARY KEY,
|
|
59
|
-
from_address TEXT NOT NULL,
|
|
60
|
-
to_address TEXT NOT NULL,
|
|
61
|
-
plaintext_hash TEXT NOT NULL,
|
|
62
|
-
plaintext TEXT,
|
|
63
|
-
guard_address TEXT,
|
|
64
|
-
passport_address TEXT,
|
|
65
|
-
direction TEXT NOT NULL,
|
|
66
|
-
status TEXT NOT NULL,
|
|
67
|
-
msg_type INTEGER NOT NULL,
|
|
68
|
-
leaf_index INTEGER,
|
|
69
|
-
prev_root TEXT,
|
|
70
|
-
new_root TEXT,
|
|
71
|
-
server_signature TEXT,
|
|
72
|
-
server_public_key TEXT,
|
|
73
|
-
server_timestamp INTEGER,
|
|
74
|
-
ark_recipient TEXT,
|
|
75
|
-
ark_recipient_pubkey TEXT,
|
|
76
|
-
ark_signature TEXT,
|
|
77
|
-
ark_timestamp INTEGER,
|
|
78
|
-
zip_metadata TEXT,
|
|
79
|
-
created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000),
|
|
80
|
-
received_at INTEGER
|
|
81
|
-
);
|
|
82
|
-
`);
|
|
83
|
-
}
|
|
84
|
-
catch (e) {
|
|
85
|
-
}
|
|
86
|
-
try {
|
|
87
|
-
db.exec("ALTER TABLE messages ADD COLUMN guard_address TEXT");
|
|
88
|
-
}
|
|
89
|
-
catch (e) {
|
|
90
|
-
}
|
|
91
|
-
try {
|
|
92
|
-
db.exec("ALTER TABLE messages ADD COLUMN passport_address TEXT");
|
|
93
|
-
}
|
|
94
|
-
catch (e) {
|
|
95
|
-
}
|
|
96
|
-
try {
|
|
97
|
-
db.exec("ALTER TABLE messages ADD COLUMN last_received_leaf_index INTEGER");
|
|
98
|
-
}
|
|
99
|
-
catch (e) {
|
|
100
|
-
}
|
|
101
|
-
try {
|
|
102
|
-
db.exec("ALTER TABLE messages ADD COLUMN viewed_at INTEGER");
|
|
103
|
-
}
|
|
104
|
-
catch (e) {
|
|
105
|
-
}
|
|
106
|
-
try {
|
|
107
|
-
db.exec("CREATE INDEX IF NOT EXISTS idx_messages_from_to ON messages(from_address, to_address)");
|
|
108
|
-
}
|
|
109
|
-
catch (e) {
|
|
110
|
-
}
|
|
111
|
-
try {
|
|
112
|
-
db.exec("CREATE INDEX IF NOT EXISTS idx_messages_status ON messages(status)");
|
|
113
|
-
}
|
|
114
|
-
catch (e) {
|
|
115
|
-
}
|
|
116
|
-
try {
|
|
117
|
-
db.exec("CREATE INDEX IF NOT EXISTS idx_messages_leaf ON messages(leaf_index)");
|
|
118
|
-
}
|
|
119
|
-
catch (e) {
|
|
120
|
-
}
|
|
121
|
-
try {
|
|
122
|
-
db.exec("CREATE INDEX IF NOT EXISTS idx_messages_created_at ON messages(created_at)");
|
|
123
|
-
}
|
|
124
|
-
catch (e) {
|
|
125
|
-
}
|
|
126
|
-
try {
|
|
127
|
-
db.exec("CREATE INDEX IF NOT EXISTS idx_messages_server_ts ON messages(server_timestamp)");
|
|
128
|
-
}
|
|
129
|
-
catch (e) {
|
|
130
|
-
}
|
|
131
|
-
try {
|
|
132
|
-
db.exec("CREATE INDEX IF NOT EXISTS idx_messages_received_at ON messages(received_at)");
|
|
133
|
-
}
|
|
134
|
-
catch (e) {
|
|
135
|
-
}
|
|
136
|
-
db.exec(`
|
|
137
|
-
CREATE TABLE IF NOT EXISTS session_states (
|
|
138
|
-
session_id TEXT PRIMARY KEY,
|
|
139
|
-
my_address TEXT NOT NULL,
|
|
140
|
-
peer_address TEXT NOT NULL,
|
|
141
|
-
current_root TEXT NOT NULL,
|
|
142
|
-
prev_root TEXT NOT NULL,
|
|
143
|
-
message_count INTEGER DEFAULT 0,
|
|
144
|
-
last_leaf_index INTEGER DEFAULT 0,
|
|
145
|
-
last_confirmed_hash TEXT,
|
|
146
|
-
last_sync_at INTEGER,
|
|
147
|
-
created_at INTEGER DEFAULT (strftime('%s', 'now')),
|
|
148
|
-
updated_at INTEGER DEFAULT (strftime('%s', 'now'))
|
|
149
|
-
);
|
|
150
|
-
CREATE INDEX IF NOT EXISTS idx_session_my_peer ON session_states(my_address, peer_address);
|
|
151
|
-
`);
|
|
152
|
-
userDbInstances.set(userAddress, db);
|
|
153
|
-
return db;
|
|
154
|
-
}
|
|
155
|
-
function getGlobalDatabase() {
|
|
156
|
-
if (globalDbInstance) {
|
|
157
|
-
return globalDbInstance;
|
|
158
|
-
}
|
|
159
|
-
const dbPath = getGlobalDbPath();
|
|
160
|
-
const db = new Database(dbPath);
|
|
161
|
-
db.pragma("journal_mode = WAL");
|
|
162
|
-
db.pragma("synchronous = NORMAL");
|
|
163
|
-
db.pragma("cache_size = -10000");
|
|
164
|
-
db.pragma("busy_timeout = 5000");
|
|
165
|
-
globalDbInstance = db;
|
|
166
|
-
return db;
|
|
167
|
-
}
|
|
168
|
-
export function resetDbConnection() {
|
|
169
|
-
for (const [_, db] of userDbInstances) {
|
|
170
|
-
try {
|
|
171
|
-
db.pragma("journal_mode = DELETE");
|
|
172
|
-
}
|
|
173
|
-
catch (e) {
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
for (const [_, db] of userDbInstances) {
|
|
177
|
-
try {
|
|
178
|
-
db.close();
|
|
179
|
-
}
|
|
180
|
-
catch (e) {
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
userDbInstances.clear();
|
|
184
|
-
if (globalDbInstance) {
|
|
185
|
-
try {
|
|
186
|
-
globalDbInstance.pragma("journal_mode = DELETE");
|
|
187
|
-
}
|
|
188
|
-
catch (e) {
|
|
189
|
-
}
|
|
190
|
-
try {
|
|
191
|
-
globalDbInstance.close();
|
|
192
|
-
}
|
|
193
|
-
catch (e) {
|
|
194
|
-
}
|
|
195
|
-
globalDbInstance = null;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
process.on("exit", () => {
|
|
199
|
-
resetDbConnection();
|
|
200
|
-
});
|
|
201
|
-
process.on("SIGINT", () => {
|
|
202
|
-
resetDbConnection();
|
|
203
|
-
process.exit(0);
|
|
204
|
-
});
|
|
205
|
-
process.on("SIGTERM", () => {
|
|
206
|
-
resetDbConnection();
|
|
207
|
-
process.exit(0);
|
|
208
|
-
});
|
|
209
|
-
const STORE_TYPES = {
|
|
210
|
-
IDENTITY: "identity",
|
|
211
|
-
REGISTRATION_ID: "registration_id",
|
|
212
|
-
IDENTITIES: "identities",
|
|
213
|
-
PREKEYS: "prekeys",
|
|
214
|
-
SIGNED_PREKEYS: "signed_prekeys",
|
|
215
|
-
SESSIONS: "sessions",
|
|
216
|
-
META: "meta",
|
|
217
|
-
};
|
|
218
|
-
function arrayBufferToBase64(buffer) {
|
|
219
|
-
return Buffer.from(new Uint8Array(buffer)).toString("base64");
|
|
220
|
-
}
|
|
221
|
-
function base64ToArrayBuffer(base64) {
|
|
222
|
-
const bytes = Uint8Array.from(Buffer.from(base64, "base64"));
|
|
223
|
-
return bytes.slice().buffer;
|
|
224
|
-
}
|
|
225
|
-
function bufferEqual(a, b) {
|
|
226
|
-
if (a.byteLength !== b.byteLength)
|
|
227
|
-
return false;
|
|
228
|
-
const va = new Uint8Array(a);
|
|
229
|
-
const vb = new Uint8Array(b);
|
|
230
|
-
for (let i = 0; i < va.length; i++) {
|
|
231
|
-
if (va[i] !== vb[i])
|
|
232
|
-
return false;
|
|
233
|
-
}
|
|
234
|
-
return true;
|
|
235
|
-
}
|
|
236
|
-
export class SignalProtocolStorage {
|
|
237
|
-
storePrefix;
|
|
238
|
-
userAddress;
|
|
239
|
-
constructor(userAddress, storeType = "default") {
|
|
240
|
-
this.userAddress = userAddress;
|
|
241
|
-
this.storePrefix = storeType;
|
|
242
|
-
}
|
|
243
|
-
get db() {
|
|
244
|
-
return getDatabase(this.userAddress);
|
|
245
|
-
}
|
|
246
|
-
async setIdentity(identity, registrationId) {
|
|
247
|
-
const persisted = {
|
|
248
|
-
pubKey: arrayBufferToBase64(identity.pubKey),
|
|
249
|
-
privKey: arrayBufferToBase64(identity.privKey),
|
|
250
|
-
};
|
|
251
|
-
this.putValue(STORE_TYPES.IDENTITY, JSON.stringify(persisted));
|
|
252
|
-
this.putValue(STORE_TYPES.REGISTRATION_ID, registrationId.toString());
|
|
253
|
-
}
|
|
254
|
-
async getIdentityKeyPair() {
|
|
255
|
-
const value = this.getValue(STORE_TYPES.IDENTITY);
|
|
256
|
-
if (!value)
|
|
257
|
-
return undefined;
|
|
258
|
-
const persisted = JSON.parse(value);
|
|
259
|
-
return {
|
|
260
|
-
pubKey: base64ToArrayBuffer(persisted.pubKey),
|
|
261
|
-
privKey: base64ToArrayBuffer(persisted.privKey),
|
|
262
|
-
};
|
|
263
|
-
}
|
|
264
|
-
async getLocalRegistrationId() {
|
|
265
|
-
const value = this.getValue(STORE_TYPES.REGISTRATION_ID);
|
|
266
|
-
return value ? parseInt(value, 10) : undefined;
|
|
267
|
-
}
|
|
268
|
-
async isTrustedIdentity(identifier, identityKey) {
|
|
269
|
-
const key = `${STORE_TYPES.IDENTITIES}:${identifier}`;
|
|
270
|
-
const existing = this.getValue(key);
|
|
271
|
-
if (!existing)
|
|
272
|
-
return true;
|
|
273
|
-
return bufferEqual(base64ToArrayBuffer(existing), identityKey);
|
|
274
|
-
}
|
|
275
|
-
async saveIdentity(encodedAddress, publicKey) {
|
|
276
|
-
const key = `${STORE_TYPES.IDENTITIES}:${encodedAddress}`;
|
|
277
|
-
const existing = this.getValue(key);
|
|
278
|
-
const newValue = arrayBufferToBase64(publicKey);
|
|
279
|
-
this.putValue(key, newValue);
|
|
280
|
-
return existing
|
|
281
|
-
? bufferEqual(base64ToArrayBuffer(existing), publicKey)
|
|
282
|
-
: true;
|
|
283
|
-
}
|
|
284
|
-
async loadIdentity(address) {
|
|
285
|
-
const key = `${STORE_TYPES.IDENTITIES}:${address}`;
|
|
286
|
-
const value = this.getValue(key);
|
|
287
|
-
return value ? base64ToArrayBuffer(value) : undefined;
|
|
288
|
-
}
|
|
289
|
-
async loadPreKey(keyId) {
|
|
290
|
-
const key = `${STORE_TYPES.PREKEYS}:${keyId}`;
|
|
291
|
-
const value = this.getValue(key);
|
|
292
|
-
if (!value)
|
|
293
|
-
return undefined;
|
|
294
|
-
const persisted = JSON.parse(value);
|
|
295
|
-
return {
|
|
296
|
-
pubKey: base64ToArrayBuffer(persisted.pubKey),
|
|
297
|
-
privKey: base64ToArrayBuffer(persisted.privKey),
|
|
298
|
-
};
|
|
299
|
-
}
|
|
300
|
-
async storePreKey(keyId, keyPair) {
|
|
301
|
-
const key = `${STORE_TYPES.PREKEYS}:${keyId}`;
|
|
302
|
-
const persisted = {
|
|
303
|
-
pubKey: arrayBufferToBase64(keyPair.pubKey),
|
|
304
|
-
privKey: arrayBufferToBase64(keyPair.privKey),
|
|
305
|
-
};
|
|
306
|
-
this.putValue(key, JSON.stringify(persisted));
|
|
307
|
-
}
|
|
308
|
-
async removePreKey(keyId) {
|
|
309
|
-
const key = `${STORE_TYPES.PREKEYS}:${keyId}`;
|
|
310
|
-
this.delValue(key);
|
|
311
|
-
}
|
|
312
|
-
async loadSignedPreKey(keyId) {
|
|
313
|
-
const key = `${STORE_TYPES.SIGNED_PREKEYS}:${keyId}`;
|
|
314
|
-
const value = this.getValue(key);
|
|
315
|
-
if (!value)
|
|
316
|
-
return undefined;
|
|
317
|
-
const persisted = JSON.parse(value);
|
|
318
|
-
return {
|
|
319
|
-
pubKey: base64ToArrayBuffer(persisted.pubKey),
|
|
320
|
-
privKey: base64ToArrayBuffer(persisted.privKey),
|
|
321
|
-
};
|
|
322
|
-
}
|
|
323
|
-
async storeSignedPreKey(keyId, keyPair) {
|
|
324
|
-
const key = `${STORE_TYPES.SIGNED_PREKEYS}:${keyId}`;
|
|
325
|
-
const persisted = {
|
|
326
|
-
pubKey: arrayBufferToBase64(keyPair.pubKey),
|
|
327
|
-
privKey: arrayBufferToBase64(keyPair.privKey),
|
|
328
|
-
};
|
|
329
|
-
this.putValue(key, JSON.stringify(persisted));
|
|
330
|
-
}
|
|
331
|
-
async removeSignedPreKey(keyId) {
|
|
332
|
-
const key = `${STORE_TYPES.SIGNED_PREKEYS}:${keyId}`;
|
|
333
|
-
this.delValue(key);
|
|
334
|
-
}
|
|
335
|
-
async loadSignedPreKeyWithSignature(keyId) {
|
|
336
|
-
const key = `${STORE_TYPES.SIGNED_PREKEYS}:${keyId}`;
|
|
337
|
-
const value = this.getValue(key);
|
|
338
|
-
if (!value)
|
|
339
|
-
return undefined;
|
|
340
|
-
const persisted = JSON.parse(value);
|
|
341
|
-
if (!persisted.pubKey || !persisted.privKey || !persisted.signature) {
|
|
342
|
-
console.warn(`[Storage] SignedPreKey ${keyId} has missing fields, treating as not found`);
|
|
343
|
-
return undefined;
|
|
344
|
-
}
|
|
345
|
-
return {
|
|
346
|
-
pubKey: base64ToArrayBuffer(persisted.pubKey),
|
|
347
|
-
privKey: base64ToArrayBuffer(persisted.privKey),
|
|
348
|
-
signature: base64ToArrayBuffer(persisted.signature),
|
|
349
|
-
};
|
|
350
|
-
}
|
|
351
|
-
async storeSignedPreKeyWithSignature(keyId, keyPair, signature) {
|
|
352
|
-
const key = `${STORE_TYPES.SIGNED_PREKEYS}:${keyId}`;
|
|
353
|
-
const persisted = {
|
|
354
|
-
pubKey: arrayBufferToBase64(keyPair.pubKey),
|
|
355
|
-
privKey: arrayBufferToBase64(keyPair.privKey),
|
|
356
|
-
signature: arrayBufferToBase64(signature),
|
|
357
|
-
};
|
|
358
|
-
this.putValue(key, JSON.stringify(persisted));
|
|
359
|
-
}
|
|
360
|
-
async loadSession(encodedAddress) {
|
|
361
|
-
const defaultKey = `${STORE_TYPES.SESSIONS}:${encodedAddress}`;
|
|
362
|
-
const defaultValue = this.getValue(defaultKey);
|
|
363
|
-
if (defaultValue) {
|
|
364
|
-
return defaultValue;
|
|
365
|
-
}
|
|
366
|
-
if (encodedAddress.startsWith("send:") ||
|
|
367
|
-
encodedAddress.startsWith("recv:")) {
|
|
368
|
-
return undefined;
|
|
369
|
-
}
|
|
370
|
-
const sendKey = `${STORE_TYPES.SESSIONS}:send:${encodedAddress}`;
|
|
371
|
-
const sendValue = this.getValue(sendKey);
|
|
372
|
-
if (sendValue) {
|
|
373
|
-
return sendValue;
|
|
374
|
-
}
|
|
375
|
-
const recvKey = `${STORE_TYPES.SESSIONS}:recv:${encodedAddress}`;
|
|
376
|
-
const recvValue = this.getValue(recvKey);
|
|
377
|
-
if (recvValue) {
|
|
378
|
-
return recvValue;
|
|
379
|
-
}
|
|
380
|
-
return undefined;
|
|
381
|
-
}
|
|
382
|
-
async storeSession(encodedAddress, record) {
|
|
383
|
-
const key = `${STORE_TYPES.SESSIONS}:${encodedAddress}`;
|
|
384
|
-
this.putValue(key, record);
|
|
385
|
-
if (!encodedAddress.startsWith("send:") &&
|
|
386
|
-
!encodedAddress.startsWith("recv:")) {
|
|
387
|
-
const recvKey = `${STORE_TYPES.SESSIONS}:recv:${encodedAddress}`;
|
|
388
|
-
this.putValue(recvKey, record);
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
async removeSession(encodedAddress) {
|
|
392
|
-
const key = `${STORE_TYPES.SESSIONS}:${encodedAddress}`;
|
|
393
|
-
this.delValue(key);
|
|
394
|
-
if (!encodedAddress.startsWith("send:") &&
|
|
395
|
-
!encodedAddress.startsWith("recv:")) {
|
|
396
|
-
const recvKey = `${STORE_TYPES.SESSIONS}:recv:${encodedAddress}`;
|
|
397
|
-
this.delValue(recvKey);
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
async getMeta() {
|
|
401
|
-
const value = this.getValue(STORE_TYPES.META);
|
|
402
|
-
if (!value)
|
|
403
|
-
return { nextPreKeyId: 1 };
|
|
404
|
-
return JSON.parse(value);
|
|
405
|
-
}
|
|
406
|
-
async setMeta(meta) {
|
|
407
|
-
const current = await this.getMeta();
|
|
408
|
-
const updated = { ...current, ...meta };
|
|
409
|
-
this.putValue(STORE_TYPES.META, JSON.stringify(updated));
|
|
410
|
-
}
|
|
411
|
-
listPreKeys() {
|
|
412
|
-
const rows = this.db
|
|
413
|
-
.prepare("SELECT key FROM signal_store WHERE store_type = ? AND key LIKE ?")
|
|
414
|
-
.all(this.storePrefix, `${STORE_TYPES.PREKEYS}:%`);
|
|
415
|
-
return rows.map((r) => {
|
|
416
|
-
const id = r.key.replace(`${STORE_TYPES.PREKEYS}:`, "");
|
|
417
|
-
return Number(id);
|
|
418
|
-
});
|
|
419
|
-
}
|
|
420
|
-
getValue(key) {
|
|
421
|
-
const row = this.db
|
|
422
|
-
.prepare("SELECT value FROM signal_store WHERE store_type = ? AND key = ?")
|
|
423
|
-
.get(this.storePrefix, key);
|
|
424
|
-
return row?.value;
|
|
425
|
-
}
|
|
426
|
-
putValue(key, value) {
|
|
427
|
-
this.db
|
|
428
|
-
.prepare(`
|
|
429
|
-
INSERT INTO signal_store (store_type, key, value, updated_at)
|
|
430
|
-
VALUES (?, ?, ?, strftime('%s', 'now'))
|
|
431
|
-
ON CONFLICT(store_type, key) DO UPDATE SET
|
|
432
|
-
value = excluded.value,
|
|
433
|
-
updated_at = excluded.updated_at
|
|
434
|
-
`)
|
|
435
|
-
.run(this.storePrefix, key, value);
|
|
436
|
-
}
|
|
437
|
-
delValue(key) {
|
|
438
|
-
this.db
|
|
439
|
-
.prepare("DELETE FROM signal_store WHERE store_type = ? AND key = ?")
|
|
440
|
-
.run(this.storePrefix, key);
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
export class MessageStorage {
|
|
444
|
-
userAddress;
|
|
445
|
-
constructor(userAddress) {
|
|
446
|
-
this.userAddress = userAddress;
|
|
447
|
-
}
|
|
448
|
-
get db() {
|
|
449
|
-
return getDatabase(this.userAddress);
|
|
450
|
-
}
|
|
451
|
-
saveMessage(message) {
|
|
452
|
-
const receivedAt = message.direction === "received" && !message.receivedAt
|
|
453
|
-
? Date.now()
|
|
454
|
-
: message.receivedAt;
|
|
455
|
-
this.db
|
|
456
|
-
.prepare(`
|
|
457
|
-
INSERT INTO messages (
|
|
458
|
-
message_id, from_address, to_address, plaintext_hash,
|
|
459
|
-
plaintext, guard_address, passport_address, last_received_leaf_index, direction, status, msg_type,
|
|
460
|
-
leaf_index, prev_root, new_root, server_signature, server_public_key, server_timestamp,
|
|
461
|
-
ark_recipient, ark_recipient_pubkey, ark_signature, ark_timestamp, zip_metadata,
|
|
462
|
-
created_at, received_at
|
|
463
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
464
|
-
ON CONFLICT(message_id) DO UPDATE SET
|
|
465
|
-
direction = COALESCE(excluded.direction, direction),
|
|
466
|
-
status = COALESCE(excluded.status, status),
|
|
467
|
-
leaf_index = COALESCE(excluded.leaf_index, leaf_index),
|
|
468
|
-
prev_root = COALESCE(excluded.prev_root, prev_root),
|
|
469
|
-
new_root = COALESCE(excluded.new_root, new_root),
|
|
470
|
-
server_signature = COALESCE(excluded.server_signature, server_signature),
|
|
471
|
-
server_public_key = COALESCE(excluded.server_public_key, server_public_key),
|
|
472
|
-
server_timestamp = COALESCE(excluded.server_timestamp, server_timestamp),
|
|
473
|
-
plaintext = COALESCE(excluded.plaintext, plaintext),
|
|
474
|
-
guard_address = COALESCE(excluded.guard_address, guard_address),
|
|
475
|
-
passport_address = COALESCE(excluded.passport_address, passport_address),
|
|
476
|
-
last_received_leaf_index = COALESCE(excluded.last_received_leaf_index, last_received_leaf_index),
|
|
477
|
-
ark_recipient = COALESCE(excluded.ark_recipient, ark_recipient),
|
|
478
|
-
ark_recipient_pubkey = COALESCE(excluded.ark_recipient_pubkey, ark_recipient_pubkey),
|
|
479
|
-
ark_signature = COALESCE(excluded.ark_signature, ark_signature),
|
|
480
|
-
ark_timestamp = COALESCE(excluded.ark_timestamp, ark_timestamp),
|
|
481
|
-
zip_metadata = COALESCE(excluded.zip_metadata, zip_metadata),
|
|
482
|
-
received_at = COALESCE(excluded.received_at, received_at)
|
|
483
|
-
`)
|
|
484
|
-
.run(message.messageId, message.fromAddress, message.toAddress, message.plaintextHash, message.plaintext === undefined ? null : message.plaintext, message.guardAddress === undefined
|
|
485
|
-
? null
|
|
486
|
-
: message.guardAddress, message.passportAddress === undefined
|
|
487
|
-
? null
|
|
488
|
-
: message.passportAddress, message.lastReceivedLeafIndex === undefined
|
|
489
|
-
? null
|
|
490
|
-
: message.lastReceivedLeafIndex, message.direction, message.status, message.msgType, message.leafIndex === undefined ? null : message.leafIndex, message.prevRoot === undefined ? null : message.prevRoot, message.newRoot === undefined ? null : message.newRoot, message.serverSignature === undefined
|
|
491
|
-
? null
|
|
492
|
-
: message.serverSignature, message.serverPublicKey === undefined
|
|
493
|
-
? null
|
|
494
|
-
: message.serverPublicKey, message.serverTimestamp === undefined
|
|
495
|
-
? null
|
|
496
|
-
: message.serverTimestamp, message.arkConfirmed?.recipient === undefined
|
|
497
|
-
? null
|
|
498
|
-
: message.arkConfirmed?.recipient, message.arkConfirmed?.recipientPublicKey === undefined
|
|
499
|
-
? null
|
|
500
|
-
: message.arkConfirmed?.recipientPublicKey, message.arkConfirmed?.signature === undefined
|
|
501
|
-
? null
|
|
502
|
-
: message.arkConfirmed?.signature, message.arkConfirmed?.timestamp === undefined
|
|
503
|
-
? null
|
|
504
|
-
: message.arkConfirmed?.timestamp, message.zipMetadata
|
|
505
|
-
? JSON.stringify(message.zipMetadata)
|
|
506
|
-
: null, message.createdAt, receivedAt === undefined ? null : receivedAt);
|
|
507
|
-
}
|
|
508
|
-
getMessage(messageId) {
|
|
509
|
-
const row = this.db
|
|
510
|
-
.prepare("SELECT * FROM messages WHERE message_id = ?")
|
|
511
|
-
.get(messageId);
|
|
512
|
-
if (!row)
|
|
513
|
-
return undefined;
|
|
514
|
-
return this.rowToMessage(row);
|
|
515
|
-
}
|
|
516
|
-
getMessagesBySession(myAddress, peerAddress) {
|
|
517
|
-
const myAddrLower = myAddress.toLowerCase();
|
|
518
|
-
const peerAddrLower = peerAddress.toLowerCase();
|
|
519
|
-
const rows = this.db
|
|
520
|
-
.prepare(`
|
|
521
|
-
SELECT * FROM messages
|
|
522
|
-
WHERE (from_address = ? AND to_address = ?)
|
|
523
|
-
OR (from_address = ? AND to_address = ?)
|
|
524
|
-
ORDER BY created_at ASC
|
|
525
|
-
`)
|
|
526
|
-
.all(myAddrLower, peerAddrLower, peerAddrLower, myAddrLower);
|
|
527
|
-
return rows.map((r) => this.rowToMessage(r));
|
|
528
|
-
}
|
|
529
|
-
getPendingMessages(myAddress) {
|
|
530
|
-
const myAddrLower = myAddress.toLowerCase();
|
|
531
|
-
const rows = this.db
|
|
532
|
-
.prepare(`
|
|
533
|
-
SELECT * FROM messages
|
|
534
|
-
WHERE (from_address = ? OR to_address = ?) AND status = ?
|
|
535
|
-
ORDER BY created_at ASC
|
|
536
|
-
`)
|
|
537
|
-
.all(myAddrLower, myAddrLower, "pending");
|
|
538
|
-
return rows.map((r) => this.rowToMessage(r));
|
|
539
|
-
}
|
|
540
|
-
updateMessageStatus(messageId, status, updates) {
|
|
541
|
-
const fields = ["status = ?"];
|
|
542
|
-
const values = [status];
|
|
543
|
-
if (updates?.leafIndex !== undefined) {
|
|
544
|
-
fields.push("leaf_index = ?");
|
|
545
|
-
values.push(updates.leafIndex);
|
|
546
|
-
}
|
|
547
|
-
if (updates?.newRoot !== undefined) {
|
|
548
|
-
fields.push("new_root = ?");
|
|
549
|
-
values.push(updates.newRoot);
|
|
550
|
-
}
|
|
551
|
-
if (updates?.serverSignature !== undefined) {
|
|
552
|
-
fields.push("server_signature = ?");
|
|
553
|
-
values.push(updates.serverSignature);
|
|
554
|
-
}
|
|
555
|
-
if (updates?.serverTimestamp !== undefined) {
|
|
556
|
-
fields.push("server_timestamp = ?");
|
|
557
|
-
values.push(updates.serverTimestamp);
|
|
558
|
-
}
|
|
559
|
-
if (updates?.serverPublicKey !== undefined) {
|
|
560
|
-
fields.push("server_public_key = ?");
|
|
561
|
-
values.push(updates.serverPublicKey);
|
|
562
|
-
}
|
|
563
|
-
values.push(messageId);
|
|
564
|
-
this.db
|
|
565
|
-
.prepare(`
|
|
566
|
-
UPDATE messages SET ${fields.join(", ")} WHERE message_id = ?
|
|
567
|
-
`)
|
|
568
|
-
.run(...values);
|
|
569
|
-
}
|
|
570
|
-
updateMessageViewed(messageId, viewedAt) {
|
|
571
|
-
const timestamp = viewedAt ?? Date.now();
|
|
572
|
-
const result = this.db
|
|
573
|
-
.prepare(`
|
|
574
|
-
UPDATE messages
|
|
575
|
-
SET viewed_at = ?
|
|
576
|
-
WHERE message_id = ? AND viewed_at IS NULL
|
|
577
|
-
`)
|
|
578
|
-
.run(timestamp, messageId);
|
|
579
|
-
return result.changes > 0;
|
|
580
|
-
}
|
|
581
|
-
updateMessagesViewed(messageIds, viewedAt) {
|
|
582
|
-
if (messageIds.length === 0)
|
|
583
|
-
return 0;
|
|
584
|
-
const timestamp = viewedAt ?? Date.now();
|
|
585
|
-
const placeholders = messageIds.map(() => "?").join(",");
|
|
586
|
-
const result = this.db
|
|
587
|
-
.prepare(`
|
|
588
|
-
UPDATE messages
|
|
589
|
-
SET viewed_at = ?
|
|
590
|
-
WHERE message_id IN (${placeholders}) AND viewed_at IS NULL
|
|
591
|
-
`)
|
|
592
|
-
.run(timestamp, ...messageIds);
|
|
593
|
-
return result.changes;
|
|
594
|
-
}
|
|
595
|
-
getAllMessages(userAddress) {
|
|
596
|
-
const userAddrLower = userAddress.toLowerCase();
|
|
597
|
-
const rows = this.db
|
|
598
|
-
.prepare(`
|
|
599
|
-
SELECT * FROM messages
|
|
600
|
-
WHERE from_address = ? OR to_address = ?
|
|
601
|
-
ORDER BY created_at DESC
|
|
602
|
-
`)
|
|
603
|
-
.all(userAddrLower, userAddrLower);
|
|
604
|
-
return rows.map((r) => this.rowToMessage(r));
|
|
605
|
-
}
|
|
606
|
-
getMessageById(messageId) {
|
|
607
|
-
const row = this.db
|
|
608
|
-
.prepare(`
|
|
609
|
-
SELECT * FROM messages
|
|
610
|
-
WHERE message_id = ?
|
|
611
|
-
`)
|
|
612
|
-
.get(messageId);
|
|
613
|
-
if (!row)
|
|
614
|
-
return undefined;
|
|
615
|
-
return this.rowToMessage(row);
|
|
616
|
-
}
|
|
617
|
-
updateMessageId(oldMessageId, newMessageId, updates) {
|
|
618
|
-
const row = this.db
|
|
619
|
-
.prepare("SELECT * FROM messages WHERE message_id = ?")
|
|
620
|
-
.get(oldMessageId);
|
|
621
|
-
if (!row)
|
|
622
|
-
return false;
|
|
623
|
-
const getUpdatedValue = (updateValue, originalValue) => {
|
|
624
|
-
if (updateValue !== undefined)
|
|
625
|
-
return updateValue;
|
|
626
|
-
return originalValue === null ? undefined : originalValue;
|
|
627
|
-
};
|
|
628
|
-
const message = {
|
|
629
|
-
messageId: newMessageId,
|
|
630
|
-
fromAddress: row.from_address,
|
|
631
|
-
toAddress: row.to_address,
|
|
632
|
-
plaintextHash: row.plaintext_hash,
|
|
633
|
-
plaintext: row.plaintext === null ? undefined : row.plaintext,
|
|
634
|
-
guardAddress: row.guard_address === null ? undefined : row.guard_address,
|
|
635
|
-
passportAddress: row.passport_address === null
|
|
636
|
-
? undefined
|
|
637
|
-
: row.passport_address,
|
|
638
|
-
direction: row.direction,
|
|
639
|
-
status: updates?.status !== undefined ? updates.status : row.status,
|
|
640
|
-
msgType: row.msg_type,
|
|
641
|
-
leafIndex: getUpdatedValue(updates?.leafIndex, row.leaf_index),
|
|
642
|
-
prevRoot: getUpdatedValue(updates?.prevRoot, row.prev_root),
|
|
643
|
-
newRoot: getUpdatedValue(updates?.newRoot, row.new_root),
|
|
644
|
-
serverSignature: getUpdatedValue(updates?.serverSignature, row.server_signature),
|
|
645
|
-
serverPublicKey: getUpdatedValue(updates?.serverPublicKey, row.server_public_key),
|
|
646
|
-
serverTimestamp: getUpdatedValue(updates?.serverTimestamp, row.server_timestamp),
|
|
647
|
-
arkConfirmed: row.ark_recipient
|
|
648
|
-
? {
|
|
649
|
-
recipient: row.ark_recipient,
|
|
650
|
-
recipientPublicKey: row.ark_recipient_pubkey,
|
|
651
|
-
signature: row.ark_signature,
|
|
652
|
-
timestamp: row.ark_timestamp,
|
|
653
|
-
}
|
|
654
|
-
: undefined,
|
|
655
|
-
zipMetadata: row.zip_metadata
|
|
656
|
-
? JSON.parse(row.zip_metadata)
|
|
657
|
-
: undefined,
|
|
658
|
-
createdAt: row.created_at,
|
|
659
|
-
receivedAt: row.received_at === null ? undefined : row.received_at,
|
|
660
|
-
viewedAt: row.viewed_at === null ? undefined : row.viewed_at,
|
|
661
|
-
};
|
|
662
|
-
const transaction = this.db.transaction(() => {
|
|
663
|
-
this.db
|
|
664
|
-
.prepare("DELETE FROM messages WHERE message_id = ?")
|
|
665
|
-
.run(oldMessageId);
|
|
666
|
-
this.saveMessage(message);
|
|
667
|
-
});
|
|
668
|
-
try {
|
|
669
|
-
transaction();
|
|
670
|
-
return true;
|
|
671
|
-
}
|
|
672
|
-
catch (error) {
|
|
673
|
-
return false;
|
|
674
|
-
}
|
|
675
|
-
}
|
|
676
|
-
rowToMessage(row) {
|
|
677
|
-
if (row.to_address === null) {
|
|
678
|
-
throw new Error(`Message ${row.message_id} has null toAddress`);
|
|
679
|
-
}
|
|
680
|
-
return {
|
|
681
|
-
messageId: row.message_id,
|
|
682
|
-
fromAddress: row.from_address,
|
|
683
|
-
toAddress: row.to_address,
|
|
684
|
-
plaintextHash: row.plaintext_hash,
|
|
685
|
-
plaintext: row.plaintext === null ? undefined : row.plaintext,
|
|
686
|
-
guardAddress: row.guard_address === null ? undefined : row.guard_address,
|
|
687
|
-
passportAddress: row.passport_address === null
|
|
688
|
-
? undefined
|
|
689
|
-
: row.passport_address,
|
|
690
|
-
lastReceivedLeafIndex: row.last_received_leaf_index === null
|
|
691
|
-
? undefined
|
|
692
|
-
: row.last_received_leaf_index,
|
|
693
|
-
direction: row.direction,
|
|
694
|
-
status: row.status,
|
|
695
|
-
msgType: row.msg_type,
|
|
696
|
-
leafIndex: row.leaf_index === null ? undefined : row.leaf_index,
|
|
697
|
-
prevRoot: row.prev_root === null ? undefined : row.prev_root,
|
|
698
|
-
newRoot: row.new_root === null ? undefined : row.new_root,
|
|
699
|
-
serverSignature: row.server_signature === null
|
|
700
|
-
? undefined
|
|
701
|
-
: row.server_signature,
|
|
702
|
-
serverPublicKey: row.server_public_key === null
|
|
703
|
-
? undefined
|
|
704
|
-
: row.server_public_key,
|
|
705
|
-
serverTimestamp: row.server_timestamp === null
|
|
706
|
-
? undefined
|
|
707
|
-
: row.server_timestamp,
|
|
708
|
-
arkConfirmed: row.ark_recipient
|
|
709
|
-
? {
|
|
710
|
-
recipient: row.ark_recipient,
|
|
711
|
-
recipientPublicKey: row.ark_recipient_pubkey,
|
|
712
|
-
signature: row.ark_signature,
|
|
713
|
-
timestamp: row.ark_timestamp,
|
|
714
|
-
}
|
|
715
|
-
: undefined,
|
|
716
|
-
zipMetadata: row.zip_metadata
|
|
717
|
-
? JSON.parse(row.zip_metadata)
|
|
718
|
-
: undefined,
|
|
719
|
-
createdAt: row.created_at,
|
|
720
|
-
receivedAt: row.received_at === null ? undefined : row.received_at,
|
|
721
|
-
viewedAt: row.viewed_at === null ? undefined : row.viewed_at,
|
|
722
|
-
};
|
|
723
|
-
}
|
|
724
|
-
getLastReceivedLeafIndex(myAddress, peerAddress) {
|
|
725
|
-
const myAddrLower = myAddress.toLowerCase();
|
|
726
|
-
const peerAddrLower = peerAddress.toLowerCase();
|
|
727
|
-
const row = this.db
|
|
728
|
-
.prepare(`
|
|
729
|
-
SELECT MAX(leaf_index) as max_index
|
|
730
|
-
FROM messages
|
|
731
|
-
WHERE from_address = ? AND to_address = ?
|
|
732
|
-
AND status = 'decrypted'
|
|
733
|
-
AND leaf_index IS NOT NULL
|
|
734
|
-
`)
|
|
735
|
-
.get(peerAddrLower, myAddrLower);
|
|
736
|
-
return row?.max_index ?? -1;
|
|
737
|
-
}
|
|
738
|
-
}
|
|
739
|
-
export class SessionStateStorage {
|
|
740
|
-
userAddress;
|
|
741
|
-
constructor(userAddress) {
|
|
742
|
-
this.userAddress = userAddress;
|
|
743
|
-
}
|
|
744
|
-
get db() {
|
|
745
|
-
return getDatabase(this.userAddress);
|
|
746
|
-
}
|
|
747
|
-
getSessionId(myAddress, peerAddress) {
|
|
748
|
-
const addresses = [myAddress, peerAddress].sort();
|
|
749
|
-
return `${addresses[0]}:${addresses[1]}`;
|
|
750
|
-
}
|
|
751
|
-
getSessionState(myAddress, peerAddress) {
|
|
752
|
-
const sessionId = this.getSessionId(myAddress, peerAddress);
|
|
753
|
-
const row = this.db
|
|
754
|
-
.prepare("SELECT * FROM session_states WHERE session_id = ?")
|
|
755
|
-
.get(sessionId);
|
|
756
|
-
if (!row)
|
|
757
|
-
return undefined;
|
|
758
|
-
return {
|
|
759
|
-
sessionId: row.session_id,
|
|
760
|
-
myAddress: row.my_address,
|
|
761
|
-
peerAddress: row.peer_address,
|
|
762
|
-
currentRoot: row.current_root,
|
|
763
|
-
prevRoot: row.prev_root,
|
|
764
|
-
messageCount: row.message_count,
|
|
765
|
-
lastLeafIndex: row.last_leaf_index,
|
|
766
|
-
lastConfirmedHash: row.last_confirmed_hash === null ? "" : row.last_confirmed_hash,
|
|
767
|
-
lastSyncAt: row.last_sync_at === null ? 0 : row.last_sync_at,
|
|
768
|
-
createdAt: row.created_at,
|
|
769
|
-
updatedAt: row.updated_at,
|
|
770
|
-
};
|
|
771
|
-
}
|
|
772
|
-
updateSessionState(myAddress, peerAddress, updates) {
|
|
773
|
-
const sessionId = this.getSessionId(myAddress, peerAddress);
|
|
774
|
-
const existing = this.getSessionState(myAddress, peerAddress);
|
|
775
|
-
const now = Date.now();
|
|
776
|
-
if (existing) {
|
|
777
|
-
const updated = { ...existing, ...updates, updatedAt: now };
|
|
778
|
-
this.db
|
|
779
|
-
.prepare(`
|
|
780
|
-
UPDATE session_states SET
|
|
781
|
-
current_root = ?,
|
|
782
|
-
prev_root = ?,
|
|
783
|
-
message_count = ?,
|
|
784
|
-
last_leaf_index = ?,
|
|
785
|
-
last_confirmed_hash = ?,
|
|
786
|
-
last_sync_at = ?,
|
|
787
|
-
updated_at = ?
|
|
788
|
-
WHERE session_id = ?
|
|
789
|
-
`)
|
|
790
|
-
.run(updated.currentRoot, updated.prevRoot, updated.messageCount, updated.lastLeafIndex, updated.lastConfirmedHash, updated.lastSyncAt, updated.updatedAt, sessionId);
|
|
791
|
-
}
|
|
792
|
-
else {
|
|
793
|
-
const initialRoot = "0".repeat(64);
|
|
794
|
-
this.db
|
|
795
|
-
.prepare(`
|
|
796
|
-
INSERT INTO session_states (
|
|
797
|
-
session_id, my_address, peer_address, current_root, prev_root,
|
|
798
|
-
message_count, last_leaf_index, last_confirmed_hash, last_sync_at,
|
|
799
|
-
created_at, updated_at
|
|
800
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
801
|
-
`)
|
|
802
|
-
.run(sessionId, myAddress, peerAddress, updates.currentRoot ?? initialRoot, updates.prevRoot ?? initialRoot, updates.messageCount ?? 0, updates.lastLeafIndex ?? 0, updates.lastConfirmedHash ?? "", updates.lastSyncAt ?? 0, now, now);
|
|
803
|
-
}
|
|
804
|
-
}
|
|
805
|
-
getCurrentRoot(myAddress, peerAddress) {
|
|
806
|
-
const state = this.getSessionState(myAddress, peerAddress);
|
|
807
|
-
return state?.currentRoot ?? "0".repeat(64);
|
|
808
|
-
}
|
|
809
|
-
}
|
|
810
|
-
export class MessengerPersistStorage {
|
|
811
|
-
initialized = false;
|
|
812
|
-
get db() {
|
|
813
|
-
const db = getGlobalDatabase();
|
|
814
|
-
if (!this.initialized) {
|
|
815
|
-
this.initTable(db);
|
|
816
|
-
this.initialized = true;
|
|
817
|
-
}
|
|
818
|
-
return db;
|
|
819
|
-
}
|
|
820
|
-
initTable(db) {
|
|
821
|
-
db.exec(`
|
|
822
|
-
CREATE TABLE IF NOT EXISTS messenger_manager_state (
|
|
823
|
-
instance_id TEXT PRIMARY KEY,
|
|
824
|
-
state_data TEXT NOT NULL,
|
|
825
|
-
updated_at INTEGER NOT NULL
|
|
826
|
-
);
|
|
827
|
-
CREATE INDEX IF NOT EXISTS idx_messenger_state_updated ON messenger_manager_state(updated_at);
|
|
828
|
-
`);
|
|
829
|
-
db.exec(`
|
|
830
|
-
CREATE TABLE IF NOT EXISTS sse_connection_locks (
|
|
831
|
-
account_address TEXT PRIMARY KEY,
|
|
832
|
-
process_id TEXT NOT NULL,
|
|
833
|
-
instance_id TEXT NOT NULL,
|
|
834
|
-
last_heartbeat INTEGER NOT NULL,
|
|
835
|
-
created_at INTEGER NOT NULL
|
|
836
|
-
);
|
|
837
|
-
CREATE INDEX IF NOT EXISTS idx_sse_lock_heartbeat ON sse_connection_locks(last_heartbeat);
|
|
838
|
-
`);
|
|
839
|
-
db.exec(`
|
|
840
|
-
CREATE TABLE IF NOT EXISTS polling_connection_locks (
|
|
841
|
-
account_address TEXT PRIMARY KEY,
|
|
842
|
-
process_id TEXT NOT NULL,
|
|
843
|
-
instance_id TEXT NOT NULL,
|
|
844
|
-
last_heartbeat INTEGER NOT NULL,
|
|
845
|
-
created_at INTEGER NOT NULL
|
|
846
|
-
);
|
|
847
|
-
CREATE INDEX IF NOT EXISTS idx_polling_lock_heartbeat ON polling_connection_locks(last_heartbeat);
|
|
848
|
-
`);
|
|
849
|
-
}
|
|
850
|
-
saveState(instanceId, state) {
|
|
851
|
-
const data = JSON.stringify(state);
|
|
852
|
-
const now = Date.now();
|
|
853
|
-
this.db
|
|
854
|
-
.prepare(`
|
|
855
|
-
INSERT INTO messenger_manager_state (instance_id, state_data, updated_at)
|
|
856
|
-
VALUES (?, ?, ?)
|
|
857
|
-
ON CONFLICT(instance_id) DO UPDATE SET
|
|
858
|
-
state_data = excluded.state_data,
|
|
859
|
-
updated_at = excluded.updated_at
|
|
860
|
-
`)
|
|
861
|
-
.run(instanceId, data, now);
|
|
862
|
-
}
|
|
863
|
-
loadState(instanceId) {
|
|
864
|
-
const row = this.db
|
|
865
|
-
.prepare("SELECT state_data FROM messenger_manager_state WHERE instance_id = ?")
|
|
866
|
-
.get(instanceId);
|
|
867
|
-
if (!row?.state_data)
|
|
868
|
-
return null;
|
|
869
|
-
try {
|
|
870
|
-
return JSON.parse(row.state_data);
|
|
871
|
-
}
|
|
872
|
-
catch (error) {
|
|
873
|
-
return null;
|
|
874
|
-
}
|
|
875
|
-
}
|
|
876
|
-
deleteState(instanceId) {
|
|
877
|
-
this.db
|
|
878
|
-
.prepare("DELETE FROM messenger_manager_state WHERE instance_id = ?")
|
|
879
|
-
.run(instanceId);
|
|
880
|
-
}
|
|
881
|
-
getAllInstanceIds() {
|
|
882
|
-
const rows = this.db
|
|
883
|
-
.prepare("SELECT instance_id FROM messenger_manager_state ORDER BY updated_at DESC")
|
|
884
|
-
.all();
|
|
885
|
-
return rows.map((r) => r.instance_id);
|
|
886
|
-
}
|
|
887
|
-
get processId() {
|
|
888
|
-
return `pid_${process.pid}_${Date.now()}`;
|
|
889
|
-
}
|
|
890
|
-
tryAcquireSSELock(accountAddress, instanceId) {
|
|
891
|
-
const now = Date.now();
|
|
892
|
-
const heartbeatTimeout = 15000;
|
|
893
|
-
const transaction = this.db.transaction(() => {
|
|
894
|
-
const row = this.db
|
|
895
|
-
.prepare("SELECT * FROM sse_connection_locks WHERE account_address = ?")
|
|
896
|
-
.get(accountAddress.toLowerCase());
|
|
897
|
-
if (row) {
|
|
898
|
-
if (row.instance_id === instanceId) {
|
|
899
|
-
this.db
|
|
900
|
-
.prepare("UPDATE sse_connection_locks SET last_heartbeat = ? WHERE account_address = ?")
|
|
901
|
-
.run(now, accountAddress.toLowerCase());
|
|
902
|
-
return true;
|
|
903
|
-
}
|
|
904
|
-
if (now - row.last_heartbeat < heartbeatTimeout) {
|
|
905
|
-
return false;
|
|
906
|
-
}
|
|
907
|
-
}
|
|
908
|
-
this.db
|
|
909
|
-
.prepare(`
|
|
910
|
-
INSERT INTO sse_connection_locks (
|
|
911
|
-
account_address, process_id, instance_id, last_heartbeat, created_at
|
|
912
|
-
) VALUES (?, ?, ?, ?, ?)
|
|
913
|
-
ON CONFLICT(account_address) DO UPDATE SET
|
|
914
|
-
process_id = excluded.process_id,
|
|
915
|
-
instance_id = excluded.instance_id,
|
|
916
|
-
last_heartbeat = excluded.last_heartbeat
|
|
917
|
-
`)
|
|
918
|
-
.run(accountAddress.toLowerCase(), this.processId, instanceId, now, now);
|
|
919
|
-
return true;
|
|
920
|
-
});
|
|
921
|
-
try {
|
|
922
|
-
return transaction();
|
|
923
|
-
}
|
|
924
|
-
catch (error) {
|
|
925
|
-
console.warn("Failed to acquire SSE lock:", error);
|
|
926
|
-
return false;
|
|
927
|
-
}
|
|
928
|
-
}
|
|
929
|
-
updateSSELockHeartbeat(accountAddress, instanceId) {
|
|
930
|
-
const now = Date.now();
|
|
931
|
-
try {
|
|
932
|
-
this.db
|
|
933
|
-
.prepare("UPDATE sse_connection_locks SET last_heartbeat = ? WHERE account_address = ? AND instance_id = ?")
|
|
934
|
-
.run(now, accountAddress.toLowerCase(), instanceId);
|
|
935
|
-
}
|
|
936
|
-
catch (error) {
|
|
937
|
-
console.warn("Failed to update SSE lock heartbeat:", error);
|
|
938
|
-
}
|
|
939
|
-
}
|
|
940
|
-
releaseSSELock(accountAddress, instanceId) {
|
|
941
|
-
try {
|
|
942
|
-
this.db
|
|
943
|
-
.prepare("DELETE FROM sse_connection_locks WHERE account_address = ? AND instance_id = ?")
|
|
944
|
-
.run(accountAddress.toLowerCase(), instanceId);
|
|
945
|
-
}
|
|
946
|
-
catch (error) {
|
|
947
|
-
console.warn("Failed to release SSE lock:", error);
|
|
948
|
-
}
|
|
949
|
-
}
|
|
950
|
-
holdsSSELock(accountAddress, instanceId) {
|
|
951
|
-
const row = this.db
|
|
952
|
-
.prepare("SELECT * FROM sse_connection_locks WHERE account_address = ? AND instance_id = ?")
|
|
953
|
-
.get(accountAddress.toLowerCase(), instanceId);
|
|
954
|
-
return !!row;
|
|
955
|
-
}
|
|
956
|
-
tryAcquirePollingLock(accountAddress, instanceId) {
|
|
957
|
-
const now = Date.now();
|
|
958
|
-
const heartbeatTimeout = 60000;
|
|
959
|
-
const transaction = this.db.transaction(() => {
|
|
960
|
-
const row = this.db
|
|
961
|
-
.prepare("SELECT * FROM polling_connection_locks WHERE account_address = ?")
|
|
962
|
-
.get(accountAddress.toLowerCase());
|
|
963
|
-
if (row) {
|
|
964
|
-
if (row.instance_id === instanceId) {
|
|
965
|
-
this.db
|
|
966
|
-
.prepare("UPDATE polling_connection_locks SET last_heartbeat = ? WHERE account_address = ?")
|
|
967
|
-
.run(now, accountAddress.toLowerCase());
|
|
968
|
-
return true;
|
|
969
|
-
}
|
|
970
|
-
if (now - row.last_heartbeat < heartbeatTimeout) {
|
|
971
|
-
return false;
|
|
972
|
-
}
|
|
973
|
-
}
|
|
974
|
-
this.db
|
|
975
|
-
.prepare(`
|
|
976
|
-
INSERT INTO polling_connection_locks (
|
|
977
|
-
account_address, process_id, instance_id, last_heartbeat, created_at
|
|
978
|
-
) VALUES (?, ?, ?, ?, ?)
|
|
979
|
-
ON CONFLICT(account_address) DO UPDATE SET
|
|
980
|
-
process_id = excluded.process_id,
|
|
981
|
-
instance_id = excluded.instance_id,
|
|
982
|
-
last_heartbeat = excluded.last_heartbeat
|
|
983
|
-
`)
|
|
984
|
-
.run(accountAddress.toLowerCase(), this.processId, instanceId, now, now);
|
|
985
|
-
return true;
|
|
986
|
-
});
|
|
987
|
-
try {
|
|
988
|
-
return transaction();
|
|
989
|
-
}
|
|
990
|
-
catch (error) {
|
|
991
|
-
console.warn("Failed to acquire polling lock:", error);
|
|
992
|
-
return false;
|
|
993
|
-
}
|
|
994
|
-
}
|
|
995
|
-
updatePollingLockHeartbeat(accountAddress, instanceId) {
|
|
996
|
-
const now = Date.now();
|
|
997
|
-
try {
|
|
998
|
-
this.db
|
|
999
|
-
.prepare("UPDATE polling_connection_locks SET last_heartbeat = ? WHERE account_address = ? AND instance_id = ?")
|
|
1000
|
-
.run(now, accountAddress.toLowerCase(), instanceId);
|
|
1001
|
-
}
|
|
1002
|
-
catch (error) {
|
|
1003
|
-
console.warn("Failed to update polling lock heartbeat:", error);
|
|
1004
|
-
}
|
|
1005
|
-
}
|
|
1006
|
-
releasePollingLock(accountAddress, instanceId) {
|
|
1007
|
-
try {
|
|
1008
|
-
this.db
|
|
1009
|
-
.prepare("DELETE FROM polling_connection_locks WHERE account_address = ? AND instance_id = ?")
|
|
1010
|
-
.run(accountAddress.toLowerCase(), instanceId);
|
|
1011
|
-
}
|
|
1012
|
-
catch (error) {
|
|
1013
|
-
console.warn("Failed to release polling lock:", error);
|
|
1014
|
-
}
|
|
1015
|
-
}
|
|
1016
|
-
holdsPollingLock(accountAddress, instanceId) {
|
|
1017
|
-
const row = this.db
|
|
1018
|
-
.prepare("SELECT * FROM polling_connection_locks WHERE account_address = ? AND instance_id = ?")
|
|
1019
|
-
.get(accountAddress.toLowerCase(), instanceId);
|
|
1020
|
-
return !!row;
|
|
1021
|
-
}
|
|
1022
|
-
}
|
|
1023
|
-
export const defaultPersistStorage = new MessengerPersistStorage();
|
|
1
|
+
import a186a from'better-sqlite3';import*as a186b from'path';import*as a186c from'fs';import{getWowDir}from'../local/util.js';function getWowDirDynamic(){return getWowDir();}function getMessengerDbDir(){return a186b['join'](getWowDirDynamic(),'messenger');}function ensureDirExists(a){!a186c['existsSync'](a)&&a186c['mkdirSync'](a,{'recursive':!![]});}function getUserDbPath(a){const b=a['toLowerCase']()['replace'](/^0x/,'')['slice'](0x0,0x10),c=getMessengerDbDir();return ensureDirExists(c),a186b['join'](c,b+'.db');}function getGlobalDbPath(){const a=getMessengerDbDir();return ensureDirExists(a),a186b['join'](a,'global.db');}const userDbInstances=new Map();let globalDbInstance=null;function getDatabase(a){if(!a)throw new Error('userAddress\x20is\x20required\x20to\x20get\x20database');const b=userDbInstances['get'](a);if(b)return b;const c=getUserDbPath(a),d=new a186a(c);d['pragma']('journal_mode\x20=\x20WAL'),d['pragma']('synchronous\x20=\x20NORMAL'),d['pragma']('cache_size\x20=\x20-64000'),d['exec']('\x0a\x20\x20\x20\x20CREATE\x20TABLE\x20IF\x20NOT\x20EXISTS\x20signal_store\x20(\x0a\x20\x20\x20\x20\x20\x20store_type\x20TEXT\x20NOT\x20NULL,\x0a\x20\x20\x20\x20\x20\x20key\x20TEXT\x20NOT\x20NULL,\x0a\x20\x20\x20\x20\x20\x20value\x20TEXT\x20NOT\x20NULL,\x0a\x20\x20\x20\x20\x20\x20updated_at\x20INTEGER\x20DEFAULT\x20(strftime(\x27%s\x27,\x20\x27now\x27)),\x0a\x20\x20\x20\x20\x20\x20PRIMARY\x20KEY\x20(store_type,\x20key)\x0a\x20\x20\x20\x20);\x0a\x20\x20\x20\x20CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20idx_signal_store_type\x20ON\x20signal_store(store_type);\x0a\x20\x20');try{d['exec']('\x0a\x20\x20\x20\x20\x20\x20CREATE\x20TABLE\x20IF\x20NOT\x20EXISTS\x20messages\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20message_id\x20TEXT\x20PRIMARY\x20KEY,\x0a\x20\x20\x20\x20\x20\x20\x20\x20from_address\x20TEXT\x20NOT\x20NULL,\x0a\x20\x20\x20\x20\x20\x20\x20\x20to_address\x20TEXT\x20NOT\x20NULL,\x0a\x20\x20\x20\x20\x20\x20\x20\x20plaintext_hash\x20TEXT\x20NOT\x20NULL,\x0a\x20\x20\x20\x20\x20\x20\x20\x20plaintext\x20TEXT,\x0a\x20\x20\x20\x20\x20\x20\x20\x20guard_address\x20TEXT,\x0a\x20\x20\x20\x20\x20\x20\x20\x20passport_address\x20TEXT,\x0a\x20\x20\x20\x20\x20\x20\x20\x20direction\x20TEXT\x20NOT\x20NULL,\x0a\x20\x20\x20\x20\x20\x20\x20\x20status\x20TEXT\x20NOT\x20NULL,\x0a\x20\x20\x20\x20\x20\x20\x20\x20msg_type\x20INTEGER\x20NOT\x20NULL,\x0a\x20\x20\x20\x20\x20\x20\x20\x20leaf_index\x20INTEGER,\x0a\x20\x20\x20\x20\x20\x20\x20\x20prev_root\x20TEXT,\x0a\x20\x20\x20\x20\x20\x20\x20\x20new_root\x20TEXT,\x0a\x20\x20\x20\x20\x20\x20\x20\x20server_signature\x20TEXT,\x0a\x20\x20\x20\x20\x20\x20\x20\x20server_public_key\x20TEXT,\x0a\x20\x20\x20\x20\x20\x20\x20\x20server_timestamp\x20INTEGER,\x0a\x20\x20\x20\x20\x20\x20\x20\x20ark_recipient\x20TEXT,\x0a\x20\x20\x20\x20\x20\x20\x20\x20ark_recipient_pubkey\x20TEXT,\x0a\x20\x20\x20\x20\x20\x20\x20\x20ark_signature\x20TEXT,\x0a\x20\x20\x20\x20\x20\x20\x20\x20ark_timestamp\x20INTEGER,\x0a\x20\x20\x20\x20\x20\x20\x20\x20zip_metadata\x20TEXT,\x0a\x20\x20\x20\x20\x20\x20\x20\x20created_at\x20INTEGER\x20DEFAULT\x20(strftime(\x27%s\x27,\x20\x27now\x27)\x20*\x201000),\x0a\x20\x20\x20\x20\x20\x20\x20\x20received_at\x20INTEGER\x0a\x20\x20\x20\x20\x20\x20);\x0a\x20\x20\x20\x20');}catch(f){}try{d['exec']('ALTER\x20TABLE\x20messages\x20ADD\x20COLUMN\x20guard_address\x20TEXT');}catch(g){}try{d['exec']('ALTER\x20TABLE\x20messages\x20ADD\x20COLUMN\x20passport_address\x20TEXT');}catch(h){}try{d['exec']('ALTER\x20TABLE\x20messages\x20ADD\x20COLUMN\x20last_received_leaf_index\x20INTEGER');}catch(i){}try{d['exec']('ALTER\x20TABLE\x20messages\x20ADD\x20COLUMN\x20viewed_at\x20INTEGER');}catch(j){}try{d['exec']('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20idx_messages_from_to\x20ON\x20messages(from_address,\x20to_address)');}catch(k){}try{d['exec']('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20idx_messages_status\x20ON\x20messages(status)');}catch(l){}try{d['exec']('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20idx_messages_leaf\x20ON\x20messages(leaf_index)');}catch(m){}try{d['exec']('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20idx_messages_created_at\x20ON\x20messages(created_at)');}catch(n){}try{d['exec']('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20idx_messages_server_ts\x20ON\x20messages(server_timestamp)');}catch(o){}try{d['exec']('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20idx_messages_received_at\x20ON\x20messages(received_at)');}catch(p){}return d['exec']('\x0a\x20\x20\x20\x20CREATE\x20TABLE\x20IF\x20NOT\x20EXISTS\x20session_states\x20(\x0a\x20\x20\x20\x20\x20\x20session_id\x20TEXT\x20PRIMARY\x20KEY,\x0a\x20\x20\x20\x20\x20\x20my_address\x20TEXT\x20NOT\x20NULL,\x0a\x20\x20\x20\x20\x20\x20peer_address\x20TEXT\x20NOT\x20NULL,\x0a\x20\x20\x20\x20\x20\x20current_root\x20TEXT\x20NOT\x20NULL,\x0a\x20\x20\x20\x20\x20\x20prev_root\x20TEXT\x20NOT\x20NULL,\x0a\x20\x20\x20\x20\x20\x20message_count\x20INTEGER\x20DEFAULT\x200,\x0a\x20\x20\x20\x20\x20\x20last_leaf_index\x20INTEGER\x20DEFAULT\x200,\x0a\x20\x20\x20\x20\x20\x20last_confirmed_hash\x20TEXT,\x0a\x20\x20\x20\x20\x20\x20last_sync_at\x20INTEGER,\x0a\x20\x20\x20\x20\x20\x20created_at\x20INTEGER\x20DEFAULT\x20(strftime(\x27%s\x27,\x20\x27now\x27)),\x0a\x20\x20\x20\x20\x20\x20updated_at\x20INTEGER\x20DEFAULT\x20(strftime(\x27%s\x27,\x20\x27now\x27))\x0a\x20\x20\x20\x20);\x0a\x20\x20\x20\x20CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20idx_session_my_peer\x20ON\x20session_states(my_address,\x20peer_address);\x0a\x20\x20'),userDbInstances['set'](a,d),d;}function getGlobalDatabase(){if(globalDbInstance)return globalDbInstance;const a=getGlobalDbPath(),b=new a186a(a);return b['pragma']('journal_mode\x20=\x20WAL'),b['pragma']('synchronous\x20=\x20NORMAL'),b['pragma']('cache_size\x20=\x20-10000'),b['pragma']('busy_timeout\x20=\x205000'),globalDbInstance=b,b;}export function resetDbConnection(){for(const [a,b]of userDbInstances){try{b['pragma']('journal_mode\x20=\x20DELETE');}catch(c){}}for(const [d,f]of userDbInstances){try{f['close']();}catch(g){}}userDbInstances['clear']();if(globalDbInstance){try{globalDbInstance['pragma']('journal_mode\x20=\x20DELETE');}catch(h){}try{globalDbInstance['close']();}catch(i){}globalDbInstance=null;}}process['on']('exit',()=>{resetDbConnection();}),process['on']('SIGINT',()=>{resetDbConnection(),process['exit'](0x0);}),process['on']('SIGTERM',()=>{resetDbConnection(),process['exit'](0x0);});const STORE_TYPES={'IDENTITY':'identity','REGISTRATION_ID':'registration_id','IDENTITIES':'identities','PREKEYS':'prekeys','SIGNED_PREKEYS':'signed_prekeys','SESSIONS':'sessions','META':'meta'};function arrayBufferToBase64(a){return Buffer['from'](new Uint8Array(a))['toString']('base64');}function base64ToArrayBuffer(a){const b=Uint8Array['from'](Buffer['from'](a,'base64'));return b['slice']()['buffer'];}function bufferEqual(c,d){if(c['byteLength']!==d['byteLength'])return![];const e=new Uint8Array(c),f=new Uint8Array(d);for(let g=0x0;g<e['length'];g++){if(e[g]!==f[g])return![];}return!![];}export class SignalProtocolStorage{['storePrefix'];['userAddress'];constructor(a,b='default'){this['userAddress']=a,this['storePrefix']=b;}get['db'](){return getDatabase(this['userAddress']);}async['setIdentity'](a,b){const c={'pubKey':arrayBufferToBase64(a['pubKey']),'privKey':arrayBufferToBase64(a['privKey'])};this['putValue'](STORE_TYPES['IDENTITY'],JSON['stringify'](c)),this['putValue'](STORE_TYPES['REGISTRATION_ID'],b['toString']());}async['getIdentityKeyPair'](){const a=this['getValue'](STORE_TYPES['IDENTITY']);if(!a)return undefined;const b=JSON['parse'](a);return{'pubKey':base64ToArrayBuffer(b['pubKey']),'privKey':base64ToArrayBuffer(b['privKey'])};}async['getLocalRegistrationId'](){const a=this['getValue'](STORE_TYPES['REGISTRATION_ID']);return a?parseInt(a,0xa):undefined;}async['isTrustedIdentity'](a,b){const c=STORE_TYPES['IDENTITIES']+':'+a,d=this['getValue'](c);if(!d)return!![];return bufferEqual(base64ToArrayBuffer(d),b);}async['saveIdentity'](a,b){const c=STORE_TYPES['IDENTITIES']+':'+a,d=this['getValue'](c),e=arrayBufferToBase64(b);return this['putValue'](c,e),d?bufferEqual(base64ToArrayBuffer(d),b):!![];}async['loadIdentity'](a){const b=STORE_TYPES['IDENTITIES']+':'+a,c=this['getValue'](b);return c?base64ToArrayBuffer(c):undefined;}async['loadPreKey'](a){const b=STORE_TYPES['PREKEYS']+':'+a,c=this['getValue'](b);if(!c)return undefined;const d=JSON['parse'](c);return{'pubKey':base64ToArrayBuffer(d['pubKey']),'privKey':base64ToArrayBuffer(d['privKey'])};}async['storePreKey'](a,b){const c=STORE_TYPES['PREKEYS']+':'+a,d={'pubKey':arrayBufferToBase64(b['pubKey']),'privKey':arrayBufferToBase64(b['privKey'])};this['putValue'](c,JSON['stringify'](d));}async['removePreKey'](a){const b=STORE_TYPES['PREKEYS']+':'+a;this['delValue'](b);}async['loadSignedPreKey'](a){const b=STORE_TYPES['SIGNED_PREKEYS']+':'+a,c=this['getValue'](b);if(!c)return undefined;const d=JSON['parse'](c);return{'pubKey':base64ToArrayBuffer(d['pubKey']),'privKey':base64ToArrayBuffer(d['privKey'])};}async['storeSignedPreKey'](a,b){const c=STORE_TYPES['SIGNED_PREKEYS']+':'+a,d={'pubKey':arrayBufferToBase64(b['pubKey']),'privKey':arrayBufferToBase64(b['privKey'])};this['putValue'](c,JSON['stringify'](d));}async['removeSignedPreKey'](a){const b=STORE_TYPES['SIGNED_PREKEYS']+':'+a;this['delValue'](b);}async['loadSignedPreKeyWithSignature'](a){const b=STORE_TYPES['SIGNED_PREKEYS']+':'+a,c=this['getValue'](b);if(!c)return undefined;const d=JSON['parse'](c);if(!d['pubKey']||!d['privKey']||!d['signature'])return console['warn']('[Storage]\x20SignedPreKey\x20'+a+'\x20has\x20missing\x20fields,\x20treating\x20as\x20not\x20found'),undefined;return{'pubKey':base64ToArrayBuffer(d['pubKey']),'privKey':base64ToArrayBuffer(d['privKey']),'signature':base64ToArrayBuffer(d['signature'])};}async['storeSignedPreKeyWithSignature'](a,b,c){const d=STORE_TYPES['SIGNED_PREKEYS']+':'+a,e={'pubKey':arrayBufferToBase64(b['pubKey']),'privKey':arrayBufferToBase64(b['privKey']),'signature':arrayBufferToBase64(c)};this['putValue'](d,JSON['stringify'](e));}async['loadSession'](a){const b=STORE_TYPES['SESSIONS']+':'+a,c=this['getValue'](b);if(c)return c;if(a['startsWith']('send:')||a['startsWith']('recv:'))return undefined;const d=STORE_TYPES['SESSIONS']+':send:'+a,e=this['getValue'](d);if(e)return e;const f=STORE_TYPES['SESSIONS']+':recv:'+a,g=this['getValue'](f);if(g)return g;return undefined;}async['storeSession'](a,b){const c=STORE_TYPES['SESSIONS']+':'+a;this['putValue'](c,b);if(!a['startsWith']('send:')&&!a['startsWith']('recv:')){const d=STORE_TYPES['SESSIONS']+':recv:'+a;this['putValue'](d,b);}}async['removeSession'](a){const b=STORE_TYPES['SESSIONS']+':'+a;this['delValue'](b);if(!a['startsWith']('send:')&&!a['startsWith']('recv:')){const c=STORE_TYPES['SESSIONS']+':recv:'+a;this['delValue'](c);}}async['getMeta'](){const a=this['getValue'](STORE_TYPES['META']);if(!a)return{'nextPreKeyId':0x1};return JSON['parse'](a);}async['setMeta'](a){const b=await this['getMeta'](),c={...b,...a};this['putValue'](STORE_TYPES['META'],JSON['stringify'](c));}['listPreKeys'](){const a=this['db']['prepare']('SELECT\x20key\x20FROM\x20signal_store\x20WHERE\x20store_type\x20=\x20?\x20AND\x20key\x20LIKE\x20?')['all'](this['storePrefix'],STORE_TYPES['PREKEYS']+':%');return a['map'](b=>{const c=b['key']['replace'](STORE_TYPES['PREKEYS']+':','');return Number(c);});}['getValue'](a){const b=this['db']['prepare']('SELECT\x20value\x20FROM\x20signal_store\x20WHERE\x20store_type\x20=\x20?\x20AND\x20key\x20=\x20?')['get'](this['storePrefix'],a);return b?.['value'];}['putValue'](a,b){this['db']['prepare']('\x0a\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20signal_store\x20(store_type,\x20key,\x20value,\x20updated_at)\x20\x0a\x20\x20\x20\x20\x20\x20VALUES\x20(?,\x20?,\x20?,\x20strftime(\x27%s\x27,\x20\x27now\x27))\x0a\x20\x20\x20\x20\x20\x20ON\x20CONFLICT(store_type,\x20key)\x20DO\x20UPDATE\x20SET\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20value\x20=\x20excluded.value,\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20updated_at\x20=\x20excluded.updated_at\x0a\x20\x20\x20\x20')['run'](this['storePrefix'],a,b);}['delValue'](a){this['db']['prepare']('DELETE\x20FROM\x20signal_store\x20WHERE\x20store_type\x20=\x20?\x20AND\x20key\x20=\x20?')['run'](this['storePrefix'],a);}}export class MessageStorage{['userAddress'];constructor(a){this['userAddress']=a;}get['db'](){return getDatabase(this['userAddress']);}['saveMessage'](a){const b=a['direction']==='received'&&!a['receivedAt']?Date['now']():a['receivedAt'];this['db']['prepare']('\x0a\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20messages\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20message_id,\x20from_address,\x20to_address,\x20plaintext_hash,\x0a\x20\x20\x20\x20\x20\x20\x20\x20plaintext,\x20guard_address,\x20passport_address,\x20last_received_leaf_index,\x20direction,\x20status,\x20msg_type,\x0a\x20\x20\x20\x20\x20\x20\x20\x20leaf_index,\x20prev_root,\x20new_root,\x20server_signature,\x20server_public_key,\x20server_timestamp,\x0a\x20\x20\x20\x20\x20\x20\x20\x20ark_recipient,\x20ark_recipient_pubkey,\x20ark_signature,\x20ark_timestamp,\x20zip_metadata,\x0a\x20\x20\x20\x20\x20\x20\x20\x20created_at,\x20received_at\x0a\x20\x20\x20\x20\x20\x20)\x20VALUES\x20(?,\x20?,\x20?,\x20?,\x20?,\x20?,\x20?,\x20?,\x20?,\x20?,\x20?,\x20?,\x20?,\x20?,\x20?,\x20?,\x20?,\x20?,\x20?,\x20?,\x20?,\x20?,\x20?,\x20?)\x0a\x20\x20\x20\x20\x20\x20ON\x20CONFLICT(message_id)\x20DO\x20UPDATE\x20SET\x0a\x20\x20\x20\x20\x20\x20\x20\x20direction\x20=\x20COALESCE(excluded.direction,\x20direction),\x0a\x20\x20\x20\x20\x20\x20\x20\x20status\x20=\x20COALESCE(excluded.status,\x20status),\x0a\x20\x20\x20\x20\x20\x20\x20\x20leaf_index\x20=\x20COALESCE(excluded.leaf_index,\x20leaf_index),\x0a\x20\x20\x20\x20\x20\x20\x20\x20prev_root\x20=\x20COALESCE(excluded.prev_root,\x20prev_root),\x0a\x20\x20\x20\x20\x20\x20\x20\x20new_root\x20=\x20COALESCE(excluded.new_root,\x20new_root),\x0a\x20\x20\x20\x20\x20\x20\x20\x20server_signature\x20=\x20COALESCE(excluded.server_signature,\x20server_signature),\x0a\x20\x20\x20\x20\x20\x20\x20\x20server_public_key\x20=\x20COALESCE(excluded.server_public_key,\x20server_public_key),\x0a\x20\x20\x20\x20\x20\x20\x20\x20server_timestamp\x20=\x20COALESCE(excluded.server_timestamp,\x20server_timestamp),\x0a\x20\x20\x20\x20\x20\x20\x20\x20plaintext\x20=\x20COALESCE(excluded.plaintext,\x20plaintext),\x0a\x20\x20\x20\x20\x20\x20\x20\x20guard_address\x20=\x20COALESCE(excluded.guard_address,\x20guard_address),\x0a\x20\x20\x20\x20\x20\x20\x20\x20passport_address\x20=\x20COALESCE(excluded.passport_address,\x20passport_address),\x0a\x20\x20\x20\x20\x20\x20\x20\x20last_received_leaf_index\x20=\x20COALESCE(excluded.last_received_leaf_index,\x20last_received_leaf_index),\x0a\x20\x20\x20\x20\x20\x20\x20\x20ark_recipient\x20=\x20COALESCE(excluded.ark_recipient,\x20ark_recipient),\x0a\x20\x20\x20\x20\x20\x20\x20\x20ark_recipient_pubkey\x20=\x20COALESCE(excluded.ark_recipient_pubkey,\x20ark_recipient_pubkey),\x0a\x20\x20\x20\x20\x20\x20\x20\x20ark_signature\x20=\x20COALESCE(excluded.ark_signature,\x20ark_signature),\x0a\x20\x20\x20\x20\x20\x20\x20\x20ark_timestamp\x20=\x20COALESCE(excluded.ark_timestamp,\x20ark_timestamp),\x0a\x20\x20\x20\x20\x20\x20\x20\x20zip_metadata\x20=\x20COALESCE(excluded.zip_metadata,\x20zip_metadata),\x0a\x20\x20\x20\x20\x20\x20\x20\x20received_at\x20=\x20COALESCE(excluded.received_at,\x20received_at)\x0a\x20\x20\x20\x20')['run'](a['messageId'],a['fromAddress'],a['toAddress'],a['plaintextHash'],a['plaintext']===undefined?null:a['plaintext'],a['guardAddress']===undefined?null:a['guardAddress'],a['passportAddress']===undefined?null:a['passportAddress'],a['lastReceivedLeafIndex']===undefined?null:a['lastReceivedLeafIndex'],a['direction'],a['status'],a['msgType'],a['leafIndex']===undefined?null:a['leafIndex'],a['prevRoot']===undefined?null:a['prevRoot'],a['newRoot']===undefined?null:a['newRoot'],a['serverSignature']===undefined?null:a['serverSignature'],a['serverPublicKey']===undefined?null:a['serverPublicKey'],a['serverTimestamp']===undefined?null:a['serverTimestamp'],a['arkConfirmed']?.['recipient']===undefined?null:a['arkConfirmed']?.['recipient'],a['arkConfirmed']?.['recipientPublicKey']===undefined?null:a['arkConfirmed']?.['recipientPublicKey'],a['arkConfirmed']?.['signature']===undefined?null:a['arkConfirmed']?.['signature'],a['arkConfirmed']?.['timestamp']===undefined?null:a['arkConfirmed']?.['timestamp'],a['zipMetadata']?JSON['stringify'](a['zipMetadata']):null,a['createdAt'],b===undefined?null:b);}['getMessage'](a){const b=this['db']['prepare']('SELECT\x20*\x20FROM\x20messages\x20WHERE\x20message_id\x20=\x20?')['get'](a);if(!b)return undefined;return this['rowToMessage'](b);}['getMessagesBySession'](a,b){const c=a['toLowerCase'](),d=b['toLowerCase'](),e=this['db']['prepare']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20*\x20FROM\x20messages\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20(from_address\x20=\x20?\x20AND\x20to_address\x20=\x20?)\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20OR\x20(from_address\x20=\x20?\x20AND\x20to_address\x20=\x20?)\x0a\x20\x20\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20created_at\x20ASC\x0a\x20\x20\x20\x20\x20\x20')['all'](c,d,d,c);return e['map'](f=>this['rowToMessage'](f));}['getPendingMessages'](a){const b=a['toLowerCase'](),c=this['db']['prepare']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20*\x20FROM\x20messages\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20(from_address\x20=\x20?\x20OR\x20to_address\x20=\x20?)\x20AND\x20status\x20=\x20?\x0a\x20\x20\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20created_at\x20ASC\x0a\x20\x20\x20\x20\x20\x20')['all'](b,b,'pending');return c['map'](d=>this['rowToMessage'](d));}['updateMessageStatus'](a,b,c){const d=['status\x20=\x20?'],e=[b];c?.['leafIndex']!==undefined&&(d['push']('leaf_index\x20=\x20?'),e['push'](c['leafIndex'])),c?.['newRoot']!==undefined&&(d['push']('new_root\x20=\x20?'),e['push'](c['newRoot'])),c?.['serverSignature']!==undefined&&(d['push']('server_signature\x20=\x20?'),e['push'](c['serverSignature'])),c?.['serverTimestamp']!==undefined&&(d['push']('server_timestamp\x20=\x20?'),e['push'](c['serverTimestamp'])),c?.['serverPublicKey']!==undefined&&(d['push']('server_public_key\x20=\x20?'),e['push'](c['serverPublicKey'])),e['push'](a),this['db']['prepare']('\x0a\x20\x20\x20\x20\x20\x20UPDATE\x20messages\x20SET\x20'+d['join'](',\x20')+'\x20WHERE\x20message_id\x20=\x20?\x0a\x20\x20\x20\x20')['run'](...e);}['updateMessageViewed'](a,b){const c=b??Date['now'](),d=this['db']['prepare']('\x0a\x09\x09\x09\x09UPDATE\x20messages\x0a\x09\x09\x09\x09SET\x20viewed_at\x20=\x20?\x0a\x09\x09\x09\x09WHERE\x20message_id\x20=\x20?\x20AND\x20viewed_at\x20IS\x20NULL\x0a\x09\x09\x09')['run'](c,a);return d['changes']>0x0;}['updateMessagesViewed'](a,b){if(a['length']===0x0)return 0x0;const c=b??Date['now'](),d=a['map'](()=>'?')['join'](','),e=this['db']['prepare']('\x0a\x09\x09\x09\x09UPDATE\x20messages\x0a\x09\x09\x09\x09SET\x20viewed_at\x20=\x20?\x0a\x09\x09\x09\x09WHERE\x20message_id\x20IN\x20('+d+')\x20AND\x20viewed_at\x20IS\x20NULL\x0a\x09\x09\x09')['run'](c,...a);return e['changes'];}['getAllMessages'](a){const b=a['toLowerCase'](),c=this['db']['prepare']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20*\x20FROM\x20messages\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20from_address\x20=\x20?\x20OR\x20to_address\x20=\x20?\x0a\x20\x20\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20created_at\x20DESC\x0a\x20\x20\x20\x20\x20\x20')['all'](b,b);return c['map'](d=>this['rowToMessage'](d));}['getMessageById'](a){const b=this['db']['prepare']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20*\x20FROM\x20messages\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20message_id\x20=\x20?\x0a\x20\x20\x20\x20\x20\x20')['get'](a);if(!b)return undefined;return this['rowToMessage'](b);}['updateMessageId'](a,b,c){const d=this['db']['prepare']('SELECT\x20*\x20FROM\x20messages\x20WHERE\x20message_id\x20=\x20?')['get'](a);if(!d)return![];const e=(h,i)=>{if(h!==undefined)return h;return i===null?undefined:i;},f={'messageId':b,'fromAddress':d['from_address'],'toAddress':d['to_address'],'plaintextHash':d['plaintext_hash'],'plaintext':d['plaintext']===null?undefined:d['plaintext'],'guardAddress':d['guard_address']===null?undefined:d['guard_address'],'passportAddress':d['passport_address']===null?undefined:d['passport_address'],'direction':d['direction'],'status':c?.['status']!==undefined?c['status']:d['status'],'msgType':d['msg_type'],'leafIndex':e(c?.['leafIndex'],d['leaf_index']),'prevRoot':e(c?.['prevRoot'],d['prev_root']),'newRoot':e(c?.['newRoot'],d['new_root']),'serverSignature':e(c?.['serverSignature'],d['server_signature']),'serverPublicKey':e(c?.['serverPublicKey'],d['server_public_key']),'serverTimestamp':e(c?.['serverTimestamp'],d['server_timestamp']),'arkConfirmed':d['ark_recipient']?{'recipient':d['ark_recipient'],'recipientPublicKey':d['ark_recipient_pubkey'],'signature':d['ark_signature'],'timestamp':d['ark_timestamp']}:undefined,'zipMetadata':d['zip_metadata']?JSON['parse'](d['zip_metadata']):undefined,'createdAt':d['created_at'],'receivedAt':d['received_at']===null?undefined:d['received_at'],'viewedAt':d['viewed_at']===null?undefined:d['viewed_at']},g=this['db']['transaction'](()=>{this['db']['prepare']('DELETE\x20FROM\x20messages\x20WHERE\x20message_id\x20=\x20?')['run'](a),this['saveMessage'](f);});try{return g(),!![];}catch(h){return![];}}['rowToMessage'](a){if(a['to_address']===null)throw new Error('Message\x20'+a['message_id']+'\x20has\x20null\x20toAddress');return{'messageId':a['message_id'],'fromAddress':a['from_address'],'toAddress':a['to_address'],'plaintextHash':a['plaintext_hash'],'plaintext':a['plaintext']===null?undefined:a['plaintext'],'guardAddress':a['guard_address']===null?undefined:a['guard_address'],'passportAddress':a['passport_address']===null?undefined:a['passport_address'],'lastReceivedLeafIndex':a['last_received_leaf_index']===null?undefined:a['last_received_leaf_index'],'direction':a['direction'],'status':a['status'],'msgType':a['msg_type'],'leafIndex':a['leaf_index']===null?undefined:a['leaf_index'],'prevRoot':a['prev_root']===null?undefined:a['prev_root'],'newRoot':a['new_root']===null?undefined:a['new_root'],'serverSignature':a['server_signature']===null?undefined:a['server_signature'],'serverPublicKey':a['server_public_key']===null?undefined:a['server_public_key'],'serverTimestamp':a['server_timestamp']===null?undefined:a['server_timestamp'],'arkConfirmed':a['ark_recipient']?{'recipient':a['ark_recipient'],'recipientPublicKey':a['ark_recipient_pubkey'],'signature':a['ark_signature'],'timestamp':a['ark_timestamp']}:undefined,'zipMetadata':a['zip_metadata']?JSON['parse'](a['zip_metadata']):undefined,'createdAt':a['created_at'],'receivedAt':a['received_at']===null?undefined:a['received_at'],'viewedAt':a['viewed_at']===null?undefined:a['viewed_at']};}['getLastReceivedLeafIndex'](a,b){const c=a['toLowerCase'](),d=b['toLowerCase'](),e=this['db']['prepare']('\x0a\x09\x09\x09\x09SELECT\x20MAX(leaf_index)\x20as\x20max_index\x0a\x09\x09\x09\x09FROM\x20messages\x0a\x09\x09\x09\x09WHERE\x20from_address\x20=\x20?\x20AND\x20to_address\x20=\x20?\x0a\x09\x09\x09\x09\x09AND\x20status\x20=\x20\x27decrypted\x27\x0a\x09\x09\x09\x09\x09AND\x20leaf_index\x20IS\x20NOT\x20NULL\x0a\x09\x09\x09')['get'](d,c);return e?.['max_index']??-0x1;}}export class SessionStateStorage{['userAddress'];constructor(a){this['userAddress']=a;}get['db'](){return getDatabase(this['userAddress']);}['getSessionId'](a,b){const c=[a,b]['sort']();return c[0x0]+':'+c[0x1];}['getSessionState'](a,b){const c=this['getSessionId'](a,b),d=this['db']['prepare']('SELECT\x20*\x20FROM\x20session_states\x20WHERE\x20session_id\x20=\x20?')['get'](c);if(!d)return undefined;return{'sessionId':d['session_id'],'myAddress':d['my_address'],'peerAddress':d['peer_address'],'currentRoot':d['current_root'],'prevRoot':d['prev_root'],'messageCount':d['message_count'],'lastLeafIndex':d['last_leaf_index'],'lastConfirmedHash':d['last_confirmed_hash']===null?'':d['last_confirmed_hash'],'lastSyncAt':d['last_sync_at']===null?0x0:d['last_sync_at'],'createdAt':d['created_at'],'updatedAt':d['updated_at']};}['updateSessionState'](a,b,c){const d=this['getSessionId'](a,b),e=this['getSessionState'](a,b),f=Date['now']();if(e){const g={...e,...c,'updatedAt':f};this['db']['prepare']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20UPDATE\x20session_states\x20SET\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20current_root\x20=\x20?,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20prev_root\x20=\x20?,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20message_count\x20=\x20?,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20last_leaf_index\x20=\x20?,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20last_confirmed_hash\x20=\x20?,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20last_sync_at\x20=\x20?,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20updated_at\x20=\x20?\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20session_id\x20=\x20?\x0a\x20\x20\x20\x20\x20\x20')['run'](g['currentRoot'],g['prevRoot'],g['messageCount'],g['lastLeafIndex'],g['lastConfirmedHash'],g['lastSyncAt'],g['updatedAt'],d);}else{const h='0'['repeat'](0x40);this['db']['prepare']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20session_states\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20session_id,\x20my_address,\x20peer_address,\x20current_root,\x20prev_root,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20message_count,\x20last_leaf_index,\x20last_confirmed_hash,\x20last_sync_at,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20created_at,\x20updated_at\x0a\x20\x20\x20\x20\x20\x20\x20\x20)\x20VALUES\x20(?,\x20?,\x20?,\x20?,\x20?,\x20?,\x20?,\x20?,\x20?,\x20?,\x20?)\x0a\x20\x20\x20\x20\x20\x20')['run'](d,a,b,c['currentRoot']??h,c['prevRoot']??h,c['messageCount']??0x0,c['lastLeafIndex']??0x0,c['lastConfirmedHash']??'',c['lastSyncAt']??0x0,f,f);}}['getCurrentRoot'](a,b){const c=this['getSessionState'](a,b);return c?.['currentRoot']??'0'['repeat'](0x40);}}export class MessengerPersistStorage{['initialized']=![];get['db'](){const a=getGlobalDatabase();return!this['initialized']&&(this['initTable'](a),this['initialized']=!![]),a;}['initTable'](a){a['exec']('\x0a\x09\x09\x09CREATE\x20TABLE\x20IF\x20NOT\x20EXISTS\x20messenger_manager_state\x20(\x0a\x09\x09\x09\x09instance_id\x20TEXT\x20PRIMARY\x20KEY,\x0a\x09\x09\x09\x09state_data\x20TEXT\x20NOT\x20NULL,\x0a\x09\x09\x09\x09updated_at\x20INTEGER\x20NOT\x20NULL\x0a\x09\x09\x09);\x0a\x09\x09\x09CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20idx_messenger_state_updated\x20ON\x20messenger_manager_state(updated_at);\x0a\x09\x09'),a['exec']('\x0a\x09\x09\x09CREATE\x20TABLE\x20IF\x20NOT\x20EXISTS\x20sse_connection_locks\x20(\x0a\x09\x09\x09\x09account_address\x20TEXT\x20PRIMARY\x20KEY,\x0a\x09\x09\x09\x09process_id\x20TEXT\x20NOT\x20NULL,\x0a\x09\x09\x09\x09instance_id\x20TEXT\x20NOT\x20NULL,\x0a\x09\x09\x09\x09last_heartbeat\x20INTEGER\x20NOT\x20NULL,\x0a\x09\x09\x09\x09created_at\x20INTEGER\x20NOT\x20NULL\x0a\x09\x09\x09);\x0a\x09\x09\x09CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20idx_sse_lock_heartbeat\x20ON\x20sse_connection_locks(last_heartbeat);\x0a\x09\x09'),a['exec']('\x0a\x09\x09\x09CREATE\x20TABLE\x20IF\x20NOT\x20EXISTS\x20polling_connection_locks\x20(\x0a\x09\x09\x09\x09account_address\x20TEXT\x20PRIMARY\x20KEY,\x0a\x09\x09\x09\x09process_id\x20TEXT\x20NOT\x20NULL,\x0a\x09\x09\x09\x09instance_id\x20TEXT\x20NOT\x20NULL,\x0a\x09\x09\x09\x09last_heartbeat\x20INTEGER\x20NOT\x20NULL,\x0a\x09\x09\x09\x09created_at\x20INTEGER\x20NOT\x20NULL\x0a\x09\x09\x09);\x0a\x09\x09\x09CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20idx_polling_lock_heartbeat\x20ON\x20polling_connection_locks(last_heartbeat);\x0a\x09\x09');}['saveState'](a,b){const c=JSON['stringify'](b),d=Date['now']();this['db']['prepare']('\x0a\x09\x09\x09\x09INSERT\x20INTO\x20messenger_manager_state\x20(instance_id,\x20state_data,\x20updated_at)\x0a\x09\x09\x09\x09VALUES\x20(?,\x20?,\x20?)\x0a\x09\x09\x09\x09ON\x20CONFLICT(instance_id)\x20DO\x20UPDATE\x20SET\x0a\x09\x09\x09\x09\x09state_data\x20=\x20excluded.state_data,\x0a\x09\x09\x09\x09\x09updated_at\x20=\x20excluded.updated_at\x0a\x09\x09\x09')['run'](a,c,d);}['loadState'](a){const b=this['db']['prepare']('SELECT\x20state_data\x20FROM\x20messenger_manager_state\x20WHERE\x20instance_id\x20=\x20?')['get'](a);if(!b?.['state_data'])return null;try{return JSON['parse'](b['state_data']);}catch(c){return null;}}['deleteState'](a){this['db']['prepare']('DELETE\x20FROM\x20messenger_manager_state\x20WHERE\x20instance_id\x20=\x20?')['run'](a);}['getAllInstanceIds'](){const a=this['db']['prepare']('SELECT\x20instance_id\x20FROM\x20messenger_manager_state\x20ORDER\x20BY\x20updated_at\x20DESC')['all']();return a['map'](b=>b['instance_id']);}get['processId'](){return'pid_'+process['pid']+'_'+Date['now']();}['tryAcquireSSELock'](a,b){const c=Date['now'](),d=0x3a98,e=this['db']['transaction'](()=>{const f=this['db']['prepare']('SELECT\x20*\x20FROM\x20sse_connection_locks\x20WHERE\x20account_address\x20=\x20?')['get'](a['toLowerCase']());if(f){if(f['instance_id']===b)return this['db']['prepare']('UPDATE\x20sse_connection_locks\x20SET\x20last_heartbeat\x20=\x20?\x20WHERE\x20account_address\x20=\x20?')['run'](c,a['toLowerCase']()),!![];if(c-f['last_heartbeat']<d)return![];}return this['db']['prepare']('\x0a\x09\x09\x09\x09\x09INSERT\x20INTO\x20sse_connection_locks\x20(\x0a\x09\x09\x09\x09\x09\x09account_address,\x20process_id,\x20instance_id,\x20last_heartbeat,\x20created_at\x0a\x09\x09\x09\x09\x09)\x20VALUES\x20(?,\x20?,\x20?,\x20?,\x20?)\x0a\x09\x09\x09\x09\x09ON\x20CONFLICT(account_address)\x20DO\x20UPDATE\x20SET\x0a\x09\x09\x09\x09\x09\x09process_id\x20=\x20excluded.process_id,\x0a\x09\x09\x09\x09\x09\x09instance_id\x20=\x20excluded.instance_id,\x0a\x09\x09\x09\x09\x09\x09last_heartbeat\x20=\x20excluded.last_heartbeat\x0a\x09\x09\x09\x09')['run'](a['toLowerCase'](),this['processId'],b,c,c),!![];});try{return e();}catch(f){return console['warn']('Failed\x20to\x20acquire\x20SSE\x20lock:',f),![];}}['updateSSELockHeartbeat'](a,b){const c=Date['now']();try{this['db']['prepare']('UPDATE\x20sse_connection_locks\x20SET\x20last_heartbeat\x20=\x20?\x20WHERE\x20account_address\x20=\x20?\x20AND\x20instance_id\x20=\x20?')['run'](c,a['toLowerCase'](),b);}catch(d){console['warn']('Failed\x20to\x20update\x20SSE\x20lock\x20heartbeat:',d);}}['releaseSSELock'](a,b){try{this['db']['prepare']('DELETE\x20FROM\x20sse_connection_locks\x20WHERE\x20account_address\x20=\x20?\x20AND\x20instance_id\x20=\x20?')['run'](a['toLowerCase'](),b);}catch(c){console['warn']('Failed\x20to\x20release\x20SSE\x20lock:',c);}}['holdsSSELock'](a,b){const c=this['db']['prepare']('SELECT\x20*\x20FROM\x20sse_connection_locks\x20WHERE\x20account_address\x20=\x20?\x20AND\x20instance_id\x20=\x20?')['get'](a['toLowerCase'](),b);return!!c;}['tryAcquirePollingLock'](a,b){const c=Date['now'](),d=0xea60,e=this['db']['transaction'](()=>{const f=this['db']['prepare']('SELECT\x20*\x20FROM\x20polling_connection_locks\x20WHERE\x20account_address\x20=\x20?')['get'](a['toLowerCase']());if(f){if(f['instance_id']===b)return this['db']['prepare']('UPDATE\x20polling_connection_locks\x20SET\x20last_heartbeat\x20=\x20?\x20WHERE\x20account_address\x20=\x20?')['run'](c,a['toLowerCase']()),!![];if(c-f['last_heartbeat']<d)return![];}return this['db']['prepare']('\x0a\x09\x09\x09\x09\x09INSERT\x20INTO\x20polling_connection_locks\x20(\x0a\x09\x09\x09\x09\x09\x09account_address,\x20process_id,\x20instance_id,\x20last_heartbeat,\x20created_at\x0a\x09\x09\x09\x09\x09)\x20VALUES\x20(?,\x20?,\x20?,\x20?,\x20?)\x0a\x09\x09\x09\x09\x09ON\x20CONFLICT(account_address)\x20DO\x20UPDATE\x20SET\x0a\x09\x09\x09\x09\x09\x09process_id\x20=\x20excluded.process_id,\x0a\x09\x09\x09\x09\x09\x09instance_id\x20=\x20excluded.instance_id,\x0a\x09\x09\x09\x09\x09\x09last_heartbeat\x20=\x20excluded.last_heartbeat\x0a\x09\x09\x09\x09')['run'](a['toLowerCase'](),this['processId'],b,c,c),!![];});try{return e();}catch(f){return console['warn']('Failed\x20to\x20acquire\x20polling\x20lock:',f),![];}}['updatePollingLockHeartbeat'](a,b){const c=Date['now']();try{this['db']['prepare']('UPDATE\x20polling_connection_locks\x20SET\x20last_heartbeat\x20=\x20?\x20WHERE\x20account_address\x20=\x20?\x20AND\x20instance_id\x20=\x20?')['run'](c,a['toLowerCase'](),b);}catch(d){console['warn']('Failed\x20to\x20update\x20polling\x20lock\x20heartbeat:',d);}}['releasePollingLock'](a,b){try{this['db']['prepare']('DELETE\x20FROM\x20polling_connection_locks\x20WHERE\x20account_address\x20=\x20?\x20AND\x20instance_id\x20=\x20?')['run'](a['toLowerCase'](),b);}catch(c){console['warn']('Failed\x20to\x20release\x20polling\x20lock:',c);}}['holdsPollingLock'](a,b){const c=this['db']['prepare']('SELECT\x20*\x20FROM\x20polling_connection_locks\x20WHERE\x20account_address\x20=\x20?\x20AND\x20instance_id\x20=\x20?')['get'](a['toLowerCase'](),b);return!!c;}}export const defaultPersistStorage=new MessengerPersistStorage();
|