wowok 2.1.10 → 2.1.13
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.d.ts +199 -199
- package/dist/cjs/bcs/bcs.js +273 -318
- package/dist/cjs/bcs/bcs.js.map +1 -0
- package/dist/cjs/bcs/effects.d.ts +109 -109
- package/dist/cjs/bcs/effects.js +205 -230
- package/dist/cjs/bcs/effects.js.map +1 -0
- package/dist/cjs/bcs/index.d.ts +1 -2584
- package/dist/cjs/bcs/index.js +61 -76
- package/dist/cjs/bcs/index.js.map +1 -0
- package/dist/cjs/bcs/pure.js +38 -58
- package/dist/cjs/bcs/pure.js.map +1 -0
- package/dist/cjs/bcs/type-tag-serializer.js +102 -114
- package/dist/cjs/bcs/type-tag-serializer.js.map +1 -0
- package/dist/cjs/bcs/types.js +6 -23
- package/dist/cjs/bcs/types.js.map +1 -0
- package/dist/cjs/client/index.js +17 -33
- package/dist/cjs/client/index.js.map +1 -0
- package/dist/cjs/client/network.js +25 -40
- package/dist/cjs/client/network.js.map +1 -0
- package/dist/cjs/cryptography/index.js +29 -45
- package/dist/cjs/cryptography/index.js.map +1 -0
- package/dist/cjs/cryptography/intent.d.ts +1 -1
- package/dist/cjs/cryptography/intent.js +20 -31
- package/dist/cjs/cryptography/intent.js.map +1 -0
- package/dist/cjs/cryptography/keypair.js +102 -116
- package/dist/cjs/cryptography/keypair.js.map +1 -0
- package/dist/cjs/cryptography/mnemonics.js +43 -41
- package/dist/cjs/cryptography/mnemonics.js.map +1 -0
- package/dist/cjs/cryptography/publickey.js +112 -134
- package/dist/cjs/cryptography/publickey.js.map +1 -0
- package/dist/cjs/cryptography/signature-scheme.js +24 -43
- package/dist/cjs/cryptography/signature-scheme.js.map +1 -0
- package/dist/cjs/cryptography/signature.d.ts +2 -24
- package/dist/cjs/cryptography/signature.js +50 -67
- package/dist/cjs/cryptography/signature.js.map +1 -0
- package/dist/cjs/experimental/cache.js +65 -0
- package/dist/cjs/experimental/cache.js.map +1 -0
- package/dist/cjs/experimental/client.js +27 -0
- package/dist/cjs/experimental/client.js.map +1 -0
- package/dist/cjs/experimental/core.js +89 -0
- package/dist/cjs/experimental/core.js.map +1 -0
- package/dist/cjs/experimental/errors.js +32 -0
- package/dist/cjs/experimental/errors.js.map +1 -0
- package/dist/cjs/experimental/index.js +15 -0
- package/dist/cjs/experimental/index.js.map +1 -0
- package/dist/cjs/experimental/persistent-storage.js +343 -0
- package/dist/cjs/experimental/persistent-storage.js.map +1 -0
- package/dist/cjs/experimental/persistent-storage.test.js +200 -0
- package/dist/cjs/experimental/persistent-storage.test.js.map +1 -0
- package/dist/cjs/experimental/transports/utils.js +104 -0
- package/dist/cjs/experimental/transports/utils.js.map +1 -0
- package/dist/cjs/experimental/types.js +6 -0
- package/dist/cjs/experimental/types.js.map +1 -0
- package/dist/cjs/faucet/faucet.js +106 -124
- package/dist/cjs/faucet/faucet.js.map +1 -0
- package/dist/cjs/faucet/index.js +12 -28
- package/dist/cjs/faucet/index.js.map +1 -0
- package/dist/cjs/grpc/client.js +47 -62
- package/dist/cjs/grpc/client.js.map +1 -0
- package/dist/cjs/grpc/core.js +580 -617
- package/dist/cjs/grpc/core.js.map +1 -0
- package/dist/cjs/grpc/index.js +9 -25
- package/dist/cjs/grpc/index.js.map +1 -0
- package/dist/cjs/grpc/proto/google/protobuf/any.js +168 -135
- package/dist/cjs/grpc/proto/google/protobuf/any.js.map +1 -0
- package/dist/cjs/grpc/proto/google/protobuf/duration.js +105 -90
- package/dist/cjs/grpc/proto/google/protobuf/duration.js.map +1 -0
- package/dist/cjs/grpc/proto/google/protobuf/empty.js +50 -28
- package/dist/cjs/grpc/proto/google/protobuf/empty.js.map +1 -0
- package/dist/cjs/grpc/proto/google/protobuf/field_mask.js +96 -75
- package/dist/cjs/grpc/proto/google/protobuf/field_mask.js.map +1 -0
- package/dist/cjs/grpc/proto/google/protobuf/struct.js +266 -215
- package/dist/cjs/grpc/proto/google/protobuf/struct.js.map +1 -0
- package/dist/cjs/grpc/proto/google/protobuf/timestamp.js +150 -131
- package/dist/cjs/grpc/proto/google/protobuf/timestamp.js.map +1 -0
- package/dist/cjs/grpc/proto/google/rpc/error_details.js +331 -302
- package/dist/cjs/grpc/proto/google/rpc/error_details.js.map +1 -0
- package/dist/cjs/grpc/proto/google/rpc/status.js +50 -50
- package/dist/cjs/grpc/proto/google/rpc/status.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/argument.js +84 -68
- package/dist/cjs/grpc/proto/sui/rpc/v2/argument.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/balance_change.js +45 -50
- package/dist/cjs/grpc/proto/sui/rpc/v2/balance_change.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/bcs.js +38 -43
- package/dist/cjs/grpc/proto/sui/rpc/v2/bcs.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint.js +70 -75
- package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint_contents.js +79 -81
- package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint_contents.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint_summary.js +183 -166
- package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint_summary.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/effects.js +369 -296
- package/dist/cjs/grpc/proto/sui/rpc/v2/effects.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/epoch.js +80 -85
- package/dist/cjs/grpc/proto/sui/rpc/v2/epoch.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/error_reason.js +31 -28
- package/dist/cjs/grpc/proto/sui/rpc/v2/error_reason.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/event.js +81 -83
- package/dist/cjs/grpc/proto/sui/rpc/v2/event.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/executed_transaction.js +80 -85
- package/dist/cjs/grpc/proto/sui/rpc/v2/executed_transaction.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/execution_status.js +876 -506
- package/dist/cjs/grpc/proto/sui/rpc/v2/execution_status.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/gas_cost_summary.js +56 -61
- package/dist/cjs/grpc/proto/sui/rpc/v2/gas_cost_summary.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/input.js +103 -83
- package/dist/cjs/grpc/proto/sui/rpc/v2/input.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/jwk.js +76 -78
- package/dist/cjs/grpc/proto/sui/rpc/v2/jwk.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/ledger_service.client.js +69 -119
- package/dist/cjs/grpc/proto/sui/rpc/v2/ledger_service.client.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/ledger_service.js +392 -350
- package/dist/cjs/grpc/proto/sui/rpc/v2/ledger_service.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/move_package.js +599 -473
- package/dist/cjs/grpc/proto/sui/rpc/v2/move_package.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/move_package_service.client.js +46 -78
- package/dist/cjs/grpc/proto/sui/rpc/v2/move_package_service.client.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/move_package_service.js +242 -224
- package/dist/cjs/grpc/proto/sui/rpc/v2/move_package_service.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/name_service.client.js +32 -52
- package/dist/cjs/grpc/proto/sui/rpc/v2/name_service.client.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/name_service.js +139 -134
- package/dist/cjs/grpc/proto/sui/rpc/v2/name_service.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/object.js +109 -111
- package/dist/cjs/grpc/proto/sui/rpc/v2/object.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/object_reference.js +46 -51
- package/dist/cjs/grpc/proto/sui/rpc/v2/object_reference.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/owner.js +76 -61
- package/dist/cjs/grpc/proto/sui/rpc/v2/owner.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/protocol_config.js +46 -59
- package/dist/cjs/grpc/proto/sui/rpc/v2/protocol_config.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/signature.js +568 -522
- package/dist/cjs/grpc/proto/sui/rpc/v2/signature.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/signature_scheme.js +54 -32
- package/dist/cjs/grpc/proto/sui/rpc/v2/signature_scheme.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/signature_verification_service.client.js +27 -47
- package/dist/cjs/grpc/proto/sui/rpc/v2/signature_verification_service.client.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/signature_verification_service.js +83 -86
- package/dist/cjs/grpc/proto/sui/rpc/v2/signature_verification_service.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/state_service.client.js +53 -85
- package/dist/cjs/grpc/proto/sui/rpc/v2/state_service.client.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/state_service.js +645 -529
- package/dist/cjs/grpc/proto/sui/rpc/v2/state_service.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/subscription_service.client.js +37 -51
- package/dist/cjs/grpc/proto/sui/rpc/v2/subscription_service.client.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/subscription_service.js +58 -61
- package/dist/cjs/grpc/proto/sui/rpc/v2/subscription_service.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/system_state.js +749 -730
- package/dist/cjs/grpc/proto/sui/rpc/v2/system_state.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/transaction.js +1218 -975
- package/dist/cjs/grpc/proto/sui/rpc/v2/transaction.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/transaction_execution_service.client.js +32 -46
- package/dist/cjs/grpc/proto/sui/rpc/v2/transaction_execution_service.client.js.map +1 -0
- package/dist/cjs/grpc/proto/sui/rpc/v2/transaction_execution_service.js +186 -167
- package/dist/cjs/grpc/proto/sui/rpc/v2/transaction_execution_service.js.map +1 -0
- package/dist/cjs/index.js +96 -91
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/jsonRpc/client.js +654 -743
- package/dist/cjs/jsonRpc/client.js.map +1 -0
- package/dist/cjs/jsonRpc/core.d.ts +7 -7
- package/dist/cjs/jsonRpc/core.js +562 -606
- package/dist/cjs/jsonRpc/core.js.map +1 -0
- package/dist/cjs/jsonRpc/errors.js +38 -56
- package/dist/cjs/jsonRpc/errors.js.map +1 -0
- package/dist/cjs/jsonRpc/http-transport.js +70 -114
- package/dist/cjs/jsonRpc/http-transport.js.map +1 -0
- package/dist/cjs/jsonRpc/index.js +14 -30
- package/dist/cjs/jsonRpc/index.js.map +1 -0
- package/dist/cjs/jsonRpc/json-rpc-resolver.js +286 -290
- package/dist/cjs/jsonRpc/json-rpc-resolver.js.map +1 -0
- package/dist/cjs/jsonRpc/rpc-websocket-client.js +150 -207
- package/dist/cjs/jsonRpc/rpc-websocket-client.js.map +1 -0
- package/dist/cjs/jsonRpc/types/chain.js +4 -15
- package/dist/cjs/jsonRpc/types/chain.js.map +1 -0
- package/dist/cjs/jsonRpc/types/changes.js +4 -15
- package/dist/cjs/jsonRpc/types/changes.js.map +1 -0
- package/dist/cjs/jsonRpc/types/coins.js +4 -15
- package/dist/cjs/jsonRpc/types/coins.js.map +1 -0
- package/dist/cjs/jsonRpc/types/common.js +4 -15
- package/dist/cjs/jsonRpc/types/common.js.map +1 -0
- package/dist/cjs/jsonRpc/types/generated.d.ts +1 -1
- package/dist/cjs/jsonRpc/types/generated.js +4 -15
- package/dist/cjs/jsonRpc/types/generated.js.map +1 -0
- package/dist/cjs/jsonRpc/types/index.js +4 -15
- package/dist/cjs/jsonRpc/types/index.js.map +1 -0
- package/dist/cjs/jsonRpc/types/params.js +4 -15
- package/dist/cjs/jsonRpc/types/params.js.map +1 -0
- package/dist/cjs/keypairs/ed25519/ed25519-hd-key.js +54 -69
- package/dist/cjs/keypairs/ed25519/ed25519-hd-key.js.map +1 -0
- package/dist/cjs/keypairs/ed25519/index.js +10 -26
- package/dist/cjs/keypairs/ed25519/index.js.map +1 -0
- package/dist/cjs/keypairs/ed25519/keypair.js +134 -159
- package/dist/cjs/keypairs/ed25519/keypair.js.map +1 -0
- package/dist/cjs/keypairs/ed25519/publickey.js +70 -84
- package/dist/cjs/keypairs/ed25519/publickey.js.map +1 -0
- package/dist/cjs/keypairs/index.js +21 -19
- package/dist/cjs/keypairs/index.js.map +1 -0
- package/dist/cjs/keypairs/passkey/index.js +11 -27
- package/dist/cjs/keypairs/passkey/index.js.map +1 -0
- package/dist/cjs/keypairs/passkey/keypair.js +245 -256
- package/dist/cjs/keypairs/passkey/keypair.js.map +1 -0
- package/dist/cjs/keypairs/passkey/publickey.js +163 -162
- package/dist/cjs/keypairs/passkey/publickey.js.map +1 -0
- package/dist/cjs/keypairs/passkey/types.js +4 -15
- package/dist/cjs/keypairs/passkey/types.js.map +1 -0
- package/dist/cjs/keypairs/secp256k1/index.js +10 -26
- package/dist/cjs/keypairs/secp256k1/index.js.map +1 -0
- package/dist/cjs/keypairs/secp256k1/keypair.js +129 -151
- package/dist/cjs/keypairs/secp256k1/keypair.js.map +1 -0
- package/dist/cjs/keypairs/secp256k1/publickey.js +71 -89
- package/dist/cjs/keypairs/secp256k1/publickey.js.map +1 -0
- package/dist/cjs/keypairs/secp256r1/index.js +10 -26
- package/dist/cjs/keypairs/secp256r1/index.js.map +1 -0
- package/dist/cjs/keypairs/secp256r1/keypair.js +127 -148
- package/dist/cjs/keypairs/secp256r1/keypair.js.map +1 -0
- package/dist/cjs/keypairs/secp256r1/publickey.js +72 -90
- package/dist/cjs/keypairs/secp256r1/publickey.js.map +1 -0
- package/dist/cjs/multisig/index.js +10 -26
- package/dist/cjs/multisig/index.js.map +1 -0
- package/dist/cjs/multisig/publickey.d.ts +1 -1
- package/dist/cjs/multisig/publickey.js +228 -276
- package/dist/cjs/multisig/publickey.js.map +1 -0
- package/dist/cjs/multisig/signer.js +62 -110
- package/dist/cjs/multisig/signer.js.map +1 -0
- package/dist/cjs/transactions/Arguments.d.ts +4 -4
- package/dist/cjs/transactions/Arguments.js +13 -34
- package/dist/cjs/transactions/Arguments.js.map +1 -0
- package/dist/cjs/transactions/Commands.js +111 -141
- package/dist/cjs/transactions/Commands.js.map +1 -0
- package/dist/cjs/transactions/Inputs.js +53 -82
- package/dist/cjs/transactions/Inputs.js.map +1 -0
- package/dist/cjs/transactions/ObjectCache.d.ts +8 -8
- package/dist/cjs/transactions/ObjectCache.js +204 -241
- package/dist/cjs/transactions/ObjectCache.js.map +1 -0
- package/dist/cjs/transactions/Transaction.d.ts +31 -31
- package/dist/cjs/transactions/Transaction.js +628 -719
- package/dist/cjs/transactions/Transaction.js.map +1 -0
- package/dist/cjs/transactions/TransactionData.d.ts +9 -9
- package/dist/cjs/transactions/TransactionData.js +396 -440
- package/dist/cjs/transactions/TransactionData.js.map +1 -0
- package/dist/cjs/transactions/__tests__/Transaction.test.js +169 -0
- package/dist/cjs/transactions/__tests__/Transaction.test.js.map +1 -0
- package/dist/cjs/transactions/__tests__/bcs.test.js +202 -0
- package/dist/cjs/transactions/__tests__/bcs.test.js.map +1 -0
- package/dist/cjs/transactions/data/internal.js +166 -207
- package/dist/cjs/transactions/data/internal.js.map +1 -0
- package/dist/cjs/transactions/data/v1.js +436 -495
- package/dist/cjs/transactions/data/v1.js.map +1 -0
- package/dist/cjs/transactions/data/v2.d.ts +5 -5
- package/dist/cjs/transactions/data/v2.js +94 -107
- package/dist/cjs/transactions/data/v2.js.map +1 -0
- package/dist/cjs/transactions/executor/caching.js +71 -113
- package/dist/cjs/transactions/executor/caching.js.map +1 -0
- package/dist/cjs/transactions/executor/parallel.js +339 -378
- package/dist/cjs/transactions/executor/parallel.js.map +1 -0
- package/dist/cjs/transactions/executor/queue.js +60 -80
- package/dist/cjs/transactions/executor/queue.js.map +1 -0
- package/dist/cjs/transactions/executor/serial.d.ts +4 -4
- package/dist/cjs/transactions/executor/serial.js +102 -131
- package/dist/cjs/transactions/executor/serial.js.map +1 -0
- package/dist/cjs/transactions/hash.js +17 -28
- package/dist/cjs/transactions/hash.js.map +1 -0
- package/dist/cjs/transactions/index.js +33 -49
- package/dist/cjs/transactions/index.js.map +1 -0
- package/dist/cjs/transactions/intents/CoinWithBalance.js +137 -191
- package/dist/cjs/transactions/intents/CoinWithBalance.js.map +1 -0
- package/dist/cjs/transactions/object.js +88 -111
- package/dist/cjs/transactions/object.js.map +1 -0
- package/dist/cjs/transactions/plugins/NamedPackagesPlugin.js +20 -32
- package/dist/cjs/transactions/plugins/NamedPackagesPlugin.js.map +1 -0
- package/dist/cjs/transactions/pure.js +38 -60
- package/dist/cjs/transactions/pure.js.map +1 -0
- package/dist/cjs/transactions/resolve.js +62 -88
- package/dist/cjs/transactions/resolve.js.map +1 -0
- package/dist/cjs/transactions/serializer.js +150 -163
- package/dist/cjs/transactions/serializer.js.map +1 -0
- package/dist/cjs/transactions/utils.d.ts +1 -1
- package/dist/cjs/transactions/utils.js +114 -125
- package/dist/cjs/transactions/utils.js.map +1 -0
- package/dist/cjs/utils/constants.js +29 -56
- package/dist/cjs/utils/constants.js.map +1 -0
- package/dist/cjs/utils/derived-objects.js +14 -30
- package/dist/cjs/utils/derived-objects.js.map +1 -0
- package/dist/cjs/utils/dynamic-fields.js +20 -37
- package/dist/cjs/utils/dynamic-fields.js.map +1 -0
- package/dist/cjs/utils/format.js +14 -30
- package/dist/cjs/utils/format.js.map +1 -0
- package/dist/cjs/utils/index.js +50 -64
- package/dist/cjs/utils/index.js.map +1 -0
- package/dist/cjs/utils/move-registry.js +37 -35
- package/dist/cjs/utils/move-registry.js.map +1 -0
- package/dist/cjs/utils/sui-types.js +74 -68
- package/dist/cjs/utils/sui-types.js.map +1 -0
- package/dist/cjs/utils/suins.js +30 -46
- package/dist/cjs/utils/suins.js.map +1 -0
- package/dist/cjs/verify/index.js +12 -27
- package/dist/cjs/verify/index.js.map +1 -0
- package/dist/cjs/verify/verify.js +83 -110
- package/dist/cjs/verify/verify.js.map +1 -0
- package/dist/cjs/version.js +8 -25
- package/dist/cjs/version.js.map +1 -0
- package/dist/cjs/w/call/allocation.js +323 -413
- package/dist/cjs/w/call/allocation.js.map +1 -0
- package/dist/cjs/w/call/arb.js +105 -136
- package/dist/cjs/w/call/arb.js.map +1 -0
- package/dist/cjs/w/call/arbitration.js +1206 -1581
- package/dist/cjs/w/call/arbitration.js.map +1 -0
- package/dist/cjs/w/call/base.js +303 -333
- package/dist/cjs/w/call/base.js.map +1 -0
- package/dist/cjs/w/call/contact.js +335 -452
- package/dist/cjs/w/call/contact.js.map +1 -0
- package/dist/cjs/w/call/demand.js +690 -844
- package/dist/cjs/w/call/demand.js.map +1 -0
- package/dist/cjs/w/call/entity.js +167 -201
- package/dist/cjs/w/call/entity.js.map +1 -0
- package/dist/cjs/w/call/guard-ins.js +4376 -4389
- package/dist/cjs/w/call/guard-ins.js.map +1 -0
- package/dist/cjs/w/call/guard.js +1078 -1112
- package/dist/cjs/w/call/guard.js.map +1 -0
- package/dist/cjs/w/call/index.js +69 -70
- package/dist/cjs/w/call/index.js.map +1 -0
- package/dist/cjs/w/call/machine.js +1105 -1419
- package/dist/cjs/w/call/machine.js.map +1 -0
- package/dist/cjs/w/call/order.js +314 -454
- package/dist/cjs/w/call/order.js.map +1 -0
- package/dist/cjs/w/call/passport.js +214 -253
- package/dist/cjs/w/call/passport.js.map +1 -0
- package/dist/cjs/w/call/payment.js +187 -224
- package/dist/cjs/w/call/payment.js.map +1 -0
- package/dist/cjs/w/call/permission.js +1183 -1294
- package/dist/cjs/w/call/permission.js.map +1 -0
- package/dist/cjs/w/call/personal.js +132 -170
- package/dist/cjs/w/call/personal.js.map +1 -0
- package/dist/cjs/w/call/progress.js +634 -794
- package/dist/cjs/w/call/progress.js.map +1 -0
- package/dist/cjs/w/call/proof.js +67 -116
- package/dist/cjs/w/call/proof.js.map +1 -0
- package/dist/cjs/w/call/repository.js +1037 -1251
- package/dist/cjs/w/call/repository.js.map +1 -0
- package/dist/cjs/w/call/resource.js +111 -131
- package/dist/cjs/w/call/resource.js.map +1 -0
- package/dist/cjs/w/call/reward.js +675 -853
- package/dist/cjs/w/call/reward.js.map +1 -0
- package/dist/cjs/w/call/service.js +1879 -2385
- package/dist/cjs/w/call/service.js.map +1 -0
- package/dist/cjs/w/call/treasury.js +841 -1138
- package/dist/cjs/w/call/treasury.js.map +1 -0
- package/dist/cjs/w/call/util.js +593 -624
- package/dist/cjs/w/call/util.js.map +1 -0
- package/dist/cjs/w/common.d.ts +1 -1
- package/dist/cjs/w/common.js +548 -518
- package/dist/cjs/w/common.js.map +1 -0
- package/dist/cjs/w/exception.js +574 -584
- package/dist/cjs/w/exception.js.map +1 -0
- package/dist/cjs/w/index.js +26 -23
- package/dist/cjs/w/index.js.map +1 -0
- package/dist/cjs/w/local/account.js +664 -741
- package/dist/cjs/w/local/account.js.map +1 -0
- package/dist/cjs/w/local/cache.js +180 -166
- package/dist/cjs/w/local/cache.js.map +1 -0
- package/dist/cjs/w/local/config.js +51 -80
- package/dist/cjs/w/local/config.js.map +1 -0
- package/dist/cjs/w/local/index.js +225 -290
- package/dist/cjs/w/local/index.js.map +1 -0
- package/dist/cjs/w/local/local.d.ts +2 -2
- package/dist/cjs/w/local/local.js +638 -646
- package/dist/cjs/w/local/local.js.map +1 -0
- package/dist/cjs/w/local/storage.js +210 -164
- package/dist/cjs/w/local/storage.js.map +1 -0
- package/dist/cjs/w/local/token.js +158 -175
- package/dist/cjs/w/local/token.js.map +1 -0
- package/dist/cjs/w/local/util.js +80 -51
- package/dist/cjs/w/local/util.js.map +1 -0
- package/dist/cjs/w/local/wip.js +1078 -802
- package/dist/cjs/w/local/wip.js.map +1 -0
- package/dist/cjs/w/messenger/crypto.js +496 -389
- package/dist/cjs/w/messenger/crypto.js.map +1 -0
- package/dist/cjs/w/messenger/index.js +53 -35
- package/dist/cjs/w/messenger/index.js.map +1 -0
- package/dist/cjs/w/messenger/messenger-api.js +1159 -1035
- package/dist/cjs/w/messenger/messenger-api.js.map +1 -0
- package/dist/cjs/w/messenger/messenger-manager.js +954 -1083
- package/dist/cjs/w/messenger/messenger-manager.js.map +1 -0
- package/dist/cjs/w/messenger/messenger.d.ts +1 -1
- package/dist/cjs/w/messenger/messenger.js +1304 -1450
- package/dist/cjs/w/messenger/messenger.js.map +1 -0
- package/dist/cjs/w/messenger/server.js +390 -512
- package/dist/cjs/w/messenger/server.js.map +1 -0
- package/dist/cjs/w/messenger/session.js +399 -403
- package/dist/cjs/w/messenger/session.js.map +1 -0
- package/dist/cjs/w/messenger/storage.js +881 -777
- package/dist/cjs/w/messenger/storage.js.map +1 -0
- package/dist/cjs/w/messenger/types.d.ts +2 -2
- package/dist/cjs/w/messenger/types.js +83 -103
- package/dist/cjs/w/messenger/types.js.map +1 -0
- package/dist/cjs/w/messenger/utils.js +29 -34
- package/dist/cjs/w/messenger/utils.js.map +1 -0
- package/dist/cjs/w/query/bult-in.js +101 -110
- package/dist/cjs/w/query/bult-in.js.map +1 -0
- package/dist/cjs/w/query/event.js +134 -146
- package/dist/cjs/w/query/event.js.map +1 -0
- package/dist/cjs/w/query/index.js +22 -20
- package/dist/cjs/w/query/index.js.map +1 -0
- package/dist/cjs/w/query/object.js +1576 -1576
- package/dist/cjs/w/query/object.js.map +1 -0
- package/dist/cjs/w/query/received.js +66 -88
- package/dist/cjs/w/query/received.js.map +1 -0
- package/dist/cjs/w/query/util.js +53 -77
- package/dist/cjs/w/query/util.js.map +1 -0
- package/dist/cjs/w/util.js +589 -675
- package/dist/cjs/w/util.js.map +1 -0
- package/dist/esm/bcs/bcs.d.ts +199 -199
- package/dist/esm/bcs/bcs.js +269 -310
- package/dist/esm/bcs/bcs.js.map +1 -0
- package/dist/esm/bcs/effects.d.ts +109 -109
- package/dist/esm/bcs/effects.js +171 -179
- package/dist/esm/bcs/effects.js.map +1 -0
- package/dist/esm/bcs/index.d.ts +1 -2584
- package/dist/esm/bcs/index.js +51 -94
- package/dist/esm/bcs/index.js.map +1 -0
- package/dist/esm/bcs/pure.js +35 -38
- package/dist/esm/bcs/pure.js.map +1 -0
- package/dist/esm/bcs/type-tag-serializer.js +98 -95
- package/dist/esm/bcs/type-tag-serializer.js.map +1 -0
- package/dist/esm/bcs/types.js +5 -5
- package/dist/esm/bcs/types.js.map +1 -0
- package/dist/esm/client/index.js +7 -23
- package/dist/esm/client/index.js.map +1 -0
- package/dist/esm/client/network.js +23 -22
- package/dist/esm/client/network.js.map +1 -0
- package/dist/esm/cryptography/index.js +9 -46
- package/dist/esm/cryptography/index.js.map +1 -0
- package/dist/esm/cryptography/intent.d.ts +1 -1
- package/dist/esm/cryptography/intent.js +18 -12
- package/dist/esm/cryptography/intent.js.map +1 -0
- package/dist/esm/cryptography/keypair.js +95 -99
- package/dist/esm/cryptography/keypair.js.map +1 -0
- package/dist/esm/cryptography/mnemonics.js +40 -24
- package/dist/esm/cryptography/mnemonics.js.map +1 -0
- package/dist/esm/cryptography/publickey.js +104 -115
- package/dist/esm/cryptography/publickey.js.map +1 -0
- package/dist/esm/cryptography/signature-scheme.js +22 -24
- package/dist/esm/cryptography/signature-scheme.js.map +1 -0
- package/dist/esm/cryptography/signature.d.ts +2 -24
- package/dist/esm/cryptography/signature.js +44 -48
- package/dist/esm/cryptography/signature.js.map +1 -0
- package/dist/esm/experimental/cache.js +61 -0
- package/dist/esm/experimental/cache.js.map +1 -0
- package/dist/esm/experimental/client.js +23 -0
- package/dist/esm/experimental/client.js.map +1 -0
- package/dist/esm/experimental/core.js +85 -0
- package/dist/esm/experimental/core.js.map +1 -0
- package/dist/esm/experimental/errors.js +27 -0
- package/dist/esm/experimental/errors.js.map +1 -0
- package/dist/esm/experimental/index.js +8 -0
- package/dist/esm/experimental/index.js.map +1 -0
- package/dist/esm/experimental/persistent-storage.js +337 -0
- package/dist/esm/experimental/persistent-storage.js.map +1 -0
- package/dist/esm/experimental/persistent-storage.test.js +198 -0
- package/dist/esm/experimental/persistent-storage.test.js.map +1 -0
- package/dist/esm/experimental/transports/utils.js +100 -0
- package/dist/esm/experimental/transports/utils.js.map +1 -0
- package/dist/esm/experimental/types.js +5 -0
- package/dist/esm/experimental/types.js.map +1 -0
- package/dist/esm/faucet/faucet.js +104 -111
- package/dist/esm/faucet/faucet.js.map +1 -0
- package/dist/esm/faucet/index.js +4 -16
- package/dist/esm/faucet/index.js.map +1 -0
- package/dist/esm/grpc/client.js +34 -34
- package/dist/esm/grpc/client.js.map +1 -0
- package/dist/esm/grpc/core.js +570 -601
- package/dist/esm/grpc/core.js.map +1 -0
- package/dist/esm/grpc/index.js +5 -6
- package/dist/esm/grpc/index.js.map +1 -0
- package/dist/esm/grpc/proto/google/protobuf/any.js +161 -111
- package/dist/esm/grpc/proto/google/protobuf/any.js.map +1 -0
- package/dist/esm/grpc/proto/google/protobuf/duration.js +99 -67
- package/dist/esm/grpc/proto/google/protobuf/duration.js.map +1 -0
- package/dist/esm/grpc/proto/google/protobuf/empty.js +46 -7
- package/dist/esm/grpc/proto/google/protobuf/empty.js.map +1 -0
- package/dist/esm/grpc/proto/google/protobuf/field_mask.js +90 -52
- package/dist/esm/grpc/proto/google/protobuf/field_mask.js.map +1 -0
- package/dist/esm/grpc/proto/google/protobuf/struct.js +258 -190
- package/dist/esm/grpc/proto/google/protobuf/struct.js.map +1 -0
- package/dist/esm/grpc/proto/google/protobuf/timestamp.js +144 -108
- package/dist/esm/grpc/proto/google/protobuf/timestamp.js.map +1 -0
- package/dist/esm/grpc/proto/google/rpc/error_details.js +313 -267
- package/dist/esm/grpc/proto/google/rpc/error_details.js.map +1 -0
- package/dist/esm/grpc/proto/google/rpc/status.js +45 -28
- package/dist/esm/grpc/proto/google/rpc/status.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/argument.js +80 -47
- package/dist/esm/grpc/proto/sui/rpc/v2/argument.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/balance_change.js +41 -29
- package/dist/esm/grpc/proto/sui/rpc/v2/balance_change.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/bcs.js +34 -22
- package/dist/esm/grpc/proto/sui/rpc/v2/bcs.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint.js +61 -49
- package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint_contents.js +72 -57
- package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint_contents.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint_summary.js +173 -139
- package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint_summary.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/effects.js +358 -268
- package/dist/esm/grpc/proto/sui/rpc/v2/effects.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/epoch.js +72 -60
- package/dist/esm/grpc/proto/sui/rpc/v2/epoch.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/error_reason.js +29 -9
- package/dist/esm/grpc/proto/sui/rpc/v2/error_reason.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/event.js +74 -59
- package/dist/esm/grpc/proto/sui/rpc/v2/event.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/executed_transaction.js +69 -57
- package/dist/esm/grpc/proto/sui/rpc/v2/executed_transaction.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/execution_status.js +861 -474
- package/dist/esm/grpc/proto/sui/rpc/v2/execution_status.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/gas_cost_summary.js +52 -40
- package/dist/esm/grpc/proto/sui/rpc/v2/gas_cost_summary.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/input.js +98 -61
- package/dist/esm/grpc/proto/sui/rpc/v2/input.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/jwk.js +71 -56
- package/dist/esm/grpc/proto/sui/rpc/v2/jwk.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/ledger_service.client.js +65 -100
- package/dist/esm/grpc/proto/sui/rpc/v2/ledger_service.client.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/ledger_service.js +365 -306
- package/dist/esm/grpc/proto/sui/rpc/v2/ledger_service.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/move_package.js +585 -442
- package/dist/esm/grpc/proto/sui/rpc/v2/move_package.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/move_package_service.client.js +42 -59
- package/dist/esm/grpc/proto/sui/rpc/v2/move_package_service.client.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/move_package_service.js +226 -191
- package/dist/esm/grpc/proto/sui/rpc/v2/move_package_service.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/name_service.client.js +28 -33
- package/dist/esm/grpc/proto/sui/rpc/v2/name_service.client.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/name_service.js +129 -107
- package/dist/esm/grpc/proto/sui/rpc/v2/name_service.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/object.js +100 -85
- package/dist/esm/grpc/proto/sui/rpc/v2/object.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/object_reference.js +42 -30
- package/dist/esm/grpc/proto/sui/rpc/v2/object_reference.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/owner.js +72 -40
- package/dist/esm/grpc/proto/sui/rpc/v2/owner.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/protocol_config.js +42 -38
- package/dist/esm/grpc/proto/sui/rpc/v2/protocol_config.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/signature.js +544 -481
- package/dist/esm/grpc/proto/sui/rpc/v2/signature.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/signature_scheme.js +52 -13
- package/dist/esm/grpc/proto/sui/rpc/v2/signature_scheme.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/signature_verification_service.client.js +23 -28
- package/dist/esm/grpc/proto/sui/rpc/v2/signature_verification_service.client.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/signature_verification_service.js +74 -60
- package/dist/esm/grpc/proto/sui/rpc/v2/signature_verification_service.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/state_service.client.js +49 -66
- package/dist/esm/grpc/proto/sui/rpc/v2/state_service.client.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/state_service.js +623 -490
- package/dist/esm/grpc/proto/sui/rpc/v2/state_service.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/subscription_service.client.js +33 -32
- package/dist/esm/grpc/proto/sui/rpc/v2/subscription_service.client.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/subscription_service.js +50 -36
- package/dist/esm/grpc/proto/sui/rpc/v2/subscription_service.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/system_state.js +737 -701
- package/dist/esm/grpc/proto/sui/rpc/v2/system_state.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/transaction.js +1177 -917
- package/dist/esm/grpc/proto/sui/rpc/v2/transaction.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/transaction_execution_service.client.js +28 -27
- package/dist/esm/grpc/proto/sui/rpc/v2/transaction_execution_service.client.js.map +1 -0
- package/dist/esm/grpc/proto/sui/rpc/v2/transaction_execution_service.js +169 -133
- package/dist/esm/grpc/proto/sui/rpc/v2/transaction_execution_service.js.map +1 -0
- package/dist/esm/index.js +21 -107
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/jsonRpc/client.js +646 -727
- package/dist/esm/jsonRpc/client.js.map +1 -0
- package/dist/esm/jsonRpc/core.d.ts +7 -7
- package/dist/esm/jsonRpc/core.js +550 -581
- package/dist/esm/jsonRpc/core.js.map +1 -0
- package/dist/esm/jsonRpc/errors.js +36 -41
- package/dist/esm/jsonRpc/errors.js.map +1 -0
- package/dist/esm/jsonRpc/http-transport.js +65 -93
- package/dist/esm/jsonRpc/http-transport.js.map +1 -0
- package/dist/esm/jsonRpc/index.js +6 -20
- package/dist/esm/jsonRpc/index.js.map +1 -0
- package/dist/esm/jsonRpc/json-rpc-resolver.js +281 -276
- package/dist/esm/jsonRpc/json-rpc-resolver.js.map +1 -0
- package/dist/esm/jsonRpc/rpc-websocket-client.js +147 -189
- package/dist/esm/jsonRpc/rpc-websocket-client.js.map +1 -0
- package/dist/esm/jsonRpc/types/chain.js +4 -0
- package/dist/esm/jsonRpc/types/chain.js.map +1 -0
- package/dist/esm/jsonRpc/types/changes.js +4 -0
- package/dist/esm/jsonRpc/types/changes.js.map +1 -0
- package/dist/esm/jsonRpc/types/coins.js +4 -0
- package/dist/esm/jsonRpc/types/coins.js.map +1 -0
- package/dist/esm/jsonRpc/types/common.js +4 -0
- package/dist/esm/jsonRpc/types/common.js.map +1 -0
- package/dist/esm/jsonRpc/types/generated.d.ts +1 -1
- package/dist/esm/jsonRpc/types/generated.js +4 -0
- package/dist/esm/jsonRpc/types/generated.js.map +1 -0
- package/dist/esm/jsonRpc/types/index.js +4 -0
- package/dist/esm/jsonRpc/types/index.js.map +1 -0
- package/dist/esm/jsonRpc/types/params.js +4 -0
- package/dist/esm/jsonRpc/types/params.js.map +1 -0
- package/dist/esm/keypairs/ed25519/ed25519-hd-key.js +49 -48
- package/dist/esm/keypairs/ed25519/ed25519-hd-key.js.map +1 -0
- package/dist/esm/keypairs/ed25519/index.js +5 -10
- package/dist/esm/keypairs/ed25519/index.js.map +1 -0
- package/dist/esm/keypairs/ed25519/keypair.js +128 -146
- package/dist/esm/keypairs/ed25519/keypair.js.map +1 -0
- package/dist/esm/keypairs/ed25519/publickey.js +64 -67
- package/dist/esm/keypairs/ed25519/publickey.js.map +1 -0
- package/dist/esm/keypairs/index.js +3 -0
- package/dist/esm/keypairs/index.js.map +1 -0
- package/dist/esm/keypairs/passkey/index.js +5 -12
- package/dist/esm/keypairs/passkey/index.js.map +1 -0
- package/dist/esm/keypairs/passkey/keypair.js +236 -243
- package/dist/esm/keypairs/passkey/keypair.js.map +1 -0
- package/dist/esm/keypairs/passkey/publickey.js +154 -140
- package/dist/esm/keypairs/passkey/publickey.js.map +1 -0
- package/dist/esm/keypairs/passkey/types.js +4 -0
- package/dist/esm/keypairs/passkey/types.js.map +1 -0
- package/dist/esm/keypairs/secp256k1/index.js +5 -10
- package/dist/esm/keypairs/secp256k1/index.js.map +1 -0
- package/dist/esm/keypairs/secp256k1/keypair.js +120 -134
- package/dist/esm/keypairs/secp256k1/keypair.js.map +1 -0
- package/dist/esm/keypairs/secp256k1/publickey.js +64 -71
- package/dist/esm/keypairs/secp256k1/publickey.js.map +1 -0
- package/dist/esm/keypairs/secp256r1/index.js +5 -10
- package/dist/esm/keypairs/secp256r1/index.js.map +1 -0
- package/dist/esm/keypairs/secp256r1/keypair.js +118 -131
- package/dist/esm/keypairs/secp256r1/keypair.js.map +1 -0
- package/dist/esm/keypairs/secp256r1/publickey.js +63 -66
- package/dist/esm/keypairs/secp256r1/publickey.js.map +1 -0
- package/dist/esm/multisig/index.js +5 -10
- package/dist/esm/multisig/index.js.map +1 -0
- package/dist/esm/multisig/publickey.d.ts +1 -1
- package/dist/esm/multisig/publickey.js +216 -253
- package/dist/esm/multisig/publickey.js.map +1 -0
- package/dist/esm/multisig/signer.js +57 -89
- package/dist/esm/multisig/signer.js.map +1 -0
- package/dist/esm/transactions/Arguments.d.ts +4 -4
- package/dist/esm/transactions/Arguments.js +9 -13
- package/dist/esm/transactions/Arguments.js.map +1 -0
- package/dist/esm/transactions/Commands.js +105 -118
- package/dist/esm/transactions/Commands.js.map +1 -0
- package/dist/esm/transactions/Inputs.js +49 -61
- package/dist/esm/transactions/Inputs.js.map +1 -0
- package/dist/esm/transactions/ObjectCache.d.ts +8 -8
- package/dist/esm/transactions/ObjectCache.js +200 -223
- package/dist/esm/transactions/ObjectCache.js.map +1 -0
- package/dist/esm/transactions/Transaction.d.ts +32 -32
- package/dist/esm/transactions/Transaction.js +611 -696
- package/dist/esm/transactions/Transaction.js.map +1 -0
- package/dist/esm/transactions/TransactionData.d.ts +9 -9
- package/dist/esm/transactions/TransactionData.js +386 -415
- package/dist/esm/transactions/TransactionData.js.map +1 -0
- package/dist/esm/transactions/__tests__/Transaction.test.js +167 -0
- package/dist/esm/transactions/__tests__/Transaction.test.js.map +1 -0
- package/dist/esm/transactions/__tests__/bcs.test.js +200 -0
- package/dist/esm/transactions/__tests__/bcs.test.js.map +1 -0
- package/dist/esm/transactions/data/internal.js +158 -205
- package/dist/esm/transactions/data/internal.js.map +1 -0
- package/dist/esm/transactions/data/v1.js +419 -487
- package/dist/esm/transactions/data/v1.js.map +1 -0
- package/dist/esm/transactions/data/v2.d.ts +5 -5
- package/dist/esm/transactions/data/v2.js +89 -107
- package/dist/esm/transactions/data/v2.js.map +1 -0
- package/dist/esm/transactions/executor/caching.d.ts +2 -2
- package/dist/esm/transactions/executor/caching.js +66 -93
- package/dist/esm/transactions/executor/caching.js.map +1 -0
- package/dist/esm/transactions/executor/parallel.js +329 -352
- package/dist/esm/transactions/executor/parallel.js.map +1 -0
- package/dist/esm/transactions/executor/queue.js +58 -64
- package/dist/esm/transactions/executor/queue.js.map +1 -0
- package/dist/esm/transactions/executor/serial.d.ts +5 -5
- package/dist/esm/transactions/executor/serial.js +96 -110
- package/dist/esm/transactions/executor/serial.js.map +1 -0
- package/dist/esm/transactions/hash.js +15 -9
- package/dist/esm/transactions/hash.js.map +1 -0
- package/dist/esm/transactions/index.js +15 -41
- package/dist/esm/transactions/index.js.map +1 -0
- package/dist/esm/transactions/intents/CoinWithBalance.js +127 -165
- package/dist/esm/transactions/intents/CoinWithBalance.js.map +1 -0
- package/dist/esm/transactions/object.js +86 -92
- package/dist/esm/transactions/object.js.map +1 -0
- package/dist/esm/transactions/plugins/NamedPackagesPlugin.js +18 -15
- package/dist/esm/transactions/plugins/NamedPackagesPlugin.js.map +1 -0
- package/dist/esm/transactions/pure.js +34 -39
- package/dist/esm/transactions/pure.js.map +1 -0
- package/dist/esm/transactions/resolve.js +58 -69
- package/dist/esm/transactions/resolve.js.map +1 -0
- package/dist/esm/transactions/serializer.js +145 -144
- package/dist/esm/transactions/serializer.js.map +1 -0
- package/dist/esm/transactions/utils.d.ts +1 -1
- package/dist/esm/transactions/utils.js +110 -109
- package/dist/esm/transactions/utils.js.map +1 -0
- package/dist/esm/utils/constants.js +26 -36
- package/dist/esm/utils/constants.js.map +1 -0
- package/dist/esm/utils/derived-objects.js +11 -10
- package/dist/esm/utils/derived-objects.js.map +1 -0
- package/dist/esm/utils/dynamic-fields.js +16 -16
- package/dist/esm/utils/dynamic-fields.js.map +1 -0
- package/dist/esm/utils/format.js +13 -13
- package/dist/esm/utils/format.js.map +1 -0
- package/dist/esm/utils/index.js +15 -76
- package/dist/esm/utils/index.js.map +1 -0
- package/dist/esm/utils/move-registry.js +34 -17
- package/dist/esm/utils/move-registry.js.map +1 -0
- package/dist/esm/utils/sui-types.js +70 -54
- package/dist/esm/utils/sui-types.js.map +1 -0
- package/dist/esm/utils/suins.js +29 -29
- package/dist/esm/utils/suins.js.map +1 -0
- package/dist/esm/verify/index.js +5 -14
- package/dist/esm/verify/index.js.map +1 -0
- package/dist/esm/verify/verify.js +76 -93
- package/dist/esm/verify/verify.js.map +1 -0
- package/dist/esm/version.js +6 -6
- package/dist/esm/version.js.map +1 -0
- package/dist/esm/w/call/allocation.js +307 -402
- package/dist/esm/w/call/allocation.js.map +1 -0
- package/dist/esm/w/call/arb.js +100 -129
- package/dist/esm/w/call/arb.js.map +1 -0
- package/dist/esm/w/call/arbitration.js +1170 -1568
- package/dist/esm/w/call/arbitration.js.map +1 -0
- package/dist/esm/w/call/base.js +288 -315
- package/dist/esm/w/call/base.js.map +1 -0
- package/dist/esm/w/call/contact.js +318 -442
- package/dist/esm/w/call/contact.js.map +1 -0
- package/dist/esm/w/call/demand.js +673 -841
- package/dist/esm/w/call/demand.js.map +1 -0
- package/dist/esm/w/call/entity.js +162 -203
- package/dist/esm/w/call/entity.js.map +1 -0
- package/dist/esm/w/call/guard-ins.js +4373 -4371
- package/dist/esm/w/call/guard-ins.js.map +1 -0
- package/dist/esm/w/call/guard.js +1061 -1108
- package/dist/esm/w/call/guard.js.map +1 -0
- package/dist/esm/w/call/index.js +24 -56
- package/dist/esm/w/call/index.js.map +1 -0
- package/dist/esm/w/call/machine.js +1086 -1433
- package/dist/esm/w/call/machine.js.map +1 -0
- package/dist/esm/w/call/order.js +301 -448
- package/dist/esm/w/call/order.js.map +1 -0
- package/dist/esm/w/call/passport.js +204 -240
- package/dist/esm/w/call/passport.js.map +1 -0
- package/dist/esm/w/call/payment.js +177 -215
- package/dist/esm/w/call/payment.js.map +1 -0
- package/dist/esm/w/call/permission.js +1172 -1320
- package/dist/esm/w/call/permission.js.map +1 -0
- package/dist/esm/w/call/personal.js +121 -156
- package/dist/esm/w/call/personal.js.map +1 -0
- package/dist/esm/w/call/progress.js +625 -797
- package/dist/esm/w/call/progress.js.map +1 -0
- package/dist/esm/w/call/proof.js +61 -103
- package/dist/esm/w/call/proof.js.map +1 -0
- package/dist/esm/w/call/repository.js +1017 -1251
- package/dist/esm/w/call/repository.js.map +1 -0
- package/dist/esm/w/call/resource.js +108 -124
- package/dist/esm/w/call/resource.js.map +1 -0
- package/dist/esm/w/call/reward.js +660 -847
- package/dist/esm/w/call/reward.js.map +1 -0
- package/dist/esm/w/call/service.js +1849 -2400
- package/dist/esm/w/call/service.js.map +1 -0
- package/dist/esm/w/call/treasury.js +815 -1125
- package/dist/esm/w/call/treasury.js.map +1 -0
- package/dist/esm/w/call/util.js +553 -576
- package/dist/esm/w/call/util.js.map +1 -0
- package/dist/esm/w/common.d.ts +1 -1
- package/dist/esm/w/common.js +579 -580
- package/dist/esm/w/common.js.map +1 -0
- package/dist/esm/w/exception.js +570 -573
- package/dist/esm/w/exception.js.map +1 -0
- package/dist/esm/w/index.js +4 -0
- package/dist/esm/w/index.js.map +1 -0
- package/dist/esm/w/local/account.js +652 -709
- package/dist/esm/w/local/account.js.map +1 -0
- package/dist/esm/w/local/cache.js +176 -147
- package/dist/esm/w/local/cache.js.map +1 -0
- package/dist/esm/w/local/config.js +46 -60
- package/dist/esm/w/local/config.js.map +1 -0
- package/dist/esm/w/local/index.js +196 -273
- package/dist/esm/w/local/index.js.map +1 -0
- package/dist/esm/w/local/local.d.ts +2 -2
- package/dist/esm/w/local/local.js +631 -626
- package/dist/esm/w/local/local.js.map +1 -0
- package/dist/esm/w/local/storage.js +168 -136
- package/dist/esm/w/local/storage.js.map +1 -0
- package/dist/esm/w/local/token.js +149 -151
- package/dist/esm/w/local/token.js.map +1 -0
- package/dist/esm/w/local/util.js +45 -22
- package/dist/esm/w/local/util.js.map +1 -0
- package/dist/esm/w/local/wip.js +1038 -781
- package/dist/esm/w/local/wip.js.map +1 -0
- package/dist/esm/w/messenger/crypto.js +491 -387
- package/dist/esm/w/messenger/crypto.js.map +1 -0
- package/dist/esm/w/messenger/index.js +27 -24
- package/dist/esm/w/messenger/index.js.map +1 -0
- package/dist/esm/w/messenger/messenger-api.js +1111 -1017
- package/dist/esm/w/messenger/messenger-api.js.map +1 -0
- package/dist/esm/w/messenger/messenger-manager.js +944 -1052
- package/dist/esm/w/messenger/messenger-manager.js.map +1 -0
- package/dist/esm/w/messenger/messenger.d.ts +1 -1
- package/dist/esm/w/messenger/messenger.js +1258 -1421
- package/dist/esm/w/messenger/messenger.js.map +1 -0
- package/dist/esm/w/messenger/server.js +388 -499
- package/dist/esm/w/messenger/server.js.map +1 -0
- package/dist/esm/w/messenger/session.js +394 -399
- package/dist/esm/w/messenger/session.js.map +1 -0
- package/dist/esm/w/messenger/storage.js +840 -751
- package/dist/esm/w/messenger/storage.js.map +1 -0
- package/dist/esm/w/messenger/types.d.ts +2 -2
- package/dist/esm/w/messenger/types.js +80 -85
- package/dist/esm/w/messenger/types.js.map +1 -0
- package/dist/esm/w/messenger/utils.js +28 -16
- package/dist/esm/w/messenger/utils.js.map +1 -0
- package/dist/esm/w/query/bult-in.js +95 -100
- package/dist/esm/w/query/bult-in.js.map +1 -0
- package/dist/esm/w/query/event.js +128 -125
- package/dist/esm/w/query/event.js.map +1 -0
- package/dist/esm/w/query/index.js +3 -0
- package/dist/esm/w/query/index.js.map +1 -0
- package/dist/esm/w/query/object.js +1560 -1574
- package/dist/esm/w/query/object.js.map +1 -0
- package/dist/esm/w/query/received.js +57 -63
- package/dist/esm/w/query/received.js.map +1 -0
- package/dist/esm/w/query/util.js +48 -56
- package/dist/esm/w/query/util.js.map +1 -0
- package/dist/esm/w/util.js +578 -673
- package/dist/esm/w/util.js.map +1 -0
- package/package.json +13 -7
- package/prebuilds/better-sqlite3-v12.9.0-node-v115-darwin-arm64.node +0 -0
- package/prebuilds/better-sqlite3-v12.9.0-node-v115-darwin-x64.node +0 -0
- package/prebuilds/better-sqlite3-v12.9.0-node-v115-linux-arm.node +0 -0
- package/prebuilds/better-sqlite3-v12.9.0-node-v115-linux-arm64.node +0 -0
- package/prebuilds/better-sqlite3-v12.9.0-node-v115-linux-x64.node +0 -0
- package/prebuilds/better-sqlite3-v12.9.0-node-v115-win32-arm64.node +0 -0
- package/prebuilds/better-sqlite3-v12.9.0-node-v115-win32-x64.node +0 -0
- package/prebuilds/better-sqlite3-v12.9.0-node-v127-darwin-arm64.node +0 -0
- package/prebuilds/better-sqlite3-v12.9.0-node-v127-darwin-x64.node +0 -0
- package/prebuilds/better-sqlite3-v12.9.0-node-v127-linux-arm.node +0 -0
- package/prebuilds/better-sqlite3-v12.9.0-node-v127-linux-arm64.node +0 -0
- package/prebuilds/better-sqlite3-v12.9.0-node-v127-linux-x64.node +0 -0
- package/prebuilds/better-sqlite3-v12.9.0-node-v127-win32-arm64.node +0 -0
- package/prebuilds/better-sqlite3-v12.9.0-node-v127-win32-x64.node +0 -0
- package/scripts/download-prebuilds.js +234 -0
- package/scripts/install-better-sqlite3.js +377 -0
- package/dist/cjs/graphql/client.js +0 -98
- package/dist/cjs/graphql/core.js +0 -506
- package/dist/cjs/graphql/generated/2024.1/tada-env.js +0 -13141
- package/dist/cjs/graphql/generated/2024.1/tsconfig.tada.js +0 -11
- package/dist/cjs/graphql/generated/2024.4/tada-env.js +0 -13287
- package/dist/cjs/graphql/generated/2024.4/tsconfig.tada.js +0 -11
- package/dist/cjs/graphql/generated/latest/tada-env.js +0 -12925
- package/dist/cjs/graphql/generated/latest/tsconfig.tada.js +0 -11
- package/dist/cjs/graphql/generated/queries.js +0 -807
- package/dist/cjs/graphql/index.js +0 -25
- package/dist/cjs/graphql/schemas/2024.1/index.js +0 -28
- package/dist/cjs/graphql/schemas/2024.4/index.js +0 -28
- package/dist/cjs/graphql/schemas/latest/index.js +0 -28
- package/dist/cjs/graphql/types.js +0 -16
- package/dist/cjs/package.json +0 -5
- package/dist/cjs/w/local/.eslintrc.js +0 -15
- package/dist/cjs/w/messenger/.eslintrc.js +0 -15
- package/dist/cjs/zklogin/address.js +0 -93
- package/dist/cjs/zklogin/bcs.js +0 -41
- package/dist/cjs/zklogin/index.js +0 -45
- package/dist/cjs/zklogin/jwt-decode.js +0 -88
- package/dist/cjs/zklogin/jwt-utils.js +0 -128
- package/dist/cjs/zklogin/nonce.js +0 -60
- package/dist/cjs/zklogin/poseidon.js +0 -64
- package/dist/cjs/zklogin/publickey.js +0 -281
- package/dist/cjs/zklogin/signature.js +0 -57
- package/dist/cjs/zklogin/utils.js +0 -98
- package/dist/esm/graphql/client.js +0 -79
- package/dist/esm/graphql/core.js +0 -505
- package/dist/esm/graphql/generated/2024.1/tada-env.js +0 -13121
- package/dist/esm/graphql/generated/2024.1/tsconfig.tada.js +0 -16
- package/dist/esm/graphql/generated/2024.4/tada-env.js +0 -13267
- package/dist/esm/graphql/generated/2024.4/tsconfig.tada.js +0 -16
- package/dist/esm/graphql/generated/latest/tada-env.js +0 -12905
- package/dist/esm/graphql/generated/latest/tsconfig.tada.js +0 -16
- package/dist/esm/graphql/generated/queries.js +0 -788
- package/dist/esm/graphql/index.js +0 -8
- package/dist/esm/graphql/schemas/2024.1/index.js +0 -8
- package/dist/esm/graphql/schemas/2024.4/index.js +0 -8
- package/dist/esm/graphql/schemas/latest/index.js +0 -8
- package/dist/esm/graphql/types.js +0 -0
- package/dist/esm/package.json +0 -5
- package/dist/esm/w/local/.eslintrc.js +0 -23
- package/dist/esm/w/messenger/.eslintrc.js +0 -23
- package/dist/esm/zklogin/address.js +0 -78
- package/dist/esm/zklogin/bcs.js +0 -21
- package/dist/esm/zklogin/index.js +0 -38
- package/dist/esm/zklogin/jwt-decode.js +0 -68
- package/dist/esm/zklogin/jwt-utils.js +0 -108
- package/dist/esm/zklogin/nonce.js +0 -40
- package/dist/esm/zklogin/poseidon.js +0 -61
- package/dist/esm/zklogin/publickey.js +0 -265
- package/dist/esm/zklogin/signature.js +0 -37
- package/dist/esm/zklogin/utils.js +0 -78
- package/dist/tsconfig.esm.tsbuildinfo +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -1,1512 +1,1366 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
var
|
|
5
|
-
|
|
6
|
-
var
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
return to;
|
|
20
|
-
};
|
|
21
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
-
mod
|
|
28
|
-
));
|
|
29
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
-
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
31
|
-
var messenger_exports = {};
|
|
32
|
-
__export(messenger_exports, {
|
|
33
|
-
Messenger: () => Messenger
|
|
2
|
+
// Copyright (c) Wowok.
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
5
|
+
if (k2 === undefined) k2 = k;
|
|
6
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
7
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
8
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
9
|
+
}
|
|
10
|
+
Object.defineProperty(o, k2, desc);
|
|
11
|
+
}) : (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
o[k2] = m[k];
|
|
14
|
+
}));
|
|
15
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
16
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
17
|
+
}) : function(o, v) {
|
|
18
|
+
o["default"] = v;
|
|
34
19
|
});
|
|
35
|
-
|
|
36
|
-
var
|
|
37
|
-
|
|
38
|
-
var
|
|
39
|
-
var
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
var
|
|
47
|
-
var
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
20
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
21
|
+
var ownKeys = function(o) {
|
|
22
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
23
|
+
var ar = [];
|
|
24
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
25
|
+
return ar;
|
|
26
|
+
};
|
|
27
|
+
return ownKeys(o);
|
|
28
|
+
};
|
|
29
|
+
return function (mod) {
|
|
30
|
+
if (mod && mod.__esModule) return mod;
|
|
31
|
+
var result = {};
|
|
32
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
33
|
+
__setModuleDefault(result, mod);
|
|
34
|
+
return result;
|
|
35
|
+
};
|
|
36
|
+
})();
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
exports.Messenger = void 0;
|
|
39
|
+
/**
|
|
40
|
+
* Messenger 核心模块
|
|
41
|
+
*
|
|
42
|
+
* 提供完整的端到端加密消息功能:
|
|
43
|
+
* 1. 发送加密消息(集成 Merkle Tree 时序证明)
|
|
44
|
+
* 2. 接收并解密消息
|
|
45
|
+
* 3. 链上证明提交(使用 proof.ts)
|
|
46
|
+
* 4. 会话状态同步
|
|
47
|
+
*
|
|
48
|
+
* 三重信任模型:
|
|
49
|
+
* - 身份信任:wowok 账户 Ed25519 签名
|
|
50
|
+
* - 加密信任:Signal Protocol 双棘轮
|
|
51
|
+
* - 时序信任:Merkle Tree + 服务器签名 + 链上证明
|
|
52
|
+
*/
|
|
53
|
+
const crypto_1 = require("crypto");
|
|
54
|
+
const fs = __importStar(require("fs"));
|
|
55
|
+
const path = __importStar(require("path"));
|
|
56
|
+
const proof_js_1 = require("../call/proof.js");
|
|
57
|
+
const session_js_1 = require("./session.js");
|
|
58
|
+
const server_js_1 = require("./server.js");
|
|
59
|
+
const storage_js_1 = require("./storage.js");
|
|
60
|
+
const crypto_js_1 = require("./crypto.js");
|
|
61
|
+
const utils_js_1 = require("./utils.js");
|
|
62
|
+
const types_js_1 = require("./types.js");
|
|
63
|
+
const sui_types_js_1 = require("../../utils/sui-types.js");
|
|
64
|
+
const account_js_1 = require("../local/account.js");
|
|
65
|
+
const eventsource_1 = require("eventsource");
|
|
66
|
+
// Polyfill EventSource for Node.js environment
|
|
67
|
+
if (typeof window === "undefined" &&
|
|
68
|
+
typeof globalThis.EventSource === "undefined") {
|
|
69
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
70
|
+
globalThis.EventSource = eventsource_1.EventSource;
|
|
71
|
+
console.log("[EventSource] Successfully polyfilled EventSource");
|
|
58
72
|
}
|
|
59
73
|
class Messenger {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* 获取用户地址
|
|
79
|
-
* @returns 用户地址
|
|
80
|
-
*/
|
|
81
|
-
getUserAddress() {
|
|
82
|
-
if (!this.userAddress) {
|
|
83
|
-
throw new import_types.MessengerError(
|
|
84
|
-
import_types.MessengerErrorCode.IDENTITY_NOT_FOUND,
|
|
85
|
-
"User address not set"
|
|
86
|
-
);
|
|
87
|
-
}
|
|
88
|
-
return this.userAddress;
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* 获取用户公钥
|
|
92
|
-
* @returns 公钥(带标志位)
|
|
93
|
-
*/
|
|
94
|
-
async getPublicKey() {
|
|
95
|
-
if (!this.userAddress) {
|
|
96
|
-
throw new import_types.MessengerError(
|
|
97
|
-
import_types.MessengerErrorCode.IDENTITY_NOT_FOUND,
|
|
98
|
-
"User address not set"
|
|
99
|
-
);
|
|
74
|
+
session;
|
|
75
|
+
serverClient;
|
|
76
|
+
config;
|
|
77
|
+
userAddress = null;
|
|
78
|
+
eventSource = null;
|
|
79
|
+
onMessageCallback = null;
|
|
80
|
+
prekeyCheckTimer = null;
|
|
81
|
+
messageStorage;
|
|
82
|
+
sessionStateStorage;
|
|
83
|
+
constructor(userAddress, config) {
|
|
84
|
+
this.userAddress = userAddress;
|
|
85
|
+
this.config = { ...types_js_1.DEFAULT_MESSENGER_CONFIG, ...config };
|
|
86
|
+
this.session = new session_js_1.MessengerSession(userAddress, this.config);
|
|
87
|
+
this.serverClient = new server_js_1.MessengerServerClient(this.config);
|
|
88
|
+
this.messageStorage = new storage_js_1.MessageStorage(userAddress);
|
|
89
|
+
this.sessionStateStorage = new storage_js_1.SessionStateStorage(userAddress);
|
|
100
90
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
isValidGuardMessage(guardAddress, passportAddress) {
|
|
111
|
-
return Boolean(
|
|
112
|
-
guardAddress && passportAddress && (0, import_sui_types.isValidWowAddress)(guardAddress) && (0, import_sui_types.isValidWowAddress)(passportAddress)
|
|
113
|
-
);
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* 生成签名参数
|
|
117
|
-
* 用于需要签名验证的 API 调用
|
|
118
|
-
*/
|
|
119
|
-
async generateSignatureParams(operation) {
|
|
120
|
-
if (!this.userAddress) {
|
|
121
|
-
throw new import_types.MessengerError(
|
|
122
|
-
import_types.MessengerErrorCode.IDENTITY_NOT_FOUND,
|
|
123
|
-
"User address not set"
|
|
124
|
-
);
|
|
125
|
-
}
|
|
126
|
-
const account = await import_account.Account.Instance().get(this.userAddress, false);
|
|
127
|
-
if (!account?.secret) {
|
|
128
|
-
throw new import_types.MessengerError(
|
|
129
|
-
import_types.MessengerErrorCode.IDENTITY_NOT_FOUND,
|
|
130
|
-
`Account not found or no secret key for ${this.userAddress}`
|
|
131
|
-
);
|
|
91
|
+
/**
|
|
92
|
+
* 获取用户地址
|
|
93
|
+
* @returns 用户地址
|
|
94
|
+
*/
|
|
95
|
+
getUserAddress() {
|
|
96
|
+
if (!this.userAddress) {
|
|
97
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
|
|
98
|
+
}
|
|
99
|
+
return this.userAddress;
|
|
132
100
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
signature: Buffer.from(signature).toString("base64"),
|
|
144
|
-
timestamp,
|
|
145
|
-
nonce
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* 生成随机 nonce
|
|
150
|
-
*/
|
|
151
|
-
generateNonce() {
|
|
152
|
-
const array = new Uint8Array(16);
|
|
153
|
-
crypto.getRandomValues(array);
|
|
154
|
-
return Array.from(array, (b) => b.toString(16).padStart(2, "0")).join(
|
|
155
|
-
""
|
|
156
|
-
);
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* 初始化 Messenger
|
|
160
|
-
* 1. 确保本地身份
|
|
161
|
-
* 2. 注册设备到服务器
|
|
162
|
-
* 3. 上传预密钥
|
|
163
|
-
* 4. 检查预密钥状态(如低于阈值则补充)
|
|
164
|
-
* 5. 启动定期预密钥检查
|
|
165
|
-
*/
|
|
166
|
-
async initialize() {
|
|
167
|
-
if (!this.userAddress) {
|
|
168
|
-
throw new import_types.MessengerError(
|
|
169
|
-
import_types.MessengerErrorCode.IDENTITY_NOT_FOUND,
|
|
170
|
-
"User address not set"
|
|
171
|
-
);
|
|
101
|
+
/**
|
|
102
|
+
* 获取用户公钥
|
|
103
|
+
* @returns 公钥(带标志位)
|
|
104
|
+
*/
|
|
105
|
+
async getPublicKey() {
|
|
106
|
+
if (!this.userAddress) {
|
|
107
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
|
|
108
|
+
}
|
|
109
|
+
const account = await account_js_1.Account.Instance().get(this.userAddress, false);
|
|
110
|
+
return account?.pubkey || "";
|
|
172
111
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
async checkAndRefillPrekeys() {
|
|
185
|
-
if (!this.userAddress) return;
|
|
186
|
-
await this.session.ensurePreKeys(this.userAddress, false);
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* 启动预密钥定期检查定时器
|
|
190
|
-
*/
|
|
191
|
-
startPrekeyCheckTimer() {
|
|
192
|
-
if (this.prekeyCheckTimer) {
|
|
193
|
-
clearInterval(this.prekeyCheckTimer);
|
|
112
|
+
/**
|
|
113
|
+
* 验证Guard消息格式
|
|
114
|
+
* @param guardAddress Guard地址
|
|
115
|
+
* @param passportAddress Passport地址
|
|
116
|
+
* @returns 是否为有效的Guard消息
|
|
117
|
+
*/
|
|
118
|
+
isValidGuardMessage(guardAddress, passportAddress) {
|
|
119
|
+
return Boolean(guardAddress &&
|
|
120
|
+
passportAddress &&
|
|
121
|
+
(0, sui_types_js_1.isValidWowAddress)(guardAddress) &&
|
|
122
|
+
(0, sui_types_js_1.isValidWowAddress)(passportAddress));
|
|
194
123
|
}
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
124
|
+
/**
|
|
125
|
+
* 生成签名参数
|
|
126
|
+
* 用于需要签名验证的 API 调用
|
|
127
|
+
*/
|
|
128
|
+
async generateSignatureParams(operation) {
|
|
129
|
+
if (!this.userAddress) {
|
|
130
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
|
|
131
|
+
}
|
|
132
|
+
const account = await account_js_1.Account.Instance().get(this.userAddress, false);
|
|
133
|
+
if (!account?.secret) {
|
|
134
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, `Account not found or no secret key for ${this.userAddress}`);
|
|
135
|
+
}
|
|
136
|
+
const { Ed25519Keypair } = await import("../../keypairs/ed25519/index.js");
|
|
137
|
+
const keypair = Ed25519Keypair.fromSecretKey(account.secret);
|
|
138
|
+
const publicKey = keypair.getPublicKey();
|
|
139
|
+
const publicKeyWithFlag = publicKey.toWPublicKey();
|
|
140
|
+
const timestamp = Date.now(); //@ 使用ms时间戳
|
|
141
|
+
const nonce = this.generateNonce();
|
|
142
|
+
const message = `${operation}:${publicKeyWithFlag}:${timestamp}:${nonce}`;
|
|
143
|
+
const signature = await keypair.sign(new TextEncoder().encode(message));
|
|
144
|
+
return {
|
|
145
|
+
signatureScheme: "ED25519",
|
|
146
|
+
signature: Buffer.from(signature).toString("base64"),
|
|
147
|
+
timestamp,
|
|
148
|
+
nonce,
|
|
149
|
+
};
|
|
207
150
|
}
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
* 3. 接收服务器返回的 Merkle 证明数据
|
|
216
|
-
* 4. 本地存储消息
|
|
217
|
-
*/
|
|
218
|
-
async sendMessage(recipientAddress, plaintext, options) {
|
|
219
|
-
if (!this.userAddress) {
|
|
220
|
-
throw new import_types.MessengerError(
|
|
221
|
-
import_types.MessengerErrorCode.IDENTITY_NOT_FOUND,
|
|
222
|
-
"User address not set"
|
|
223
|
-
);
|
|
151
|
+
/**
|
|
152
|
+
* 生成随机 nonce
|
|
153
|
+
*/
|
|
154
|
+
generateNonce() {
|
|
155
|
+
const array = new Uint8Array(16);
|
|
156
|
+
crypto.getRandomValues(array);
|
|
157
|
+
return Array.from(array, (b) => b.toString(16).padStart(2, "0")).join("");
|
|
224
158
|
}
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
159
|
+
/**
|
|
160
|
+
* 初始化 Messenger
|
|
161
|
+
* 1. 确保本地身份
|
|
162
|
+
* 2. 注册设备到服务器
|
|
163
|
+
* 3. 上传预密钥
|
|
164
|
+
* 4. 检查预密钥状态(如低于阈值则补充)
|
|
165
|
+
* 5. 启动定期预密钥检查
|
|
166
|
+
*/
|
|
167
|
+
async initialize() {
|
|
168
|
+
if (!this.userAddress) {
|
|
169
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
|
|
170
|
+
}
|
|
171
|
+
// 确保身份并注册设备
|
|
172
|
+
await this.session.ensureIdentity(this.userAddress);
|
|
173
|
+
await this.session.registerDevice(this.userAddress);
|
|
174
|
+
await this.session.ensurePreKeys(this.userAddress);
|
|
175
|
+
// 初始化时检查预密钥状态
|
|
176
|
+
await this.checkAndRefillPrekeys();
|
|
177
|
+
// 启动定期预密钥检查
|
|
178
|
+
this.startPrekeyCheckTimer();
|
|
234
179
|
}
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
"base64"
|
|
246
|
-
);
|
|
247
|
-
const plaintextHash = (0, import_crypto2.hashPlaintext)(
|
|
248
|
-
plaintext,
|
|
249
|
-
createdAt,
|
|
250
|
-
options?.guardAddress,
|
|
251
|
-
options?.passportAddress,
|
|
252
|
-
lastReceivedLeafIndex
|
|
253
|
-
);
|
|
254
|
-
const account = await import_account.Account.Instance().get(this.userAddress, false);
|
|
255
|
-
if (!account) {
|
|
256
|
-
throw new import_types.MessengerError(
|
|
257
|
-
import_types.MessengerErrorCode.IDENTITY_NOT_FOUND,
|
|
258
|
-
"User account not found"
|
|
259
|
-
);
|
|
180
|
+
/**
|
|
181
|
+
* 检查并补充预密钥
|
|
182
|
+
*
|
|
183
|
+
* 逻辑:如果服务器预密钥未满,自动补充到最大容量
|
|
184
|
+
*/
|
|
185
|
+
async checkAndRefillPrekeys() {
|
|
186
|
+
if (!this.userAddress)
|
|
187
|
+
return;
|
|
188
|
+
// 直接调用 ensurePreKeys,它会查询服务器状态并按需补充
|
|
189
|
+
await this.session.ensurePreKeys(this.userAddress, false);
|
|
260
190
|
}
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
const signResult = await import_account.Account.Instance().signData(
|
|
268
|
-
this.userAddress,
|
|
269
|
-
signMessage
|
|
270
|
-
);
|
|
271
|
-
const signatureBuffer = Buffer.from(
|
|
272
|
-
signResult.signature.slice(2),
|
|
273
|
-
"hex"
|
|
274
|
-
);
|
|
275
|
-
const signatureBase64 = (0, import_crypto2.bytesToBase64)(new Uint8Array(signatureBuffer));
|
|
276
|
-
const response = await this.serverClient.sendMessage({
|
|
277
|
-
sender: signResult.publicKey,
|
|
278
|
-
recipient: recipientAddress,
|
|
279
|
-
ciphertext,
|
|
280
|
-
plaintextHash,
|
|
281
|
-
clientTimestamp: createdAt,
|
|
282
|
-
msgType: encrypted.type,
|
|
283
|
-
signatureScheme: "ED25519",
|
|
284
|
-
signature: signatureBase64,
|
|
285
|
-
timestamp,
|
|
286
|
-
nonce,
|
|
287
|
-
guardAddress: options?.guardAddress,
|
|
288
|
-
passportAddress: options?.passportAddress,
|
|
289
|
-
force: options?.force,
|
|
290
|
-
// 【修复】只有当 lastReceivedLeafIndex >= 0 时才发送,否则发送 undefined
|
|
291
|
-
lastReceivedLeafIndex: lastReceivedLeafIndex >= 0 ? lastReceivedLeafIndex : void 0
|
|
292
|
-
});
|
|
293
|
-
const message = {
|
|
294
|
-
messageId: response.messageId,
|
|
295
|
-
fromAddress: this.userAddress,
|
|
296
|
-
toAddress: recipientAddress,
|
|
297
|
-
plaintextHash,
|
|
298
|
-
plaintext,
|
|
299
|
-
guardAddress: options?.guardAddress,
|
|
300
|
-
passportAddress: options?.passportAddress,
|
|
301
|
-
lastReceivedLeafIndex,
|
|
302
|
-
// 【新增】保存消息确认字段
|
|
303
|
-
direction: import_types.MessageDirection.SENT,
|
|
304
|
-
status: response.status === "confirmed" ? import_types.MessageStatus.CONFIRMED : import_types.MessageStatus.PENDING,
|
|
305
|
-
msgType: encrypted.type,
|
|
306
|
-
createdAt
|
|
307
|
-
};
|
|
308
|
-
if (response.merkleData) {
|
|
309
|
-
message.leafIndex = response.merkleData.leafIndex;
|
|
310
|
-
message.prevRoot = response.merkleData.prevRoot;
|
|
311
|
-
message.newRoot = response.merkleData.newRoot;
|
|
312
|
-
message.serverSignature = response.merkleData.serverSignature;
|
|
313
|
-
message.serverTimestamp = response.merkleData.serverTimestamp;
|
|
314
|
-
message.serverPublicKey = response.merkleData.serverPublicKey;
|
|
315
|
-
this.sessionStateStorage.updateSessionState(
|
|
316
|
-
this.userAddress,
|
|
317
|
-
recipientAddress,
|
|
318
|
-
{
|
|
319
|
-
currentRoot: response.merkleData.newRoot,
|
|
320
|
-
prevRoot: response.merkleData.prevRoot,
|
|
321
|
-
lastLeafIndex: response.merkleData.leafIndex,
|
|
322
|
-
lastSyncAt: Date.now()
|
|
191
|
+
/**
|
|
192
|
+
* 启动预密钥定期检查定时器
|
|
193
|
+
*/
|
|
194
|
+
startPrekeyCheckTimer() {
|
|
195
|
+
if (this.prekeyCheckTimer) {
|
|
196
|
+
clearInterval(this.prekeyCheckTimer);
|
|
323
197
|
}
|
|
324
|
-
|
|
198
|
+
const interval = this.config.prekeyCheckIntervalMs ?? 24 * 60 * 60 * 1000; // 默认1天
|
|
199
|
+
this.prekeyCheckTimer = setInterval(() => {
|
|
200
|
+
this.checkAndRefillPrekeys();
|
|
201
|
+
}, interval);
|
|
202
|
+
//console.log(`Prekey check timer started (interval: ${interval}ms)`);
|
|
325
203
|
}
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
msgId,
|
|
335
|
-
import_types.MessageStatus.CONFIRMED,
|
|
336
|
-
{
|
|
337
|
-
leafIndex: merkleData.leafIndex,
|
|
338
|
-
newRoot: merkleData.newRoot,
|
|
339
|
-
serverSignature: merkleData.serverSignature,
|
|
340
|
-
serverTimestamp: merkleData.serverTimestamp,
|
|
341
|
-
serverPublicKey: merkleData.serverPublicKey
|
|
342
|
-
}
|
|
343
|
-
);
|
|
204
|
+
/**
|
|
205
|
+
* 停止预密钥定期检查定时器
|
|
206
|
+
*/
|
|
207
|
+
stopPrekeyCheckTimer() {
|
|
208
|
+
if (this.prekeyCheckTimer) {
|
|
209
|
+
clearInterval(this.prekeyCheckTimer);
|
|
210
|
+
this.prekeyCheckTimer = null;
|
|
211
|
+
//console.log("Prekey check timer stopped");
|
|
344
212
|
}
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
return {
|
|
348
|
-
messageId: response.messageId,
|
|
349
|
-
status: message.status,
|
|
350
|
-
merkleData: response.merkleData,
|
|
351
|
-
guardList: response.guard_list
|
|
352
|
-
};
|
|
353
|
-
}
|
|
354
|
-
/**
|
|
355
|
-
* 拉取消息
|
|
356
|
-
*
|
|
357
|
-
* 流程:
|
|
358
|
-
* 1. 从服务器拉取消息
|
|
359
|
-
* 2. 解密消息(Signal Protocol)
|
|
360
|
-
* 3. 验证 Merkle 证明
|
|
361
|
-
* 4. 本地存储并确认消息
|
|
362
|
-
*/
|
|
363
|
-
async pullMessages(limit) {
|
|
364
|
-
if (!this.userAddress) {
|
|
365
|
-
throw new import_types.MessengerError(
|
|
366
|
-
import_types.MessengerErrorCode.IDENTITY_NOT_FOUND,
|
|
367
|
-
"User address not set"
|
|
368
|
-
);
|
|
369
213
|
}
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
signature: (0, import_crypto2.bytesToBase64)(signature),
|
|
383
|
-
timestamp,
|
|
384
|
-
nonce
|
|
385
|
-
};
|
|
386
|
-
const response = await this.serverClient.pullMessages(
|
|
387
|
-
this.userAddress,
|
|
388
|
-
publicKey,
|
|
389
|
-
signatureParams,
|
|
390
|
-
limit
|
|
391
|
-
);
|
|
392
|
-
if (response.messages.length === 0) {
|
|
393
|
-
return [];
|
|
394
|
-
}
|
|
395
|
-
const decryptedMessages = [];
|
|
396
|
-
const acknowledgedIds = [];
|
|
397
|
-
for (const serverMsg of response.messages) {
|
|
398
|
-
try {
|
|
399
|
-
const existingMessage = this.messageStorage.getMessage(
|
|
400
|
-
serverMsg.id
|
|
401
|
-
);
|
|
402
|
-
if (existingMessage) {
|
|
403
|
-
acknowledgedIds.push(serverMsg.id);
|
|
404
|
-
continue;
|
|
405
|
-
}
|
|
406
|
-
const ciphertext = Uint8Array.from(
|
|
407
|
-
Buffer.from(serverMsg.bodyB64, "base64")
|
|
408
|
-
);
|
|
409
|
-
const decryptedData = await this.session.decryptMessage(
|
|
410
|
-
this.userAddress,
|
|
411
|
-
serverMsg.from,
|
|
412
|
-
ciphertext.buffer,
|
|
413
|
-
serverMsg.msgType
|
|
414
|
-
);
|
|
415
|
-
const plaintext = decryptedData;
|
|
416
|
-
const senderLastReceivedIndex = serverMsg.lastReceivedLeafIndex ?? -1;
|
|
417
|
-
if (senderLastReceivedIndex >= 0) {
|
|
418
|
-
const myLastSent = this.getLastSentLeafIndex(
|
|
419
|
-
serverMsg.from
|
|
420
|
-
);
|
|
421
|
-
if (senderLastReceivedIndex < myLastSent) {
|
|
422
|
-
}
|
|
214
|
+
/**
|
|
215
|
+
* 发送加密消息
|
|
216
|
+
*
|
|
217
|
+
* 流程:
|
|
218
|
+
* 1. 使用 Signal Protocol 加密消息
|
|
219
|
+
* 2. 发送到服务器
|
|
220
|
+
* 3. 接收服务器返回的 Merkle 证明数据
|
|
221
|
+
* 4. 本地存储消息
|
|
222
|
+
*/
|
|
223
|
+
async sendMessage(recipientAddress, plaintext, options) {
|
|
224
|
+
if (!this.userAddress) {
|
|
225
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
|
|
423
226
|
}
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
227
|
+
const createdAt = Date.now();
|
|
228
|
+
const timestamp = Date.now();
|
|
229
|
+
const nonce = this.generateNonce();
|
|
230
|
+
// 检查普通消息大小限制(10KB)
|
|
231
|
+
const plaintextBytes = new TextEncoder().encode(plaintext).length;
|
|
232
|
+
if (plaintextBytes > types_js_1.NORMAL_MESSAGE_BYTES_LIMIT) {
|
|
233
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.INVALID_INPUT, `Message size (${plaintextBytes} bytes) exceeds maximum allowed size (${types_js_1.NORMAL_MESSAGE_BYTES_LIMIT} bytes). Consider using sendZipFile for large content.`);
|
|
428
234
|
}
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
235
|
+
// 【新增】获取最后收到的消息序号(用于消息确认)
|
|
236
|
+
const lastReceivedLeafIndex = this.messageStorage.getLastReceivedLeafIndex(this.userAddress, recipientAddress);
|
|
237
|
+
// 1. 加密消息(明文就是原始消息内容)
|
|
238
|
+
const encrypted = await this.session.encryptMessage(this.userAddress, recipientAddress, plaintext);
|
|
239
|
+
const ciphertext = Buffer.from(new Uint8Array(encrypted.body)).toString("base64");
|
|
240
|
+
// 2. 计算明文哈希(用于 Merkle Tree 证明)
|
|
241
|
+
// 【更新】包含 lastReceivedLeafIndex 在哈希计算中
|
|
242
|
+
const plaintextHash = (0, crypto_js_1.hashPlaintext)(plaintext, createdAt, options?.guardAddress, options?.passportAddress, lastReceivedLeafIndex);
|
|
243
|
+
// 3. 签名消息
|
|
244
|
+
// 注意: guard_address 和 passport_address 始终包含在签名中(可能为空字符串),防止参数篡改
|
|
245
|
+
const account = await account_js_1.Account.Instance().get(this.userAddress, false);
|
|
246
|
+
if (!account) {
|
|
247
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "User account not found");
|
|
433
248
|
}
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
const
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
} : void 0
|
|
249
|
+
const publicKey = account.pubkey;
|
|
250
|
+
const guardAddr = options?.guardAddress || "";
|
|
251
|
+
const passportAddr = options?.passportAddress || "";
|
|
252
|
+
// 统一发送模式(合并 send 和 send_force)
|
|
253
|
+
// 统一签名格式: send_message:{sender}:{recipient}:{guard_address}:{passport_address}:{plaintext_hash}:{last_received_leaf_index}:{public_key}:{timestamp}:{nonce}:{force}
|
|
254
|
+
const lastReceivedStr = lastReceivedLeafIndex >= 0 ? lastReceivedLeafIndex.toString() : "";
|
|
255
|
+
const forceStr = options?.force ? "true" : "false";
|
|
256
|
+
const signMessage = `send_message:${this.userAddress}:${recipientAddress}:${guardAddr}:${passportAddr}:${plaintextHash}:${lastReceivedStr}:${publicKey}:${timestamp}:${nonce}:${forceStr}`;
|
|
257
|
+
const signResult = await account_js_1.Account.Instance().signData(this.userAddress, signMessage);
|
|
258
|
+
const signatureBuffer = Buffer.from(signResult.signature.slice(2), "hex");
|
|
259
|
+
const signatureBase64 = (0, crypto_js_1.bytesToBase64)(new Uint8Array(signatureBuffer));
|
|
260
|
+
// 使用统一的 sendMessage API
|
|
261
|
+
const response = await this.serverClient.sendMessage({
|
|
262
|
+
sender: signResult.publicKey,
|
|
263
|
+
recipient: recipientAddress,
|
|
264
|
+
ciphertext,
|
|
265
|
+
plaintextHash,
|
|
266
|
+
clientTimestamp: createdAt,
|
|
267
|
+
msgType: encrypted.type,
|
|
268
|
+
signatureScheme: "ED25519",
|
|
269
|
+
signature: signatureBase64,
|
|
270
|
+
timestamp,
|
|
271
|
+
nonce,
|
|
272
|
+
guardAddress: options?.guardAddress,
|
|
273
|
+
passportAddress: options?.passportAddress,
|
|
274
|
+
force: options?.force,
|
|
275
|
+
// 【修复】只有当 lastReceivedLeafIndex >= 0 时才发送,否则发送 undefined
|
|
276
|
+
lastReceivedLeafIndex: lastReceivedLeafIndex >= 0
|
|
277
|
+
? lastReceivedLeafIndex
|
|
278
|
+
: undefined,
|
|
465
279
|
});
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
leafIndex: serverMsg.merkleMetadata?.leafIndex,
|
|
483
|
-
prevRoot: serverMsg.merkleMetadata?.prevRoot,
|
|
484
|
-
newRoot: serverMsg.merkleMetadata?.newRoot,
|
|
485
|
-
serverSignature: serverMsg.merkleMetadata?.serverSignature,
|
|
486
|
-
serverTimestamp: serverMsg.merkleMetadata?.serverTimestamp,
|
|
487
|
-
serverPublicKey: serverMsg.merkleMetadata?.serverPublicKey,
|
|
488
|
-
createdAt: serverMsg.clientTimestamp,
|
|
489
|
-
// 保存 ZIP 元数据(如果是 ZIP 消息)
|
|
490
|
-
zipMetadata: serverMsg.zipMetadata
|
|
280
|
+
// 4. 保存到本地存储
|
|
281
|
+
const message = {
|
|
282
|
+
messageId: response.messageId,
|
|
283
|
+
fromAddress: this.userAddress,
|
|
284
|
+
toAddress: recipientAddress,
|
|
285
|
+
plaintextHash,
|
|
286
|
+
plaintext,
|
|
287
|
+
guardAddress: options?.guardAddress,
|
|
288
|
+
passportAddress: options?.passportAddress,
|
|
289
|
+
lastReceivedLeafIndex, // 【新增】保存消息确认字段
|
|
290
|
+
direction: types_js_1.MessageDirection.SENT,
|
|
291
|
+
status: response.status === "confirmed"
|
|
292
|
+
? types_js_1.MessageStatus.CONFIRMED
|
|
293
|
+
: types_js_1.MessageStatus.PENDING,
|
|
294
|
+
msgType: encrypted.type,
|
|
295
|
+
createdAt,
|
|
491
296
|
};
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
297
|
+
if (response.merkleData) {
|
|
298
|
+
message.leafIndex = response.merkleData.leafIndex;
|
|
299
|
+
message.prevRoot = response.merkleData.prevRoot;
|
|
300
|
+
message.newRoot = response.merkleData.newRoot;
|
|
301
|
+
message.serverSignature = response.merkleData.serverSignature;
|
|
302
|
+
message.serverTimestamp = response.merkleData.serverTimestamp;
|
|
303
|
+
message.serverPublicKey = response.merkleData.serverPublicKey;
|
|
304
|
+
// 更新会话状态
|
|
305
|
+
this.sessionStateStorage.updateSessionState(this.userAddress, recipientAddress, {
|
|
306
|
+
currentRoot: response.merkleData.newRoot,
|
|
307
|
+
prevRoot: response.merkleData.prevRoot,
|
|
308
|
+
lastLeafIndex: response.merkleData.leafIndex,
|
|
309
|
+
lastSyncAt: Date.now(),
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
this.messageStorage.saveMessage(message);
|
|
313
|
+
// 方案B:处理服务器返回的其他已验证消息的 Merkle 数据
|
|
314
|
+
// 这些消息可能之前因为发送方离线而没有收到 Merkle 数据
|
|
315
|
+
if (response.pendingMerkleData) {
|
|
316
|
+
for (const [msgId, merkleData] of Object.entries(response.pendingMerkleData)) {
|
|
317
|
+
// 检查本地是否已有该消息
|
|
318
|
+
const existingMsg = this.messageStorage.getMessage(msgId);
|
|
319
|
+
if (existingMsg &&
|
|
320
|
+
existingMsg.status === types_js_1.MessageStatus.PENDING) {
|
|
321
|
+
// 更新消息的 Merkle 数据
|
|
322
|
+
this.messageStorage.updateMessageStatus(msgId, types_js_1.MessageStatus.CONFIRMED, {
|
|
323
|
+
leafIndex: merkleData.leafIndex,
|
|
324
|
+
newRoot: merkleData.newRoot,
|
|
325
|
+
serverSignature: merkleData.serverSignature,
|
|
326
|
+
serverTimestamp: merkleData.serverTimestamp,
|
|
327
|
+
serverPublicKey: merkleData.serverPublicKey,
|
|
328
|
+
});
|
|
329
|
+
/*console.log(
|
|
330
|
+
`Updated pending message ${msgId} with merkle data from pendingMerkleData`,
|
|
331
|
+
);*/
|
|
332
|
+
}
|
|
502
333
|
}
|
|
503
|
-
);
|
|
504
334
|
}
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
timestamp: timestamp2,
|
|
512
|
-
merkleVerified: !!serverMsg.merkleMetadata,
|
|
513
|
-
merkleData: serverMsg.merkleMetadata ? {
|
|
514
|
-
leafIndex: serverMsg.merkleMetadata.leafIndex,
|
|
515
|
-
rootHash: serverMsg.merkleMetadata.newRoot
|
|
516
|
-
} : void 0
|
|
517
|
-
});
|
|
518
|
-
acknowledgedIds.push(serverMsg.id);
|
|
519
|
-
} catch (error) {
|
|
520
|
-
throw new Error(
|
|
521
|
-
`Failed to decrypt message ${serverMsg.id}: ${error instanceof Error ? error.message : String(error)}`
|
|
522
|
-
);
|
|
523
|
-
}
|
|
335
|
+
return {
|
|
336
|
+
messageId: response.messageId,
|
|
337
|
+
status: message.status,
|
|
338
|
+
merkleData: response.merkleData,
|
|
339
|
+
guardList: response.guard_list,
|
|
340
|
+
};
|
|
524
341
|
}
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
);
|
|
542
|
-
const
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
await
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
{
|
|
549
|
-
publicKey: signResult2.publicKey,
|
|
342
|
+
/**
|
|
343
|
+
* 拉取消息
|
|
344
|
+
*
|
|
345
|
+
* 流程:
|
|
346
|
+
* 1. 从服务器拉取消息
|
|
347
|
+
* 2. 解密消息(Signal Protocol)
|
|
348
|
+
* 3. 验证 Merkle 证明
|
|
349
|
+
* 4. 本地存储并确认消息
|
|
350
|
+
*/
|
|
351
|
+
async pullMessages(limit) {
|
|
352
|
+
if (!this.userAddress) {
|
|
353
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
|
|
354
|
+
}
|
|
355
|
+
// 1. 生成签名参数
|
|
356
|
+
// 签名格式: fetch_messages:{address}:{limit}:{timestamp}:{nonce}
|
|
357
|
+
const timestamp = Date.now(); //@ 使用ms时间戳
|
|
358
|
+
const nonce = this.generateNonce();
|
|
359
|
+
const message = `fetch_messages:${this.userAddress}:${limit || 100}:${timestamp}:${nonce}`;
|
|
360
|
+
const account = await account_js_1.Account.Instance().get(this.userAddress, false);
|
|
361
|
+
const publicKey = account?.pubkey || "";
|
|
362
|
+
const signResult = await account_js_1.Account.Instance().signData(this.userAddress, message);
|
|
363
|
+
const signature = Buffer.from(signResult.signature.slice(2), "hex");
|
|
364
|
+
const signatureParams = {
|
|
550
365
|
signatureScheme: "ED25519",
|
|
551
|
-
signature:
|
|
552
|
-
timestamp
|
|
553
|
-
nonce
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
if (!this.userAddress) return -1;
|
|
568
|
-
const messages = this.messageStorage.getMessagesBySession(
|
|
569
|
-
this.userAddress,
|
|
570
|
-
peerAddress
|
|
571
|
-
);
|
|
572
|
-
const sentMessages = messages.filter(
|
|
573
|
-
(m) => m.direction === import_types.MessageDirection.SENT && m.leafIndex !== void 0
|
|
574
|
-
);
|
|
575
|
-
if (sentMessages.length === 0) return -1;
|
|
576
|
-
return Math.max(...sentMessages.map((m) => m.leafIndex));
|
|
577
|
-
}
|
|
578
|
-
/**
|
|
579
|
-
* 获取会话历史消息
|
|
580
|
-
*/
|
|
581
|
-
getSessionMessages(peerAddress) {
|
|
582
|
-
if (!this.userAddress) {
|
|
583
|
-
return [];
|
|
584
|
-
}
|
|
585
|
-
return this.messageStorage.getMessagesBySession(
|
|
586
|
-
this.userAddress,
|
|
587
|
-
peerAddress
|
|
588
|
-
);
|
|
589
|
-
}
|
|
590
|
-
/**
|
|
591
|
-
* 获取会话当前状态
|
|
592
|
-
*/
|
|
593
|
-
getSessionState(peerAddress) {
|
|
594
|
-
if (!this.userAddress) {
|
|
595
|
-
return void 0;
|
|
596
|
-
}
|
|
597
|
-
return this.sessionStateStorage.getSessionState(
|
|
598
|
-
this.userAddress,
|
|
599
|
-
peerAddress
|
|
600
|
-
);
|
|
601
|
-
}
|
|
602
|
-
/**
|
|
603
|
-
* 提交链上证明
|
|
604
|
-
*
|
|
605
|
-
* 使用 proof.ts 将 Merkle Root 提交到链上,获得时间证明
|
|
606
|
-
*
|
|
607
|
-
* @param env CallEnv 环境
|
|
608
|
-
* @param peerAddress 对方地址
|
|
609
|
-
* @param description 证明描述
|
|
610
|
-
*/
|
|
611
|
-
async submitChainProof(env, peerAddress, description) {
|
|
612
|
-
if (!this.userAddress) {
|
|
613
|
-
throw new import_types.MessengerError(
|
|
614
|
-
import_types.MessengerErrorCode.IDENTITY_NOT_FOUND,
|
|
615
|
-
"User address not set"
|
|
616
|
-
);
|
|
617
|
-
}
|
|
618
|
-
const sessionState = this.sessionStateStorage.getSessionState(
|
|
619
|
-
this.userAddress,
|
|
620
|
-
peerAddress
|
|
621
|
-
);
|
|
622
|
-
if (!sessionState || !sessionState.currentRoot) {
|
|
623
|
-
throw new import_types.MessengerError(
|
|
624
|
-
import_types.MessengerErrorCode.SESSION_NOT_ESTABLISHED,
|
|
625
|
-
"No session state found"
|
|
626
|
-
);
|
|
627
|
-
}
|
|
628
|
-
const messages = this.messageStorage.getMessagesBySession(
|
|
629
|
-
this.userAddress,
|
|
630
|
-
peerAddress
|
|
631
|
-
);
|
|
632
|
-
const lastMessage = messages[messages.length - 1];
|
|
633
|
-
if (!lastMessage || !lastMessage.serverPublicKey || !lastMessage.serverSignature) {
|
|
634
|
-
throw new import_types.MessengerError(
|
|
635
|
-
import_types.MessengerErrorCode.INVALID_PROOF,
|
|
636
|
-
"No temporal proof (missing server public key or signature), cannot submit Proof to WoWok blockchain"
|
|
637
|
-
);
|
|
638
|
-
}
|
|
639
|
-
const serverPubKey = lastMessage.serverPublicKey;
|
|
640
|
-
const serverSignature = lastMessage.serverSignature;
|
|
641
|
-
const proofData = {
|
|
642
|
-
sessionId: sessionState.sessionId,
|
|
643
|
-
merkleRoot: sessionState.currentRoot,
|
|
644
|
-
messageCount: sessionState.messageCount,
|
|
645
|
-
timestamp: Date.now()
|
|
646
|
-
};
|
|
647
|
-
const callProof = new import_proof.CallProof({
|
|
648
|
-
proof: JSON.stringify(proofData),
|
|
649
|
-
server_pubkey: serverPubKey,
|
|
650
|
-
server_signature: serverSignature,
|
|
651
|
-
proof_type: import_types.CHAIN_PROOF_TYPE,
|
|
652
|
-
// 1 = Messenger Session Proof
|
|
653
|
-
description: description || `Messenger session proof for ${this.userAddress} <-> ${peerAddress}`,
|
|
654
|
-
item_count: sessionState.messageCount,
|
|
655
|
-
about_address: sessionState.sessionId
|
|
656
|
-
});
|
|
657
|
-
const result = await callProof.call(env);
|
|
658
|
-
const responseData = result?.objectChanges;
|
|
659
|
-
const proofAddress = responseData?.find(
|
|
660
|
-
(change) => change.objectType?.includes("Proof")
|
|
661
|
-
)?.objectId;
|
|
662
|
-
return {
|
|
663
|
-
proofAddress: proofAddress || "",
|
|
664
|
-
txHash: result?.digest || ""
|
|
665
|
-
};
|
|
666
|
-
}
|
|
667
|
-
/**
|
|
668
|
-
* 建立 SSE 连接并监听服务器事件
|
|
669
|
-
*
|
|
670
|
-
* 安全要求:必须提供签名验证,防止未授权监听他人事件
|
|
671
|
-
* @param onMessage 新消息回调
|
|
672
|
-
* @param signatureParams 签名参数(可选,不提供时自动生成)
|
|
673
|
-
*/
|
|
674
|
-
async connectEventSource(onMessage, signatureParams) {
|
|
675
|
-
if (!this.userAddress) {
|
|
676
|
-
throw new import_types.MessengerError(
|
|
677
|
-
import_types.MessengerErrorCode.IDENTITY_NOT_FOUND,
|
|
678
|
-
"User address not set"
|
|
679
|
-
);
|
|
680
|
-
}
|
|
681
|
-
this.disconnectEventSource();
|
|
682
|
-
if (onMessage) {
|
|
683
|
-
this.onMessageCallback = onMessage;
|
|
684
|
-
}
|
|
685
|
-
const account = await import_account.Account.Instance().get(this.userAddress, false);
|
|
686
|
-
const publicKey = account?.pubkey || "";
|
|
687
|
-
let params = signatureParams;
|
|
688
|
-
if (!params) {
|
|
689
|
-
const timestamp = Date.now();
|
|
690
|
-
const nonce = this.generateNonce();
|
|
691
|
-
const message = `event_stream:${this.userAddress}:${timestamp}:${nonce}`;
|
|
692
|
-
const signResult = await import_account.Account.Instance().signData(
|
|
693
|
-
this.userAddress,
|
|
694
|
-
message
|
|
695
|
-
);
|
|
696
|
-
const signatureBuffer = Buffer.from(
|
|
697
|
-
signResult.signature.slice(2),
|
|
698
|
-
"hex"
|
|
699
|
-
);
|
|
700
|
-
const signatureBase64 = (0, import_crypto2.bytesToBase64)(
|
|
701
|
-
new Uint8Array(signatureBuffer)
|
|
702
|
-
);
|
|
703
|
-
params = {
|
|
704
|
-
signatureScheme: "ED25519",
|
|
705
|
-
signature: signatureBase64,
|
|
706
|
-
timestamp,
|
|
707
|
-
nonce
|
|
708
|
-
};
|
|
709
|
-
}
|
|
710
|
-
const queryParams = new URLSearchParams({
|
|
711
|
-
publicKey,
|
|
712
|
-
signatureScheme: params.signatureScheme,
|
|
713
|
-
signature: params.signature,
|
|
714
|
-
timestamp: params.timestamp.toString(),
|
|
715
|
-
nonce: params.nonce
|
|
716
|
-
});
|
|
717
|
-
const url = `${this.config.serverUrl}/v1/events/${this.userAddress}?${queryParams}`;
|
|
718
|
-
if (typeof EventSource === "undefined") {
|
|
719
|
-
throw new ReferenceError("EventSource is not defined");
|
|
720
|
-
}
|
|
721
|
-
this.eventSource = new EventSource(url);
|
|
722
|
-
this.eventSource.onmessage = async (event) => {
|
|
723
|
-
try {
|
|
724
|
-
const sseEvent = JSON.parse(event.data);
|
|
725
|
-
switch (sseEvent.type) {
|
|
726
|
-
case "NewMessage":
|
|
727
|
-
if (this.onMessageCallback) {
|
|
728
|
-
const messages = await this.pullMessages();
|
|
729
|
-
if (messages.length > 0) {
|
|
730
|
-
this.onMessageCallback(messages);
|
|
731
|
-
}
|
|
732
|
-
}
|
|
733
|
-
break;
|
|
734
|
-
case "ark_confirmed": {
|
|
735
|
-
const {
|
|
736
|
-
message_ids,
|
|
737
|
-
recipient,
|
|
738
|
-
recipient_public_key,
|
|
739
|
-
signature,
|
|
740
|
-
timestamp
|
|
741
|
-
} = sseEvent.data;
|
|
742
|
-
const verifyMessage2 = `ack_messages:${recipient}:${message_ids.join(",")}:${recipient_public_key}:${timestamp}`;
|
|
366
|
+
signature: (0, crypto_js_1.bytesToBase64)(signature),
|
|
367
|
+
timestamp,
|
|
368
|
+
nonce,
|
|
369
|
+
};
|
|
370
|
+
// 2. 拉取消息(带签名验证)
|
|
371
|
+
const response = await this.serverClient.pullMessages(this.userAddress, publicKey, signatureParams, limit);
|
|
372
|
+
/*console.log(`[Messenger] 服务器返回 ${response.messages.length} 条消息`);
|
|
373
|
+
if (response.messages.length > 0) {
|
|
374
|
+
console.log(`[Messenger] 消息 IDs: ${response.messages.map(m => m.id).join(', ')}`);
|
|
375
|
+
}*/
|
|
376
|
+
if (response.messages.length === 0) {
|
|
377
|
+
return [];
|
|
378
|
+
}
|
|
379
|
+
const decryptedMessages = [];
|
|
380
|
+
const acknowledgedIds = [];
|
|
381
|
+
for (const serverMsg of response.messages) {
|
|
743
382
|
try {
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
signatureBytes
|
|
754
|
-
);
|
|
755
|
-
if (isValid) {
|
|
756
|
-
for (const msgId of message_ids) {
|
|
757
|
-
const existingMsg = this.messageStorage.getMessage(msgId);
|
|
758
|
-
if (existingMsg) {
|
|
759
|
-
existingMsg.arkConfirmed = {
|
|
760
|
-
recipient,
|
|
761
|
-
recipientPublicKey: recipient_public_key,
|
|
762
|
-
signature,
|
|
763
|
-
timestamp
|
|
764
|
-
};
|
|
765
|
-
this.messageStorage.saveMessage(
|
|
766
|
-
existingMsg
|
|
767
|
-
);
|
|
768
|
-
}
|
|
383
|
+
//console.log(`[Messenger] 处理消息 ${serverMsg.id}, from=${serverMsg.from}, msgType=${serverMsg.msgType}`);
|
|
384
|
+
// 检查消息是否已经在本地存储
|
|
385
|
+
// 注意:由于每个用户有自己的数据库文件,消息 ID 不会冲突
|
|
386
|
+
const existingMessage = this.messageStorage.getMessage(serverMsg.id);
|
|
387
|
+
if (existingMessage) {
|
|
388
|
+
// 消息已存在,直接确认
|
|
389
|
+
//console.log(`[Messenger] 消息 ${serverMsg.id} 已存在于本地存储,跳过`);
|
|
390
|
+
acknowledgedIds.push(serverMsg.id);
|
|
391
|
+
continue;
|
|
769
392
|
}
|
|
770
|
-
|
|
771
|
-
console.
|
|
772
|
-
|
|
773
|
-
);
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
if (!merkle_data.newRoot) {
|
|
808
|
-
console.error(
|
|
809
|
-
`Guard message ${message_id} missing newRoot in merkle_data`
|
|
810
|
-
);
|
|
811
|
-
break;
|
|
812
|
-
}
|
|
813
|
-
if (!merkle_data.serverTimestamp) {
|
|
814
|
-
console.error(
|
|
815
|
-
`Guard message ${message_id} missing serverTimestamp in merkle_data`
|
|
816
|
-
);
|
|
817
|
-
break;
|
|
818
|
-
}
|
|
819
|
-
if (!merkle_data.serverSignature) {
|
|
820
|
-
console.error(
|
|
821
|
-
`Guard message ${message_id} missing serverSignature in merkle_data`
|
|
822
|
-
);
|
|
823
|
-
break;
|
|
824
|
-
}
|
|
825
|
-
if (!merkle_data.serverPublicKey) {
|
|
826
|
-
console.error(
|
|
827
|
-
`Guard message ${message_id} missing serverPublicKey in merkle_data`
|
|
828
|
-
);
|
|
829
|
-
break;
|
|
830
|
-
}
|
|
831
|
-
const { verifySingleMerkleRoot } = await import("./crypto.js");
|
|
832
|
-
const rootValid = verifySingleMerkleRoot(
|
|
833
|
-
merkle_data.prevRoot,
|
|
834
|
-
merkle_data.newRoot,
|
|
835
|
-
existingMsg.plaintextHash,
|
|
836
|
-
merkle_data.serverTimestamp,
|
|
837
|
-
merkle_data.leafIndex
|
|
838
|
-
);
|
|
839
|
-
if (!rootValid.valid) {
|
|
840
|
-
console.error(
|
|
841
|
-
`Guard message ${message_id} Merkle root verification failed: ${rootValid.error}`
|
|
842
|
-
);
|
|
843
|
-
break;
|
|
844
|
-
}
|
|
845
|
-
const { verifyEd25519Signature } = await import("./crypto.js");
|
|
846
|
-
const signData = `${merkle_data.prevRoot}:${merkle_data.newRoot}:${merkle_data.serverTimestamp}:${merkle_data.serverPublicKey}`;
|
|
847
|
-
const signatureValid = verifyEd25519Signature(
|
|
848
|
-
merkle_data.serverPublicKey,
|
|
849
|
-
signData,
|
|
850
|
-
merkle_data.serverSignature
|
|
851
|
-
);
|
|
852
|
-
if (!signatureValid) {
|
|
853
|
-
console.error(
|
|
854
|
-
`Guard message ${message_id} server signature verification failed`
|
|
855
|
-
);
|
|
856
|
-
break;
|
|
857
|
-
}
|
|
858
|
-
this.messageStorage.updateMessageStatus(
|
|
859
|
-
message_id,
|
|
860
|
-
import_types.MessageStatus.CONFIRMED,
|
|
861
|
-
{
|
|
862
|
-
leafIndex: merkle_data.leafIndex,
|
|
863
|
-
newRoot: merkle_data.newRoot,
|
|
864
|
-
serverSignature: merkle_data.serverSignature,
|
|
865
|
-
serverTimestamp: merkle_data.serverTimestamp,
|
|
866
|
-
serverPublicKey: merkle_data.serverPublicKey
|
|
867
|
-
}
|
|
868
|
-
);
|
|
869
|
-
const updated = true;
|
|
870
|
-
if (updated) {
|
|
871
|
-
if (existingMsg.toAddress === null) {
|
|
872
|
-
throw new Error(
|
|
873
|
-
`Guard message ${message_id} has null toAddress`
|
|
874
|
-
);
|
|
875
|
-
}
|
|
876
|
-
const toAddr = existingMsg.toAddress;
|
|
877
|
-
if (toAddr === null) {
|
|
878
|
-
throw new Error(
|
|
879
|
-
`Guard message ${message_id} has null toAddress`
|
|
880
|
-
);
|
|
881
|
-
}
|
|
882
|
-
this.sessionStateStorage.updateSessionState(
|
|
883
|
-
this.userAddress,
|
|
884
|
-
toAddr,
|
|
885
|
-
{
|
|
886
|
-
currentRoot: merkle_data.newRoot,
|
|
887
|
-
prevRoot: merkle_data.prevRoot,
|
|
888
|
-
lastLeafIndex: merkle_data.leafIndex,
|
|
889
|
-
lastSyncAt: Date.now()
|
|
393
|
+
// 2. 解密消息
|
|
394
|
+
//console.log(`[Messenger] 解密消息 ${serverMsg.id}...`);
|
|
395
|
+
const ciphertext = Uint8Array.from(Buffer.from(serverMsg.bodyB64, "base64"));
|
|
396
|
+
//console.log(`[Messenger] 密文长度: ${ciphertext.length} bytes`);
|
|
397
|
+
const decryptedData = await this.session.decryptMessage(this.userAddress, serverMsg.from, ciphertext.buffer, serverMsg.msgType);
|
|
398
|
+
//console.log(`[Messenger] 消息 ${serverMsg.id} 解密成功`);
|
|
399
|
+
// 【更新】明文直接就是消息内容(不再是 JSON 格式)
|
|
400
|
+
const plaintext = decryptedData;
|
|
401
|
+
// 【新增】从服务器返回的字段获取 lastReceivedLeafIndex
|
|
402
|
+
const senderLastReceivedIndex = serverMsg.lastReceivedLeafIndex ?? -1;
|
|
403
|
+
// 【新增】处理消息确认信息
|
|
404
|
+
if (senderLastReceivedIndex >= 0) {
|
|
405
|
+
const myLastSent = this.getLastSentLeafIndex(serverMsg.from);
|
|
406
|
+
if (senderLastReceivedIndex < myLastSent) {
|
|
407
|
+
/*console.warn(
|
|
408
|
+
`[Messenger] ${serverMsg.from} 可能丢失了消息,` +
|
|
409
|
+
`对方确认: ${senderLastReceivedIndex}, ` +
|
|
410
|
+
`我已发送: ${myLastSent}`,
|
|
411
|
+
);*/
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
// 3. 使用通用验证函数验证消息
|
|
415
|
+
// 检查必需字段
|
|
416
|
+
if (!serverMsg.clientTimestamp) {
|
|
417
|
+
throw new Error(`Missing clientTimestamp for message ${serverMsg.id}`);
|
|
418
|
+
}
|
|
419
|
+
if (!serverMsg.plaintextHash) {
|
|
420
|
+
throw new Error(`Missing plaintextHash for message ${serverMsg.id}`);
|
|
421
|
+
}
|
|
422
|
+
// 验证 Merkle 元数据完整性
|
|
423
|
+
if (serverMsg.merkleMetadata) {
|
|
424
|
+
if (!serverMsg.merkleMetadata.prevRoot) {
|
|
425
|
+
throw new Error(`Message ${serverMsg.id} missing prevRoot in merkleMetadata`);
|
|
426
|
+
}
|
|
427
|
+
if (!serverMsg.merkleMetadata.newRoot) {
|
|
428
|
+
throw new Error(`Message ${serverMsg.id} missing newRoot in merkleMetadata`);
|
|
429
|
+
}
|
|
890
430
|
}
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
431
|
+
const verificationResult = (0, crypto_js_1.verifyMessage)({
|
|
432
|
+
messageId: serverMsg.id,
|
|
433
|
+
plaintext,
|
|
434
|
+
plaintextHash: serverMsg.plaintextHash,
|
|
435
|
+
createdAt: serverMsg.clientTimestamp,
|
|
436
|
+
guardAddress: serverMsg.guardAddress,
|
|
437
|
+
passportAddress: serverMsg.passportAddress,
|
|
438
|
+
lastReceivedLeafIndex: serverMsg.lastReceivedLeafIndex, // 【新增】传入消息确认字段
|
|
439
|
+
serverSignature: serverMsg.merkleMetadata?.serverSignature,
|
|
440
|
+
serverPublicKey: serverMsg.merkleMetadata?.serverPublicKey,
|
|
441
|
+
merkleMetadata: serverMsg.merkleMetadata
|
|
442
|
+
? {
|
|
443
|
+
prevRoot: serverMsg.merkleMetadata.prevRoot,
|
|
444
|
+
newRoot: serverMsg.merkleMetadata.newRoot,
|
|
445
|
+
serverTimestamp: serverMsg.merkleMetadata.serverTimestamp,
|
|
446
|
+
leafIndex: serverMsg.merkleMetadata.leafIndex,
|
|
447
|
+
proofSiblings: serverMsg.merkleMetadata.proofSiblings,
|
|
448
|
+
proofIndices: serverMsg.merkleMetadata.proofIndices,
|
|
449
|
+
}
|
|
450
|
+
: undefined,
|
|
451
|
+
});
|
|
452
|
+
if (!verificationResult.valid) {
|
|
453
|
+
throw new Error(verificationResult.error);
|
|
454
|
+
}
|
|
455
|
+
// 5. 保存到本地存储
|
|
456
|
+
// 经过 verifyMessage 验证,这些字段一定存在
|
|
457
|
+
const message = {
|
|
458
|
+
messageId: serverMsg.id,
|
|
459
|
+
fromAddress: serverMsg.from,
|
|
460
|
+
toAddress: this.userAddress,
|
|
461
|
+
plaintextHash: serverMsg.plaintextHash,
|
|
462
|
+
plaintext,
|
|
463
|
+
guardAddress: serverMsg.guardAddress,
|
|
464
|
+
passportAddress: serverMsg.passportAddress,
|
|
465
|
+
lastReceivedLeafIndex: serverMsg.lastReceivedLeafIndex, // 【新增】保存消息确认字段
|
|
466
|
+
direction: types_js_1.MessageDirection.RECEIVED,
|
|
467
|
+
status: types_js_1.MessageStatus.CONFIRMED,
|
|
468
|
+
msgType: serverMsg.msgType,
|
|
469
|
+
leafIndex: serverMsg.merkleMetadata?.leafIndex,
|
|
470
|
+
prevRoot: serverMsg.merkleMetadata?.prevRoot,
|
|
471
|
+
newRoot: serverMsg.merkleMetadata?.newRoot,
|
|
472
|
+
serverSignature: serverMsg.merkleMetadata?.serverSignature,
|
|
473
|
+
serverTimestamp: serverMsg.merkleMetadata?.serverTimestamp,
|
|
474
|
+
serverPublicKey: serverMsg.merkleMetadata?.serverPublicKey,
|
|
475
|
+
createdAt: serverMsg.clientTimestamp,
|
|
476
|
+
// 保存 ZIP 元数据(如果是 ZIP 消息)
|
|
477
|
+
zipMetadata: serverMsg.zipMetadata,
|
|
478
|
+
};
|
|
479
|
+
this.messageStorage.saveMessage(message);
|
|
480
|
+
// 更新会话状态
|
|
481
|
+
if (serverMsg.merkleMetadata) {
|
|
482
|
+
this.sessionStateStorage.updateSessionState(this.userAddress, serverMsg.from, {
|
|
483
|
+
currentRoot: serverMsg.merkleMetadata.newRoot,
|
|
484
|
+
prevRoot: serverMsg.merkleMetadata.prevRoot,
|
|
485
|
+
lastLeafIndex: serverMsg.merkleMetadata.leafIndex,
|
|
486
|
+
lastSyncAt: Date.now(),
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
const timestamp = serverMsg.merkleMetadata?.serverTimestamp ||
|
|
490
|
+
serverMsg.clientTimestamp ||
|
|
491
|
+
Date.now();
|
|
492
|
+
decryptedMessages.push({
|
|
493
|
+
id: serverMsg.id,
|
|
494
|
+
from: serverMsg.from,
|
|
495
|
+
plaintext, // 【更新】明文直接是消息内容
|
|
496
|
+
timestamp,
|
|
497
|
+
merkleVerified: !!serverMsg.merkleMetadata,
|
|
498
|
+
merkleData: serverMsg.merkleMetadata
|
|
499
|
+
? {
|
|
500
|
+
leafIndex: serverMsg.merkleMetadata.leafIndex,
|
|
501
|
+
rootHash: serverMsg.merkleMetadata.newRoot,
|
|
502
|
+
}
|
|
503
|
+
: undefined,
|
|
504
|
+
});
|
|
505
|
+
acknowledgedIds.push(serverMsg.id);
|
|
896
506
|
}
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
case "guard_rejected": {
|
|
900
|
-
const {
|
|
901
|
-
message_id,
|
|
902
|
-
reason: _reason,
|
|
903
|
-
timestamp: _timestamp
|
|
904
|
-
} = sseEvent.data;
|
|
905
|
-
const existingMsg = this.messageStorage.getMessage(message_id);
|
|
906
|
-
if (existingMsg) {
|
|
907
|
-
existingMsg.status = import_types.MessageStatus.REJECTED;
|
|
908
|
-
this.messageStorage.saveMessage(existingMsg);
|
|
909
|
-
} else {
|
|
507
|
+
catch (error) {
|
|
508
|
+
throw new Error(`Failed to decrypt message ${serverMsg.id}: ${error instanceof Error ? error.message : String(error)}`);
|
|
910
509
|
}
|
|
911
|
-
break;
|
|
912
|
-
}
|
|
913
510
|
}
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
this.eventSource = null;
|
|
938
|
-
}
|
|
939
|
-
}
|
|
940
|
-
/**
|
|
941
|
-
* 销毁 Messenger 实例
|
|
942
|
-
* 清理所有资源(定时器、SSE 连接等)
|
|
943
|
-
*/
|
|
944
|
-
destroy() {
|
|
945
|
-
this.stopPrekeyCheckTimer();
|
|
946
|
-
this.disconnectEventSource();
|
|
947
|
-
}
|
|
948
|
-
/**
|
|
949
|
-
* 断开连接(destroy 的别名)
|
|
950
|
-
* 用于清理资源
|
|
951
|
-
*/
|
|
952
|
-
disconnect() {
|
|
953
|
-
this.destroy();
|
|
954
|
-
}
|
|
955
|
-
/**
|
|
956
|
-
* 发送 ZIP 压缩文件
|
|
957
|
-
*
|
|
958
|
-
* 支持发送本地或网络 WTS/WIP 文件,经过 ZIP 压缩后发送给对方
|
|
959
|
-
* 支持 Guard 验证,如果提供 guardAddress 和 passportAddress,消息将进入 Guard 验证流程
|
|
960
|
-
*
|
|
961
|
-
* @param recipientAddress 接收方地址
|
|
962
|
-
* @param source 文件源(本地路径或网络 URL)
|
|
963
|
-
* @param options 可选参数
|
|
964
|
-
* @returns 发送结果
|
|
965
|
-
*/
|
|
966
|
-
async sendZipFile(recipientAddress, source, options) {
|
|
967
|
-
if (!this.userAddress) {
|
|
968
|
-
throw new import_types.MessengerError(
|
|
969
|
-
import_types.MessengerErrorCode.IDENTITY_NOT_FOUND,
|
|
970
|
-
"User address not set"
|
|
971
|
-
);
|
|
972
|
-
}
|
|
973
|
-
const fileData = await this.loadFileData(source);
|
|
974
|
-
const JSZip = (await import("jszip")).default;
|
|
975
|
-
const zip = new JSZip();
|
|
976
|
-
const fileName = options?.fileName || path.basename(source) || "file.zip";
|
|
977
|
-
const contentType = options?.contentType || this.detectContentType(fileName);
|
|
978
|
-
zip.file(fileName, fileData);
|
|
979
|
-
const zipBlob = await zip.generateAsync({ type: "uint8array" });
|
|
980
|
-
if (zipBlob.length > import_types.WTS_FILE_BYTES_LIMIT) {
|
|
981
|
-
throw new import_types.MessengerError(
|
|
982
|
-
import_types.MessengerErrorCode.INVALID_INPUT,
|
|
983
|
-
`ZIP file size (${zipBlob.length} bytes) exceeds local maximum allowed size (${import_types.WTS_FILE_BYTES_LIMIT} bytes)`
|
|
984
|
-
);
|
|
511
|
+
// 5. 确认已处理的消息(带签名)
|
|
512
|
+
if (acknowledgedIds.length > 0 && this.userAddress) {
|
|
513
|
+
const ackTimestamp = Date.now(); //@ 使用ms时间戳
|
|
514
|
+
const ackNonce = this.generateNonce();
|
|
515
|
+
// 签名消息格式: ack_messages:{user}:{message_ids}:{public_key}:{timestamp}:{nonce}
|
|
516
|
+
const account = await account_js_1.Account.Instance().get(this.userAddress, false);
|
|
517
|
+
if (account?.pubkey) {
|
|
518
|
+
const ackMessage = `ack_messages:${this.userAddress}:${acknowledgedIds.join(",")}:${account.pubkey}:${ackTimestamp}:${ackNonce}`;
|
|
519
|
+
const signResult = await account_js_1.Account.Instance().signData(this.userAddress, ackMessage);
|
|
520
|
+
const signatureBuffer = Buffer.from(signResult.signature.slice(2), "hex");
|
|
521
|
+
const signatureBase64 = (0, crypto_js_1.bytesToBase64)(new Uint8Array(signatureBuffer));
|
|
522
|
+
await this.serverClient.acknowledgeMessages(acknowledgedIds, signResult.publicKey, {
|
|
523
|
+
publicKey: signResult.publicKey,
|
|
524
|
+
signatureScheme: "ED25519",
|
|
525
|
+
signature: signatureBase64,
|
|
526
|
+
timestamp: ackTimestamp,
|
|
527
|
+
nonce: ackNonce,
|
|
528
|
+
});
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
// 6. 补充预密钥
|
|
532
|
+
await this.session.ensurePreKeys(this.userAddress);
|
|
533
|
+
return decryptedMessages;
|
|
985
534
|
}
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
this.userAddress,
|
|
1001
|
-
recipientAddress,
|
|
1002
|
-
zipBase64
|
|
1003
|
-
// 直接加密 ZIP 的 base64 内容
|
|
1004
|
-
);
|
|
1005
|
-
const ciphertext = Buffer.from(new Uint8Array(encrypted.body)).toString(
|
|
1006
|
-
"base64"
|
|
1007
|
-
);
|
|
1008
|
-
const guardAddr = options?.guardAddress || "";
|
|
1009
|
-
const passportAddr = options?.passportAddress || "";
|
|
1010
|
-
const plaintextHash = (0, import_crypto2.hashPlaintext)(
|
|
1011
|
-
zipBase64,
|
|
1012
|
-
createdAt,
|
|
1013
|
-
guardAddr,
|
|
1014
|
-
passportAddr,
|
|
1015
|
-
lastReceivedLeafIndex
|
|
1016
|
-
);
|
|
1017
|
-
const timestamp = Date.now();
|
|
1018
|
-
const nonce = this.generateNonce();
|
|
1019
|
-
const account = await import_account.Account.Instance().get(this.userAddress, false);
|
|
1020
|
-
if (!account) {
|
|
1021
|
-
throw new import_types.MessengerError(
|
|
1022
|
-
import_types.MessengerErrorCode.IDENTITY_NOT_FOUND,
|
|
1023
|
-
"User account not found"
|
|
1024
|
-
);
|
|
535
|
+
/**
|
|
536
|
+
* 获取最后发送的消息序号
|
|
537
|
+
* @param peerAddress 对方地址
|
|
538
|
+
* @returns 最后发送的消息 leafIndex,如果没有发送过返回 -1
|
|
539
|
+
*/
|
|
540
|
+
getLastSentLeafIndex(peerAddress) {
|
|
541
|
+
if (!this.userAddress)
|
|
542
|
+
return -1;
|
|
543
|
+
const messages = this.messageStorage.getMessagesBySession(this.userAddress, peerAddress);
|
|
544
|
+
const sentMessages = messages.filter((m) => m.direction === types_js_1.MessageDirection.SENT &&
|
|
545
|
+
m.leafIndex !== undefined);
|
|
546
|
+
if (sentMessages.length === 0)
|
|
547
|
+
return -1;
|
|
548
|
+
return Math.max(...sentMessages.map((m) => m.leafIndex));
|
|
1025
549
|
}
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
signMessage
|
|
1033
|
-
);
|
|
1034
|
-
const signatureBuffer = Buffer.from(
|
|
1035
|
-
signResult.signature.slice(2),
|
|
1036
|
-
"hex"
|
|
1037
|
-
);
|
|
1038
|
-
const signatureBase64 = (0, import_crypto2.bytesToBase64)(new Uint8Array(signatureBuffer));
|
|
1039
|
-
const response = await this.serverClient.sendMessage({
|
|
1040
|
-
sender: signResult.publicKey,
|
|
1041
|
-
recipient: recipientAddress,
|
|
1042
|
-
ciphertext,
|
|
1043
|
-
plaintextHash,
|
|
1044
|
-
clientTimestamp: createdAt,
|
|
1045
|
-
msgType: encrypted.type,
|
|
1046
|
-
// 使用底层 Signal Protocol 消息类型(1 或 3)
|
|
1047
|
-
zipMetadata,
|
|
1048
|
-
guardAddress: options?.guardAddress,
|
|
1049
|
-
passportAddress: options?.passportAddress,
|
|
1050
|
-
force: options?.force,
|
|
1051
|
-
// 【修复】只有当 lastReceivedLeafIndex >= 0 时才发送,否则发送 undefined
|
|
1052
|
-
lastReceivedLeafIndex: lastReceivedLeafIndex >= 0 ? lastReceivedLeafIndex : void 0,
|
|
1053
|
-
signatureScheme: "ED25519",
|
|
1054
|
-
signature: signatureBase64,
|
|
1055
|
-
timestamp,
|
|
1056
|
-
nonce
|
|
1057
|
-
});
|
|
1058
|
-
const message = {
|
|
1059
|
-
messageId: response.messageId,
|
|
1060
|
-
fromAddress: this.userAddress,
|
|
1061
|
-
toAddress: recipientAddress,
|
|
1062
|
-
plaintextHash,
|
|
1063
|
-
plaintext: zipBase64,
|
|
1064
|
-
// 保存 ZIP 数据的 base64 编码,方便本地查看
|
|
1065
|
-
guardAddress: options?.guardAddress,
|
|
1066
|
-
passportAddress: options?.passportAddress,
|
|
1067
|
-
lastReceivedLeafIndex,
|
|
1068
|
-
// 【新增】保存消息确认字段
|
|
1069
|
-
direction: import_types.MessageDirection.SENT,
|
|
1070
|
-
status: response.status === "confirmed" ? import_types.MessageStatus.CONFIRMED : import_types.MessageStatus.PENDING,
|
|
1071
|
-
msgType: encrypted.type,
|
|
1072
|
-
// 使用底层 Signal Protocol 消息类型(1 或 3)
|
|
1073
|
-
zipMetadata,
|
|
1074
|
-
createdAt
|
|
1075
|
-
};
|
|
1076
|
-
if (response.merkleData) {
|
|
1077
|
-
message.leafIndex = response.merkleData.leafIndex;
|
|
1078
|
-
message.prevRoot = response.merkleData.prevRoot;
|
|
1079
|
-
message.newRoot = response.merkleData.newRoot;
|
|
1080
|
-
message.serverSignature = response.merkleData.serverSignature;
|
|
1081
|
-
message.serverTimestamp = response.merkleData.serverTimestamp;
|
|
1082
|
-
message.serverPublicKey = response.merkleData.serverPublicKey;
|
|
1083
|
-
this.sessionStateStorage.updateSessionState(
|
|
1084
|
-
this.userAddress,
|
|
1085
|
-
recipientAddress,
|
|
1086
|
-
{
|
|
1087
|
-
currentRoot: response.merkleData.newRoot,
|
|
1088
|
-
prevRoot: response.merkleData.prevRoot,
|
|
1089
|
-
lastLeafIndex: response.merkleData.leafIndex,
|
|
1090
|
-
lastSyncAt: Date.now()
|
|
550
|
+
/**
|
|
551
|
+
* 获取会话历史消息
|
|
552
|
+
*/
|
|
553
|
+
getSessionMessages(peerAddress) {
|
|
554
|
+
if (!this.userAddress) {
|
|
555
|
+
return [];
|
|
1091
556
|
}
|
|
1092
|
-
|
|
557
|
+
return this.messageStorage.getMessagesBySession(this.userAddress, peerAddress);
|
|
1093
558
|
}
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
if (existingMsg && existingMsg.status === import_types.MessageStatus.PENDING) {
|
|
1101
|
-
this.messageStorage.updateMessageStatus(
|
|
1102
|
-
msgId,
|
|
1103
|
-
import_types.MessageStatus.CONFIRMED,
|
|
1104
|
-
{
|
|
1105
|
-
leafIndex: merkleData.leafIndex,
|
|
1106
|
-
newRoot: merkleData.newRoot,
|
|
1107
|
-
serverSignature: merkleData.serverSignature,
|
|
1108
|
-
serverTimestamp: merkleData.serverTimestamp,
|
|
1109
|
-
serverPublicKey: merkleData.serverPublicKey
|
|
1110
|
-
}
|
|
1111
|
-
);
|
|
559
|
+
/**
|
|
560
|
+
* 获取会话当前状态
|
|
561
|
+
*/
|
|
562
|
+
getSessionState(peerAddress) {
|
|
563
|
+
if (!this.userAddress) {
|
|
564
|
+
return undefined;
|
|
1112
565
|
}
|
|
1113
|
-
|
|
566
|
+
return this.sessionStateStorage.getSessionState(this.userAddress, peerAddress);
|
|
1114
567
|
}
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
568
|
+
/**
|
|
569
|
+
* 提交链上证明
|
|
570
|
+
*
|
|
571
|
+
* 使用 proof.ts 将 Merkle Root 提交到链上,获得时间证明
|
|
572
|
+
*
|
|
573
|
+
* @param env CallEnv 环境
|
|
574
|
+
* @param peerAddress 对方地址
|
|
575
|
+
* @param description 证明描述
|
|
576
|
+
*/
|
|
577
|
+
async submitChainProof(env, peerAddress, description) {
|
|
578
|
+
if (!this.userAddress) {
|
|
579
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
|
|
580
|
+
}
|
|
581
|
+
// 获取当前会话状态
|
|
582
|
+
const sessionState = this.sessionStateStorage.getSessionState(this.userAddress, peerAddress);
|
|
583
|
+
if (!sessionState || !sessionState.currentRoot) {
|
|
584
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.SESSION_NOT_ESTABLISHED, "No session state found");
|
|
585
|
+
}
|
|
586
|
+
// 从会话消息中获取服务器公钥和签名
|
|
587
|
+
const messages = this.messageStorage.getMessagesBySession(this.userAddress, peerAddress);
|
|
588
|
+
const lastMessage = messages[messages.length - 1];
|
|
589
|
+
if (!lastMessage ||
|
|
590
|
+
!lastMessage.serverPublicKey ||
|
|
591
|
+
!lastMessage.serverSignature) {
|
|
592
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.INVALID_PROOF, "No temporal proof (missing server public key or signature), cannot submit Proof to WoWok blockchain");
|
|
593
|
+
}
|
|
594
|
+
const serverPubKey = lastMessage.serverPublicKey;
|
|
595
|
+
const serverSignature = lastMessage.serverSignature;
|
|
596
|
+
// 构造证明数据
|
|
597
|
+
const proofData = {
|
|
598
|
+
sessionId: sessionState.sessionId,
|
|
599
|
+
merkleRoot: sessionState.currentRoot,
|
|
600
|
+
messageCount: sessionState.messageCount,
|
|
601
|
+
timestamp: Date.now(),
|
|
602
|
+
};
|
|
603
|
+
// 使用 CallProof 提交到链上
|
|
604
|
+
const callProof = new proof_js_1.CallProof({
|
|
605
|
+
proof: JSON.stringify(proofData),
|
|
606
|
+
server_pubkey: serverPubKey,
|
|
607
|
+
server_signature: serverSignature,
|
|
608
|
+
proof_type: types_js_1.CHAIN_PROOF_TYPE, // 1 = Messenger Session Proof
|
|
609
|
+
description: description ||
|
|
610
|
+
`Messenger session proof for ${this.userAddress} <-> ${peerAddress}`,
|
|
611
|
+
item_count: sessionState.messageCount,
|
|
612
|
+
about_address: sessionState.sessionId,
|
|
613
|
+
});
|
|
614
|
+
const result = await callProof.call(env);
|
|
615
|
+
// 从结果中提取 proof 对象地址
|
|
616
|
+
// 这里需要根据实际的 CallProof 返回格式调整
|
|
617
|
+
const responseData = result?.objectChanges;
|
|
618
|
+
const proofAddress = responseData?.find((change) => change.objectType?.includes("Proof"))?.objectId;
|
|
619
|
+
return {
|
|
620
|
+
proofAddress: proofAddress || "",
|
|
621
|
+
txHash: result?.digest || "",
|
|
622
|
+
};
|
|
1159
623
|
}
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
624
|
+
/**
|
|
625
|
+
* 建立 SSE 连接并监听服务器事件
|
|
626
|
+
*
|
|
627
|
+
* 安全要求:必须提供签名验证,防止未授权监听他人事件
|
|
628
|
+
* @param onMessage 新消息回调
|
|
629
|
+
* @param signatureParams 签名参数(可选,不提供时自动生成)
|
|
630
|
+
*/
|
|
631
|
+
async connectEventSource(onMessage, signatureParams) {
|
|
632
|
+
if (!this.userAddress) {
|
|
633
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
|
|
634
|
+
}
|
|
635
|
+
// 关闭已有连接
|
|
636
|
+
this.disconnectEventSource();
|
|
637
|
+
if (onMessage) {
|
|
638
|
+
this.onMessageCallback = onMessage;
|
|
639
|
+
}
|
|
640
|
+
// 如果没有提供签名参数,自动生成
|
|
641
|
+
// 签名格式: event_stream:{address}:{timestamp}:{nonce}
|
|
642
|
+
const account = await account_js_1.Account.Instance().get(this.userAddress, false);
|
|
643
|
+
const publicKey = account?.pubkey || "";
|
|
644
|
+
let params = signatureParams;
|
|
645
|
+
if (!params) {
|
|
646
|
+
const timestamp = Date.now(); //@ 使用ms时间戳
|
|
647
|
+
const nonce = this.generateNonce();
|
|
648
|
+
const message = `event_stream:${this.userAddress}:${timestamp}:${nonce}`;
|
|
649
|
+
const signResult = await account_js_1.Account.Instance().signData(this.userAddress, message);
|
|
650
|
+
const signatureBuffer = Buffer.from(signResult.signature.slice(2), "hex");
|
|
651
|
+
const signatureBase64 = (0, crypto_js_1.bytesToBase64)(new Uint8Array(signatureBuffer));
|
|
652
|
+
params = {
|
|
653
|
+
signatureScheme: "ED25519",
|
|
654
|
+
signature: signatureBase64,
|
|
655
|
+
timestamp,
|
|
656
|
+
nonce,
|
|
657
|
+
};
|
|
658
|
+
}
|
|
659
|
+
// 构建带签名的 URL
|
|
660
|
+
const queryParams = new URLSearchParams({
|
|
661
|
+
publicKey: publicKey,
|
|
662
|
+
signatureScheme: params.signatureScheme,
|
|
663
|
+
signature: params.signature,
|
|
664
|
+
timestamp: params.timestamp.toString(),
|
|
665
|
+
nonce: params.nonce,
|
|
666
|
+
});
|
|
667
|
+
const url = `${this.config.serverUrl}/v1/events/${this.userAddress}?${queryParams}`;
|
|
668
|
+
//console.log(`Connecting to SSE: ${url}`);
|
|
669
|
+
// 检查是否有 EventSource 可用
|
|
670
|
+
if (typeof EventSource === "undefined") {
|
|
671
|
+
console.warn("EventSource is not available in this environment. SSE functionality disabled, falling back to polling.");
|
|
672
|
+
return;
|
|
673
|
+
}
|
|
674
|
+
try {
|
|
675
|
+
this.eventSource = new EventSource(url);
|
|
676
|
+
}
|
|
677
|
+
catch (error) {
|
|
678
|
+
console.warn("Failed to create EventSource connection, falling back to polling.", error);
|
|
679
|
+
return;
|
|
680
|
+
}
|
|
681
|
+
// 监听消息事件
|
|
682
|
+
this.eventSource.onmessage = async (event) => {
|
|
683
|
+
try {
|
|
684
|
+
const sseEvent = JSON.parse(event.data);
|
|
685
|
+
//console.log("SSE event received:", sseEvent.type);
|
|
686
|
+
switch (sseEvent.type) {
|
|
687
|
+
case "NewMessage":
|
|
688
|
+
// 收到新消息通知,拉取并解密消息
|
|
689
|
+
if (this.onMessageCallback) {
|
|
690
|
+
const messages = await this.pullMessages();
|
|
691
|
+
if (messages.length > 0) {
|
|
692
|
+
this.onMessageCallback(messages);
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
break;
|
|
696
|
+
case "ark_confirmed": {
|
|
697
|
+
// 发送方收到 ARK 确认,验证接收方签名后更新本地状态
|
|
698
|
+
const { message_ids, recipient, recipient_public_key, signature, timestamp, } = sseEvent.data;
|
|
699
|
+
/*console.log(
|
|
700
|
+
`SSE ark_confirmed: messages ${message_ids} confirmed by ${recipient}`,
|
|
701
|
+
);*/
|
|
702
|
+
// 验证接收方签名(防止服务器作恶)
|
|
703
|
+
// 签名消息格式: ack_messages:{recipient}:{message_ids}:{public_key}:{timestamp}:{nonce}
|
|
704
|
+
// 注意: SSE事件中不包含nonce,因为nonce是在ARK请求时由接收方生成的,服务器只是转发
|
|
705
|
+
const verifyMessage = `ack_messages:${recipient}:${message_ids.join(",")}:${recipient_public_key}:${timestamp}`;
|
|
706
|
+
try {
|
|
707
|
+
// 使用事件中携带的接收方公钥验证签名
|
|
708
|
+
const { Ed25519PublicKey } = await import("../../keypairs/ed25519/publickey.js");
|
|
709
|
+
const publicKey = new Ed25519PublicKey(recipient_public_key);
|
|
710
|
+
const signatureBytes = Uint8Array.from(Buffer.from(signature, "base64"));
|
|
711
|
+
const isValid = await publicKey.verify(new TextEncoder().encode(verifyMessage), signatureBytes);
|
|
712
|
+
if (isValid) {
|
|
713
|
+
// 签名验证成功,保存 ARK 确认(不可更改字段)
|
|
714
|
+
for (const msgId of message_ids) {
|
|
715
|
+
// 获取现有消息并更新 ARK 确认
|
|
716
|
+
const existingMsg = this.messageStorage.getMessage(msgId);
|
|
717
|
+
if (existingMsg) {
|
|
718
|
+
existingMsg.arkConfirmed = {
|
|
719
|
+
recipient,
|
|
720
|
+
recipientPublicKey: recipient_public_key,
|
|
721
|
+
signature,
|
|
722
|
+
timestamp,
|
|
723
|
+
};
|
|
724
|
+
this.messageStorage.saveMessage(existingMsg);
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
/*console.log(
|
|
728
|
+
`ARK verified, stored ${message_ids.length} ARK confirmations`,
|
|
729
|
+
);*/
|
|
730
|
+
}
|
|
731
|
+
else {
|
|
732
|
+
console.error("ARK signature verification failed - possible server tampering");
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
catch (error) {
|
|
736
|
+
console.error("Failed to verify ARK signature:", error);
|
|
737
|
+
}
|
|
738
|
+
break;
|
|
739
|
+
}
|
|
740
|
+
case "PreKeyLow":
|
|
741
|
+
// 收到预密钥低库存通知,立即补充
|
|
742
|
+
/*console.log(
|
|
743
|
+
`SSE PreKeyLow event: ${sseEvent.data.current}/${sseEvent.data.max_allowed}, auto-refilling...`,
|
|
744
|
+
);*/
|
|
745
|
+
await this.checkAndRefillPrekeys();
|
|
746
|
+
break;
|
|
747
|
+
case "Custom":
|
|
748
|
+
// 自定义事件(如 Guard 确认/拒绝),暂不处理
|
|
749
|
+
//console.log("SSE Custom event received");
|
|
750
|
+
break;
|
|
751
|
+
case "guard_confirmed": {
|
|
752
|
+
// Guard 消息验证通过,更新消息的 merkleData
|
|
753
|
+
const { message_id, merkle_data, timestamp: _timestamp, } = sseEvent.data;
|
|
754
|
+
/*console.log(
|
|
755
|
+
`SSE guard_confirmed: message ${message_id} confirmed`,
|
|
756
|
+
);*/
|
|
757
|
+
// 更新本地消息状态
|
|
758
|
+
// 获取原始消息数据用于验证
|
|
759
|
+
const existingMsg = this.messageStorage.getMessage(message_id);
|
|
760
|
+
if (!existingMsg) {
|
|
761
|
+
console.warn(`Guard confirmed event received but message ${message_id} not found in local storage`);
|
|
762
|
+
break;
|
|
763
|
+
}
|
|
764
|
+
// 验证 Merkle 数据完整性
|
|
765
|
+
if (!merkle_data.prevRoot) {
|
|
766
|
+
console.error(`Guard message ${message_id} missing prevRoot in merkle_data`);
|
|
767
|
+
break;
|
|
768
|
+
}
|
|
769
|
+
if (!merkle_data.newRoot) {
|
|
770
|
+
console.error(`Guard message ${message_id} missing newRoot in merkle_data`);
|
|
771
|
+
break;
|
|
772
|
+
}
|
|
773
|
+
if (!merkle_data.serverTimestamp) {
|
|
774
|
+
console.error(`Guard message ${message_id} missing serverTimestamp in merkle_data`);
|
|
775
|
+
break;
|
|
776
|
+
}
|
|
777
|
+
if (!merkle_data.serverSignature) {
|
|
778
|
+
console.error(`Guard message ${message_id} missing serverSignature in merkle_data`);
|
|
779
|
+
break;
|
|
780
|
+
}
|
|
781
|
+
if (!merkle_data.serverPublicKey) {
|
|
782
|
+
console.error(`Guard message ${message_id} missing serverPublicKey in merkle_data`);
|
|
783
|
+
break;
|
|
784
|
+
}
|
|
785
|
+
// 验证消息的 Merkle Root 计算
|
|
786
|
+
const { verifySingleMerkleRoot } = await import("./crypto.js");
|
|
787
|
+
const rootValid = verifySingleMerkleRoot(merkle_data.prevRoot, merkle_data.newRoot, existingMsg.plaintextHash, merkle_data.serverTimestamp, merkle_data.leafIndex);
|
|
788
|
+
if (!rootValid.valid) {
|
|
789
|
+
console.error(`Guard message ${message_id} Merkle root verification failed: ${rootValid.error}`);
|
|
790
|
+
break;
|
|
791
|
+
}
|
|
792
|
+
// 验证服务器签名
|
|
793
|
+
const { verifyEd25519Signature } = await import("./crypto.js");
|
|
794
|
+
const signData = `${merkle_data.prevRoot}:${merkle_data.newRoot}:${merkle_data.serverTimestamp}:${merkle_data.serverPublicKey}`;
|
|
795
|
+
const signatureValid = verifyEd25519Signature(merkle_data.serverPublicKey, signData, merkle_data.serverSignature);
|
|
796
|
+
if (!signatureValid) {
|
|
797
|
+
console.error(`Guard message ${message_id} server signature verification failed`);
|
|
798
|
+
break;
|
|
799
|
+
}
|
|
800
|
+
/*console.log(
|
|
801
|
+
`Guard message ${message_id} verification passed, updating...`,
|
|
802
|
+
);*/
|
|
803
|
+
// 直接使用 updateMessageStatus 更新消息的 Merkle 数据
|
|
804
|
+
// 因为 message_id 已经包含 nonce,不需要再更新消息 ID
|
|
805
|
+
this.messageStorage.updateMessageStatus(message_id, types_js_1.MessageStatus.CONFIRMED, {
|
|
806
|
+
leafIndex: merkle_data.leafIndex,
|
|
807
|
+
newRoot: merkle_data.newRoot,
|
|
808
|
+
serverSignature: merkle_data.serverSignature,
|
|
809
|
+
serverTimestamp: merkle_data.serverTimestamp,
|
|
810
|
+
serverPublicKey: merkle_data.serverPublicKey,
|
|
811
|
+
});
|
|
812
|
+
const updated = true;
|
|
813
|
+
if (updated) {
|
|
814
|
+
/*console.log(
|
|
815
|
+
`Guard message ${message_id} updated with merkle data`,
|
|
816
|
+
);*/
|
|
817
|
+
// 更新会话状态
|
|
818
|
+
if (existingMsg.toAddress === null) {
|
|
819
|
+
throw new Error(`Guard message ${message_id} has null toAddress`);
|
|
820
|
+
}
|
|
821
|
+
const toAddr = existingMsg.toAddress;
|
|
822
|
+
if (toAddr === null) {
|
|
823
|
+
throw new Error(`Guard message ${message_id} has null toAddress`);
|
|
824
|
+
}
|
|
825
|
+
this.sessionStateStorage.updateSessionState(this.userAddress, toAddr, {
|
|
826
|
+
currentRoot: merkle_data.newRoot,
|
|
827
|
+
prevRoot: merkle_data.prevRoot,
|
|
828
|
+
lastLeafIndex: merkle_data.leafIndex,
|
|
829
|
+
lastSyncAt: Date.now(),
|
|
830
|
+
});
|
|
831
|
+
}
|
|
832
|
+
else {
|
|
833
|
+
console.warn(`Failed to update Guard message ${message_id}`);
|
|
834
|
+
}
|
|
835
|
+
break;
|
|
836
|
+
}
|
|
837
|
+
case "guard_rejected": {
|
|
838
|
+
// Guard 消息验证被拒绝
|
|
839
|
+
const { message_id, reason: _reason, timestamp: _timestamp, } = sseEvent.data;
|
|
840
|
+
/*console.log(
|
|
841
|
+
`SSE guard_rejected: message ${message_id} rejected: ${reason}`,
|
|
842
|
+
);*/
|
|
843
|
+
// 更新本地消息状态
|
|
844
|
+
// 首先尝试通过 message_id 查找消息
|
|
845
|
+
const existingMsg = this.messageStorage.getMessage(message_id);
|
|
846
|
+
if (existingMsg) {
|
|
847
|
+
existingMsg.status = types_js_1.MessageStatus.REJECTED;
|
|
848
|
+
this.messageStorage.saveMessage(existingMsg);
|
|
849
|
+
/*console.log(
|
|
850
|
+
`Guard message ${message_id} marked as rejected`,
|
|
851
|
+
);*/
|
|
852
|
+
}
|
|
853
|
+
else {
|
|
854
|
+
/*console.warn(
|
|
855
|
+
`Guard rejected event received but message ${message_id} not found in local storage`,
|
|
856
|
+
);*/
|
|
857
|
+
}
|
|
858
|
+
break;
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
catch (error) {
|
|
863
|
+
console.error("Failed to handle SSE event:", error);
|
|
864
|
+
}
|
|
865
|
+
};
|
|
866
|
+
// 连接打开
|
|
867
|
+
this.eventSource.onopen = () => {
|
|
868
|
+
//console.log("SSE connection opened");
|
|
869
|
+
};
|
|
870
|
+
// 连接错误
|
|
871
|
+
this.eventSource.onerror = (error) => {
|
|
872
|
+
console.error("SSE connection error:", error);
|
|
873
|
+
this.disconnectEventSource();
|
|
874
|
+
};
|
|
1170
875
|
}
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
this.userAddress,
|
|
1177
|
-
signMessage
|
|
1178
|
-
);
|
|
1179
|
-
const signatureBuffer = Buffer.from(
|
|
1180
|
-
signResult.signature.slice(2),
|
|
1181
|
-
"hex"
|
|
1182
|
-
);
|
|
1183
|
-
const signatureBase64 = (0, import_crypto2.bytesToBase64)(new Uint8Array(signatureBuffer));
|
|
1184
|
-
const account = await import_account.Account.Instance().get(this.userAddress, false);
|
|
1185
|
-
if (!account || !account.pubkey) {
|
|
1186
|
-
throw new import_types.MessengerError(
|
|
1187
|
-
import_types.MessengerErrorCode.IDENTITY_NOT_FOUND,
|
|
1188
|
-
"Account public key not found"
|
|
1189
|
-
);
|
|
876
|
+
/**
|
|
877
|
+
* 检查 SSE 是否已连接
|
|
878
|
+
*/
|
|
879
|
+
isEventSourceConnected() {
|
|
880
|
+
return this.eventSource !== null;
|
|
1190
881
|
}
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
}
|
|
1201
|
-
/**
|
|
1202
|
-
* 验证地址列表
|
|
1203
|
-
*/
|
|
1204
|
-
_validateAddresses(addresses) {
|
|
1205
|
-
const valid = [];
|
|
1206
|
-
const invalid = [];
|
|
1207
|
-
for (const addr of addresses) {
|
|
1208
|
-
if ((0, import_sui_types.isValidWowAddress)(addr)) {
|
|
1209
|
-
valid.push(addr);
|
|
1210
|
-
} else {
|
|
1211
|
-
invalid.push(addr);
|
|
1212
|
-
}
|
|
882
|
+
/**
|
|
883
|
+
* 断开 SSE 连接
|
|
884
|
+
*/
|
|
885
|
+
disconnectEventSource() {
|
|
886
|
+
if (this.eventSource) {
|
|
887
|
+
this.eventSource.close();
|
|
888
|
+
this.eventSource = null;
|
|
889
|
+
//console.log("SSE connection closed");
|
|
890
|
+
}
|
|
1213
891
|
}
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
import_types.MessengerErrorCode.IDENTITY_NOT_FOUND,
|
|
1223
|
-
"User address not set"
|
|
1224
|
-
);
|
|
892
|
+
/**
|
|
893
|
+
* 销毁 Messenger 实例
|
|
894
|
+
* 清理所有资源(定时器、SSE 连接等)
|
|
895
|
+
*/
|
|
896
|
+
destroy() {
|
|
897
|
+
this.stopPrekeyCheckTimer();
|
|
898
|
+
this.disconnectEventSource();
|
|
899
|
+
//console.log("Messenger instance destroyed");
|
|
1225
900
|
}
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
currentCount: 0,
|
|
1233
|
-
maxCount: 0,
|
|
1234
|
-
invalidAddresses: invalid,
|
|
1235
|
-
message: `Invalid addresses: ${invalid.join(", ")}`
|
|
1236
|
-
};
|
|
901
|
+
/**
|
|
902
|
+
* 断开连接(destroy 的别名)
|
|
903
|
+
* 用于清理资源
|
|
904
|
+
*/
|
|
905
|
+
disconnect() {
|
|
906
|
+
this.destroy();
|
|
1237
907
|
}
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
908
|
+
/**
|
|
909
|
+
* 发送 ZIP 压缩文件
|
|
910
|
+
*
|
|
911
|
+
* 支持发送本地或网络 WTS/WIP 文件,经过 ZIP 压缩后发送给对方
|
|
912
|
+
* 支持 Guard 验证,如果提供 guardAddress 和 passportAddress,消息将进入 Guard 验证流程
|
|
913
|
+
*
|
|
914
|
+
* @param recipientAddress 接收方地址
|
|
915
|
+
* @param source 文件源(本地路径或网络 URL)
|
|
916
|
+
* @param options 可选参数
|
|
917
|
+
* @returns 发送结果
|
|
918
|
+
*/
|
|
919
|
+
async sendZipFile(recipientAddress, source, options) {
|
|
920
|
+
if (!this.userAddress) {
|
|
921
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
|
|
922
|
+
}
|
|
923
|
+
// 1. 加载文件内容
|
|
924
|
+
const fileData = await this.loadFileData(source);
|
|
925
|
+
// 2. 创建 ZIP 压缩
|
|
926
|
+
const JSZip = (await import("jszip")).default;
|
|
927
|
+
const zip = new JSZip();
|
|
928
|
+
const fileName = options?.fileName || path.basename(source) || "file.zip";
|
|
929
|
+
const contentType = options?.contentType || this.detectContentType(fileName);
|
|
930
|
+
zip.file(fileName, fileData);
|
|
931
|
+
const zipBlob = await zip.generateAsync({ type: "uint8array" });
|
|
932
|
+
// 3. 本地文件大小限制检查(默认 5MB)
|
|
933
|
+
if (zipBlob.length > types_js_1.WTS_FILE_BYTES_LIMIT) {
|
|
934
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.INVALID_INPUT, `ZIP file size (${zipBlob.length} bytes) exceeds local maximum allowed size (${types_js_1.WTS_FILE_BYTES_LIMIT} bytes)`);
|
|
935
|
+
}
|
|
936
|
+
// 4. 计算 ZIP 文件哈希(用于 zipMetadata)
|
|
937
|
+
const zipFileHash = "0x" + (0, crypto_1.createHash)("sha256").update(zipBlob).digest("hex");
|
|
938
|
+
// 4. 将 ZIP 数据转为 base64
|
|
939
|
+
const zipBase64 = Buffer.from(zipBlob).toString("base64");
|
|
940
|
+
// 5. 构造 ZIP 元数据
|
|
941
|
+
const zipMetadata = {
|
|
942
|
+
fileName: `${fileName}.zip`,
|
|
943
|
+
fileSize: zipBlob.length,
|
|
944
|
+
fileHash: zipFileHash,
|
|
945
|
+
contentType: contentType,
|
|
946
|
+
};
|
|
947
|
+
// 【新增】获取最后收到的消息序号
|
|
948
|
+
const lastReceivedLeafIndex = this.messageStorage.getLastReceivedLeafIndex(this.userAddress, recipientAddress);
|
|
949
|
+
// 6. 加密 ZIP 数据(作为普通消息发送,明文就是 ZIP 的 base64)
|
|
950
|
+
const createdAt = Date.now();
|
|
951
|
+
const encrypted = await this.session.encryptMessage(this.userAddress, recipientAddress, zipBase64);
|
|
952
|
+
const ciphertext = Buffer.from(new Uint8Array(encrypted.body)).toString("base64");
|
|
953
|
+
// 7. 计算 plaintextHash(使用与服务器一致的格式)
|
|
954
|
+
// 【更新】包含 lastReceivedLeafIndex 在哈希计算中
|
|
955
|
+
const guardAddr = options?.guardAddress || "";
|
|
956
|
+
const passportAddr = options?.passportAddress || "";
|
|
957
|
+
const plaintextHash = (0, crypto_js_1.hashPlaintext)(zipBase64, createdAt, guardAddr, passportAddr, lastReceivedLeafIndex);
|
|
958
|
+
// 8. 发送到服务器(带 ZIP 元数据)
|
|
959
|
+
const timestamp = Date.now();
|
|
960
|
+
const nonce = this.generateNonce();
|
|
961
|
+
const account = await account_js_1.Account.Instance().get(this.userAddress, false);
|
|
962
|
+
if (!account) {
|
|
963
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "User account not found");
|
|
964
|
+
}
|
|
965
|
+
const publicKey = account.pubkey;
|
|
966
|
+
// 统一发送模式(合并 send 和 send_force)
|
|
967
|
+
// 统一签名格式: send_message:{sender}:{recipient}:{guard_address}:{passport_address}:{plaintext_hash}:{last_received_leaf_index}:{public_key}:{timestamp}:{nonce}:{force}
|
|
968
|
+
const lastReceivedStr = lastReceivedLeafIndex >= 0 ? lastReceivedLeafIndex.toString() : "";
|
|
969
|
+
const forceStr = options?.force ? "true" : "false";
|
|
970
|
+
const signMessage = `send_message:${this.userAddress}:${recipientAddress}:${guardAddr}:${passportAddr}:${plaintextHash}:${lastReceivedStr}:${publicKey}:${timestamp}:${nonce}:${forceStr}`;
|
|
971
|
+
const signResult = await account_js_1.Account.Instance().signData(this.userAddress, signMessage);
|
|
972
|
+
const signatureBuffer = Buffer.from(signResult.signature.slice(2), "hex");
|
|
973
|
+
const signatureBase64 = (0, crypto_js_1.bytesToBase64)(new Uint8Array(signatureBuffer));
|
|
974
|
+
// 使用统一的 sendMessage API
|
|
975
|
+
const response = await this.serverClient.sendMessage({
|
|
976
|
+
sender: signResult.publicKey,
|
|
977
|
+
recipient: recipientAddress,
|
|
978
|
+
ciphertext,
|
|
979
|
+
plaintextHash,
|
|
980
|
+
clientTimestamp: createdAt,
|
|
981
|
+
msgType: encrypted.type, // 使用底层 Signal Protocol 消息类型(1 或 3)
|
|
982
|
+
zipMetadata,
|
|
983
|
+
guardAddress: options?.guardAddress,
|
|
984
|
+
passportAddress: options?.passportAddress,
|
|
985
|
+
force: options?.force,
|
|
986
|
+
// 【修复】只有当 lastReceivedLeafIndex >= 0 时才发送,否则发送 undefined
|
|
987
|
+
lastReceivedLeafIndex: lastReceivedLeafIndex >= 0
|
|
988
|
+
? lastReceivedLeafIndex
|
|
989
|
+
: undefined,
|
|
990
|
+
signatureScheme: "ED25519",
|
|
991
|
+
signature: signatureBase64,
|
|
992
|
+
timestamp,
|
|
993
|
+
nonce,
|
|
994
|
+
});
|
|
995
|
+
// 9. 保存到本地存储
|
|
996
|
+
// 使用底层 Signal Protocol 消息类型(1 或 3),通过 zipMetadata 标识这是 ZIP 文件
|
|
997
|
+
const message = {
|
|
998
|
+
messageId: response.messageId,
|
|
999
|
+
fromAddress: this.userAddress,
|
|
1000
|
+
toAddress: recipientAddress,
|
|
1001
|
+
plaintextHash,
|
|
1002
|
+
plaintext: zipBase64, // 保存 ZIP 数据的 base64 编码,方便本地查看
|
|
1003
|
+
guardAddress: options?.guardAddress,
|
|
1004
|
+
passportAddress: options?.passportAddress,
|
|
1005
|
+
lastReceivedLeafIndex, // 【新增】保存消息确认字段
|
|
1006
|
+
direction: types_js_1.MessageDirection.SENT,
|
|
1007
|
+
status: response.status === "confirmed"
|
|
1008
|
+
? types_js_1.MessageStatus.CONFIRMED
|
|
1009
|
+
: types_js_1.MessageStatus.PENDING,
|
|
1010
|
+
msgType: encrypted.type, // 使用底层 Signal Protocol 消息类型(1 或 3)
|
|
1011
|
+
zipMetadata,
|
|
1012
|
+
createdAt,
|
|
1013
|
+
};
|
|
1014
|
+
if (response.merkleData) {
|
|
1015
|
+
message.leafIndex = response.merkleData.leafIndex;
|
|
1016
|
+
message.prevRoot = response.merkleData.prevRoot;
|
|
1017
|
+
message.newRoot = response.merkleData.newRoot;
|
|
1018
|
+
message.serverSignature = response.merkleData.serverSignature;
|
|
1019
|
+
message.serverTimestamp = response.merkleData.serverTimestamp;
|
|
1020
|
+
message.serverPublicKey = response.merkleData.serverPublicKey;
|
|
1021
|
+
// 更新会话状态
|
|
1022
|
+
this.sessionStateStorage.updateSessionState(this.userAddress, recipientAddress, {
|
|
1023
|
+
currentRoot: response.merkleData.newRoot,
|
|
1024
|
+
prevRoot: response.merkleData.prevRoot,
|
|
1025
|
+
lastLeafIndex: response.merkleData.leafIndex,
|
|
1026
|
+
lastSyncAt: Date.now(),
|
|
1027
|
+
});
|
|
1028
|
+
}
|
|
1029
|
+
this.messageStorage.saveMessage(message);
|
|
1030
|
+
// 方案B:处理服务器返回的其他已验证消息的 Merkle 数据
|
|
1031
|
+
// 这些消息可能之前因为发送方离线而没有收到 Merkle 数据
|
|
1032
|
+
if (response.pendingMerkleData) {
|
|
1033
|
+
for (const [msgId, merkleData] of Object.entries(response.pendingMerkleData)) {
|
|
1034
|
+
// 检查本地是否已有该消息
|
|
1035
|
+
const existingMsg = this.messageStorage.getMessage(msgId);
|
|
1036
|
+
if (existingMsg &&
|
|
1037
|
+
existingMsg.status === types_js_1.MessageStatus.PENDING) {
|
|
1038
|
+
// 更新消息的 Merkle 数据
|
|
1039
|
+
this.messageStorage.updateMessageStatus(msgId, types_js_1.MessageStatus.CONFIRMED, {
|
|
1040
|
+
leafIndex: merkleData.leafIndex,
|
|
1041
|
+
newRoot: merkleData.newRoot,
|
|
1042
|
+
serverSignature: merkleData.serverSignature,
|
|
1043
|
+
serverTimestamp: merkleData.serverTimestamp,
|
|
1044
|
+
serverPublicKey: merkleData.serverPublicKey,
|
|
1045
|
+
});
|
|
1046
|
+
/*console.log(
|
|
1047
|
+
`[ForceSend] Updated pending message ${msgId} with merkle data from pendingMerkleData`,
|
|
1048
|
+
);*/
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
}
|
|
1052
|
+
return {
|
|
1053
|
+
messageId: response.messageId,
|
|
1054
|
+
status: message.status,
|
|
1055
|
+
merkleData: response.merkleData,
|
|
1056
|
+
guardList: response.guard_list,
|
|
1057
|
+
};
|
|
1254
1058
|
}
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1059
|
+
/**
|
|
1060
|
+
* 加载文件数据(支持本地路径和网络 URL)
|
|
1061
|
+
*/
|
|
1062
|
+
async loadFileData(source) {
|
|
1063
|
+
// 判断是否为网络 URL
|
|
1064
|
+
if (source.startsWith("http://") || source.startsWith("https://")) {
|
|
1065
|
+
// 从网络加载
|
|
1066
|
+
const response = await fetch(source);
|
|
1067
|
+
if (!response.ok) {
|
|
1068
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.NETWORK_ERROR, `Failed to fetch file from ${source}: ${response.statusText}`);
|
|
1069
|
+
}
|
|
1070
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
1071
|
+
return new Uint8Array(arrayBuffer);
|
|
1072
|
+
}
|
|
1073
|
+
// 从本地文件加载
|
|
1074
|
+
const resolvedPath = path.resolve(source);
|
|
1075
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
1076
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.FILE_NOT_FOUND, `File not found: ${resolvedPath}`);
|
|
1077
|
+
}
|
|
1078
|
+
const buffer = fs.readFileSync(resolvedPath);
|
|
1079
|
+
return new Uint8Array(buffer);
|
|
1266
1080
|
}
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
import_types.MessengerErrorCode.IDENTITY_NOT_FOUND,
|
|
1281
|
-
"User address not set"
|
|
1282
|
-
);
|
|
1081
|
+
/**
|
|
1082
|
+
* 检测内容类型
|
|
1083
|
+
*/
|
|
1084
|
+
detectContentType(fileName) {
|
|
1085
|
+
const ext = path.extname(fileName).toLowerCase();
|
|
1086
|
+
switch (ext) {
|
|
1087
|
+
case ".wts":
|
|
1088
|
+
return "wts";
|
|
1089
|
+
case ".wip":
|
|
1090
|
+
return "wip";
|
|
1091
|
+
default:
|
|
1092
|
+
return "zip";
|
|
1093
|
+
}
|
|
1283
1094
|
}
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1095
|
+
/**
|
|
1096
|
+
* 生成签名的请求
|
|
1097
|
+
*/
|
|
1098
|
+
async _createSignedRequest(data) {
|
|
1099
|
+
if (!this.userAddress) {
|
|
1100
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
|
|
1101
|
+
}
|
|
1102
|
+
const timestamp = Date.now();
|
|
1103
|
+
const nonce = this.generateNonce();
|
|
1104
|
+
const dataJson = (0, utils_js_1.canonicalizeJson)(data);
|
|
1105
|
+
const signMessage = `${timestamp}:${nonce}:${dataJson}`;
|
|
1106
|
+
const signResult = await account_js_1.Account.Instance().signData(this.userAddress, signMessage);
|
|
1107
|
+
const signatureBuffer = Buffer.from(signResult.signature.slice(2), "hex");
|
|
1108
|
+
const signatureBase64 = (0, crypto_js_1.bytesToBase64)(new Uint8Array(signatureBuffer));
|
|
1109
|
+
// 获取公钥(带标志位)用于服务器验证
|
|
1110
|
+
const account = await account_js_1.Account.Instance().get(this.userAddress, false);
|
|
1111
|
+
if (!account || !account.pubkey) {
|
|
1112
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "Account public key not found");
|
|
1113
|
+
}
|
|
1114
|
+
return {
|
|
1115
|
+
userAddress: this.userAddress,
|
|
1116
|
+
publicKey: account.pubkey,
|
|
1117
|
+
signatureScheme: "ED25519",
|
|
1118
|
+
signature: signatureBase64,
|
|
1119
|
+
timestamp,
|
|
1120
|
+
nonce,
|
|
1121
|
+
data,
|
|
1122
|
+
};
|
|
1300
1123
|
}
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1124
|
+
/**
|
|
1125
|
+
* 验证地址列表
|
|
1126
|
+
*/
|
|
1127
|
+
_validateAddresses(addresses) {
|
|
1128
|
+
const valid = [];
|
|
1129
|
+
const invalid = [];
|
|
1130
|
+
for (const addr of addresses) {
|
|
1131
|
+
if ((0, sui_types_js_1.isValidWowAddress)(addr)) {
|
|
1132
|
+
valid.push(addr);
|
|
1133
|
+
}
|
|
1134
|
+
else {
|
|
1135
|
+
invalid.push(addr);
|
|
1136
|
+
}
|
|
1137
|
+
}
|
|
1138
|
+
return { valid, invalid };
|
|
1313
1139
|
}
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1140
|
+
/**
|
|
1141
|
+
* 黑名单 - 添加地址
|
|
1142
|
+
*/
|
|
1143
|
+
async addToBlacklist(addresses) {
|
|
1144
|
+
if (!this.userAddress) {
|
|
1145
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
|
|
1146
|
+
}
|
|
1147
|
+
const { valid, invalid } = this._validateAddresses(addresses);
|
|
1148
|
+
if (invalid.length > 0) {
|
|
1149
|
+
return {
|
|
1150
|
+
success: false,
|
|
1151
|
+
operation: "add",
|
|
1152
|
+
modifiedCount: 0,
|
|
1153
|
+
currentCount: 0,
|
|
1154
|
+
maxCount: 0,
|
|
1155
|
+
invalidAddresses: invalid,
|
|
1156
|
+
message: `Invalid addresses: ${invalid.join(", ")}`,
|
|
1157
|
+
};
|
|
1158
|
+
}
|
|
1159
|
+
const data = { addresses: valid };
|
|
1160
|
+
const signedRequest = await this._createSignedRequest(data);
|
|
1161
|
+
return this.serverClient.addToBlacklist(this.userAddress, signedRequest);
|
|
1325
1162
|
}
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1163
|
+
/**
|
|
1164
|
+
* 黑名单 - 移除地址
|
|
1165
|
+
*/
|
|
1166
|
+
async removeFromBlacklist(addresses) {
|
|
1167
|
+
if (!this.userAddress) {
|
|
1168
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
|
|
1169
|
+
}
|
|
1170
|
+
const { valid, invalid } = this._validateAddresses(addresses);
|
|
1171
|
+
if (invalid.length > 0) {
|
|
1172
|
+
return {
|
|
1173
|
+
success: false,
|
|
1174
|
+
operation: "remove",
|
|
1175
|
+
modifiedCount: 0,
|
|
1176
|
+
currentCount: 0,
|
|
1177
|
+
maxCount: 0,
|
|
1178
|
+
invalidAddresses: invalid,
|
|
1179
|
+
message: `Invalid addresses: ${invalid.join(", ")}`,
|
|
1180
|
+
};
|
|
1181
|
+
}
|
|
1182
|
+
const data = { addresses: valid };
|
|
1183
|
+
const signedRequest = await this._createSignedRequest(data);
|
|
1184
|
+
return this.serverClient.removeFromBlacklist(this.userAddress, signedRequest);
|
|
1342
1185
|
}
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
};
|
|
1186
|
+
/**
|
|
1187
|
+
* 黑名单 - 清空
|
|
1188
|
+
*/
|
|
1189
|
+
async clearBlacklist() {
|
|
1190
|
+
if (!this.userAddress) {
|
|
1191
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
|
|
1192
|
+
}
|
|
1193
|
+
const data = {};
|
|
1194
|
+
const signedRequest = await this._createSignedRequest(data);
|
|
1195
|
+
return this.serverClient.clearBlacklist(this.userAddress, signedRequest);
|
|
1354
1196
|
}
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
*/
|
|
1365
|
-
async removeFromFriendsList(addresses) {
|
|
1366
|
-
if (!this.userAddress) {
|
|
1367
|
-
throw new import_types.MessengerError(
|
|
1368
|
-
import_types.MessengerErrorCode.IDENTITY_NOT_FOUND,
|
|
1369
|
-
"User address not set"
|
|
1370
|
-
);
|
|
1197
|
+
/**
|
|
1198
|
+
* 黑名单 - 获取列表
|
|
1199
|
+
*/
|
|
1200
|
+
async getBlacklist() {
|
|
1201
|
+
if (!this.userAddress) {
|
|
1202
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
|
|
1203
|
+
}
|
|
1204
|
+
const signedRequest = await this._createSignedRequest({});
|
|
1205
|
+
return this.serverClient.getBlacklist(this.userAddress, signedRequest);
|
|
1371
1206
|
}
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1207
|
+
/**
|
|
1208
|
+
* 黑名单 - 检查存在
|
|
1209
|
+
*/
|
|
1210
|
+
async existInBlacklist(addresses) {
|
|
1211
|
+
if (!this.userAddress) {
|
|
1212
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
|
|
1213
|
+
}
|
|
1214
|
+
const { valid, invalid } = this._validateAddresses(addresses);
|
|
1215
|
+
if (invalid.length > 0) {
|
|
1216
|
+
return {
|
|
1217
|
+
success: false,
|
|
1218
|
+
operation: "exist",
|
|
1219
|
+
modifiedCount: 0,
|
|
1220
|
+
currentCount: 0,
|
|
1221
|
+
maxCount: 0,
|
|
1222
|
+
invalidAddresses: invalid,
|
|
1223
|
+
message: `Invalid addresses: ${invalid.join(", ")}`,
|
|
1224
|
+
};
|
|
1225
|
+
}
|
|
1226
|
+
const data = { addresses: valid };
|
|
1227
|
+
const signedRequest = await this._createSignedRequest(data);
|
|
1228
|
+
return this.serverClient.existInBlacklist(this.userAddress, signedRequest);
|
|
1383
1229
|
}
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1230
|
+
/**
|
|
1231
|
+
* 好友列表 - 添加地址
|
|
1232
|
+
*/
|
|
1233
|
+
async addToFriendsList(addresses) {
|
|
1234
|
+
if (!this.userAddress) {
|
|
1235
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
|
|
1236
|
+
}
|
|
1237
|
+
const { valid, invalid } = this._validateAddresses(addresses);
|
|
1238
|
+
if (invalid.length > 0) {
|
|
1239
|
+
return {
|
|
1240
|
+
success: false,
|
|
1241
|
+
operation: "add",
|
|
1242
|
+
modifiedCount: 0,
|
|
1243
|
+
currentCount: 0,
|
|
1244
|
+
maxCount: 0,
|
|
1245
|
+
invalidAddresses: invalid,
|
|
1246
|
+
message: `Invalid addresses: ${invalid.join(", ")}`,
|
|
1247
|
+
};
|
|
1248
|
+
}
|
|
1249
|
+
const data = { addresses: valid };
|
|
1250
|
+
const signedRequest = await this._createSignedRequest(data);
|
|
1251
|
+
return this.serverClient.addToFriendsList(this.userAddress, signedRequest);
|
|
1400
1252
|
}
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1253
|
+
/**
|
|
1254
|
+
* 好友列表 - 移除地址
|
|
1255
|
+
*/
|
|
1256
|
+
async removeFromFriendsList(addresses) {
|
|
1257
|
+
if (!this.userAddress) {
|
|
1258
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
|
|
1259
|
+
}
|
|
1260
|
+
const { valid, invalid } = this._validateAddresses(addresses);
|
|
1261
|
+
if (invalid.length > 0) {
|
|
1262
|
+
return {
|
|
1263
|
+
success: false,
|
|
1264
|
+
operation: "remove",
|
|
1265
|
+
modifiedCount: 0,
|
|
1266
|
+
currentCount: 0,
|
|
1267
|
+
maxCount: 0,
|
|
1268
|
+
invalidAddresses: invalid,
|
|
1269
|
+
message: `Invalid addresses: ${invalid.join(", ")}`,
|
|
1270
|
+
};
|
|
1271
|
+
}
|
|
1272
|
+
const data = { addresses: valid };
|
|
1273
|
+
const signedRequest = await this._createSignedRequest(data);
|
|
1274
|
+
return this.serverClient.removeFromFriendsList(this.userAddress, signedRequest);
|
|
1417
1275
|
}
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
if (!this.userAddress) {
|
|
1429
|
-
throw new import_types.MessengerError(
|
|
1430
|
-
import_types.MessengerErrorCode.IDENTITY_NOT_FOUND,
|
|
1431
|
-
"User address not set"
|
|
1432
|
-
);
|
|
1276
|
+
/**
|
|
1277
|
+
* 好友列表 - 清空
|
|
1278
|
+
*/
|
|
1279
|
+
async clearFriendsList() {
|
|
1280
|
+
if (!this.userAddress) {
|
|
1281
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
|
|
1282
|
+
}
|
|
1283
|
+
const data = {};
|
|
1284
|
+
const signedRequest = await this._createSignedRequest(data);
|
|
1285
|
+
return this.serverClient.clearFriendsList(this.userAddress, signedRequest);
|
|
1433
1286
|
}
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
message: `Invalid addresses: ${invalid.join(", ")}`
|
|
1444
|
-
};
|
|
1287
|
+
/**
|
|
1288
|
+
* 好友列表 - 获取列表
|
|
1289
|
+
*/
|
|
1290
|
+
async getFriendsList() {
|
|
1291
|
+
if (!this.userAddress) {
|
|
1292
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
|
|
1293
|
+
}
|
|
1294
|
+
const signedRequest = await this._createSignedRequest({});
|
|
1295
|
+
return this.serverClient.getFriendsList(this.userAddress, signedRequest);
|
|
1445
1296
|
}
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1297
|
+
/**
|
|
1298
|
+
* 好友列表 - 检查存在
|
|
1299
|
+
*/
|
|
1300
|
+
async existInFriendsList(addresses) {
|
|
1301
|
+
if (!this.userAddress) {
|
|
1302
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
|
|
1303
|
+
}
|
|
1304
|
+
const { valid, invalid } = this._validateAddresses(addresses);
|
|
1305
|
+
if (invalid.length > 0) {
|
|
1306
|
+
return {
|
|
1307
|
+
success: false,
|
|
1308
|
+
operation: "exist",
|
|
1309
|
+
modifiedCount: 0,
|
|
1310
|
+
currentCount: 0,
|
|
1311
|
+
maxCount: 0,
|
|
1312
|
+
invalidAddresses: invalid,
|
|
1313
|
+
message: `Invalid addresses: ${invalid.join(", ")}`,
|
|
1314
|
+
};
|
|
1315
|
+
}
|
|
1316
|
+
const data = { addresses: valid };
|
|
1317
|
+
const signedRequest = await this._createSignedRequest(data);
|
|
1318
|
+
return this.serverClient.existInFriendsList(this.userAddress, signedRequest);
|
|
1462
1319
|
}
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
async removeFromGuardList(addresses) {
|
|
1474
|
-
if (!this.userAddress) {
|
|
1475
|
-
throw new import_types.MessengerError(
|
|
1476
|
-
import_types.MessengerErrorCode.IDENTITY_NOT_FOUND,
|
|
1477
|
-
"User address not set"
|
|
1478
|
-
);
|
|
1320
|
+
/**
|
|
1321
|
+
* Guard 列表 - 添加
|
|
1322
|
+
*/
|
|
1323
|
+
async addToGuardList(guards) {
|
|
1324
|
+
if (!this.userAddress) {
|
|
1325
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
|
|
1326
|
+
}
|
|
1327
|
+
const data = { guards };
|
|
1328
|
+
const signedRequest = await this._createSignedRequest(data);
|
|
1329
|
+
return this.serverClient.addToGuardList(this.userAddress, signedRequest);
|
|
1479
1330
|
}
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1331
|
+
/**
|
|
1332
|
+
* Guard 列表 - 移除
|
|
1333
|
+
*/
|
|
1334
|
+
async removeFromGuardList(addresses) {
|
|
1335
|
+
if (!this.userAddress) {
|
|
1336
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
|
|
1337
|
+
}
|
|
1338
|
+
const { valid, invalid } = this._validateAddresses(addresses);
|
|
1339
|
+
if (invalid.length > 0) {
|
|
1340
|
+
return {
|
|
1341
|
+
success: false,
|
|
1342
|
+
operation: "remove",
|
|
1343
|
+
modifiedCount: 0,
|
|
1344
|
+
currentCount: 0,
|
|
1345
|
+
maxCount: 0,
|
|
1346
|
+
invalidAddresses: invalid,
|
|
1347
|
+
message: `Invalid addresses: ${invalid.join(", ")}`,
|
|
1348
|
+
};
|
|
1349
|
+
}
|
|
1350
|
+
const data = { addresses: valid };
|
|
1351
|
+
const signedRequest = await this._createSignedRequest(data);
|
|
1352
|
+
return this.serverClient.removeFromGuardList(this.userAddress, signedRequest);
|
|
1491
1353
|
}
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
*/
|
|
1502
|
-
async getGuardList() {
|
|
1503
|
-
if (!this.userAddress) {
|
|
1504
|
-
throw new import_types.MessengerError(
|
|
1505
|
-
import_types.MessengerErrorCode.IDENTITY_NOT_FOUND,
|
|
1506
|
-
"User address not set"
|
|
1507
|
-
);
|
|
1354
|
+
/**
|
|
1355
|
+
* Guard 列表 - 获取列表
|
|
1356
|
+
*/
|
|
1357
|
+
async getGuardList() {
|
|
1358
|
+
if (!this.userAddress) {
|
|
1359
|
+
throw new types_js_1.MessengerError(types_js_1.MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
|
|
1360
|
+
}
|
|
1361
|
+
const signedRequest = await this._createSignedRequest({});
|
|
1362
|
+
return this.serverClient.getGuardList(this.userAddress, signedRequest);
|
|
1508
1363
|
}
|
|
1509
|
-
const signedRequest = await this._createSignedRequest({});
|
|
1510
|
-
return this.serverClient.getGuardList(this.userAddress, signedRequest);
|
|
1511
|
-
}
|
|
1512
1364
|
}
|
|
1365
|
+
exports.Messenger = Messenger;
|
|
1366
|
+
//# sourceMappingURL=messenger.js.map
|