wowok 2.2.4 → 2.2.6
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/_deps/bcs/bcs-type.d.ts +127 -0
- package/dist/cjs/_deps/bcs/bcs-type.js +1 -0
- package/dist/cjs/_deps/bcs/bcs.d.ts +49 -0
- package/dist/cjs/_deps/bcs/bcs.js +1 -0
- package/dist/cjs/_deps/bcs/index.d.ts +16 -0
- package/dist/cjs/_deps/bcs/index.js +1 -0
- package/dist/cjs/_deps/bcs/reader.d.ts +15 -0
- package/dist/cjs/_deps/bcs/reader.js +1 -0
- package/dist/cjs/_deps/bcs/types.d.ts +24 -0
- package/dist/cjs/_deps/bcs/types.js +1 -0
- package/dist/cjs/_deps/bcs/uleb.d.ts +5 -0
- package/dist/cjs/_deps/bcs/uleb.js +1 -0
- package/dist/cjs/_deps/bcs/utils.d.ts +4 -0
- package/dist/cjs/_deps/bcs/utils.js +1 -0
- package/dist/cjs/_deps/bcs/writer.d.ts +28 -0
- package/dist/cjs/_deps/bcs/writer.js +1 -0
- package/dist/cjs/_deps/utils/b58.d.ts +2 -0
- package/dist/cjs/_deps/utils/b58.js +1 -0
- package/dist/cjs/_deps/utils/b64.d.ts +2 -0
- package/dist/cjs/_deps/utils/b64.js +1 -0
- package/dist/cjs/_deps/utils/chunk.d.ts +1 -0
- package/dist/cjs/_deps/utils/chunk.js +1 -0
- package/dist/cjs/_deps/utils/dataloader.d.ts +43 -0
- package/dist/cjs/_deps/utils/dataloader.js +1 -0
- package/dist/cjs/_deps/utils/hex.d.ts +2 -0
- package/dist/cjs/_deps/utils/hex.js +1 -0
- package/dist/cjs/_deps/utils/index.d.ts +7 -0
- package/dist/cjs/_deps/utils/index.js +1 -0
- package/dist/cjs/_deps/utils/types.d.ts +4 -0
- package/dist/cjs/_deps/utils/types.js +1 -0
- package/dist/cjs/_deps/utils/with-resolver.d.ts +6 -0
- package/dist/cjs/_deps/utils/with-resolver.js +1 -0
- package/dist/cjs/bcs/bcs.d.ts +245 -245
- package/dist/cjs/bcs/bcs.js +1 -1
- package/dist/cjs/bcs/effects.d.ts +197 -197
- package/dist/cjs/bcs/effects.js +1 -1
- package/dist/cjs/bcs/index.d.ts +3 -3
- package/dist/cjs/bcs/index.js +1 -1
- package/dist/cjs/bcs/pure.d.ts +1 -1
- package/dist/cjs/bcs/pure.js +1 -1
- package/dist/cjs/bcs/type-tag-serializer.js +1 -1
- package/dist/cjs/bcs/types.d.ts +4 -4
- package/dist/cjs/client/index.d.ts +4 -4
- package/dist/cjs/client/index.js +1 -1
- package/dist/cjs/cryptography/keypair.d.ts +2 -2
- package/dist/cjs/cryptography/keypair.js +1 -1
- package/dist/cjs/cryptography/mnemonics.js +1 -1
- package/dist/cjs/cryptography/publickey.js +1 -1
- package/dist/cjs/cryptography/signature.js +1 -1
- package/dist/cjs/experimental/client.d.ts +5 -5
- package/dist/cjs/experimental/core.d.ts +17 -17
- package/dist/cjs/experimental/core.js +1 -1
- package/dist/cjs/experimental/errors.d.ts +2 -2
- package/dist/cjs/experimental/errors.js +1 -1
- package/dist/cjs/experimental/index.d.ts +2 -2
- package/dist/cjs/experimental/transports/utils.d.ts +3 -3
- package/dist/cjs/experimental/types.d.ts +3 -3
- package/dist/cjs/faucet/faucet.d.ts +3 -3
- package/dist/cjs/faucet/faucet.js +1 -1
- package/dist/cjs/faucet/index.d.ts +1 -1
- package/dist/cjs/faucet/index.js +1 -1
- package/dist/cjs/grpc/client.d.ts +7 -7
- package/dist/cjs/grpc/client.js +1 -1
- package/dist/cjs/grpc/core.d.ts +15 -15
- package/dist/cjs/grpc/core.js +1 -1
- package/dist/cjs/grpc/index.d.ts +2 -2
- package/dist/cjs/grpc/index.js +1 -1
- package/dist/cjs/index.d.ts +3 -3
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/jsonRpc/client.d.ts +24 -24
- package/dist/cjs/jsonRpc/client.js +1 -1
- package/dist/cjs/jsonRpc/core.d.ts +20 -20
- package/dist/cjs/jsonRpc/core.js +1 -1
- package/dist/cjs/jsonRpc/errors.d.ts +3 -3
- package/dist/cjs/jsonRpc/errors.js +1 -1
- package/dist/cjs/jsonRpc/http-transport.js +1 -1
- package/dist/cjs/jsonRpc/index.d.ts +2 -2
- package/dist/cjs/jsonRpc/index.js +1 -1
- package/dist/cjs/jsonRpc/json-rpc-resolver.d.ts +2 -2
- package/dist/cjs/jsonRpc/json-rpc-resolver.js +1 -1
- package/dist/cjs/jsonRpc/types/chain.d.ts +4 -4
- package/dist/cjs/jsonRpc/types/changes.d.ts +7 -7
- package/dist/cjs/jsonRpc/types/generated.d.ts +63 -63
- package/dist/cjs/jsonRpc/types/params.d.ts +13 -13
- package/dist/cjs/keypairs/falcon512/publickey.js +1 -1
- package/dist/cjs/multisig/publickey.js +1 -1
- package/dist/cjs/multisig/signer.js +1 -1
- package/dist/cjs/transactions/Commands.js +1 -1
- package/dist/cjs/transactions/Inputs.d.ts +1 -1
- package/dist/cjs/transactions/Inputs.js +1 -1
- package/dist/cjs/transactions/ObjectCache.js +1 -1
- package/dist/cjs/transactions/Transaction.d.ts +5 -5
- package/dist/cjs/transactions/Transaction.js +1 -1
- package/dist/cjs/transactions/TransactionData.js +1 -1
- package/dist/cjs/transactions/__tests__/Transaction.test.js +1 -1
- package/dist/cjs/transactions/__tests__/bcs.test.js +1 -1
- package/dist/cjs/transactions/data/internal.d.ts +3 -3
- package/dist/cjs/transactions/data/internal.js +1 -1
- package/dist/cjs/transactions/data/v1.d.ts +2 -2
- package/dist/cjs/transactions/data/v1.js +1 -1
- package/dist/cjs/transactions/data/v2.d.ts +1 -1
- package/dist/cjs/transactions/data/v2.js +1 -1
- package/dist/cjs/transactions/executor/caching.d.ts +4 -4
- package/dist/cjs/transactions/executor/parallel.d.ts +4 -4
- package/dist/cjs/transactions/executor/parallel.js +1 -1
- package/dist/cjs/transactions/executor/serial.d.ts +4 -4
- package/dist/cjs/transactions/executor/serial.js +1 -1
- package/dist/cjs/transactions/intents/CoinWithBalance.d.ts +2 -2
- package/dist/cjs/transactions/intents/CoinWithBalance.js +1 -1
- package/dist/cjs/transactions/pure.d.ts +1 -1
- package/dist/cjs/transactions/pure.js +1 -1
- package/dist/cjs/transactions/serializer.d.ts +3 -3
- package/dist/cjs/transactions/serializer.js +1 -1
- package/dist/cjs/transactions/utils.d.ts +4 -4
- package/dist/cjs/transactions/utils.js +1 -1
- package/dist/cjs/utils/constants.d.ts +0 -6
- package/dist/cjs/utils/constants.js +1 -1
- package/dist/cjs/utils/dynamic-fields.js +1 -1
- package/dist/cjs/utils/index.d.ts +2 -2
- package/dist/cjs/utils/index.js +1 -1
- package/dist/cjs/utils/wow-types.js +1 -0
- package/dist/cjs/verify/index.d.ts +1 -1
- package/dist/cjs/verify/index.js +1 -1
- package/dist/cjs/verify/verify.d.ts +1 -1
- package/dist/cjs/verify/verify.js +1 -1
- package/dist/cjs/w/call/allocation.js +1 -1
- package/dist/cjs/w/call/arbitration.js +1 -1
- package/dist/cjs/w/call/base.d.ts +6 -6
- 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/entity.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/passport.d.ts +2 -2
- package/dist/cjs/w/call/passport.js +1 -1
- package/dist/cjs/w/call/personal.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 +3 -3
- package/dist/cjs/w/local/account.js +1 -1
- package/dist/cjs/w/local/index.d.ts +2 -2
- package/dist/cjs/w/local/index.js +1 -1
- package/dist/cjs/w/local/local.js +1 -1
- package/dist/cjs/w/local/storage.js +1 -1
- package/dist/cjs/w/local/token.js +1 -1
- package/dist/cjs/w/local/util.js +1 -1
- package/dist/cjs/w/local/wip.js +1 -1
- package/dist/cjs/w/messenger/messenger-api.js +1 -1
- package/dist/cjs/w/messenger/messenger.js +1 -1
- package/dist/cjs/w/messenger/pq/crypto.js +1 -1
- package/dist/cjs/w/messenger/storage.js +1 -1
- package/dist/cjs/w/query/event.js +1 -1
- package/dist/cjs/w/query/object.js +1 -1
- package/dist/cjs/w/query/received.js +1 -1
- package/dist/cjs/w/util.js +1 -1
- package/dist/esm/_deps/bcs/bcs-type.d.ts +127 -0
- package/dist/esm/_deps/bcs/bcs-type.js +1 -0
- package/dist/esm/_deps/bcs/bcs.d.ts +49 -0
- package/dist/esm/_deps/bcs/bcs.js +1 -0
- package/dist/esm/_deps/bcs/index.d.ts +16 -0
- package/dist/esm/_deps/bcs/index.js +1 -0
- package/dist/esm/_deps/bcs/reader.d.ts +15 -0
- package/dist/esm/_deps/bcs/reader.js +1 -0
- package/dist/esm/_deps/bcs/types.d.ts +24 -0
- package/dist/esm/_deps/bcs/types.js +1 -0
- package/dist/esm/_deps/bcs/uleb.d.ts +5 -0
- package/dist/esm/_deps/bcs/uleb.js +1 -0
- package/dist/esm/_deps/bcs/utils.d.ts +4 -0
- package/dist/esm/_deps/bcs/utils.js +1 -0
- package/dist/esm/_deps/bcs/writer.d.ts +28 -0
- package/dist/esm/_deps/bcs/writer.js +1 -0
- package/dist/esm/_deps/utils/b58.d.ts +2 -0
- package/dist/esm/_deps/utils/b58.js +1 -0
- package/dist/esm/_deps/utils/b64.d.ts +2 -0
- package/dist/esm/_deps/utils/b64.js +1 -0
- package/dist/esm/_deps/utils/chunk.d.ts +1 -0
- package/dist/esm/_deps/utils/chunk.js +1 -0
- package/dist/esm/_deps/utils/dataloader.d.ts +43 -0
- package/dist/esm/_deps/utils/dataloader.js +1 -0
- package/dist/esm/_deps/utils/hex.d.ts +2 -0
- package/dist/esm/_deps/utils/hex.js +1 -0
- package/dist/esm/_deps/utils/index.d.ts +7 -0
- package/dist/esm/_deps/utils/index.js +1 -0
- package/dist/esm/_deps/utils/types.d.ts +4 -0
- package/dist/esm/_deps/utils/types.js +1 -0
- package/dist/esm/_deps/utils/with-resolver.d.ts +6 -0
- package/dist/esm/_deps/utils/with-resolver.js +1 -0
- package/dist/esm/bcs/bcs.d.ts +245 -245
- package/dist/esm/bcs/bcs.js +1 -1
- package/dist/esm/bcs/effects.d.ts +197 -197
- package/dist/esm/bcs/effects.js +1 -1
- package/dist/esm/bcs/index.d.ts +3 -3
- package/dist/esm/bcs/index.js +1 -1
- package/dist/esm/bcs/pure.d.ts +1 -1
- package/dist/esm/bcs/pure.js +1 -1
- package/dist/esm/bcs/type-tag-serializer.js +1 -1
- package/dist/esm/bcs/types.d.ts +4 -4
- package/dist/esm/client/index.d.ts +4 -4
- package/dist/esm/client/index.js +1 -1
- package/dist/esm/cryptography/keypair.d.ts +2 -2
- package/dist/esm/cryptography/keypair.js +1 -1
- package/dist/esm/cryptography/mnemonics.js +1 -1
- package/dist/esm/cryptography/publickey.js +1 -1
- package/dist/esm/cryptography/signature.js +1 -1
- package/dist/esm/experimental/client.d.ts +5 -5
- package/dist/esm/experimental/core.d.ts +17 -17
- package/dist/esm/experimental/core.js +1 -1
- package/dist/esm/experimental/errors.d.ts +2 -2
- package/dist/esm/experimental/errors.js +1 -1
- package/dist/esm/experimental/index.d.ts +2 -2
- package/dist/esm/experimental/transports/utils.d.ts +3 -3
- package/dist/esm/experimental/types.d.ts +3 -3
- package/dist/esm/faucet/faucet.d.ts +3 -3
- package/dist/esm/faucet/faucet.js +1 -1
- package/dist/esm/faucet/index.d.ts +1 -1
- package/dist/esm/faucet/index.js +1 -1
- package/dist/esm/grpc/client.d.ts +7 -7
- package/dist/esm/grpc/client.js +1 -1
- package/dist/esm/grpc/core.d.ts +15 -15
- package/dist/esm/grpc/core.js +1 -1
- package/dist/esm/grpc/index.d.ts +2 -2
- package/dist/esm/grpc/index.js +1 -1
- package/dist/esm/index.d.ts +3 -3
- package/dist/esm/index.js +1 -1
- package/dist/esm/jsonRpc/client.d.ts +24 -24
- package/dist/esm/jsonRpc/client.js +1 -1
- package/dist/esm/jsonRpc/core.d.ts +20 -20
- package/dist/esm/jsonRpc/core.js +1 -1
- package/dist/esm/jsonRpc/errors.d.ts +3 -3
- package/dist/esm/jsonRpc/errors.js +1 -1
- package/dist/esm/jsonRpc/http-transport.js +1 -1
- package/dist/esm/jsonRpc/index.d.ts +2 -2
- package/dist/esm/jsonRpc/index.js +1 -1
- package/dist/esm/jsonRpc/json-rpc-resolver.d.ts +2 -2
- package/dist/esm/jsonRpc/json-rpc-resolver.js +1 -1
- package/dist/esm/jsonRpc/types/chain.d.ts +4 -4
- package/dist/esm/jsonRpc/types/changes.d.ts +7 -7
- package/dist/esm/jsonRpc/types/generated.d.ts +63 -63
- package/dist/esm/jsonRpc/types/params.d.ts +13 -13
- package/dist/esm/keypairs/falcon512/publickey.js +1 -1
- package/dist/esm/multisig/publickey.js +1 -1
- package/dist/esm/multisig/signer.js +1 -1
- package/dist/esm/transactions/Commands.js +1 -1
- package/dist/esm/transactions/Inputs.d.ts +1 -1
- package/dist/esm/transactions/Inputs.js +1 -1
- package/dist/esm/transactions/ObjectCache.js +1 -1
- package/dist/esm/transactions/Transaction.d.ts +5 -5
- package/dist/esm/transactions/Transaction.js +1 -1
- package/dist/esm/transactions/TransactionData.js +1 -1
- package/dist/esm/transactions/__tests__/Transaction.test.js +1 -1
- package/dist/esm/transactions/__tests__/bcs.test.js +1 -1
- package/dist/esm/transactions/data/internal.d.ts +3 -3
- package/dist/esm/transactions/data/internal.js +1 -1
- package/dist/esm/transactions/data/v1.d.ts +2 -2
- package/dist/esm/transactions/data/v1.js +1 -1
- package/dist/esm/transactions/data/v2.d.ts +1 -1
- package/dist/esm/transactions/data/v2.js +1 -1
- package/dist/esm/transactions/executor/caching.d.ts +4 -4
- package/dist/esm/transactions/executor/parallel.d.ts +4 -4
- package/dist/esm/transactions/executor/parallel.js +1 -1
- package/dist/esm/transactions/executor/serial.d.ts +4 -4
- package/dist/esm/transactions/executor/serial.js +1 -1
- package/dist/esm/transactions/intents/CoinWithBalance.d.ts +2 -2
- package/dist/esm/transactions/intents/CoinWithBalance.js +1 -1
- package/dist/esm/transactions/pure.d.ts +1 -1
- package/dist/esm/transactions/pure.js +1 -1
- package/dist/esm/transactions/serializer.d.ts +3 -3
- package/dist/esm/transactions/serializer.js +1 -1
- package/dist/esm/transactions/utils.d.ts +4 -4
- package/dist/esm/transactions/utils.js +1 -1
- package/dist/esm/utils/constants.d.ts +0 -6
- package/dist/esm/utils/constants.js +1 -1
- package/dist/esm/utils/dynamic-fields.js +1 -1
- package/dist/esm/utils/index.d.ts +2 -2
- package/dist/esm/utils/index.js +1 -1
- package/dist/esm/utils/wow-types.js +1 -0
- package/dist/esm/verify/index.d.ts +1 -1
- package/dist/esm/verify/index.js +1 -1
- package/dist/esm/verify/verify.d.ts +1 -1
- package/dist/esm/verify/verify.js +1 -1
- package/dist/esm/w/call/allocation.js +1 -1
- package/dist/esm/w/call/arbitration.js +1 -1
- package/dist/esm/w/call/base.d.ts +6 -6
- 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/entity.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/passport.d.ts +2 -2
- package/dist/esm/w/call/passport.js +1 -1
- package/dist/esm/w/call/personal.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 +3 -3
- package/dist/esm/w/local/account.js +1 -1
- package/dist/esm/w/local/index.d.ts +2 -2
- package/dist/esm/w/local/index.js +1 -1
- package/dist/esm/w/local/local.js +1 -1
- package/dist/esm/w/local/storage.js +1 -1
- package/dist/esm/w/local/token.js +1 -1
- package/dist/esm/w/local/util.js +1 -1
- package/dist/esm/w/local/wip.js +1 -1
- package/dist/esm/w/messenger/messenger-api.js +1 -1
- package/dist/esm/w/messenger/messenger.js +1 -1
- package/dist/esm/w/messenger/pq/crypto.js +1 -1
- package/dist/esm/w/messenger/storage.js +1 -1
- package/dist/esm/w/query/event.js +1 -1
- package/dist/esm/w/query/object.js +1 -1
- package/dist/esm/w/query/received.js +1 -1
- package/dist/esm/w/util.js +1 -1
- package/package.json +4 -5
- package/dist/cjs/utils/sui-types.js +0 -1
- package/dist/esm/utils/sui-types.js +0 -1
- /package/dist/cjs/utils/{sui-types.d.ts → wow-types.d.ts} +0 -0
- /package/dist/esm/utils/{sui-types.d.ts → wow-types.d.ts} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CoinBalance, PaginatedCoins,
|
|
1
|
+
import type { CoinBalance, PaginatedCoins, WowTransactionBlockResponse } from "../../client/index.js";
|
|
2
2
|
import type { ENTRYPOINT } from "../../client/network.js";
|
|
3
3
|
import type { AccountData, AccountFilter, FaucetCoinInfo } from "./account.js";
|
|
4
4
|
import { Account } from "./account.js";
|
|
@@ -119,7 +119,7 @@ export interface AccountOperationResult {
|
|
|
119
119
|
name_or_address2?: string;
|
|
120
120
|
success: boolean;
|
|
121
121
|
};
|
|
122
|
-
transfer?:
|
|
122
|
+
transfer?: WowTransactionBlockResponse;
|
|
123
123
|
get?: {
|
|
124
124
|
coin_address?: string;
|
|
125
125
|
name_or_address?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{GasTokenType}from'../common.js';import{W_ERROR,WErrors}from'../exception.js';import{Account}from'./account.js';import{LocalInfo,LocalInfoNameDefault,LocalMark}from'./local.js';import{TokenInfo}from'./token.js';import{isValidWowAddress}from'../../utils/
|
|
1
|
+
import{GasTokenType}from'../common.js';import{W_ERROR,WErrors}from'../exception.js';import{Account}from'./account.js';import{LocalInfo,LocalInfoNameDefault,LocalMark}from'./local.js';import{TokenInfo}from'./token.js';import{isValidWowAddress}from'../../utils/wow-types.js';export{Account,LocalInfo,LocalMark};export const GetAccountOrMark_Address=async a=>{if(!a)return await Account['Instance']()['get_address'](undefined);const b=typeof a==='string'?a:a['name_or_address'];if(!b)return await Account['Instance']()['get_address'](undefined);if(isValidWowAddress(b))return b;if(typeof a==='object'&&a?.['local_mark_first']){const c=await LocalMark['Instance']()['get_address'](b);if(!c)return await Account['Instance']()['get_address'](b);return c;}else{const d=await Account['Instance']()['get_address'](b);if(!d)return await LocalMark['Instance']()['get_address'](b);return d;}};export const GetManyAccountOrMark_Address=async a=>{const b=[];for(let c=0x0;c<a['entities']['length'];++c){const d=await GetAccountOrMark_Address(a['entities'][c]);!d&&a['check_all_founded']&&W_ERROR(WErrors['InvalidParam'],'entity\x20'+a['entities'][c]?.['name_or_address']+'\x20is\x20not\x20a\x20valid\x20address,\x20account\x20or\x20mark'),a['check_all_founded']&&!d&&W_ERROR(WErrors['InvalidParam'],'entity\x20'+a['entities'][c]?.['name_or_address']+'\x20is\x20not\x20a\x20valid\x20address,\x20account\x20or\x20mark'),d&&b['push'](d);}return b;};export const query_local_mark_list=async a=>{return await LocalMark['Instance']()['list'](a);};export const query_account_list=async a=>{return await Account['Instance']()['list'](a);};export const query_local_info_list=async a=>{return await LocalInfo['Instance']()['list'](a);};export const query_local_token_list=async a=>{return await TokenInfo['Instance']()['list'](a);};export const query_local_mark=async a=>{if(typeof a==='string')return await LocalMark['Instance']()['get'](a);else{if(Array['isArray'](a))return await LocalMark['Instance']()['get_many'](a);}return undefined;};export const query_local_info=async(a=LocalInfoNameDefault)=>{if(typeof a==='string')return await LocalInfo['Instance']()['get'](a);else{if(Array['isArray'](a))return await LocalInfo['Instance']()['get_many'](a);}return undefined;};export const query_local_info_default=async(a=LocalInfoNameDefault)=>{if(typeof a==='string')return await LocalInfo['Instance']()['get_default'](a);else{if(Array['isArray'](a))return(await LocalInfo['Instance']()['get_many'](a))['map'](b=>b?.['default']);}return undefined;};export const query_account=async a=>{const b=await Account['Instance']()['get'](a['name_or_address']);if(!b)return{'name_or_address':a['name_or_address']};const c={'address':b['address'],'name_or_address':b['name']},d=a['token_type']??GasTokenType;if(a?.['balance'])c['balance']=await Account['Instance']()['balance'](d,b['address'],a['network']);else a?.['coin']&&(c['coin']=await Account['Instance']()['coin'](d,a['coin']['cursor'],a['coin']['limit'],b['address'],a['network']));return c;};export const account_operation=async a=>{var b={};if(a['gen']!=null){const c=await Account['Instance']()['gen'](a['gen']?.['name'],a['gen']?.['replaceExistName'],a['gen']?.['m']);b['gen']={'address':c?.['address'],'name':c?.['name'],'m':c?.['m']};}a['faucet']!=null&&(b['faucet']={'name_or_address':a['faucet']['name_or_address'],'result':await Account['Instance']()['faucet'](a['faucet']['name_or_address'],a['faucet']['network']),'network':a['faucet']['network']});a['suspend']!=null&&(b['suspend']={'name_or_address':a['suspend']['name_or_address'],'success':await Account['Instance']()['suspend'](a['suspend']['name_or_address'])});a['resume']!=null&&(b['resume']={'address':a['resume']['address'],'name':a['resume']['name'],'success':await Account['Instance']()['resume'](a['resume']['address'],a['resume']['name'])});a['rename']!=null&&(b['rename']={'name_or_address':a['rename']['name_or_address'],'new_name':a['rename']['new_name'],'success':await Account['Instance']()['rename'](a['rename']['name_or_address'],a['rename']['new_name'])});a['swap_name']!=null&&(b['swap_name']={'name_or_address1':a['swap_name']['name_or_address1'],'name_or_address2':a['swap_name']['name_or_address2'],'success':await Account['Instance']()['swap_name'](a['swap_name']['name_or_address1'],a['swap_name']['name_or_address2'])});if(a['transfer']!=null){const {name_or_address_from:d,name_or_address_to:e,amount:f,token_type:g,network:h}=a['transfer'];b['transfer']=await Account['Instance']()['transfer'](f,g,e,d,h);}if(a['get']!=null){const {balance_required:i,token_type:j,name_or_address:k,network:l}=a['get'];b['get']={'name_or_address':k,'balance_required':i,'token_type':j,'network':l,'coin_address':await Account['Instance']()['coinObject_with_balance'](i,j,k,l)};}if(a['signData']!=null){const {name_or_address:n,data:o,data_encoding:p}=a['signData'];let q=o;if(typeof o==='string'&&p)switch(p){case'base64':q=Uint8Array['from'](Buffer['from'](o,'base64'));break;case'hex':q=Uint8Array['from'](Buffer['from'](o['replace'](/^0x/,''),'hex'));break;case'utf8':default:q=o;break;}const r=await Account['Instance']()['signData'](n,q);b['signData']={'name_or_address':n,'signature':r['signature'],'publicKey':r['publicKey'],'address':r['address']};}if(a['messenger']!=null){const {name_or_account:s,m:t}=a['messenger'];await Account['Instance']()['set_messenger'](s,t),b['messenger']={'name_or_account':s,'m':t};}return b;};export const local_mark_operation=async a=>{const b={};if(a['clear'])b['clear']=await LocalMark['Instance']()['clear']();else{if(a['add'])b['add']=await LocalMark['Instance']()['put'](a['add']['data']);else a['remove']&&(b['remove']=await LocalMark['Instance']()['del'](a['remove']['names']));}return b;};export const local_info_operation=async a=>{if(a['clear'])await LocalInfo['Instance']()['clear']();else{if(a['add'])await LocalInfo['Instance']()['add'](a['add']['data']);else{if(a['remove'])await Promise['all'](a['remove']['data']['map'](b=>LocalInfo['Instance']()['del'](b)));else a['reset']&&await LocalInfo['Instance']()['reset_contents'](a['reset']['name'],a['reset']['contents']);}}return{'success':!![]};};export const fetch_token_info_operation=async a=>{return await TokenInfo['Instance']()['fetch'](a['tokenType'],a?.['alias'],a?.['network']);};export*from'./account.js';export*from'./config.js';export*from'./local.js';export*from'./token.js';export*from'./wip.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isValidWowAddress}from'../../utils/sui-types.js';import{W_ERROR,WErrors}from'../exception.js';import{Cache,CachePrefix}from'./cache.js';export const BUITIN_IDS=['0x5','0x6','0x7','0x8','0x9','@0xaaa','@0xaab','@0x403','@0xacc','@0xc'];export const isValidAddress=a=>{return a&&(isValidWowAddress(a)||BUITIN_IDS['includes'](a));};export const LocalMarkNameMaxLength=0x40;export const LocalMarkTagMaxLength=0x40;export const LocalMarkTagMaxCount=0x32;export const LocalInfoNameMaxLength=0x40;export const LocalInfoContentMaxLength=0x12c;export const LocalInfoContentMaxCount=0x32;export const LocalInfoNameDefault='Address\x20of\x20delivery';export class LocalMark{static ['_instance'];['cacheKey']=[CachePrefix['local_mark']];static['Instance'](){return!LocalMark['_instance']&&(LocalMark['_instance']=new LocalMark()),LocalMark['_instance'];}['resolve_tags'](a){return a=a?.['slice'](0x0,LocalMarkTagMaxCount),a=a?.['filter'](b=>b!==''&&b)?.['map'](b=>{return b['slice'](0x0,LocalMarkTagMaxLength);}),a;}['resolve_name'](a){return a['slice'](0x0,LocalMarkNameMaxLength);}async['put'](a){const b=await Cache['read'](this['cacheKey'],async()=>{return{'expire':'INFINITE','data':[]};}),c=b?.['data']||[],d=[];for(const e of a){const f=e['address']['toLowerCase']();e['address']=f;!isValidAddress(e['address'])&&W_ERROR(WErrors['IsValidAddress'],'LocalMark.put.mark.address:\x20'+e['address']);e?.['name']?.['value']&&(e['name']['value']=this['resolve_name'](e?.['name']?.['value']));e['tags']=this['resolve_tags'](e?.['tags']),c['forEach'](i=>{e?.['name']?.['value']!=null&&i['name']===e?.['name']?.['value']&&(e?.['name']?.['replaceExistName']?i['name']=undefined:W_ERROR(WErrors['LocalMarkNameExist'],'LocalMark.put.mark.name:\x20'+e['name']['value']));});const g=Date['now'](),h={'name':e?.['name']?.['value'],'address':e['address'],'tags':e['tags'],'createdAt':g,'updatedAt':g};c['push'](h),d['push'](h);}return await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':c}),!![]),d;}async['get'](a){if(a===undefined||a===null)return undefined;const b=await Cache['read'](this['cacheKey'],async c=>{return{'expire':'INFINITE','data':[]};});return b?.['data']?.['find'](c=>c['name']===a||c['address']['toLowerCase']()===a['toLowerCase']());}async['get_address'](a){if(a&&isValidAddress(a))return a['toLowerCase']();return(await this['get'](a))?.['address'];}async['get_many'](a){if(!Array['isArray'](a)||a['length']===0x0)return[];const b=await Cache['read'](this['cacheKey'],async d=>{return{'expire':'INFINITE','data':[]};}),c=b?.['data']||[];return a['map'](d=>{return c['find'](e=>e['name']===d||e['address']['toLowerCase']()===d?.['toLowerCase']());});}async['get_many_address'](a){const b=new Array(a['length'])['fill'](undefined),c=new Map();a['forEach']((g,h)=>{if(g===null||g===undefined)b[h]=undefined;else isValidAddress(g)?b[h]=g['toLowerCase']():c['set'](h,g);});const d=Array['from'](c['values']());if(d['length']===0x0)return b;const e=await this['get_many'](d);let f=0x0;return c['forEach']((g,h)=>{const i=e[f];b[h]=i?.['address'],f++;}),b;}async['get_many_address_availables'](a){return(await this['get_many_address'](a))['filter'](b=>b!=null);}async['del'](a,b=![]){const c=[CachePrefix['local_mark']],d=await Cache['read'](c,async()=>({'expire':'INFINITE','data':[]})),e=d?.['data']||[],f=e['filter'](h=>{const i=h['name']!==undefined&&h['name']!==null&&a['includes'](h['name']),j=a['includes'](h['address']),k=i||j,l=h['name']===undefined||h['name']===null;return b?!k&&!l:!k;}),g=e['filter'](h=>!f['includes'](h));return f['length']!==e['length']&&await Cache['read'](c,async()=>({'expire':'INFINITE','data':f}),!![]),g;}async['clear'](){const a=[CachePrefix['local_mark']];return await Cache['read'](a,async()=>({'expire':'INFINITE','data':[]}),!![]),!![];}async['rename'](a,b){b=this['resolve_name'](b);if(a===b)return!![];const c=await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':[]})),d=c?.['data']||[],e=d['find'](f=>f['name']===a);if(e&&d['findIndex'](f=>f['name']===b)===-0x1){const f=Date['now']();return e['name']=b,e['updatedAt']=f,await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':d}),!![]),!![];}return![];}async['swap_name'](a,b){if(a===b)return!![];const c=await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':[]})),d=c?.['data']||[],e=d['find'](g=>g['name']===a),f=d['find'](g=>g['name']===b);if(e&&f){const g=Date['now']();return e['name']=b,e['updatedAt']=g,f['name']=a,f['updatedAt']=g,await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':d}),!![]),!![];}return![];}async['set_tags'](a,b){b=this['resolve_tags'](b);const c=await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':[]})),d=c?.['data']||[],e=d['find'](f=>f['name']===a);if(e){const f=Date['now']();return e['tags']=b,e['updatedAt']=f,await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':d}),!![]),!![];}return![];}async['list'](a){if(a&&a['tags'])a['tags']=a['tags']['filter'](d=>d!==''&&d);const b=await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':[]})),c=b?.['data']||[];return c['filter'](d=>{if(a?.['address']&&d['address']!==a['address'])return![];if(a?.['createdAt']){if(a['createdAt']['gte']!==undefined&&(!d['createdAt']||d['createdAt']<a['createdAt']['gte']))return![];if(a['createdAt']['lte']!==undefined&&(!d['createdAt']||d['createdAt']>a['createdAt']['lte']))return![];}if(a?.['updatedAt']){if(a['updatedAt']['gte']!==undefined&&(!d['updatedAt']||d['updatedAt']<a['updatedAt']['gte']))return![];if(a['updatedAt']['lte']!==undefined&&(!d['updatedAt']||d['updatedAt']>a['updatedAt']['lte']))return![];}return!![];})['map'](d=>{let e=0x0;const f=d['name']?.['toLowerCase']()||'',g=a?.['name']?.['toLowerCase']()||'';if(a?.['name']){if(f===g)e+=0x64;else{if(f['startsWith'](g))e+=0x32;else f['includes'](g)&&(e+=0x19);}}return a?.['tags']&&a['tags']['length']>0x0&&a['tags']['forEach'](h=>{const i=h['toLowerCase']();d['tags']&&d['tags']['forEach'](j=>{const k=j['toLowerCase']();if(k===i)e+=0x14;else{if(k['startsWith'](i))e+=0xf;else k['includes'](i)&&(e+=0xa);}});}),(a?.['name']||a?.['tags'])&&e===0x0&&(e=-0x1),{'mark':d,'score':e};})['filter'](({score:d})=>d>=0x0)['sort']((d,e)=>{if(e['score']!==d['score'])return e['score']-d['score'];const f=(d['mark']['name']||'')['length'],g=(e['mark']['name']||'')['length'];if(f!==g)return f-g;return(d['mark']['name']||'')['localeCompare'](e['mark']['name']||'');})['map'](({mark:d})=>d);}}export class LocalInfo{static ['_instance'];['cacheKey']=[CachePrefix['local_info']];static['Instance'](){return!LocalInfo['_instance']&&(LocalInfo['_instance']=new LocalInfo()),LocalInfo['_instance'];}['resolve_contents'](a){return a=a['slice'](0x0,LocalInfoContentMaxCount),a['map'](b=>b['slice'](0x0,LocalInfoContentMaxLength));}['resolve_name'](a){return a['slice'](0x0,LocalInfoNameMaxLength);}async['add'](a){const b=await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':{}})),c=b?.['data']||{};for(const d of a){const e=this['resolve_name'](d['name']),f=d['default']['slice'](0x0,LocalInfoContentMaxLength);if(c[e]){const g=Date['now'](),h=c[e];h['default']=f,d['contents']!==undefined&&(h['contents']=this['resolve_contents'](d['contents'])),h['updatedAt']=g;}else{const i=Date['now'](),j={'default':f,'contents':d['contents']?this['resolve_contents'](d['contents']):[],'createdAt':i,'updatedAt':i};c[e]=j;}}return await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':c}),!![]),!![];}async['get'](a=LocalInfoNameDefault){const b=await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':{}})),c=b?.['data']||{},d=c[a];return d?{'name':a,...d}:undefined;}async['get_default'](a=LocalInfoNameDefault){const b=await this['get'](a);return b?.['default'];}async['get_many'](a){if(!Array['isArray'](a)||a['length']===0x0)return[];const b=await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':{}})),c=b?.['data']||{};return a['map'](d=>{const e=c[d];return e?{'name':d,...e}:undefined;});}async['del'](a=LocalInfoNameDefault){const b=await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':{}})),c=b?.['data']||{};delete c[a],await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':c}),!![]);}async['reset_contents'](a=LocalInfoNameDefault,b){const c=await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':{}})),d=c?.['data']||{},e=d[a];if(e){if(e['contents']&&e['contents']['length']>0x0){const f=Date['now']();return e['contents']=this['resolve_contents'](b),e['updatedAt']=f,await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':d}),!![]),!![];}}return![];}async['clear'](){await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':{}}),!![]);}async['list'](a){const b=await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':{}})),c=b?.['data']||{};return Object['entries'](c)['map'](([d,e])=>{let f=0x0;const g={'name':d,...e};if(a?.['name']){const h=d['toLowerCase'](),i=a['name']['toLowerCase']();if(h===i)f+=0x64;else{if(h['startsWith'](i))f+=0x32;else h['includes'](i)&&(f+=0x19);}}if(a?.['default']){const j=e['default']['toLowerCase'](),k=a['default']['toLowerCase']();if(j===k)f+=0x5a;else{if(j['startsWith'](k))f+=0x2d;else j['includes'](k)&&(f+=0x16);}}return a?.['contents']&&a['contents']['length']>0x0&&a['contents']['forEach'](l=>{const m=l['toLowerCase']();e['contents']&&e['contents']['forEach'](n=>{const o=n['toLowerCase']();if(o===m)f+=0x14;else{if(o['startsWith'](m))f+=0xf;else o['includes'](m)&&(f+=0xa);}});}),(a?.['name']||a?.['default']||a?.['contents'])&&f===0x0&&(f=-0x1),{'info':g,'score':f};})['filter'](({score:d,info:e})=>{if(d<0x0)return![];if(a?.['createdAt']){if(a['createdAt']['gte']!==undefined&&(!e['createdAt']||e['createdAt']<a['createdAt']['gte']))return![];if(a['createdAt']['lte']!==undefined&&(!e['createdAt']||e['createdAt']>a['createdAt']['lte']))return![];}if(a?.['updatedAt']){if(a['updatedAt']['gte']!==undefined&&(!e['updatedAt']||e['updatedAt']<a['updatedAt']['gte']))return![];if(a['updatedAt']['lte']!==undefined&&(!e['updatedAt']||e['updatedAt']>a['updatedAt']['lte']))return![];}return!![];})['sort']((d,e)=>{if(e['score']!==d['score'])return e['score']-d['score'];const f=d['info']['name']['length'],g=e['info']['name']['length'];if(f!==g)return f-g;return d['info']['name']['localeCompare'](e['info']['name']);})['map'](({info:d})=>d);}}
|
|
1
|
+
import{isValidWowAddress}from'../../utils/wow-types.js';import{W_ERROR,WErrors}from'../exception.js';import{Cache,CachePrefix}from'./cache.js';export const BUITIN_IDS=['0x5','0x6','0x7','0x8','0x9','@0xaaa','@0xaab','@0x403','@0xacc','@0xc'];export const isValidAddress=a=>{return a&&(isValidWowAddress(a)||BUITIN_IDS['includes'](a));};export const LocalMarkNameMaxLength=0x40;export const LocalMarkTagMaxLength=0x40;export const LocalMarkTagMaxCount=0x32;export const LocalInfoNameMaxLength=0x40;export const LocalInfoContentMaxLength=0x12c;export const LocalInfoContentMaxCount=0x32;export const LocalInfoNameDefault='Address\x20of\x20delivery';export class LocalMark{static ['_instance'];['cacheKey']=[CachePrefix['local_mark']];static['Instance'](){return!LocalMark['_instance']&&(LocalMark['_instance']=new LocalMark()),LocalMark['_instance'];}['resolve_tags'](a){return a=a?.['slice'](0x0,LocalMarkTagMaxCount),a=a?.['filter'](b=>b!==''&&b)?.['map'](b=>{return b['slice'](0x0,LocalMarkTagMaxLength);}),a;}['resolve_name'](a){return a['slice'](0x0,LocalMarkNameMaxLength);}async['put'](a){const b=await Cache['read'](this['cacheKey'],async()=>{return{'expire':'INFINITE','data':[]};}),c=b?.['data']||[],d=[];for(const e of a){const f=e['address']['toLowerCase']();e['address']=f;!isValidAddress(e['address'])&&W_ERROR(WErrors['IsValidAddress'],'LocalMark.put.mark.address:\x20'+e['address']);e?.['name']?.['value']&&(e['name']['value']=this['resolve_name'](e?.['name']?.['value']));e['tags']=this['resolve_tags'](e?.['tags']),c['forEach'](i=>{e?.['name']?.['value']!=null&&i['name']===e?.['name']?.['value']&&(e?.['name']?.['replaceExistName']?i['name']=undefined:W_ERROR(WErrors['LocalMarkNameExist'],'LocalMark.put.mark.name:\x20'+e['name']['value']));});const g=Date['now'](),h={'name':e?.['name']?.['value'],'address':e['address'],'tags':e['tags'],'createdAt':g,'updatedAt':g};c['push'](h),d['push'](h);}return await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':c}),!![]),d;}async['get'](a){if(a===undefined||a===null)return undefined;const b=await Cache['read'](this['cacheKey'],async c=>{return{'expire':'INFINITE','data':[]};});return b?.['data']?.['find'](c=>c['name']===a||c['address']['toLowerCase']()===a['toLowerCase']());}async['get_address'](a){if(a&&isValidAddress(a))return a['toLowerCase']();return(await this['get'](a))?.['address'];}async['get_many'](a){if(!Array['isArray'](a)||a['length']===0x0)return[];const b=await Cache['read'](this['cacheKey'],async d=>{return{'expire':'INFINITE','data':[]};}),c=b?.['data']||[];return a['map'](d=>{return c['find'](e=>e['name']===d||e['address']['toLowerCase']()===d?.['toLowerCase']());});}async['get_many_address'](a){const b=new Array(a['length'])['fill'](undefined),c=new Map();a['forEach']((g,h)=>{if(g===null||g===undefined)b[h]=undefined;else isValidAddress(g)?b[h]=g['toLowerCase']():c['set'](h,g);});const d=Array['from'](c['values']());if(d['length']===0x0)return b;const e=await this['get_many'](d);let f=0x0;return c['forEach']((g,h)=>{const i=e[f];b[h]=i?.['address'],f++;}),b;}async['get_many_address_availables'](a){return(await this['get_many_address'](a))['filter'](b=>b!=null);}async['del'](a,b=![]){const c=[CachePrefix['local_mark']],d=await Cache['read'](c,async()=>({'expire':'INFINITE','data':[]})),e=d?.['data']||[],f=e['filter'](h=>{const i=h['name']!==undefined&&h['name']!==null&&a['includes'](h['name']),j=a['includes'](h['address']),k=i||j,l=h['name']===undefined||h['name']===null;return b?!k&&!l:!k;}),g=e['filter'](h=>!f['includes'](h));return f['length']!==e['length']&&await Cache['read'](c,async()=>({'expire':'INFINITE','data':f}),!![]),g;}async['clear'](){const a=[CachePrefix['local_mark']];return await Cache['read'](a,async()=>({'expire':'INFINITE','data':[]}),!![]),!![];}async['rename'](a,b){b=this['resolve_name'](b);if(a===b)return!![];const c=await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':[]})),d=c?.['data']||[],e=d['find'](f=>f['name']===a);if(e&&d['findIndex'](f=>f['name']===b)===-0x1){const f=Date['now']();return e['name']=b,e['updatedAt']=f,await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':d}),!![]),!![];}return![];}async['swap_name'](a,b){if(a===b)return!![];const c=await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':[]})),d=c?.['data']||[],e=d['find'](g=>g['name']===a),f=d['find'](g=>g['name']===b);if(e&&f){const g=Date['now']();return e['name']=b,e['updatedAt']=g,f['name']=a,f['updatedAt']=g,await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':d}),!![]),!![];}return![];}async['set_tags'](a,b){b=this['resolve_tags'](b);const c=await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':[]})),d=c?.['data']||[],e=d['find'](f=>f['name']===a);if(e){const f=Date['now']();return e['tags']=b,e['updatedAt']=f,await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':d}),!![]),!![];}return![];}async['list'](a){if(a&&a['tags'])a['tags']=a['tags']['filter'](d=>d!==''&&d);const b=await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':[]})),c=b?.['data']||[];return c['filter'](d=>{if(a?.['address']&&d['address']!==a['address'])return![];if(a?.['createdAt']){if(a['createdAt']['gte']!==undefined&&(!d['createdAt']||d['createdAt']<a['createdAt']['gte']))return![];if(a['createdAt']['lte']!==undefined&&(!d['createdAt']||d['createdAt']>a['createdAt']['lte']))return![];}if(a?.['updatedAt']){if(a['updatedAt']['gte']!==undefined&&(!d['updatedAt']||d['updatedAt']<a['updatedAt']['gte']))return![];if(a['updatedAt']['lte']!==undefined&&(!d['updatedAt']||d['updatedAt']>a['updatedAt']['lte']))return![];}return!![];})['map'](d=>{let e=0x0;const f=d['name']?.['toLowerCase']()||'',g=a?.['name']?.['toLowerCase']()||'';if(a?.['name']){if(f===g)e+=0x64;else{if(f['startsWith'](g))e+=0x32;else f['includes'](g)&&(e+=0x19);}}return a?.['tags']&&a['tags']['length']>0x0&&a['tags']['forEach'](h=>{const i=h['toLowerCase']();d['tags']&&d['tags']['forEach'](j=>{const k=j['toLowerCase']();if(k===i)e+=0x14;else{if(k['startsWith'](i))e+=0xf;else k['includes'](i)&&(e+=0xa);}});}),(a?.['name']||a?.['tags'])&&e===0x0&&(e=-0x1),{'mark':d,'score':e};})['filter'](({score:d})=>d>=0x0)['sort']((d,e)=>{if(e['score']!==d['score'])return e['score']-d['score'];const f=(d['mark']['name']||'')['length'],g=(e['mark']['name']||'')['length'];if(f!==g)return f-g;return(d['mark']['name']||'')['localeCompare'](e['mark']['name']||'');})['map'](({mark:d})=>d);}}export class LocalInfo{static ['_instance'];['cacheKey']=[CachePrefix['local_info']];static['Instance'](){return!LocalInfo['_instance']&&(LocalInfo['_instance']=new LocalInfo()),LocalInfo['_instance'];}['resolve_contents'](a){return a=a['slice'](0x0,LocalInfoContentMaxCount),a['map'](b=>b['slice'](0x0,LocalInfoContentMaxLength));}['resolve_name'](a){return a['slice'](0x0,LocalInfoNameMaxLength);}async['add'](a){const b=await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':{}})),c=b?.['data']||{};for(const d of a){const e=this['resolve_name'](d['name']),f=d['default']['slice'](0x0,LocalInfoContentMaxLength);if(c[e]){const g=Date['now'](),h=c[e];h['default']=f,d['contents']!==undefined&&(h['contents']=this['resolve_contents'](d['contents'])),h['updatedAt']=g;}else{const i=Date['now'](),j={'default':f,'contents':d['contents']?this['resolve_contents'](d['contents']):[],'createdAt':i,'updatedAt':i};c[e]=j;}}return await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':c}),!![]),!![];}async['get'](a=LocalInfoNameDefault){const b=await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':{}})),c=b?.['data']||{},d=c[a];return d?{'name':a,...d}:undefined;}async['get_default'](a=LocalInfoNameDefault){const b=await this['get'](a);return b?.['default'];}async['get_many'](a){if(!Array['isArray'](a)||a['length']===0x0)return[];const b=await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':{}})),c=b?.['data']||{};return a['map'](d=>{const e=c[d];return e?{'name':d,...e}:undefined;});}async['del'](a=LocalInfoNameDefault){const b=await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':{}})),c=b?.['data']||{};delete c[a],await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':c}),!![]);}async['reset_contents'](a=LocalInfoNameDefault,b){const c=await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':{}})),d=c?.['data']||{},e=d[a];if(e){if(e['contents']&&e['contents']['length']>0x0){const f=Date['now']();return e['contents']=this['resolve_contents'](b),e['updatedAt']=f,await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':d}),!![]),!![];}}return![];}async['clear'](){await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':{}}),!![]);}async['list'](a){const b=await Cache['read'](this['cacheKey'],async()=>({'expire':'INFINITE','data':{}})),c=b?.['data']||{};return Object['entries'](c)['map'](([d,e])=>{let f=0x0;const g={'name':d,...e};if(a?.['name']){const h=d['toLowerCase'](),i=a['name']['toLowerCase']();if(h===i)f+=0x64;else{if(h['startsWith'](i))f+=0x32;else h['includes'](i)&&(f+=0x19);}}if(a?.['default']){const j=e['default']['toLowerCase'](),k=a['default']['toLowerCase']();if(j===k)f+=0x5a;else{if(j['startsWith'](k))f+=0x2d;else j['includes'](k)&&(f+=0x16);}}return a?.['contents']&&a['contents']['length']>0x0&&a['contents']['forEach'](l=>{const m=l['toLowerCase']();e['contents']&&e['contents']['forEach'](n=>{const o=n['toLowerCase']();if(o===m)f+=0x14;else{if(o['startsWith'](m))f+=0xf;else o['includes'](m)&&(f+=0xa);}});}),(a?.['name']||a?.['default']||a?.['contents'])&&f===0x0&&(f=-0x1),{'info':g,'score':f};})['filter'](({score:d,info:e})=>{if(d<0x0)return![];if(a?.['createdAt']){if(a['createdAt']['gte']!==undefined&&(!e['createdAt']||e['createdAt']<a['createdAt']['gte']))return![];if(a['createdAt']['lte']!==undefined&&(!e['createdAt']||e['createdAt']>a['createdAt']['lte']))return![];}if(a?.['updatedAt']){if(a['updatedAt']['gte']!==undefined&&(!e['updatedAt']||e['updatedAt']<a['updatedAt']['gte']))return![];if(a['updatedAt']['lte']!==undefined&&(!e['updatedAt']||e['updatedAt']>a['updatedAt']['lte']))return![];}return!![];})['sort']((d,e)=>{if(e['score']!==d['score'])return e['score']-d['score'];const f=d['info']['name']['length'],g=e['info']['name']['length'];if(f!==g)return f-g;return d['info']['name']['localeCompare'](e['info']['name']);})['map'](({info:d})=>d);}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import a176a from'better-sqlite3';import*as a176b from'path';import*as a176c from'fs';import{getWowDir}from'./util.js';const WOW_DIR=getWowDir(),CACHE_DB_PATH=a176b['join'](WOW_DIR,'cache.db'),ACCOUNT_DB_PATH=a176b['join'](WOW_DIR,'account.db');function ensureWowDirExists(){!a176c['existsSync'](WOW_DIR)&&a176c['mkdirSync'](WOW_DIR,{'recursive':!![]});}ensureWowDirExists();function getCacheDatabase(){ensureWowDirExists();const a=new a176a(CACHE_DB_PATH);return a['pragma']('journal_mode\x20=\x20WAL'),a['pragma']('synchronous\x20=\x20NORMAL'),a['exec']('\x0a\x09\x09CREATE\x20TABLE\x20IF\x20NOT\x20EXISTS\x20cache\x20(\x0a\x09\x09\x09key\x20TEXT\x20PRIMARY\x20KEY,\x0a\x09\x09\x09value\x20TEXT\x20NOT\x20NULL,\x0a\x09\x09\x09updated_at\x20INTEGER\x20DEFAULT\x20(strftime(\x27%s\x27,\x20\x27now\x27))\x0a\x09\x09);\x0a\x09'),a;}let cacheDbInstance=null;function getCacheDb(){return!cacheDbInstance&&(cacheDbInstance=getCacheDatabase()),cacheDbInstance;}function getAccountDatabase(){ensureWowDirExists();const a=new a176a(ACCOUNT_DB_PATH);a['pragma']('journal_mode\x20=\x20WAL'),a['pragma']('synchronous\x20=\x20NORMAL');try{a176c['chmodSync'](ACCOUNT_DB_PATH,0x180);}catch{}return a['exec']('\x0a\x09\x09CREATE\x20TABLE\x20IF\x20NOT\x20EXISTS\x20accounts\x20(\x0a\x09\x09\x09id\x20INTEGER\x20PRIMARY\x20KEY\x20CHECK\x20(id\x20=\x201),\x0a\x09\x09\x09data\x20TEXT\x20NOT\x20NULL,\x0a\x09\x09\x09updated_at\x20INTEGER\x20DEFAULT\x20(strftime(\x27%s\x27,\x20\x27now\x27))\x0a\x09\x09);\x0a\x09'),a;}let accountDbInstance=null;function getAccountDb(){return!accountDbInstance&&(accountDbInstance=getAccountDatabase()),accountDbInstance;}export class SQLiteStorage{['_db'];['_dbSource'];constructor(a){this['_dbSource']=a;}get['db'](){if(this['_dbSource'])return this['_dbSource'];return!this['_db']&&(this['_db']=getCacheDb()),this['_db'];}async['get'](a){const b=this['db']['prepare']('SELECT\x20value\x20FROM\x20cache\x20WHERE\x20key\x20=\x20?')['get'](a);return b?.['value'];}async['getMany'](a){const b=a['map'](()=>'?')['join'](','),c=this['db']['prepare']('SELECT\x20key,\x20value\x20FROM\x20cache\x20WHERE\x20key\x20IN\x20('+b+')')['all'](...a),d=new Map(c['map'](e=>[e['key'],e['value']]));return a['map'](e=>d['get'](e));}async['put'](a,b){this['db']['prepare']('\x0a\x09\x09\x09INSERT\x20INTO\x20cache\x20(key,\x20value,\x20updated_at)\x20\x0a\x09\x09\x09VALUES\x20(?,\x20?,\x20strftime(\x27%s\x27,\x20\x27now\x27))\x0a\x09\x09\x09ON\x20CONFLICT(key)\x20DO\x20UPDATE\x20SET\x20value\x20=\x20excluded.value,\x20updated_at\x20=\x20excluded.updated_at\x0a\x09\x09')['run'](a,b);}async['putMany'](a){const b=this['db']['prepare']('\x0a\x09\x09\x09INSERT\x20INTO\x20cache\x20(key,\x20value,\x20updated_at)\x20\x0a\x09\x09\x09VALUES\x20(?,\x20?,\x20strftime(\x27%s\x27,\x20\x27now\x27))\x0a\x09\x09\x09ON\x20CONFLICT(key)\x20DO\x20UPDATE\x20SET\x20value\x20=\x20excluded.value,\x20updated_at\x20=\x20excluded.updated_at\x0a\x09\x09'),c=this['db']['transaction'](d=>{for(const e of d)b['run'](e['key'],e['value']);});c(a);}async['del'](a){this['db']['prepare']('DELETE\x20FROM\x20cache\x20WHERE\x20key\x20=\x20?')['run'](a);}async['clear'](){this['db']['exec']('DELETE\x20FROM\x20cache');}}export class SQLiteAccountStorage{['_db'];['_dbSource'];constructor(a){this['_dbSource']=a;}get['db'](){if(this['_dbSource'])return this['_dbSource'];return!this['_db']&&(this['_db']=getAccountDb()),this['_db'];}async['get'](){const a=this['db']['prepare']('SELECT\x20data\x20FROM\x20accounts\x20WHERE\x20id\x20=\x201')['get']();return a?.['data'];}async['put'](a){this['db']['prepare']('\x0a\x09\x09\x09INSERT\x20INTO\x20accounts\x20(id,\x20data,\x20updated_at)\x20\x0a\x09\x09\x09VALUES\x20(1,\x20?,\x20strftime(\x27%s\x27,\x20\x27now\x27))\x0a\x09\x09\x09ON\x20CONFLICT(id)\x20DO\x20UPDATE\x20SET\x20data\x20=\x20excluded.data,\x20updated_at\x20=\x20excluded.updated_at\x0a\x09\x09')['run'](a);}async['clear'](){this['db']['exec']('DELETE\x20FROM\x20accounts');}}export function resetAllDbConnections(){if(cacheDbInstance){try{cacheDbInstance['close']();}catch(a){}cacheDbInstance=null;}if(accountDbInstance){try{accountDbInstance['close']();}catch(b){}accountDbInstance=null;}}process['on']('exit',()=>{resetAllDbConnections();}),process['on']('SIGINT',()=>{resetAllDbConnections(),process['exit'](0x0);}),process['on']('SIGTERM',()=>{resetAllDbConnections(),process['exit'](0x0);});export function resetAllStorage(){resetAllDbConnections();}export const defaultStorage=new SQLiteStorage();export const defaultAccountStorage=new SQLiteAccountStorage();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{WowClient}from'../../client/index.js';import{getFullnodeUrl}from'../../client/network.js';import{GasTokenType}from'../common.js';import{Config}from'./config.js';import{Cache,CachePrefix}from'./cache.js';import{W_ERROR,WErrors}from'../exception.js';export class TokenInfo{static ['_instance'];static['Instance'](){return!TokenInfo['_instance']&&(TokenInfo['_instance']=new TokenInfo()),TokenInfo['_instance'];}['cacheKey']=[CachePrefix['token']];async['fetch_imp'](a,b,c){const d=new WowClient({'url':getFullnodeUrl(a)}),e=await d['getCoinMetadata']({'coinType':b});if(e)return{'alias':c,'type':b,...e};return undefined;}async['fetch'](a,b,c){a=a??GasTokenType;const d=await Config['Instance']()['network_get'](c),e=await Cache['read']([...this['cacheKey'],d],async g=>{return{'expire':'INFINITE','data':[]};});let f=e?.['data']?.['find'](g=>g['type']===a);if(!f){f=await this['fetch_imp'](d,a,b);if(!f)return W_ERROR(WErrors['TokenNotFoundLocally'],'token\x20type:\x20'+a),undefined;const g=[...e?.['data']||[],f];await Cache['read']([...this['cacheKey'],d],async h=>({'expire':'INFINITE','data':g}),!![]);}else{if(b&&f['alias']!==b){f['alias']=b;const h=e?.['data']?.['map'](i=>i['type']===a?f:i)||[];await Cache['read']([...this['cacheKey'],d],async i=>({'expire':'INFINITE','data':h}),!![]);}}return f;}async['list'](a,b){const c=await Config['Instance']()['network_get'](b);let d=await Cache['read']([...this['cacheKey'],c],async i=>{return{'expire':'INFINITE','data':[]};}),e=d?.['data']||[];const f=a?.['type']??GasTokenType,g=a?.['type']?a?.['alias_or_name']:undefined,h=e['find'](i=>i['type']===f);if(!h){const i=await this['fetch_imp'](c,f,g);if(i){const j=[...e,i];await Cache['read']([...this['cacheKey'],c],async k=>({'expire':'INFINITE','data':j}),!![]),d=await Cache['read']([...this['cacheKey'],c],async k=>({'expire':'INFINITE','data':j})),e=d?.['data']||[];}}if(a){e=e['filter'](k=>{let l=!![];return a['symbol']&&l&&(l=k['symbol']===a['symbol']),a['type']&&l&&(l=k['type']===f),l;});if(a['alias_or_name']){const k=a['alias_or_name']['toLowerCase']();e=e['map'](l=>{let m=0x0;const n=l['alias']?.['toLowerCase']()||'',o=l['name']?.['toLowerCase']()||'';if(n===k||o===k)m=0x3;else{if(n['startsWith'](k)||o['startsWith'](k))m=0x2;else(n['includes'](k)||o['includes'](k))&&(m=0x1);}return{...l,'_score':m};}),e=e['filter'](l=>l['_score']>0x0)['sort']((l,m)=>{const n=m['_score']-l['_score'];if(n!==0x0)return n;const o=(l['alias']?.['length']||0x0)+(l['name']?.['length']||0x0),p=(m['alias']?.['length']||0x0)+(m['name']?.['length']||0x0);return o-p;}),e=e['map'](l=>{const {_score:m,...n}=l;return n;});}}return e;}}
|
package/dist/esm/w/local/util.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import*as
|
|
1
|
+
import*as a178a from'path';import*as a178b from'os';export function getWowDir(){if(process['env']['WOWOK_DATA_DIR'])return process['env']['WOWOK_DATA_DIR'];const a=a178b['homedir'](),b=a178b['platform']();if(b==='win32')return a178a['join'](a,'.wow','V1');else{if(b==='darwin')return a178a['join'](a,'Library','Application\x20Support','.wow','V1');else{const c=process['env']['XDG_CONFIG_HOME'];if(c)return a178a['join'](c,'.wow','V1');const d=process['env']['XDG_DATA_HOME'];if(d)return a178a['join'](d,'.wow','V1');return a178a['join'](a,'.wow','V1');}}}
|
package/dist/esm/w/local/wip.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{sha256}from'@noble/hashes/sha256';import{bytesToHex}from'@noble/hashes/utils';import*as a163a from'fs';import*as a163b from'path';import*as a163c from'https';import*as a163d from'http';const WIP_SCHEMA_URL='https://github.com/wowok-ai/docs/blob/main/WIP.md',WIP_VERSION='1.0.0';export const DEFAULT_LIMITS={'maxImageSize':0x2*0x400*0x400,'maxTotalSize':0xa*0x400*0x400,'maxImageCount':0xa,'maxTextLength':0x2710};export class WipError extends Error{constructor(a){super(a),this['name']='WipError';}}export class WipValidationError extends WipError{constructor(a){super(a),this['name']='WipValidationError';}}export class WipSizeError extends WipError{constructor(a){super(a),this['name']='WipSizeError';}}function detectMimeType(a){if(a['length']>=0x4&&a[0x0]===0x89&&a[0x1]===0x50&&a[0x2]===0x4e&&a[0x3]===0x47)return'image/png';if(a['length']>=0x3&&a[0x0]===0xff&&a[0x1]===0xd8&&a[0x2]===0xff)return'image/jpeg';if(a['length']>=0x6&&a[0x0]===0x47&&a[0x1]===0x49&&a[0x2]===0x46)return'image/gif';if(a['length']>=0xc&&a[0x0]===0x52&&a[0x1]===0x49&&a[0x2]===0x46&&a[0x3]===0x46&&a[0x8]===0x57&&a[0x9]===0x45&&a[0xa]===0x42&&a[0xb]===0x50)return'image/webp';return null;}function uint8ArrayToBase64(a){let b='';const c=a['length'];for(let d=0x0;d<c;d++){b+=String['fromCharCode'](a[d]);}return btoa(b);}function base64ToUint8Array(a){const b=atob(a),c=b['length'],d=new Uint8Array(c);for(let e=0x0;e<c;e++){d[e]=b['charCodeAt'](e);}return d;}function canonicalizeJson(a){if(a===null||typeof a!=='object')return JSON['stringify'](a);if(Array['isArray'](a))return'['+a['map'](canonicalizeJson)['join'](',')+']';const b=a,c=Object['keys'](b)['sort'](),d=c['map'](e=>'\x22'+e+'\x22:'+canonicalizeJson(b[e]));return'{'+d['join'](',')+'}';}function computeHash(a){const b=sha256(new TextEncoder()['encode'](a));return bytesToHex(b);}function generateId(a){const b=Date['now']()['toString'](0x24),c=Math['random']()['toString'](0x24)['substring'](0x2,0x8);return a+'-'+b+'-'+c;}function getExtensionFromMimeType(a){const b={'image/png':'png','image/jpeg':'jpg','image/gif':'gif','image/webp':'webp'};return b[a]||'bin';}class ResourceLoader{['maxSize'];constructor(a){this['maxSize']=a;}async['load'](a){if(!a||a['trim']()==='')throw new WipError('WIP\x20file\x20path\x20cannot\x20be\x20empty');if(a['startsWith']('data:'))return this['loadFromDataUrl'](a);if(a['startsWith']('http://')||a['startsWith']('https://'))return this['loadFromNetwork'](a);return this['loadFromFile'](a);}['loadFromDataUrl'](a){const b=a['match'](/^data:image\/(\w+);base64,(.+)$/);if(!b)throw new WipValidationError('Invalid\x20data\x20URL\x20format:\x20'+a['substring'](0x0,0x32)+'...');const c=b[0x2];try{return base64ToUint8Array(c);}catch(d){throw new WipError('Failed\x20to\x20decode\x20data\x20URL:\x20'+d);}}async['loadFromNetwork'](a){return new Promise((b,c)=>{const d=setTimeout(()=>{c(new WipError('Network\x20timeout\x20while\x20fetching:\x20'+a));},0x7530),e=a['startsWith']('https:'),f=e?a163c:a163d,g={'headers':{'Accept':'application/json,*/*'}};e&&(g['rejectUnauthorized']=![]);const h=f['get'](a,g,i=>{clearTimeout(d);if(i['statusCode']!==0xc8){c(new WipError('Failed\x20to\x20fetch:\x20'+i['statusCode']+'\x20'+i['statusMessage']));return;}const j=i['headers']['content-length'];if(j&&parseInt(j)>this['maxSize']){c(new WipSizeError('Resource\x20from\x20'+a+'\x20size\x20('+j+'\x20bytes)\x20exceeds\x20limit\x20('+this['maxSize']+'\x20bytes)'));return;}const k=[];i['on']('data',l=>{k['push'](l);}),i['on']('end',()=>{const l=Buffer['concat'](k);if(l['length']>this['maxSize']){c(new WipSizeError('Resource\x20from\x20'+a+'\x20size\x20('+l['length']+'\x20bytes)\x20exceeds\x20limit\x20('+this['maxSize']+'\x20bytes)'));return;}b(new Uint8Array(l));}),i['on']('error',l=>{c(new WipError('Network\x20error:\x20'+l['message']));});});h['on']('error',i=>{clearTimeout(d),c(new WipError('Network\x20error:\x20'+i['message']));});});}['loadFromFile'](a){const b=a163b['resolve'](a);if(!a163a['existsSync'](b))throw new WipError('File\x20not\x20found:\x20'+b);const c=a163a['statSync'](b);if(!c['isFile']())throw new WipError('Path\x20is\x20not\x20a\x20file:\x20'+b);if(c['size']>this['maxSize'])throw new WipSizeError('File\x20'+b+'\x20size\x20('+c['size']+'\x20bytes)\x20exceeds\x20limit\x20('+this['maxSize']+'\x20bytes)');const d=a163a['readFileSync'](b);return new Uint8Array(d);}}export class WIP{['limits'];['resourceLoader'];constructor(a={}){this['limits']={...DEFAULT_LIMITS,...a},this['resourceLoader']=new ResourceLoader(this['limits']['maxImageSize']);}async['create'](a){if(a['text']['length']>this['limits']['maxTextLength'])throw new WipSizeError('Text\x20length\x20('+a['text']['length']+')\x20exceeds\x20limit\x20('+this['limits']['maxTextLength']+')');const b=[];if(a['images']&&a['images']['length']>0x0){if(a['images']['length']>this['limits']['maxImageCount'])throw new WipSizeError('Image\x20count\x20('+a['images']['length']+')\x20exceeds\x20limit\x20('+this['limits']['maxImageCount']+')');for(let j=0x0;j<a['images']['length'];j++){const k=await this['processImage'](a['images'][j],j);b['push'](k);}}const c={'content':{'text':a['text'],'format':a['textFormat']||'plain'},'media':b},d={'wip':WIP_SCHEMA_URL,'payload':c},e=computeHash(canonicalizeJson(d)),f={'type':'wip','version':WIP_VERSION,'created':new Date()['toISOString'](),'hash':e,'algorithm':'sha256'};if(a['signKeyPair']){const {signature:l,...m}=f,n=computeHash(canonicalizeJson(m)),o=await this['sign'](n,a['signKeyPair']['privateKey'],a['signAlgorithm']||'Falcon512');f['signature']={'value':o,'publicKey':a['signKeyPair']['publicKey'],'algorithm':a['signAlgorithm']||'Falcon512'};}const g={'wip':WIP_SCHEMA_URL,'payload':c,'meta':f},h=JSON['stringify'](g);if(h['length']>this['limits']['maxTotalSize'])throw new WipSizeError('Total\x20WIP\x20file\x20size\x20('+h['length']+'\x20bytes)\x20exceeds\x20limit\x20('+this['limits']['maxTotalSize']+'\x20bytes)');return g;}async['processImage'](a,b){const c=await this['resourceLoader']['load'](a['source']),d=detectMimeType(c);if(!d)throw new WipValidationError('Unsupported\x20image\x20format:\x20'+a['source']);let e=a['filename'];if(!e){if(a['source']['startsWith']('http')){const f=new URL(a['source']),g=f['pathname'];e=g['substring'](g['lastIndexOf']('/')+0x1)||'image-'+b;}else e=a['source']['substring'](a['source']['lastIndexOf']('/')+0x1)||'image-'+b;}return{'id':a['id']||generateId('img'),'type':d,'data':uint8ArrayToBase64(c),'filename':e};}async['sign'](a,b,c){if(c!=='Falcon512')throw new WipError('Unsupported\x20signature\x20algorithm:\x20'+c);const {Falcon512Keypair:d}=await import('../../keypairs/falcon512/index.js'),e=d['fromSecretKey'](b),f=await e['sign'](new TextEncoder()['encode'](a));return uint8ArrayToBase64(f);}async['verify'](a){try{if(!a['wip']||!a['payload']||!a['meta'])return{'valid':![],'error':'Invalid\x20WIP\x20file\x20structure'};if(a['meta']['type']!=='wip')return{'valid':![],'error':'Invalid\x20meta.type:\x20'+a['meta']['type']};const b={'wip':a['wip'],'payload':a['payload']},c=computeHash(canonicalizeJson(b));if(c!==a['meta']['hash'])return{'valid':![],'error':'Hash\x20mismatch\x20-\x20content\x20has\x20been\x20tampered'};const d=[];if(a['meta']['signature']){const {signature:e,...f}=a['meta'],g=computeHash(canonicalizeJson(f)),h=Array['isArray'](a['meta']['signature'])?a['meta']['signature']:[a['meta']['signature']];for(const i of h){const j=await this['verifySignature'](g,i['value'],i['publicKey'],i['algorithm']);d['push']({'address':i['address'],'valid':j});if(!j)return{'valid':![],'error':'Invalid\x20signature','signatures':d};}}return{'valid':!![],'signatures':d};}catch(k){return{'valid':![],'error':'Verification\x20error:\x20'+k};}}async['verifySignature'](a,b,c,d){if(d!=='Falcon512')throw new WipError('Unsupported\x20signature\x20algorithm:\x20'+d);try{const {Falcon512PublicKey:e}=await import('../../keypairs/falcon512/publickey.js');let f;if(c['startsWith']('0x')){const i=Buffer['from'](c['slice'](0x2),'hex');if(i['length']===0x382)f=i['slice'](0x1);else i['length']===0x381?f=i:f=i;}else try{const j=Buffer['from'](c,'base64');j['length']===0x382?f=j['slice'](0x1):f=j;}catch{f=Buffer['from'](c,'base64');}const g=new e(f),h=Uint8Array['from'](Buffer['from'](b,'base64'));return await g['verify'](new TextEncoder()['encode'](a),h);}catch(k){return console['error']('Signature\x20verification\x20error:',k),![];}}async['toHtml'](a,b={}){const {title:title='WIP\x20Document',theme:theme='light'}=b,{payload:c,meta:d}=a,e=o=>{return o['replace'](/&/g,'&')['replace'](/</g,'<')['replace'](/>/g,'>')['replace'](/"/g,'"')['replace'](/'/g,''');},f=(o,p)=>{switch(p){case'html':return o;case'markdown':return o['replace'](/\*\*(.+?)\*\*/g,'<strong>$1</strong>')['replace'](/\*(.+?)\*/g,'<em>$1</em>')['replace'](/\n/g,'<br>');case'plain':default:return e(o)['replace'](/\n/g,'<br>');}},g=theme==='dark'?'#1a1a1a':'#ffffff',h=theme==='dark'?'#e0e0e0':'#333333',i=theme==='dark'?'#444444':'#e0e0e0',j='#4caf50',k='#ff9800',l=await this['verify'](a),m=l['valid']?'<span\x20style=\x22background:\x20'+j+';\x20color:\x20white;\x20padding:\x204px\x208px;\x20border-radius:\x204px;\x20font-size:\x2012px;\x22>✓\x20Verified</span>':'<span\x20style=\x22background:\x20'+k+';\x20color:\x20white;\x20padding:\x204px\x208px;\x20border-radius:\x204px;\x20font-size:\x2012px;\x22>⚠\x20Tampered</span>',n=c['media']['map'](o=>'\x0a\x09\x09\x09\x09<div\x20style=\x22margin:\x2016px\x200;\x20border:\x201px\x20solid\x20'+i+';\x20border-radius:\x208px;\x20overflow:\x20hidden;\x22>\x0a\x09\x09\x09\x09\x09<img\x20src=\x22data:'+o['type']+';base64,'+o['data']+'\x22\x20\x0a\x09\x09\x09\x09\x09\x20\x20\x20\x20\x20style=\x22max-width:\x20100%;\x20height:\x20auto;\x20display:\x20block;\x22\x20\x0a\x09\x09\x09\x09\x09\x20\x20\x20\x20\x20alt=\x22'+e(o['filename']||o['id'])+'\x22\x20/>\x0a\x09\x09\x09\x09\x09'+(o['filename']?'<div\x20style=\x22padding:\x208px;\x20font-size:\x2012px;\x20color:\x20#666;\x20background:\x20'+(theme==='dark'?'#2a2a2a':'#f5f5f5')+';\x20border-top:\x201px\x20solid\x20'+i+';\x22>'+e(o['filename'])+'</div>':'')+'\x0a\x09\x09\x09\x09</div>\x0a\x09\x09\x09')['join']('');return'<!DOCTYPE\x20html>\x0a<html\x20lang=\x22en\x22>\x0a<head>\x0a\x20\x20\x20\x20<meta\x20charset=\x22UTF-8\x22>\x0a\x20\x20\x20\x20<meta\x20name=\x22viewport\x22\x20content=\x22width=device-width,\x20initial-scale=1.0\x22>\x0a\x20\x20\x20\x20<title>'+e(title)+'</title>\x0a</head>\x0a<body\x20style=\x22margin:\x200;\x20padding:\x2020px;\x20font-family:\x20-apple-system,\x20BlinkMacSystemFont,\x20\x27Segoe\x20UI\x27,\x20Roboto,\x20sans-serif;\x20background:\x20'+g+';\x20color:\x20'+h+';\x20line-height:\x201.6;\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22max-width:\x20800px;\x20margin:\x200\x20auto;\x20background:\x20'+(theme==='dark'?'#252525':'#ffffff')+';\x20border-radius:\x2012px;\x20box-shadow:\x200\x202px\x208px\x20rgba(0,0,0,0.1);\x20overflow:\x20hidden;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22padding:\x2020px\x2024px;\x20border-bottom:\x201px\x20solid\x20'+i+';\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:\x20flex;\x20justify-content:\x20space-between;\x20align-items:\x20center;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<h1\x20style=\x22margin:\x200;\x20font-size:\x2020px;\x20font-weight:\x20600;\x22>'+e(title)+'</h1>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:\x2012px;\x20color:\x20#666;\x20margin-top:\x204px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WIP\x20v'+d['version']+'\x20•\x20'+new Date(d['created'])['toLocaleString']()+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+m+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:\x2011px;\x20color:\x20#999;\x20margin-top:\x2012px;\x20padding:\x208px;\x20background:\x20'+(theme==='dark'?'#2a2a2a':'#f5f5f5')+';\x20border-radius:\x204px;\x20font-style:\x20italic;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Important\x20Note:\x20This\x20page\x20is\x20for\x20document\x20browsing\x20and\x20verification\x20reference\x20only.\x20Please\x20verify\x20the\x20document\x20integrity\x20through\x20the\x20API\x20using\x20the\x20WIP\x20file.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(l['signatures']&&l['signatures']['length']>0x0?'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22margin-top:\x2012px;\x20padding:\x208px;\x20background:\x20'+(theme==='dark'?'#2a3f2a':'#e8f5e9')+';\x20border-radius:\x204px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:\x2011px;\x20color:\x20'+(theme==='dark'?'#81c784':'#2e7d32')+';\x20margin-bottom:\x204px;\x22>✓\x20Signature\x20Verification\x20('+l['signatures']['length']+'\x20signature'+(l['signatures']['length']>0x1?'s':'')+')</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+l['signatures']['map']((o,p)=>'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:\x2010px;\x20color:\x20'+h+';\x20margin-left:\x208px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(p+0x1)+'.\x20'+(o['address']?e(o['address']['slice'](0x0,0x14))+'...':'Unknown')+':\x20'+(o['valid']?'<span\x20style=\x22color:\x20#4caf50;\x22>✓\x20Valid</span>':'<span\x20style=\x22color:\x20#f44336;\x22>✗\x20Invalid</span>')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20')['join']('')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22padding:\x2024px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:\x2016px;\x20line-height:\x201.8;\x20margin-bottom:\x2024px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+f(c['content']['text'],c['content']['format'])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+n+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22padding:\x2016px\x2024px;\x20background:\x20'+(theme==='dark'?'#2a2a2a':'#f8f9fa')+';\x20border-top:\x201px\x20solid\x20'+i+';\x20font-size:\x2011px;\x20color:\x20#666;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:\x20flex;\x20justify-content:\x20space-between;\x20align-items:\x20center;\x20flex-wrap:\x20wrap;\x20gap:\x208px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<strong>Hash:</strong>\x20<code\x20style=\x22background:\x20'+(theme==='dark'?'#333':'#e9ecef')+';\x20padding:\x202px\x206px;\x20border-radius:\x203px;\x22>'+e(d['hash'])+'</code>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(l['valid']?'Content\x20integrity\x20verified':'Verification\x20failed:\x20'+e(l['error']||'Unknown\x20error'))+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a</body>\x0a</html>';}['stringify'](a,b=!![]){return b?JSON['stringify'](a,null,0x2):JSON['stringify'](a);}['parse'](a){try{const b=JSON['parse'](a);if(!b['wip']||!b['payload']||!b['meta'])throw new WipValidationError('Invalid\x20WIP\x20file\x20structure');return b;}catch(c){if(c instanceof WipError)throw c;throw new WipValidationError('Failed\x20to\x20parse\x20WIP\x20file:\x20'+c);}}async['load'](a){const b=await this['resourceLoader']['load'](a),c=new TextDecoder()['decode'](b);return this['parse'](c);}['getHash'](a){const b=a['meta']['hash'];if(b['includes'](':'))return b['split'](':')[0x1];return b;}['extractImages'](a,b){!a163a['existsSync'](b)&&a163a['mkdirSync'](b,{'recursive':!![]});const c=[];for(const d of a['payload']['media']){const e=getExtensionFromMimeType(d['type']),f=d['filename']||d['id']+'.'+e,g=a163b['join'](b,f),h=Buffer['from'](base64ToUint8Array(d['data']));a163a['writeFileSync'](g,h),c['push'](g);}return c;}['save'](a,b,c=!![]){const d=a163b['dirname'](b);!a163a['existsSync'](d)&&a163a['mkdirSync'](d,{'recursive':!![]}),a163a['writeFileSync'](b,this['stringify'](a,c),'utf-8');}['getLimits'](){return{...this['limits']};}['setLimits'](a){this['limits']={...this['limits'],...a},this['resourceLoader']=new ResourceLoader(this['limits']['maxImageSize']);}}export async function createWip(a,b){const c=new WIP(b);return c['create'](a);}export async function verifyWip(a,b){if(b!==undefined){const e=a['meta']['hash']['toLowerCase']()['replace'](/^sha256:/,''),f=b['toLowerCase']()['replace'](/^sha256:/,'');if(e!==f)return{'valid':![],'error':'Hash\x20mismatch'};}const c=new WIP(),d=await c['verify'](a);return{'valid':d['valid'],'error':d['error']};}export async function wipToHtml(a,b){const c=new WIP();return c['toHtml'](a,b);}export async function loadWip(a,b){const c=new WIP(b);return c['load'](a);}export async function generate_wip(a,b){const c=new WIP(DEFAULT_LIMITS);let d=await c['create']({'text':a['markdown_text'],'textFormat':'markdown','images':a['images']});if(a['account']){const {Account:e}=await import('./account.js'),f=await e['Instance']()['get_address'](a['account']);if(!f)throw new WipValidationError('Account\x20not\x20found:\x20'+a['account']);const {signature:g,...h}=d['meta'],i=computeHash(canonicalizeJson(h)),j=await e['Instance']()['sign'](f,i),k=await e['Instance']()['get'](f);if(!k||!k['pubkey'])throw new WipValidationError('Cannot\x20get\x20public\x20key\x20for\x20account:\x20'+f);let l;if(k['pubkey']['startsWith']('0x')){const p=Buffer['from'](k['pubkey']['slice'](0x2),'hex');if(p['length']===0x382)l=p['slice'](0x1)['toString']('base64');else{if(p['length']===0x381)l=p['toString']('base64');else throw new WipValidationError('Invalid\x20public\x20key\x20length:\x20'+p['length']+',\x20expected\x20897\x20or\x20898\x20bytes');}}else l=k['pubkey'];const m=Buffer['from'](j['slice'](0x2),'hex')['toString']('base64'),n={'value':m,'publicKey':l,'algorithm':'Falcon512','address':f};let o;d['meta']['signature']?o=Array['isArray'](d['meta']['signature'])?[...d['meta']['signature'],n]:[d['meta']['signature'],n]:o=[n],d={...d,'meta':{...d['meta'],'signature':o}};}return c['save'](d,b,!![]),b;}export async function verify_wip(a,b,c){const d=new WIP();let e;try{e=await d['load'](a);}catch(k){return{'valid':![],'error':'Failed\x20to\x20load\x20WIP\x20file:\x20'+k,'hashValid':![],'hasSignature':![]};}if(!e['wip']||!e['payload']||!e['meta'])return{'valid':![],'error':'Invalid\x20WIP\x20file\x20structure','hashValid':![],'hasSignature':![]};if(e['meta']['type']!=='wip')return{'valid':![],'error':'Invalid\x20meta.type:\x20'+e['meta']['type'],'hashValid':![],'hasSignature':!!e['meta']['signature']};if(b!==undefined){const l=e['meta']['hash']['toLowerCase']()['replace'](/^sha256:/,''),m=b['toLowerCase']()['replace'](/^sha256:/,'');if(l!==m)return{'valid':![],'error':'Hash\x20mismatch','hashValid':![],'hasSignature':!!e['meta']['signature']};}if(c&&!e['meta']['signature'])return{'valid':![],'error':'Signature\x20required\x20but\x20WIP\x20file\x20has\x20no\x20signature','hashValid':!![],'hasSignature':![]};const f={'wip':e['wip'],'payload':e['payload']},g=computeHash(canonicalizeJson(f)),h=g===e['meta']['hash'];if(!h)return{'valid':![],'error':'Hash\x20mismatch\x20-\x20content\x20has\x20been\x20tampered','hashValid':![],'hasSignature':!!e['meta']['signature']};let i;const j=[];if(e['meta']['signature']){const {signature:n,...o}=e['meta'],p=computeHash(canonicalizeJson(o)),q=Array['isArray'](e['meta']['signature'])?e['meta']['signature']:[e['meta']['signature']];let r=!![];for(const s of q){const t=await d['verifySignature'](p,s['value'],s['publicKey'],s['algorithm']);let u;try{const {Falcon512PublicKey:v}=await import('../../keypairs/falcon512/publickey.js'),w=new v(s['publicKey']);u=w['toWAddress']();}catch{}j['push']({'publicKey':s['publicKey'],'address':u,'valid':t}),!t&&(r=![]);}i=r;if(!i){const x=j['filter'](y=>!y['valid']&&y['address'])['map'](y=>y['address']);return{'valid':![],'error':'Signatures\x20from\x20the\x20following\x20addresses\x20are\x20invalid:\x20'+x['join'](',\x20'),'hashValid':!![],'signatureValid':![],'hasSignature':!![],'signatures':j};}}return{'valid':!![],'hashValid':!![],'signatureValid':i,'hasSignature':!!e['meta']['signature'],'signatures':j['length']>0x0?j:undefined};}export async function sign_wip(a,b,c){const d=new WIP(),e=await d['load'](a);if(!e['wip']||!e['payload']||!e['meta'])throw new WipValidationError('Invalid\x20WIP\x20file\x20structure');if(e['meta']['type']!=='wip')throw new WipValidationError('Invalid\x20meta.type:\x20'+e['meta']['type']);const {Account:f}=await import('./account.js'),g=await f['Instance']()['get_address'](b);if(!g)throw new WipValidationError('Account\x20not\x20found:\x20'+b);const {signature:h,...i}=e['meta'],j=computeHash(canonicalizeJson(i)),k=await f['Instance']()['signData'](g,j);let l;const m=k['publicKey'];if(m['startsWith']('0x')){const r=Buffer['from'](m['slice'](0x2),'hex');if(r['length']===0x382)l=r['slice'](0x1)['toString']('base64');else{if(r['length']===0x381)l=r['toString']('base64');else throw new WipValidationError('Invalid\x20public\x20key\x20length:\x20'+r['length']+',\x20expected\x20897\x20or\x20898\x20bytes');}}else l=m;const n={'value':Buffer['from'](k['signature']['slice'](0x2),'hex')['toString']('base64'),'publicKey':l,'algorithm':'Falcon512','address':k['address']};let o;if(e['meta']['signature']){const s=Array['isArray'](e['meta']['signature'])?[...e['meta']['signature']]:[e['meta']['signature']],t=s['findIndex'](u=>u['publicKey']===l);t>=0x0?(s[t]=n,o=s):o=[...s,n];}else o=[n];const p={...e,'meta':{...e['meta'],'signature':o}};let q;if(c)q=c;else{const u=a163b['dirname'](a),v=a163b['extname'](a),w=a163b['basename'](a,v);q=a163b['join'](u,'signed_'+w+v);}return d['save'](p,q,!![]),q;}export async function wip2html(a,b={}){const c=await import('fs'),d=await import('path'),e=c['statSync'](a);if(e['isFile']()){const f=new WIP(),g=await f['load'](a),h=await f['toHtml'](g,b);if(b['outputPath'])return c['writeFileSync'](b['outputPath'],h),b['outputPath'];const i=d['dirname'](a),j=d['extname'](a),k=d['basename'](a,j),l=d['join'](i,k+'.html');return c['writeFileSync'](l,h),l;}else{if(e['isDirectory']()){const m=c['readdirSync'](a),n=m['filter'](q=>q['endsWith']('.wip'));if(n['length']===0x0)throw new WipValidationError('No\x20.wip\x20files\x20found\x20in\x20directory:\x20'+a);const o=[],p=new WIP();for(const q of n){const r=d['join'](a,q),s=await p['load'](r),t=await p['toHtml'](s,b),u=q['replace']('.wip','.html'),v=b['outputPath']?d['join'](b['outputPath'],u):d['join'](a,u),w=d['dirname'](v);!c['existsSync'](w)&&c['mkdirSync'](w,{'recursive':!![]}),c['writeFileSync'](v,t),o['push'](v);}return o;}else throw new WipValidationError('Invalid\x20path:\x20'+a);}}export default WIP;
|
|
1
|
+
import{sha256}from'@noble/hashes/sha256';import{bytesToHex}from'@noble/hashes/utils';import*as a179a from'fs';import*as a179b from'path';import*as a179c from'https';import*as a179d from'http';const WIP_SCHEMA_URL='https://github.com/wowok-ai/docs/blob/main/WIP.md',WIP_VERSION='1.0.0';export const DEFAULT_LIMITS={'maxImageSize':0x2*0x400*0x400,'maxTotalSize':0xa*0x400*0x400,'maxImageCount':0xa,'maxTextLength':0x2710};export class WipError extends Error{constructor(a){super(a),this['name']='WipError';}}export class WipValidationError extends WipError{constructor(a){super(a),this['name']='WipValidationError';}}export class WipSizeError extends WipError{constructor(a){super(a),this['name']='WipSizeError';}}function detectMimeType(a){if(a['length']>=0x4&&a[0x0]===0x89&&a[0x1]===0x50&&a[0x2]===0x4e&&a[0x3]===0x47)return'image/png';if(a['length']>=0x3&&a[0x0]===0xff&&a[0x1]===0xd8&&a[0x2]===0xff)return'image/jpeg';if(a['length']>=0x6&&a[0x0]===0x47&&a[0x1]===0x49&&a[0x2]===0x46)return'image/gif';if(a['length']>=0xc&&a[0x0]===0x52&&a[0x1]===0x49&&a[0x2]===0x46&&a[0x3]===0x46&&a[0x8]===0x57&&a[0x9]===0x45&&a[0xa]===0x42&&a[0xb]===0x50)return'image/webp';return null;}function uint8ArrayToBase64(a){let b='';const c=a['length'];for(let d=0x0;d<c;d++){b+=String['fromCharCode'](a[d]);}return btoa(b);}function base64ToUint8Array(a){const b=atob(a),c=b['length'],d=new Uint8Array(c);for(let e=0x0;e<c;e++){d[e]=b['charCodeAt'](e);}return d;}function canonicalizeJson(a){if(a===null||typeof a!=='object')return JSON['stringify'](a);if(Array['isArray'](a))return'['+a['map'](canonicalizeJson)['join'](',')+']';const b=a,c=Object['keys'](b)['sort'](),d=c['map'](e=>'\x22'+e+'\x22:'+canonicalizeJson(b[e]));return'{'+d['join'](',')+'}';}function computeHash(a){const b=sha256(new TextEncoder()['encode'](a));return bytesToHex(b);}function generateId(a){const b=Date['now']()['toString'](0x24),c=Math['random']()['toString'](0x24)['substring'](0x2,0x8);return a+'-'+b+'-'+c;}function getExtensionFromMimeType(a){const b={'image/png':'png','image/jpeg':'jpg','image/gif':'gif','image/webp':'webp'};return b[a]||'bin';}class ResourceLoader{['maxSize'];constructor(a){this['maxSize']=a;}async['load'](a){if(!a||a['trim']()==='')throw new WipError('WIP\x20file\x20path\x20cannot\x20be\x20empty');if(a['startsWith']('data:'))return this['loadFromDataUrl'](a);if(a['startsWith']('http://')||a['startsWith']('https://'))return this['loadFromNetwork'](a);return this['loadFromFile'](a);}['loadFromDataUrl'](a){const b=a['match'](/^data:image\/(\w+);base64,(.+)$/);if(!b)throw new WipValidationError('Invalid\x20data\x20URL\x20format:\x20'+a['substring'](0x0,0x32)+'...');const c=b[0x2];try{return base64ToUint8Array(c);}catch(d){throw new WipError('Failed\x20to\x20decode\x20data\x20URL:\x20'+d);}}async['loadFromNetwork'](a){return new Promise((b,c)=>{const d=setTimeout(()=>{c(new WipError('Network\x20timeout\x20while\x20fetching:\x20'+a));},0x7530),e=a['startsWith']('https:'),f=e?a179c:a179d,g={'headers':{'Accept':'application/json,*/*'}};e&&(g['rejectUnauthorized']=![]);const h=f['get'](a,g,i=>{clearTimeout(d);if(i['statusCode']!==0xc8){c(new WipError('Failed\x20to\x20fetch:\x20'+i['statusCode']+'\x20'+i['statusMessage']));return;}const j=i['headers']['content-length'];if(j&&parseInt(j)>this['maxSize']){c(new WipSizeError('Resource\x20from\x20'+a+'\x20size\x20('+j+'\x20bytes)\x20exceeds\x20limit\x20('+this['maxSize']+'\x20bytes)'));return;}const k=[];i['on']('data',l=>{k['push'](l);}),i['on']('end',()=>{const l=Buffer['concat'](k);if(l['length']>this['maxSize']){c(new WipSizeError('Resource\x20from\x20'+a+'\x20size\x20('+l['length']+'\x20bytes)\x20exceeds\x20limit\x20('+this['maxSize']+'\x20bytes)'));return;}b(new Uint8Array(l));}),i['on']('error',l=>{c(new WipError('Network\x20error:\x20'+l['message']));});});h['on']('error',i=>{clearTimeout(d),c(new WipError('Network\x20error:\x20'+i['message']));});});}['loadFromFile'](a){const b=a179b['resolve'](a);if(!a179a['existsSync'](b))throw new WipError('File\x20not\x20found:\x20'+b);const c=a179a['statSync'](b);if(!c['isFile']())throw new WipError('Path\x20is\x20not\x20a\x20file:\x20'+b);if(c['size']>this['maxSize'])throw new WipSizeError('File\x20'+b+'\x20size\x20('+c['size']+'\x20bytes)\x20exceeds\x20limit\x20('+this['maxSize']+'\x20bytes)');const d=a179a['readFileSync'](b);return new Uint8Array(d);}}export class WIP{['limits'];['resourceLoader'];constructor(a={}){this['limits']={...DEFAULT_LIMITS,...a},this['resourceLoader']=new ResourceLoader(this['limits']['maxImageSize']);}async['create'](a){if(a['text']['length']>this['limits']['maxTextLength'])throw new WipSizeError('Text\x20length\x20('+a['text']['length']+')\x20exceeds\x20limit\x20('+this['limits']['maxTextLength']+')');const b=[];if(a['images']&&a['images']['length']>0x0){if(a['images']['length']>this['limits']['maxImageCount'])throw new WipSizeError('Image\x20count\x20('+a['images']['length']+')\x20exceeds\x20limit\x20('+this['limits']['maxImageCount']+')');for(let j=0x0;j<a['images']['length'];j++){const k=await this['processImage'](a['images'][j],j);b['push'](k);}}const c={'content':{'text':a['text'],'format':a['textFormat']||'plain'},'media':b},d={'wip':WIP_SCHEMA_URL,'payload':c},e=computeHash(canonicalizeJson(d)),f={'type':'wip','version':WIP_VERSION,'created':new Date()['toISOString'](),'hash':e,'algorithm':'sha256'};if(a['signKeyPair']){const {signature:l,...m}=f,n=computeHash(canonicalizeJson(m)),o=await this['sign'](n,a['signKeyPair']['privateKey'],a['signAlgorithm']||'Falcon512');f['signature']={'value':o,'publicKey':a['signKeyPair']['publicKey'],'algorithm':a['signAlgorithm']||'Falcon512'};}const g={'wip':WIP_SCHEMA_URL,'payload':c,'meta':f},h=JSON['stringify'](g);if(h['length']>this['limits']['maxTotalSize'])throw new WipSizeError('Total\x20WIP\x20file\x20size\x20('+h['length']+'\x20bytes)\x20exceeds\x20limit\x20('+this['limits']['maxTotalSize']+'\x20bytes)');return g;}async['processImage'](a,b){const c=await this['resourceLoader']['load'](a['source']),d=detectMimeType(c);if(!d)throw new WipValidationError('Unsupported\x20image\x20format:\x20'+a['source']);let e=a['filename'];if(!e){if(a['source']['startsWith']('http')){const f=new URL(a['source']),g=f['pathname'];e=g['substring'](g['lastIndexOf']('/')+0x1)||'image-'+b;}else e=a['source']['substring'](a['source']['lastIndexOf']('/')+0x1)||'image-'+b;}return{'id':a['id']||generateId('img'),'type':d,'data':uint8ArrayToBase64(c),'filename':e};}async['sign'](a,b,c){if(c!=='Falcon512')throw new WipError('Unsupported\x20signature\x20algorithm:\x20'+c);const {Falcon512Keypair:d}=await import('../../keypairs/falcon512/index.js'),e=d['fromSecretKey'](b),f=await e['sign'](new TextEncoder()['encode'](a));return uint8ArrayToBase64(f);}async['verify'](a){try{if(!a['wip']||!a['payload']||!a['meta'])return{'valid':![],'error':'Invalid\x20WIP\x20file\x20structure'};if(a['meta']['type']!=='wip')return{'valid':![],'error':'Invalid\x20meta.type:\x20'+a['meta']['type']};const b={'wip':a['wip'],'payload':a['payload']},c=computeHash(canonicalizeJson(b));if(c!==a['meta']['hash'])return{'valid':![],'error':'Hash\x20mismatch\x20-\x20content\x20has\x20been\x20tampered'};const d=[];if(a['meta']['signature']){const {signature:e,...f}=a['meta'],g=computeHash(canonicalizeJson(f)),h=Array['isArray'](a['meta']['signature'])?a['meta']['signature']:[a['meta']['signature']];for(const i of h){const j=await this['verifySignature'](g,i['value'],i['publicKey'],i['algorithm']);d['push']({'address':i['address'],'valid':j});if(!j)return{'valid':![],'error':'Invalid\x20signature','signatures':d};}}return{'valid':!![],'signatures':d};}catch(k){return{'valid':![],'error':'Verification\x20error:\x20'+k};}}async['verifySignature'](a,b,c,d){if(d!=='Falcon512')throw new WipError('Unsupported\x20signature\x20algorithm:\x20'+d);try{const {Falcon512PublicKey:e}=await import('../../keypairs/falcon512/publickey.js');let f;if(c['startsWith']('0x')){const i=Buffer['from'](c['slice'](0x2),'hex');if(i['length']===0x382)f=i['slice'](0x1);else i['length']===0x381?f=i:f=i;}else try{const j=Buffer['from'](c,'base64');j['length']===0x382?f=j['slice'](0x1):f=j;}catch{f=Buffer['from'](c,'base64');}const g=new e(f),h=Uint8Array['from'](Buffer['from'](b,'base64'));return await g['verify'](new TextEncoder()['encode'](a),h);}catch(k){return console['error']('Signature\x20verification\x20error:',k),![];}}async['toHtml'](a,b={}){const {title:title='WIP\x20Document',theme:theme='light'}=b,{payload:c,meta:d}=a,e=o=>{return o['replace'](/&/g,'&')['replace'](/</g,'<')['replace'](/>/g,'>')['replace'](/"/g,'"')['replace'](/'/g,''');},f=(o,p)=>{switch(p){case'html':return o;case'markdown':return o['replace'](/\*\*(.+?)\*\*/g,'<strong>$1</strong>')['replace'](/\*(.+?)\*/g,'<em>$1</em>')['replace'](/\n/g,'<br>');case'plain':default:return e(o)['replace'](/\n/g,'<br>');}},g=theme==='dark'?'#1a1a1a':'#ffffff',h=theme==='dark'?'#e0e0e0':'#333333',i=theme==='dark'?'#444444':'#e0e0e0',j='#4caf50',k='#ff9800',l=await this['verify'](a),m=l['valid']?'<span\x20style=\x22background:\x20'+j+';\x20color:\x20white;\x20padding:\x204px\x208px;\x20border-radius:\x204px;\x20font-size:\x2012px;\x22>✓\x20Verified</span>':'<span\x20style=\x22background:\x20'+k+';\x20color:\x20white;\x20padding:\x204px\x208px;\x20border-radius:\x204px;\x20font-size:\x2012px;\x22>⚠\x20Tampered</span>',n=c['media']['map'](o=>'\x0a\x09\x09\x09\x09<div\x20style=\x22margin:\x2016px\x200;\x20border:\x201px\x20solid\x20'+i+';\x20border-radius:\x208px;\x20overflow:\x20hidden;\x22>\x0a\x09\x09\x09\x09\x09<img\x20src=\x22data:'+o['type']+';base64,'+o['data']+'\x22\x20\x0a\x09\x09\x09\x09\x09\x20\x20\x20\x20\x20style=\x22max-width:\x20100%;\x20height:\x20auto;\x20display:\x20block;\x22\x20\x0a\x09\x09\x09\x09\x09\x20\x20\x20\x20\x20alt=\x22'+e(o['filename']||o['id'])+'\x22\x20/>\x0a\x09\x09\x09\x09\x09'+(o['filename']?'<div\x20style=\x22padding:\x208px;\x20font-size:\x2012px;\x20color:\x20#666;\x20background:\x20'+(theme==='dark'?'#2a2a2a':'#f5f5f5')+';\x20border-top:\x201px\x20solid\x20'+i+';\x22>'+e(o['filename'])+'</div>':'')+'\x0a\x09\x09\x09\x09</div>\x0a\x09\x09\x09')['join']('');return'<!DOCTYPE\x20html>\x0a<html\x20lang=\x22en\x22>\x0a<head>\x0a\x20\x20\x20\x20<meta\x20charset=\x22UTF-8\x22>\x0a\x20\x20\x20\x20<meta\x20name=\x22viewport\x22\x20content=\x22width=device-width,\x20initial-scale=1.0\x22>\x0a\x20\x20\x20\x20<title>'+e(title)+'</title>\x0a</head>\x0a<body\x20style=\x22margin:\x200;\x20padding:\x2020px;\x20font-family:\x20-apple-system,\x20BlinkMacSystemFont,\x20\x27Segoe\x20UI\x27,\x20Roboto,\x20sans-serif;\x20background:\x20'+g+';\x20color:\x20'+h+';\x20line-height:\x201.6;\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22max-width:\x20800px;\x20margin:\x200\x20auto;\x20background:\x20'+(theme==='dark'?'#252525':'#ffffff')+';\x20border-radius:\x2012px;\x20box-shadow:\x200\x202px\x208px\x20rgba(0,0,0,0.1);\x20overflow:\x20hidden;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22padding:\x2020px\x2024px;\x20border-bottom:\x201px\x20solid\x20'+i+';\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:\x20flex;\x20justify-content:\x20space-between;\x20align-items:\x20center;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<h1\x20style=\x22margin:\x200;\x20font-size:\x2020px;\x20font-weight:\x20600;\x22>'+e(title)+'</h1>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:\x2012px;\x20color:\x20#666;\x20margin-top:\x204px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WIP\x20v'+d['version']+'\x20•\x20'+new Date(d['created'])['toLocaleString']()+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+m+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:\x2011px;\x20color:\x20#999;\x20margin-top:\x2012px;\x20padding:\x208px;\x20background:\x20'+(theme==='dark'?'#2a2a2a':'#f5f5f5')+';\x20border-radius:\x204px;\x20font-style:\x20italic;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Important\x20Note:\x20This\x20page\x20is\x20for\x20document\x20browsing\x20and\x20verification\x20reference\x20only.\x20Please\x20verify\x20the\x20document\x20integrity\x20through\x20the\x20API\x20using\x20the\x20WIP\x20file.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(l['signatures']&&l['signatures']['length']>0x0?'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22margin-top:\x2012px;\x20padding:\x208px;\x20background:\x20'+(theme==='dark'?'#2a3f2a':'#e8f5e9')+';\x20border-radius:\x204px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:\x2011px;\x20color:\x20'+(theme==='dark'?'#81c784':'#2e7d32')+';\x20margin-bottom:\x204px;\x22>✓\x20Signature\x20Verification\x20('+l['signatures']['length']+'\x20signature'+(l['signatures']['length']>0x1?'s':'')+')</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+l['signatures']['map']((o,p)=>'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:\x2010px;\x20color:\x20'+h+';\x20margin-left:\x208px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(p+0x1)+'.\x20'+(o['address']?e(o['address']['slice'](0x0,0x14))+'...':'Unknown')+':\x20'+(o['valid']?'<span\x20style=\x22color:\x20#4caf50;\x22>✓\x20Valid</span>':'<span\x20style=\x22color:\x20#f44336;\x22>✗\x20Invalid</span>')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20')['join']('')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22padding:\x2024px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:\x2016px;\x20line-height:\x201.8;\x20margin-bottom:\x2024px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+f(c['content']['text'],c['content']['format'])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+n+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22padding:\x2016px\x2024px;\x20background:\x20'+(theme==='dark'?'#2a2a2a':'#f8f9fa')+';\x20border-top:\x201px\x20solid\x20'+i+';\x20font-size:\x2011px;\x20color:\x20#666;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:\x20flex;\x20justify-content:\x20space-between;\x20align-items:\x20center;\x20flex-wrap:\x20wrap;\x20gap:\x208px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<strong>Hash:</strong>\x20<code\x20style=\x22background:\x20'+(theme==='dark'?'#333':'#e9ecef')+';\x20padding:\x202px\x206px;\x20border-radius:\x203px;\x22>'+e(d['hash'])+'</code>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(l['valid']?'Content\x20integrity\x20verified':'Verification\x20failed:\x20'+e(l['error']||'Unknown\x20error'))+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a</body>\x0a</html>';}['stringify'](a,b=!![]){return b?JSON['stringify'](a,null,0x2):JSON['stringify'](a);}['parse'](a){try{const b=JSON['parse'](a);if(!b['wip']||!b['payload']||!b['meta'])throw new WipValidationError('Invalid\x20WIP\x20file\x20structure');return b;}catch(c){if(c instanceof WipError)throw c;throw new WipValidationError('Failed\x20to\x20parse\x20WIP\x20file:\x20'+c);}}async['load'](a){const b=await this['resourceLoader']['load'](a),c=new TextDecoder()['decode'](b);return this['parse'](c);}['getHash'](a){const b=a['meta']['hash'];if(b['includes'](':'))return b['split'](':')[0x1];return b;}['extractImages'](a,b){!a179a['existsSync'](b)&&a179a['mkdirSync'](b,{'recursive':!![]});const c=[];for(const d of a['payload']['media']){const e=getExtensionFromMimeType(d['type']),f=d['filename']||d['id']+'.'+e,g=a179b['join'](b,f),h=Buffer['from'](base64ToUint8Array(d['data']));a179a['writeFileSync'](g,h),c['push'](g);}return c;}['save'](a,b,c=!![]){const d=a179b['dirname'](b);!a179a['existsSync'](d)&&a179a['mkdirSync'](d,{'recursive':!![]}),a179a['writeFileSync'](b,this['stringify'](a,c),'utf-8');}['getLimits'](){return{...this['limits']};}['setLimits'](a){this['limits']={...this['limits'],...a},this['resourceLoader']=new ResourceLoader(this['limits']['maxImageSize']);}}export async function createWip(a,b){const c=new WIP(b);return c['create'](a);}export async function verifyWip(a,b){if(b!==undefined){const e=a['meta']['hash']['toLowerCase']()['replace'](/^sha256:/,''),f=b['toLowerCase']()['replace'](/^sha256:/,'');if(e!==f)return{'valid':![],'error':'Hash\x20mismatch'};}const c=new WIP(),d=await c['verify'](a);return{'valid':d['valid'],'error':d['error']};}export async function wipToHtml(a,b){const c=new WIP();return c['toHtml'](a,b);}export async function loadWip(a,b){const c=new WIP(b);return c['load'](a);}export async function generate_wip(a,b){const c=new WIP(DEFAULT_LIMITS);let d=await c['create']({'text':a['markdown_text'],'textFormat':'markdown','images':a['images']});if(a['account']){const {Account:e}=await import('./account.js'),f=await e['Instance']()['get_address'](a['account']);if(!f)throw new WipValidationError('Account\x20not\x20found:\x20'+a['account']);const {signature:g,...h}=d['meta'],i=computeHash(canonicalizeJson(h)),j=await e['Instance']()['sign'](f,i),k=await e['Instance']()['get'](f);if(!k||!k['pubkey'])throw new WipValidationError('Cannot\x20get\x20public\x20key\x20for\x20account:\x20'+f);let l;if(k['pubkey']['startsWith']('0x')){const p=Buffer['from'](k['pubkey']['slice'](0x2),'hex');if(p['length']===0x382)l=p['slice'](0x1)['toString']('base64');else{if(p['length']===0x381)l=p['toString']('base64');else throw new WipValidationError('Invalid\x20public\x20key\x20length:\x20'+p['length']+',\x20expected\x20897\x20or\x20898\x20bytes');}}else l=k['pubkey'];const m=Buffer['from'](j['slice'](0x2),'hex')['toString']('base64'),n={'value':m,'publicKey':l,'algorithm':'Falcon512','address':f};let o;d['meta']['signature']?o=Array['isArray'](d['meta']['signature'])?[...d['meta']['signature'],n]:[d['meta']['signature'],n]:o=[n],d={...d,'meta':{...d['meta'],'signature':o}};}return c['save'](d,b,!![]),b;}export async function verify_wip(a,b,c){const d=new WIP();let e;try{e=await d['load'](a);}catch(k){return{'valid':![],'error':'Failed\x20to\x20load\x20WIP\x20file:\x20'+k,'hashValid':![],'hasSignature':![]};}if(!e['wip']||!e['payload']||!e['meta'])return{'valid':![],'error':'Invalid\x20WIP\x20file\x20structure','hashValid':![],'hasSignature':![]};if(e['meta']['type']!=='wip')return{'valid':![],'error':'Invalid\x20meta.type:\x20'+e['meta']['type'],'hashValid':![],'hasSignature':!!e['meta']['signature']};if(b!==undefined){const l=e['meta']['hash']['toLowerCase']()['replace'](/^sha256:/,''),m=b['toLowerCase']()['replace'](/^sha256:/,'');if(l!==m)return{'valid':![],'error':'Hash\x20mismatch','hashValid':![],'hasSignature':!!e['meta']['signature']};}if(c&&!e['meta']['signature'])return{'valid':![],'error':'Signature\x20required\x20but\x20WIP\x20file\x20has\x20no\x20signature','hashValid':!![],'hasSignature':![]};const f={'wip':e['wip'],'payload':e['payload']},g=computeHash(canonicalizeJson(f)),h=g===e['meta']['hash'];if(!h)return{'valid':![],'error':'Hash\x20mismatch\x20-\x20content\x20has\x20been\x20tampered','hashValid':![],'hasSignature':!!e['meta']['signature']};let i;const j=[];if(e['meta']['signature']){const {signature:n,...o}=e['meta'],p=computeHash(canonicalizeJson(o)),q=Array['isArray'](e['meta']['signature'])?e['meta']['signature']:[e['meta']['signature']];let r=!![];for(const s of q){const t=await d['verifySignature'](p,s['value'],s['publicKey'],s['algorithm']);let u;try{const {Falcon512PublicKey:v}=await import('../../keypairs/falcon512/publickey.js'),w=new v(s['publicKey']);u=w['toWAddress']();}catch{}j['push']({'publicKey':s['publicKey'],'address':u,'valid':t}),!t&&(r=![]);}i=r;if(!i){const x=j['filter'](y=>!y['valid']&&y['address'])['map'](y=>y['address']);return{'valid':![],'error':'Signatures\x20from\x20the\x20following\x20addresses\x20are\x20invalid:\x20'+x['join'](',\x20'),'hashValid':!![],'signatureValid':![],'hasSignature':!![],'signatures':j};}}return{'valid':!![],'hashValid':!![],'signatureValid':i,'hasSignature':!!e['meta']['signature'],'signatures':j['length']>0x0?j:undefined};}export async function sign_wip(a,b,c){const d=new WIP(),e=await d['load'](a);if(!e['wip']||!e['payload']||!e['meta'])throw new WipValidationError('Invalid\x20WIP\x20file\x20structure');if(e['meta']['type']!=='wip')throw new WipValidationError('Invalid\x20meta.type:\x20'+e['meta']['type']);const {Account:f}=await import('./account.js'),g=await f['Instance']()['get_address'](b);if(!g)throw new WipValidationError('Account\x20not\x20found:\x20'+b);const {signature:h,...i}=e['meta'],j=computeHash(canonicalizeJson(i)),k=await f['Instance']()['signData'](g,j);let l;const m=k['publicKey'];if(m['startsWith']('0x')){const r=Buffer['from'](m['slice'](0x2),'hex');if(r['length']===0x382)l=r['slice'](0x1)['toString']('base64');else{if(r['length']===0x381)l=r['toString']('base64');else throw new WipValidationError('Invalid\x20public\x20key\x20length:\x20'+r['length']+',\x20expected\x20897\x20or\x20898\x20bytes');}}else l=m;const n={'value':Buffer['from'](k['signature']['slice'](0x2),'hex')['toString']('base64'),'publicKey':l,'algorithm':'Falcon512','address':k['address']};let o;if(e['meta']['signature']){const s=Array['isArray'](e['meta']['signature'])?[...e['meta']['signature']]:[e['meta']['signature']],t=s['findIndex'](u=>u['publicKey']===l);t>=0x0?(s[t]=n,o=s):o=[...s,n];}else o=[n];const p={...e,'meta':{...e['meta'],'signature':o}};let q;if(c)q=c;else{const u=a179b['dirname'](a),v=a179b['extname'](a),w=a179b['basename'](a,v);q=a179b['join'](u,'signed_'+w+v);}return d['save'](p,q,!![]),q;}export async function wip2html(a,b={}){const c=await import('fs'),d=await import('path'),e=c['statSync'](a);if(e['isFile']()){const f=new WIP(),g=await f['load'](a),h=await f['toHtml'](g,b);if(b['outputPath'])return c['writeFileSync'](b['outputPath'],h),b['outputPath'];const i=d['dirname'](a),j=d['extname'](a),k=d['basename'](a,j),l=d['join'](i,k+'.html');return c['writeFileSync'](l,h),l;}else{if(e['isDirectory']()){const m=c['readdirSync'](a),n=m['filter'](q=>q['endsWith']('.wip'));if(n['length']===0x0)throw new WipValidationError('No\x20.wip\x20files\x20found\x20in\x20directory:\x20'+a);const o=[],p=new WIP();for(const q of n){const r=d['join'](a,q),s=await p['load'](r),t=await p['toHtml'](s,b),u=q['replace']('.wip','.html'),v=b['outputPath']?d['join'](b['outputPath'],u):d['join'](a,u),w=d['dirname'](v);!c['existsSync'](w)&&c['mkdirSync'](w,{'recursive':!![]}),c['writeFileSync'](v,t),o['push'](v);}return o;}else throw new WipValidationError('Invalid\x20path:\x20'+a);}}export default WIP;
|
|
@@ -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 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
|
+
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 a182a from'fs';import*as a182b 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']();!a182a['existsSync'](b)&&a182a['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=a182b['join'](b,m['filename']);a182a['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=a182a['readFileSync'](a,'utf-8');return JSON['parse'](b);}function save_wts(a,b){const c=a182b['dirname'](b);!a182a['existsSync'](c)&&a182a['mkdirSync'](c,{'recursive':!![]}),a182a['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=a182b['dirname'](a),w=a182b['extname'](a),x=a182b['basename'](a,w);r=a182b['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);}}
|