wowok 2.2.3 → 2.2.4
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 +30 -68
- package/dist/cjs/bcs/bcs.js +1 -1
- package/dist/cjs/bcs/index.js +1 -1
- package/dist/cjs/cryptography/index.d.ts +1 -1
- package/dist/cjs/cryptography/index.js +1 -1
- package/dist/cjs/cryptography/intent.js +1 -1
- package/dist/cjs/cryptography/keypair.d.ts +2 -2
- package/dist/cjs/cryptography/keypair.js +1 -1
- package/dist/cjs/cryptography/publickey.d.ts +1 -1
- package/dist/cjs/cryptography/publickey.js +1 -1
- package/dist/cjs/cryptography/signature-scheme.d.ts +4 -15
- package/dist/cjs/cryptography/signature-scheme.js +1 -1
- package/dist/cjs/cryptography/signature.d.ts +1 -9
- package/dist/cjs/cryptography/signature.js +1 -1
- package/dist/cjs/grpc/client.d.ts +0 -2
- package/dist/cjs/grpc/client.js +1 -1
- package/dist/cjs/grpc/proto/google/protobuf/any.d.ts +7 -0
- package/dist/cjs/grpc/proto/google/protobuf/any.js +1 -1
- package/dist/cjs/grpc/proto/google/protobuf/duration.d.ts +8 -0
- package/dist/cjs/grpc/proto/google/protobuf/duration.js +1 -1
- package/dist/cjs/grpc/proto/google/protobuf/empty.d.ts +8 -0
- package/dist/cjs/grpc/proto/google/protobuf/empty.js +1 -1
- package/dist/cjs/grpc/proto/google/protobuf/field_mask.d.ts +8 -0
- package/dist/cjs/grpc/proto/google/protobuf/field_mask.js +1 -1
- package/dist/cjs/grpc/proto/google/protobuf/struct.d.ts +15 -0
- package/dist/cjs/grpc/proto/google/protobuf/struct.js +1 -1
- package/dist/cjs/grpc/proto/google/protobuf/timestamp.d.ts +8 -0
- package/dist/cjs/grpc/proto/google/protobuf/timestamp.js +1 -1
- package/dist/cjs/grpc/proto/google/rpc/error_details.d.ts +48 -0
- package/dist/cjs/grpc/proto/google/rpc/error_details.js +1 -1
- package/dist/cjs/grpc/proto/google/rpc/status.d.ts +8 -0
- package/dist/cjs/grpc/proto/google/rpc/status.js +1 -1
- package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint.js +1 -1
- package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint_contents.js +1 -1
- package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint_summary.js +1 -1
- package/dist/cjs/grpc/proto/sui/rpc/v2/effects.js +1 -1
- package/dist/cjs/grpc/proto/sui/rpc/v2/event.js +1 -1
- package/dist/cjs/grpc/proto/sui/rpc/v2/executed_transaction.js +1 -1
- package/dist/cjs/grpc/proto/sui/rpc/v2/execution_status.d.ts +2 -2
- package/dist/cjs/grpc/proto/sui/rpc/v2/execution_status.js +1 -1
- package/dist/cjs/grpc/proto/sui/rpc/v2/ledger_service.js +1 -1
- package/dist/cjs/grpc/proto/sui/rpc/v2/move_package.js +1 -1
- package/dist/cjs/grpc/proto/sui/rpc/v2/move_package_service.js +1 -1
- package/dist/cjs/grpc/proto/sui/rpc/v2/object.js +1 -1
- package/dist/cjs/grpc/proto/sui/rpc/v2/signature.d.ts +9 -87
- package/dist/cjs/grpc/proto/sui/rpc/v2/signature.js +1 -1
- package/dist/cjs/grpc/proto/sui/rpc/v2/signature_scheme.d.ts +2 -6
- package/dist/cjs/grpc/proto/sui/rpc/v2/signature_scheme.js +1 -1
- package/dist/cjs/grpc/proto/sui/rpc/v2/signature_verification_service.d.ts +0 -2
- package/dist/cjs/grpc/proto/sui/rpc/v2/signature_verification_service.js +1 -1
- package/dist/cjs/grpc/proto/sui/rpc/v2/state_service.js +1 -1
- package/dist/cjs/grpc/proto/sui/rpc/v2/system_state.d.ts +2 -2
- package/dist/cjs/grpc/proto/sui/rpc/v2/system_state.js +1 -1
- package/dist/cjs/grpc/proto/sui/rpc/v2/transaction.d.ts +13 -51
- package/dist/cjs/grpc/proto/sui/rpc/v2/transaction.js +1 -1
- package/dist/cjs/grpc/proto/sui/rpc/v2/transaction_execution_service.js +1 -1
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/jsonRpc/types/chain.d.ts +0 -5
- package/dist/cjs/jsonRpc/types/generated.d.ts +5 -57
- package/dist/cjs/jsonRpc/types/params.d.ts +0 -17
- package/dist/cjs/keypairs/falcon512/index.d.ts +2 -0
- package/dist/cjs/keypairs/falcon512/index.js +1 -0
- package/dist/cjs/keypairs/falcon512/keypair.d.ts +19 -0
- package/dist/cjs/keypairs/falcon512/keypair.js +1 -0
- package/dist/{esm/keypairs/ed25519 → cjs/keypairs/falcon512}/publickey.d.ts +2 -2
- package/dist/cjs/keypairs/falcon512/publickey.js +1 -0
- package/dist/cjs/keypairs/index.d.ts +1 -4
- package/dist/cjs/keypairs/index.js +1 -1
- package/dist/cjs/utils/move-registry.js +1 -1
- package/dist/cjs/utils/sui-types.js +1 -1
- package/dist/cjs/verify/verify.js +1 -1
- package/dist/cjs/w/call/arbitration.js +1 -1
- package/dist/cjs/w/call/base.js +1 -1
- package/dist/cjs/w/call/contact.js +1 -1
- package/dist/cjs/w/call/demand.js +1 -1
- package/dist/cjs/w/call/guard.js +1 -1
- package/dist/cjs/w/call/machine.js +1 -1
- package/dist/cjs/w/call/personal.js +1 -1
- package/dist/cjs/w/call/proof.d.ts +3 -3
- package/dist/cjs/w/call/proof.js +1 -1
- package/dist/cjs/w/call/repository.js +1 -1
- package/dist/cjs/w/call/reward.js +1 -1
- package/dist/cjs/w/call/service.js +1 -1
- package/dist/cjs/w/call/treasury.js +1 -1
- package/dist/cjs/w/local/account.d.ts +11 -4
- package/dist/cjs/w/local/account.js +1 -1
- package/dist/cjs/w/local/storage.js +1 -1
- package/dist/cjs/w/local/util.js +1 -1
- package/dist/cjs/w/local/wip.d.ts +1 -1
- package/dist/cjs/w/local/wip.js +1 -1
- package/dist/cjs/w/messenger/crypto.d.ts +1 -3
- package/dist/cjs/w/messenger/crypto.js +1 -1
- package/dist/cjs/w/messenger/messenger-api.js +1 -1
- package/dist/cjs/w/messenger/messenger-manager.js +1 -1
- package/dist/cjs/w/messenger/messenger.js +1 -1
- package/dist/cjs/w/messenger/pq/crypto.d.ts +6 -6
- package/dist/cjs/w/messenger/pq/crypto.js +1 -1
- package/dist/cjs/w/messenger/pq/pqxdh.d.ts +3 -6
- package/dist/cjs/w/messenger/pq/pqxdh.js +1 -1
- package/dist/cjs/w/messenger/pq/session.d.ts +6 -4
- package/dist/cjs/w/messenger/pq/session.js +1 -1
- package/dist/cjs/w/messenger/pq/spqr.js +1 -1
- package/dist/cjs/w/messenger/pq/store-adapter.d.ts +1 -3
- package/dist/cjs/w/messenger/pq/store-adapter.js +1 -1
- package/dist/cjs/w/messenger/pq/types.d.ts +4 -5
- package/dist/cjs/w/messenger/pq/types.js +1 -1
- package/dist/cjs/w/messenger/session.d.ts +4 -5
- package/dist/cjs/w/messenger/session.js +1 -1
- package/dist/cjs/w/messenger/storage.js +1 -1
- package/dist/cjs/w/messenger/types.d.ts +7 -10
- package/dist/cjs/w/messenger/types.js +1 -1
- package/dist/cjs/w/query/object.js +1 -1
- package/dist/esm/bcs/bcs.d.ts +30 -68
- package/dist/esm/bcs/bcs.js +1 -1
- package/dist/esm/bcs/index.js +1 -1
- package/dist/esm/cryptography/index.d.ts +1 -1
- package/dist/esm/cryptography/index.js +1 -1
- package/dist/esm/cryptography/intent.js +1 -1
- package/dist/esm/cryptography/keypair.d.ts +2 -2
- package/dist/esm/cryptography/keypair.js +1 -1
- package/dist/esm/cryptography/publickey.d.ts +1 -1
- package/dist/esm/cryptography/publickey.js +1 -1
- package/dist/esm/cryptography/signature-scheme.d.ts +4 -15
- package/dist/esm/cryptography/signature-scheme.js +1 -1
- package/dist/esm/cryptography/signature.d.ts +1 -9
- package/dist/esm/cryptography/signature.js +1 -1
- package/dist/esm/grpc/client.d.ts +0 -2
- package/dist/esm/grpc/client.js +1 -1
- package/dist/esm/grpc/proto/google/protobuf/any.d.ts +7 -0
- package/dist/esm/grpc/proto/google/protobuf/any.js +1 -1
- package/dist/esm/grpc/proto/google/protobuf/duration.d.ts +8 -0
- package/dist/esm/grpc/proto/google/protobuf/duration.js +1 -1
- package/dist/esm/grpc/proto/google/protobuf/empty.d.ts +8 -0
- package/dist/esm/grpc/proto/google/protobuf/empty.js +1 -1
- package/dist/esm/grpc/proto/google/protobuf/field_mask.d.ts +8 -0
- package/dist/esm/grpc/proto/google/protobuf/field_mask.js +1 -1
- package/dist/esm/grpc/proto/google/protobuf/struct.d.ts +15 -0
- package/dist/esm/grpc/proto/google/protobuf/struct.js +1 -1
- package/dist/esm/grpc/proto/google/protobuf/timestamp.d.ts +8 -0
- package/dist/esm/grpc/proto/google/protobuf/timestamp.js +1 -1
- package/dist/esm/grpc/proto/google/rpc/error_details.d.ts +48 -0
- package/dist/esm/grpc/proto/google/rpc/error_details.js +1 -1
- package/dist/esm/grpc/proto/google/rpc/status.d.ts +8 -0
- package/dist/esm/grpc/proto/google/rpc/status.js +1 -1
- package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint.js +1 -1
- package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint_contents.js +1 -1
- package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint_summary.js +1 -1
- package/dist/esm/grpc/proto/sui/rpc/v2/effects.js +1 -1
- package/dist/esm/grpc/proto/sui/rpc/v2/event.js +1 -1
- package/dist/esm/grpc/proto/sui/rpc/v2/executed_transaction.js +1 -1
- package/dist/esm/grpc/proto/sui/rpc/v2/execution_status.d.ts +2 -2
- package/dist/esm/grpc/proto/sui/rpc/v2/execution_status.js +1 -1
- package/dist/esm/grpc/proto/sui/rpc/v2/ledger_service.js +1 -1
- package/dist/esm/grpc/proto/sui/rpc/v2/move_package.js +1 -1
- package/dist/esm/grpc/proto/sui/rpc/v2/move_package_service.js +1 -1
- package/dist/esm/grpc/proto/sui/rpc/v2/object.js +1 -1
- package/dist/esm/grpc/proto/sui/rpc/v2/signature.d.ts +9 -87
- package/dist/esm/grpc/proto/sui/rpc/v2/signature.js +1 -1
- package/dist/esm/grpc/proto/sui/rpc/v2/signature_scheme.d.ts +2 -6
- package/dist/esm/grpc/proto/sui/rpc/v2/signature_scheme.js +1 -1
- package/dist/esm/grpc/proto/sui/rpc/v2/signature_verification_service.d.ts +0 -2
- package/dist/esm/grpc/proto/sui/rpc/v2/signature_verification_service.js +1 -1
- package/dist/esm/grpc/proto/sui/rpc/v2/state_service.js +1 -1
- package/dist/esm/grpc/proto/sui/rpc/v2/system_state.d.ts +2 -2
- package/dist/esm/grpc/proto/sui/rpc/v2/system_state.js +1 -1
- package/dist/esm/grpc/proto/sui/rpc/v2/transaction.d.ts +13 -51
- package/dist/esm/grpc/proto/sui/rpc/v2/transaction.js +1 -1
- package/dist/esm/grpc/proto/sui/rpc/v2/transaction_execution_service.js +1 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/jsonRpc/types/chain.d.ts +0 -5
- package/dist/esm/jsonRpc/types/generated.d.ts +5 -57
- package/dist/esm/jsonRpc/types/params.d.ts +0 -17
- package/dist/esm/keypairs/falcon512/index.d.ts +2 -0
- package/dist/esm/keypairs/falcon512/index.js +1 -0
- package/dist/esm/keypairs/falcon512/keypair.d.ts +19 -0
- package/dist/esm/keypairs/falcon512/keypair.js +1 -0
- package/dist/{cjs/keypairs/ed25519 → esm/keypairs/falcon512}/publickey.d.ts +2 -2
- package/dist/esm/keypairs/falcon512/publickey.js +1 -0
- package/dist/esm/keypairs/index.d.ts +1 -4
- package/dist/esm/keypairs/index.js +1 -1
- package/dist/esm/utils/move-registry.js +1 -1
- package/dist/esm/utils/sui-types.js +1 -1
- package/dist/esm/verify/verify.js +1 -1
- package/dist/esm/w/call/arbitration.js +1 -1
- package/dist/esm/w/call/base.js +1 -1
- package/dist/esm/w/call/contact.js +1 -1
- package/dist/esm/w/call/demand.js +1 -1
- package/dist/esm/w/call/guard.js +1 -1
- package/dist/esm/w/call/machine.js +1 -1
- package/dist/esm/w/call/personal.js +1 -1
- package/dist/esm/w/call/proof.d.ts +3 -3
- package/dist/esm/w/call/proof.js +1 -1
- package/dist/esm/w/call/repository.js +1 -1
- package/dist/esm/w/call/reward.js +1 -1
- package/dist/esm/w/call/service.js +1 -1
- package/dist/esm/w/call/treasury.js +1 -1
- package/dist/esm/w/local/account.d.ts +11 -4
- package/dist/esm/w/local/account.js +1 -1
- package/dist/esm/w/local/storage.js +1 -1
- package/dist/esm/w/local/util.js +1 -1
- package/dist/esm/w/local/wip.d.ts +1 -1
- package/dist/esm/w/local/wip.js +1 -1
- package/dist/esm/w/messenger/crypto.d.ts +1 -3
- package/dist/esm/w/messenger/crypto.js +1 -1
- package/dist/esm/w/messenger/messenger-api.js +1 -1
- package/dist/esm/w/messenger/messenger-manager.js +1 -1
- package/dist/esm/w/messenger/messenger.js +1 -1
- package/dist/esm/w/messenger/pq/crypto.d.ts +6 -6
- package/dist/esm/w/messenger/pq/crypto.js +1 -1
- package/dist/esm/w/messenger/pq/pqxdh.d.ts +3 -6
- package/dist/esm/w/messenger/pq/pqxdh.js +1 -1
- package/dist/esm/w/messenger/pq/session.d.ts +6 -4
- package/dist/esm/w/messenger/pq/session.js +1 -1
- package/dist/esm/w/messenger/pq/spqr.js +1 -1
- package/dist/esm/w/messenger/pq/store-adapter.d.ts +1 -3
- package/dist/esm/w/messenger/pq/store-adapter.js +1 -1
- package/dist/esm/w/messenger/pq/types.d.ts +4 -5
- package/dist/esm/w/messenger/pq/types.js +1 -1
- package/dist/esm/w/messenger/session.d.ts +4 -5
- package/dist/esm/w/messenger/session.js +1 -1
- package/dist/esm/w/messenger/storage.js +1 -1
- package/dist/esm/w/messenger/types.d.ts +7 -10
- package/dist/esm/w/messenger/types.js +1 -1
- package/dist/esm/w/query/object.js +1 -1
- package/package.json +24 -24
- package/dist/cjs/grpc/proto/sui/rpc/v2/jwk.d.ts +0 -20
- package/dist/cjs/grpc/proto/sui/rpc/v2/jwk.js +0 -1
- package/dist/cjs/grpc/proto/sui/rpc/v2/name_service.client.d.ts +0 -23
- package/dist/cjs/grpc/proto/sui/rpc/v2/name_service.client.js +0 -1
- package/dist/cjs/grpc/proto/sui/rpc/v2/name_service.d.ts +0 -47
- package/dist/cjs/grpc/proto/sui/rpc/v2/name_service.js +0 -1
- package/dist/cjs/keypairs/ed25519/ed25519-hd-key.d.ts +0 -8
- package/dist/cjs/keypairs/ed25519/ed25519-hd-key.js +0 -1
- package/dist/cjs/keypairs/ed25519/index.d.ts +0 -2
- package/dist/cjs/keypairs/ed25519/index.js +0 -1
- package/dist/cjs/keypairs/ed25519/keypair.d.ts +0 -22
- package/dist/cjs/keypairs/ed25519/keypair.js +0 -1
- package/dist/cjs/keypairs/ed25519/publickey.js +0 -1
- package/dist/cjs/keypairs/passkey/index.d.ts +0 -3
- package/dist/cjs/keypairs/passkey/index.js +0 -1
- package/dist/cjs/keypairs/passkey/keypair.d.ts +0 -33
- package/dist/cjs/keypairs/passkey/keypair.js +0 -1
- package/dist/cjs/keypairs/passkey/publickey.d.ts +0 -25
- package/dist/cjs/keypairs/passkey/publickey.js +0 -1
- package/dist/cjs/keypairs/passkey/types.d.ts +0 -6
- package/dist/cjs/keypairs/passkey/types.js +0 -1
- package/dist/cjs/keypairs/secp256k1/index.d.ts +0 -2
- package/dist/cjs/keypairs/secp256k1/index.js +0 -1
- package/dist/cjs/keypairs/secp256k1/keypair.d.ts +0 -22
- package/dist/cjs/keypairs/secp256k1/keypair.js +0 -1
- package/dist/cjs/keypairs/secp256k1/publickey.d.ts +0 -11
- package/dist/cjs/keypairs/secp256k1/publickey.js +0 -1
- package/dist/cjs/keypairs/secp256r1/index.d.ts +0 -2
- package/dist/cjs/keypairs/secp256r1/index.js +0 -1
- package/dist/cjs/keypairs/secp256r1/keypair.d.ts +0 -22
- package/dist/cjs/keypairs/secp256r1/keypair.js +0 -1
- package/dist/cjs/keypairs/secp256r1/publickey.d.ts +0 -11
- package/dist/cjs/keypairs/secp256r1/publickey.js +0 -1
- package/dist/cjs/utils/suins.d.ts +0 -2
- package/dist/cjs/utils/suins.js +0 -1
- package/dist/esm/grpc/proto/sui/rpc/v2/jwk.d.ts +0 -20
- package/dist/esm/grpc/proto/sui/rpc/v2/jwk.js +0 -1
- package/dist/esm/grpc/proto/sui/rpc/v2/name_service.client.d.ts +0 -23
- package/dist/esm/grpc/proto/sui/rpc/v2/name_service.client.js +0 -1
- package/dist/esm/grpc/proto/sui/rpc/v2/name_service.d.ts +0 -47
- package/dist/esm/grpc/proto/sui/rpc/v2/name_service.js +0 -1
- package/dist/esm/keypairs/ed25519/ed25519-hd-key.d.ts +0 -8
- package/dist/esm/keypairs/ed25519/ed25519-hd-key.js +0 -1
- package/dist/esm/keypairs/ed25519/index.d.ts +0 -2
- package/dist/esm/keypairs/ed25519/index.js +0 -1
- package/dist/esm/keypairs/ed25519/keypair.d.ts +0 -22
- package/dist/esm/keypairs/ed25519/keypair.js +0 -1
- package/dist/esm/keypairs/ed25519/publickey.js +0 -1
- package/dist/esm/keypairs/passkey/index.d.ts +0 -3
- package/dist/esm/keypairs/passkey/index.js +0 -1
- package/dist/esm/keypairs/passkey/keypair.d.ts +0 -33
- package/dist/esm/keypairs/passkey/keypair.js +0 -1
- package/dist/esm/keypairs/passkey/publickey.d.ts +0 -25
- package/dist/esm/keypairs/passkey/publickey.js +0 -1
- package/dist/esm/keypairs/passkey/types.d.ts +0 -6
- package/dist/esm/keypairs/passkey/types.js +0 -1
- package/dist/esm/keypairs/secp256k1/index.d.ts +0 -2
- package/dist/esm/keypairs/secp256k1/index.js +0 -1
- package/dist/esm/keypairs/secp256k1/keypair.d.ts +0 -22
- package/dist/esm/keypairs/secp256k1/keypair.js +0 -1
- package/dist/esm/keypairs/secp256k1/publickey.d.ts +0 -11
- package/dist/esm/keypairs/secp256k1/publickey.js +0 -1
- package/dist/esm/keypairs/secp256r1/index.d.ts +0 -2
- package/dist/esm/keypairs/secp256r1/index.js +0 -1
- package/dist/esm/keypairs/secp256r1/keypair.d.ts +0 -22
- package/dist/esm/keypairs/secp256r1/keypair.js +0 -1
- package/dist/esm/keypairs/secp256r1/publickey.d.ts +0 -11
- package/dist/esm/keypairs/secp256r1/publickey.js +0 -1
- package/dist/esm/utils/suins.d.ts +0 -2
- package/dist/esm/utils/suins.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{MessengerManager}from'./messenger-manager.js';import{Account}from'../local/account.js';import{W_ERROR,WErrors}from'../exception.js';import{LocalMark}from'../local/local.js';import{MessageStorage}from'./storage.js';import{MessengerError,MessengerErrorCode,CHAIN_PROOF_TYPE,MessageDirection}from'./types.js';import{createHash}from'crypto';import*as a181a from'fs';import*as a181b from'path';import{isValidU64}from'../common.js';import{verifySingleMerkleRoot,hashPlaintext,verifyEd25519Signature}from'./crypto.js';import{canonicalizeJson}from'./utils.js';import{generateHtmlPage,getThemeColors}from'./templates/wts-html-template.js';import{GetAccountOrMark_Address,GetManyAccountOrMark_Address}from'../local/index.js';import{query_objects}from'../query/object.js';import{Messenger}from'./messenger.js';let managerInstance=null,isInitialized=![],backgroundTimer=null;async function autoRegisterMessengerAccounts(){const a=await Account['Instance']()['list_messenger_accounts']();for(const b of a){if(!b['address']||!b['m'])continue;try{const c=new Messenger(b['address']);await c['initialize']();}catch(d){console['error']('Failed\x20to\x20initialize\x20account\x20'+b['address']+':',d);}}}export function getMessengerManager(){return!managerInstance&&(managerInstance=new MessengerManager()),!isInitialized&&(isInitialized=!![],autoRegisterMessengerAccounts()['catch'](a=>{console['error']('Failed\x20to\x20auto-register\x20messenger\x20accounts:',a);}),managerInstance['start']()['catch'](a=>{console['error']('Failed\x20to\x20auto-start\x20messenger\x20manager:',a);})),managerInstance;}function registerCleanupHandler(){const a=()=>{backgroundTimer&&(clearInterval(backgroundTimer),backgroundTimer=null),managerInstance&&managerInstance['stop']();};process['on']('exit',a),process['on']('SIGINT',()=>{a(),process['exit']();}),process['on']('SIGTERM',()=>{a(),process['exit']();});}registerCleanupHandler();export async function watch_conversations(a){const b=await Account['Instance']()['get_address'](a?.['account']);!b&&W_ERROR(WErrors['AccountNotFound'],'watch_conversations.account\x20'+a?.['account']);const c=b['toLowerCase'](),d=getMessengerManager();!isInitialized&&await d['start']();const e=await d['ensureAccountReady'](b);await e['messenger']['pullMessages']();const f=new MessageStorage(c),g=f['getAllMessages'](c),h=new Map(),i=a?.['previewMessageCount']??0x2,j=a?.['skipAutoMarkViewed']??![];for(const n of g){const o=n['fromAddress']['toLowerCase']()===c?n['toAddress']:n['fromAddress'];!h['has'](o)&&h['set'](o,{'peerAddress':o,'lastMessageAt':n['createdAt'],'messageCount':0x0,'unreadCount':0x0,'lastMessagePreview':n['plaintext'],'messages':[]});const p=h['get'](o);p['messages']['push'](n),p['messageCount']++,n['createdAt']>p['lastMessageAt']&&(p['lastMessageAt']=n['createdAt'],p['lastMessagePreview']=n['plaintext']),n['direction']===MessageDirection['RECEIVED']&&n['viewedAt']===undefined&&p['unreadCount']++;}const k=[];for(const [,q]of h){if(a?.['startTime']!==undefined&&q['lastMessageAt']<a['startTime'])continue;if(a?.['endTime']!==undefined&&q['lastMessageAt']>a['endTime'])continue;if(a?.['unreadOnly']&&q['unreadCount']===0x0)continue;const r=[];if(i>0x0){const s=q['messages']['sort']((u,v)=>v['createdAt']-u['createdAt']),t=s['slice'](0x0,i);r['push'](...t['reverse']());if(!j){const u=t['filter'](v=>v['direction']===MessageDirection['RECEIVED']&&v['viewedAt']===undefined)['map'](v=>v['messageId']);u['length']>0x0&&f['updateMessagesViewed'](u);}}k['push']({'peerAddress':q['peerAddress'],'lastMessageAt':q['lastMessageAt'],'messageCount':q['messageCount'],'unreadCount':q['unreadCount'],'lastMessagePreview':q['lastMessagePreview'],...i>0x0&&{'previewMessages':r}});}const l=a?.['sortBy']??'lastMessageAt',m=a?.['sortOrder']??'desc';return k['sort']((v,w)=>{let x=0x0;switch(l){case'lastMessageAt':x=v['lastMessageAt']-w['lastMessageAt'];break;case'unreadCount':x=v['unreadCount']-w['unreadCount'];break;case'messageCount':x=v['messageCount']-w['messageCount'];break;}return m==='asc'?x:-x;}),k;}export async function mark_messages_as_viewed(a,b){if(!a||a['length']===0x0)return 0x0;const c=await Account['Instance']()['get_address'](b);!c&&W_ERROR(WErrors['AccountNotFound'],'mark_messages_as_viewed.account\x20'+b);const d=c['toLowerCase'](),e=new MessageStorage(d);return e['updateMessagesViewed'](a);}export async function mark_conversation_as_viewed(a,b){const c=await Account['Instance']()['get_address'](b);!c&&W_ERROR(WErrors['AccountNotFound'],'mark_conversation_as_viewed.account\x20'+b);const d=c['toLowerCase'](),e=await GetAccountOrMark_Address(a);!e&&W_ERROR(WErrors['AccountNotFound'],'mark_conversation_as_viewed.peerAddress\x20'+a+'\x20is\x20not\x20a\x20valid\x20account/address');const f=e['toLowerCase'](),g=new MessageStorage(d),h=g['getMessagesBySession'](d,f),i=h['filter'](j=>j['direction']===MessageDirection['RECEIVED']&&j['viewedAt']===undefined)['map'](j=>j['messageId']);if(i['length']===0x0)return 0x0;return g['updateMessagesViewed'](i);}export async function send_message(a,b,c,d){const e=await Account['Instance']()['get_address'](a);!e&&W_ERROR(WErrors['AccountNotFound'],'send_message.from\x20'+a);const f=await GetAccountOrMark_Address(b);!f&&W_ERROR(WErrors['AccountNotFound'],'send_message.to\x20'+b+'\x20is\x20not\x20a\x20valid\x20account/address');d?.['guardAddress']!=null&&d?.['passportAddress']!=null&&([d['guardAddress'],d['passportAddress']]=await LocalMark['Instance']()['get_many_address']([d['guardAddress'],d['passportAddress']]),(!d['guardAddress']||!d['passportAddress'])&&W_ERROR(WErrors['AccountNotFound'],'send_message.guardAddress\x20or\x20passportAddress\x20not\x20found'));const g=getMessengerManager();return!isInitialized&&await g['start'](),g['send'](e,f,c,d);}export async function send_file(a,b,c,d){const e=await Account['Instance']()['get_address'](a);!e&&W_ERROR(WErrors['AccountNotFound'],'send_file.from\x20'+a);const f=await GetAccountOrMark_Address(b);!f&&W_ERROR(WErrors['AccountNotFound'],'send_file.to\x20'+b+'\x20is\x20not\x20a\x20valid\x20account/address');d?.['guardAddress']!=null&&d?.['passportAddress']!=null&&([d['guardAddress'],d['passportAddress']]=await LocalMark['Instance']()['get_many_address']([d['guardAddress'],d['passportAddress']]),(!d['guardAddress']||!d['passportAddress'])&&W_ERROR(WErrors['AccountNotFound'],'send_file.guardAddress\x20or\x20passportAddress\x20not\x20found'));const g=getMessengerManager();return!isInitialized&&await g['start'](),g['send_file'](e,f,c,d);}export async function watch_messages(a){a?.['account']!==undefined&&(a['account']=await Account['Instance']()['get_address'](a['account']),!a['account']&&W_ERROR(WErrors['AccountNotFound'],'watch_messages.account\x20'+a['account']));a?.['customListFilter']?.['includeAddresses']!=null&&(a['customListFilter']['includeAddresses']=(await Account['Instance']()['get_many_address'](a['customListFilter']['includeAddresses']))['filter'](e=>e!=null));a?.['customListFilter']?.['excludeAddresses']!=null&&(a['customListFilter']['excludeAddresses']=(await Account['Instance']()['get_many_address'](a['customListFilter']['excludeAddresses']))['filter'](e=>e!=null));const b=getMessengerManager();!isInitialized&&await b['start']();const c=await b['watch'](a),d=a?.['skipAutoMarkViewed']??![];if(!d&&c['length']>0x0&&a?.['account']){const e=a['account']['toLowerCase'](),f=new MessageStorage(e),g=c['filter'](h=>h['direction']===MessageDirection['RECEIVED']&&h['viewedAt']===undefined)['map'](h=>h['messageId']);g['length']>0x0&&f['updateMessagesViewed'](g);}return c;}export async function pull_messages(a,b){const c=await Account['Instance']()['get_address'](a);!c&&W_ERROR(WErrors['AccountNotFound'],'pull_messages.account\x20'+a);const d=getMessengerManager();!isInitialized&&await d['start']();const e=await d['ensureAccountReady'](c),f=await e['messenger']['pullMessages'](b);return f['messages']['map'](g=>g);}async function extract_zip_message(a,b){if(!a['zipMetadata'])throw new MessengerError(MessengerErrorCode['INVALID_MESSAGE_TYPE'],'Message\x20is\x20not\x20a\x20ZIP\x20archive');if(!a['plaintext'])throw new MessengerError(MessengerErrorCode['MESSAGE_NOT_DECRYPTED'],'Message\x20plaintext\x20not\x20available');const c=a['plaintext'],d=Buffer['from'](c,'base64');if(a['zipMetadata']?.['fileHash']){const k=createHash('sha256')['update'](d)['digest']('hex'),l=a['zipMetadata']['fileHash']['replace']('0x','');if(k!==l)throw new MessengerError(MessengerErrorCode['HASH_MISMATCH'],'ZIP\x20file\x20hash\x20mismatch:\x20expected\x20'+l+',\x20got\x20'+k);}const {ZipReader:e,BlobReader:f,BlobWriter:g}=await import('@zip.js/zip.js'),h=new e(new f(new Blob([d]))),i=await h['getEntries']();!a181a['existsSync'](b)&&a181a['mkdirSync'](b,{'recursive':!![]});const j=[];for(const m of i){if(!m['directory']){const n=m,o=new g(),p=await n['getData'](o),q=Buffer['from'](await p['arrayBuffer']()),r=a181b['join'](b,m['filename']);a181a['writeFileSync'](r,q),j['push'](r);}}await h['close']();if(j['length']>0x0&&a['zipMetadata']){const s={'fileName':a['zipMetadata']['fileName'],'fileSize':a['zipMetadata']['fileSize'],'fileHash':a['zipMetadata']['fileHash'],'contentType':a['zipMetadata']['contentType'],'localCachePath':j[0x0],'downloadedAt':Date['now']()};a['zipMetadata']=s;const t=a['direction']==='sent'?a['fromAddress']:a['toAddress'],u=new MessageStorage(t);u['saveMessage'](a);}return j[0x0]||'';}export async function extract_zip_messages(a,b,c){const d=[],f=await Account['Instance']()['get_address'](a);if(!f)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'account\x20is\x20required\x20when\x20extracting\x20by\x20message\x20IDs');for(const g of b){try{let h;if(typeof g==='string'){const j=g,k=new MessageStorage(f),l=k['getMessageById'](j);if(!l){console['error']('Message\x20not\x20found:\x20'+j);continue;}h=l;}else h=g;if(!h['zipMetadata']){console['error']('Message\x20'+h['messageId']+'\x20is\x20not\x20a\x20ZIP\x20archive');continue;}const i=await extract_zip_message(h,c);d['push'](i);}catch(m){const n=typeof g==='string'?g:g['messageId'];console['error']('Failed\x20to\x20extract\x20message\x20'+n+':',m);}}return d;}export async function generate_wts(a){const b=await Account['Instance']()['get_address'](a['myAccount']);!b&&W_ERROR(WErrors['AccountNotFound'],'generate_wts.myAccount\x20'+a['myAccount']);const c=await GetAccountOrMark_Address(a['peerAccount']);return!c&&W_ERROR(WErrors['AccountNotFound'],'generate_wts.peerAccount\x20'+a['peerAccount']),getMessengerManager()['generate_wts'](a['outputDir'],b,c,a['range'],a['excludePlaintext']);}function load_wts(a){const b=a181a['readFileSync'](a,'utf-8');return JSON['parse'](b);}function save_wts(a,b){const c=a181b['dirname'](b);!a181a['existsSync'](c)&&a181a['mkdirSync'](c,{'recursive':!![]}),a181a['writeFileSync'](b,JSON['stringify'](a,null,0x2),'utf-8');}export async function verify_wts(a){try{const b=load_wts(a);if(!b['payload']||!b['meta'])return{'valid':![],'error':'Invalid\x20WTS\x20file\x20structure'};if(b['meta']['type']!=='wts')return{'valid':![],'error':'Invalid\x20meta.type:\x20'+b['meta']['type']};const {payload:c,meta:d}=b,e=[...c['messages']]['sort']((m,n)=>{if(m['leafIndex']===undefined||n['leafIndex']===undefined)return 0x0;return m['leafIndex']-n['leafIndex'];});for(let m=0x0;m<e['length'];m++){const n=e[m];if(!n)return{'valid':![],'error':'Message\x20'+m+':\x20Message\x20is\x20null\x20or\x20undefined'};if(!n['prevRoot'])return{'valid':![],'error':'Message\x20'+m+':\x20Missing\x20prevRoot'};if(!n['merkleRoot'])return{'valid':![],'error':'Message\x20'+m+':\x20Missing\x20merkleRoot'};if(!n['plaintextHash'])return{'valid':![],'error':'Message\x20'+m+':\x20Missing\x20plaintextHash'};if(n['timestamp']===undefined||n['timestamp']===null)return{'valid':![],'error':'Message\x20'+m+':\x20Missing\x20timestamp'};if(n['leafIndex']===undefined||n['leafIndex']===null)return{'valid':![],'error':'Message\x20'+m+':\x20Missing\x20leafIndex'};const o=verifySingleMerkleRoot(n['prevRoot'],n['merkleRoot'],n['plaintextHash'],n['timestamp'],n['leafIndex']);if(!o['valid'])return{'valid':![],'error':o['error']+'\x20at\x20message\x20'+m+',\x20leafIndex\x20'+n['leafIndex']};if(m>0x0){const p=e[m-0x1];if(n['leafIndex']!==p['leafIndex']+0x1)return{'valid':![],'error':'Merkle\x20chain\x20discontinuity:\x20leafIndex\x20'+p['leafIndex']+'\x20->\x20'+n['leafIndex']+'\x20(expected\x20'+(p['leafIndex']+0x1)+')'};if(n['prevRoot']['toLowerCase']()!==p['merkleRoot']['toLowerCase']())return{'valid':![],'error':'Merkle\x20root\x20mismatch\x20at\x20leafIndex\x20'+n['leafIndex']+':\x20expected\x20prevRoot='+p['merkleRoot']+',\x20got\x20'+n['prevRoot']};}}for(let q=0x0;q<c['messages']['length'];q++){const r=c['messages'][q];if(!r)return{'valid':![],'error':'Message\x20'+q+':\x20Message\x20is\x20null\x20or\x20undefined'};const s=!!r['zipMetadata'];if(!s){if(!r['plaintextHash']['startsWith']('0x')||r['plaintextHash']['length']!==0x42)return{'valid':![],'error':'Message\x20'+q+':\x20Invalid\x20plaintextHash\x20format'};if(r['plaintext']){const t=hashPlaintext(r['plaintext'],r['clientTimestamp'],r['guardAddress'],r['passportAddress'],r['lastReceivedLeafIndex']);if(t['toLowerCase']()!==r['plaintextHash']['toLowerCase']())return{'valid':![],'error':'Message\x20'+q+':\x20Plaintext\x20hash\x20mismatch'};}}if(r['serverSignature']&&r['serverPublicKey']){if(!r['timestamp'])return{'valid':![],'error':'Message\x20'+q+':\x20Missing\x20timestamp\x20for\x20signature\x20verification'};if(!r['merkleRoot'])return{'valid':![],'error':'Message\x20'+q+':\x20Missing\x20merkleRoot\x20for\x20signature\x20verification'};if(!r['prevRoot'])return{'valid':![],'error':'Message\x20'+q+':\x20Missing\x20prevRoot\x20for\x20signature\x20verification'};const u=r['prevRoot']+':'+r['merkleRoot']+':'+r['timestamp']+':'+r['serverPublicKey'],v=verifyEd25519Signature(r['serverPublicKey'],u,r['serverSignature']);if(!v)return{'valid':![],'error':'Message\x20'+q+':\x20Server\x20signature\x20verification\x20failed'};}}const {sha256:f}=await import('@noble/hashes/sha256'),{bytesToHex:g}=await import('@noble/hashes/utils'),h=canonicalizeJson(c),j='sha256:'+g(f(new TextEncoder()['encode'](h)));if(j!==d['hash'])return{'valid':![],'error':'Hash\x20mismatch\x20-\x20content\x20has\x20been\x20tampered','hashValid':![],'hasSignature':!!d['signature']};const k=[];let l;if(d['signature']){const {Ed25519PublicKey:w}=await import('../../keypairs/ed25519/publickey.js'),x=Array['isArray'](d['signature'])?d['signature']:[d['signature']];let y=!![];for(const z of x){let A;const B=z['publicKey'];if(B['startsWith']('0x')){const C=Buffer['from'](B['slice'](0x2),'hex');if(C['length']===0x21)A=C['slice'](0x1)['toString']('base64');else{if(C['length']===0x20)A=C['toString']('base64');else{let D;try{const E=new w(B['slice'](0x2));D=E['toWAddress']();}catch{}k['push']({'publicKey':B,'address':D,'valid':![]}),y=![];continue;}}}else try{const F=Buffer['from'](B,'base64');if(F['length']===0x21)A=F['slice'](0x1)['toString']('base64');else{if(F['length']===0x20)A=F['toString']('base64');else{let G;try{const H=new w(B);G=H['toWAddress']();}catch{}k['push']({'publicKey':B,'address':G,'valid':![]}),y=![];continue;}}}catch{A=B;}try{const I=new w(A),J=Uint8Array['from'](Buffer['from'](z['value'],'base64')),K=await I['verify'](new TextEncoder()['encode'](d['hash']),J);let L;try{L=I['toWAddress']();}catch{}k['push']({'publicKey':B,'address':L,'valid':K}),!K&&(y=![]);}catch{let M;try{const N=new w(A);M=N['toWAddress']();}catch{}k['push']({'publicKey':B,'address':M,'valid':![]}),y=![];}}l=y;if(!l){const O=k['filter'](P=>!P['valid']&&P['address'])['map'](P=>P['address']);return{'valid':![],'error':'Signatures\x20from\x20the\x20following\x20addresses\x20are\x20invalid:\x20'+O['join'](',\x20'),'hashValid':!![],'hasSignature':!![],'signatureValid':![],'signatures':k};}}return{'valid':!![],'hashValid':!![],'hasSignature':!!d['signature'],'signatureValid':l,'signatures':k['length']>0x0?k:undefined};}catch(P){return{'valid':![],'error':'Verification\x20error:\x20'+P,'hashValid':![],'hasSignature':![]};}}export async function sign_wts(a,b,c){const d=await verify_wts(a);if(!d['valid'])throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'WTS\x20file\x20verification\x20failed:\x20'+d['error']);const e=load_wts(a),f=await Account['Instance']()['get_address'](b);!f&&W_ERROR(WErrors['AccountNotFound'],'sign_wts.account\x20'+b);const g=await Account['Instance']()['signData'](f,e['meta']['hash']);let h;const i=g['publicKey'];if(i['startsWith']('0x')){const n=Buffer['from'](i['slice'](0x2),'hex');if(n['length']===0x21)h=n['slice'](0x1)['toString']('base64');else{if(n['length']===0x20)h=n['toString']('base64');else throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Invalid\x20public\x20key\x20length:\x20'+n['length']+',\x20expected\x2032\x20or\x2033\x20bytes');}}else h=i;const j={'value':Buffer['from'](g['signature']['slice'](0x2),'hex')['toString']('base64'),'publicKey':h,'algorithm':'Ed25519','address':g['address']};let k;if(e['meta']['signature']){const o=Array['isArray'](e['meta']['signature'])?[...e['meta']['signature']]:[e['meta']['signature']],p=o['findIndex'](q=>q['publicKey']===h);p>=0x0?(o[p]=j,k=o):k=[...o,j];}else k=[j];const l={...e,'meta':{...e['meta'],'signature':k}};let m;if(c)m=c;else{const q=a181b['dirname'](a),r=a181b['extname'](a),s=a181b['basename'](a,r);m=a181b['join'](q,'signed_'+s+r);}return save_wts(l,m),m;}export async function wts2html(a,b={}){const c=await import('fs'),d=await import('path'),e=c['statSync'](a);if(e['isDirectory']()){const g=c['readdirSync'](a),h=g['filter'](j=>j['endsWith']('.wts'));if(h['length']===0x0)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'No\x20.wts\x20files\x20found\x20in\x20directory:\x20'+a);const i=[];for(const j of h){const k=d['join'](a,j),l=await convertWtsToHtml(k,b),m=j['replace']('.wts','.html'),n=b['outputPath']?d['join'](b['outputPath'],m):d['join'](a,m),o=d['dirname'](n);!c['existsSync'](o)&&c['mkdirSync'](o,{'recursive':!![]}),c['writeFileSync'](n,l,'utf-8'),i['push'](n);}return i;}const f=await convertWtsToHtml(a,b);if(b['outputPath']){const p=d['basename'](a)['replace']('.wts','.html'),q=d['join'](b['outputPath'],p),r=d['dirname'](q);return!c['existsSync'](r)&&c['mkdirSync'](r,{'recursive':!![]}),c['writeFileSync'](q,f,'utf-8'),q;}return f;}async function convertWtsToHtml(a,b={}){const {title:title='WTS\x20Document',theme:theme='light'}=b,c=await verify_wts(a),d=load_wts(a),{payload:e,meta:f}=d,{bgColor:g,textColor:h,borderColor:i}=getThemeColors(theme),j=f['creator'];let k=-0x1;for(const l of e['messages']){l['to']['toLowerCase']()===j['toLowerCase']()&&(l['lastReceivedLeafIndex']!==undefined&&l['lastReceivedLeafIndex']>=0x0&&(l['lastReceivedLeafIndex']>k&&(k=l['lastReceivedLeafIndex'])));}return generateHtmlPage({'title':title,'theme':theme,'bgColor':g,'textColor':h,'borderColor':i,'meta':f,'payload':e,'verifyResult':c,'maxLastReceivedLeafIndex':k,'myAddress':j});}export async function proof_message(a,b,c){const d=await Account['Instance']()['get_address'](a);!d&&W_ERROR(WErrors['AccountNotFound'],'proof_message.account\x20'+a);const e=new MessageStorage(d),f=e['getMessageById'](b);if(!f)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20not\x20found:\x20'+b);if(f['fromAddress']['toLowerCase']()!==d['toLowerCase']()&&f['toAddress']['toLowerCase']()!==d['toLowerCase']())throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20does\x20not\x20belong\x20to\x20account\x20'+d);if(!f['serverSignature'])throw new MessengerError(MessengerErrorCode['INVALID_PROOF'],'Message\x20does\x20not\x20have\x20server\x20signature');if(!f['serverPublicKey'])throw new MessengerError(MessengerErrorCode['INVALID_PROOF'],'Message\x20does\x20not\x20have\x20server\x20public\x20key');if(!f['plaintext'])throw new MessengerError(MessengerErrorCode['INVALID_PROOF'],'Message\x20does\x20not\x20have\x20plaintext');const {verifyMessage:g}=await import('./crypto.js'),h={'messageId':f['messageId'],'plaintext':f['plaintext'],'plaintextHash':f['plaintextHash'],'createdAt':f['createdAt'],'guardAddress':f['guardAddress'],'passportAddress':f['passportAddress'],'lastReceivedLeafIndex':f['lastReceivedLeafIndex'],'serverSignature':f['serverSignature'],'serverPublicKey':f['serverPublicKey']};if(f['newRoot']&&f['leafIndex']!==undefined){if(!f['serverTimestamp'])throw new MessengerError(MessengerErrorCode['INVALID_PROOF'],'Message\x20'+f['messageId']+'\x20missing\x20server\x20timestamp\x20for\x20verification');h['merkleMetadata']={'newRoot':f['newRoot'],'prevRoot':f['prevRoot'],'leafIndex':f['leafIndex'],'serverTimestamp':f['serverTimestamp']};}const i=g(h);if(!i['valid'])throw new MessengerError(MessengerErrorCode['INVALID_PROOF'],'Message\x20verification\x20failed:\x20'+i['error']);if(!f['serverPublicKey'])throw new MessengerError(MessengerErrorCode['INVALID_PROOF'],'Message\x20does\x20not\x20have\x20server\x20public\x20key');const {CallProof:j}=await import('../call/proof.js'),k=new j({'proof':f['newRoot'],'server_pubkey':f['serverPublicKey'],'server_signature':f['serverSignature'],'proof_type':CHAIN_PROOF_TYPE,'description':'Message\x20proof\x20for\x20'+b,'item_count':f['leafIndex']??0x1,'about_address':f['fromAddress']['toLowerCase']()===d['toLowerCase']()?f['toAddress']:f['fromAddress']}),l={'network':c,'account':d},m=await k['call'](l),{ResponseData:n}=await import('../call/base.js'),o=n(m),p=o['find'](q=>q['type']==='Proof');if(!p||!p['object'])throw new MessengerError(MessengerErrorCode['INVALID_PROOF'],'Failed\x20to\x20get\x20proof\x20address\x20from\x20transaction\x20result');return f['proof']=p['object'],e['saveMessage'](f),{'proofAddress':p['object']};}const MIN_PASSPORT_VALIDITY=0xa,MAX_PASSPORT_VALIDITY=0xa*0x16d*0x18*0x3c*0x3c,MAX_BLACKLIST_SIZE_ONCE=0x64,MAX_FRIENDS_SIZE_ONCE=0x64,MAX_GUARDS_SIZE_ONCE=0xa;export async function blacklist(a){const b=await Account['Instance']()['get_address'](a['account']);!b&&W_ERROR(WErrors['AccountNotFound'],'blacklist.account\x20'+a['account']);const c=getMessengerManager();!isInitialized&&await c['start']();await c['ensureAccountReady'](b);switch(a['op']){case'add':{let d=await GetManyAccountOrMark_Address(a['users']);d['length']===0x0&&W_ERROR(WErrors['InvalidParam'],'blacklist.add.users\x20'+a['users']+'\x20have\x20not\x20valid\x20addresses');d=[...new Set(d['map'](f=>f['toLowerCase']()))];d['length']>MAX_BLACKLIST_SIZE_ONCE&&W_ERROR(WErrors['InvalidParam'],'blacklist.add.users\x20'+a['users']+'\x20have\x20too\x20many\x20addresses,\x20max\x20'+MAX_BLACKLIST_SIZE_ONCE);const e=await c['addToBlacklist'](b,d);return{'op':'add','result':e};}case'remove':{let f=await GetManyAccountOrMark_Address(a['users']);f['length']===0x0&&W_ERROR(WErrors['InvalidParam'],'blacklist.remove.users\x20'+a['users']+'\x20have\x20not\x20valid\x20addresses');f=[...new Set(f['map'](h=>h['toLowerCase']()))];f['length']>MAX_BLACKLIST_SIZE_ONCE&&W_ERROR(WErrors['InvalidParam'],'blacklist.remove.users\x20'+a['users']+'\x20have\x20too\x20many\x20addresses,\x20max\x20'+MAX_BLACKLIST_SIZE_ONCE);const g=await c['removeFromBlacklist'](b,f);return{'op':'remove','result':g};}case'clear':{const h=await c['clearBlacklist'](b);return{'op':'clear','result':h};}case'get':{const i=await c['getBlacklist'](b);return{'op':'get','result':i};}case'exist':{let j=await GetManyAccountOrMark_Address(a['users']);j['length']===0x0&&W_ERROR(WErrors['InvalidParam'],'blacklist.exist.users\x20'+a['users']+'\x20have\x20not\x20valid\x20addresses');j=[...new Set(j['map'](l=>l['toLowerCase']()))];j['length']>MAX_BLACKLIST_SIZE_ONCE&&W_ERROR(WErrors['InvalidParam'],'blacklist.exist.users\x20'+a['users']+'\x20have\x20too\x20many\x20addresses,\x20max\x20'+MAX_BLACKLIST_SIZE_ONCE);const k=await c['existInBlacklist'](b,j);return{'op':'exist','result':k};}default:throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'blacklist.unknown\x20op:\x20'+a);}}export async function friendslist(a){const b=await Account['Instance']()['get_address'](a['account']);!b&&W_ERROR(WErrors['AccountNotFound'],'friendslist.account\x20'+a['account']);const c=getMessengerManager();!isInitialized&&await c['start']();await c['ensureAccountReady'](b);switch(a['op']){case'add':{let d=await GetManyAccountOrMark_Address(a['users']);d['length']===0x0&&W_ERROR(WErrors['InvalidParam'],'friendslist.add.users\x20'+a['users']+'\x20have\x20not\x20valid\x20addresses');d=[...new Set(d['map'](f=>f['toLowerCase']()))];const e=await c['addToFriendsList'](b,d);return{'op':'add','result':e};}case'remove':{let f=await GetManyAccountOrMark_Address(a['users']);f['length']===0x0&&W_ERROR(WErrors['InvalidParam'],'friendslist.remove.users\x20'+a['users']+'\x20have\x20not\x20valid\x20addresses');f=[...new Set(f['map'](h=>h['toLowerCase']()))];f['length']>MAX_FRIENDS_SIZE_ONCE&&W_ERROR(WErrors['InvalidParam'],'friendslist.remove.users\x20'+a['users']+'\x20have\x20too\x20many\x20addresses,\x20max\x20'+MAX_FRIENDS_SIZE_ONCE);const g=await c['removeFromFriendsList'](b,f);return{'op':'remove','result':g};}case'clear':{const h=await c['clearFriendsList'](b);return{'op':'clear','result':h};}case'get':{const i=await c['getFriendsList'](b);return{'op':'get','result':i};}case'exist':{let j=await GetManyAccountOrMark_Address(a['users']);j['length']===0x0&&W_ERROR(WErrors['InvalidParam'],'friendslist.exist.users\x20'+a['users']+'\x20have\x20not\x20valid\x20addresses');j=[...new Set(j['map'](l=>l['toLowerCase']()))];j['length']>MAX_FRIENDS_SIZE_ONCE&&W_ERROR(WErrors['InvalidParam'],'friendslist.exist.users\x20'+a['users']+'\x20have\x20too\x20many\x20addresses,\x20max\x20'+MAX_FRIENDS_SIZE_ONCE);const k=await c['existInFriendsList'](b,j);return{'op':'exist','result':k};}default:throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'friendslist.unknown\x20op:\x20'+a);}}export async function guardlist(a){const b=await Account['Instance']()['get_address'](a['account']);!b&&W_ERROR(WErrors['AccountNotFound'],'guardlist.account\x20'+a['account']);const c=getMessengerManager();!isInitialized&&await c['start']();await c['ensureAccountReady'](b);switch(a['op']){case'add':{const d=new Map();for(const k of a['guards']){d['set'](k['guard']['toLowerCase'](),k);}const e=Array['from'](d['values']());e['length']===0x0&&W_ERROR(WErrors['InvalidParam'],'guardlist.add.guards\x20'+a['guards']+'\x20have\x20not\x20valid\x20guards');e['length']>MAX_GUARDS_SIZE_ONCE&&W_ERROR(WErrors['InvalidParam'],'guardlist.add.guards\x20'+a['guards']+'\x20have\x20too\x20many\x20guards,\x20max\x20'+MAX_GUARDS_SIZE_ONCE);for(const l of e){(!isValidU64(l['passportValiditySeconds'])||l['passportValiditySeconds']<MIN_PASSPORT_VALIDITY||l['passportValiditySeconds']>MAX_PASSPORT_VALIDITY)&&W_ERROR(WErrors['InvalidParam'],'Guard\x20'+l['guard']+':\x20passport\x20validity\x20'+l['passportValiditySeconds']+'\x20must\x20be\x20between\x20'+MIN_PASSPORT_VALIDITY+'\x20and\x20'+MAX_PASSPORT_VALIDITY+'\x20seconds');}const f=await LocalMark['Instance']()['get_many_address'](e['map'](m=>m['guard']));if(f['length']!==e['length']){const m=new Set(f),n=[];for(const o of e){!m['has'](o['guard'])&&!o['guard']['startsWith']('0x')&&n['push'](o['guard']);}W_ERROR(WErrors['InvalidParam'],'Guard\x20not\x20found:\x20'+n['join'](',\x20'));}const h=await query_objects({'objects':f,'no_cache':![],'network':c['getConfig']()['network']});(!h||!h['objects']||h['objects']['length']===0x0)&&W_ERROR(WErrors['InvalidParam'],'Guard\x20not\x20found:\x20'+e['map'](p=>p['guard'])['join'](',\x20'));h['objects']['forEach'](p=>{p['type']!=='Guard'&&W_ERROR(WErrors['InvalidParam'],'Guard\x20'+p['object']+'\x20is\x20not\x20a\x20Guard');});const i=e['map']((p,q)=>({'guardAddress':f[q],'passportValiditySeconds':p['passportValiditySeconds']})),j=await c['addToGuardList'](b,i);return{'op':'add','result':j};}case'remove':{const p=[...new Set(a['guards']['map'](s=>s['toLowerCase']()))];p['length']===0x0&&W_ERROR(WErrors['InvalidParam'],'guardlist.remove.guards\x20'+a['guards']+'\x20have\x20not\x20valid\x20guards');p['length']>MAX_GUARDS_SIZE_ONCE&&W_ERROR(WErrors['InvalidParam'],'guardlist.remove.guards\x20'+a['guards']+'\x20have\x20too\x20many\x20guards,\x20max\x20'+MAX_GUARDS_SIZE_ONCE);const q=await LocalMark['Instance']()['get_many_address'](p);if(q['length']!==p['length']){const s=new Set(q),t=[];for(const u of p){!s['has'](u)&&!u['startsWith']('0x')&&t['push'](u);}W_ERROR(WErrors['InvalidParam'],'Guard\x20not\x20found:\x20'+t['join'](',\x20'));}const r=await c['removeFromGuardList'](b,q);return{'op':'remove','result':r};}case'get':{const v=await c['getGuardList'](b);return{'op':'get','result':v};}default:throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'guardlist.unknown\x20op:\x20'+a);}}export async function settings(a){const b=await Account['Instance']()['get_address'](a['account']);!b&&W_ERROR(WErrors['AccountNotFound'],'settings.account\x20'+a['account']);const c=getMessengerManager();!isInitialized&&await c['start']();await c['ensureAccountReady'](b);switch(a['op']){case'get':{const d=await c['getSettings'](b);return{'op':'get','result':d};}case'set':{const e={};a['allowStrangerMessages']!==undefined&&(e['allowStrangerMessages']=a['allowStrangerMessages']);a['maxInboxSize']!==undefined&&(e['maxInboxSize']=a['maxInboxSize']);const f=await c['setSettings'](b,e);return{'op':'set','result':f};}default:throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'settings.unknown\x20op:\x20'+a);}}
|
|
1
|
+
import{MessengerManager}from'./messenger-manager.js';import{Account}from'../local/account.js';import{W_ERROR,WErrors}from'../exception.js';import{LocalMark}from'../local/local.js';import{MessageStorage}from'./storage.js';import{MessengerError,MessengerErrorCode,CHAIN_PROOF_TYPE,MessageDirection}from'./types.js';import{createHash}from'crypto';import*as a166a from'fs';import*as a166b from'path';import{isValidU64}from'../common.js';import{verifySingleMerkleRoot,hashPlaintext,verifyFalcon512Signature}from'./crypto.js';import{canonicalizeJson}from'./utils.js';import{generateHtmlPage,getThemeColors}from'./templates/wts-html-template.js';import{GetAccountOrMark_Address,GetManyAccountOrMark_Address}from'../local/index.js';import{query_objects}from'../query/object.js';import{Messenger}from'./messenger.js';let managerInstance=null,isInitialized=![],startPromise=null,backgroundTimer=null;async function autoRegisterMessengerAccounts(){const a=await Account['Instance']()['list_messenger_accounts']();for(const b of a){if(!b['address']||!b['m'])continue;try{const c=new Messenger(b['address']);await c['initialize']();}catch(d){console['error']('Failed\x20to\x20initialize\x20account\x20'+b['address']+':',d);}}}export function getMessengerManager(){return!managerInstance&&(managerInstance=new MessengerManager()),!isInitialized&&(isInitialized=!![],startPromise=autoRegisterMessengerAccounts()['then'](()=>{return managerInstance['start']();})['catch'](a=>{return console['error']('Failed\x20to\x20auto-register\x20messenger\x20accounts:',a),managerInstance['start']();})['catch'](a=>{console['error']('Failed\x20to\x20auto-start\x20messenger\x20manager:',a);})),managerInstance;}function registerCleanupHandler(){const a=()=>{backgroundTimer&&(clearInterval(backgroundTimer),backgroundTimer=null),managerInstance&&managerInstance['stop']();};process['on']('exit',a),process['on']('SIGINT',()=>{a(),process['exit']();}),process['on']('SIGTERM',()=>{a(),process['exit']();});}registerCleanupHandler();export async function watch_conversations(a){const b=await Account['Instance']()['get_address'](a?.['account']);!b&&W_ERROR(WErrors['AccountNotFound'],'watch_conversations.account\x20'+a?.['account']);const c=b['toLowerCase'](),d=getMessengerManager();startPromise&&await startPromise;const e=await d['ensureAccountReady'](b);await e['messenger']['pullMessages']();const f=new MessageStorage(c),g=f['getAllMessages'](c),h=new Map(),i=a?.['previewMessageCount']??0x2,j=a?.['skipAutoMarkViewed']??![];for(const n of g){const o=n['fromAddress']['toLowerCase']()===c?n['toAddress']:n['fromAddress'];!h['has'](o)&&h['set'](o,{'peerAddress':o,'lastMessageAt':n['createdAt'],'messageCount':0x0,'unreadCount':0x0,'lastMessagePreview':n['plaintext'],'messages':[]});const p=h['get'](o);p['messages']['push'](n),p['messageCount']++,n['createdAt']>p['lastMessageAt']&&(p['lastMessageAt']=n['createdAt'],p['lastMessagePreview']=n['plaintext']),n['direction']===MessageDirection['RECEIVED']&&n['viewedAt']===undefined&&p['unreadCount']++;}const k=[];for(const [,q]of h){if(a?.['startTime']!==undefined&&q['lastMessageAt']<a['startTime'])continue;if(a?.['endTime']!==undefined&&q['lastMessageAt']>a['endTime'])continue;if(a?.['unreadOnly']&&q['unreadCount']===0x0)continue;const r=[];if(i>0x0){const s=q['messages']['sort']((u,v)=>v['createdAt']-u['createdAt']),t=s['slice'](0x0,i);r['push'](...t['reverse']());if(!j){const u=t['filter'](v=>v['direction']===MessageDirection['RECEIVED']&&v['viewedAt']===undefined)['map'](v=>v['messageId']);u['length']>0x0&&f['updateMessagesViewed'](u);}}k['push']({'peerAddress':q['peerAddress'],'lastMessageAt':q['lastMessageAt'],'messageCount':q['messageCount'],'unreadCount':q['unreadCount'],'lastMessagePreview':q['lastMessagePreview'],...i>0x0&&{'previewMessages':r}});}const l=a?.['sortBy']??'lastMessageAt',m=a?.['sortOrder']??'desc';return k['sort']((v,w)=>{let x=0x0;switch(l){case'lastMessageAt':x=v['lastMessageAt']-w['lastMessageAt'];break;case'unreadCount':x=v['unreadCount']-w['unreadCount'];break;case'messageCount':x=v['messageCount']-w['messageCount'];break;}return m==='asc'?x:-x;}),k;}export async function mark_messages_as_viewed(a,b){if(!a||a['length']===0x0)return 0x0;const c=await Account['Instance']()['get_address'](b);!c&&W_ERROR(WErrors['AccountNotFound'],'mark_messages_as_viewed.account\x20'+b);const d=c['toLowerCase'](),e=new MessageStorage(d);return e['updateMessagesViewed'](a);}export async function mark_conversation_as_viewed(a,b){const c=await Account['Instance']()['get_address'](b);!c&&W_ERROR(WErrors['AccountNotFound'],'mark_conversation_as_viewed.account\x20'+b);const d=c['toLowerCase'](),e=await GetAccountOrMark_Address(a);!e&&W_ERROR(WErrors['AccountNotFound'],'mark_conversation_as_viewed.peerAddress\x20'+a+'\x20is\x20not\x20a\x20valid\x20account/address');const f=e['toLowerCase'](),g=new MessageStorage(d),h=g['getMessagesBySession'](d,f),i=h['filter'](j=>j['direction']===MessageDirection['RECEIVED']&&j['viewedAt']===undefined)['map'](j=>j['messageId']);if(i['length']===0x0)return 0x0;return g['updateMessagesViewed'](i);}export async function send_message(a,b,c,d){const e=await Account['Instance']()['get_address'](a);!e&&W_ERROR(WErrors['AccountNotFound'],'send_message.from\x20'+a);const f=await GetAccountOrMark_Address(b);!f&&W_ERROR(WErrors['AccountNotFound'],'send_message.to\x20'+b+'\x20is\x20not\x20a\x20valid\x20account/address');d?.['guardAddress']!=null&&d?.['passportAddress']!=null&&([d['guardAddress'],d['passportAddress']]=await LocalMark['Instance']()['get_many_address']([d['guardAddress'],d['passportAddress']]),(!d['guardAddress']||!d['passportAddress'])&&W_ERROR(WErrors['AccountNotFound'],'send_message.guardAddress\x20or\x20passportAddress\x20not\x20found'));const g=getMessengerManager();return startPromise&&await startPromise,g['send'](e,f,c,d);}export async function send_file(a,b,c,d){const e=await Account['Instance']()['get_address'](a);!e&&W_ERROR(WErrors['AccountNotFound'],'send_file.from\x20'+a);const f=await GetAccountOrMark_Address(b);!f&&W_ERROR(WErrors['AccountNotFound'],'send_file.to\x20'+b+'\x20is\x20not\x20a\x20valid\x20account/address');d?.['guardAddress']!=null&&d?.['passportAddress']!=null&&([d['guardAddress'],d['passportAddress']]=await LocalMark['Instance']()['get_many_address']([d['guardAddress'],d['passportAddress']]),(!d['guardAddress']||!d['passportAddress'])&&W_ERROR(WErrors['AccountNotFound'],'send_file.guardAddress\x20or\x20passportAddress\x20not\x20found'));const g=getMessengerManager();return startPromise&&await startPromise,g['send_file'](e,f,c,d);}export async function watch_messages(a){a?.['account']!==undefined&&(a['account']=await Account['Instance']()['get_address'](a['account']),!a['account']&&W_ERROR(WErrors['AccountNotFound'],'watch_messages.account\x20'+a['account']));a?.['customListFilter']?.['includeAddresses']!=null&&(a['customListFilter']['includeAddresses']=(await Account['Instance']()['get_many_address'](a['customListFilter']['includeAddresses']))['filter'](e=>e!=null));a?.['customListFilter']?.['excludeAddresses']!=null&&(a['customListFilter']['excludeAddresses']=(await Account['Instance']()['get_many_address'](a['customListFilter']['excludeAddresses']))['filter'](e=>e!=null));const b=getMessengerManager();startPromise&&await startPromise;const c=await b['watch'](a),d=a?.['skipAutoMarkViewed']??![];if(!d&&c['length']>0x0&&a?.['account']){const e=a['account']['toLowerCase'](),f=new MessageStorage(e),g=c['filter'](h=>h['direction']===MessageDirection['RECEIVED']&&h['viewedAt']===undefined)['map'](h=>h['messageId']);g['length']>0x0&&f['updateMessagesViewed'](g);}return c;}export async function pull_messages(a,b){const c=await Account['Instance']()['get_address'](a);!c&&W_ERROR(WErrors['AccountNotFound'],'pull_messages.account\x20'+a);const d=getMessengerManager();startPromise&&await startPromise;const e=await d['ensureAccountReady'](c),f=await e['messenger']['pullMessages'](b);return f['messages']['map'](g=>g);}async function extract_zip_message(a,b){if(!a['zipMetadata'])throw new MessengerError(MessengerErrorCode['INVALID_MESSAGE_TYPE'],'Message\x20is\x20not\x20a\x20ZIP\x20archive');if(!a['plaintext'])throw new MessengerError(MessengerErrorCode['MESSAGE_NOT_DECRYPTED'],'Message\x20plaintext\x20not\x20available');const c=a['plaintext'],d=Buffer['from'](c,'base64');if(a['zipMetadata']?.['fileHash']){const k=createHash('sha256')['update'](d)['digest']('hex'),l=a['zipMetadata']['fileHash']['replace']('0x','');if(k!==l)throw new MessengerError(MessengerErrorCode['HASH_MISMATCH'],'ZIP\x20file\x20hash\x20mismatch:\x20expected\x20'+l+',\x20got\x20'+k);}const {ZipReader:e,BlobReader:f,BlobWriter:g}=await import('@zip.js/zip.js'),h=new e(new f(new Blob([d]))),i=await h['getEntries']();!a166a['existsSync'](b)&&a166a['mkdirSync'](b,{'recursive':!![]});const j=[];for(const m of i){if(!m['directory']){const n=m,o=new g(),p=await n['getData'](o),q=Buffer['from'](await p['arrayBuffer']()),r=a166b['join'](b,m['filename']);a166a['writeFileSync'](r,q),j['push'](r);}}await h['close']();if(j['length']>0x0&&a['zipMetadata']){const s={'fileName':a['zipMetadata']['fileName'],'fileSize':a['zipMetadata']['fileSize'],'fileHash':a['zipMetadata']['fileHash'],'contentType':a['zipMetadata']['contentType'],'localCachePath':j[0x0],'downloadedAt':Date['now']()};a['zipMetadata']=s;const t=a['direction']==='sent'?a['fromAddress']:a['toAddress'],u=new MessageStorage(t);u['saveMessage'](a);}return j[0x0]||'';}export async function extract_zip_messages(a,b,c){const d=[],f=await Account['Instance']()['get_address'](a);if(!f)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'account\x20is\x20required\x20when\x20extracting\x20by\x20message\x20IDs');for(const g of b){try{let h;if(typeof g==='string'){const j=g,k=new MessageStorage(f),l=k['getMessageById'](j);if(!l){console['error']('Message\x20not\x20found:\x20'+j);continue;}h=l;}else h=g;if(!h['zipMetadata']){console['error']('Message\x20'+h['messageId']+'\x20is\x20not\x20a\x20ZIP\x20archive');continue;}const i=await extract_zip_message(h,c);d['push'](i);}catch(m){const n=typeof g==='string'?g:g['messageId'];console['error']('Failed\x20to\x20extract\x20message\x20'+n+':',m);}}return d;}export async function generate_wts(a){const b=await Account['Instance']()['get_address'](a['myAccount']);!b&&W_ERROR(WErrors['AccountNotFound'],'generate_wts.myAccount\x20'+a['myAccount']);const c=await GetAccountOrMark_Address(a['peerAccount']);return!c&&W_ERROR(WErrors['AccountNotFound'],'generate_wts.peerAccount\x20'+a['peerAccount']),getMessengerManager()['generate_wts'](a['outputDir'],b,c,a['range'],a['excludePlaintext']);}function load_wts(a){const b=a166a['readFileSync'](a,'utf-8');return JSON['parse'](b);}function save_wts(a,b){const c=a166b['dirname'](b);!a166a['existsSync'](c)&&a166a['mkdirSync'](c,{'recursive':!![]}),a166a['writeFileSync'](b,JSON['stringify'](a,null,0x2),'utf-8');}function resolveServerPublicKey(a,b){if(b['serverPublicKeys']&&a['serverPublicKeyIndex']!==undefined&&a['serverPublicKeyIndex']>=0x0&&a['serverPublicKeyIndex']<b['serverPublicKeys']['length'])return b['serverPublicKeys'][a['serverPublicKeyIndex']]['publicKey'];const c=a;if(c['serverPublicKey'])return c['serverPublicKey'];return null;}export async function verify_wts(a){try{const b=load_wts(a);if(!b['payload']||!b['meta'])return{'valid':![],'error':'Invalid\x20WTS\x20file\x20structure'};if(b['meta']['type']!=='wts')return{'valid':![],'error':'Invalid\x20meta.type:\x20'+b['meta']['type']};const {payload:c,meta:d}=b,e=[...c['messages']]['sort']((n,o)=>{if(n['leafIndex']===undefined||o['leafIndex']===undefined)return 0x0;return n['leafIndex']-o['leafIndex'];});for(let n=0x0;n<e['length'];n++){const o=e[n];if(!o)return{'valid':![],'error':'Message\x20'+n+':\x20Message\x20is\x20null\x20or\x20undefined'};if(!o['prevRoot'])return{'valid':![],'error':'Message\x20'+n+':\x20Missing\x20prevRoot'};if(!o['merkleRoot'])return{'valid':![],'error':'Message\x20'+n+':\x20Missing\x20merkleRoot'};if(!o['plaintextHash'])return{'valid':![],'error':'Message\x20'+n+':\x20Missing\x20plaintextHash'};if(o['timestamp']===undefined||o['timestamp']===null)return{'valid':![],'error':'Message\x20'+n+':\x20Missing\x20timestamp'};if(o['leafIndex']===undefined||o['leafIndex']===null)return{'valid':![],'error':'Message\x20'+n+':\x20Missing\x20leafIndex'};const p=verifySingleMerkleRoot(o['prevRoot'],o['merkleRoot'],o['plaintextHash'],o['timestamp'],o['leafIndex']);if(!p['valid'])return{'valid':![],'error':p['error']+'\x20at\x20message\x20'+n+',\x20leafIndex\x20'+o['leafIndex']};if(n>0x0){const q=e[n-0x1];if(o['leafIndex']!==q['leafIndex']+0x1)return{'valid':![],'error':'Merkle\x20chain\x20discontinuity:\x20leafIndex\x20'+q['leafIndex']+'\x20->\x20'+o['leafIndex']+'\x20(expected\x20'+(q['leafIndex']+0x1)+')'};if(o['prevRoot']['toLowerCase']()!==q['merkleRoot']['toLowerCase']())return{'valid':![],'error':'Merkle\x20root\x20mismatch\x20at\x20leafIndex\x20'+o['leafIndex']+':\x20expected\x20prevRoot='+q['merkleRoot']+',\x20got\x20'+o['prevRoot']};}}for(let r=0x0;r<c['messages']['length'];r++){const s=c['messages'][r];if(!s)return{'valid':![],'error':'Message\x20'+r+':\x20Message\x20is\x20null\x20or\x20undefined'};const t=!!s['zipMetadata'];if(!t){if(!s['plaintextHash']['startsWith']('0x')||s['plaintextHash']['length']!==0x42)return{'valid':![],'error':'Message\x20'+r+':\x20Invalid\x20plaintextHash\x20format'};if(s['plaintext']){const v=hashPlaintext(s['plaintext'],s['clientTimestamp'],s['guardAddress'],s['passportAddress'],s['lastReceivedLeafIndex']);if(v['toLowerCase']()!==s['plaintextHash']['toLowerCase']())return{'valid':![],'error':'Message\x20'+r+':\x20Plaintext\x20hash\x20mismatch'};}}const u=resolveServerPublicKey(s,d);if(s['serverSignature']&&u){if(!s['timestamp'])return{'valid':![],'error':'Message\x20'+r+':\x20Missing\x20timestamp\x20for\x20signature\x20verification'};if(!s['merkleRoot'])return{'valid':![],'error':'Message\x20'+r+':\x20Missing\x20merkleRoot\x20for\x20signature\x20verification'};if(!s['prevRoot'])return{'valid':![],'error':'Message\x20'+r+':\x20Missing\x20prevRoot\x20for\x20signature\x20verification'};const w=s['prevRoot']+':'+s['merkleRoot']+':'+s['timestamp']+':'+u,x=verifyFalcon512Signature(u,w,s['serverSignature']);if(!x)return{'valid':![],'error':'Message\x20'+r+':\x20Server\x20signature\x20verification\x20failed'};}}const {sha256:f}=await import('@noble/hashes/sha256'),{bytesToHex:g}=await import('@noble/hashes/utils'),h={'wts':b['wts'],...c},j=g(f(new TextEncoder()['encode'](canonicalizeJson(h))));if(j!==d['hash'])return{'valid':![],'error':'Hash\x20mismatch\x20-\x20content\x20has\x20been\x20tampered','hashValid':![],'hasSignature':!!d['signature']};if(d['messageCount']!==c['messages']['length'])return{'valid':![],'error':'messageCount\x20mismatch:\x20meta='+d['messageCount']+',\x20actual='+c['messages']['length'],'hashValid':!![],'hasSignature':!!d['signature']};const k=c['messages'][c['messages']['length']-0x1];if(d['merkleRoot']['toLowerCase']()!==k['merkleRoot']['toLowerCase']())return{'valid':![],'error':'merkleRoot\x20mismatch:\x20meta='+d['merkleRoot']+',\x20lastMessage='+k['merkleRoot'],'hashValid':!![],'hasSignature':!!d['signature']};const l=[];let m;if(d['signature']){const {Falcon512PublicKey:y}=await import('../../keypairs/falcon512/publickey.js'),{signature:z,...A}=d,B=g(f(new TextEncoder()['encode'](canonicalizeJson(A)))),C=Array['isArray'](d['signature'])?d['signature']:[d['signature']];let D=!![];for(const E of C){let F;const G=E['publicKey'];if(G['startsWith']('0x')){const H=Buffer['from'](G['slice'](0x2),'hex');if(H['length']===0x382)F=H['slice'](0x1);else{if(H['length']===0x381)F=H;else{let I;try{const J=new y(G['slice'](0x2));I=J['toWAddress']();}catch{}l['push']({'publicKey':G,'address':I,'valid':![]}),D=![];continue;}}}else try{const K=Buffer['from'](G,'base64');if(K['length']===0x382)F=K['slice'](0x1);else{if(K['length']===0x381)F=K;else{let L;try{const M=new y(G);L=M['toWAddress']();}catch{}l['push']({'publicKey':G,'address':L,'valid':![]}),D=![];continue;}}}catch{F=Buffer['from'](G,'base64');}try{const N=new y(F),O=Uint8Array['from'](Buffer['from'](E['value'],'base64')),P=await N['verify'](new TextEncoder()['encode'](B),O);let Q;try{Q=N['toWAddress']();}catch{}l['push']({'publicKey':G,'address':Q,'valid':P}),!P&&(D=![]);}catch{let R;try{const S=new y(F);R=S['toWAddress']();}catch{}l['push']({'publicKey':G,'address':R,'valid':![]}),D=![];}}m=D;if(!m){const T=l['filter'](U=>!U['valid']&&U['address'])['map'](U=>U['address']);return{'valid':![],'error':'Signatures\x20from\x20the\x20following\x20addresses\x20are\x20invalid:\x20'+T['join'](',\x20'),'hashValid':!![],'hasSignature':!![],'signatureValid':![],'signatures':l};}}return{'valid':!![],'hashValid':!![],'hasSignature':!!d['signature'],'signatureValid':m,'signatures':l['length']>0x0?l:undefined};}catch(U){return{'valid':![],'error':'Verification\x20error:\x20'+U,'hashValid':![],'hasSignature':![]};}}export async function sign_wts(a,b,c){const d=await verify_wts(a);if(!d['valid'])throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'WTS\x20file\x20verification\x20failed:\x20'+d['error']);const e=load_wts(a),f=await Account['Instance']()['get_address'](b);!f&&W_ERROR(WErrors['AccountNotFound'],'sign_wts.account\x20'+b);const {sha256:g}=await import('@noble/hashes/sha256'),{bytesToHex:h}=await import('@noble/hashes/utils'),{signature:i,...j}=e['meta'],k=h(g(new TextEncoder()['encode'](canonicalizeJson(j)))),l=await Account['Instance']()['signData'](f,k);let m;const n=l['publicKey'];if(n['startsWith']('0x')){const s=Buffer['from'](n['slice'](0x2),'hex');if(s['length']===0x382)m=s['slice'](0x1)['toString']('base64');else{if(s['length']===0x381)m=s['toString']('base64');else throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Invalid\x20public\x20key\x20length:\x20'+s['length']+',\x20expected\x20897\x20or\x20898\x20bytes');}}else m=n;const o={'value':Buffer['from'](l['signature']['slice'](0x2),'hex')['toString']('base64'),'publicKey':m,'algorithm':'Falcon512','address':l['address']};let p;if(e['meta']['signature']){const t=Array['isArray'](e['meta']['signature'])?[...e['meta']['signature']]:[e['meta']['signature']],u=t['findIndex'](v=>v['publicKey']===m);u>=0x0?(t[u]=o,p=t):p=[...t,o];}else p=[o];const q={...e,'meta':{...e['meta'],'signature':p}};let r;if(c)r=c;else{const v=a166b['dirname'](a),w=a166b['extname'](a),x=a166b['basename'](a,w);r=a166b['join'](v,'signed_'+x+w);}return save_wts(q,r),r;}export async function wts2html(a,b={}){const c=await import('fs'),d=await import('path'),e=c['statSync'](a);if(e['isDirectory']()){const g=c['readdirSync'](a),h=g['filter'](j=>j['endsWith']('.wts'));if(h['length']===0x0)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'No\x20.wts\x20files\x20found\x20in\x20directory:\x20'+a);const i=[];for(const j of h){const k=d['join'](a,j),l=await convertWtsToHtml(k,b),m=j['replace']('.wts','.html'),n=b['outputPath']?d['join'](b['outputPath'],m):d['join'](a,m),o=d['dirname'](n);!c['existsSync'](o)&&c['mkdirSync'](o,{'recursive':!![]}),c['writeFileSync'](n,l,'utf-8'),i['push'](n);}return i;}const f=await convertWtsToHtml(a,b);if(b['outputPath']){const p=d['basename'](a)['replace']('.wts','.html'),q=d['join'](b['outputPath'],p),r=d['dirname'](q);return!c['existsSync'](r)&&c['mkdirSync'](r,{'recursive':!![]}),c['writeFileSync'](q,f,'utf-8'),q;}return f;}async function convertWtsToHtml(a,b={}){const {title:title='WTS\x20Document',theme:theme='light'}=b,c=await verify_wts(a),d=load_wts(a),{payload:e,meta:f}=d,{bgColor:g,textColor:h,borderColor:i}=getThemeColors(theme),j=f['creator'];let k=-0x1;for(const l of e['messages']){l['to']['toLowerCase']()===j['toLowerCase']()&&(l['lastReceivedLeafIndex']!==undefined&&l['lastReceivedLeafIndex']>=0x0&&(l['lastReceivedLeafIndex']>k&&(k=l['lastReceivedLeafIndex'])));}return generateHtmlPage({'title':title,'theme':theme,'bgColor':g,'textColor':h,'borderColor':i,'meta':f,'payload':e,'verifyResult':c,'maxLastReceivedLeafIndex':k,'myAddress':j});}export async function proof_message(a,b,c){const d=await Account['Instance']()['get_address'](a);!d&&W_ERROR(WErrors['AccountNotFound'],'proof_message.account\x20'+a);const e=new MessageStorage(d),f=e['getMessageById'](b);if(!f)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20not\x20found:\x20'+b);if(f['fromAddress']['toLowerCase']()!==d['toLowerCase']()&&f['toAddress']['toLowerCase']()!==d['toLowerCase']())throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20does\x20not\x20belong\x20to\x20account\x20'+d);if(!f['serverSignature'])throw new MessengerError(MessengerErrorCode['INVALID_PROOF'],'Message\x20does\x20not\x20have\x20server\x20signature');if(!f['serverPublicKey'])throw new MessengerError(MessengerErrorCode['INVALID_PROOF'],'Message\x20does\x20not\x20have\x20server\x20public\x20key');if(!f['plaintext'])throw new MessengerError(MessengerErrorCode['INVALID_PROOF'],'Message\x20does\x20not\x20have\x20plaintext');const {verifyMessage:g}=await import('./crypto.js'),h={'messageId':f['messageId'],'plaintext':f['plaintext'],'plaintextHash':f['plaintextHash'],'createdAt':f['createdAt'],'guardAddress':f['guardAddress'],'passportAddress':f['passportAddress'],'lastReceivedLeafIndex':f['lastReceivedLeafIndex'],'serverSignature':f['serverSignature'],'serverPublicKey':f['serverPublicKey']};if(f['newRoot']&&f['leafIndex']!==undefined){if(!f['serverTimestamp'])throw new MessengerError(MessengerErrorCode['INVALID_PROOF'],'Message\x20'+f['messageId']+'\x20missing\x20server\x20timestamp\x20for\x20verification');h['merkleMetadata']={'newRoot':f['newRoot'],'prevRoot':f['prevRoot'],'leafIndex':f['leafIndex'],'serverTimestamp':f['serverTimestamp']};}const i=g(h);if(!i['valid'])throw new MessengerError(MessengerErrorCode['INVALID_PROOF'],'Message\x20verification\x20failed:\x20'+i['error']);if(!f['serverPublicKey'])throw new MessengerError(MessengerErrorCode['INVALID_PROOF'],'Message\x20does\x20not\x20have\x20server\x20public\x20key');const {CallProof:j}=await import('../call/proof.js'),k=new j({'proof':f['newRoot'],'server_pubkey':f['serverPublicKey'],'server_signature':f['serverSignature'],'proof_type':CHAIN_PROOF_TYPE,'description':'Message\x20proof\x20for\x20'+b,'item_count':f['leafIndex']??0x1,'about_address':f['fromAddress']['toLowerCase']()===d['toLowerCase']()?f['toAddress']:f['fromAddress']}),l={'network':c,'account':d},m=await k['call'](l),{ResponseData:n}=await import('../call/base.js'),o=n(m),p=o['find'](q=>q['type']==='Proof');if(!p||!p['object'])throw new MessengerError(MessengerErrorCode['INVALID_PROOF'],'Failed\x20to\x20get\x20proof\x20address\x20from\x20transaction\x20result');return f['proof']=p['object'],e['saveMessage'](f),{'proofAddress':p['object']};}const MIN_PASSPORT_VALIDITY=0xa,MAX_PASSPORT_VALIDITY=0xa*0x16d*0x18*0x3c*0x3c,MAX_BLACKLIST_SIZE_ONCE=0x64,MAX_FRIENDS_SIZE_ONCE=0x64,MAX_GUARDS_SIZE_ONCE=0xa;export async function blacklist(a){const b=await Account['Instance']()['get_address'](a['account']);!b&&W_ERROR(WErrors['AccountNotFound'],'blacklist.account\x20'+a['account']);const c=getMessengerManager();startPromise&&await startPromise;await c['ensureAccountReady'](b);switch(a['op']){case'add':{let d=await GetManyAccountOrMark_Address(a['users']);d['length']===0x0&&W_ERROR(WErrors['InvalidParam'],'blacklist.add.users\x20'+a['users']+'\x20have\x20not\x20valid\x20addresses');d=[...new Set(d['map'](f=>f['toLowerCase']()))];d['length']>MAX_BLACKLIST_SIZE_ONCE&&W_ERROR(WErrors['InvalidParam'],'blacklist.add.users\x20'+a['users']+'\x20have\x20too\x20many\x20addresses,\x20max\x20'+MAX_BLACKLIST_SIZE_ONCE);const e=await c['addToBlacklist'](b,d);return{'op':'add','result':e};}case'remove':{let f=await GetManyAccountOrMark_Address(a['users']);f['length']===0x0&&W_ERROR(WErrors['InvalidParam'],'blacklist.remove.users\x20'+a['users']+'\x20have\x20not\x20valid\x20addresses');f=[...new Set(f['map'](h=>h['toLowerCase']()))];f['length']>MAX_BLACKLIST_SIZE_ONCE&&W_ERROR(WErrors['InvalidParam'],'blacklist.remove.users\x20'+a['users']+'\x20have\x20too\x20many\x20addresses,\x20max\x20'+MAX_BLACKLIST_SIZE_ONCE);const g=await c['removeFromBlacklist'](b,f);return{'op':'remove','result':g};}case'clear':{const h=await c['clearBlacklist'](b);return{'op':'clear','result':h};}case'get':{const i=await c['getBlacklist'](b);return{'op':'get','result':i};}case'exist':{let j=await GetManyAccountOrMark_Address(a['users']);j['length']===0x0&&W_ERROR(WErrors['InvalidParam'],'blacklist.exist.users\x20'+a['users']+'\x20have\x20not\x20valid\x20addresses');j=[...new Set(j['map'](l=>l['toLowerCase']()))];j['length']>MAX_BLACKLIST_SIZE_ONCE&&W_ERROR(WErrors['InvalidParam'],'blacklist.exist.users\x20'+a['users']+'\x20have\x20too\x20many\x20addresses,\x20max\x20'+MAX_BLACKLIST_SIZE_ONCE);const k=await c['existInBlacklist'](b,j);return{'op':'exist','result':k};}default:throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'blacklist.unknown\x20op:\x20'+a);}}export async function friendslist(a){const b=await Account['Instance']()['get_address'](a['account']);!b&&W_ERROR(WErrors['AccountNotFound'],'friendslist.account\x20'+a['account']);const c=getMessengerManager();startPromise&&await startPromise;await c['ensureAccountReady'](b);switch(a['op']){case'add':{let d=await GetManyAccountOrMark_Address(a['users']);d['length']===0x0&&W_ERROR(WErrors['InvalidParam'],'friendslist.add.users\x20'+a['users']+'\x20have\x20not\x20valid\x20addresses');d=[...new Set(d['map'](f=>f['toLowerCase']()))];const e=await c['addToFriendsList'](b,d);return{'op':'add','result':e};}case'remove':{let f=await GetManyAccountOrMark_Address(a['users']);f['length']===0x0&&W_ERROR(WErrors['InvalidParam'],'friendslist.remove.users\x20'+a['users']+'\x20have\x20not\x20valid\x20addresses');f=[...new Set(f['map'](h=>h['toLowerCase']()))];f['length']>MAX_FRIENDS_SIZE_ONCE&&W_ERROR(WErrors['InvalidParam'],'friendslist.remove.users\x20'+a['users']+'\x20have\x20too\x20many\x20addresses,\x20max\x20'+MAX_FRIENDS_SIZE_ONCE);const g=await c['removeFromFriendsList'](b,f);return{'op':'remove','result':g};}case'clear':{const h=await c['clearFriendsList'](b);return{'op':'clear','result':h};}case'get':{const i=await c['getFriendsList'](b);return{'op':'get','result':i};}case'exist':{let j=await GetManyAccountOrMark_Address(a['users']);j['length']===0x0&&W_ERROR(WErrors['InvalidParam'],'friendslist.exist.users\x20'+a['users']+'\x20have\x20not\x20valid\x20addresses');j=[...new Set(j['map'](l=>l['toLowerCase']()))];j['length']>MAX_FRIENDS_SIZE_ONCE&&W_ERROR(WErrors['InvalidParam'],'friendslist.exist.users\x20'+a['users']+'\x20have\x20too\x20many\x20addresses,\x20max\x20'+MAX_FRIENDS_SIZE_ONCE);const k=await c['existInFriendsList'](b,j);return{'op':'exist','result':k};}default:throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'friendslist.unknown\x20op:\x20'+a);}}export async function guardlist(a){const b=await Account['Instance']()['get_address'](a['account']);!b&&W_ERROR(WErrors['AccountNotFound'],'guardlist.account\x20'+a['account']);const c=getMessengerManager();startPromise&&await startPromise;await c['ensureAccountReady'](b);switch(a['op']){case'add':{const d=new Map();for(const k of a['guards']){d['set'](k['guard']['toLowerCase'](),k);}const e=Array['from'](d['values']());e['length']===0x0&&W_ERROR(WErrors['InvalidParam'],'guardlist.add.guards\x20'+a['guards']+'\x20have\x20not\x20valid\x20guards');e['length']>MAX_GUARDS_SIZE_ONCE&&W_ERROR(WErrors['InvalidParam'],'guardlist.add.guards\x20'+a['guards']+'\x20have\x20too\x20many\x20guards,\x20max\x20'+MAX_GUARDS_SIZE_ONCE);for(const l of e){(!isValidU64(l['passportValiditySeconds'])||l['passportValiditySeconds']<MIN_PASSPORT_VALIDITY||l['passportValiditySeconds']>MAX_PASSPORT_VALIDITY)&&W_ERROR(WErrors['InvalidParam'],'Guard\x20'+l['guard']+':\x20passport\x20validity\x20'+l['passportValiditySeconds']+'\x20must\x20be\x20between\x20'+MIN_PASSPORT_VALIDITY+'\x20and\x20'+MAX_PASSPORT_VALIDITY+'\x20seconds');}const f=await LocalMark['Instance']()['get_many_address'](e['map'](m=>m['guard']));if(f['length']!==e['length']){const m=new Set(f),n=[];for(const o of e){!m['has'](o['guard'])&&!o['guard']['startsWith']('0x')&&n['push'](o['guard']);}W_ERROR(WErrors['InvalidParam'],'Guard\x20not\x20found:\x20'+n['join'](',\x20'));}const h=await query_objects({'objects':f,'no_cache':![],'network':c['getConfig']()['network']});(!h||!h['objects']||h['objects']['length']===0x0)&&W_ERROR(WErrors['InvalidParam'],'Guard\x20not\x20found:\x20'+e['map'](p=>p['guard'])['join'](',\x20'));h['objects']['forEach'](p=>{p['type']!=='Guard'&&W_ERROR(WErrors['InvalidParam'],'Guard\x20'+p['object']+'\x20is\x20not\x20a\x20Guard');});const i=e['map']((p,q)=>({'guardAddress':f[q],'passportValiditySeconds':p['passportValiditySeconds']})),j=await c['addToGuardList'](b,i);return{'op':'add','result':j};}case'remove':{const p=[...new Set(a['guards']['map'](s=>s['toLowerCase']()))];p['length']===0x0&&W_ERROR(WErrors['InvalidParam'],'guardlist.remove.guards\x20'+a['guards']+'\x20have\x20not\x20valid\x20guards');p['length']>MAX_GUARDS_SIZE_ONCE&&W_ERROR(WErrors['InvalidParam'],'guardlist.remove.guards\x20'+a['guards']+'\x20have\x20too\x20many\x20guards,\x20max\x20'+MAX_GUARDS_SIZE_ONCE);const q=await LocalMark['Instance']()['get_many_address'](p);if(q['length']!==p['length']){const s=new Set(q),t=[];for(const u of p){!s['has'](u)&&!u['startsWith']('0x')&&t['push'](u);}W_ERROR(WErrors['InvalidParam'],'Guard\x20not\x20found:\x20'+t['join'](',\x20'));}const r=await c['removeFromGuardList'](b,q);return{'op':'remove','result':r};}case'get':{const v=await c['getGuardList'](b);return{'op':'get','result':v};}default:throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'guardlist.unknown\x20op:\x20'+a);}}export async function settings(a){const b=await Account['Instance']()['get_address'](a['account']);!b&&W_ERROR(WErrors['AccountNotFound'],'settings.account\x20'+a['account']);const c=getMessengerManager();startPromise&&await startPromise;await c['ensureAccountReady'](b);switch(a['op']){case'get':{const d=await c['getSettings'](b);return{'op':'get','result':d};}case'set':{const e={};a['allowStrangerMessages']!==undefined&&(e['allowStrangerMessages']=a['allowStrangerMessages']);a['maxInboxSize']!==undefined&&(e['maxInboxSize']=a['maxInboxSize']);const f=await c['setSettings'](b,e);return{'op':'set','result':f};}default:throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'settings.unknown\x20op:\x20'+a);}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Messenger}from'./messenger.js';import{MessageStorage}from'./storage.js';import{MessengerPersistStorage}from'./storage.js';import{MessageType,MessageStatus,WTS_MAX_MESSAGE_COUNT,WTS_SCHEMA_URL}from'./types.js';import{MessengerError,MessengerErrorCode,DEFAULT_MESSENGER_CONFIG}from'./types.js';import{canonicalizeJson}from'./utils.js';import{MAX_MESSENGER_ACCOUNTS}from'../local/account.js';import{GetAccountOrMark_Address}from'../local/index.js';const MAX_ACCOUNTS=MAX_MESSENGER_ACCOUNTS,sleep=a=>new Promise(b=>setTimeout(b,a));export class MessengerManager{['accounts']=new Map();['config'];['messageListeners']=new Set();['isWatching']=![];['persistStorage'];['instanceId'];['accountRefreshTimer']=null;['pollingLockedAccounts']=new Set();constructor(a){this['config']={...DEFAULT_MESSENGER_CONFIG,...a?.['messengerConfig']},this['instanceId']=a?.['instanceId']||'default',this['persistStorage']=new MessengerPersistStorage();}['findAccount'](a){return this['accounts']['get'](a['toLowerCase']());}['getConfig'](){return this['config'];}['get_accounts'](){return Array['from'](this['accounts']['values']())['map'](a=>a['address']);}async['refresh_accounts'](){const {Account:a}=await import('../local/account.js'),b=await a['Instance']()['list_messenger_accounts'](),c=new Set(this['accounts']['keys']()),d=new Set(b['map'](e=>e['address']['toLowerCase']()));for(const e of c){!d['has'](e)&&this['remove_account_internal'](e);}for(const f of b){const g=f['address']['toLowerCase']();if(!this['accounts']['has'](g))try{await this['add_account_internal'](f['address']);}catch(h){}}if(this['accounts']['size']>0x0&&!this['isWatching'])this['startPolling']();else this['accounts']['size']===0x0&&this['isWatching']&&this['stopPolling']();await this['syncAllContactLists']();}async['start'](){await this['refresh_accounts']();for(const a of this['accounts']['values']()){const b=this['persistStorage']['tryAcquirePollingLock'](a['address'],this['instanceId']);if(b)this['pollingLockedAccounts']['add'](a['address']['toLowerCase']()),a['messenger']['setOnMessageCallback'](c=>{for(const d of this['messageListeners']){d(c);}});else{}}!this['isWatching']&&this['startPolling'](),this['accountRefreshTimer']&&clearInterval(this['accountRefreshTimer']),this['accountRefreshTimer']=setInterval(()=>{this['refresh_accounts']()['catch'](c=>{});},this['config']['watch_interval_ms']);}['stop'](){this['accountRefreshTimer']&&(clearInterval(this['accountRefreshTimer']),this['accountRefreshTimer']=null);for(const a of this['pollingLockedAccounts']){this['persistStorage']['releasePollingLock'](a,this['instanceId']);}this['pollingLockedAccounts']['clear'](),this['stopPolling'](),this['clear_accounts']();}async['ensureAccountReady'](a){const b=a['toLowerCase'](),c=this['accounts']['get'](b);if(c?.['initialized'])return c;if(c?.['initializing']){await c['initializing'];const d=this['accounts']['get'](b);if(d?.['initialized'])return d;throw new MessengerError(MessengerErrorCode['SERVER_ERROR'],'Account\x20'+a+'\x20initialization\x20failed');}return this['initializeAccount'](b);}async['initializeAccount'](a){const b=a['toLowerCase']();if(this['accounts']['size']>=MAX_ACCOUNTS)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Maximum\x20'+MAX_ACCOUNTS+'\x20accounts\x20allowed');const c=this['doInitialize'](b),d={'address':b,'messenger':null,'initialized':![],'initializing':c,'contactLists':{'friends':[],'guards':[],'lastUpdatedAt':0x0}};this['accounts']['set'](b,d);try{await c;const e=this['accounts']['get'](b);if(!e||!e['initialized'])throw new MessengerError(MessengerErrorCode['SERVER_ERROR'],'Account\x20'+a+'\x20initialization\x20failed');return e;}catch(f){this['accounts']['delete'](b);throw f;}}async['doInitialize'](a){const b=new Messenger(a,this['config']);try{await b['initialize']();}catch(d){throw new MessengerError(MessengerErrorCode['SERVER_ERROR'],'Failed\x20to\x20initialize\x20account\x20'+a+':\x20'+(d instanceof Error?d['message']:String(d)));}await sleep(0x3e8);const c={'friends':[],'guards':[],'lastUpdatedAt':0x0};this['accounts']['set'](a,{'address':a,'messenger':b,'initialized':!![],'contactLists':c});if(this['isWatching']){const e=this['persistStorage']['tryAcquirePollingLock'](a,this['instanceId']);e&&(this['pollingLockedAccounts']['add'](a),b['setOnMessageCallback'](f=>{for(const g of this['messageListeners']){g(f);}}));}}async['add_account_internal'](a){await this['ensureAccountReady'](a);}['remove_account_internal'](a){const b=a['toLowerCase'](),c=this['accounts']['get'](b);if(!c)return![];return c['initialized']&&c['messenger']&&c['messenger']['disconnect'](),this['persistStorage']['releasePollingLock'](b,this['instanceId']),this['pollingLockedAccounts']['delete'](b),this['accounts']['delete'](b);}['clear_accounts'](){this['stopPolling']();for(const a of this['accounts']['values']()){a['messenger']&&a['messenger']['disconnect']();}this['accounts']['clear']();}async['send'](a,b,c,d){const {Account:e}=await import('../local/account.js'),f=await e['Instance']()['get'](a,![]);if(!f)throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'Account\x20'+a+'\x20not\x20found');if(f['m']==null){if(d?.['new_messenger_name']==null)throw new MessengerError(MessengerErrorCode['ACCOUNT_MESSENGER_NOT_ENABLED'],'Account\x20messenger\x20name\x20not\x20set.\x20Use\x20new_messenger_name\x20parameter\x20to\x20set\x20it\x20automatically.');await e['Instance']()['set_messenger'](a,d['new_messenger_name']);}const g=await this['ensureAccountReady'](a);if(d?.['new_messenger_name']!=null){const h=await e['Instance']()['get'](a,![]);h&&h['m']!==d['new_messenger_name']&&await e['Instance']()['set_messenger'](a,d['new_messenger_name']);}return g['messenger']['sendMessage'](b,c,{'guardAddress':d?.['guardAddress'],'passportAddress':d?.['passportAddress'],'force':d?.['force']});}async['send_file'](a,b,c,d){const {Account:e}=await import('../local/account.js'),f=await e['Instance']()['get'](a,![]);if(!f)throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'Account\x20'+a+'\x20not\x20found');if(f['m']==null){if(d?.['new_messenger_name']==null)throw new MessengerError(MessengerErrorCode['ACCOUNT_MESSENGER_NOT_ENABLED'],'Account\x20messenger\x20name\x20not\x20set.\x20Use\x20new_messenger_name\x20parameter\x20to\x20set\x20it\x20automatically.');await e['Instance']()['set_messenger'](a,d['new_messenger_name']);}const g=await this['ensureAccountReady'](a);if(d?.['new_messenger_name']!=null){const h=await e['Instance']()['get'](a,![]);h&&h['m']!==d['new_messenger_name']&&await e['Instance']()['set_messenger'](a,d['new_messenger_name']);}return g['messenger']['sendZipFile'](b,c,{'fileName':d?.['fileName'],'contentType':d?.['contentType'],'guardAddress':d?.['guardAddress'],'passportAddress':d?.['passportAddress'],'force':d?.['force']});}async['watch'](a){let b=[];if(a?.['account']!==undefined){const i=a['account']['toLowerCase'](),j=this['accounts']['get'](i);j?.['messenger']&&await j['messenger']['pullMessages']();const k=new MessageStorage(i);b=k['getAllMessages'](i);}else for(const l of this['accounts']['values']()){l['messenger']&&await l['messenger']['pullMessages']();const m=new MessageStorage(l['address']),n=m['getAllMessages'](l['address']);b['push'](...n);}if(a){const o=a['peerAddress']?await GetAccountOrMark_Address(a['peerAddress']):undefined;b=b['filter'](p=>{if(a?.['account']!==undefined){const r=a['account']['toLowerCase'](),s=p['fromAddress']['toLowerCase'](),t=p['toAddress']['toLowerCase']();if(s!==r&&t!==r)return![];}if(a['direction']&&p['direction']!==a['direction'])return![];if(a['status']&&p['status']!==a['status'])return![];if(a['msgType']!==undefined&&p['msgType']!==a['msgType'])return![];if(a['contentType'])switch(a['contentType']){case'text':if(p['msgType']!==MessageType['NORMAL_MESSAGE'])return![];break;case'zip':if(!p['zipMetadata'])return![];break;case'wts':if(!p['zipMetadata']||p['zipMetadata']?.['contentType']!=='wts')return![];break;case'wip':if(!p['zipMetadata']||p['zipMetadata']?.['contentType']!=='wip')return![];break;}if(a['peerAddress']&&o){const u=o['toLowerCase'](),v=p['fromAddress']['toLowerCase'](),w=p['toAddress']['toLowerCase']();if(v!==u&&w!==u)return![];}const q=a['timeField']||'createdAt';if(a['startTime']!==undefined||a['endTime']!==undefined){const x=p[q];if(x!==undefined){if(a['startTime']!==undefined&&x<a['startTime'])return![];if(a['endTime']!==undefined&&x>a['endTime'])return![];}}if(a['createdAtStart']!==undefined&&p['createdAt']<a['createdAtStart'])return![];if(a['createdAtEnd']!==undefined&&p['createdAt']>a['createdAtEnd'])return![];if(a['receivedAtStart']!==undefined){if(p['receivedAt']===undefined||p['receivedAt']<a['receivedAtStart'])return![];}if(a['receivedAtEnd']!==undefined){if(p['receivedAt']===undefined||p['receivedAt']>a['receivedAtEnd'])return![];}if(a['serverTimestampStart']!==undefined){if(p['serverTimestamp']===undefined||p['serverTimestamp']<a['serverTimestampStart'])return![];}if(a['serverTimestampEnd']!==undefined){if(p['serverTimestamp']===undefined||p['serverTimestamp']>a['serverTimestampEnd'])return![];}if(a['decryptedOnly']&&!p['plaintext'])return![];if(a['confirmedOnly']&&p['status']!==MessageStatus['CONFIRMED'])return![];if(a['arkConfirmedOnly']){if(!p['arkConfirmed'])return![];}if(a['proofedOnly']){if(!p['proof'])return![];}if(a['arkTimestampStart']!==undefined){if(p['arkConfirmed']===undefined||p['arkConfirmed']['timestamp']<a['arkTimestampStart'])return![];}if(a['arkTimestampEnd']!==undefined){if(p['arkConfirmed']===undefined||p['arkConfirmed']['timestamp']>a['arkTimestampEnd'])return![];}if(a['hasLastReceivedIndexOnly']){if(p['lastReceivedLeafIndex']===undefined||p['lastReceivedLeafIndex']===null)return![];}if(a['lastReceivedIndexMin']!==undefined){if(p['lastReceivedLeafIndex']===undefined||p['lastReceivedLeafIndex']<a['lastReceivedIndexMin'])return![];}if(a['lastReceivedIndexMax']!==undefined){if(p['lastReceivedLeafIndex']===undefined||p['lastReceivedLeafIndex']>a['lastReceivedIndexMax'])return![];}if(a['keyword']&&p['plaintext']){if(!p['plaintext']['toLowerCase']()['includes'](a['keyword']['toLowerCase']()))return![];}if(a['listFilterMode']&&a['listFilterMode']!=='any'){const y=this['findAccount'](p['toAddress']);if(!y)return![];const z=p['fromAddress']['toLowerCase'](),A=y['contactLists'],B=new Set(A['friends']['map'](G=>G['toLowerCase']())),C=new Set(A['guards']['map'](G=>G['guardAddress']['toLowerCase']())),D=B['has'](z),E=C['has'](z),F=!D&&!E;switch(a['listFilterMode']){case'friends':if(!D)return![];break;case'guard':if(!E)return![];break;case'stranger':if(!F)return![];break;}if(a['customListFilter']){const {includeAddresses:G,excludeAddresses:H,relation:relation='union'}=a['customListFilter'];if(H){const I=new Set(H['map'](J=>J['toLowerCase']()));if(I['has'](z))return![];}if(G&&G['length']>0x0){const J=new Set(G['map'](L=>L['toLowerCase']())),K=J['has'](z);if(relation==='union'){const L=a['listFilterMode']==='friends'&&D||a['listFilterMode']==='guard'&&E||a['listFilterMode']==='stranger'&&F;if(!K&&!L)return![];}else{if(!K)return![];}}}}if(a['viewed']!==undefined){const M=p['viewedAt']!==undefined;if(a['viewed']!==M)return![];}if(a['viewedAtStart']!==undefined){if(p['viewedAt']===undefined||p['viewedAt']<a['viewedAtStart'])return![];}if(a['viewedAtEnd']!==undefined){if(p['viewedAt']===undefined||p['viewedAt']>a['viewedAtEnd'])return![];}return!![];});}const c=a?.['sortOrder']??'desc',d=a?.['timeField']||'createdAt';b['sort']((p,q)=>{const r=p[d]||0x0,s=q[d]||0x0;return c==='asc'?r-s:s-r;});const {MAX_QUERY_LIMIT:e}=await import('./types.js'),f=this['config']['defaultQueryLimit']??0x32,g=Math['min'](a?.['limit']??f,e),h=a?.['offset']??0x0;return b=b['slice'](h,h+g),b;}['startPolling'](){if(this['isWatching'])return;this['isWatching']=!![];}['stopPolling'](){this['isWatching']=![];}['onMessage'](a){this['messageListeners']['add'](a);}['offMessage'](a){this['messageListeners']['delete'](a);}['destroy'](){this['stop'](),this['messageListeners']['clear']();}async['syncContactLists'](a){const b=this['findAccount'](a);if(!b)return{'success':![],'friends':[],'guards':[],'error':'Account\x20not\x20found:\x20'+a};try{const [c,d]=await Promise['all']([b['messenger']['getFriendsList'](),b['messenger']['getGuardList']()]),e=d['currentGuardList']||[];return b['contactLists']={'friends':c,'guards':e,'lastUpdatedAt':Date['now']()},{'success':!![],'friends':c,'guards':e};}catch(f){return{'success':![],'friends':b['contactLists']['friends'],'guards':b['contactLists']['guards'],'error':f instanceof Error?f['message']:String(f)};}}async['syncAllContactLists'](){const a=new Map();for(const b of this['accounts']['values']()){const c=await this['syncContactLists'](b['address']);a['set'](b['address'],c);}return a;}['getContactLists'](a){const b=this['findAccount'](a);return b?.['contactLists'];}['setContactLists'](a,b){const c=this['findAccount'](a);if(!c)return![];return c['contactLists']={...c['contactLists'],...b,'lastUpdatedAt':Date['now']()},!![];}['isStranger'](a,b){const c=this['findAccount'](a);if(!c)return!![];const d=b['toLowerCase'](),e=c['contactLists'],f=e['friends']['some'](h=>h['toLowerCase']()===d),g=e['guards']['some'](h=>h['guardAddress']['toLowerCase']()===d);return!f&&!g;}['recordGuardSender'](a,b){const c=this['findAccount'](a);if(!c)return![];const d=b['toLowerCase'](),e=c['contactLists']['guards']['some'](f=>f['guardAddress']['toLowerCase']()===d);return!e&&(c['contactLists']['guards']['push']({'guardAddress':b,'passportValiditySeconds':0x15180}),c['contactLists']['lastUpdatedAt']=Date['now']()),!![];}['generateNonce'](){return Math['random']()['toString'](0x24)['substring'](0x2,0xf)+Math['random']()['toString'](0x24)['substring'](0x2,0xf);}async['watch_paginated'](a){const {MAX_QUERY_LIMIT:b}=await import('./types.js'),c=await this['watch'](a),d=c['length'],e=this['config']['defaultQueryLimit']??0x32,f=Math['min'](a?.['limit']??e,b),g=a?.['offset']??0x0,h=c['slice'](g,g+f);return{'messages':h,'total':d,'offset':g,'limit':f};}async['get_conversations'](a){const b=a?{'account':a}:undefined,c=await this['watch'](b),d=new Map();for(const e of c){const f=a?.['toLowerCase'](),g=e['fromAddress']['toLowerCase']()===f?e['toAddress']:e['fromAddress'];!d['has'](g)&&d['set'](g,{'peerAddress':g,'lastMessageAt':e['createdAt'],'messageCount':0x0,'unreadCount':0x0,'lastMessagePreview':e['plaintext']});const h=d['get'](g);h['messageCount']++,e['createdAt']>h['lastMessageAt']&&(h['lastMessageAt']=e['createdAt'],h['lastMessagePreview']=e['plaintext']),e['status']!==MessageStatus['READ']&&e['toAddress']['toLowerCase']()===f&&h['unreadCount']++;}return Array['from'](d['values']())['sort']((i,j)=>j['lastMessageAt']-i['lastMessageAt']);}async['generate_wts'](a,b,c,d,e){const f=await import('fs'),g=await import('path'),h=b['toLowerCase'](),k=c['toLowerCase'](),l=new MessageStorage(h),m=l['getAllMessages'](h);let n=m['filter'](w=>{const x=w['fromAddress']['toLowerCase'](),y=w['toAddress']['toLowerCase'](),z=x===h&&y===k||x===k&&y===h;return z;});n=n['filter'](w=>w['leafIndex']!==undefined&&w['serverTimestamp']!==undefined)['reduce']((w,x)=>{const y=w['find'](z=>z['messageId']===x['messageId']);return!y&&w['push'](x),w;},[])['sort']((w,x)=>{const y=w['serverTimestamp']-x['serverTimestamp'];if(y!==0x0)return y;return w['leafIndex']-x['leafIndex'];});if(d)switch(d['type']){case'time':{const w=Math['min'](d['start'],d['end']),x=Math['max'](d['start'],d['end']);n=n['filter'](y=>y['createdAt']>=w&&y['createdAt']<=x);break;}case'messageId':{const y=d['start'],z=d['end'];n=n['filter'](A=>A['messageId']>=y&&A['messageId']<=z);break;}case'seqIndex':{const A=Math['min'](d['start'],d['end']),B=Math['max'](d['start'],d['end']);n=n['filter'](C=>C['leafIndex']>=A&&C['leafIndex']<=B);break;}}if(n['length']===0x0)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'No\x20messages\x20found\x20for\x20the\x20given\x20criteria');const o=n['map'](C=>C['leafIndex'])['filter'](C=>C!==undefined)['sort']((C,D)=>C-D),p=[];for(let C=0x1;C<o['length'];C++){const D=o[C-0x1]+0x1,E=o[C];if(E!==D)for(let F=D;F<E;F++){p['push'](F);}}if(p['length']>0x0){}if(n['length']>WTS_MAX_MESSAGE_COUNT)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20count\x20('+n['length']+')\x20exceeds\x20maximum\x20allowed\x20('+WTS_MAX_MESSAGE_COUNT+')');!f['existsSync'](a)&&f['mkdirSync'](a,{'recursive':!![]});const q=h['slice'](0x0,0x6)+'_'+k['slice'](0x0,0x6),r=[];let s=[];for(let G=0x0;G<n['length'];G++){const H=n[G];if(s['length']===0x0)s['push'](H);else{const I=s[s['length']-0x1],J=I['leafIndex']+0x1;s['length']>=WTS_MAX_MESSAGE_COUNT||H['leafIndex']!==J?(r['push'](s),s=[H]):s['push'](H);}}s['length']>0x0&&r['push'](s);r['forEach']((K,L)=>{const M=K['map'](N=>N['leafIndex'])['join'](',\x20');});const t=[];for(const K of r){const L=K['map'](a2=>a2['leafIndex'])['filter'](a2=>a2!==undefined),M=Math['min'](...L),N=Math['max'](...L),O=K[0x0]['createdAt'],P=K[K['length']-0x1]['createdAt'];for(const a2 of K){if(a2['serverTimestamp']===undefined)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20'+a2['messageId']+'\x20missing\x20serverTimestamp');if(a2['leafIndex']===undefined)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20'+a2['messageId']+'\x20missing\x20leafIndex');if(!a2['prevRoot'])throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20'+a2['messageId']+'\x20missing\x20prevRoot');if(!a2['newRoot'])throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20'+a2['messageId']+'\x20missing\x20newRoot');if(!a2['serverSignature'])throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20'+a2['messageId']+'\x20missing\x20serverSignature');}const Q=K['map'](a3=>{const a4={'id':a3['messageId'],'from':a3['fromAddress'],'to':a3['toAddress'],'plaintextHash':a3['plaintextHash'],'clientTimestamp':a3['createdAt'],'timestamp':a3['serverTimestamp'],'leafIndex':a3['leafIndex'],'prevRoot':a3['prevRoot'],'merkleRoot':a3['newRoot'],'serverSignature':a3['serverSignature'],'serverPublicKey':a3['serverPublicKey']||'','msgType':a3['msgType']};return!e&&a3['plaintext']!==undefined&&(a4['plaintext']=a3['plaintext']),a3['guardAddress']!==undefined&&(a4['guardAddress']=a3['guardAddress']),a3['passportAddress']!==undefined&&(a4['passportAddress']=a3['passportAddress']),a3['arkConfirmed']!==undefined&&(a4['arkConfirmed']={'recipient':a3['arkConfirmed']['recipient'],'recipientPublicKey':a3['arkConfirmed']['recipientPublicKey'],'signature':a3['arkConfirmed']['signature'],'timestamp':a3['arkConfirmed']['timestamp']}),a3['zipMetadata']!==undefined&&(a4['zipMetadata']=a3['zipMetadata']),a3['lastReceivedLeafIndex']!==undefined&&a3['lastReceivedLeafIndex']!==-0x1&&(a4['lastReceivedLeafIndex']=a3['lastReceivedLeafIndex']),a4;}),R=[h,k]['sort'](),S={'participants':R},T={'session':S,'messages':Q},{sha256:U}=await import('@noble/hashes/sha256'),{bytesToHex:V}=await import('@noble/hashes/utils'),W=canonicalizeJson(T),X='sha256:'+V(U(new TextEncoder()['encode'](W))),Y={'type':'wts','version':'1.0','created':new Date()['toISOString'](),'hash':X,'algorithm':'sha256','startTime':O,'endTime':P,'messageCount':Q['length'],'merkleRoot':Q[Q['length']-0x1]['merkleRoot'],'creator':h,'participant':k},Z={'wts':WTS_SCHEMA_URL,'payload':T,'meta':Y},a0=q+'_'+M+'-'+N+'.wts',a1=g['join'](a,a0);f['writeFileSync'](a1,JSON['stringify'](Z,null,0x2)),t['push'](a1);}const u=n[0x0]?.['createdAt']||0x0,v=n[n['length']-0x1]?.['createdAt']||0x0;return{'files':t,'totalMessageCount':n['length'],'timeRange':{'start':u,'end':v}};}async['addToBlacklist'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['addToBlacklist'](b);}async['removeFromBlacklist'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['removeFromBlacklist'](b);}async['clearBlacklist'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['clearBlacklist']();}async['getBlacklist'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['getBlacklist']();}async['existInBlacklist'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['existInBlacklist'](b);}async['addToFriendsList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['addToFriendsList'](b);}async['removeFromFriendsList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['removeFromFriendsList'](b);}async['clearFriendsList'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['clearFriendsList']();}async['getFriendsList'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['getFriendsList']();}async['existInFriendsList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['existInFriendsList'](b);}async['addToGuardList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['addToGuardList'](b);}async['removeFromGuardList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['removeFromGuardList'](b);}async['getGuardList'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['getGuardList']();}async['getSettings'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['getSettings']();}async['setSettings'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['setSettings'](b);}}
|
|
1
|
+
import{Messenger}from'./messenger.js';import{MessageStorage}from'./storage.js';import{MessengerPersistStorage}from'./storage.js';import{MessageType,MessageStatus,WTS_MAX_MESSAGE_COUNT,WTS_SCHEMA_URL}from'./types.js';import{MessengerError,MessengerErrorCode,DEFAULT_MESSENGER_CONFIG}from'./types.js';import{canonicalizeJson}from'./utils.js';import{MAX_MESSENGER_ACCOUNTS}from'../local/account.js';import{GetAccountOrMark_Address}from'../local/index.js';const MAX_ACCOUNTS=MAX_MESSENGER_ACCOUNTS,sleep=a=>new Promise(b=>setTimeout(b,a));export class MessengerManager{['accounts']=new Map();['config'];['messageListeners']=new Set();['isWatching']=![];['persistStorage'];['instanceId'];['accountRefreshTimer']=null;['pollingLockedAccounts']=new Set();constructor(a){this['config']={...DEFAULT_MESSENGER_CONFIG,...a?.['messengerConfig']},this['instanceId']=a?.['instanceId']||'default',this['persistStorage']=new MessengerPersistStorage();}['findAccount'](a){return this['accounts']['get'](a['toLowerCase']());}['getConfig'](){return this['config'];}['get_accounts'](){return Array['from'](this['accounts']['values']())['map'](a=>a['address']);}async['refresh_accounts'](){const {Account:a}=await import('../local/account.js'),b=await a['Instance']()['list_messenger_accounts'](),c=new Set(this['accounts']['keys']()),d=new Set(b['map'](e=>e['address']['toLowerCase']()));for(const e of c){!d['has'](e)&&this['remove_account_internal'](e);}for(const f of b){const g=f['address']['toLowerCase']();if(!this['accounts']['has'](g))try{await this['add_account_internal'](f['address']);}catch(h){}}if(this['accounts']['size']>0x0&&!this['isWatching'])this['startPolling']();else this['accounts']['size']===0x0&&this['isWatching']&&this['stopPolling']();await this['syncAllContactLists']();}async['start'](){await this['refresh_accounts']();for(const a of this['accounts']['values']()){if(!a['initialized']||!a['messenger'])continue;const b=this['persistStorage']['tryAcquirePollingLock'](a['address'],this['instanceId']);b&&(this['pollingLockedAccounts']['add'](a['address']['toLowerCase']()),a['messenger']['setOnMessageCallback'](c=>{for(const d of this['messageListeners']){d(c);}}));}!this['isWatching']&&this['startPolling'](),this['accountRefreshTimer']&&clearInterval(this['accountRefreshTimer']),this['accountRefreshTimer']=setInterval(()=>{this['refresh_accounts']()['catch'](c=>{});},this['config']['watch_interval_ms']);}['stop'](){this['accountRefreshTimer']&&(clearInterval(this['accountRefreshTimer']),this['accountRefreshTimer']=null);for(const a of this['pollingLockedAccounts']){this['persistStorage']['releasePollingLock'](a,this['instanceId']);}this['pollingLockedAccounts']['clear'](),this['stopPolling'](),this['clear_accounts']();}async['ensureAccountReady'](a){const b=a['toLowerCase'](),c=this['accounts']['get'](b);if(c?.['initialized'])return c;if(c?.['initializing']){await c['initializing'];const d=this['accounts']['get'](b);if(d?.['initialized'])return d;throw new MessengerError(MessengerErrorCode['SERVER_ERROR'],'Account\x20'+a+'\x20initialization\x20failed');}return this['initializeAccount'](b);}async['initializeAccount'](a){const b=a['toLowerCase']();if(this['accounts']['size']>=MAX_ACCOUNTS)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Maximum\x20'+MAX_ACCOUNTS+'\x20accounts\x20allowed');const c=this['doInitialize'](b),d={'address':b,'messenger':null,'initialized':![],'initializing':c,'contactLists':{'friends':[],'guards':[],'lastUpdatedAt':0x0}};this['accounts']['set'](b,d);try{await c;const e=this['accounts']['get'](b);if(!e||!e['initialized'])throw new MessengerError(MessengerErrorCode['SERVER_ERROR'],'Account\x20'+a+'\x20initialization\x20failed');return e;}catch(f){this['accounts']['delete'](b);throw f;}}async['doInitialize'](a){const b=new Messenger(a,this['config']);try{await b['initialize']();}catch(d){throw new MessengerError(MessengerErrorCode['SERVER_ERROR'],'Failed\x20to\x20initialize\x20account\x20'+a+':\x20'+(d instanceof Error?d['message']:String(d)));}await sleep(0x3e8);const c={'friends':[],'guards':[],'lastUpdatedAt':0x0};this['accounts']['set'](a,{'address':a,'messenger':b,'initialized':!![],'contactLists':c});if(this['isWatching']){const e=this['persistStorage']['tryAcquirePollingLock'](a,this['instanceId']);e&&(this['pollingLockedAccounts']['add'](a),b['setOnMessageCallback'](f=>{for(const g of this['messageListeners']){g(f);}}));}}async['add_account_internal'](a){await this['ensureAccountReady'](a);}['remove_account_internal'](a){const b=a['toLowerCase'](),c=this['accounts']['get'](b);if(!c)return![];return c['initialized']&&c['messenger']&&c['messenger']['disconnect'](),this['persistStorage']['releasePollingLock'](b,this['instanceId']),this['pollingLockedAccounts']['delete'](b),this['accounts']['delete'](b);}['clear_accounts'](){this['stopPolling']();for(const a of this['accounts']['values']()){a['messenger']&&a['messenger']['disconnect']();}this['accounts']['clear']();}async['send'](a,b,c,d){const {Account:e}=await import('../local/account.js'),f=await e['Instance']()['get'](a,![]);if(!f)throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'Account\x20'+a+'\x20not\x20found');if(f['m']==null){if(d?.['new_messenger_name']==null)throw new MessengerError(MessengerErrorCode['ACCOUNT_MESSENGER_NOT_ENABLED'],'Account\x20messenger\x20name\x20not\x20set.\x20Use\x20new_messenger_name\x20parameter\x20to\x20set\x20it\x20automatically.');await e['Instance']()['set_messenger'](a,d['new_messenger_name']);}const g=await this['ensureAccountReady'](a);if(d?.['new_messenger_name']!=null){const h=await e['Instance']()['get'](a,![]);h&&h['m']!==d['new_messenger_name']&&await e['Instance']()['set_messenger'](a,d['new_messenger_name']);}return g['messenger']['sendMessage'](b,c,{'guardAddress':d?.['guardAddress'],'passportAddress':d?.['passportAddress'],'force':d?.['force']});}async['send_file'](a,b,c,d){const {Account:e}=await import('../local/account.js'),f=await e['Instance']()['get'](a,![]);if(!f)throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'Account\x20'+a+'\x20not\x20found');if(f['m']==null){if(d?.['new_messenger_name']==null)throw new MessengerError(MessengerErrorCode['ACCOUNT_MESSENGER_NOT_ENABLED'],'Account\x20messenger\x20name\x20not\x20set.\x20Use\x20new_messenger_name\x20parameter\x20to\x20set\x20it\x20automatically.');await e['Instance']()['set_messenger'](a,d['new_messenger_name']);}const g=await this['ensureAccountReady'](a);if(d?.['new_messenger_name']!=null){const h=await e['Instance']()['get'](a,![]);h&&h['m']!==d['new_messenger_name']&&await e['Instance']()['set_messenger'](a,d['new_messenger_name']);}return g['messenger']['sendZipFile'](b,c,{'fileName':d?.['fileName'],'contentType':d?.['contentType'],'guardAddress':d?.['guardAddress'],'passportAddress':d?.['passportAddress'],'force':d?.['force']});}async['watch'](a){let b=[];if(a?.['account']!==undefined){const i=a['account']['toLowerCase'](),j=this['accounts']['get'](i);j?.['messenger']&&await j['messenger']['pullMessages']();const k=new MessageStorage(i);b=k['getAllMessages'](i);}else for(const l of this['accounts']['values']()){l['messenger']&&await l['messenger']['pullMessages']();const m=new MessageStorage(l['address']),n=m['getAllMessages'](l['address']);b['push'](...n);}if(a){const o=a['peerAddress']?await GetAccountOrMark_Address(a['peerAddress']):undefined;b=b['filter'](p=>{if(a?.['account']!==undefined){const r=a['account']['toLowerCase'](),s=p['fromAddress']['toLowerCase'](),t=p['toAddress']['toLowerCase']();if(s!==r&&t!==r)return![];}if(a['direction']&&p['direction']!==a['direction'])return![];if(a['status']&&p['status']!==a['status'])return![];if(a['msgType']!==undefined&&p['msgType']!==a['msgType'])return![];if(a['contentType'])switch(a['contentType']){case'text':if(p['msgType']!==MessageType['NORMAL_MESSAGE'])return![];break;case'zip':if(!p['zipMetadata'])return![];break;case'wts':if(!p['zipMetadata']||p['zipMetadata']?.['contentType']!=='wts')return![];break;case'wip':if(!p['zipMetadata']||p['zipMetadata']?.['contentType']!=='wip')return![];break;}if(a['peerAddress']&&o){const u=o['toLowerCase'](),v=p['fromAddress']['toLowerCase'](),w=p['toAddress']['toLowerCase']();if(v!==u&&w!==u)return![];}const q=a['timeField']||'createdAt';if(a['startTime']!==undefined||a['endTime']!==undefined){const x=p[q];if(x!==undefined){if(a['startTime']!==undefined&&x<a['startTime'])return![];if(a['endTime']!==undefined&&x>a['endTime'])return![];}}if(a['createdAtStart']!==undefined&&p['createdAt']<a['createdAtStart'])return![];if(a['createdAtEnd']!==undefined&&p['createdAt']>a['createdAtEnd'])return![];if(a['receivedAtStart']!==undefined){if(p['receivedAt']===undefined||p['receivedAt']<a['receivedAtStart'])return![];}if(a['receivedAtEnd']!==undefined){if(p['receivedAt']===undefined||p['receivedAt']>a['receivedAtEnd'])return![];}if(a['serverTimestampStart']!==undefined){if(p['serverTimestamp']===undefined||p['serverTimestamp']<a['serverTimestampStart'])return![];}if(a['serverTimestampEnd']!==undefined){if(p['serverTimestamp']===undefined||p['serverTimestamp']>a['serverTimestampEnd'])return![];}if(a['decryptedOnly']&&!p['plaintext'])return![];if(a['confirmedOnly']&&p['status']!==MessageStatus['CONFIRMED'])return![];if(a['arkConfirmedOnly']){if(!p['arkConfirmed'])return![];}if(a['proofedOnly']){if(!p['proof'])return![];}if(a['arkTimestampStart']!==undefined){if(p['arkConfirmed']===undefined||p['arkConfirmed']['timestamp']<a['arkTimestampStart'])return![];}if(a['arkTimestampEnd']!==undefined){if(p['arkConfirmed']===undefined||p['arkConfirmed']['timestamp']>a['arkTimestampEnd'])return![];}if(a['hasLastReceivedIndexOnly']){if(p['lastReceivedLeafIndex']===undefined||p['lastReceivedLeafIndex']===null)return![];}if(a['lastReceivedIndexMin']!==undefined){if(p['lastReceivedLeafIndex']===undefined||p['lastReceivedLeafIndex']<a['lastReceivedIndexMin'])return![];}if(a['lastReceivedIndexMax']!==undefined){if(p['lastReceivedLeafIndex']===undefined||p['lastReceivedLeafIndex']>a['lastReceivedIndexMax'])return![];}if(a['keyword']&&p['plaintext']){if(!p['plaintext']['toLowerCase']()['includes'](a['keyword']['toLowerCase']()))return![];}if(a['listFilterMode']&&a['listFilterMode']!=='any'){const y=this['findAccount'](p['toAddress']);if(!y)return![];const z=p['fromAddress']['toLowerCase'](),A=y['contactLists'],B=new Set(A['friends']['map'](G=>G['toLowerCase']())),C=new Set(A['guards']['map'](G=>G['guardAddress']['toLowerCase']())),D=B['has'](z),E=C['has'](z),F=!D&&!E;switch(a['listFilterMode']){case'friends':if(!D)return![];break;case'guard':if(!E)return![];break;case'stranger':if(!F)return![];break;}if(a['customListFilter']){const {includeAddresses:G,excludeAddresses:H,relation:relation='union'}=a['customListFilter'];if(H){const I=new Set(H['map'](J=>J['toLowerCase']()));if(I['has'](z))return![];}if(G&&G['length']>0x0){const J=new Set(G['map'](L=>L['toLowerCase']())),K=J['has'](z);if(relation==='union'){const L=a['listFilterMode']==='friends'&&D||a['listFilterMode']==='guard'&&E||a['listFilterMode']==='stranger'&&F;if(!K&&!L)return![];}else{if(!K)return![];}}}}if(a['viewed']!==undefined){const M=p['viewedAt']!==undefined;if(a['viewed']!==M)return![];}if(a['viewedAtStart']!==undefined){if(p['viewedAt']===undefined||p['viewedAt']<a['viewedAtStart'])return![];}if(a['viewedAtEnd']!==undefined){if(p['viewedAt']===undefined||p['viewedAt']>a['viewedAtEnd'])return![];}return!![];});}const c=a?.['sortOrder']??'desc',d=a?.['timeField']||'createdAt';b['sort']((p,q)=>{const r=p[d]||0x0,s=q[d]||0x0;return c==='asc'?r-s:s-r;});const {MAX_QUERY_LIMIT:e}=await import('./types.js'),f=this['config']['defaultQueryLimit']??0x32,g=Math['min'](a?.['limit']??f,e),h=a?.['offset']??0x0;return b=b['slice'](h,h+g),b;}['startPolling'](){if(this['isWatching'])return;this['isWatching']=!![];}['stopPolling'](){this['isWatching']=![];}['onMessage'](a){this['messageListeners']['add'](a);}['offMessage'](a){this['messageListeners']['delete'](a);}['destroy'](){this['stop'](),this['messageListeners']['clear']();}async['syncContactLists'](a){const b=this['findAccount'](a);if(!b)return{'success':![],'friends':[],'guards':[],'error':'Account\x20not\x20found:\x20'+a};try{const [c,d]=await Promise['all']([b['messenger']['getFriendsList'](),b['messenger']['getGuardList']()]),e=d['currentGuardList']||[];return b['contactLists']={'friends':c,'guards':e,'lastUpdatedAt':Date['now']()},{'success':!![],'friends':c,'guards':e};}catch(f){return{'success':![],'friends':b['contactLists']['friends'],'guards':b['contactLists']['guards'],'error':f instanceof Error?f['message']:String(f)};}}async['syncAllContactLists'](){const a=new Map();for(const b of this['accounts']['values']()){const c=await this['syncContactLists'](b['address']);a['set'](b['address'],c);}return a;}['getContactLists'](a){const b=this['findAccount'](a);return b?.['contactLists'];}['setContactLists'](a,b){const c=this['findAccount'](a);if(!c)return![];return c['contactLists']={...c['contactLists'],...b,'lastUpdatedAt':Date['now']()},!![];}['isStranger'](a,b){const c=this['findAccount'](a);if(!c)return!![];const d=b['toLowerCase'](),e=c['contactLists'],f=e['friends']['some'](h=>h['toLowerCase']()===d),g=e['guards']['some'](h=>h['guardAddress']['toLowerCase']()===d);return!f&&!g;}['recordGuardSender'](a,b){const c=this['findAccount'](a);if(!c)return![];const d=b['toLowerCase'](),e=c['contactLists']['guards']['some'](f=>f['guardAddress']['toLowerCase']()===d);return!e&&(c['contactLists']['guards']['push']({'guardAddress':b,'passportValiditySeconds':0x15180}),c['contactLists']['lastUpdatedAt']=Date['now']()),!![];}['generateNonce'](){return Math['random']()['toString'](0x24)['substring'](0x2,0xf)+Math['random']()['toString'](0x24)['substring'](0x2,0xf);}async['watch_paginated'](a){const {MAX_QUERY_LIMIT:b}=await import('./types.js'),c=await this['watch'](a),d=c['length'],e=this['config']['defaultQueryLimit']??0x32,f=Math['min'](a?.['limit']??e,b),g=a?.['offset']??0x0,h=c['slice'](g,g+f);return{'messages':h,'total':d,'offset':g,'limit':f};}async['get_conversations'](a){const b=a?{'account':a}:undefined,c=await this['watch'](b),d=new Map();for(const e of c){const f=a?.['toLowerCase'](),g=e['fromAddress']['toLowerCase']()===f?e['toAddress']:e['fromAddress'];!d['has'](g)&&d['set'](g,{'peerAddress':g,'lastMessageAt':e['createdAt'],'messageCount':0x0,'unreadCount':0x0,'lastMessagePreview':e['plaintext']});const h=d['get'](g);h['messageCount']++,e['createdAt']>h['lastMessageAt']&&(h['lastMessageAt']=e['createdAt'],h['lastMessagePreview']=e['plaintext']),e['status']!==MessageStatus['READ']&&e['toAddress']['toLowerCase']()===f&&h['unreadCount']++;}return Array['from'](d['values']())['sort']((i,j)=>j['lastMessageAt']-i['lastMessageAt']);}async['generate_wts'](a,b,c,d,e){const f=await import('fs'),g=await import('path'),h=b['toLowerCase'](),k=c['toLowerCase'](),l=new MessageStorage(h),m=l['getAllMessages'](h);let n=m['filter'](w=>{const x=w['fromAddress']['toLowerCase'](),y=w['toAddress']['toLowerCase'](),z=x===h&&y===k||x===k&&y===h;return z;});n=n['filter'](w=>w['leafIndex']!==undefined&&w['serverTimestamp']!==undefined)['reduce']((w,x)=>{const y=w['find'](z=>z['messageId']===x['messageId']);return!y&&w['push'](x),w;},[])['sort']((w,x)=>{const y=w['serverTimestamp']-x['serverTimestamp'];if(y!==0x0)return y;return w['leafIndex']-x['leafIndex'];});if(d)switch(d['type']){case'time':{const w=Math['min'](d['start'],d['end']),x=Math['max'](d['start'],d['end']);n=n['filter'](y=>y['createdAt']>=w&&y['createdAt']<=x);break;}case'messageId':{const y=d['start'],z=d['end'];n=n['filter'](A=>A['messageId']>=y&&A['messageId']<=z);break;}case'seqIndex':{const A=Math['min'](d['start'],d['end']),B=Math['max'](d['start'],d['end']);n=n['filter'](C=>C['leafIndex']>=A&&C['leafIndex']<=B);break;}}if(n['length']===0x0)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'No\x20messages\x20found\x20for\x20the\x20given\x20criteria');const o=n['map'](C=>C['leafIndex'])['filter'](C=>C!==undefined)['sort']((C,D)=>C-D),p=[];for(let C=0x1;C<o['length'];C++){const D=o[C-0x1]+0x1,E=o[C];if(E!==D)for(let F=D;F<E;F++){p['push'](F);}}if(p['length']>0x0){}if(n['length']>WTS_MAX_MESSAGE_COUNT)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20count\x20('+n['length']+')\x20exceeds\x20maximum\x20allowed\x20('+WTS_MAX_MESSAGE_COUNT+')');!f['existsSync'](a)&&f['mkdirSync'](a,{'recursive':!![]});const q=h['slice'](0x0,0x6)+'_'+k['slice'](0x0,0x6),r=[];let s=[];for(let G=0x0;G<n['length'];G++){const H=n[G];if(s['length']===0x0)s['push'](H);else{const I=s[s['length']-0x1],J=I['leafIndex']+0x1;s['length']>=WTS_MAX_MESSAGE_COUNT||H['leafIndex']!==J?(r['push'](s),s=[H]):s['push'](H);}}s['length']>0x0&&r['push'](s);r['forEach']((K,L)=>{const M=K['map'](N=>N['leafIndex'])['join'](',\x20');});const t=[];for(const K of r){const L=K['map'](a4=>a4['leafIndex'])['filter'](a4=>a4!==undefined),M=Math['min'](...L),N=Math['max'](...L),O=K[0x0]['createdAt'],P=K[K['length']-0x1]['createdAt'];for(const a4 of K){if(a4['serverTimestamp']===undefined)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20'+a4['messageId']+'\x20missing\x20serverTimestamp');if(a4['leafIndex']===undefined)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20'+a4['messageId']+'\x20missing\x20leafIndex');if(!a4['prevRoot'])throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20'+a4['messageId']+'\x20missing\x20prevRoot');if(!a4['newRoot'])throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20'+a4['messageId']+'\x20missing\x20newRoot');if(!a4['serverSignature'])throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20'+a4['messageId']+'\x20missing\x20serverSignature');}const Q=K['map'](a5=>{const a6={'id':a5['messageId'],'from':a5['fromAddress'],'to':a5['toAddress'],'plaintextHash':a5['plaintextHash'],'clientTimestamp':a5['createdAt'],'timestamp':a5['serverTimestamp'],'leafIndex':a5['leafIndex'],'prevRoot':a5['prevRoot'],'merkleRoot':a5['newRoot'],'serverSignature':a5['serverSignature'],'serverPublicKeyIndex':0x0,'msgType':a5['msgType']};return!e&&a5['plaintext']!==undefined&&(a6['plaintext']=a5['plaintext']),a5['guardAddress']!==undefined&&(a6['guardAddress']=a5['guardAddress']),a5['passportAddress']!==undefined&&(a6['passportAddress']=a5['passportAddress']),a5['arkConfirmed']!==undefined&&(a6['arkConfirmed']={'recipient':a5['arkConfirmed']['recipient'],'recipientPublicKey':a5['arkConfirmed']['recipientPublicKey'],'signature':a5['arkConfirmed']['signature'],'timestamp':a5['arkConfirmed']['timestamp']}),a5['zipMetadata']!==undefined&&(a6['zipMetadata']=a5['zipMetadata']),a5['lastReceivedLeafIndex']!==undefined&&a5['lastReceivedLeafIndex']!==-0x1&&(a6['lastReceivedLeafIndex']=a5['lastReceivedLeafIndex']),a6;}),R=[h,k]['sort'](),S={'participants':R},T=[],U=new Map();for(const a5 of Q){const a6=K['find'](a8=>a8['messageId']===a5['id'])?.['serverPublicKey']||'';if(!a6)continue;let a7=U['get'](a6);a7===undefined&&(a7=T['length'],U['set'](a6,a7),T['push']({'publicKey':a6,'validFrom':0x0})),a5['serverPublicKeyIndex']=a7;}const V={'session':S,'messages':Q},{sha256:W}=await import('@noble/hashes/sha256'),{bytesToHex:X}=await import('@noble/hashes/utils'),Y={'wts':WTS_SCHEMA_URL,...V},Z=X(W(new TextEncoder()['encode'](canonicalizeJson(Y)))),a0={'type':'wts','version':'1.0','created':new Date()['toISOString'](),'hash':Z,'algorithm':'sha256','startTime':O,'endTime':P,'messageCount':Q['length'],'merkleRoot':Q[Q['length']-0x1]['merkleRoot'],'creator':h,'participant':k,'serverPublicKeys':T},a1={'wts':WTS_SCHEMA_URL,'payload':V,'meta':a0},a2=q+'_'+M+'-'+N+'.wts',a3=g['join'](a,a2);f['writeFileSync'](a3,JSON['stringify'](a1,null,0x2)),t['push'](a3);}const u=n[0x0]?.['createdAt']||0x0,v=n[n['length']-0x1]?.['createdAt']||0x0;return{'files':t,'totalMessageCount':n['length'],'timeRange':{'start':u,'end':v}};}async['addToBlacklist'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['addToBlacklist'](b);}async['removeFromBlacklist'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['removeFromBlacklist'](b);}async['clearBlacklist'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['clearBlacklist']();}async['getBlacklist'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['getBlacklist']();}async['existInBlacklist'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['existInBlacklist'](b);}async['addToFriendsList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['addToFriendsList'](b);}async['removeFromFriendsList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['removeFromFriendsList'](b);}async['clearFriendsList'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['clearFriendsList']();}async['getFriendsList'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['getFriendsList']();}async['existInFriendsList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['existInFriendsList'](b);}async['addToGuardList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['addToGuardList'](b);}async['removeFromGuardList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['removeFromGuardList'](b);}async['getGuardList'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['getGuardList']();}async['getSettings'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['getSettings']();}async['setSettings'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['setSettings'](b);}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createHash}from'crypto';import*as a183a from'fs';import*as a183b from'path';import{MessengerSession,DecryptionEngine}from'./session.js';import{MessengerServerClient}from'./server.js';import{MessageStorage,SessionStateStorage}from'./storage.js';import{hashPlaintext,verifyMessage,bytesToBase64}from'./crypto.js';import{canonicalizeJson}from'./utils.js';import{DEFAULT_MESSENGER_CONFIG,MessengerError,MessengerErrorCode,MessageDirection,MessageStatus,WTS_FILE_BYTES_LIMIT,NORMAL_MESSAGE_BYTES_LIMIT,CHAIN_PROOF_TYPE}from'./types.js';import{isValidWowAddress}from'../../utils/sui-types.js';async function getAccount(){const {Account:a}=await import('../local/account.js');return a['Instance']();}export class Messenger{['session'];['serverClient'];['config'];['userAddress']=null;['onMessageCallback']=null;['pollingTimer']=null;['messageConsecutiveEmptyPulls']=0x0;['prekeyConsecutiveOkCount']=0x0;['currentMessageInterval'];['isPollingRunning']=![];['messageStorage'];['sessionStateStorage'];['decryptionEngine'];['waitingMessages']=new Map();['failedMessages']=new Map();['waitingMessageRetries']=new Map();constructor(a,b){this['userAddress']=a,this['config']={...DEFAULT_MESSENGER_CONFIG,...b},this['session']=new MessengerSession(a,this['config']),this['serverClient']=new MessengerServerClient(this['config']),this['messageStorage']=new MessageStorage(a),this['sessionStateStorage']=new SessionStateStorage(a),this['decryptionEngine']=new DecryptionEngine(this['session']['store']),this['currentMessageInterval']=this['config']['message_poll_default_interval_ms']??0x6*0x3c*0x3e8;}['getUserAddress'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');return this['userAddress'];}async['getPublicKey'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const a=await(await getAccount())['get'](this['userAddress'],![]);return a?.['pubkey']||'';}['isValidGuardMessage'](a,b){return Boolean(a&&b&&isValidWowAddress(a)&&isValidWowAddress(b));}async['generateSignatureParams'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const b=await(await getAccount())['get'](this['userAddress'],![]);if(!b?.['secret'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'Account\x20not\x20found\x20or\x20no\x20secret\x20key\x20for\x20'+this['userAddress']);const {Ed25519Keypair:c}=await import('../../keypairs/ed25519/index.js'),d=c['fromSecretKey'](b['secret']),e=d['getPublicKey'](),f=e['toWPublicKey'](),g=Date['now'](),h=this['generateNonce'](),i=a+':'+f+':'+g+':'+h,j=await d['sign'](new TextEncoder()['encode'](i));return{'signatureScheme':'ED25519','signature':Buffer['from'](j)['toString']('base64'),'timestamp':g,'nonce':h};}['generateNonce'](){const a=new Uint8Array(0x10);return crypto['getRandomValues'](a),Array['from'](a,c=>c['toString'](0x10)['padStart'](0x2,'0'))['join']('');}async['initialize'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');await this['session']['ensureIdentity'](this['userAddress']),await this['session']['registerDevice'](this['userAddress']),await this['session']['ensurePreKeys'](this['userAddress']),await this['checkAndRefillPrekeys'](),this['startPollingTimer']();}async['checkAndRefillPrekeys'](){if(!this['userAddress'])return;await this['session']['ensurePreKeys'](this['userAddress'],![]);}['startPollingTimer'](){this['pollingTimer']&&clearTimeout(this['pollingTimer']),this['isPollingRunning']=!![],this['scheduleNextPoll']();}['stopPollingTimer'](){this['isPollingRunning']=![],this['pollingTimer']&&(clearTimeout(this['pollingTimer']),this['pollingTimer']=null);}['scheduleNextPoll'](){if(!this['isPollingRunning'])return;const a=this['getNextPollInterval']();this['pollingTimer']=setTimeout(()=>{this['poll']()['catch'](b=>{})['finally'](()=>{this['scheduleNextPoll']();});},a);}['getNextPollInterval'](){if(this['waitingMessages']['size']>0x0)return this['config']['message_poll_waiting_interval_ms']??0x3*0x3e8;return this['currentMessageInterval'];}async['poll'](){if(!this['userAddress'])return;try{const a=await this['pullMessages']();a['messages']['length']>0x0?(this['messageConsecutiveEmptyPulls']=0x0,this['currentMessageInterval']=this['config']['message_poll_fast_interval_ms']??0x6*0x3e8,this['onMessageCallback']&&this['onMessageCallback'](a['messages'])):(this['messageConsecutiveEmptyPulls']++,this['messageConsecutiveEmptyPulls']>=(this['config']['message_poll_consecutive_empty_limit']??0x3)&&(this['currentMessageInterval']=this['config']['message_poll_default_interval_ms']??0x6*0x3c*0x3e8,this['messageConsecutiveEmptyPulls']=0x0));if(a['prekey_status']){const b=a['prekey_status'];b['shouldRefill']?(this['prekeyConsecutiveOkCount']=0x0,await this['checkAndRefillPrekeys']()):(this['prekeyConsecutiveOkCount']++,this['prekeyConsecutiveOkCount']>=(this['config']['prekey_poll_consecutive_ok_limit']??0x3)&&(this['prekeyConsecutiveOkCount']=0x0));}}catch(c){}}['triggerFastPoll'](){this['currentMessageInterval']=this['config']['message_poll_fast_interval_ms']??0x6*0x3e8,this['messageConsecutiveEmptyPulls']=0x0,this['isPollingRunning']&&(this['pollingTimer']&&clearTimeout(this['pollingTimer']),this['scheduleNextPoll']());}async['sendMessage'](a,b,c){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const d=Date['now'](),e=Date['now'](),f=this['generateNonce'](),g=new TextEncoder()['encode'](b)['length'];if(g>NORMAL_MESSAGE_BYTES_LIMIT)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20size\x20('+g+'\x20bytes)\x20exceeds\x20maximum\x20allowed\x20size\x20('+NORMAL_MESSAGE_BYTES_LIMIT+'\x20bytes).\x20Consider\x20using\x20sendZipFile\x20for\x20large\x20content.');await this['pullMessages']();const h=this['messageStorage']['getLastReceivedLeafIndex'](this['userAddress'],a),i=await this['session']['encryptMessage'](this['userAddress'],a,b),j=Buffer['from'](new Uint8Array(i['body']))['toString']('base64'),k=hashPlaintext(b,d,c?.['guardAddress'],c?.['passportAddress'],h),l=await(await getAccount())['get'](this['userAddress'],![]);if(!l)throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20account\x20not\x20found');const m=l['pubkey'],n=c?.['guardAddress']||'',o=c?.['passportAddress']||'',p=h>=0x0?h['toString']():'',q=c?.['force']?'true':'false',r='send_message:'+this['userAddress']+':'+a+':'+n+':'+o+':'+k+':'+p+':'+m+':'+e+':'+f+':'+q,s=await(await getAccount())['signData'](this['userAddress'],r),t=Buffer['from'](s['signature']['slice'](0x2),'hex'),u=bytesToBase64(new Uint8Array(t)),v=await this['serverClient']['sendMessage']({'sender':s['publicKey'],'recipient':a,'ciphertext':j,'plaintextHash':k,'clientTimestamp':d,'msgType':i['type'],'signatureScheme':'ED25519','signature':u,'timestamp':e,'nonce':f,'guardAddress':c?.['guardAddress'],'passportAddress':c?.['passportAddress'],'force':c?.['force'],'lastReceivedLeafIndex':h>=0x0?h:undefined}),w={'messageId':v['messageId'],'fromAddress':this['userAddress'],'toAddress':a,'plaintextHash':k,'plaintext':b,'guardAddress':c?.['guardAddress'],'passportAddress':c?.['passportAddress'],'lastReceivedLeafIndex':h,'direction':MessageDirection['SENT'],'status':v['status']==='confirmed'?MessageStatus['CONFIRMED']:MessageStatus['PENDING'],'msgType':i['type'],'createdAt':d};v['merkleData']&&(w['leafIndex']=v['merkleData']['leafIndex'],w['prevRoot']=v['merkleData']['prevRoot'],w['newRoot']=v['merkleData']['newRoot'],w['serverSignature']=v['merkleData']['serverSignature'],w['serverTimestamp']=v['merkleData']['serverTimestamp'],w['serverPublicKey']=v['merkleData']['serverPublicKey'],this['sessionStateStorage']['updateSessionState'](this['userAddress'],a,{'currentRoot':v['merkleData']['newRoot'],'prevRoot':v['merkleData']['prevRoot'],'lastLeafIndex':v['merkleData']['leafIndex'],'lastSyncAt':Date['now']()}));this['messageStorage']['saveMessage'](w);if(v['pendingMerkleData'])for(const [x,y]of Object['entries'](v['pendingMerkleData'])){const z=this['messageStorage']['getMessage'](x);z&&z['status']===MessageStatus['PENDING']&&this['messageStorage']['updateMessageStatus'](x,MessageStatus['CONFIRMED'],{'leafIndex':y['leafIndex'],'newRoot':y['newRoot'],'serverSignature':y['serverSignature'],'serverTimestamp':y['serverTimestamp'],'serverPublicKey':y['serverPublicKey']});}return this['triggerFastPoll'](),{'messageId':v['messageId'],'status':w['status'],'merkleData':v['merkleData'],'guardList':v['guard_list'],'lastReceivedLeafIndex':h>=0x0?h:undefined};}async['pullMessages'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const b=Date['now'](),c=this['generateNonce'](),d='fetch_messages:'+this['userAddress']+':'+(a||0x64)+':'+b+':'+c,e=await(await getAccount())['get'](this['userAddress'],![]),f=e?.['pubkey']||'',g=await(await getAccount())['signData'](this['userAddress'],d),h=Buffer['from'](g['signature']['slice'](0x2),'hex'),i={'signatureScheme':'ED25519','signature':bytesToBase64(h),'timestamp':b,'nonce':c},j=await this['serverClient']['pullMessages'](this['userAddress'],f,i,a);if(j['messages']['length']===0x0)return{'messages':[],'prekey_status':j['prekey_status']};const k=[],l=[],m=[...j['messages']]['sort'](function(n,o){return(n['clientTimestamp']||0x0)-(o['clientTimestamp']||0x0);});await this['processWaitingMessages'](k,l);for(const n of m){if(this['waitingMessages']['has'](n['id'])){l['push'](n['id']);continue;}if(this['failedMessages']['has'](n['id'])){l['push'](n['id']);continue;}const o=this['messageStorage']['getMessage'](n['id']);if(o){l['push'](n['id']);continue;}const p=await this['tryDecryptMessage'](n);if(p['success']&&p['message']&&p['decryptedData'])this['messageStorage']['saveMessage'](p['message']),k['push'](p['decryptedData']),l['push'](n['id']),this['waitingMessages']['delete'](n['id']);else p['shouldRetry']?this['waitingMessages']['set'](n['id'],n):(this['failedMessages']['set'](n['id'],{'message':n,'error':p['error']||'Unknown\x20error'}),await this['saveFailedMessage'](n,p['error']||'Unknown\x20error'),l['push'](n['id']));}this['waitingMessages']['size']>0x0&&this['isPollingRunning']&&this['reschedulePolling']();if(l['length']>0x0&&this['userAddress']){const q=Date['now'](),r=this['generateNonce'](),s=await(await getAccount())['get'](this['userAddress'],![]);if(s?.['pubkey']){const t='ack_messages:'+this['userAddress']+':'+l['join'](',')+':'+s['pubkey']+':'+q+':'+r,u=await(await getAccount())['signData'](this['userAddress'],t),v=Buffer['from'](u['signature']['slice'](0x2),'hex'),w=bytesToBase64(new Uint8Array(v));await this['serverClient']['acknowledgeMessages'](l,u['publicKey'],{'publicKey':u['publicKey'],'signatureScheme':'ED25519','signature':w,'timestamp':q,'nonce':r});}}return{'messages':k,'prekey_status':j['prekey_status']};}['getLastSentLeafIndex'](a){if(!this['userAddress'])return-0x1;const b=this['messageStorage']['getMessagesBySession'](this['userAddress'],a),c=b['filter'](d=>d['direction']===MessageDirection['SENT']&&d['leafIndex']!==undefined);if(c['length']===0x0)return-0x1;return Math['max'](...c['map'](d=>d['leafIndex']));}['getSessionMessages'](a){if(!this['userAddress'])return[];return this['messageStorage']['getMessagesBySession'](this['userAddress'],a);}['getSessionState'](a){if(!this['userAddress'])return undefined;return this['sessionStateStorage']['getSessionState'](this['userAddress'],a);}async['submitChainProof'](a,b,c){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const d=this['sessionStateStorage']['getSessionState'](this['userAddress'],b);if(!d||!d['currentRoot'])throw new MessengerError(MessengerErrorCode['SESSION_NOT_ESTABLISHED'],'No\x20session\x20state\x20found');const e=this['messageStorage']['getMessagesBySession'](this['userAddress'],b),f=e[e['length']-0x1];if(!f||!f['serverPublicKey']||!f['serverSignature'])throw new MessengerError(MessengerErrorCode['INVALID_PROOF'],'No\x20temporal\x20proof\x20(missing\x20server\x20public\x20key\x20or\x20signature),\x20cannot\x20submit\x20Proof\x20to\x20WoWok\x20blockchain');const g=f['serverPublicKey'],h=f['serverSignature'],i={'sessionId':d['sessionId'],'merkleRoot':d['currentRoot'],'messageCount':d['messageCount'],'timestamp':Date['now']()},{CallProof:j}=await import('../call/proof.js'),k=new j({'proof':JSON['stringify'](i),'server_pubkey':g,'server_signature':h,'proof_type':CHAIN_PROOF_TYPE,'description':c||'Messenger\x20session\x20proof\x20for\x20'+this['userAddress']+'\x20<->\x20'+b,'item_count':d['messageCount'],'about_address':d['sessionId']}),l=await k['call'](a),m=l?.['objectChanges'],n=m?.['find'](o=>o['objectType']?.['includes']('Proof'))?.['objectId'];return{'proofAddress':n||'','txHash':l?.['digest']||''};}['destroy'](){this['stopPollingTimer']();}['disconnect'](){this['destroy']();}['setOnMessageCallback'](a){this['onMessageCallback']=a;}async['sendZipFile'](a,b,c){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const d=await this['loadFileData'](b),{ZipWriter:e,BlobWriter:f,Uint8ArrayReader:g}=await import('@zip.js/zip.js'),h=c?.['fileName']||a183b['basename'](b)||'file.zip',i=c?.['contentType']||this['detectContentType'](h),j=new f('application/zip'),k=new e(j);await k['add'](h,new g(d)),await k['close']();const l=await j['getData'](),m=new Uint8Array(await l['arrayBuffer']());if(m['length']>WTS_FILE_BYTES_LIMIT)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'ZIP\x20file\x20size\x20('+m['length']+'\x20bytes)\x20exceeds\x20local\x20maximum\x20allowed\x20size\x20('+WTS_FILE_BYTES_LIMIT+'\x20bytes)');const n='0x'+createHash('sha256')['update'](m)['digest']('hex'),o=Buffer['from'](m)['toString']('base64'),p={'fileName':h+'.zip','fileSize':m['length'],'fileHash':n,'contentType':i};await this['pullMessages']();const q=this['messageStorage']['getLastReceivedLeafIndex'](this['userAddress'],a),r=Date['now'](),s=await this['session']['encryptMessage'](this['userAddress'],a,o),t=Buffer['from'](new Uint8Array(s['body']))['toString']('base64'),u=c?.['guardAddress']||'',v=c?.['passportAddress']||'',w=hashPlaintext(o,r,u,v,q),x=Date['now'](),y=this['generateNonce'](),z=await(await getAccount())['get'](this['userAddress'],![]);if(!z)throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20account\x20not\x20found');const A=z['pubkey'],B=q>=0x0?q['toString']():'',C=c?.['force']?'true':'false',D='send_message:'+this['userAddress']+':'+a+':'+u+':'+v+':'+w+':'+B+':'+A+':'+x+':'+y+':'+C,E=await(await getAccount())['signData'](this['userAddress'],D),F=Buffer['from'](E['signature']['slice'](0x2),'hex'),G=bytesToBase64(new Uint8Array(F)),H=await this['serverClient']['sendMessage']({'sender':E['publicKey'],'recipient':a,'ciphertext':t,'plaintextHash':w,'clientTimestamp':r,'msgType':s['type'],'zipMetadata':p,'guardAddress':c?.['guardAddress'],'passportAddress':c?.['passportAddress'],'force':c?.['force'],'lastReceivedLeafIndex':q>=0x0?q:undefined,'signatureScheme':'ED25519','signature':G,'timestamp':x,'nonce':y}),I={'messageId':H['messageId'],'fromAddress':this['userAddress'],'toAddress':a,'plaintextHash':w,'plaintext':o,'guardAddress':c?.['guardAddress'],'passportAddress':c?.['passportAddress'],'lastReceivedLeafIndex':q,'direction':MessageDirection['SENT'],'status':H['status']==='confirmed'?MessageStatus['CONFIRMED']:MessageStatus['PENDING'],'msgType':s['type'],'zipMetadata':p,'createdAt':r};H['merkleData']&&(I['leafIndex']=H['merkleData']['leafIndex'],I['prevRoot']=H['merkleData']['prevRoot'],I['newRoot']=H['merkleData']['newRoot'],I['serverSignature']=H['merkleData']['serverSignature'],I['serverTimestamp']=H['merkleData']['serverTimestamp'],I['serverPublicKey']=H['merkleData']['serverPublicKey'],this['sessionStateStorage']['updateSessionState'](this['userAddress'],a,{'currentRoot':H['merkleData']['newRoot'],'prevRoot':H['merkleData']['prevRoot'],'lastLeafIndex':H['merkleData']['leafIndex'],'lastSyncAt':Date['now']()}));this['messageStorage']['saveMessage'](I);if(H['pendingMerkleData'])for(const [J,K]of Object['entries'](H['pendingMerkleData'])){const L=this['messageStorage']['getMessage'](J);L&&L['status']===MessageStatus['PENDING']&&this['messageStorage']['updateMessageStatus'](J,MessageStatus['CONFIRMED'],{'leafIndex':K['leafIndex'],'newRoot':K['newRoot'],'serverSignature':K['serverSignature'],'serverTimestamp':K['serverTimestamp'],'serverPublicKey':K['serverPublicKey']});}return this['triggerFastPoll'](),{'messageId':H['messageId'],'status':I['status'],'merkleData':H['merkleData'],'guardList':H['guard_list'],'lastReceivedLeafIndex':q>=0x0?q:undefined};}async['loadFileData'](a){if(a['startsWith']('http://')||a['startsWith']('https://')){const d=await fetch(a);if(!d['ok'])throw new MessengerError(MessengerErrorCode['NETWORK_ERROR'],'Failed\x20to\x20fetch\x20file\x20from\x20'+a+':\x20'+d['statusText']);const e=await d['arrayBuffer']();return new Uint8Array(e);}const b=a183b['resolve'](a);if(!a183a['existsSync'](b))throw new MessengerError(MessengerErrorCode['FILE_NOT_FOUND'],'File\x20not\x20found:\x20'+b);const c=a183a['readFileSync'](b);return new Uint8Array(c);}['detectContentType'](a){const b=a183b['extname'](a)['toLowerCase']();switch(b){case'.wts':return'wts';case'.wip':return'wip';default:return'zip';}}async['_createSignedRequest'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const b=Date['now'](),c=this['generateNonce'](),d=canonicalizeJson(a),e=b+':'+c+':'+d,f=await(await getAccount())['signData'](this['userAddress'],e),g=Buffer['from'](f['signature']['slice'](0x2),'hex'),h=bytesToBase64(new Uint8Array(g)),i=await(await getAccount())['get'](this['userAddress'],![]);if(!i||!i['pubkey'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'Account\x20public\x20key\x20not\x20found');return{'userAddress':this['userAddress'],'publicKey':i['pubkey'],'signatureScheme':'ED25519','signature':h,'timestamp':b,'nonce':c,'data':a};}['_validateAddresses'](a){const b=[],c=[];for(const d of a){isValidWowAddress(d)?b['push'](d):c['push'](d);}return{'valid':b,'invalid':c};}async['addToBlacklist'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'add','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['addToBlacklist'](this['userAddress'],e);}async['removeFromBlacklist'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'remove','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['removeFromBlacklist'](this['userAddress'],e);}async['clearBlacklist'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const a={},b=await this['_createSignedRequest'](a);return this['serverClient']['clearBlacklist'](this['userAddress'],b);}async['getBlacklist'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const a=await this['_createSignedRequest']({});return this['serverClient']['getBlacklist'](this['userAddress'],a);}async['existInBlacklist'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'exist','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['existInBlacklist'](this['userAddress'],e);}async['addToFriendsList'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'add','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['addToFriendsList'](this['userAddress'],e);}async['removeFromFriendsList'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'remove','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['removeFromFriendsList'](this['userAddress'],e);}async['clearFriendsList'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const a={},b=await this['_createSignedRequest'](a);return this['serverClient']['clearFriendsList'](this['userAddress'],b);}async['getFriendsList'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const a=await this['_createSignedRequest']({});return this['serverClient']['getFriendsList'](this['userAddress'],a);}async['existInFriendsList'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'exist','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['existInFriendsList'](this['userAddress'],e);}async['addToGuardList'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const b={'guards':a},c=await this['_createSignedRequest'](b);return this['serverClient']['addToGuardList'](this['userAddress'],c);}async['removeFromGuardList'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'remove','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['removeFromGuardList'](this['userAddress'],e);}async['getGuardList'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const a=await this['_createSignedRequest']({});return this['serverClient']['getGuardList'](this['userAddress'],a);}async['getSettings'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const a=await this['_createSignedRequest']({});return this['serverClient']['getSettings'](this['userAddress'],a);}async['setSettings'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const b={'allowStrangerMessages':a['allowStrangerMessages'],'maxInboxSize':a['maxInboxSize']},c=await this['_createSignedRequest'](b);return this['serverClient']['updateSettings'](this['userAddress'],c);}async['tryDecryptMessage'](a){try{const b=Uint8Array['from'](Buffer['from'](a['bodyB64'],'base64')),c=await this['decryptionEngine']['decryptMessage'](this['userAddress'],a['from'],b['buffer'],a['msgType']);if(!c['success']){const h=this['isRetryableError'](c['error']||'');return{'success':![],'shouldRetry':h,'error':c['error'],'sessionUpdated':c['sessionUpdated']};}const d=c['plaintext'];if(!a['clientTimestamp'])throw new Error('Missing\x20clientTimestamp\x20for\x20message\x20'+a['id']);if(!a['plaintextHash'])throw new Error('Missing\x20plaintextHash\x20for\x20message\x20'+a['id']);const e=verifyMessage({'messageId':a['id'],'plaintext':d,'plaintextHash':a['plaintextHash'],'createdAt':a['clientTimestamp'],'guardAddress':a['guardAddress'],'passportAddress':a['passportAddress'],'lastReceivedLeafIndex':a['lastReceivedLeafIndex'],'serverSignature':a['merkleMetadata']?.['serverSignature'],'serverPublicKey':a['merkleMetadata']?.['serverPublicKey'],'merkleMetadata':a['merkleMetadata']?{'prevRoot':a['merkleMetadata']['prevRoot'],'newRoot':a['merkleMetadata']['newRoot'],'serverTimestamp':a['merkleMetadata']['serverTimestamp'],'leafIndex':a['merkleMetadata']['leafIndex'],'proofSiblings':a['merkleMetadata']['proofSiblings'],'proofIndices':a['merkleMetadata']['proofIndices']}:undefined});if(!e['valid'])throw new Error(e['error']);const f={'messageId':a['id'],'fromAddress':a['from'],'toAddress':this['userAddress'],'plaintextHash':a['plaintextHash'],'plaintext':d,'guardAddress':a['guardAddress'],'passportAddress':a['passportAddress'],'lastReceivedLeafIndex':a['lastReceivedLeafIndex'],'direction':MessageDirection['RECEIVED'],'status':MessageStatus['DECRYPTED'],'msgType':a['msgType'],'leafIndex':a['merkleMetadata']?.['leafIndex'],'prevRoot':a['merkleMetadata']?.['prevRoot'],'newRoot':a['merkleMetadata']?.['newRoot'],'serverSignature':a['merkleMetadata']?.['serverSignature'],'serverTimestamp':a['merkleMetadata']?.['serverTimestamp'],'serverPublicKey':a['merkleMetadata']?.['serverPublicKey'],'createdAt':a['clientTimestamp'],'receivedAt':Date['now'](),'zipMetadata':a['zipMetadata']};a['merkleMetadata']&&this['sessionStateStorage']['updateSessionState'](this['userAddress'],a['from'],{'currentRoot':a['merkleMetadata']['newRoot'],'prevRoot':a['merkleMetadata']['prevRoot'],'lastLeafIndex':a['merkleMetadata']['leafIndex'],'lastSyncAt':Date['now']()});const g=a['merkleMetadata']?.['serverTimestamp']||a['clientTimestamp']||Date['now']();if(a['lastReceivedLeafIndex']!==undefined&&a['lastReceivedLeafIndex']>=0x0){const i=this['messageStorage']['getMessagesBySession'](this['userAddress'],a['from'])['filter'](j=>j['direction']===MessageDirection['SENT']&&j['status']===MessageStatus['CONFIRMED']&&j['leafIndex']!==undefined&&j['leafIndex']<=a['lastReceivedLeafIndex']);for(const j of i){this['messageStorage']['updateMessageStatus'](j['messageId'],MessageStatus['READ']);}}return{'success':!![],'shouldRetry':![],'message':f,'decryptedData':{'id':a['id'],'from':a['from'],'plaintext':d,'timestamp':g,'merkleVerified':!!a['merkleMetadata'],'merkleData':a['merkleMetadata']?{'leafIndex':a['merkleMetadata']['leafIndex'],'rootHash':a['merkleMetadata']['newRoot']}:undefined},'sessionUpdated':c['sessionUpdated']};}catch(k){const l=k instanceof Error?k['message']:String(k),m=this['isRetryableError'](l);return{'success':![],'shouldRetry':m,'error':l};}}['isRetryableError'](a){const b=[/message number/i,/chain key/i,/session not found/i,/prekey not found/i,/PREKEY 竞争:我的地址较小,保留我的会话/i,/The operation failed for an operation-specific reason/i,/DOMException/i,/收到 WHISPER_MESSAGE 但无现有会话,需要等待 PREKEY_MESSAGE/i];return b['some'](c=>c['test'](a));}async['processWaitingMessages'](a,b){if(this['waitingMessages']['size']===0x0)return;const c=[],d=Array['from'](this['waitingMessages']['values']())['sort'](function(e,f){return(e['clientTimestamp']||0x0)-(f['clientTimestamp']||0x0);});for(const e of d){const f=e['id'],g=await this['tryDecryptMessage'](e);if(g['success']&&g['message']&&g['decryptedData'])this['messageStorage']['saveMessage'](g['message']),a['push'](g['decryptedData']),b['push'](f),c['push'](f),this['waitingMessageRetries']['delete'](f);else{if(!g['shouldRetry'])this['failedMessages']['set'](f,{'message':e,'error':g['error']||'Unknown\x20error'}),await this['saveFailedMessage'](e,g['error']||'Unknown\x20error'),b['push'](f),c['push'](f),this['waitingMessageRetries']['delete'](f);else{const h=this['waitingMessageRetries']['get'](f)||0x0,i=h+0x1;i>=0x3?(this['failedMessages']['set'](f,{'message':e,'error':g['error']||'Retry\x20limit\x20exceeded'}),await this['saveFailedMessage'](e,g['error']||'Retry\x20limit\x20exceeded'),b['push'](f),c['push'](f),this['waitingMessageRetries']['delete'](f)):this['waitingMessageRetries']['set'](f,i);}}}for(const j of c){this['waitingMessages']['delete'](j);}if(c['length']>0x0){}}async['saveFailedMessage'](a,b){const c={'messageId':a['id'],'fromAddress':a['from'],'toAddress':this['userAddress'],'plaintextHash':a['plaintextHash']||'','guardAddress':a['guardAddress'],'passportAddress':a['passportAddress'],'lastReceivedLeafIndex':a['lastReceivedLeafIndex'],'direction':MessageDirection['RECEIVED'],'status':MessageStatus['DECRYPT_FAILED'],'msgType':a['msgType'],'leafIndex':a['merkleMetadata']?.['leafIndex'],'prevRoot':a['merkleMetadata']?.['prevRoot'],'newRoot':a['merkleMetadata']?.['newRoot'],'serverSignature':a['merkleMetadata']?.['serverSignature'],'serverTimestamp':a['merkleMetadata']?.['serverTimestamp'],'serverPublicKey':a['merkleMetadata']?.['serverPublicKey'],'createdAt':a['clientTimestamp']||Date['now'](),'receivedAt':Date['now'](),'zipMetadata':a['zipMetadata'],'decryptError':b,'decryptAttempts':0x1,'lastDecryptAttemptAt':Date['now']()};this['messageStorage']['saveMessage'](c);}['reschedulePolling'](){if(!this['isPollingRunning']||!this['pollingTimer'])return;clearTimeout(this['pollingTimer']),this['pollingTimer']=null,this['scheduleNextPoll']();}['getFailedMessages'](){return Array['from'](this['failedMessages']['entries']())['map'](([a,b])=>({'messageId':a,'from':b['message']['from'],'error':b['error'],'leafIndex':b['message']['merkleMetadata']?.['leafIndex']}));}['clearFailedMessages'](a){a?this['failedMessages']['delete'](a):this['failedMessages']['clear']();}['getWaitingMessageCount'](){return this['waitingMessages']['size'];}}
|
|
1
|
+
import{createHash}from'crypto';import*as a168a from'fs';import*as a168b from'path';import{MessengerSession,DecryptionEngine}from'./session.js';import{MessengerServerClient}from'./server.js';import{MessageStorage,SessionStateStorage}from'./storage.js';import{hashPlaintext,verifyMessage,bytesToBase64}from'./crypto.js';import{canonicalizeJson}from'./utils.js';import{DEFAULT_MESSENGER_CONFIG,MessengerError,MessengerErrorCode,MessageDirection,MessageStatus,WTS_FILE_BYTES_LIMIT,NORMAL_MESSAGE_BYTES_LIMIT,CHAIN_PROOF_TYPE}from'./types.js';import{isValidWowAddress}from'../../utils/sui-types.js';async function getAccount(){const {Account:a}=await import('../local/account.js');return a['Instance']();}export class Messenger{['session'];['serverClient'];['config'];['userAddress']=null;['onMessageCallback']=null;['pollingTimer']=null;['messageConsecutiveEmptyPulls']=0x0;['prekeyConsecutiveOkCount']=0x0;['currentMessageInterval'];['isPollingRunning']=![];['messageStorage'];['sessionStateStorage'];['decryptionEngine'];['waitingMessages']=new Map();['failedMessages']=new Map();['waitingMessageRetries']=new Map();constructor(a,b){this['userAddress']=a,this['config']={...DEFAULT_MESSENGER_CONFIG,...b},this['session']=new MessengerSession(a,this['config']),this['serverClient']=new MessengerServerClient(this['config']),this['messageStorage']=new MessageStorage(a),this['sessionStateStorage']=new SessionStateStorage(a),this['decryptionEngine']=new DecryptionEngine(this['session']['store']),this['currentMessageInterval']=this['config']['message_poll_default_interval_ms']??0x6*0x3c*0x3e8;}['getUserAddress'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');return this['userAddress'];}async['getPublicKey'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const a=await(await getAccount())['get'](this['userAddress'],![]);return a?.['pubkey']||'';}['isValidGuardMessage'](a,b){return Boolean(a&&b&&isValidWowAddress(a)&&isValidWowAddress(b));}async['generateSignatureParams'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const b=await(await getAccount())['get'](this['userAddress'],![]);if(!b?.['secret'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'Account\x20not\x20found\x20or\x20no\x20secret\x20key\x20for\x20'+this['userAddress']);const {Falcon512Keypair:c}=await import('../../keypairs/falcon512/index.js'),d=c['fromSecretKey'](b['secret']),e=d['getPublicKey'](),f=e['toWPublicKey'](),g=Date['now'](),h=this['generateNonce'](),i=a+':'+f+':'+g+':'+h,j=await d['sign'](new TextEncoder()['encode'](i));return{'signatureScheme':'Falcon512','signature':Buffer['from'](j)['toString']('base64'),'timestamp':g,'nonce':h};}['generateNonce'](){const a=new Uint8Array(0x10);return crypto['getRandomValues'](a),Array['from'](a,c=>c['toString'](0x10)['padStart'](0x2,'0'))['join']('');}async['initialize'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');await this['session']['ensureIdentity'](this['userAddress']),await this['session']['registerDevice'](this['userAddress']),await this['session']['ensurePreKeys'](this['userAddress']),await this['checkAndRefillPrekeys'](),this['startPollingTimer']();}async['checkAndRefillPrekeys'](){if(!this['userAddress'])return;await this['session']['ensurePreKeys'](this['userAddress'],![]);}['startPollingTimer'](){this['pollingTimer']&&clearTimeout(this['pollingTimer']),this['isPollingRunning']=!![],this['scheduleNextPoll']();}['stopPollingTimer'](){this['isPollingRunning']=![],this['pollingTimer']&&(clearTimeout(this['pollingTimer']),this['pollingTimer']=null);}['scheduleNextPoll'](){if(!this['isPollingRunning'])return;const a=this['getNextPollInterval']();this['pollingTimer']=setTimeout(()=>{this['poll']()['catch'](b=>{})['finally'](()=>{this['scheduleNextPoll']();});},a);}['getNextPollInterval'](){if(this['waitingMessages']['size']>0x0)return this['config']['message_poll_waiting_interval_ms']??0x3*0x3e8;return this['currentMessageInterval'];}async['poll'](){if(!this['userAddress'])return;try{const a=await this['pullMessages']();a['messages']['length']>0x0?(this['messageConsecutiveEmptyPulls']=0x0,this['currentMessageInterval']=this['config']['message_poll_fast_interval_ms']??0x6*0x3e8,this['onMessageCallback']&&this['onMessageCallback'](a['messages'])):(this['messageConsecutiveEmptyPulls']++,this['messageConsecutiveEmptyPulls']>=(this['config']['message_poll_consecutive_empty_limit']??0x3)&&(this['currentMessageInterval']=this['config']['message_poll_default_interval_ms']??0x6*0x3c*0x3e8,this['messageConsecutiveEmptyPulls']=0x0));if(a['prekey_status']){const b=a['prekey_status'];b['shouldRefill']?(this['prekeyConsecutiveOkCount']=0x0,await this['checkAndRefillPrekeys']()):(this['prekeyConsecutiveOkCount']++,this['prekeyConsecutiveOkCount']>=(this['config']['prekey_poll_consecutive_ok_limit']??0x3)&&(this['prekeyConsecutiveOkCount']=0x0));}}catch(c){}}['triggerFastPoll'](){this['currentMessageInterval']=this['config']['message_poll_fast_interval_ms']??0x6*0x3e8,this['messageConsecutiveEmptyPulls']=0x0,this['isPollingRunning']&&(this['pollingTimer']&&clearTimeout(this['pollingTimer']),this['scheduleNextPoll']());}async['sendMessage'](a,b,c){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const d=Date['now'](),e=Date['now'](),f=this['generateNonce'](),g=new TextEncoder()['encode'](b)['length'];if(g>NORMAL_MESSAGE_BYTES_LIMIT)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20size\x20('+g+'\x20bytes)\x20exceeds\x20maximum\x20allowed\x20size\x20('+NORMAL_MESSAGE_BYTES_LIMIT+'\x20bytes).\x20Consider\x20using\x20sendZipFile\x20for\x20large\x20content.');await this['pullMessages']();const h=this['messageStorage']['getLastReceivedLeafIndex'](this['userAddress'],a),i=await this['session']['encryptMessage'](this['userAddress'],a,b),j=Buffer['from'](new Uint8Array(i['body']))['toString']('base64'),k=hashPlaintext(b,d,c?.['guardAddress'],c?.['passportAddress'],h),l=await(await getAccount())['get'](this['userAddress'],![]);if(!l)throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20account\x20not\x20found');const m=l['pubkey'],n=c?.['guardAddress']||'',o=c?.['passportAddress']||'',p=h>=0x0?h['toString']():'',q=c?.['force']?'true':'false',r='send_message:'+this['userAddress']+':'+a+':'+n+':'+o+':'+k+':'+p+':'+m+':'+e+':'+f+':'+q,s=await(await getAccount())['signData'](this['userAddress'],r),t=Buffer['from'](s['signature']['slice'](0x2),'hex'),u=bytesToBase64(new Uint8Array(t)),v=await this['serverClient']['sendMessage']({'sender':s['publicKey'],'recipient':a,'ciphertext':j,'plaintextHash':k,'clientTimestamp':d,'msgType':i['type'],'signatureScheme':'Falcon512','signature':u,'timestamp':e,'nonce':f,'guardAddress':c?.['guardAddress'],'passportAddress':c?.['passportAddress'],'force':c?.['force'],'lastReceivedLeafIndex':h>=0x0?h:undefined}),w={'messageId':v['messageId'],'fromAddress':this['userAddress'],'toAddress':a,'plaintextHash':k,'plaintext':b,'guardAddress':c?.['guardAddress'],'passportAddress':c?.['passportAddress'],'lastReceivedLeafIndex':h,'direction':MessageDirection['SENT'],'status':v['status']==='confirmed'?MessageStatus['CONFIRMED']:MessageStatus['PENDING'],'msgType':i['type'],'createdAt':d};v['merkleData']&&(w['leafIndex']=v['merkleData']['leafIndex'],w['prevRoot']=v['merkleData']['prevRoot'],w['newRoot']=v['merkleData']['newRoot'],w['serverSignature']=v['merkleData']['serverSignature'],w['serverTimestamp']=v['merkleData']['serverTimestamp'],w['serverPublicKey']=v['merkleData']['serverPublicKey'],this['sessionStateStorage']['updateSessionState'](this['userAddress'],a,{'currentRoot':v['merkleData']['newRoot'],'prevRoot':v['merkleData']['prevRoot'],'lastLeafIndex':v['merkleData']['leafIndex'],'lastSyncAt':Date['now']()}));this['messageStorage']['saveMessage'](w);if(v['pendingMerkleData'])for(const [x,y]of Object['entries'](v['pendingMerkleData'])){const z=this['messageStorage']['getMessage'](x);z&&z['status']===MessageStatus['PENDING']&&this['messageStorage']['updateMessageStatus'](x,MessageStatus['CONFIRMED'],{'leafIndex':y['leafIndex'],'newRoot':y['newRoot'],'serverSignature':y['serverSignature'],'serverTimestamp':y['serverTimestamp'],'serverPublicKey':y['serverPublicKey']});}return this['triggerFastPoll'](),{'messageId':v['messageId'],'status':w['status'],'merkleData':v['merkleData'],'guardList':v['guard_list'],'lastReceivedLeafIndex':h>=0x0?h:undefined};}async['pullMessages'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const b=Date['now'](),c=this['generateNonce'](),d='fetch_messages:'+this['userAddress']+':'+(a||0x64)+':'+b+':'+c,e=await(await getAccount())['get'](this['userAddress'],![]),f=e?.['pubkey']||'',g=await(await getAccount())['signData'](this['userAddress'],d),h=Buffer['from'](g['signature']['slice'](0x2),'hex'),i={'signatureScheme':'Falcon512','signature':bytesToBase64(h),'timestamp':b,'nonce':c},j=await this['serverClient']['pullMessages'](this['userAddress'],f,i,a);if(j['messages']['length']===0x0)return{'messages':[],'prekey_status':j['prekey_status']};const k=[],l=[],m=[...j['messages']]['sort'](function(n,o){return(n['clientTimestamp']||0x0)-(o['clientTimestamp']||0x0);});await this['processWaitingMessages'](k,l);for(const n of m){if(this['waitingMessages']['has'](n['id'])){l['push'](n['id']);continue;}if(this['failedMessages']['has'](n['id'])){l['push'](n['id']);continue;}const o=this['messageStorage']['getMessage'](n['id']);if(o){l['push'](n['id']);continue;}const p=await this['tryDecryptMessage'](n);if(p['success']&&p['message']&&p['decryptedData'])this['messageStorage']['saveMessage'](p['message']),k['push'](p['decryptedData']),l['push'](n['id']),this['waitingMessages']['delete'](n['id']);else p['shouldRetry']?this['waitingMessages']['set'](n['id'],n):(this['failedMessages']['set'](n['id'],{'message':n,'error':p['error']||'Unknown\x20error'}),await this['saveFailedMessage'](n,p['error']||'Unknown\x20error'),l['push'](n['id']));}this['waitingMessages']['size']>0x0&&this['isPollingRunning']&&this['reschedulePolling']();if(l['length']>0x0&&this['userAddress']){const q=Date['now'](),r=this['generateNonce'](),s=await(await getAccount())['get'](this['userAddress'],![]);if(s?.['pubkey']){const t='ack_messages:'+this['userAddress']+':'+l['join'](',')+':'+s['pubkey']+':'+q+':'+r,u=await(await getAccount())['signData'](this['userAddress'],t),v=Buffer['from'](u['signature']['slice'](0x2),'hex'),w=bytesToBase64(new Uint8Array(v));await this['serverClient']['acknowledgeMessages'](l,u['publicKey'],{'publicKey':u['publicKey'],'signatureScheme':'Falcon512','signature':w,'timestamp':q,'nonce':r});}}return{'messages':k,'prekey_status':j['prekey_status']};}['getLastSentLeafIndex'](a){if(!this['userAddress'])return-0x1;const b=this['messageStorage']['getMessagesBySession'](this['userAddress'],a),c=b['filter'](d=>d['direction']===MessageDirection['SENT']&&d['leafIndex']!==undefined);if(c['length']===0x0)return-0x1;return Math['max'](...c['map'](d=>d['leafIndex']));}['getSessionMessages'](a){if(!this['userAddress'])return[];return this['messageStorage']['getMessagesBySession'](this['userAddress'],a);}['getSessionState'](a){if(!this['userAddress'])return undefined;return this['sessionStateStorage']['getSessionState'](this['userAddress'],a);}async['submitChainProof'](a,b,c){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const d=this['sessionStateStorage']['getSessionState'](this['userAddress'],b);if(!d||!d['currentRoot'])throw new MessengerError(MessengerErrorCode['SESSION_NOT_ESTABLISHED'],'No\x20session\x20state\x20found');const e=this['messageStorage']['getMessagesBySession'](this['userAddress'],b),f=e[e['length']-0x1];if(!f||!f['serverPublicKey']||!f['serverSignature'])throw new MessengerError(MessengerErrorCode['INVALID_PROOF'],'No\x20temporal\x20proof\x20(missing\x20server\x20public\x20key\x20or\x20signature),\x20cannot\x20submit\x20Proof\x20to\x20WoWok\x20blockchain');const g=f['serverPublicKey'],h=f['serverSignature'],i={'sessionId':d['sessionId'],'merkleRoot':d['currentRoot'],'messageCount':d['messageCount'],'timestamp':Date['now']()},{CallProof:j}=await import('../call/proof.js'),k=new j({'proof':JSON['stringify'](i),'server_pubkey':g,'server_signature':h,'proof_type':CHAIN_PROOF_TYPE,'description':c||'Messenger\x20session\x20proof\x20for\x20'+this['userAddress']+'\x20<->\x20'+b,'item_count':d['messageCount'],'about_address':d['sessionId']}),l=await k['call'](a),m=l?.['objectChanges'],n=m?.['find'](o=>o['objectType']?.['includes']('Proof'))?.['objectId'];return{'proofAddress':n||'','txHash':l?.['digest']||''};}['destroy'](){this['stopPollingTimer']();}['disconnect'](){this['destroy']();}['setOnMessageCallback'](a){this['onMessageCallback']=a;}async['sendZipFile'](a,b,c){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const d=await this['loadFileData'](b),{ZipWriter:e,BlobWriter:f,Uint8ArrayReader:g}=await import('@zip.js/zip.js'),h=c?.['fileName']||a168b['basename'](b)||'file.zip',i=c?.['contentType']||this['detectContentType'](h),j=new f('application/zip'),k=new e(j);await k['add'](h,new g(d)),await k['close']();const l=await j['getData'](),m=new Uint8Array(await l['arrayBuffer']());if(m['length']>WTS_FILE_BYTES_LIMIT)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'ZIP\x20file\x20size\x20('+m['length']+'\x20bytes)\x20exceeds\x20local\x20maximum\x20allowed\x20size\x20('+WTS_FILE_BYTES_LIMIT+'\x20bytes)');const n='0x'+createHash('sha256')['update'](m)['digest']('hex'),o=Buffer['from'](m)['toString']('base64'),p={'fileName':h+'.zip','fileSize':m['length'],'fileHash':n,'contentType':i};await this['pullMessages']();const q=this['messageStorage']['getLastReceivedLeafIndex'](this['userAddress'],a),r=Date['now'](),s=await this['session']['encryptMessage'](this['userAddress'],a,o),t=Buffer['from'](new Uint8Array(s['body']))['toString']('base64'),u=c?.['guardAddress']||'',v=c?.['passportAddress']||'',w=hashPlaintext(o,r,u,v,q),x=Date['now'](),y=this['generateNonce'](),z=await(await getAccount())['get'](this['userAddress'],![]);if(!z)throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20account\x20not\x20found');const A=z['pubkey'],B=q>=0x0?q['toString']():'',C=c?.['force']?'true':'false',D='send_message:'+this['userAddress']+':'+a+':'+u+':'+v+':'+w+':'+B+':'+A+':'+x+':'+y+':'+C,E=await(await getAccount())['signData'](this['userAddress'],D),F=Buffer['from'](E['signature']['slice'](0x2),'hex'),G=bytesToBase64(new Uint8Array(F)),H=await this['serverClient']['sendMessage']({'sender':E['publicKey'],'recipient':a,'ciphertext':t,'plaintextHash':w,'clientTimestamp':r,'msgType':s['type'],'zipMetadata':p,'guardAddress':c?.['guardAddress'],'passportAddress':c?.['passportAddress'],'force':c?.['force'],'lastReceivedLeafIndex':q>=0x0?q:undefined,'signatureScheme':'Falcon512','signature':G,'timestamp':x,'nonce':y}),I={'messageId':H['messageId'],'fromAddress':this['userAddress'],'toAddress':a,'plaintextHash':w,'plaintext':o,'guardAddress':c?.['guardAddress'],'passportAddress':c?.['passportAddress'],'lastReceivedLeafIndex':q,'direction':MessageDirection['SENT'],'status':H['status']==='confirmed'?MessageStatus['CONFIRMED']:MessageStatus['PENDING'],'msgType':s['type'],'zipMetadata':p,'createdAt':r};H['merkleData']&&(I['leafIndex']=H['merkleData']['leafIndex'],I['prevRoot']=H['merkleData']['prevRoot'],I['newRoot']=H['merkleData']['newRoot'],I['serverSignature']=H['merkleData']['serverSignature'],I['serverTimestamp']=H['merkleData']['serverTimestamp'],I['serverPublicKey']=H['merkleData']['serverPublicKey'],this['sessionStateStorage']['updateSessionState'](this['userAddress'],a,{'currentRoot':H['merkleData']['newRoot'],'prevRoot':H['merkleData']['prevRoot'],'lastLeafIndex':H['merkleData']['leafIndex'],'lastSyncAt':Date['now']()}));this['messageStorage']['saveMessage'](I);if(H['pendingMerkleData'])for(const [J,K]of Object['entries'](H['pendingMerkleData'])){const L=this['messageStorage']['getMessage'](J);L&&L['status']===MessageStatus['PENDING']&&this['messageStorage']['updateMessageStatus'](J,MessageStatus['CONFIRMED'],{'leafIndex':K['leafIndex'],'newRoot':K['newRoot'],'serverSignature':K['serverSignature'],'serverTimestamp':K['serverTimestamp'],'serverPublicKey':K['serverPublicKey']});}return this['triggerFastPoll'](),{'messageId':H['messageId'],'status':I['status'],'merkleData':H['merkleData'],'guardList':H['guard_list'],'lastReceivedLeafIndex':q>=0x0?q:undefined};}async['loadFileData'](a){if(a['startsWith']('http://')||a['startsWith']('https://')){const d=await fetch(a);if(!d['ok'])throw new MessengerError(MessengerErrorCode['NETWORK_ERROR'],'Failed\x20to\x20fetch\x20file\x20from\x20'+a+':\x20'+d['statusText']);const e=await d['arrayBuffer']();return new Uint8Array(e);}const b=a168b['resolve'](a);if(!a168a['existsSync'](b))throw new MessengerError(MessengerErrorCode['FILE_NOT_FOUND'],'File\x20not\x20found:\x20'+b);const c=a168a['readFileSync'](b);return new Uint8Array(c);}['detectContentType'](a){const b=a168b['extname'](a)['toLowerCase']();switch(b){case'.wts':return'wts';case'.wip':return'wip';default:return'zip';}}async['_createSignedRequest'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const b=Date['now'](),c=this['generateNonce'](),d=canonicalizeJson(a),e=b+':'+c+':'+d,f=await(await getAccount())['signData'](this['userAddress'],e),g=Buffer['from'](f['signature']['slice'](0x2),'hex'),h=bytesToBase64(new Uint8Array(g)),i=await(await getAccount())['get'](this['userAddress'],![]);if(!i||!i['pubkey'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'Account\x20public\x20key\x20not\x20found');return{'userAddress':this['userAddress'],'publicKey':i['pubkey'],'signatureScheme':'Falcon512','signature':h,'timestamp':b,'nonce':c,'data':a};}['_validateAddresses'](a){const b=[],c=[];for(const d of a){isValidWowAddress(d)?b['push'](d):c['push'](d);}return{'valid':b,'invalid':c};}async['addToBlacklist'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'add','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['addToBlacklist'](this['userAddress'],e);}async['removeFromBlacklist'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'remove','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['removeFromBlacklist'](this['userAddress'],e);}async['clearBlacklist'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const a={},b=await this['_createSignedRequest'](a);return this['serverClient']['clearBlacklist'](this['userAddress'],b);}async['getBlacklist'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const a=await this['_createSignedRequest']({});return this['serverClient']['getBlacklist'](this['userAddress'],a);}async['existInBlacklist'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'exist','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['existInBlacklist'](this['userAddress'],e);}async['addToFriendsList'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'add','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['addToFriendsList'](this['userAddress'],e);}async['removeFromFriendsList'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'remove','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['removeFromFriendsList'](this['userAddress'],e);}async['clearFriendsList'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const a={},b=await this['_createSignedRequest'](a);return this['serverClient']['clearFriendsList'](this['userAddress'],b);}async['getFriendsList'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const a=await this['_createSignedRequest']({});return this['serverClient']['getFriendsList'](this['userAddress'],a);}async['existInFriendsList'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'exist','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['existInFriendsList'](this['userAddress'],e);}async['addToGuardList'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const b={'guards':a},c=await this['_createSignedRequest'](b);return this['serverClient']['addToGuardList'](this['userAddress'],c);}async['removeFromGuardList'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'remove','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['removeFromGuardList'](this['userAddress'],e);}async['getGuardList'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const a=await this['_createSignedRequest']({});return this['serverClient']['getGuardList'](this['userAddress'],a);}async['getSettings'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const a=await this['_createSignedRequest']({});return this['serverClient']['getSettings'](this['userAddress'],a);}async['setSettings'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const b={'allowStrangerMessages':a['allowStrangerMessages'],'maxInboxSize':a['maxInboxSize']},c=await this['_createSignedRequest'](b);return this['serverClient']['updateSettings'](this['userAddress'],c);}async['tryDecryptMessage'](a){try{const b=Uint8Array['from'](Buffer['from'](a['bodyB64'],'base64')),c=await this['decryptionEngine']['decryptMessage'](this['userAddress'],a['from'],b['buffer'],a['msgType']);if(!c['success']){const h=this['isRetryableError'](c['error']||'');return{'success':![],'shouldRetry':h,'error':c['error'],'sessionUpdated':c['sessionUpdated']};}const d=c['plaintext'];if(!a['clientTimestamp'])throw new Error('Missing\x20clientTimestamp\x20for\x20message\x20'+a['id']);if(!a['plaintextHash'])throw new Error('Missing\x20plaintextHash\x20for\x20message\x20'+a['id']);const e=verifyMessage({'messageId':a['id'],'plaintext':d,'plaintextHash':a['plaintextHash'],'createdAt':a['clientTimestamp'],'guardAddress':a['guardAddress'],'passportAddress':a['passportAddress'],'lastReceivedLeafIndex':a['lastReceivedLeafIndex'],'serverSignature':a['merkleMetadata']?.['serverSignature'],'serverPublicKey':a['merkleMetadata']?.['serverPublicKey'],'merkleMetadata':a['merkleMetadata']?{'prevRoot':a['merkleMetadata']['prevRoot'],'newRoot':a['merkleMetadata']['newRoot'],'serverTimestamp':a['merkleMetadata']['serverTimestamp'],'leafIndex':a['merkleMetadata']['leafIndex'],'proofSiblings':a['merkleMetadata']['proofSiblings'],'proofIndices':a['merkleMetadata']['proofIndices']}:undefined});if(!e['valid'])throw new Error(e['error']);const f={'messageId':a['id'],'fromAddress':a['from'],'toAddress':this['userAddress'],'plaintextHash':a['plaintextHash'],'plaintext':d,'guardAddress':a['guardAddress'],'passportAddress':a['passportAddress'],'lastReceivedLeafIndex':a['lastReceivedLeafIndex'],'direction':MessageDirection['RECEIVED'],'status':MessageStatus['DECRYPTED'],'msgType':a['msgType'],'leafIndex':a['merkleMetadata']?.['leafIndex'],'prevRoot':a['merkleMetadata']?.['prevRoot'],'newRoot':a['merkleMetadata']?.['newRoot'],'serverSignature':a['merkleMetadata']?.['serverSignature'],'serverTimestamp':a['merkleMetadata']?.['serverTimestamp'],'serverPublicKey':a['merkleMetadata']?.['serverPublicKey'],'createdAt':a['clientTimestamp'],'receivedAt':Date['now'](),'zipMetadata':a['zipMetadata']};a['merkleMetadata']&&this['sessionStateStorage']['updateSessionState'](this['userAddress'],a['from'],{'currentRoot':a['merkleMetadata']['newRoot'],'prevRoot':a['merkleMetadata']['prevRoot'],'lastLeafIndex':a['merkleMetadata']['leafIndex'],'lastSyncAt':Date['now']()});const g=a['merkleMetadata']?.['serverTimestamp']||a['clientTimestamp']||Date['now']();if(a['lastReceivedLeafIndex']!==undefined&&a['lastReceivedLeafIndex']>=0x0){const i=this['messageStorage']['getMessagesBySession'](this['userAddress'],a['from'])['filter'](j=>j['direction']===MessageDirection['SENT']&&j['status']===MessageStatus['CONFIRMED']&&j['leafIndex']!==undefined&&j['leafIndex']<=a['lastReceivedLeafIndex']);for(const j of i){this['messageStorage']['updateMessageStatus'](j['messageId'],MessageStatus['READ']);}}return{'success':!![],'shouldRetry':![],'message':f,'decryptedData':{'id':a['id'],'from':a['from'],'plaintext':d,'timestamp':g,'merkleVerified':!!a['merkleMetadata'],'merkleData':a['merkleMetadata']?{'leafIndex':a['merkleMetadata']['leafIndex'],'rootHash':a['merkleMetadata']['newRoot']}:undefined},'sessionUpdated':c['sessionUpdated']};}catch(k){const l=k instanceof Error?k['message']:String(k),m=this['isRetryableError'](l);return{'success':![],'shouldRetry':m,'error':l};}}['isRetryableError'](a){const b=[/message number/i,/chain key/i,/session not found/i,/prekey not found/i,/PREKEY 竞争:我的地址较小,保留我的会话/i,/The operation failed for an operation-specific reason/i,/DOMException/i,/收到 WHISPER_MESSAGE 但无现有会话,需要等待 PREKEY_MESSAGE/i];return b['some'](c=>c['test'](a));}async['processWaitingMessages'](a,b){if(this['waitingMessages']['size']===0x0)return;const c=[],d=Array['from'](this['waitingMessages']['values']())['sort'](function(e,f){return(e['clientTimestamp']||0x0)-(f['clientTimestamp']||0x0);});for(const e of d){const f=e['id'],g=await this['tryDecryptMessage'](e);if(g['success']&&g['message']&&g['decryptedData'])this['messageStorage']['saveMessage'](g['message']),a['push'](g['decryptedData']),b['push'](f),c['push'](f),this['waitingMessageRetries']['delete'](f);else{if(!g['shouldRetry'])this['failedMessages']['set'](f,{'message':e,'error':g['error']||'Unknown\x20error'}),await this['saveFailedMessage'](e,g['error']||'Unknown\x20error'),b['push'](f),c['push'](f),this['waitingMessageRetries']['delete'](f);else{const h=this['waitingMessageRetries']['get'](f)||0x0,i=h+0x1;i>=0x3?(this['failedMessages']['set'](f,{'message':e,'error':g['error']||'Retry\x20limit\x20exceeded'}),await this['saveFailedMessage'](e,g['error']||'Retry\x20limit\x20exceeded'),b['push'](f),c['push'](f),this['waitingMessageRetries']['delete'](f)):this['waitingMessageRetries']['set'](f,i);}}}for(const j of c){this['waitingMessages']['delete'](j);}if(c['length']>0x0){}}async['saveFailedMessage'](a,b){const c={'messageId':a['id'],'fromAddress':a['from'],'toAddress':this['userAddress'],'plaintextHash':a['plaintextHash']||'','guardAddress':a['guardAddress'],'passportAddress':a['passportAddress'],'lastReceivedLeafIndex':a['lastReceivedLeafIndex'],'direction':MessageDirection['RECEIVED'],'status':MessageStatus['DECRYPT_FAILED'],'msgType':a['msgType'],'leafIndex':a['merkleMetadata']?.['leafIndex'],'prevRoot':a['merkleMetadata']?.['prevRoot'],'newRoot':a['merkleMetadata']?.['newRoot'],'serverSignature':a['merkleMetadata']?.['serverSignature'],'serverTimestamp':a['merkleMetadata']?.['serverTimestamp'],'serverPublicKey':a['merkleMetadata']?.['serverPublicKey'],'createdAt':a['clientTimestamp']||Date['now'](),'receivedAt':Date['now'](),'zipMetadata':a['zipMetadata'],'decryptError':b,'decryptAttempts':0x1,'lastDecryptAttemptAt':Date['now']()};this['messageStorage']['saveMessage'](c);}['reschedulePolling'](){if(!this['isPollingRunning']||!this['pollingTimer'])return;clearTimeout(this['pollingTimer']),this['pollingTimer']=null,this['scheduleNextPoll']();}['getFailedMessages'](){return Array['from'](this['failedMessages']['entries']())['map'](([a,b])=>({'messageId':a,'from':b['message']['from'],'error':b['error'],'leafIndex':b['message']['merkleMetadata']?.['leafIndex']}));}['clearFailedMessages'](a){a?this['failedMessages']['delete'](a):this['failedMessages']['clear']();}['getWaitingMessageCount'](){return this['waitingMessages']['size'];}}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import type { X25519KeyPair,
|
|
1
|
+
import type { X25519KeyPair, Falcon512KeyPair, MLKEMKeyPair } from "./types.js";
|
|
2
2
|
export declare function generateRandomBytes(length: number): Uint8Array;
|
|
3
3
|
export declare function generateX25519KeyPair(): X25519KeyPair;
|
|
4
4
|
export declare function x25519DH(privateKey: Uint8Array, publicKey: Uint8Array): Uint8Array;
|
|
5
|
-
export declare function
|
|
6
|
-
export declare function
|
|
7
|
-
export declare function
|
|
8
|
-
export declare function ed25519PrivateKeyToX25519(ed25519PrivateKey: Uint8Array): Uint8Array;
|
|
9
|
-
export declare function ed25519PublicKeyToX25519(ed25519PublicKey: Uint8Array): Uint8Array;
|
|
5
|
+
export declare function generateFalcon512KeyPair(): Falcon512KeyPair;
|
|
6
|
+
export declare function falcon512Sign(privateKey: Uint8Array, message: Uint8Array): Uint8Array;
|
|
7
|
+
export declare function falcon512Verify(publicKey: Uint8Array, message: Uint8Array, signature: Uint8Array): boolean;
|
|
10
8
|
export declare function generateMLKEMKeyPair(): MLKEMKeyPair;
|
|
11
9
|
export declare function mlkemEncapsulate(publicKey: Uint8Array): {
|
|
12
10
|
ciphertext: Uint8Array;
|
|
@@ -37,3 +35,5 @@ export declare function bytesToHex(bytes: Uint8Array): string;
|
|
|
37
35
|
export declare function hexToBytes(hex: string): Uint8Array;
|
|
38
36
|
export declare function concatBytes(...arrays: Uint8Array[]): Uint8Array;
|
|
39
37
|
export declare function deriveRegistrationId(publicKey: Uint8Array): number;
|
|
38
|
+
export declare function generateX25519BindingSignature(falcon512PrivateKey: Uint8Array, x25519PublicKey: Uint8Array): Uint8Array;
|
|
39
|
+
export declare function verifyX25519BindingSignature(falcon512PublicKey: Uint8Array, x25519PublicKey: Uint8Array, signature: Uint8Array): boolean;
|