@aeternity/aepp-sdk 13.3.2 → 13.3.3

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/es/AeSdkAepp.mjs CHANGED
@@ -113,7 +113,7 @@ export default class AeSdkAepp extends AeSdkBase {
113
113
  * @returns Addresses from wallet
114
114
  */
115
115
  async askAddresses() {
116
- this._ensureAccountAccess();
116
+ this._ensureConnected();
117
117
  return this.rpcClient.request(METHODS.address, undefined);
118
118
  }
119
119
 
@@ -1 +1 @@
1
- {"version":3,"file":"AeSdkAepp.mjs","names":["AeSdkBase","AccountRpc","decode","RPC_VERSION","RpcClient","METHODS","AlreadyConnectedError","NoWalletConnectedError","UnsubscribedAccountError","UnAuthorizedAccountError","RpcConnectionError","Node","AeSdkAepp","constructor","name","onAddressChange","onDisconnect","onNetworkChange","other","_resolveAccount","account","addresses","address","includes","_ensureConnected","rpcClient","_ensureAccountAccess","_accounts","current","Object","keys","connected","connectToWallet","connection","connectNode","disconnectParams","updateNetwork","params","_params$node","node","url","pool","delete","addNode","client","updateAddress","closeConnection","disconnect","readyToConnect","walletInfo","request","connect","version","disconnectWallet","notify","reason","askAddresses","undefined","subscribeAddress","type","value","result","length"],"sources":["../src/AeSdkAepp.ts"],"sourcesContent":["import AeSdkBase from './AeSdkBase';\nimport { OnAccount } from './AeSdkMethods';\nimport AccountBase from './account/Base';\nimport AccountRpc from './account/Rpc';\nimport { decode, Encoded } from './utils/encoder';\nimport {\n Accounts, RPC_VERSION, WalletInfo, Network, WalletApi, AeppApi, Node as NodeRpc,\n} from './aepp-wallet-communication/rpc/types';\nimport RpcClient from './aepp-wallet-communication/rpc/RpcClient';\nimport { METHODS, SUBSCRIPTION_TYPES } from './aepp-wallet-communication/schema';\nimport {\n AlreadyConnectedError,\n NoWalletConnectedError,\n UnsubscribedAccountError,\n UnAuthorizedAccountError,\n RpcConnectionError,\n} from './utils/errors';\nimport Node from './Node';\nimport BrowserConnection from './aepp-wallet-communication/connection/Browser';\n\n/**\n * RPC handler for AEPP side\n * Contain functionality for wallet interaction and connect it to sdk\n * @category aepp wallet communication\n */\nexport default class AeSdkAepp extends AeSdkBase {\n name: string;\n\n onAddressChange: (a: Accounts) => void;\n\n onDisconnect: (p: any) => void;\n\n onNetworkChange: (a: Network) => void;\n\n rpcClient?: RpcClient<WalletApi, AeppApi>;\n\n _accounts?: Accounts;\n\n /**\n * @param options - Options\n * @param options.name - Aepp name\n * @param options.onAddressChange - Call-back function for update address event\n * @param options.onDisconnect - Call-back function for disconnect event\n * @param options.onNetworkChange - Call-back function for update network event\n */\n constructor({\n name,\n onAddressChange = () => {},\n onDisconnect = () => {},\n onNetworkChange = () => {},\n ...other\n }: {\n name: string;\n onAddressChange?: (a: Accounts) => void;\n onDisconnect?: (p: any) => void;\n onNetworkChange?: (a: Network) => void;\n } & ConstructorParameters<typeof AeSdkBase>[0]) {\n super(other);\n this.onAddressChange = onAddressChange;\n this.onDisconnect = onDisconnect;\n this.onNetworkChange = onNetworkChange;\n this.name = name;\n }\n\n override _resolveAccount(account: OnAccount = this.addresses()[0]): AccountBase {\n if (typeof account === 'string') {\n const address = account as Encoded.AccountAddress;\n decode(address);\n if (!this.addresses().includes(address)) throw new UnAuthorizedAccountError(address);\n this._ensureConnected();\n account = new AccountRpc(this.rpcClient, address);\n }\n if (account == null) this._ensureAccountAccess();\n return super._resolveAccount(account);\n }\n\n override addresses(): Encoded.AccountAddress[] {\n if (this._accounts == null) return [];\n const current = Object.keys(this._accounts.current)[0];\n return [\n ...current != null ? [current] : [], ...Object.keys(this._accounts.connected),\n ] as Encoded.AccountAddress[];\n }\n\n /**\n * Connect to wallet\n * @param connection - Wallet connection object\n * @param options - Options\n * @param options.connectNode - Request wallet to bind node\n * @param options.name - Node name\n */\n async connectToWallet(\n connection: BrowserConnection,\n { connectNode = false, name = 'wallet-node' }: { connectNode?: boolean; name?: string } = {},\n ): Promise<WalletInfo & { node?: NodeRpc }> {\n if (this.rpcClient != null) throw new AlreadyConnectedError('You are already connected to wallet');\n let disconnectParams: any;\n\n const updateNetwork = (params: Network): void => {\n if (connectNode) {\n if (params.node?.url == null) throw new RpcConnectionError('Missing URLs of the Node');\n this.pool.delete(name);\n this.addNode(name, new Node(params.node.url), true);\n }\n this.onNetworkChange(params);\n };\n\n const client = new RpcClient<WalletApi, AeppApi>(\n connection,\n () => {\n delete this.rpcClient;\n delete this._accounts;\n this.onDisconnect(disconnectParams);\n },\n {\n [METHODS.updateAddress]: (params) => {\n this._accounts = params;\n this.onAddressChange(params);\n },\n [METHODS.updateNetwork]: updateNetwork,\n [METHODS.closeConnection]: (params) => {\n disconnectParams = params;\n client.connection.disconnect();\n },\n [METHODS.readyToConnect]: () => {},\n },\n );\n const walletInfo = await client\n .request(METHODS.connect, { name: this.name, version: RPC_VERSION, connectNode });\n updateNetwork(walletInfo);\n this.rpcClient = client;\n return walletInfo;\n }\n\n /**\n * Disconnect from wallet\n */\n disconnectWallet(): void {\n this._ensureConnected();\n this.rpcClient.notify(METHODS.closeConnection, { reason: 'bye' });\n this.rpcClient.connection.disconnect();\n }\n\n /**\n * Ask addresses from wallet\n * @returns Addresses from wallet\n */\n async askAddresses(): Promise<Encoded.AccountAddress[]> {\n this._ensureAccountAccess();\n return this.rpcClient.request(METHODS.address, undefined);\n }\n\n /**\n * Subscribe for addresses from wallet\n * @param type - Subscription type\n * @param value - Should be one of 'current' (the selected account), 'connected' (all)\n * @returns Accounts from wallet\n */\n async subscribeAddress(\n type: SUBSCRIPTION_TYPES,\n value: 'current' | 'connected',\n ): Promise<ReturnType<WalletApi[METHODS.subscribeAddress]>> {\n this._ensureConnected();\n const result = await this.rpcClient.request(METHODS.subscribeAddress, { type, value });\n this._accounts = result.address;\n return result;\n }\n\n _ensureConnected(): asserts this is AeSdkAepp & { rpcClient: NonNullable<AeSdkAepp['rpcClient']> } {\n if (this.rpcClient != null) return;\n throw new NoWalletConnectedError('You are not connected to Wallet');\n }\n\n _ensureAccountAccess(): asserts this is AeSdkAepp & { rpcClient: NonNullable<AeSdkAepp['rpcClient']> } {\n this._ensureConnected();\n if (this.addresses().length !== 0) return;\n throw new UnsubscribedAccountError();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AeSdkAepp.mjs","names":["AeSdkBase","AccountRpc","decode","RPC_VERSION","RpcClient","METHODS","AlreadyConnectedError","NoWalletConnectedError","UnsubscribedAccountError","UnAuthorizedAccountError","RpcConnectionError","Node","AeSdkAepp","constructor","name","onAddressChange","onDisconnect","onNetworkChange","other","_resolveAccount","account","addresses","address","includes","_ensureConnected","rpcClient","_ensureAccountAccess","_accounts","current","Object","keys","connected","connectToWallet","connection","connectNode","disconnectParams","updateNetwork","params","_params$node","node","url","pool","delete","addNode","client","updateAddress","closeConnection","disconnect","readyToConnect","walletInfo","request","connect","version","disconnectWallet","notify","reason","askAddresses","undefined","subscribeAddress","type","value","result","length"],"sources":["../src/AeSdkAepp.ts"],"sourcesContent":["import AeSdkBase from './AeSdkBase';\nimport { OnAccount } from './AeSdkMethods';\nimport AccountBase from './account/Base';\nimport AccountRpc from './account/Rpc';\nimport { decode, Encoded } from './utils/encoder';\nimport {\n Accounts, RPC_VERSION, WalletInfo, Network, WalletApi, AeppApi, Node as NodeRpc,\n} from './aepp-wallet-communication/rpc/types';\nimport RpcClient from './aepp-wallet-communication/rpc/RpcClient';\nimport { METHODS, SUBSCRIPTION_TYPES } from './aepp-wallet-communication/schema';\nimport {\n AlreadyConnectedError,\n NoWalletConnectedError,\n UnsubscribedAccountError,\n UnAuthorizedAccountError,\n RpcConnectionError,\n} from './utils/errors';\nimport Node from './Node';\nimport BrowserConnection from './aepp-wallet-communication/connection/Browser';\n\n/**\n * RPC handler for AEPP side\n * Contain functionality for wallet interaction and connect it to sdk\n * @category aepp wallet communication\n */\nexport default class AeSdkAepp extends AeSdkBase {\n name: string;\n\n onAddressChange: (a: Accounts) => void;\n\n onDisconnect: (p: any) => void;\n\n onNetworkChange: (a: Network) => void;\n\n rpcClient?: RpcClient<WalletApi, AeppApi>;\n\n _accounts?: Accounts;\n\n /**\n * @param options - Options\n * @param options.name - Aepp name\n * @param options.onAddressChange - Call-back function for update address event\n * @param options.onDisconnect - Call-back function for disconnect event\n * @param options.onNetworkChange - Call-back function for update network event\n */\n constructor({\n name,\n onAddressChange = () => {},\n onDisconnect = () => {},\n onNetworkChange = () => {},\n ...other\n }: {\n name: string;\n onAddressChange?: (a: Accounts) => void;\n onDisconnect?: (p: any) => void;\n onNetworkChange?: (a: Network) => void;\n } & ConstructorParameters<typeof AeSdkBase>[0]) {\n super(other);\n this.onAddressChange = onAddressChange;\n this.onDisconnect = onDisconnect;\n this.onNetworkChange = onNetworkChange;\n this.name = name;\n }\n\n override _resolveAccount(account: OnAccount = this.addresses()[0]): AccountBase {\n if (typeof account === 'string') {\n const address = account as Encoded.AccountAddress;\n decode(address);\n if (!this.addresses().includes(address)) throw new UnAuthorizedAccountError(address);\n this._ensureConnected();\n account = new AccountRpc(this.rpcClient, address);\n }\n if (account == null) this._ensureAccountAccess();\n return super._resolveAccount(account);\n }\n\n override addresses(): Encoded.AccountAddress[] {\n if (this._accounts == null) return [];\n const current = Object.keys(this._accounts.current)[0];\n return [\n ...current != null ? [current] : [], ...Object.keys(this._accounts.connected),\n ] as Encoded.AccountAddress[];\n }\n\n /**\n * Connect to wallet\n * @param connection - Wallet connection object\n * @param options - Options\n * @param options.connectNode - Request wallet to bind node\n * @param options.name - Node name\n */\n async connectToWallet(\n connection: BrowserConnection,\n { connectNode = false, name = 'wallet-node' }: { connectNode?: boolean; name?: string } = {},\n ): Promise<WalletInfo & { node?: NodeRpc }> {\n if (this.rpcClient != null) throw new AlreadyConnectedError('You are already connected to wallet');\n let disconnectParams: any;\n\n const updateNetwork = (params: Network): void => {\n if (connectNode) {\n if (params.node?.url == null) throw new RpcConnectionError('Missing URLs of the Node');\n this.pool.delete(name);\n this.addNode(name, new Node(params.node.url), true);\n }\n this.onNetworkChange(params);\n };\n\n const client = new RpcClient<WalletApi, AeppApi>(\n connection,\n () => {\n delete this.rpcClient;\n delete this._accounts;\n this.onDisconnect(disconnectParams);\n },\n {\n [METHODS.updateAddress]: (params) => {\n this._accounts = params;\n this.onAddressChange(params);\n },\n [METHODS.updateNetwork]: updateNetwork,\n [METHODS.closeConnection]: (params) => {\n disconnectParams = params;\n client.connection.disconnect();\n },\n [METHODS.readyToConnect]: () => {},\n },\n );\n const walletInfo = await client\n .request(METHODS.connect, { name: this.name, version: RPC_VERSION, connectNode });\n updateNetwork(walletInfo);\n this.rpcClient = client;\n return walletInfo;\n }\n\n /**\n * Disconnect from wallet\n */\n disconnectWallet(): void {\n this._ensureConnected();\n this.rpcClient.notify(METHODS.closeConnection, { reason: 'bye' });\n this.rpcClient.connection.disconnect();\n }\n\n /**\n * Ask addresses from wallet\n * @returns Addresses from wallet\n */\n async askAddresses(): Promise<Encoded.AccountAddress[]> {\n this._ensureConnected();\n return this.rpcClient.request(METHODS.address, undefined);\n }\n\n /**\n * Subscribe for addresses from wallet\n * @param type - Subscription type\n * @param value - Should be one of 'current' (the selected account), 'connected' (all)\n * @returns Accounts from wallet\n */\n async subscribeAddress(\n type: SUBSCRIPTION_TYPES,\n value: 'current' | 'connected',\n ): Promise<ReturnType<WalletApi[METHODS.subscribeAddress]>> {\n this._ensureConnected();\n const result = await this.rpcClient.request(METHODS.subscribeAddress, { type, value });\n this._accounts = result.address;\n return result;\n }\n\n _ensureConnected(): asserts this is AeSdkAepp & { rpcClient: NonNullable<AeSdkAepp['rpcClient']> } {\n if (this.rpcClient != null) return;\n throw new NoWalletConnectedError('You are not connected to Wallet');\n }\n\n _ensureAccountAccess(): asserts this is AeSdkAepp & { rpcClient: NonNullable<AeSdkAepp['rpcClient']> } {\n this._ensureConnected();\n if (this.addresses().length !== 0) return;\n throw new UnsubscribedAccountError();\n }\n}\n"],"mappings":"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"}
@@ -337,11 +337,14 @@ export default class AeSdkWallet extends AeSdk {
337
337
  * @returns Object with wallet information
338
338
  */
339
339
  async getWalletInfo() {
340
+ const {
341
+ origin
342
+ } = window.location;
340
343
  return {
341
344
  id: this.id,
342
345
  name: this.name,
343
346
  networkId: await this.api.getNetworkId(),
344
- origin: window.location.origin,
347
+ origin: origin === 'file://' ? '*' : origin,
345
348
  type: this._type
346
349
  };
347
350
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AeSdkWallet.mjs","names":["v4","uuid","AeSdk","verifyTransaction","RpcClient","METHODS","RPC_STATUS","SUBSCRIPTION_TYPES","RpcInvalidTransactionError","RpcNotAuthorizeError","RpcPermissionDenyError","RpcUnsupportedProtocolError","InternalError","UnknownRpcClientError","RPC_VERSION","Encoding","encode","decode","jsonBig","AeSdkWallet","constructor","name","id","type","onConnection","onSubscription","onDisconnect","onAskAccounts","options","_defineProperty","Map","_type","_getAccountsForClient","addressSubscription","current","connected","getAccounts","has","_pushAccountsToApps","_clients","Array","from","keys","filter","clientId","_isRpcClientConnected","map","_getClient","client","size","forEach","rpc","notify","updateAddress","selectAccount","address","addAccount","account","_getNode","ensureNodeConnected","node","url","api","$host","selectedNodeName","selectNode","networkId","getNetworkId","updateNetwork","connectNode","get","CONNECTED","status","connection","isConnected","_disconnectRpcClient","disconnect","DISCONNECTED","Set","removeRpcClient","delete","addRpcClient","clientConnection","disconnectParams","WAITING_FOR_CONNECTION_REQUEST","closeConnection","params","connect","version","icons","origin","getWalletInfo","subscribeAddress","value","subscribe","add","unsubscribe","subscription","addresses","sign","tx","onAccount","returnSigned","innerTx","includes","parameters","aeppOrigin","aeppRpcClientId","signedTransaction","signTransaction","parse","stringify","transactionHash","sendTransaction","verify","error","validation","length","signMessage","message","signature","_Buffer","toString","signTypedData","domain","aci","data","signDelegationToContract","contractAddress","oracleQueryId","allNames","isOracle","_isOracle","_ref","_ref2","_ref3","signNameDelegationToContract","signOracleQueryDelegationToContract","signAllNamesDelegationToContract","unsafeSign","Signature","signDelegation","delegation","set","shareWalletInfo","readyToConnect","window","location","selectedAddress","a","reduce","acc"],"sources":["../src/AeSdkWallet.ts"],"sourcesContent":["import { v4 as uuid } from '@aeternity/uuid';\nimport AeSdk from './AeSdk';\nimport verifyTransaction from './tx/validator';\nimport RpcClient from './aepp-wallet-communication/rpc/RpcClient';\nimport {\n METHODS, RPC_STATUS, SUBSCRIPTION_TYPES, WALLET_TYPE,\n RpcInvalidTransactionError,\n RpcNotAuthorizeError, RpcPermissionDenyError, RpcUnsupportedProtocolError,\n} from './aepp-wallet-communication/schema';\nimport { InternalError, UnknownRpcClientError } from './utils/errors';\nimport AccountBase from './account/Base';\nimport BrowserConnection from './aepp-wallet-communication/connection/Browser';\nimport {\n Accounts,\n AeppApi,\n Network,\n RPC_VERSION,\n WalletApi,\n WalletInfo,\n} from './aepp-wallet-communication/rpc/types';\nimport {\n Encoded, Encoding, encode, decode,\n} from './utils/encoder';\nimport jsonBig from './utils/json-big';\n\ntype RpcClientWallet = RpcClient<AeppApi, WalletApi>;\n\ntype OnConnection = (\n clientId: string, params: Omit<Parameters<WalletApi[METHODS.connect]>[0], 'version'>, origin: string\n) => void;\n\ntype OnSubscription = (\n clientId: string, params: Parameters<WalletApi[METHODS.subscribeAddress]>[0], origin: string\n) => void;\n\ntype OnDisconnect = (\n clientId: string, params: Parameters<WalletApi[METHODS.closeConnection]>[0]\n) => void;\n\ntype OnAskAccounts = (\n clientId: string, params: undefined, origin: string\n) => void;\n\ninterface RpcClientsInfo {\n id: string;\n status: RPC_STATUS;\n connectNode: boolean;\n addressSubscription: Set<'connected' | 'current'>;\n rpc: RpcClientWallet;\n}\n\n/**\n * Contain functionality for aepp interaction and managing multiple aepps\n * @category aepp wallet communication\n */\nexport default class AeSdkWallet extends AeSdk {\n id: string;\n\n _type: WALLET_TYPE;\n\n name: string;\n\n _clients = new Map<string, RpcClientsInfo>();\n\n onConnection: OnConnection;\n\n onSubscription: OnSubscription;\n\n onDisconnect: OnDisconnect;\n\n onAskAccounts: OnAskAccounts;\n\n /**\n * @param options - Options\n * @param options.name - Wallet name\n * @param options.id - Wallet id\n * @param options.type - Wallet type\n * @param options.onConnection - Call-back function for incoming AEPP connection\n * @param options.onSubscription - Call-back function for incoming AEPP account subscription\n * @param options.onAskAccounts - Call-back function for incoming AEPP get address request\n * @param options.onDisconnect - Call-back function for disconnect event\n */\n constructor({\n name,\n id,\n type,\n onConnection,\n onSubscription,\n onDisconnect,\n onAskAccounts,\n ...options\n }: {\n id: string;\n type: WALLET_TYPE;\n name: string;\n onConnection: OnConnection;\n onSubscription: OnSubscription;\n onDisconnect: OnDisconnect;\n onAskAccounts: OnAskAccounts;\n } & ConstructorParameters<typeof AeSdk>[0]) {\n super(options);\n this.onConnection = onConnection;\n this.onSubscription = onSubscription;\n this.onDisconnect = onDisconnect;\n this.onAskAccounts = onAskAccounts;\n this.name = name;\n this.id = id;\n this._type = type;\n }\n\n _getAccountsForClient({ addressSubscription }: RpcClientsInfo): Accounts {\n const { current, connected } = this.getAccounts();\n return {\n current: addressSubscription.has('current') || addressSubscription.has('connected')\n ? current : {},\n connected: addressSubscription.has('connected') ? connected : {},\n };\n }\n\n _pushAccountsToApps(): void {\n if (this._clients == null) return;\n Array.from(this._clients.keys())\n .filter((clientId) => this._isRpcClientConnected(clientId))\n .map((clientId) => this._getClient(clientId))\n .filter((client) => client.addressSubscription.size !== 0)\n .forEach((client) => client.rpc\n .notify(METHODS.updateAddress, this._getAccountsForClient(client)));\n }\n\n override selectAccount(address: Encoded.AccountAddress): void {\n super.selectAccount(address);\n this._pushAccountsToApps();\n }\n\n override addAccount(account: AccountBase, options?: Parameters<AeSdk['addAccount']>[1]): void {\n super.addAccount(account, options);\n this._pushAccountsToApps();\n }\n\n _getNode(): { node: Network['node'] } {\n this.ensureNodeConnected();\n return { node: { url: this.api.$host, name: this.selectedNodeName } };\n }\n\n override async selectNode(name: string): Promise<void> {\n super.selectNode(name);\n const networkId = await this.api.getNetworkId();\n Array.from(this._clients.keys())\n .filter((clientId) => this._isRpcClientConnected(clientId))\n .map((clientId) => this._getClient(clientId))\n .forEach((client) => {\n client.rpc.notify(METHODS.updateNetwork, {\n networkId,\n ...client.connectNode && this._getNode(),\n });\n });\n }\n\n _getClient(clientId: string): RpcClientsInfo {\n const client = this._clients.get(clientId);\n if (client == null) throw new UnknownRpcClientError(clientId);\n return client;\n }\n\n _isRpcClientConnected(clientId: string): boolean {\n return RPC_STATUS.CONNECTED === this._getClient(clientId).status\n && this._getClient(clientId).rpc.connection.isConnected();\n }\n\n _disconnectRpcClient(clientId: string): void {\n const client = this._getClient(clientId);\n client.rpc.connection.disconnect();\n client.status = RPC_STATUS.DISCONNECTED;\n client.addressSubscription = new Set();\n }\n\n /**\n * Remove specific RpcClient by ID\n * @param id - Client ID\n */\n removeRpcClient(id: string): void {\n this._disconnectRpcClient(id);\n this._clients.delete(id);\n }\n\n /**\n * Add new client by AEPP connection\n * @param clientConnection - AEPP connection object\n * @returns Client ID\n */\n addRpcClient(clientConnection: BrowserConnection): string {\n // @TODO detect if aepp has some history based on origin????\n // if yes use this instance for connection\n const id = uuid();\n let disconnectParams: any;\n const client: RpcClientsInfo = {\n id,\n status: RPC_STATUS.WAITING_FOR_CONNECTION_REQUEST,\n addressSubscription: new Set(),\n connectNode: false,\n rpc: new RpcClient<AeppApi, WalletApi>(\n clientConnection,\n () => {\n this._clients.delete(id);\n this.onDisconnect(id, disconnectParams); // also related info\n },\n {\n [METHODS.closeConnection]: (params) => {\n disconnectParams = params;\n this._disconnectRpcClient(id);\n },\n // Store client info and prepare two fn for each client `connect` and `denyConnection`\n // which automatically prepare and send response for that client\n [METHODS.connect]: async ({\n name, version, icons, connectNode,\n }, origin) => {\n if (version !== RPC_VERSION) throw new RpcUnsupportedProtocolError();\n\n await this.onConnection(id, { name, icons, connectNode }, origin);\n client.status = RPC_STATUS.CONNECTED;\n client.connectNode = connectNode;\n return {\n ...await this.getWalletInfo(),\n ...connectNode && this._getNode(),\n };\n },\n [METHODS.subscribeAddress]: async ({ type, value }, origin) => {\n if (!this._isRpcClientConnected(id)) throw new RpcNotAuthorizeError();\n\n switch (type) {\n case SUBSCRIPTION_TYPES.subscribe:\n // TODO: remove `type` as it always subscribe\n await this.onSubscription(id, { type, value }, origin);\n client.addressSubscription.add(value);\n break;\n case SUBSCRIPTION_TYPES.unsubscribe:\n client.addressSubscription.delete(value);\n break;\n default:\n throw new InternalError(`Unknown subscription type: ${type}`);\n }\n\n return {\n subscription: Array.from(client.addressSubscription),\n address: this._getAccountsForClient(client),\n };\n },\n [METHODS.address]: async (params, origin) => {\n if (!this._isRpcClientConnected(id)) throw new RpcNotAuthorizeError();\n await this.onAskAccounts(id, params, origin);\n return this.addresses();\n },\n [METHODS.sign]: async (\n {\n tx, onAccount = this.address, returnSigned, innerTx,\n },\n origin,\n ) => {\n if (!this._isRpcClientConnected(id)) throw new RpcNotAuthorizeError();\n if (!this.addresses().includes(onAccount)) {\n throw new RpcPermissionDenyError(onAccount);\n }\n\n const parameters = {\n onAccount, aeppOrigin: origin, aeppRpcClientId: id, innerTx,\n };\n if (returnSigned || innerTx === true) {\n return { signedTransaction: await this.signTransaction(tx, parameters) };\n }\n try {\n return jsonBig.parse(jsonBig.stringify({\n transactionHash: await this.sendTransaction(tx, { ...parameters, verify: false }),\n }));\n } catch (error) {\n const validation = await verifyTransaction(tx, this.api);\n if (validation.length > 0) throw new RpcInvalidTransactionError(validation);\n throw error;\n }\n },\n [METHODS.signMessage]: async ({ message, onAccount = this.address }, origin) => {\n if (!this._isRpcClientConnected(id)) throw new RpcNotAuthorizeError();\n if (!this.addresses().includes(onAccount)) {\n throw new RpcPermissionDenyError(onAccount);\n }\n\n const parameters = { onAccount, aeppOrigin: origin, aeppRpcClientId: id };\n return {\n signature: Buffer.from(await this.signMessage(message, parameters)).toString('hex'),\n };\n },\n [METHODS.signTypedData]: async ({\n domain, aci, data, onAccount = this.address,\n }, origin) => {\n if (!this._isRpcClientConnected(id)) throw new RpcNotAuthorizeError();\n if (!this.addresses().includes(onAccount)) {\n throw new RpcPermissionDenyError(onAccount);\n }\n\n const parameters = {\n ...domain, onAccount, aeppOrigin: origin, aeppRpcClientId: id,\n };\n return {\n signature: await this.signTypedData(data, aci, parameters),\n };\n },\n [METHODS.signDelegationToContract]: async ({\n contractAddress, name, oracleQueryId, allNames, onAccount = this.address, isOracle,\n }, origin) => {\n if (!this._isRpcClientConnected(id)) throw new RpcNotAuthorizeError();\n if (!this.addresses().includes(onAccount)) {\n throw new RpcPermissionDenyError(onAccount);\n }\n\n isOracle ??= false;\n const parameters = { onAccount, aeppOrigin: origin, aeppRpcClientId: id };\n const signature = await (\n (name == null ? null : this\n .signNameDelegationToContract(contractAddress, name, parameters))\n ?? (oracleQueryId == null ? null : this\n .signOracleQueryDelegationToContract(contractAddress, oracleQueryId, parameters))\n ?? (allNames !== true ? null : this\n .signAllNamesDelegationToContract(contractAddress, parameters))\n ?? this.signDelegationToContract(contractAddress, { ...parameters, isOracle })\n );\n return { signature };\n },\n [METHODS.unsafeSign]: async ({ data, onAccount = this.address }, origin) => {\n if (!this._isRpcClientConnected(id)) throw new RpcNotAuthorizeError();\n if (!this.addresses().includes(onAccount)) throw new RpcPermissionDenyError(onAccount);\n const parameters = { onAccount, aeppOrigin: origin, aeppRpcClientId: id };\n const signature = encode(await this.sign(decode(data), parameters), Encoding.Signature);\n return { signature };\n },\n [METHODS.signDelegation]: async ({ delegation, onAccount = this.address }, origin) => {\n if (!this._isRpcClientConnected(id)) throw new RpcNotAuthorizeError();\n if (!this.addresses().includes(onAccount)) throw new RpcPermissionDenyError(onAccount);\n const parameters = { onAccount, aeppOrigin: origin, aeppRpcClientId: id };\n const signature = await this.signDelegation(delegation, parameters);\n return { signature };\n },\n },\n ),\n };\n this._clients.set(id, client);\n return id;\n }\n\n /**\n * Send shareWalletInfo message to notify AEPP about wallet\n * @param clientId - ID of RPC client send message to\n */\n async shareWalletInfo(clientId: string): Promise<void> {\n this._getClient(clientId).rpc.notify(METHODS.readyToConnect, await this.getWalletInfo());\n }\n\n /**\n * Get Wallet info object\n * @returns Object with wallet information\n */\n async getWalletInfo(): Promise<WalletInfo> {\n return {\n id: this.id,\n name: this.name,\n networkId: await this.api.getNetworkId(),\n origin: window.location.origin,\n type: this._type,\n };\n }\n\n /**\n * Get Wallet accounts\n * @returns Object with accounts information (\\{ connected: Object, current: Object \\})\n */\n getAccounts(): Accounts {\n return {\n current: this.selectedAddress != null ? { [this.selectedAddress]: {} } : {},\n connected: this.addresses()\n .filter((a) => a !== this.selectedAddress)\n .reduce((acc, a) => ({ ...acc, [a]: {} }), {}),\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AeSdkWallet.mjs","names":["v4","uuid","AeSdk","verifyTransaction","RpcClient","METHODS","RPC_STATUS","SUBSCRIPTION_TYPES","RpcInvalidTransactionError","RpcNotAuthorizeError","RpcPermissionDenyError","RpcUnsupportedProtocolError","InternalError","UnknownRpcClientError","RPC_VERSION","Encoding","encode","decode","jsonBig","AeSdkWallet","constructor","name","id","type","onConnection","onSubscription","onDisconnect","onAskAccounts","options","_defineProperty","Map","_type","_getAccountsForClient","addressSubscription","current","connected","getAccounts","has","_pushAccountsToApps","_clients","Array","from","keys","filter","clientId","_isRpcClientConnected","map","_getClient","client","size","forEach","rpc","notify","updateAddress","selectAccount","address","addAccount","account","_getNode","ensureNodeConnected","node","url","api","$host","selectedNodeName","selectNode","networkId","getNetworkId","updateNetwork","connectNode","get","CONNECTED","status","connection","isConnected","_disconnectRpcClient","disconnect","DISCONNECTED","Set","removeRpcClient","delete","addRpcClient","clientConnection","disconnectParams","WAITING_FOR_CONNECTION_REQUEST","closeConnection","params","connect","version","icons","origin","getWalletInfo","subscribeAddress","value","subscribe","add","unsubscribe","subscription","addresses","sign","tx","onAccount","returnSigned","innerTx","includes","parameters","aeppOrigin","aeppRpcClientId","signedTransaction","signTransaction","parse","stringify","transactionHash","sendTransaction","verify","error","validation","length","signMessage","message","signature","_Buffer","toString","signTypedData","domain","aci","data","signDelegationToContract","contractAddress","oracleQueryId","allNames","isOracle","_isOracle","_ref","_ref2","_ref3","signNameDelegationToContract","signOracleQueryDelegationToContract","signAllNamesDelegationToContract","unsafeSign","Signature","signDelegation","delegation","set","shareWalletInfo","readyToConnect","window","location","selectedAddress","a","reduce","acc"],"sources":["../src/AeSdkWallet.ts"],"sourcesContent":["import { v4 as uuid } from '@aeternity/uuid';\nimport AeSdk from './AeSdk';\nimport verifyTransaction from './tx/validator';\nimport RpcClient from './aepp-wallet-communication/rpc/RpcClient';\nimport {\n METHODS, RPC_STATUS, SUBSCRIPTION_TYPES, WALLET_TYPE,\n RpcInvalidTransactionError,\n RpcNotAuthorizeError, RpcPermissionDenyError, RpcUnsupportedProtocolError,\n} from './aepp-wallet-communication/schema';\nimport { InternalError, UnknownRpcClientError } from './utils/errors';\nimport AccountBase from './account/Base';\nimport BrowserConnection from './aepp-wallet-communication/connection/Browser';\nimport {\n Accounts,\n AeppApi,\n Network,\n RPC_VERSION,\n WalletApi,\n WalletInfo,\n} from './aepp-wallet-communication/rpc/types';\nimport {\n Encoded, Encoding, encode, decode,\n} from './utils/encoder';\nimport jsonBig from './utils/json-big';\n\ntype RpcClientWallet = RpcClient<AeppApi, WalletApi>;\n\ntype OnConnection = (\n clientId: string, params: Omit<Parameters<WalletApi[METHODS.connect]>[0], 'version'>, origin: string\n) => void;\n\ntype OnSubscription = (\n clientId: string, params: Parameters<WalletApi[METHODS.subscribeAddress]>[0], origin: string\n) => void;\n\ntype OnDisconnect = (\n clientId: string, params: Parameters<WalletApi[METHODS.closeConnection]>[0]\n) => void;\n\ntype OnAskAccounts = (\n clientId: string, params: undefined, origin: string\n) => void;\n\ninterface RpcClientsInfo {\n id: string;\n status: RPC_STATUS;\n connectNode: boolean;\n addressSubscription: Set<'connected' | 'current'>;\n rpc: RpcClientWallet;\n}\n\n/**\n * Contain functionality for aepp interaction and managing multiple aepps\n * @category aepp wallet communication\n */\nexport default class AeSdkWallet extends AeSdk {\n id: string;\n\n _type: WALLET_TYPE;\n\n name: string;\n\n _clients = new Map<string, RpcClientsInfo>();\n\n onConnection: OnConnection;\n\n onSubscription: OnSubscription;\n\n onDisconnect: OnDisconnect;\n\n onAskAccounts: OnAskAccounts;\n\n /**\n * @param options - Options\n * @param options.name - Wallet name\n * @param options.id - Wallet id\n * @param options.type - Wallet type\n * @param options.onConnection - Call-back function for incoming AEPP connection\n * @param options.onSubscription - Call-back function for incoming AEPP account subscription\n * @param options.onAskAccounts - Call-back function for incoming AEPP get address request\n * @param options.onDisconnect - Call-back function for disconnect event\n */\n constructor({\n name,\n id,\n type,\n onConnection,\n onSubscription,\n onDisconnect,\n onAskAccounts,\n ...options\n }: {\n id: string;\n type: WALLET_TYPE;\n name: string;\n onConnection: OnConnection;\n onSubscription: OnSubscription;\n onDisconnect: OnDisconnect;\n onAskAccounts: OnAskAccounts;\n } & ConstructorParameters<typeof AeSdk>[0]) {\n super(options);\n this.onConnection = onConnection;\n this.onSubscription = onSubscription;\n this.onDisconnect = onDisconnect;\n this.onAskAccounts = onAskAccounts;\n this.name = name;\n this.id = id;\n this._type = type;\n }\n\n _getAccountsForClient({ addressSubscription }: RpcClientsInfo): Accounts {\n const { current, connected } = this.getAccounts();\n return {\n current: addressSubscription.has('current') || addressSubscription.has('connected')\n ? current : {},\n connected: addressSubscription.has('connected') ? connected : {},\n };\n }\n\n _pushAccountsToApps(): void {\n if (this._clients == null) return;\n Array.from(this._clients.keys())\n .filter((clientId) => this._isRpcClientConnected(clientId))\n .map((clientId) => this._getClient(clientId))\n .filter((client) => client.addressSubscription.size !== 0)\n .forEach((client) => client.rpc\n .notify(METHODS.updateAddress, this._getAccountsForClient(client)));\n }\n\n override selectAccount(address: Encoded.AccountAddress): void {\n super.selectAccount(address);\n this._pushAccountsToApps();\n }\n\n override addAccount(account: AccountBase, options?: Parameters<AeSdk['addAccount']>[1]): void {\n super.addAccount(account, options);\n this._pushAccountsToApps();\n }\n\n _getNode(): { node: Network['node'] } {\n this.ensureNodeConnected();\n return { node: { url: this.api.$host, name: this.selectedNodeName } };\n }\n\n override async selectNode(name: string): Promise<void> {\n super.selectNode(name);\n const networkId = await this.api.getNetworkId();\n Array.from(this._clients.keys())\n .filter((clientId) => this._isRpcClientConnected(clientId))\n .map((clientId) => this._getClient(clientId))\n .forEach((client) => {\n client.rpc.notify(METHODS.updateNetwork, {\n networkId,\n ...client.connectNode && this._getNode(),\n });\n });\n }\n\n _getClient(clientId: string): RpcClientsInfo {\n const client = this._clients.get(clientId);\n if (client == null) throw new UnknownRpcClientError(clientId);\n return client;\n }\n\n _isRpcClientConnected(clientId: string): boolean {\n return RPC_STATUS.CONNECTED === this._getClient(clientId).status\n && this._getClient(clientId).rpc.connection.isConnected();\n }\n\n _disconnectRpcClient(clientId: string): void {\n const client = this._getClient(clientId);\n client.rpc.connection.disconnect();\n client.status = RPC_STATUS.DISCONNECTED;\n client.addressSubscription = new Set();\n }\n\n /**\n * Remove specific RpcClient by ID\n * @param id - Client ID\n */\n removeRpcClient(id: string): void {\n this._disconnectRpcClient(id);\n this._clients.delete(id);\n }\n\n /**\n * Add new client by AEPP connection\n * @param clientConnection - AEPP connection object\n * @returns Client ID\n */\n addRpcClient(clientConnection: BrowserConnection): string {\n // @TODO detect if aepp has some history based on origin????\n // if yes use this instance for connection\n const id = uuid();\n let disconnectParams: any;\n const client: RpcClientsInfo = {\n id,\n status: RPC_STATUS.WAITING_FOR_CONNECTION_REQUEST,\n addressSubscription: new Set(),\n connectNode: false,\n rpc: new RpcClient<AeppApi, WalletApi>(\n clientConnection,\n () => {\n this._clients.delete(id);\n this.onDisconnect(id, disconnectParams); // also related info\n },\n {\n [METHODS.closeConnection]: (params) => {\n disconnectParams = params;\n this._disconnectRpcClient(id);\n },\n // Store client info and prepare two fn for each client `connect` and `denyConnection`\n // which automatically prepare and send response for that client\n [METHODS.connect]: async ({\n name, version, icons, connectNode,\n }, origin) => {\n if (version !== RPC_VERSION) throw new RpcUnsupportedProtocolError();\n\n await this.onConnection(id, { name, icons, connectNode }, origin);\n client.status = RPC_STATUS.CONNECTED;\n client.connectNode = connectNode;\n return {\n ...await this.getWalletInfo(),\n ...connectNode && this._getNode(),\n };\n },\n [METHODS.subscribeAddress]: async ({ type, value }, origin) => {\n if (!this._isRpcClientConnected(id)) throw new RpcNotAuthorizeError();\n\n switch (type) {\n case SUBSCRIPTION_TYPES.subscribe:\n // TODO: remove `type` as it always subscribe\n await this.onSubscription(id, { type, value }, origin);\n client.addressSubscription.add(value);\n break;\n case SUBSCRIPTION_TYPES.unsubscribe:\n client.addressSubscription.delete(value);\n break;\n default:\n throw new InternalError(`Unknown subscription type: ${type}`);\n }\n\n return {\n subscription: Array.from(client.addressSubscription),\n address: this._getAccountsForClient(client),\n };\n },\n [METHODS.address]: async (params, origin) => {\n if (!this._isRpcClientConnected(id)) throw new RpcNotAuthorizeError();\n await this.onAskAccounts(id, params, origin);\n return this.addresses();\n },\n [METHODS.sign]: async (\n {\n tx, onAccount = this.address, returnSigned, innerTx,\n },\n origin,\n ) => {\n if (!this._isRpcClientConnected(id)) throw new RpcNotAuthorizeError();\n if (!this.addresses().includes(onAccount)) {\n throw new RpcPermissionDenyError(onAccount);\n }\n\n const parameters = {\n onAccount, aeppOrigin: origin, aeppRpcClientId: id, innerTx,\n };\n if (returnSigned || innerTx === true) {\n return { signedTransaction: await this.signTransaction(tx, parameters) };\n }\n try {\n return jsonBig.parse(jsonBig.stringify({\n transactionHash: await this.sendTransaction(tx, { ...parameters, verify: false }),\n }));\n } catch (error) {\n const validation = await verifyTransaction(tx, this.api);\n if (validation.length > 0) throw new RpcInvalidTransactionError(validation);\n throw error;\n }\n },\n [METHODS.signMessage]: async ({ message, onAccount = this.address }, origin) => {\n if (!this._isRpcClientConnected(id)) throw new RpcNotAuthorizeError();\n if (!this.addresses().includes(onAccount)) {\n throw new RpcPermissionDenyError(onAccount);\n }\n\n const parameters = { onAccount, aeppOrigin: origin, aeppRpcClientId: id };\n return {\n signature: Buffer.from(await this.signMessage(message, parameters)).toString('hex'),\n };\n },\n [METHODS.signTypedData]: async ({\n domain, aci, data, onAccount = this.address,\n }, origin) => {\n if (!this._isRpcClientConnected(id)) throw new RpcNotAuthorizeError();\n if (!this.addresses().includes(onAccount)) {\n throw new RpcPermissionDenyError(onAccount);\n }\n\n const parameters = {\n ...domain, onAccount, aeppOrigin: origin, aeppRpcClientId: id,\n };\n return {\n signature: await this.signTypedData(data, aci, parameters),\n };\n },\n [METHODS.signDelegationToContract]: async ({\n contractAddress, name, oracleQueryId, allNames, onAccount = this.address, isOracle,\n }, origin) => {\n if (!this._isRpcClientConnected(id)) throw new RpcNotAuthorizeError();\n if (!this.addresses().includes(onAccount)) {\n throw new RpcPermissionDenyError(onAccount);\n }\n\n isOracle ??= false;\n const parameters = { onAccount, aeppOrigin: origin, aeppRpcClientId: id };\n const signature = await (\n (name == null ? null : this\n .signNameDelegationToContract(contractAddress, name, parameters))\n ?? (oracleQueryId == null ? null : this\n .signOracleQueryDelegationToContract(contractAddress, oracleQueryId, parameters))\n ?? (allNames !== true ? null : this\n .signAllNamesDelegationToContract(contractAddress, parameters))\n ?? this.signDelegationToContract(contractAddress, { ...parameters, isOracle })\n );\n return { signature };\n },\n [METHODS.unsafeSign]: async ({ data, onAccount = this.address }, origin) => {\n if (!this._isRpcClientConnected(id)) throw new RpcNotAuthorizeError();\n if (!this.addresses().includes(onAccount)) throw new RpcPermissionDenyError(onAccount);\n const parameters = { onAccount, aeppOrigin: origin, aeppRpcClientId: id };\n const signature = encode(await this.sign(decode(data), parameters), Encoding.Signature);\n return { signature };\n },\n [METHODS.signDelegation]: async ({ delegation, onAccount = this.address }, origin) => {\n if (!this._isRpcClientConnected(id)) throw new RpcNotAuthorizeError();\n if (!this.addresses().includes(onAccount)) throw new RpcPermissionDenyError(onAccount);\n const parameters = { onAccount, aeppOrigin: origin, aeppRpcClientId: id };\n const signature = await this.signDelegation(delegation, parameters);\n return { signature };\n },\n },\n ),\n };\n this._clients.set(id, client);\n return id;\n }\n\n /**\n * Send shareWalletInfo message to notify AEPP about wallet\n * @param clientId - ID of RPC client send message to\n */\n async shareWalletInfo(clientId: string): Promise<void> {\n this._getClient(clientId).rpc.notify(METHODS.readyToConnect, await this.getWalletInfo());\n }\n\n /**\n * Get Wallet info object\n * @returns Object with wallet information\n */\n async getWalletInfo(): Promise<WalletInfo> {\n const { origin } = window.location;\n return {\n id: this.id,\n name: this.name,\n networkId: await this.api.getNetworkId(),\n origin: origin === 'file://' ? '*' : origin,\n type: this._type,\n };\n }\n\n /**\n * Get Wallet accounts\n * @returns Object with accounts information (\\{ connected: Object, current: Object \\})\n */\n getAccounts(): Accounts {\n return {\n current: this.selectedAddress != null ? { [this.selectedAddress]: {} } : {},\n connected: this.addresses()\n .filter((a) => a !== this.selectedAddress)\n .reduce((acc, a) => ({ ...acc, [a]: {} }), {}),\n };\n }\n}\n"],"mappings":"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"}
@@ -147,7 +147,7 @@ export default class Channel {
147
147
  * ```
148
148
  */
149
149
  leave(): Promise<{
150
- channelId: Encoded.Bytearray;
150
+ channelId: Encoded.Channel;
151
151
  signedTx: Encoded.Transaction;
152
152
  }>;
153
153
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"Base.mjs","names":["EventEmitter","snakeToPascal","buildTx","unpackTx","Tag","handlers","initialize","enqueueAction","notify","call","disconnect","channelDisconnect","ChannelError","snakeToPascalObjKeys","obj","Object","entries","reduce","result","key","val","channelCounter","_debugId","WeakMap","Channel","constructor","_defineProperty","Map","_classPrivateFieldInitSpec","writable","value","_classPrivateFieldSet","_debug","args","_options","debug","console","_classPrivateFieldGet","options","_initialize","channel","existingFsmId","awaitingReconnection","awaitingConnection","channelOpen","on","eventName","callback","_eventEmitter","off","removeListener","status","_status","state","res","calls","CallsMtree","halfSignedTx","SignedTx","signedTx","trees","StateTrees","round","_state","params","encodedTx","tag","ChannelCreateTx","ChannelOffChainTx","ChannelWithdrawTx","ChannelDepositTx","id","_channelId","fsmId","_fsmId","action","handler","leave","awaitingLeave","shutdown","sign","awaitingShutdownTx","reconnect","txParams","reconnectTx","ChannelClientReconnectTx"],"sources":["../../src/channel/Base.ts"],"sourcesContent":["import EventEmitter from 'events';\nimport { w3cwebsocket as W3CWebSocket } from 'websocket';\nimport { snakeToPascal } from '../utils/string';\nimport { buildTx, unpackTx } from '../tx/builder';\nimport { Tag } from '../tx/builder/constants';\nimport * as handlers from './handlers';\nimport {\n initialize,\n enqueueAction,\n notify,\n call,\n disconnect as channelDisconnect,\n SignTx,\n ChannelOptions,\n ChannelState,\n ChannelHandler,\n ChannelAction,\n ChannelStatus,\n ChannelFsm,\n ChannelMessage,\n ChannelEvents,\n} from './internal';\nimport { ChannelError } from '../utils/errors';\nimport { Encoded } from '../utils/encoder';\nimport { TxUnpacked } from '../tx/builder/schema.generated';\n\nfunction snakeToPascalObjKeys<Type>(obj: object): Type {\n return Object.entries(obj).reduce((result, [key, val]) => ({\n ...result,\n [snakeToPascal(key)]: val,\n }), {}) as Type;\n}\n\nlet channelCounter = 0;\n\n/**\n * Channel\n * @example\n * ```js\n * await Channel.initialize({\n * url: 'ws://localhost:3001',\n * role: 'initiator'\n * initiatorId: 'ak_Y1NRjHuoc3CGMYMvCmdHSBpJsMDR6Ra2t5zjhRcbtMeXXLpLH',\n * responderId: 'ak_V6an1xhec1xVaAhLuak7QoEbi6t7w5hEtYWp9bMKaJ19i6A9E',\n * initiatorAmount: 1e18,\n * responderAmount: 1e18,\n * pushAmount: 0,\n * channelReserve: 0,\n * ttl: 1000,\n * host: 'localhost',\n * port: 3002,\n * lockPeriod: 10,\n * async sign (tag, tx) => await account.signTransaction(tx)\n * })\n * ```\n */\nexport default class Channel {\n _eventEmitter = new EventEmitter();\n\n _pingTimeoutId!: NodeJS.Timeout;\n\n _nextRpcMessageId = 0;\n\n _rpcCallbacks = new Map<number, (message: object) => void>();\n\n _fsmId?: Encoded.Bytearray;\n\n _messageQueue: ChannelMessage[] = [];\n\n _isMessageQueueLocked = false;\n\n _actionQueue: ChannelAction[] = [];\n\n _isActionQueueLocked = false;\n\n _status: ChannelStatus = 'disconnected';\n\n _fsm!: ChannelFsm;\n\n _websocket!: W3CWebSocket;\n\n _state: Encoded.Transaction | '' = '';\n\n _options!: ChannelOptions;\n\n readonly #debugId: number;\n\n _channelId?: Encoded.Channel;\n\n protected constructor() {\n channelCounter += 1;\n this.#debugId = channelCounter;\n }\n\n _debug(...args: any[]): void {\n if (this._options.debug !== true) return;\n console.debug(`Channel #${this.#debugId}`, ...args);\n }\n\n /**\n * @param options - Channel params\n */\n static async initialize(options: ChannelOptions): Promise<Channel> {\n return Channel._initialize(new Channel(), options);\n }\n\n static async _initialize<T extends Channel>(channel: T, options: ChannelOptions): Promise<T> {\n await initialize(\n channel,\n options.existingFsmId != null ? handlers.awaitingReconnection : handlers.awaitingConnection,\n handlers.channelOpen,\n options,\n );\n return channel;\n }\n\n /**\n * Register event listener function\n *\n * Possible events:\n *\n * - \"error\"\n * - \"stateChanged\"\n * - \"statusChanged\"\n * - \"message\"\n * - \"peerDisconnected\"\n * - \"onChainTx\"\n * - \"ownWithdrawLocked\"\n * - \"withdrawLocked\"\n * - \"ownDepositLocked\"\n * - \"depositLocked\"\n * - \"channelReestablished\"\n * - \"newContract\"\n *\n *\n * @param eventName - Event name\n * @param callback - Callback function\n */\n on<E extends keyof ChannelEvents>(eventName: E, callback: ChannelEvents[E]): void {\n this._eventEmitter.on(eventName, callback);\n }\n\n /**\n * Remove event listener function\n * @param eventName - Event name\n * @param callback - Callback function\n */\n off<E extends keyof ChannelEvents>(eventName: E, callback: ChannelEvents[E]): void {\n this._eventEmitter.removeListener(eventName, callback);\n }\n\n /**\n * Close the connection\n */\n disconnect(): void {\n return channelDisconnect(this);\n }\n\n /**\n * Get current status\n */\n status(): ChannelStatus {\n return this._status;\n }\n\n /**\n * Get current state\n */\n async state(): Promise<{\n calls: TxUnpacked & { tag: Tag.CallsMtree };\n halfSignedTx?: TxUnpacked & { tag: Tag.SignedTx };\n signedTx?: TxUnpacked & { tag: Tag.SignedTx };\n trees: TxUnpacked & { tag: Tag.StateTrees };\n }> {\n const res = snakeToPascalObjKeys<{\n calls: Encoded.CallStateTree;\n halfSignedTx: Encoded.Transaction | '';\n signedTx: Encoded.Transaction | '';\n trees: Encoded.StateTrees;\n }>(await call(this, 'channels.get.offchain_state', {}));\n return {\n calls: unpackTx(res.calls, Tag.CallsMtree),\n ...res.halfSignedTx !== '' && { halfSignedTx: unpackTx(res.halfSignedTx, Tag.SignedTx) },\n ...res.signedTx !== '' && { signedTx: unpackTx(res.signedTx, Tag.SignedTx) },\n trees: unpackTx(res.trees, Tag.StateTrees),\n };\n }\n\n /**\n * Get current round\n *\n * If round cannot be determined (for example when channel has not been opened)\n * it will return `null`.\n */\n round(): number | null {\n if (this._state === '') {\n return null;\n }\n const params = unpackTx(this._state, Tag.SignedTx).encodedTx;\n switch (params.tag) {\n case Tag.ChannelCreateTx:\n return 1;\n case Tag.ChannelOffChainTx:\n case Tag.ChannelWithdrawTx:\n case Tag.ChannelDepositTx:\n return params.round;\n default:\n return null;\n }\n }\n\n /**\n * Get channel id\n *\n */\n id(): Encoded.Channel {\n if (this._channelId == null) throw new ChannelError('Channel is not initialized');\n return this._channelId;\n }\n\n /**\n * Get channel's fsm id\n *\n */\n fsmId(): Encoded.Bytearray {\n if (this._fsmId == null) throw new ChannelError('Channel is not initialized');\n return this._fsmId;\n }\n\n protected async enqueueAction(\n action: () => { handler: ChannelHandler; state?: Partial<ChannelState> },\n ): Promise<any> {\n return enqueueAction(\n this,\n (channel, state) => state?.handler === handlers.channelOpen,\n action,\n );\n }\n\n /**\n * Leave channel\n *\n * It is possible to leave a channel and then later reestablish the channel\n * off-chain state and continue operation. When a leave method is called,\n * the channel fsm passes it on to the peer fsm, reports the current mutually\n * signed state and then terminates.\n *\n * The channel can be reestablished by instantiating another Channel instance\n * with two extra params: existingChannelId and offchainTx (returned from leave\n * method as channelId and signedTx respectively).\n *\n * @example\n * ```js\n * channel.leave().then(({ channelId, signedTx }) => {\n * console.log(channelId)\n * console.log(signedTx)\n * })\n * ```\n */\n async leave(): Promise<{ channelId: Encoded.Bytearray; signedTx: Encoded.Transaction }> {\n return this.enqueueAction(() => {\n notify(this, 'channels.leave');\n return { handler: handlers.awaitingLeave };\n });\n }\n\n /**\n * Trigger mutual close\n *\n * At any moment after the channel is opened, a closing procedure can be triggered.\n * This can be done by either of the parties. The process is similar to the off-chain updates.\n *\n * @param sign - Function which verifies and signs mutual close transaction\n * @example\n * ```js\n * channel.shutdown(\n * async (tx) => await account.signTransaction(tx)\n * ).then(tx => console.log('on_chain_tx', tx))\n * ```\n */\n async shutdown(sign: SignTx): Promise<Encoded.Transaction> {\n return this.enqueueAction(() => {\n notify(this, 'channels.shutdown');\n return {\n handler: handlers.awaitingShutdownTx,\n state: { sign },\n };\n });\n }\n\n static async reconnect(options: ChannelOptions, txParams: any): Promise<Channel> {\n const { sign } = options;\n\n return Channel.initialize({\n ...options,\n reconnectTx: await sign(\n 'reconnect',\n buildTx({ ...txParams, tag: Tag.ChannelClientReconnectTx }),\n ),\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Base.mjs","names":["EventEmitter","snakeToPascal","buildTx","unpackTx","Tag","handlers","initialize","enqueueAction","notify","call","disconnect","channelDisconnect","ChannelError","snakeToPascalObjKeys","obj","Object","entries","reduce","result","key","val","channelCounter","_debugId","WeakMap","Channel","constructor","_defineProperty","Map","_classPrivateFieldInitSpec","writable","value","_classPrivateFieldSet","_debug","args","_options","debug","console","_classPrivateFieldGet","options","_initialize","channel","existingFsmId","awaitingReconnection","awaitingConnection","channelOpen","on","eventName","callback","_eventEmitter","off","removeListener","status","_status","state","res","calls","CallsMtree","halfSignedTx","SignedTx","signedTx","trees","StateTrees","round","_state","params","encodedTx","tag","ChannelCreateTx","ChannelOffChainTx","ChannelWithdrawTx","ChannelDepositTx","id","_channelId","fsmId","_fsmId","action","handler","leave","awaitingLeave","shutdown","sign","awaitingShutdownTx","reconnect","txParams","reconnectTx","ChannelClientReconnectTx"],"sources":["../../src/channel/Base.ts"],"sourcesContent":["import EventEmitter from 'events';\nimport { w3cwebsocket as W3CWebSocket } from 'websocket';\nimport { snakeToPascal } from '../utils/string';\nimport { buildTx, unpackTx } from '../tx/builder';\nimport { Tag } from '../tx/builder/constants';\nimport * as handlers from './handlers';\nimport {\n initialize,\n enqueueAction,\n notify,\n call,\n disconnect as channelDisconnect,\n SignTx,\n ChannelOptions,\n ChannelState,\n ChannelHandler,\n ChannelAction,\n ChannelStatus,\n ChannelFsm,\n ChannelMessage,\n ChannelEvents,\n} from './internal';\nimport { ChannelError } from '../utils/errors';\nimport { Encoded } from '../utils/encoder';\nimport { TxUnpacked } from '../tx/builder/schema.generated';\n\nfunction snakeToPascalObjKeys<Type>(obj: object): Type {\n return Object.entries(obj).reduce((result, [key, val]) => ({\n ...result,\n [snakeToPascal(key)]: val,\n }), {}) as Type;\n}\n\nlet channelCounter = 0;\n\n/**\n * Channel\n * @example\n * ```js\n * await Channel.initialize({\n * url: 'ws://localhost:3001',\n * role: 'initiator'\n * initiatorId: 'ak_Y1NRjHuoc3CGMYMvCmdHSBpJsMDR6Ra2t5zjhRcbtMeXXLpLH',\n * responderId: 'ak_V6an1xhec1xVaAhLuak7QoEbi6t7w5hEtYWp9bMKaJ19i6A9E',\n * initiatorAmount: 1e18,\n * responderAmount: 1e18,\n * pushAmount: 0,\n * channelReserve: 0,\n * ttl: 1000,\n * host: 'localhost',\n * port: 3002,\n * lockPeriod: 10,\n * async sign (tag, tx) => await account.signTransaction(tx)\n * })\n * ```\n */\nexport default class Channel {\n _eventEmitter = new EventEmitter();\n\n _pingTimeoutId!: NodeJS.Timeout;\n\n _nextRpcMessageId = 0;\n\n _rpcCallbacks = new Map<number, (message: object) => void>();\n\n _fsmId?: Encoded.Bytearray;\n\n _messageQueue: ChannelMessage[] = [];\n\n _isMessageQueueLocked = false;\n\n _actionQueue: ChannelAction[] = [];\n\n _isActionQueueLocked = false;\n\n _status: ChannelStatus = 'disconnected';\n\n _fsm!: ChannelFsm;\n\n _websocket!: W3CWebSocket;\n\n _state: Encoded.Transaction | '' = '';\n\n _options!: ChannelOptions;\n\n readonly #debugId: number;\n\n _channelId?: Encoded.Channel;\n\n protected constructor() {\n channelCounter += 1;\n this.#debugId = channelCounter;\n }\n\n _debug(...args: any[]): void {\n if (this._options.debug !== true) return;\n console.debug(`Channel #${this.#debugId}`, ...args);\n }\n\n /**\n * @param options - Channel params\n */\n static async initialize(options: ChannelOptions): Promise<Channel> {\n return Channel._initialize(new Channel(), options);\n }\n\n static async _initialize<T extends Channel>(channel: T, options: ChannelOptions): Promise<T> {\n await initialize(\n channel,\n options.existingFsmId != null ? handlers.awaitingReconnection : handlers.awaitingConnection,\n handlers.channelOpen,\n options,\n );\n return channel;\n }\n\n /**\n * Register event listener function\n *\n * Possible events:\n *\n * - \"error\"\n * - \"stateChanged\"\n * - \"statusChanged\"\n * - \"message\"\n * - \"peerDisconnected\"\n * - \"onChainTx\"\n * - \"ownWithdrawLocked\"\n * - \"withdrawLocked\"\n * - \"ownDepositLocked\"\n * - \"depositLocked\"\n * - \"channelReestablished\"\n * - \"newContract\"\n *\n *\n * @param eventName - Event name\n * @param callback - Callback function\n */\n on<E extends keyof ChannelEvents>(eventName: E, callback: ChannelEvents[E]): void {\n this._eventEmitter.on(eventName, callback);\n }\n\n /**\n * Remove event listener function\n * @param eventName - Event name\n * @param callback - Callback function\n */\n off<E extends keyof ChannelEvents>(eventName: E, callback: ChannelEvents[E]): void {\n this._eventEmitter.removeListener(eventName, callback);\n }\n\n /**\n * Close the connection\n */\n disconnect(): void {\n return channelDisconnect(this);\n }\n\n /**\n * Get current status\n */\n status(): ChannelStatus {\n return this._status;\n }\n\n /**\n * Get current state\n */\n async state(): Promise<{\n calls: TxUnpacked & { tag: Tag.CallsMtree };\n halfSignedTx?: TxUnpacked & { tag: Tag.SignedTx };\n signedTx?: TxUnpacked & { tag: Tag.SignedTx };\n trees: TxUnpacked & { tag: Tag.StateTrees };\n }> {\n const res = snakeToPascalObjKeys<{\n calls: Encoded.CallStateTree;\n halfSignedTx: Encoded.Transaction | '';\n signedTx: Encoded.Transaction | '';\n trees: Encoded.StateTrees;\n }>(await call(this, 'channels.get.offchain_state', {}));\n return {\n calls: unpackTx(res.calls, Tag.CallsMtree),\n ...res.halfSignedTx !== '' && { halfSignedTx: unpackTx(res.halfSignedTx, Tag.SignedTx) },\n ...res.signedTx !== '' && { signedTx: unpackTx(res.signedTx, Tag.SignedTx) },\n trees: unpackTx(res.trees, Tag.StateTrees),\n };\n }\n\n /**\n * Get current round\n *\n * If round cannot be determined (for example when channel has not been opened)\n * it will return `null`.\n */\n round(): number | null {\n if (this._state === '') {\n return null;\n }\n const params = unpackTx(this._state, Tag.SignedTx).encodedTx;\n switch (params.tag) {\n case Tag.ChannelCreateTx:\n return 1;\n case Tag.ChannelOffChainTx:\n case Tag.ChannelWithdrawTx:\n case Tag.ChannelDepositTx:\n return params.round;\n default:\n return null;\n }\n }\n\n /**\n * Get channel id\n *\n */\n id(): Encoded.Channel {\n if (this._channelId == null) throw new ChannelError('Channel is not initialized');\n return this._channelId;\n }\n\n /**\n * Get channel's fsm id\n *\n */\n fsmId(): Encoded.Bytearray {\n if (this._fsmId == null) throw new ChannelError('Channel is not initialized');\n return this._fsmId;\n }\n\n protected async enqueueAction(\n action: () => { handler: ChannelHandler; state?: Partial<ChannelState> },\n ): Promise<any> {\n return enqueueAction(\n this,\n (channel, state) => state?.handler === handlers.channelOpen,\n action,\n );\n }\n\n /**\n * Leave channel\n *\n * It is possible to leave a channel and then later reestablish the channel\n * off-chain state and continue operation. When a leave method is called,\n * the channel fsm passes it on to the peer fsm, reports the current mutually\n * signed state and then terminates.\n *\n * The channel can be reestablished by instantiating another Channel instance\n * with two extra params: existingChannelId and offchainTx (returned from leave\n * method as channelId and signedTx respectively).\n *\n * @example\n * ```js\n * channel.leave().then(({ channelId, signedTx }) => {\n * console.log(channelId)\n * console.log(signedTx)\n * })\n * ```\n */\n async leave(): Promise<{ channelId: Encoded.Channel; signedTx: Encoded.Transaction }> {\n return this.enqueueAction(() => {\n notify(this, 'channels.leave');\n return { handler: handlers.awaitingLeave };\n });\n }\n\n /**\n * Trigger mutual close\n *\n * At any moment after the channel is opened, a closing procedure can be triggered.\n * This can be done by either of the parties. The process is similar to the off-chain updates.\n *\n * @param sign - Function which verifies and signs mutual close transaction\n * @example\n * ```js\n * channel.shutdown(\n * async (tx) => await account.signTransaction(tx)\n * ).then(tx => console.log('on_chain_tx', tx))\n * ```\n */\n async shutdown(sign: SignTx): Promise<Encoded.Transaction> {\n return this.enqueueAction(() => {\n notify(this, 'channels.shutdown');\n return {\n handler: handlers.awaitingShutdownTx,\n state: { sign },\n };\n });\n }\n\n static async reconnect(options: ChannelOptions, txParams: any): Promise<Channel> {\n const { sign } = options;\n\n return Channel.initialize({\n ...options,\n reconnectTx: await sign(\n 'reconnect',\n buildTx({ ...txParams, tag: Tag.ChannelClientReconnectTx }),\n ),\n });\n }\n}\n"],"mappings":";;;;;AAAA,OAAOA,YAAY,MAAM,QAAQ;AAAC,SAEzBC,aAAa;AAAA,SACbC,OAAO,EAAEC,QAAQ;AAAA,SACjBC,GAAG;AAAA,OACL,KAAKC,QAAQ;AAAA,SAElBC,UAAU,EACVC,aAAa,EACbC,MAAM,EACNC,IAAI,EACJC,UAAU,IAAIC,iBAAiB;AAAA,SAWxBC,YAAY;AAIrB,SAASC,oBAAoBA,CAAOC,GAAW,EAAQ;EACrD,OAAOC,MAAM,CAACC,OAAO,CAACF,GAAG,CAAC,CAACG,MAAM,CAAC,CAACC,MAAM,EAAE,CAACC,GAAG,EAAEC,GAAG,CAAC,MAAM;IACzD,GAAGF,MAAM;IACT,CAACjB,aAAa,CAACkB,GAAG,CAAC,GAAGC;EACxB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACT;AAEA,IAAIC,cAAc,GAAG,CAAC;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AApBA,IAAAC,QAAA,oBAAAC,OAAA;AAqBA,eAAe,MAAMC,OAAO,CAAC;EAiCjBC,WAAWA,CAAA,EAAG;IAAAC,eAAA,wBAhCR,IAAI1B,YAAY,CAAC,CAAC;IAAA0B,eAAA,4BAId,CAAC;IAAAA,eAAA,wBAEL,IAAIC,GAAG,CAAoC,CAAC;IAAAD,eAAA,wBAI1B,EAAE;IAAAA,eAAA,gCAEZ,KAAK;IAAAA,eAAA,uBAEG,EAAE;IAAAA,eAAA,+BAEX,KAAK;IAAAA,eAAA,kBAEH,cAAc;IAAAA,eAAA,iBAMJ,EAAE;IAAAE,0BAAA,OAAAN,QAAA;MAAAO,QAAA;MAAAC,KAAA;IAAA;IASnCT,cAAc,IAAI,CAAC;IACnBU,qBAAA,KAAI,EAAAT,QAAA,EAAYD,cAAc;EAChC;EAEAW,MAAMA,CAAC,GAAGC,IAAW,EAAQ;IAC3B,IAAI,IAAI,CAACC,QAAQ,CAACC,KAAK,KAAK,IAAI,EAAE;IAClCC,OAAO,CAACD,KAAK,CAAE,YAASE,qBAAA,CAAE,IAAI,EAAAf,QAAA,CAAU,EAAC,EAAE,GAAGW,IAAI,CAAC;EACrD;;EAEA;AACF;AACA;EACE,aAAa3B,UAAUA,CAACgC,OAAuB,EAAoB;IACjE,OAAOd,OAAO,CAACe,WAAW,CAAC,IAAIf,OAAO,CAAC,CAAC,EAAEc,OAAO,CAAC;EACpD;EAEA,aAAaC,WAAWA,CAAoBC,OAAU,EAAEF,OAAuB,EAAc;IAC3F,MAAMhC,UAAU,CACdkC,OAAO,EACPF,OAAO,CAACG,aAAa,IAAI,IAAI,GAAGpC,QAAQ,CAACqC,oBAAoB,GAAGrC,QAAQ,CAACsC,kBAAkB,EAC3FtC,QAAQ,CAACuC,WAAW,EACpBN,OACF,CAAC;IACD,OAAOE,OAAO;EAChB;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEK,EAAEA,CAAgCC,SAAY,EAAEC,QAA0B,EAAQ;IAChF,IAAI,CAACC,aAAa,CAACH,EAAE,CAACC,SAAS,EAAEC,QAAQ,CAAC;EAC5C;;EAEA;AACF;AACA;AACA;AACA;EACEE,GAAGA,CAAgCH,SAAY,EAAEC,QAA0B,EAAQ;IACjF,IAAI,CAACC,aAAa,CAACE,cAAc,CAACJ,SAAS,EAAEC,QAAQ,CAAC;EACxD;;EAEA;AACF;AACA;EACErC,UAAUA,CAAA,EAAS;IACjB,OAAOC,iBAAiB,CAAC,IAAI,CAAC;EAChC;;EAEA;AACF;AACA;EACEwC,MAAMA,CAAA,EAAkB;IACtB,OAAO,IAAI,CAACC,OAAO;EACrB;;EAEA;AACF;AACA;EACE,MAAMC,KAAKA,CAAA,EAKR;IACD,MAAMC,GAAG,GAAGzC,oBAAoB,CAK7B,MAAMJ,IAAI,CAAC,IAAI,EAAE,6BAA6B,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD,OAAO;MACL8C,KAAK,EAAEpD,QAAQ,CAACmD,GAAG,CAACC,KAAK,EAAEnD,GAAG,CAACoD,UAAU,CAAC;MAC1C,IAAGF,GAAG,CAACG,YAAY,KAAK,EAAE,IAAI;QAAEA,YAAY,EAAEtD,QAAQ,CAACmD,GAAG,CAACG,YAAY,EAAErD,GAAG,CAACsD,QAAQ;MAAE,CAAC;MACxF,IAAGJ,GAAG,CAACK,QAAQ,KAAK,EAAE,IAAI;QAAEA,QAAQ,EAAExD,QAAQ,CAACmD,GAAG,CAACK,QAAQ,EAAEvD,GAAG,CAACsD,QAAQ;MAAE,CAAC;MAC5EE,KAAK,EAAEzD,QAAQ,CAACmD,GAAG,CAACM,KAAK,EAAExD,GAAG,CAACyD,UAAU;IAC3C,CAAC;EACH;;EAEA;AACF;AACA;AACA;AACA;AACA;EACEC,KAAKA,CAAA,EAAkB;IACrB,IAAI,IAAI,CAACC,MAAM,KAAK,EAAE,EAAE;MACtB,OAAO,IAAI;IACb;IACA,MAAMC,MAAM,GAAG7D,QAAQ,CAAC,IAAI,CAAC4D,MAAM,EAAE3D,GAAG,CAACsD,QAAQ,CAAC,CAACO,SAAS;IAC5D,QAAQD,MAAM,CAACE,GAAG;MAChB,KAAK9D,GAAG,CAAC+D,eAAe;QACtB,OAAO,CAAC;MACV,KAAK/D,GAAG,CAACgE,iBAAiB;MAC1B,KAAKhE,GAAG,CAACiE,iBAAiB;MAC1B,KAAKjE,GAAG,CAACkE,gBAAgB;QACvB,OAAON,MAAM,CAACF,KAAK;MACrB;QACE,OAAO,IAAI;IACf;EACF;;EAEA;AACF;AACA;AACA;EACES,EAAEA,CAAA,EAAoB;IACpB,IAAI,IAAI,CAACC,UAAU,IAAI,IAAI,EAAE,MAAM,IAAI5D,YAAY,CAAC,4BAA4B,CAAC;IACjF,OAAO,IAAI,CAAC4D,UAAU;EACxB;;EAEA;AACF;AACA;AACA;EACEC,KAAKA,CAAA,EAAsB;IACzB,IAAI,IAAI,CAACC,MAAM,IAAI,IAAI,EAAE,MAAM,IAAI9D,YAAY,CAAC,4BAA4B,CAAC;IAC7E,OAAO,IAAI,CAAC8D,MAAM;EACpB;EAEA,MAAgBnE,aAAaA,CAC3BoE,MAAwE,EAC1D;IACd,OAAOpE,aAAa,CAClB,IAAI,EACJ,CAACiC,OAAO,EAAEa,KAAK,KAAK,CAAAA,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEuB,OAAO,MAAKvE,QAAQ,CAACuC,WAAW,EAC3D+B,MACF,CAAC;EACH;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAME,KAAKA,CAAA,EAA2E;IACpF,OAAO,IAAI,CAACtE,aAAa,CAAC,MAAM;MAC9BC,MAAM,CAAC,IAAI,EAAE,gBAAgB,CAAC;MAC9B,OAAO;QAAEoE,OAAO,EAAEvE,QAAQ,CAACyE;MAAc,CAAC;IAC5C,CAAC,CAAC;EACJ;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAMC,QAAQA,CAACC,IAAY,EAAgC;IACzD,OAAO,IAAI,CAACzE,aAAa,CAAC,MAAM;MAC9BC,MAAM,CAAC,IAAI,EAAE,mBAAmB,CAAC;MACjC,OAAO;QACLoE,OAAO,EAAEvE,QAAQ,CAAC4E,kBAAkB;QACpC5B,KAAK,EAAE;UAAE2B;QAAK;MAChB,CAAC;IACH,CAAC,CAAC;EACJ;EAEA,aAAaE,SAASA,CAAC5C,OAAuB,EAAE6C,QAAa,EAAoB;IAC/E,MAAM;MAAEH;IAAK,CAAC,GAAG1C,OAAO;IAExB,OAAOd,OAAO,CAAClB,UAAU,CAAC;MACxB,GAAGgC,OAAO;MACV8C,WAAW,EAAE,MAAMJ,IAAI,CACrB,WAAW,EACX9E,OAAO,CAAC;QAAE,GAAGiF,QAAQ;QAAEjB,GAAG,EAAE9D,GAAG,CAACiF;MAAyB,CAAC,CAC5D;IACF,CAAC,CAAC;EACJ;AACF"}
@@ -32,7 +32,7 @@ export type SignTx = (tx: Encoded.Transaction, options?: SignOptions) => (Promis
32
32
  /**
33
33
  * @see {@link https://github.com/aeternity/protocol/blob/6734de2e4c7cce7e5e626caa8305fb535785131d/node/api/channels_api_usage.md#channel-establishing-parameters}
34
34
  */
35
- export interface ChannelOptions {
35
+ interface CommonChannelOptions {
36
36
  existingFsmId?: Encoded.Bytearray;
37
37
  /**
38
38
  * Channel url (for example: "ws://localhost:3001")
@@ -53,7 +53,7 @@ export interface ChannelOptions {
53
53
  /**
54
54
  * Initial deposit in favour of the responder by the initiator
55
55
  */
56
- pushAmount: number;
56
+ pushAmount: BigNumber | number;
57
57
  /**
58
58
  * Amount of coins the initiator has committed to the channel
59
59
  */
@@ -71,17 +71,9 @@ export interface ChannelOptions {
71
71
  */
72
72
  ttl?: number;
73
73
  /**
74
- * Host of the responder's node
75
- */
76
- host: string;
77
- /**
78
- * The port of the responders node
74
+ * The port of the responder's node
79
75
  */
80
76
  port: number;
81
- /**
82
- * Participant role
83
- */
84
- role: 'initiator' | 'responder';
85
77
  /**
86
78
  * How to calculate minimum depth (default: txfee)
87
79
  */
@@ -98,16 +90,16 @@ export interface ChannelOptions {
98
90
  * Used for the fee computation of the channel open transaction
99
91
  */
100
92
  gasPrice?: BigNumber | number;
101
- signedTx?: string;
93
+ signedTx?: Encoded.Transaction;
102
94
  /**
103
95
  * Existing channel id (required if reestablishing a channel)
104
96
  */
105
- existingChannelId?: string;
97
+ existingChannelId?: Encoded.Channel;
106
98
  /**
107
99
  * Offchain transaction (required if reestablishing a channel)
108
100
  */
109
- offChainTx?: string;
110
- reconnectTx?: string;
101
+ offChainTx?: Encoded.Transaction;
102
+ reconnectTx?: Encoded.Transaction;
111
103
  /**
112
104
  * The time waiting for a new event to be initiated (default: 600000)
113
105
  */
@@ -152,7 +144,6 @@ export interface ChannelOptions {
152
144
  * Applicable only for responder (default: timeout_idle's value)
153
145
  */
154
146
  timeoutAwaitingOpen?: number;
155
- statePassword?: string;
156
147
  /**
157
148
  * Log websocket communication and state changes
158
149
  */
@@ -161,8 +152,23 @@ export interface ChannelOptions {
161
152
  * Function which verifies and signs transactions
162
153
  */
163
154
  sign: SignTxWithTag;
164
- offchainTx?: string;
155
+ offchainTx?: Encoded.Transaction;
165
156
  }
157
+ export type ChannelOptions = CommonChannelOptions & ({
158
+ /**
159
+ * Participant role
160
+ */
161
+ role: 'initiator';
162
+ /**
163
+ * Host of the responder's node
164
+ */
165
+ host: string;
166
+ } | {
167
+ /**
168
+ * Participant role
169
+ */
170
+ role: 'responder';
171
+ });
166
172
  export interface ChannelHandler extends Function {
167
173
  enter?: Function;
168
174
  }
@@ -1 +1 @@
1
- {"version":3,"file":"internal.mjs","names":["_websocket","w3cwebsocket","W3CWebSocket","JsonBig","pascalToSnake","ChannelCallError","ChannelPingTimedOutError","UnexpectedTsError","UnknownChannelStateError","ChannelIncomingMessageError","ChannelError","encodeContractAddress","buildTx","ensureError","PING_TIMEOUT_MS","PONG_TIMEOUT_MS","emit","channel","args","eventName","rest","_eventEmitter","enterState","nextState","_nextState$handler","_debug","handler","name","_fsm","enter","dequeueAction","changeStatus","newStatus","debug","_status","changeState","newState","_state","send","message","method","params","stringify","jsonrpc","notify","_isActionQueueLocked","queue","_actionQueue","length","index","findIndex","action","guard","filter","_","i","enqueueAction","promise","Promise","resolve","reject","push","res","state","handleMessage","_message$params","st","data","updates","op","_message$params2","round","owner","dequeueMessage","_isMessageQueueLocked","_messageQueue","shift","error","disconnect","close","clearTimeout","_pingTimeoutId","ping","setTimeout","onMessage","parse","id","callback","_rpcCallbacks","get","delete","channel_id","_channelId","call","_nextRpcMessageId","set","_message$error$data$","details","result","initialize","connectionHandler","openHandler","url","channelOptions","_options","wsUrl","URL","Object","entries","key","includes","forEach","value","searchParams","toString","assign","onerror","onopen","event","reconnectTx","signedTx","onclose","onmessage"],"sources":["../../src/channel/internal.ts"],"sourcesContent":["import { w3cwebsocket as W3CWebSocket, ICloseEvent } from 'websocket';\nimport BigNumber from 'bignumber.js';\nimport type Channel from './Base';\nimport JsonBig from '../utils/json-big';\nimport { pascalToSnake } from '../utils/string';\nimport { Encoded } from '../utils/encoder';\nimport {\n BaseError,\n ChannelCallError,\n ChannelPingTimedOutError,\n UnexpectedTsError,\n UnknownChannelStateError,\n ChannelIncomingMessageError,\n ChannelError,\n} from '../utils/errors';\nimport { encodeContractAddress } from '../utils/crypto';\nimport { buildTx } from '../tx/builder';\nimport { ensureError } from '../utils/other';\n\nexport interface ChannelEvents {\n statusChanged: (status: ChannelStatus) => void;\n stateChanged: (tx: Encoded.Transaction | '') => void;\n depositLocked: () => void;\n ownDepositLocked: () => void;\n withdrawLocked: () => void;\n ownWithdrawLocked: () => void;\n peerDisconnected: () => void;\n channelReestablished: () => void;\n error: (error: Error) => void;\n onChainTx: (tx: Encoded.Transaction, details: { info: string; type: string }) => void;\n message: (message: string | Object) => void;\n newContract: (contractAddress: Encoded.ContractAddress) => void;\n}\n\nexport interface ChannelAction {\n guard: (channel: Channel, state?: ChannelFsm) => boolean;\n action: (channel: Channel, state?: ChannelFsm) => ChannelFsm;\n}\n\ninterface SignOptions {\n updates?: any[];\n [k: string]: any;\n}\nexport type SignTxWithTag = (tag: string, tx: Encoded.Transaction, options?: SignOptions) => (\n Promise<Encoded.Transaction>\n);\n// TODO: SignTx shouldn't return number or null\nexport type SignTx = (tx: Encoded.Transaction, options?: SignOptions) => (\n Promise<Encoded.Transaction | number | null>\n);\n\n/**\n * @see {@link https://github.com/aeternity/protocol/blob/6734de2e4c7cce7e5e626caa8305fb535785131d/node/api/channels_api_usage.md#channel-establishing-parameters}\n */\nexport interface ChannelOptions {\n existingFsmId?: Encoded.Bytearray;\n /**\n * Channel url (for example: \"ws://localhost:3001\")\n */\n url: string;\n\n /**\n * Initiator's public key\n */\n initiatorId: Encoded.AccountAddress;\n /**\n * Responder's public key\n */\n responderId: Encoded.AccountAddress;\n /**\n * Amount of blocks for disputing a solo close\n */\n lockPeriod: number;\n /**\n * Initial deposit in favour of the responder by the initiator\n */\n pushAmount: number;\n /**\n * Amount of coins the initiator has committed to the channel\n */\n initiatorAmount: BigNumber | number;\n /**\n * Amount of coins the responder has committed to the channel\n */\n responderAmount: BigNumber | number;\n /**\n * The minimum amount both peers need to maintain\n */\n channelReserve?: BigNumber | number;\n /**\n * Minimum block height to include the channel_create_tx\n */\n ttl?: number;\n /**\n * Host of the responder's node\n */\n host: string;\n /**\n * The port of the responders node\n */\n port: number;\n /**\n * Participant role\n */\n role: 'initiator' | 'responder';\n /**\n * How to calculate minimum depth (default: txfee)\n */\n minimumDepthStrategy?: 'txfee' | 'plain';\n /**\n * The minimum amount of blocks to be mined\n */\n minimumDepth?: number;\n /**\n * The fee to be used for the channel open transaction\n */\n fee?: BigNumber | number;\n /**\n * Used for the fee computation of the channel open transaction\n */\n gasPrice?: BigNumber | number;\n\n signedTx?: string;\n /**\n * Existing channel id (required if reestablishing a channel)\n */\n existingChannelId?: string;\n /**\n * Offchain transaction (required if reestablishing a channel)\n */\n offChainTx?: string;\n reconnectTx?: string;\n /**\n * The time waiting for a new event to be initiated (default: 600000)\n */\n timeoutIdle?: number;\n /**\n * The time waiting for the initiator to produce the create channel transaction after the noise\n * session had been established (default: 120000)\n */\n timeoutFundingCreate?: number;\n /**\n * The time frame the other client has to sign an off-chain update after our client had initiated\n * and signed it. This applies only for double signed on-chain intended updates: channel create\n * transaction, deposit, withdrawal and etc. (default: 120000)\n */\n timeoutFundingSign?: number;\n /**\n * The time frame the other client has to confirm an on-chain transaction reaching maturity\n * (passing minimum depth) after the local node has detected this. This applies only for double\n * signed on-chain intended updates: channel create transaction, deposit, withdrawal and etc.\n * (default: 360000)\n */\n timeoutFundingLock?: number;\n /**\n * The time frame the client has to return a signed off-chain update or to decline it.\n * This applies for all off-chain updates (default: 500000)\n */\n timeoutSign?: number;\n /**\n * The time frame the other client has to react to an event. This applies for all off-chain\n * updates that are not meant to land on-chain, as well as some special cases: opening a noise\n * connection, mutual closing acknowledgement and reestablishing an existing channel\n * (default: 120000)\n */\n timeoutAccept?: number;\n /**\n * the time frame the responder has to accept an incoming noise session.\n * Applicable only for initiator (default: timeout_accept's value)\n */\n timeoutInitialized?: number;\n /**\n * The time frame the initiator has to start an outgoing noise session to the responder's node.\n * Applicable only for responder (default: timeout_idle's value)\n */\n timeoutAwaitingOpen?: number;\n statePassword?: string;\n /**\n * Log websocket communication and state changes\n */\n debug?: boolean;\n /**\n * Function which verifies and signs transactions\n */\n sign: SignTxWithTag;\n offchainTx?: string;\n}\n\nexport interface ChannelHandler extends Function {\n enter?: Function;\n}\n\nexport interface ChannelState {\n signedTx: Encoded.Transaction;\n resolve: (r?: any) => void;\n reject: (e: BaseError) => void;\n sign: SignTx;\n handler?: ChannelHandler;\n /**\n * Called when transaction has been posted on chain\n */\n onOnChainTx?: (tx: Encoded.Transaction) => void;\n onOwnWithdrawLocked?: () => void;\n onWithdrawLocked?: () => void;\n onOwnDepositLocked?: () => void;\n onDepositLocked?: () => void;\n closeTx?: string;\n}\n\nexport interface ChannelFsm {\n handler: ChannelHandler;\n state?: ChannelState | {\n resolve: Function;\n reject: Function;\n };\n}\n\nexport interface ChannelMessage {\n id?: number;\n method: string;\n params: any;\n payload?: any;\n data?: any;\n error?: ChannelMessageError;\n}\n\ninterface ChannelMessageError {\n code: number;\n message: string;\n data: [{\n message: string;\n code: number;\n }];\n request: ChannelMessage;\n}\n\n// Send ping message every 10 seconds\nconst PING_TIMEOUT_MS = 10000;\n// Close connection if pong message is not received within 15 seconds\nconst PONG_TIMEOUT_MS = 15000;\n\nexport function emit<E extends keyof ChannelEvents>(\n channel: Channel,\n ...args: [E, ...Parameters<ChannelEvents[E]>]\n): void {\n const [eventName, ...rest] = args;\n channel._eventEmitter.emit(eventName, ...rest);\n}\n\nfunction enterState(channel: Channel, nextState: ChannelFsm): void {\n if (nextState == null) {\n throw new UnknownChannelStateError();\n }\n channel._debug('enter state', nextState.handler.name);\n channel._fsm = nextState;\n if (nextState?.handler?.enter != null) {\n nextState.handler.enter(channel);\n }\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n void dequeueAction(channel);\n}\n\n// TODO: rewrite to enum\nexport type ChannelStatus = 'connecting' | 'connected' | 'accepted' | 'halfSigned' | 'signed'\n| 'open' | 'closing' | 'closed' | 'died' | 'disconnected';\n\nexport function changeStatus(channel: Channel, newStatus: ChannelStatus, debug?: unknown): void {\n channel._debug(newStatus, `(prev. ${channel._status})`, debug ?? '');\n if (newStatus === channel._status) return;\n channel._status = newStatus;\n emit(channel, 'statusChanged', newStatus);\n}\n\nexport function changeState(channel: Channel, newState: Encoded.Transaction | ''): void {\n channel._state = newState;\n emit(channel, 'stateChanged', newState);\n}\n\nfunction send(channel: Channel, message: ChannelMessage): void {\n channel._debug('send message', message.method, message.params);\n channel._websocket.send(JsonBig.stringify({ jsonrpc: '2.0', ...message }));\n}\n\nexport function notify(channel: Channel, method: string, params: object = {}): void {\n send(channel, { method, params });\n}\n\nasync function dequeueAction(channel: Channel): Promise<void> {\n if (channel._isActionQueueLocked) return;\n const queue = channel._actionQueue;\n if (queue.length === 0) return;\n const index = queue.findIndex((action) => action.guard(channel, channel._fsm));\n if (index === -1) return;\n channel._actionQueue = queue.filter((_, i) => index !== i);\n channel._isActionQueueLocked = true;\n const nextState: ChannelFsm = await queue[index].action(channel, channel._fsm);\n channel._isActionQueueLocked = false;\n enterState(channel, nextState);\n}\n\nexport async function enqueueAction(\n channel: Channel,\n guard: ChannelAction['guard'],\n action: () => { handler: ChannelHandler; state?: Partial<ChannelState> },\n): Promise<any> {\n const promise = new Promise((resolve, reject) => {\n channel._actionQueue.push({\n guard,\n action() {\n const res = action();\n return { ...res, state: { ...res.state, resolve, reject } };\n },\n });\n });\n void dequeueAction(channel);\n return promise;\n}\n\nasync function handleMessage(channel: Channel, message: ChannelMessage): Promise<void> {\n const { handler, state: st } = channel._fsm;\n const nextState = await Promise.resolve(handler(channel, message, st));\n enterState(channel, nextState);\n // TODO: emit message and handler name (?) to move this code to Contract constructor\n if (\n message?.params?.data?.updates?.[0]?.op === 'OffChainNewContract'\n // if name is channelOpen, the contract was created by other participant\n && nextState?.handler.name === 'channelOpen'\n ) {\n const round = channel.round();\n if (round == null) throw new UnexpectedTsError('Round is null');\n const owner = message?.params?.data?.updates?.[0]?.owner;\n emit(channel, 'newContract', encodeContractAddress(owner, round + 1));\n }\n}\n\nasync function dequeueMessage(channel: Channel): Promise<void> {\n if (channel._isMessageQueueLocked) return;\n channel._isMessageQueueLocked = true;\n while (channel._messageQueue.length > 0) {\n const message = channel._messageQueue.shift();\n if (message == null) throw new UnexpectedTsError();\n try {\n await handleMessage(channel, message);\n } catch (error) {\n ensureError(error);\n emit(channel, 'error', new ChannelIncomingMessageError(error, message));\n }\n }\n channel._isMessageQueueLocked = false;\n}\n\nexport function disconnect(channel: Channel): void {\n channel._websocket.close();\n clearTimeout(channel._pingTimeoutId);\n}\n\nfunction ping(channel: Channel): void {\n clearTimeout(channel._pingTimeoutId);\n channel._pingTimeoutId = setTimeout(() => {\n notify(channel, 'channels.system', { action: 'ping' });\n channel._pingTimeoutId = setTimeout(() => {\n disconnect(channel);\n emit(channel, 'error', new ChannelPingTimedOutError());\n }, PONG_TIMEOUT_MS);\n }, PING_TIMEOUT_MS);\n}\n\nfunction onMessage(channel: Channel, data: string): void {\n const message = JsonBig.parse(data);\n channel._debug('received message', message.method, message.params);\n if (message.id != null) {\n const callback = channel._rpcCallbacks.get(message.id);\n if (callback == null) {\n emit(channel, 'error', new ChannelError(`Can't find callback by id: ${message.id}`));\n return;\n }\n try {\n callback(message);\n } finally {\n channel._rpcCallbacks.delete(message.id);\n }\n return;\n }\n if (message.method === 'channels.message') {\n emit(channel, 'message', message.params.data.message);\n return;\n }\n if (message.method === 'channels.system.pong') {\n if (message.params.channel_id === channel._channelId || channel._channelId == null) {\n ping(channel);\n }\n return;\n }\n channel._messageQueue.push(message);\n void dequeueMessage(channel);\n}\n\nexport async function call(channel: Channel, method: string, params: any): Promise<any> {\n return new Promise((resolve, reject) => {\n const id = channel._nextRpcMessageId;\n channel._nextRpcMessageId += 1;\n channel._rpcCallbacks.set(id, (\n message: { result: PromiseLike<any>; error?: ChannelMessageError },\n ) => {\n if (message.error != null) {\n const details = message.error.data[0].message ?? '';\n reject(new ChannelCallError(message.error.message + details));\n } else resolve(message.result);\n });\n send(channel, { method, id, params });\n });\n}\n\nexport async function initialize(\n channel: Channel,\n connectionHandler: Function,\n openHandler: Function,\n { url, ...channelOptions }: ChannelOptions,\n): Promise<void> {\n channel._options = { url, ...channelOptions };\n\n const wsUrl = new URL(url);\n Object.entries(channelOptions)\n .filter(([key]) => !['sign', 'debug'].includes(key))\n .forEach(([key, value]) => wsUrl.searchParams.set(pascalToSnake(key), value.toString()));\n wsUrl.searchParams.set('protocol', 'json-rpc');\n changeStatus(channel, 'connecting');\n channel._websocket = new W3CWebSocket(wsUrl.toString());\n await new Promise<void>((resolve, reject) => {\n Object.assign(channel._websocket, {\n onerror: reject,\n onopen: async (event: Event) => {\n resolve();\n changeStatus(channel, 'connected', event);\n if (channelOptions.reconnectTx != null) {\n enterState(channel, { handler: openHandler });\n const { signedTx } = await channel.state();\n if (signedTx == null) {\n throw new ChannelError('`signedTx` missed in state while reconnection');\n }\n changeState(channel, buildTx(signedTx));\n } else {\n enterState(channel, { handler: connectionHandler });\n }\n ping(channel);\n },\n onclose: (event: ICloseEvent) => {\n changeStatus(channel, 'disconnected', event);\n clearTimeout(channel._pingTimeoutId);\n },\n onmessage: ({ data }: { data: string }) => onMessage(channel, data),\n });\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"internal.mjs","names":["_websocket","w3cwebsocket","W3CWebSocket","JsonBig","pascalToSnake","ChannelCallError","ChannelPingTimedOutError","UnexpectedTsError","UnknownChannelStateError","ChannelIncomingMessageError","ChannelError","encodeContractAddress","buildTx","ensureError","PING_TIMEOUT_MS","PONG_TIMEOUT_MS","emit","channel","args","eventName","rest","_eventEmitter","enterState","nextState","_nextState$handler","_debug","handler","name","_fsm","enter","dequeueAction","changeStatus","newStatus","debug","_status","changeState","newState","_state","send","message","method","params","stringify","jsonrpc","notify","_isActionQueueLocked","queue","_actionQueue","length","index","findIndex","action","guard","filter","_","i","enqueueAction","promise","Promise","resolve","reject","push","res","state","handleMessage","_message$params","st","data","updates","op","_message$params2","round","owner","dequeueMessage","_isMessageQueueLocked","_messageQueue","shift","error","disconnect","close","clearTimeout","_pingTimeoutId","ping","setTimeout","onMessage","parse","id","callback","_rpcCallbacks","get","delete","channel_id","_channelId","call","_nextRpcMessageId","set","_message$error$data$","details","result","initialize","connectionHandler","openHandler","url","channelOptions","_options","wsUrl","URL","Object","entries","key","includes","forEach","value","searchParams","toString","assign","onerror","onopen","event","reconnectTx","signedTx","onclose","onmessage"],"sources":["../../src/channel/internal.ts"],"sourcesContent":["import { w3cwebsocket as W3CWebSocket, ICloseEvent } from 'websocket';\nimport BigNumber from 'bignumber.js';\nimport type Channel from './Base';\nimport JsonBig from '../utils/json-big';\nimport { pascalToSnake } from '../utils/string';\nimport { Encoded } from '../utils/encoder';\nimport {\n BaseError,\n ChannelCallError,\n ChannelPingTimedOutError,\n UnexpectedTsError,\n UnknownChannelStateError,\n ChannelIncomingMessageError,\n ChannelError,\n} from '../utils/errors';\nimport { encodeContractAddress } from '../utils/crypto';\nimport { buildTx } from '../tx/builder';\nimport { ensureError } from '../utils/other';\n\nexport interface ChannelEvents {\n statusChanged: (status: ChannelStatus) => void;\n stateChanged: (tx: Encoded.Transaction | '') => void;\n depositLocked: () => void;\n ownDepositLocked: () => void;\n withdrawLocked: () => void;\n ownWithdrawLocked: () => void;\n peerDisconnected: () => void;\n channelReestablished: () => void;\n error: (error: Error) => void;\n onChainTx: (tx: Encoded.Transaction, details: { info: string; type: string }) => void;\n message: (message: string | Object) => void;\n newContract: (contractAddress: Encoded.ContractAddress) => void;\n}\n\nexport interface ChannelAction {\n guard: (channel: Channel, state?: ChannelFsm) => boolean;\n action: (channel: Channel, state?: ChannelFsm) => ChannelFsm;\n}\n\ninterface SignOptions {\n updates?: any[];\n [k: string]: any;\n}\nexport type SignTxWithTag = (tag: string, tx: Encoded.Transaction, options?: SignOptions) => (\n Promise<Encoded.Transaction>\n);\n// TODO: SignTx shouldn't return number or null\nexport type SignTx = (tx: Encoded.Transaction, options?: SignOptions) => (\n Promise<Encoded.Transaction | number | null>\n);\n\n/**\n * @see {@link https://github.com/aeternity/protocol/blob/6734de2e4c7cce7e5e626caa8305fb535785131d/node/api/channels_api_usage.md#channel-establishing-parameters}\n */\ninterface CommonChannelOptions {\n existingFsmId?: Encoded.Bytearray;\n /**\n * Channel url (for example: \"ws://localhost:3001\")\n */\n url: string;\n\n /**\n * Initiator's public key\n */\n initiatorId: Encoded.AccountAddress;\n /**\n * Responder's public key\n */\n responderId: Encoded.AccountAddress;\n /**\n * Amount of blocks for disputing a solo close\n */\n lockPeriod: number;\n /**\n * Initial deposit in favour of the responder by the initiator\n */\n pushAmount: BigNumber | number;\n /**\n * Amount of coins the initiator has committed to the channel\n */\n initiatorAmount: BigNumber | number;\n /**\n * Amount of coins the responder has committed to the channel\n */\n responderAmount: BigNumber | number;\n /**\n * The minimum amount both peers need to maintain\n */\n channelReserve?: BigNumber | number;\n /**\n * Minimum block height to include the channel_create_tx\n */\n ttl?: number;\n /**\n * The port of the responder's node\n */\n port: number;\n /**\n * How to calculate minimum depth (default: txfee)\n */\n minimumDepthStrategy?: 'txfee' | 'plain';\n /**\n * The minimum amount of blocks to be mined\n */\n minimumDepth?: number;\n /**\n * The fee to be used for the channel open transaction\n */\n fee?: BigNumber | number;\n /**\n * Used for the fee computation of the channel open transaction\n */\n gasPrice?: BigNumber | number;\n\n signedTx?: Encoded.Transaction;\n /**\n * Existing channel id (required if reestablishing a channel)\n */\n existingChannelId?: Encoded.Channel;\n /**\n * Offchain transaction (required if reestablishing a channel)\n */\n offChainTx?: Encoded.Transaction;\n reconnectTx?: Encoded.Transaction;\n /**\n * The time waiting for a new event to be initiated (default: 600000)\n */\n timeoutIdle?: number;\n /**\n * The time waiting for the initiator to produce the create channel transaction after the noise\n * session had been established (default: 120000)\n */\n timeoutFundingCreate?: number;\n /**\n * The time frame the other client has to sign an off-chain update after our client had initiated\n * and signed it. This applies only for double signed on-chain intended updates: channel create\n * transaction, deposit, withdrawal and etc. (default: 120000)\n */\n timeoutFundingSign?: number;\n /**\n * The time frame the other client has to confirm an on-chain transaction reaching maturity\n * (passing minimum depth) after the local node has detected this. This applies only for double\n * signed on-chain intended updates: channel create transaction, deposit, withdrawal and etc.\n * (default: 360000)\n */\n timeoutFundingLock?: number;\n /**\n * The time frame the client has to return a signed off-chain update or to decline it.\n * This applies for all off-chain updates (default: 500000)\n */\n timeoutSign?: number;\n /**\n * The time frame the other client has to react to an event. This applies for all off-chain\n * updates that are not meant to land on-chain, as well as some special cases: opening a noise\n * connection, mutual closing acknowledgement and reestablishing an existing channel\n * (default: 120000)\n */\n timeoutAccept?: number;\n /**\n * the time frame the responder has to accept an incoming noise session.\n * Applicable only for initiator (default: timeout_accept's value)\n */\n timeoutInitialized?: number;\n /**\n * The time frame the initiator has to start an outgoing noise session to the responder's node.\n * Applicable only for responder (default: timeout_idle's value)\n */\n timeoutAwaitingOpen?: number;\n /**\n * Log websocket communication and state changes\n */\n debug?: boolean;\n /**\n * Function which verifies and signs transactions\n */\n sign: SignTxWithTag;\n offchainTx?: Encoded.Transaction;\n}\n\nexport type ChannelOptions = CommonChannelOptions & ({\n /**\n * Participant role\n */\n role: 'initiator';\n /**\n * Host of the responder's node\n */\n host: string;\n} | {\n /**\n * Participant role\n */\n role: 'responder';\n});\n\nexport interface ChannelHandler extends Function {\n enter?: Function;\n}\n\nexport interface ChannelState {\n signedTx: Encoded.Transaction;\n resolve: (r?: any) => void;\n reject: (e: BaseError) => void;\n sign: SignTx;\n handler?: ChannelHandler;\n /**\n * Called when transaction has been posted on chain\n */\n onOnChainTx?: (tx: Encoded.Transaction) => void;\n onOwnWithdrawLocked?: () => void;\n onWithdrawLocked?: () => void;\n onOwnDepositLocked?: () => void;\n onDepositLocked?: () => void;\n closeTx?: string;\n}\n\nexport interface ChannelFsm {\n handler: ChannelHandler;\n state?: ChannelState | {\n resolve: Function;\n reject: Function;\n };\n}\n\nexport interface ChannelMessage {\n id?: number;\n method: string;\n params: any;\n payload?: any;\n data?: any;\n error?: ChannelMessageError;\n}\n\ninterface ChannelMessageError {\n code: number;\n message: string;\n data: [{\n message: string;\n code: number;\n }];\n request: ChannelMessage;\n}\n\n// Send ping message every 10 seconds\nconst PING_TIMEOUT_MS = 10000;\n// Close connection if pong message is not received within 15 seconds\nconst PONG_TIMEOUT_MS = 15000;\n\nexport function emit<E extends keyof ChannelEvents>(\n channel: Channel,\n ...args: [E, ...Parameters<ChannelEvents[E]>]\n): void {\n const [eventName, ...rest] = args;\n channel._eventEmitter.emit(eventName, ...rest);\n}\n\nfunction enterState(channel: Channel, nextState: ChannelFsm): void {\n if (nextState == null) {\n throw new UnknownChannelStateError();\n }\n channel._debug('enter state', nextState.handler.name);\n channel._fsm = nextState;\n if (nextState?.handler?.enter != null) {\n nextState.handler.enter(channel);\n }\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n void dequeueAction(channel);\n}\n\n// TODO: rewrite to enum\nexport type ChannelStatus = 'connecting' | 'connected' | 'accepted' | 'halfSigned' | 'signed'\n| 'open' | 'closing' | 'closed' | 'died' | 'disconnected';\n\nexport function changeStatus(channel: Channel, newStatus: ChannelStatus, debug?: unknown): void {\n channel._debug(newStatus, `(prev. ${channel._status})`, debug ?? '');\n if (newStatus === channel._status) return;\n channel._status = newStatus;\n emit(channel, 'statusChanged', newStatus);\n}\n\nexport function changeState(channel: Channel, newState: Encoded.Transaction | ''): void {\n channel._state = newState;\n emit(channel, 'stateChanged', newState);\n}\n\nfunction send(channel: Channel, message: ChannelMessage): void {\n channel._debug('send message', message.method, message.params);\n channel._websocket.send(JsonBig.stringify({ jsonrpc: '2.0', ...message }));\n}\n\nexport function notify(channel: Channel, method: string, params: object = {}): void {\n send(channel, { method, params });\n}\n\nasync function dequeueAction(channel: Channel): Promise<void> {\n if (channel._isActionQueueLocked) return;\n const queue = channel._actionQueue;\n if (queue.length === 0) return;\n const index = queue.findIndex((action) => action.guard(channel, channel._fsm));\n if (index === -1) return;\n channel._actionQueue = queue.filter((_, i) => index !== i);\n channel._isActionQueueLocked = true;\n const nextState: ChannelFsm = await queue[index].action(channel, channel._fsm);\n channel._isActionQueueLocked = false;\n enterState(channel, nextState);\n}\n\nexport async function enqueueAction(\n channel: Channel,\n guard: ChannelAction['guard'],\n action: () => { handler: ChannelHandler; state?: Partial<ChannelState> },\n): Promise<any> {\n const promise = new Promise((resolve, reject) => {\n channel._actionQueue.push({\n guard,\n action() {\n const res = action();\n return { ...res, state: { ...res.state, resolve, reject } };\n },\n });\n });\n void dequeueAction(channel);\n return promise;\n}\n\nasync function handleMessage(channel: Channel, message: ChannelMessage): Promise<void> {\n const { handler, state: st } = channel._fsm;\n const nextState = await Promise.resolve(handler(channel, message, st));\n enterState(channel, nextState);\n // TODO: emit message and handler name (?) to move this code to Contract constructor\n if (\n message?.params?.data?.updates?.[0]?.op === 'OffChainNewContract'\n // if name is channelOpen, the contract was created by other participant\n && nextState?.handler.name === 'channelOpen'\n ) {\n const round = channel.round();\n if (round == null) throw new UnexpectedTsError('Round is null');\n const owner = message?.params?.data?.updates?.[0]?.owner;\n emit(channel, 'newContract', encodeContractAddress(owner, round + 1));\n }\n}\n\nasync function dequeueMessage(channel: Channel): Promise<void> {\n if (channel._isMessageQueueLocked) return;\n channel._isMessageQueueLocked = true;\n while (channel._messageQueue.length > 0) {\n const message = channel._messageQueue.shift();\n if (message == null) throw new UnexpectedTsError();\n try {\n await handleMessage(channel, message);\n } catch (error) {\n ensureError(error);\n emit(channel, 'error', new ChannelIncomingMessageError(error, message));\n }\n }\n channel._isMessageQueueLocked = false;\n}\n\nexport function disconnect(channel: Channel): void {\n channel._websocket.close();\n clearTimeout(channel._pingTimeoutId);\n}\n\nfunction ping(channel: Channel): void {\n clearTimeout(channel._pingTimeoutId);\n channel._pingTimeoutId = setTimeout(() => {\n notify(channel, 'channels.system', { action: 'ping' });\n channel._pingTimeoutId = setTimeout(() => {\n disconnect(channel);\n emit(channel, 'error', new ChannelPingTimedOutError());\n }, PONG_TIMEOUT_MS);\n }, PING_TIMEOUT_MS);\n}\n\nfunction onMessage(channel: Channel, data: string): void {\n const message = JsonBig.parse(data);\n channel._debug('received message', message.method, message.params);\n if (message.id != null) {\n const callback = channel._rpcCallbacks.get(message.id);\n if (callback == null) {\n emit(channel, 'error', new ChannelError(`Can't find callback by id: ${message.id}`));\n return;\n }\n try {\n callback(message);\n } finally {\n channel._rpcCallbacks.delete(message.id);\n }\n return;\n }\n if (message.method === 'channels.message') {\n emit(channel, 'message', message.params.data.message);\n return;\n }\n if (message.method === 'channels.system.pong') {\n if (message.params.channel_id === channel._channelId || channel._channelId == null) {\n ping(channel);\n }\n return;\n }\n channel._messageQueue.push(message);\n void dequeueMessage(channel);\n}\n\nexport async function call(channel: Channel, method: string, params: any): Promise<any> {\n return new Promise((resolve, reject) => {\n const id = channel._nextRpcMessageId;\n channel._nextRpcMessageId += 1;\n channel._rpcCallbacks.set(id, (\n message: { result: PromiseLike<any>; error?: ChannelMessageError },\n ) => {\n if (message.error != null) {\n const details = message.error.data[0].message ?? '';\n reject(new ChannelCallError(message.error.message + details));\n } else resolve(message.result);\n });\n send(channel, { method, id, params });\n });\n}\n\nexport async function initialize(\n channel: Channel,\n connectionHandler: Function,\n openHandler: Function,\n { url, ...channelOptions }: ChannelOptions,\n): Promise<void> {\n channel._options = { url, ...channelOptions };\n\n const wsUrl = new URL(url);\n Object.entries(channelOptions)\n .filter(([key]) => !['sign', 'debug'].includes(key))\n .forEach(([key, value]) => wsUrl.searchParams.set(pascalToSnake(key), value.toString()));\n wsUrl.searchParams.set('protocol', 'json-rpc');\n changeStatus(channel, 'connecting');\n channel._websocket = new W3CWebSocket(wsUrl.toString());\n await new Promise<void>((resolve, reject) => {\n Object.assign(channel._websocket, {\n onerror: reject,\n onopen: async (event: Event) => {\n resolve();\n changeStatus(channel, 'connected', event);\n if (channelOptions.reconnectTx != null) {\n enterState(channel, { handler: openHandler });\n const { signedTx } = await channel.state();\n if (signedTx == null) {\n throw new ChannelError('`signedTx` missed in state while reconnection');\n }\n changeState(channel, buildTx(signedTx));\n } else {\n enterState(channel, { handler: connectionHandler });\n }\n ping(channel);\n },\n onclose: (event: ICloseEvent) => {\n changeStatus(channel, 'disconnected', event);\n clearTimeout(channel._pingTimeoutId);\n },\n onmessage: ({ data }: { data: string }) => onMessage(channel, data),\n });\n });\n}\n"],"mappings":"AAAA,OAAAA,UAAA,MAA0D,WAAW;AAAC;EAAAC,YAAA,EAAAC;AAAA,IAAAF,UAAA;AAAA,OAG/DG,OAAO;AAAA,SACLC,aAAa;AAAA,SAIpBC,gBAAgB,EAChBC,wBAAwB,EACxBC,iBAAiB,EACjBC,wBAAwB,EACxBC,2BAA2B,EAC3BC,YAAY;AAAA,SAELC,qBAAqB;AAAA,SACrBC,OAAO;AAAA,SACPC,WAAW,8BA6BpB;AAKA;AACA;AACA;AA8LA;AACA,MAAMC,eAAe,GAAG,KAAK;AAC7B;AACA,MAAMC,eAAe,GAAG,KAAK;AAE7B,OAAO,SAASC,IAAIA,CAClBC,OAAgB,EAChB,GAAGC,IAA0C,EACvC;EACN,MAAM,CAACC,SAAS,EAAE,GAAGC,IAAI,CAAC,GAAGF,IAAI;EACjCD,OAAO,CAACI,aAAa,CAACL,IAAI,CAACG,SAAS,EAAE,GAAGC,IAAI,CAAC;AAChD;AAEA,SAASE,UAAUA,CAACL,OAAgB,EAAEM,SAAqB,EAAQ;EAAA,IAAAC,kBAAA;EACjE,IAAID,SAAS,IAAI,IAAI,EAAE;IACrB,MAAM,IAAIf,wBAAwB,CAAC,CAAC;EACtC;EACAS,OAAO,CAACQ,MAAM,CAAC,aAAa,EAAEF,SAAS,CAACG,OAAO,CAACC,IAAI,CAAC;EACrDV,OAAO,CAACW,IAAI,GAAGL,SAAS;EACxB,IAAI,CAAAA,SAAS,aAATA,SAAS,gBAAAC,kBAAA,GAATD,SAAS,CAAEG,OAAO,cAAAF,kBAAA,uBAAlBA,kBAAA,CAAoBK,KAAK,KAAI,IAAI,EAAE;IACrCN,SAAS,CAACG,OAAO,CAACG,KAAK,CAACZ,OAAO,CAAC;EAClC;EACA;EACA,KAAKa,aAAa,CAACb,OAAO,CAAC;AAC7B;;AAEA;;AAIA,OAAO,SAASc,YAAYA,CAACd,OAAgB,EAAEe,SAAwB,EAAEC,KAAe,EAAQ;EAC9FhB,OAAO,CAACQ,MAAM,CAACO,SAAS,EAAG,UAASf,OAAO,CAACiB,OAAQ,GAAE,EAAED,KAAK,aAALA,KAAK,cAALA,KAAK,GAAI,EAAE,CAAC;EACpE,IAAID,SAAS,KAAKf,OAAO,CAACiB,OAAO,EAAE;EACnCjB,OAAO,CAACiB,OAAO,GAAGF,SAAS;EAC3BhB,IAAI,CAACC,OAAO,EAAE,eAAe,EAAEe,SAAS,CAAC;AAC3C;AAEA,OAAO,SAASG,WAAWA,CAAClB,OAAgB,EAAEmB,QAAkC,EAAQ;EACtFnB,OAAO,CAACoB,MAAM,GAAGD,QAAQ;EACzBpB,IAAI,CAACC,OAAO,EAAE,cAAc,EAAEmB,QAAQ,CAAC;AACzC;AAEA,SAASE,IAAIA,CAACrB,OAAgB,EAAEsB,OAAuB,EAAQ;EAC7DtB,OAAO,CAACQ,MAAM,CAAC,cAAc,EAAEc,OAAO,CAACC,MAAM,EAAED,OAAO,CAACE,MAAM,CAAC;EAC9DxB,OAAO,CAACjB,UAAU,CAACsC,IAAI,CAACnC,OAAO,CAACuC,SAAS,CAAC;IAAEC,OAAO,EAAE,KAAK;IAAE,GAAGJ;EAAQ,CAAC,CAAC,CAAC;AAC5E;AAEA,OAAO,SAASK,MAAMA,CAAC3B,OAAgB,EAAEuB,MAAc,EAAEC,MAAc,GAAG,CAAC,CAAC,EAAQ;EAClFH,IAAI,CAACrB,OAAO,EAAE;IAAEuB,MAAM;IAAEC;EAAO,CAAC,CAAC;AACnC;AAEA,eAAeX,aAAaA,CAACb,OAAgB,EAAiB;EAC5D,IAAIA,OAAO,CAAC4B,oBAAoB,EAAE;EAClC,MAAMC,KAAK,GAAG7B,OAAO,CAAC8B,YAAY;EAClC,IAAID,KAAK,CAACE,MAAM,KAAK,CAAC,EAAE;EACxB,MAAMC,KAAK,GAAGH,KAAK,CAACI,SAAS,CAAEC,MAAM,IAAKA,MAAM,CAACC,KAAK,CAACnC,OAAO,EAAEA,OAAO,CAACW,IAAI,CAAC,CAAC;EAC9E,IAAIqB,KAAK,KAAK,CAAC,CAAC,EAAE;EAClBhC,OAAO,CAAC8B,YAAY,GAAGD,KAAK,CAACO,MAAM,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKN,KAAK,KAAKM,CAAC,CAAC;EAC1DtC,OAAO,CAAC4B,oBAAoB,GAAG,IAAI;EACnC,MAAMtB,SAAqB,GAAG,MAAMuB,KAAK,CAACG,KAAK,CAAC,CAACE,MAAM,CAAClC,OAAO,EAAEA,OAAO,CAACW,IAAI,CAAC;EAC9EX,OAAO,CAAC4B,oBAAoB,GAAG,KAAK;EACpCvB,UAAU,CAACL,OAAO,EAAEM,SAAS,CAAC;AAChC;AAEA,OAAO,eAAeiC,aAAaA,CACjCvC,OAAgB,EAChBmC,KAA6B,EAC7BD,MAAwE,EAC1D;EACd,MAAMM,OAAO,GAAG,IAAIC,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;IAC/C3C,OAAO,CAAC8B,YAAY,CAACc,IAAI,CAAC;MACxBT,KAAK;MACLD,MAAMA,CAAA,EAAG;QACP,MAAMW,GAAG,GAAGX,MAAM,CAAC,CAAC;QACpB,OAAO;UAAE,GAAGW,GAAG;UAAEC,KAAK,EAAE;YAAE,GAAGD,GAAG,CAACC,KAAK;YAAEJ,OAAO;YAAEC;UAAO;QAAE,CAAC;MAC7D;IACF,CAAC,CAAC;EACJ,CAAC,CAAC;EACF,KAAK9B,aAAa,CAACb,OAAO,CAAC;EAC3B,OAAOwC,OAAO;AAChB;AAEA,eAAeO,aAAaA,CAAC/C,OAAgB,EAAEsB,OAAuB,EAAiB;EAAA,IAAA0B,eAAA;EACrF,MAAM;IAAEvC,OAAO;IAAEqC,KAAK,EAAEG;EAAG,CAAC,GAAGjD,OAAO,CAACW,IAAI;EAC3C,MAAML,SAAS,GAAG,MAAMmC,OAAO,CAACC,OAAO,CAACjC,OAAO,CAACT,OAAO,EAAEsB,OAAO,EAAE2B,EAAE,CAAC,CAAC;EACtE5C,UAAU,CAACL,OAAO,EAAEM,SAAS,CAAC;EAC9B;EACA,IACE,CAAAgB,OAAO,aAAPA,OAAO,gBAAA0B,eAAA,GAAP1B,OAAO,CAAEE,MAAM,cAAAwB,eAAA,gBAAAA,eAAA,GAAfA,eAAA,CAAiBE,IAAI,cAAAF,eAAA,gBAAAA,eAAA,GAArBA,eAAA,CAAuBG,OAAO,cAAAH,eAAA,gBAAAA,eAAA,GAA9BA,eAAA,CAAiC,CAAC,CAAC,cAAAA,eAAA,uBAAnCA,eAAA,CAAqCI,EAAE,MAAK;EAC5C;EAAA,GACG,CAAA9C,SAAS,aAATA,SAAS,uBAATA,SAAS,CAAEG,OAAO,CAACC,IAAI,MAAK,aAAa,EAC5C;IAAA,IAAA2C,gBAAA;IACA,MAAMC,KAAK,GAAGtD,OAAO,CAACsD,KAAK,CAAC,CAAC;IAC7B,IAAIA,KAAK,IAAI,IAAI,EAAE,MAAM,IAAIhE,iBAAiB,CAAC,eAAe,CAAC;IAC/D,MAAMiE,KAAK,GAAGjC,OAAO,aAAPA,OAAO,gBAAA+B,gBAAA,GAAP/B,OAAO,CAAEE,MAAM,cAAA6B,gBAAA,gBAAAA,gBAAA,GAAfA,gBAAA,CAAiBH,IAAI,cAAAG,gBAAA,gBAAAA,gBAAA,GAArBA,gBAAA,CAAuBF,OAAO,cAAAE,gBAAA,gBAAAA,gBAAA,GAA9BA,gBAAA,CAAiC,CAAC,CAAC,cAAAA,gBAAA,uBAAnCA,gBAAA,CAAqCE,KAAK;IACxDxD,IAAI,CAACC,OAAO,EAAE,aAAa,EAAEN,qBAAqB,CAAC6D,KAAK,EAAED,KAAK,GAAG,CAAC,CAAC,CAAC;EACvE;AACF;AAEA,eAAeE,cAAcA,CAACxD,OAAgB,EAAiB;EAC7D,IAAIA,OAAO,CAACyD,qBAAqB,EAAE;EACnCzD,OAAO,CAACyD,qBAAqB,GAAG,IAAI;EACpC,OAAOzD,OAAO,CAAC0D,aAAa,CAAC3B,MAAM,GAAG,CAAC,EAAE;IACvC,MAAMT,OAAO,GAAGtB,OAAO,CAAC0D,aAAa,CAACC,KAAK,CAAC,CAAC;IAC7C,IAAIrC,OAAO,IAAI,IAAI,EAAE,MAAM,IAAIhC,iBAAiB,CAAC,CAAC;IAClD,IAAI;MACF,MAAMyD,aAAa,CAAC/C,OAAO,EAAEsB,OAAO,CAAC;IACvC,CAAC,CAAC,OAAOsC,KAAK,EAAE;MACdhE,WAAW,CAACgE,KAAK,CAAC;MAClB7D,IAAI,CAACC,OAAO,EAAE,OAAO,EAAE,IAAIR,2BAA2B,CAACoE,KAAK,EAAEtC,OAAO,CAAC,CAAC;IACzE;EACF;EACAtB,OAAO,CAACyD,qBAAqB,GAAG,KAAK;AACvC;AAEA,OAAO,SAASI,UAAUA,CAAC7D,OAAgB,EAAQ;EACjDA,OAAO,CAACjB,UAAU,CAAC+E,KAAK,CAAC,CAAC;EAC1BC,YAAY,CAAC/D,OAAO,CAACgE,cAAc,CAAC;AACtC;AAEA,SAASC,IAAIA,CAACjE,OAAgB,EAAQ;EACpC+D,YAAY,CAAC/D,OAAO,CAACgE,cAAc,CAAC;EACpChE,OAAO,CAACgE,cAAc,GAAGE,UAAU,CAAC,MAAM;IACxCvC,MAAM,CAAC3B,OAAO,EAAE,iBAAiB,EAAE;MAAEkC,MAAM,EAAE;IAAO,CAAC,CAAC;IACtDlC,OAAO,CAACgE,cAAc,GAAGE,UAAU,CAAC,MAAM;MACxCL,UAAU,CAAC7D,OAAO,CAAC;MACnBD,IAAI,CAACC,OAAO,EAAE,OAAO,EAAE,IAAIX,wBAAwB,CAAC,CAAC,CAAC;IACxD,CAAC,EAAES,eAAe,CAAC;EACrB,CAAC,EAAED,eAAe,CAAC;AACrB;AAEA,SAASsE,SAASA,CAACnE,OAAgB,EAAEkD,IAAY,EAAQ;EACvD,MAAM5B,OAAO,GAAGpC,OAAO,CAACkF,KAAK,CAAClB,IAAI,CAAC;EACnClD,OAAO,CAACQ,MAAM,CAAC,kBAAkB,EAAEc,OAAO,CAACC,MAAM,EAAED,OAAO,CAACE,MAAM,CAAC;EAClE,IAAIF,OAAO,CAAC+C,EAAE,IAAI,IAAI,EAAE;IACtB,MAAMC,QAAQ,GAAGtE,OAAO,CAACuE,aAAa,CAACC,GAAG,CAAClD,OAAO,CAAC+C,EAAE,CAAC;IACtD,IAAIC,QAAQ,IAAI,IAAI,EAAE;MACpBvE,IAAI,CAACC,OAAO,EAAE,OAAO,EAAE,IAAIP,YAAY,CAAE,8BAA6B6B,OAAO,CAAC+C,EAAG,EAAC,CAAC,CAAC;MACpF;IACF;IACA,IAAI;MACFC,QAAQ,CAAChD,OAAO,CAAC;IACnB,CAAC,SAAS;MACRtB,OAAO,CAACuE,aAAa,CAACE,MAAM,CAACnD,OAAO,CAAC+C,EAAE,CAAC;IAC1C;IACA;EACF;EACA,IAAI/C,OAAO,CAACC,MAAM,KAAK,kBAAkB,EAAE;IACzCxB,IAAI,CAACC,OAAO,EAAE,SAAS,EAAEsB,OAAO,CAACE,MAAM,CAAC0B,IAAI,CAAC5B,OAAO,CAAC;IACrD;EACF;EACA,IAAIA,OAAO,CAACC,MAAM,KAAK,sBAAsB,EAAE;IAC7C,IAAID,OAAO,CAACE,MAAM,CAACkD,UAAU,KAAK1E,OAAO,CAAC2E,UAAU,IAAI3E,OAAO,CAAC2E,UAAU,IAAI,IAAI,EAAE;MAClFV,IAAI,CAACjE,OAAO,CAAC;IACf;IACA;EACF;EACAA,OAAO,CAAC0D,aAAa,CAACd,IAAI,CAACtB,OAAO,CAAC;EACnC,KAAKkC,cAAc,CAACxD,OAAO,CAAC;AAC9B;AAEA,OAAO,eAAe4E,IAAIA,CAAC5E,OAAgB,EAAEuB,MAAc,EAAEC,MAAW,EAAgB;EACtF,OAAO,IAAIiB,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;IACtC,MAAM0B,EAAE,GAAGrE,OAAO,CAAC6E,iBAAiB;IACpC7E,OAAO,CAAC6E,iBAAiB,IAAI,CAAC;IAC9B7E,OAAO,CAACuE,aAAa,CAACO,GAAG,CAACT,EAAE,EAC1B/C,OAAkE,IAC/D;MACH,IAAIA,OAAO,CAACsC,KAAK,IAAI,IAAI,EAAE;QAAA,IAAAmB,oBAAA;QACzB,MAAMC,OAAO,IAAAD,oBAAA,GAAGzD,OAAO,CAACsC,KAAK,CAACV,IAAI,CAAC,CAAC,CAAC,CAAC5B,OAAO,cAAAyD,oBAAA,cAAAA,oBAAA,GAAI,EAAE;QACnDpC,MAAM,CAAC,IAAIvD,gBAAgB,CAACkC,OAAO,CAACsC,KAAK,CAACtC,OAAO,GAAG0D,OAAO,CAAC,CAAC;MAC/D,CAAC,MAAMtC,OAAO,CAACpB,OAAO,CAAC2D,MAAM,CAAC;IAChC,CAAC,CAAC;IACF5D,IAAI,CAACrB,OAAO,EAAE;MAAEuB,MAAM;MAAE8C,EAAE;MAAE7C;IAAO,CAAC,CAAC;EACvC,CAAC,CAAC;AACJ;AAEA,OAAO,eAAe0D,UAAUA,CAC9BlF,OAAgB,EAChBmF,iBAA2B,EAC3BC,WAAqB,EACrB;EAAEC,GAAG;EAAE,GAAGC;AAA+B,CAAC,EAC3B;EACftF,OAAO,CAACuF,QAAQ,GAAG;IAAEF,GAAG;IAAE,GAAGC;EAAe,CAAC;EAE7C,MAAME,KAAK,GAAG,IAAIC,GAAG,CAACJ,GAAG,CAAC;EAC1BK,MAAM,CAACC,OAAO,CAACL,cAAc,CAAC,CAC3BlD,MAAM,CAAC,CAAC,CAACwD,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAACC,QAAQ,CAACD,GAAG,CAAC,CAAC,CACnDE,OAAO,CAAC,CAAC,CAACF,GAAG,EAAEG,KAAK,CAAC,KAAKP,KAAK,CAACQ,YAAY,CAAClB,GAAG,CAAC3F,aAAa,CAACyG,GAAG,CAAC,EAAEG,KAAK,CAACE,QAAQ,CAAC,CAAC,CAAC,CAAC;EAC1FT,KAAK,CAACQ,YAAY,CAAClB,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC;EAC9ChE,YAAY,CAACd,OAAO,EAAE,YAAY,CAAC;EACnCA,OAAO,CAACjB,UAAU,GAAG,IAAIE,YAAY,CAACuG,KAAK,CAACS,QAAQ,CAAC,CAAC,CAAC;EACvD,MAAM,IAAIxD,OAAO,CAAO,CAACC,OAAO,EAAEC,MAAM,KAAK;IAC3C+C,MAAM,CAACQ,MAAM,CAAClG,OAAO,CAACjB,UAAU,EAAE;MAChCoH,OAAO,EAAExD,MAAM;MACfyD,MAAM,EAAE,MAAOC,KAAY,IAAK;QAC9B3D,OAAO,CAAC,CAAC;QACT5B,YAAY,CAACd,OAAO,EAAE,WAAW,EAAEqG,KAAK,CAAC;QACzC,IAAIf,cAAc,CAACgB,WAAW,IAAI,IAAI,EAAE;UACtCjG,UAAU,CAACL,OAAO,EAAE;YAAES,OAAO,EAAE2E;UAAY,CAAC,CAAC;UAC7C,MAAM;YAAEmB;UAAS,CAAC,GAAG,MAAMvG,OAAO,CAAC8C,KAAK,CAAC,CAAC;UAC1C,IAAIyD,QAAQ,IAAI,IAAI,EAAE;YACpB,MAAM,IAAI9G,YAAY,CAAC,+CAA+C,CAAC;UACzE;UACAyB,WAAW,CAAClB,OAAO,EAAEL,OAAO,CAAC4G,QAAQ,CAAC,CAAC;QACzC,CAAC,MAAM;UACLlG,UAAU,CAACL,OAAO,EAAE;YAAES,OAAO,EAAE0E;UAAkB,CAAC,CAAC;QACrD;QACAlB,IAAI,CAACjE,OAAO,CAAC;MACf,CAAC;MACDwG,OAAO,EAAGH,KAAkB,IAAK;QAC/BvF,YAAY,CAACd,OAAO,EAAE,cAAc,EAAEqG,KAAK,CAAC;QAC5CtC,YAAY,CAAC/D,OAAO,CAACgE,cAAc,CAAC;MACtC,CAAC;MACDyC,SAAS,EAAEA,CAAC;QAAEvD;MAAuB,CAAC,KAAKiB,SAAS,CAACnE,OAAO,EAAEkD,IAAI;IACpE,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ"}
@@ -52,6 +52,15 @@ export function nameToPunycode(maybeName) {
52
52
  if (/\p{Emoji_Presentation}/u.test(name)) {
53
53
  throw new ArgumentError('aens name', 'not containing emoji', maybeName);
54
54
  }
55
+ if (name[2] === '-' && name[3] === '-') {
56
+ throw new ArgumentError('aens name', 'without "-" char in both the third and fourth positions', maybeName);
57
+ }
58
+ if (name[0] === '-') {
59
+ throw new ArgumentError('aens name', 'starting with no "-" char', maybeName);
60
+ }
61
+ if (name.at(-1) === '-') {
62
+ throw new ArgumentError('aens name', 'ending with no "-" char', maybeName);
63
+ }
55
64
  let punycode;
56
65
  try {
57
66
  const u = new URL(`http://${name}.${suffix}`);