@tezos-x/octez.connect-wallet 4.8.4 → 4.8.5

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.
@@ -2,6 +2,7 @@ import { Client } from '@tezos-x/octez.connect-core';
2
2
  import { ExposedPromise } from '@tezos-x/octez.connect-utils';
3
3
  import { ConnectionContext, ExtendedP2PPairingResponse, PeerInfo, TransportType, BeaconRequestOutputMessage, BeaconResponseInputMessage, AppMetadata, PermissionInfo, PushToken } from '@tezos-x/octez.connect-types';
4
4
  import { WalletClientOptions } from './WalletClientOptions';
5
+ type DisconnectListener = (senderId: string) => void | Promise<void>;
5
6
  /**
6
7
  * @publicapi
7
8
  *
@@ -22,6 +23,7 @@ export declare class WalletClient extends Client {
22
23
  * This array stores pending requests, meaning requests we received and have not yet handled / sent a response.
23
24
  */
24
25
  private pendingRequests;
26
+ private readonly disconnectListeners;
25
27
  constructor(config: WalletClientOptions);
26
28
  init(): Promise<TransportType>;
27
29
  /**
@@ -31,6 +33,17 @@ export declare class WalletClient extends Client {
31
33
  * @param newMessageCallback The callback that will be invoked for every message the transport receives.
32
34
  */
33
35
  connect(newMessageCallback: (message: BeaconRequestOutputMessage, connectionContext: ConnectionContext) => void): Promise<void>;
36
+ /**
37
+ * Subscribe to inbound disconnects from known peers. Duplicate listener identities are ignored.
38
+ *
39
+ * Listeners are notified after local peer cleanup is attempted. Listener failures are logged and do
40
+ * not prevent other listeners from running.
41
+ */
42
+ subscribeToDisconnect(listener: DisconnectListener): void;
43
+ /**
44
+ * Unsubscribe a disconnect listener by identity.
45
+ */
46
+ unsubscribeFromDisconnect(listener: DisconnectListener): void;
34
47
  getRegisterPushChallenge(backendUrl: string, accountPublicKey: string, oracleUrl?: string): Promise<{
35
48
  challenge: {
36
49
  id: string;
@@ -82,4 +95,7 @@ export declare class WalletClient extends Client {
82
95
  */
83
96
  private respondToMessage;
84
97
  private disconnect;
98
+ private notifyDisconnectListeners;
99
+ private getDisconnectSenderId;
85
100
  }
101
+ export {};
@@ -39,6 +39,7 @@ class WalletClient extends octez_connect_core_1.Client {
39
39
  * This array stores pending requests, meaning requests we received and have not yet handled / sent a response.
40
40
  */
41
41
  this.pendingRequests = [];
42
+ this.disconnectListeners = new Set();
42
43
  this.permissionManager = new octez_connect_core_1.PermissionManager(this.storage);
43
44
  this.appMetadataManager = new octez_connect_core_1.AppMetadataManager(this.storage);
44
45
  }
@@ -63,8 +64,9 @@ class WalletClient extends octez_connect_core_1.Client {
63
64
  this.handleResponse = (message, connectionContext) => __awaiter(this, void 0, void 0, function* () {
64
65
  if (message.version === '3') {
65
66
  const typedMessage = message;
66
- if (typedMessage.message.type === octez_connect_types_1.BeaconMessageType.Disconnect) {
67
- return this.disconnect(typedMessage.senderId);
67
+ const disconnectSenderId = this.getDisconnectSenderId(message);
68
+ if (disconnectSenderId) {
69
+ return this.disconnect(disconnectSenderId);
68
70
  }
69
71
  if (!this.pendingRequests.some((request) => request[0].id === message.id)) {
70
72
  this.pendingRequests.push([typedMessage, connectionContext]);
@@ -99,6 +101,21 @@ class WalletClient extends octez_connect_core_1.Client {
99
101
  return this._connect();
100
102
  });
101
103
  }
104
+ /**
105
+ * Subscribe to inbound disconnects from known peers. Duplicate listener identities are ignored.
106
+ *
107
+ * Listeners are notified after local peer cleanup is attempted. Listener failures are logged and do
108
+ * not prevent other listeners from running.
109
+ */
110
+ subscribeToDisconnect(listener) {
111
+ this.disconnectListeners.add(listener);
112
+ }
113
+ /**
114
+ * Unsubscribe a disconnect listener by identity.
115
+ */
116
+ unsubscribeFromDisconnect(listener) {
117
+ this.disconnectListeners.delete(listener);
118
+ }
102
119
  getRegisterPushChallenge(backendUrl_1, accountPublicKey_1) {
103
120
  return __awaiter(this, arguments, void 0, function* (backendUrl, accountPublicKey, oracleUrl = octez_connect_core_1.NOTIFICATION_ORACLE_URL) {
104
121
  // Check if account is already registered
@@ -358,13 +375,45 @@ class WalletClient extends octez_connect_core_1.Client {
358
375
  const transport = yield this.transport;
359
376
  const peers = yield transport.getPeers();
360
377
  const peer = peers.find((peerEl) => peerEl.senderId === senderId);
361
- if (peer) {
378
+ if (!peer) {
379
+ return;
380
+ }
381
+ let removePeerError;
382
+ try {
362
383
  yield this.removePeer(peer);
363
384
  }
364
- yield transport.disconnect();
365
- return;
385
+ catch (error) {
386
+ removePeerError = error;
387
+ }
388
+ this.notifyDisconnectListeners(senderId);
389
+ if (removePeerError) {
390
+ throw removePeerError;
391
+ }
366
392
  });
367
393
  }
394
+ notifyDisconnectListeners(senderId) {
395
+ for (const listener of Array.from(this.disconnectListeners)) {
396
+ try {
397
+ Promise.resolve(listener(senderId)).catch((error) => {
398
+ logger.error('disconnect listener', error);
399
+ });
400
+ }
401
+ catch (error) {
402
+ logger.error('disconnect listener', error);
403
+ }
404
+ }
405
+ }
406
+ getDisconnectSenderId(message) {
407
+ var _a;
408
+ if (message.version === '3') {
409
+ const wrappedMessage = message;
410
+ if (((_a = wrappedMessage.message) === null || _a === void 0 ? void 0 : _a.type) === octez_connect_types_1.BeaconMessageType.Disconnect) {
411
+ return wrappedMessage.senderId;
412
+ }
413
+ }
414
+ const typedMessage = message;
415
+ return typedMessage.type === octez_connect_types_1.BeaconMessageType.Disconnect ? typedMessage.senderId : undefined;
416
+ }
368
417
  }
369
418
  exports.WalletClient = WalletClient;
370
419
  //# sourceMappingURL=WalletClient.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WalletClient.js","sourceRoot":"","sources":["../../../src/client/WalletClient.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Serializer,\n Client,\n LocalStorage,\n PermissionManager,\n AppMetadataManager,\n getSenderId,\n Logger,\n NOTIFICATION_ORACLE_URL\n} from '@tezos-x/octez.connect-core'\n\nimport { ExposedPromise, toHex } from '@tezos-x/octez.connect-utils'\n\nimport {\n ConnectionContext,\n BeaconRequestMessage,\n BeaconMessageType,\n AcknowledgeResponseInput,\n ExtendedP2PPairingResponse,\n ExtendedPeerInfo,\n PeerInfo,\n DisconnectMessage,\n TransportType,\n BeaconRequestOutputMessage,\n BeaconResponseInputMessage,\n AppMetadata,\n PermissionInfo,\n TransportStatus,\n BeaconMessage,\n BeaconMessageWrapper,\n BeaconBaseMessage,\n StorageKey,\n PushToken,\n PostMessagePairingRequest,\n ExtendedPostMessagePairingRequest,\n P2PPairingRequest,\n ExtendedP2PPairingRequest,\n ExtendedWalletConnectPairingRequest\n} from '@tezos-x/octez.connect-types'\nimport { WalletClientOptions } from './WalletClientOptions'\nimport { WalletP2PTransport } from '../transports/WalletP2PTransport'\nimport { IncomingRequestInterceptor } from '../interceptors/IncomingRequestInterceptor'\nimport { OutgoingResponseInterceptor } from '../interceptors/OutgoingResponseInterceptor'\n\nconst logger = new Logger('WalletClient')\n\n/**\n * @publicapi\n *\n * The WalletClient has to be used in the wallet. It handles all the logic related to connecting to beacon-compatible\n * dapps and handling/responding to requests.\n *\n * @category Wallet\n */\nexport class WalletClient extends Client {\n /**\n * Returns whether or not the transport is connected\n */\n protected readonly _isConnected: ExposedPromise<boolean> = new ExposedPromise()\n public get isConnected(): Promise<boolean> {\n return this._isConnected.promise\n }\n\n private readonly permissionManager: PermissionManager\n private readonly appMetadataManager: AppMetadataManager\n\n /**\n * This array stores pending requests, meaning requests we received and have not yet handled / sent a response.\n */\n private pendingRequests: [\n BeaconRequestMessage | BeaconMessageWrapper<BeaconBaseMessage>,\n ConnectionContext\n ][] = []\n\n constructor(config: WalletClientOptions) {\n super({\n storage: config && config.storage ? config.storage : new LocalStorage(),\n ...config\n })\n this.permissionManager = new PermissionManager(this.storage)\n this.appMetadataManager = new AppMetadataManager(this.storage)\n }\n\n public async init(): Promise<TransportType> {\n const keyPair = await this.keyPair // We wait for keypair here so the P2P Transport creation is not delayed and causing issues\n const p2pTransport = new WalletP2PTransport(\n this.name,\n keyPair,\n this.storage,\n this.matrixNodes,\n this.iconUrl,\n this.appUrl\n )\n\n return super.init(p2pTransport)\n }\n\n /**\n * This method initiates a connection to the P2P network and registers a callback that will be called\n * whenever a message is received.\n *\n * @param newMessageCallback The callback that will be invoked for every message the transport receives.\n */\n public async connect(\n newMessageCallback: (\n message: BeaconRequestOutputMessage,\n connectionContext: ConnectionContext\n ) => void\n ): Promise<void> {\n this.handleResponse = async (\n message: BeaconRequestMessage | BeaconMessageWrapper<BeaconBaseMessage> | DisconnectMessage,\n connectionContext: ConnectionContext\n ): Promise<void> => {\n if (message.version === '3') {\n const typedMessage = message as BeaconMessageWrapper<BeaconBaseMessage>\n\n if (typedMessage.message.type === BeaconMessageType.Disconnect) {\n return this.disconnect(typedMessage.senderId)\n }\n\n if (!this.pendingRequests.some((request) => request[0].id === message.id)) {\n this.pendingRequests.push([typedMessage, connectionContext])\n\n await this.sendAcknowledgeResponse(typedMessage, connectionContext)\n\n await IncomingRequestInterceptor.intercept({\n message: typedMessage,\n connectionInfo: connectionContext,\n appMetadataManager: this.appMetadataManager,\n interceptorCallback: newMessageCallback\n })\n }\n } else {\n const typedMessage = message as BeaconRequestMessage | DisconnectMessage\n\n if (typedMessage.type === BeaconMessageType.Disconnect) {\n return this.disconnect(typedMessage.senderId)\n }\n\n if (!this.pendingRequests.some((request) => request[0].id === message.id)) {\n this.pendingRequests.push([typedMessage, connectionContext])\n\n if (typedMessage.version !== '1') {\n await this.sendAcknowledgeResponse(typedMessage, connectionContext)\n }\n\n await IncomingRequestInterceptor.intercept({\n message: typedMessage,\n connectionInfo: connectionContext,\n appMetadataManager: this.appMetadataManager,\n interceptorCallback: newMessageCallback\n })\n }\n }\n }\n\n return this._connect()\n }\n\n public async getRegisterPushChallenge(\n backendUrl: string,\n accountPublicKey: string,\n oracleUrl: string = NOTIFICATION_ORACLE_URL\n ) {\n // Check if account is already registered\n const challengeResponse = await fetch(`${oracleUrl}/challenge`)\n if (!challengeResponse.ok) {\n throw new Error(\n `getRegisterPushChallenge failed: ${challengeResponse.status} ${challengeResponse.statusText}`\n )\n }\n const challenge: { id: string; timestamp: string } = await challengeResponse.json()\n\n const constructedString = [\n 'Tezos Signed Message: ',\n challenge.id,\n challenge.timestamp,\n accountPublicKey,\n backendUrl\n ].join(' ')\n\n const bytes = toHex(constructedString)\n const payloadBytes = '05' + '01' + bytes.length.toString(16).padStart(8, '0') + bytes\n\n return {\n challenge,\n payloadToSign: payloadBytes\n }\n }\n\n public async registerPush(\n challenge: { id: string; timestamp: string },\n signature: string,\n backendUrl: string,\n accountPublicKey: string,\n protocolIdentifier: string,\n deviceId: string,\n oracleUrl: string = NOTIFICATION_ORACLE_URL\n ): Promise<PushToken> {\n const tokens = await this.storage.get(StorageKey.PUSH_TOKENS)\n const token = tokens.find(\n (el) => el.publicKey === accountPublicKey && el.backendUrl === backendUrl\n )\n if (token) {\n return token\n }\n\n const registerResponse = await fetch(`${oracleUrl}/register`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: this.name,\n challenge,\n accountPublicKey,\n signature,\n backendUrl,\n protocolIdentifier,\n deviceId\n })\n })\n if (!registerResponse.ok) {\n throw new Error(\n `registerPush failed: ${registerResponse.status} ${registerResponse.statusText}`\n )\n }\n const register: {\n accessToken: string\n managementToken: string\n message: string\n success: boolean\n } = await registerResponse.json()\n\n const newToken = {\n publicKey: accountPublicKey,\n backendUrl,\n accessToken: register.accessToken,\n managementToken: register.managementToken\n }\n\n tokens.push(newToken)\n\n await this.storage.set(StorageKey.PUSH_TOKENS, tokens)\n\n return newToken\n }\n\n /**\n * The method will attempt to initiate a connection using the active transport.\n */\n public async _connect(attempts: number = 3): Promise<void> {\n const transport: WalletP2PTransport = (await this.transport) as WalletP2PTransport\n if (attempts == 0 || transport.connectionStatus !== TransportStatus.NOT_CONNECTED) {\n return\n }\n\n try {\n await transport.connect()\n } catch (err: any) {\n logger.warn('_connect', err.message)\n await transport.disconnect()\n await this._connect(--attempts)\n return\n }\n\n transport\n .addListener(async (message: unknown, connectionInfo: ConnectionContext) => {\n if (typeof message === 'string') {\n const deserializedMessage = (await new Serializer().deserialize(\n message\n )) as BeaconRequestMessage\n this.handleResponse(deserializedMessage, connectionInfo)\n }\n })\n .catch((error) => logger.log('_connect', error))\n this._isConnected.resolve(true)\n }\n\n /**\n * This method sends a response for a specific request back to the DApp\n *\n * @param message The BeaconResponseMessage that will be sent back to the DApp\n */\n public async respond(message: BeaconResponseInputMessage): Promise<void> {\n logger.log('RESPONSE', message)\n const request = this.pendingRequests.find(\n (pendingRequest) => pendingRequest[0].id === message.id\n )\n if (!request) {\n throw new Error('No matching request found!')\n }\n\n this.pendingRequests = this.pendingRequests.filter(\n (pendingRequest) => pendingRequest[0].id !== message.id\n )\n\n await OutgoingResponseInterceptor.intercept({\n senderId: await getSenderId(await this.beaconId),\n request: request[0],\n message,\n ownAppMetadata: await this.getOwnAppMetadata(),\n permissionManager: this.permissionManager,\n appMetadataManager: this.appMetadataManager,\n interceptorCallback: async (response: BeaconMessage): Promise<void> => {\n await this.respondToMessage(response, request[1])\n }\n })\n }\n\n public async getAppMetadataList(): Promise<AppMetadata[]> {\n return this.appMetadataManager.getAppMetadataList()\n }\n\n public async getAppMetadata(senderId: string): Promise<AppMetadata | undefined> {\n return this.appMetadataManager.getAppMetadata(senderId)\n }\n\n public async removeAppMetadata(senderId: string): Promise<void> {\n return this.appMetadataManager.removeAppMetadata(senderId)\n }\n\n public async removeAllAppMetadata(): Promise<void> {\n return this.appMetadataManager.removeAllAppMetadata()\n }\n\n public async getPermissions(): Promise<PermissionInfo[]> {\n return this.permissionManager.getPermissions()\n }\n\n public async getPermission(accountIdentifier: string): Promise<PermissionInfo | undefined> {\n return this.permissionManager.getPermission(accountIdentifier)\n }\n\n public async removePermission(accountIdentifier: string, senderId: string): Promise<void> {\n return this.permissionManager.removePermission(accountIdentifier, senderId)\n }\n\n public async removeAllPermissions(): Promise<void> {\n return this.permissionManager.removeAllPermissions()\n }\n\n private async getPeerInfo(peer: PeerInfo): Promise<ExtendedPeerInfo> {\n const senderId = await getSenderId(peer.publicKey)\n\n if (peer instanceof PostMessagePairingRequest) {\n return new ExtendedPostMessagePairingRequest(\n peer.id,\n peer.name,\n peer.publicKey,\n peer.version,\n senderId\n )\n } else if (peer instanceof P2PPairingRequest) {\n return new ExtendedP2PPairingRequest(\n peer.id,\n peer.name,\n peer.publicKey,\n peer.version,\n peer.relayServer,\n senderId\n )\n } else if (peer instanceof ExtendedWalletConnectPairingRequest) {\n return new ExtendedWalletConnectPairingRequest(\n peer.id,\n peer.name,\n peer.publicKey,\n peer.version,\n senderId,\n peer.uri\n )\n } else {\n return {\n ...peer,\n senderId\n }\n }\n }\n\n /**\n * Add a new peer to the known peers\n * @param peer The new peer to add\n */\n public async addPeer(peer: PeerInfo, sendPairingResponse: boolean = true): Promise<void> {\n return (await this.transport).addPeer(await this.getPeerInfo(peer), sendPairingResponse)\n }\n\n public async removePeer(\n peer: ExtendedP2PPairingResponse,\n sendDisconnectToPeer: boolean = false\n ): Promise<void> {\n const removePeerResult = (await this.transport).removePeer(peer)\n\n await this.removePermissionsForPeers([peer])\n\n if (sendDisconnectToPeer) {\n await this.sendDisconnectToPeer(peer)\n }\n\n return removePeerResult\n }\n\n public async removeAllPeers(sendDisconnectToPeers: boolean = false): Promise<void> {\n const peers: ExtendedP2PPairingResponse[] = await (await this.transport).getPeers()\n const removePeerResult = (await this.transport).removeAllPeers()\n\n await this.removePermissionsForPeers(peers)\n\n if (sendDisconnectToPeers) {\n const disconnectPromises = peers.map((peer) => this.sendDisconnectToPeer(peer))\n\n await Promise.all(disconnectPromises)\n }\n\n return removePeerResult\n }\n\n private async removePermissionsForPeers(\n peersToRemove: ExtendedP2PPairingResponse[]\n ): Promise<void> {\n const permissions = await this.permissionManager.getPermissions()\n\n const peerIdsToRemove = peersToRemove.map((peer) => peer.senderId)\n // Remove all permissions with origin of the specified peer\n const permissionsToRemove = permissions.filter((permission) =>\n peerIdsToRemove.includes(permission.appMetadata.senderId)\n )\n const permissionIdentifiersToRemove = permissionsToRemove.map(\n (permissionInfo) => permissionInfo.accountIdentifier\n )\n await this.permissionManager.removePermissions(permissionIdentifiersToRemove)\n }\n\n /**\n * Send an acknowledge message back to the sender\n *\n * @param message The message that was received\n */\n private async sendAcknowledgeResponse(\n request: BeaconRequestMessage | BeaconMessageWrapper<BeaconBaseMessage>,\n connectionContext: ConnectionContext\n ): Promise<void> {\n // Acknowledge the message\n const acknowledgeResponse: AcknowledgeResponseInput = {\n id: request.id,\n type: BeaconMessageType.Acknowledge\n }\n\n await OutgoingResponseInterceptor.intercept({\n senderId: await getSenderId(await this.beaconId),\n request,\n message: acknowledgeResponse,\n ownAppMetadata: await this.getOwnAppMetadata(),\n permissionManager: this.permissionManager,\n appMetadataManager: this.appMetadataManager,\n interceptorCallback: async (response: BeaconMessage): Promise<void> => {\n await this.respondToMessage(response, connectionContext)\n }\n })\n }\n\n /**\n * An internal method to send a BeaconMessage to the DApp\n *\n * @param response Send a message back to the DApp\n */\n private async respondToMessage(\n response: BeaconMessage,\n connectionContext: ConnectionContext\n ): Promise<void> {\n const serializedMessage: string = await new Serializer().serialize(response)\n if (connectionContext) {\n const peerInfos = await this.getPeers()\n const peer = peerInfos.find((peerInfo) => peerInfo.publicKey === connectionContext.id)\n await (await this.transport).send(serializedMessage, peer)\n } else {\n await (await this.transport).send(serializedMessage)\n }\n }\n\n private async disconnect(senderId: string) {\n const transport = await this.transport\n const peers: ExtendedPeerInfo[] = await transport.getPeers()\n const peer: ExtendedPeerInfo | undefined = peers.find((peerEl) => peerEl.senderId === senderId)\n\n if (peer) {\n await this.removePeer(peer as any)\n }\n\n await transport.disconnect()\n\n return\n }\n}\n"]}
1
+ {"version":3,"file":"WalletClient.js","sourceRoot":"","sources":["../../../src/client/WalletClient.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Serializer,\n Client,\n LocalStorage,\n PermissionManager,\n AppMetadataManager,\n getSenderId,\n Logger,\n NOTIFICATION_ORACLE_URL\n} from '@tezos-x/octez.connect-core'\n\nimport { ExposedPromise, toHex } from '@tezos-x/octez.connect-utils'\n\nimport {\n ConnectionContext,\n BeaconRequestMessage,\n BeaconMessageType,\n AcknowledgeResponseInput,\n ExtendedP2PPairingResponse,\n ExtendedPeerInfo,\n PeerInfo,\n DisconnectMessage,\n TransportType,\n BeaconRequestOutputMessage,\n BeaconResponseInputMessage,\n AppMetadata,\n PermissionInfo,\n TransportStatus,\n BeaconMessage,\n BeaconMessageWrapper,\n BeaconBaseMessage,\n StorageKey,\n PushToken,\n PostMessagePairingRequest,\n ExtendedPostMessagePairingRequest,\n P2PPairingRequest,\n ExtendedP2PPairingRequest,\n ExtendedWalletConnectPairingRequest\n} from '@tezos-x/octez.connect-types'\nimport { WalletClientOptions } from './WalletClientOptions'\nimport { WalletP2PTransport } from '../transports/WalletP2PTransport'\nimport { IncomingRequestInterceptor } from '../interceptors/IncomingRequestInterceptor'\nimport { OutgoingResponseInterceptor } from '../interceptors/OutgoingResponseInterceptor'\n\nconst logger = new Logger('WalletClient')\n\ntype DisconnectListener = (senderId: string) => void | Promise<void>\n\n/**\n * @publicapi\n *\n * The WalletClient has to be used in the wallet. It handles all the logic related to connecting to beacon-compatible\n * dapps and handling/responding to requests.\n *\n * @category Wallet\n */\nexport class WalletClient extends Client {\n /**\n * Returns whether or not the transport is connected\n */\n protected readonly _isConnected: ExposedPromise<boolean> = new ExposedPromise()\n public get isConnected(): Promise<boolean> {\n return this._isConnected.promise\n }\n\n private readonly permissionManager: PermissionManager\n private readonly appMetadataManager: AppMetadataManager\n\n /**\n * This array stores pending requests, meaning requests we received and have not yet handled / sent a response.\n */\n private pendingRequests: [\n BeaconRequestMessage | BeaconMessageWrapper<BeaconBaseMessage>,\n ConnectionContext\n ][] = []\n private readonly disconnectListeners: Set<DisconnectListener> = new Set()\n\n constructor(config: WalletClientOptions) {\n super({\n storage: config && config.storage ? config.storage : new LocalStorage(),\n ...config\n })\n this.permissionManager = new PermissionManager(this.storage)\n this.appMetadataManager = new AppMetadataManager(this.storage)\n }\n\n public async init(): Promise<TransportType> {\n const keyPair = await this.keyPair // We wait for keypair here so the P2P Transport creation is not delayed and causing issues\n const p2pTransport = new WalletP2PTransport(\n this.name,\n keyPair,\n this.storage,\n this.matrixNodes,\n this.iconUrl,\n this.appUrl\n )\n\n return super.init(p2pTransport)\n }\n\n /**\n * This method initiates a connection to the P2P network and registers a callback that will be called\n * whenever a message is received.\n *\n * @param newMessageCallback The callback that will be invoked for every message the transport receives.\n */\n public async connect(\n newMessageCallback: (\n message: BeaconRequestOutputMessage,\n connectionContext: ConnectionContext\n ) => void\n ): Promise<void> {\n this.handleResponse = async (\n message: BeaconRequestMessage | BeaconMessageWrapper<BeaconBaseMessage> | DisconnectMessage,\n connectionContext: ConnectionContext\n ): Promise<void> => {\n if (message.version === '3') {\n const typedMessage = message as BeaconMessageWrapper<BeaconBaseMessage>\n const disconnectSenderId = this.getDisconnectSenderId(message)\n\n if (disconnectSenderId) {\n return this.disconnect(disconnectSenderId)\n }\n\n if (!this.pendingRequests.some((request) => request[0].id === message.id)) {\n this.pendingRequests.push([typedMessage, connectionContext])\n\n await this.sendAcknowledgeResponse(typedMessage, connectionContext)\n\n await IncomingRequestInterceptor.intercept({\n message: typedMessage,\n connectionInfo: connectionContext,\n appMetadataManager: this.appMetadataManager,\n interceptorCallback: newMessageCallback\n })\n }\n } else {\n const typedMessage = message as BeaconRequestMessage | DisconnectMessage\n\n if (typedMessage.type === BeaconMessageType.Disconnect) {\n return this.disconnect(typedMessage.senderId)\n }\n\n if (!this.pendingRequests.some((request) => request[0].id === message.id)) {\n this.pendingRequests.push([typedMessage, connectionContext])\n\n if (typedMessage.version !== '1') {\n await this.sendAcknowledgeResponse(typedMessage, connectionContext)\n }\n\n await IncomingRequestInterceptor.intercept({\n message: typedMessage,\n connectionInfo: connectionContext,\n appMetadataManager: this.appMetadataManager,\n interceptorCallback: newMessageCallback\n })\n }\n }\n }\n\n return this._connect()\n }\n\n /**\n * Subscribe to inbound disconnects from known peers. Duplicate listener identities are ignored.\n *\n * Listeners are notified after local peer cleanup is attempted. Listener failures are logged and do\n * not prevent other listeners from running.\n */\n public subscribeToDisconnect(listener: DisconnectListener): void {\n this.disconnectListeners.add(listener)\n }\n\n /**\n * Unsubscribe a disconnect listener by identity.\n */\n public unsubscribeFromDisconnect(listener: DisconnectListener): void {\n this.disconnectListeners.delete(listener)\n }\n\n public async getRegisterPushChallenge(\n backendUrl: string,\n accountPublicKey: string,\n oracleUrl: string = NOTIFICATION_ORACLE_URL\n ) {\n // Check if account is already registered\n const challengeResponse = await fetch(`${oracleUrl}/challenge`)\n if (!challengeResponse.ok) {\n throw new Error(\n `getRegisterPushChallenge failed: ${challengeResponse.status} ${challengeResponse.statusText}`\n )\n }\n const challenge: { id: string; timestamp: string } = await challengeResponse.json()\n\n const constructedString = [\n 'Tezos Signed Message: ',\n challenge.id,\n challenge.timestamp,\n accountPublicKey,\n backendUrl\n ].join(' ')\n\n const bytes = toHex(constructedString)\n const payloadBytes = '05' + '01' + bytes.length.toString(16).padStart(8, '0') + bytes\n\n return {\n challenge,\n payloadToSign: payloadBytes\n }\n }\n\n public async registerPush(\n challenge: { id: string; timestamp: string },\n signature: string,\n backendUrl: string,\n accountPublicKey: string,\n protocolIdentifier: string,\n deviceId: string,\n oracleUrl: string = NOTIFICATION_ORACLE_URL\n ): Promise<PushToken> {\n const tokens = await this.storage.get(StorageKey.PUSH_TOKENS)\n const token = tokens.find(\n (el) => el.publicKey === accountPublicKey && el.backendUrl === backendUrl\n )\n if (token) {\n return token\n }\n\n const registerResponse = await fetch(`${oracleUrl}/register`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: this.name,\n challenge,\n accountPublicKey,\n signature,\n backendUrl,\n protocolIdentifier,\n deviceId\n })\n })\n if (!registerResponse.ok) {\n throw new Error(\n `registerPush failed: ${registerResponse.status} ${registerResponse.statusText}`\n )\n }\n const register: {\n accessToken: string\n managementToken: string\n message: string\n success: boolean\n } = await registerResponse.json()\n\n const newToken = {\n publicKey: accountPublicKey,\n backendUrl,\n accessToken: register.accessToken,\n managementToken: register.managementToken\n }\n\n tokens.push(newToken)\n\n await this.storage.set(StorageKey.PUSH_TOKENS, tokens)\n\n return newToken\n }\n\n /**\n * The method will attempt to initiate a connection using the active transport.\n */\n public async _connect(attempts: number = 3): Promise<void> {\n const transport: WalletP2PTransport = (await this.transport) as WalletP2PTransport\n if (attempts == 0 || transport.connectionStatus !== TransportStatus.NOT_CONNECTED) {\n return\n }\n\n try {\n await transport.connect()\n } catch (err: any) {\n logger.warn('_connect', err.message)\n await transport.disconnect()\n await this._connect(--attempts)\n return\n }\n\n transport\n .addListener(async (message: unknown, connectionInfo: ConnectionContext) => {\n if (typeof message === 'string') {\n const deserializedMessage = (await new Serializer().deserialize(\n message\n )) as BeaconRequestMessage\n this.handleResponse(deserializedMessage, connectionInfo)\n }\n })\n .catch((error) => logger.log('_connect', error))\n this._isConnected.resolve(true)\n }\n\n /**\n * This method sends a response for a specific request back to the DApp\n *\n * @param message The BeaconResponseMessage that will be sent back to the DApp\n */\n public async respond(message: BeaconResponseInputMessage): Promise<void> {\n logger.log('RESPONSE', message)\n const request = this.pendingRequests.find(\n (pendingRequest) => pendingRequest[0].id === message.id\n )\n if (!request) {\n throw new Error('No matching request found!')\n }\n\n this.pendingRequests = this.pendingRequests.filter(\n (pendingRequest) => pendingRequest[0].id !== message.id\n )\n\n await OutgoingResponseInterceptor.intercept({\n senderId: await getSenderId(await this.beaconId),\n request: request[0],\n message,\n ownAppMetadata: await this.getOwnAppMetadata(),\n permissionManager: this.permissionManager,\n appMetadataManager: this.appMetadataManager,\n interceptorCallback: async (response: BeaconMessage): Promise<void> => {\n await this.respondToMessage(response, request[1])\n }\n })\n }\n\n public async getAppMetadataList(): Promise<AppMetadata[]> {\n return this.appMetadataManager.getAppMetadataList()\n }\n\n public async getAppMetadata(senderId: string): Promise<AppMetadata | undefined> {\n return this.appMetadataManager.getAppMetadata(senderId)\n }\n\n public async removeAppMetadata(senderId: string): Promise<void> {\n return this.appMetadataManager.removeAppMetadata(senderId)\n }\n\n public async removeAllAppMetadata(): Promise<void> {\n return this.appMetadataManager.removeAllAppMetadata()\n }\n\n public async getPermissions(): Promise<PermissionInfo[]> {\n return this.permissionManager.getPermissions()\n }\n\n public async getPermission(accountIdentifier: string): Promise<PermissionInfo | undefined> {\n return this.permissionManager.getPermission(accountIdentifier)\n }\n\n public async removePermission(accountIdentifier: string, senderId: string): Promise<void> {\n return this.permissionManager.removePermission(accountIdentifier, senderId)\n }\n\n public async removeAllPermissions(): Promise<void> {\n return this.permissionManager.removeAllPermissions()\n }\n\n private async getPeerInfo(peer: PeerInfo): Promise<ExtendedPeerInfo> {\n const senderId = await getSenderId(peer.publicKey)\n\n if (peer instanceof PostMessagePairingRequest) {\n return new ExtendedPostMessagePairingRequest(\n peer.id,\n peer.name,\n peer.publicKey,\n peer.version,\n senderId\n )\n } else if (peer instanceof P2PPairingRequest) {\n return new ExtendedP2PPairingRequest(\n peer.id,\n peer.name,\n peer.publicKey,\n peer.version,\n peer.relayServer,\n senderId\n )\n } else if (peer instanceof ExtendedWalletConnectPairingRequest) {\n return new ExtendedWalletConnectPairingRequest(\n peer.id,\n peer.name,\n peer.publicKey,\n peer.version,\n senderId,\n peer.uri\n )\n } else {\n return {\n ...peer,\n senderId\n }\n }\n }\n\n /**\n * Add a new peer to the known peers\n * @param peer The new peer to add\n */\n public async addPeer(peer: PeerInfo, sendPairingResponse: boolean = true): Promise<void> {\n return (await this.transport).addPeer(await this.getPeerInfo(peer), sendPairingResponse)\n }\n\n public async removePeer(\n peer: ExtendedP2PPairingResponse,\n sendDisconnectToPeer: boolean = false\n ): Promise<void> {\n const removePeerResult = (await this.transport).removePeer(peer)\n\n await this.removePermissionsForPeers([peer])\n\n if (sendDisconnectToPeer) {\n await this.sendDisconnectToPeer(peer)\n }\n\n return removePeerResult\n }\n\n public async removeAllPeers(sendDisconnectToPeers: boolean = false): Promise<void> {\n const peers: ExtendedP2PPairingResponse[] = await (await this.transport).getPeers()\n const removePeerResult = (await this.transport).removeAllPeers()\n\n await this.removePermissionsForPeers(peers)\n\n if (sendDisconnectToPeers) {\n const disconnectPromises = peers.map((peer) => this.sendDisconnectToPeer(peer))\n\n await Promise.all(disconnectPromises)\n }\n\n return removePeerResult\n }\n\n private async removePermissionsForPeers(\n peersToRemove: ExtendedP2PPairingResponse[]\n ): Promise<void> {\n const permissions = await this.permissionManager.getPermissions()\n\n const peerIdsToRemove = peersToRemove.map((peer) => peer.senderId)\n // Remove all permissions with origin of the specified peer\n const permissionsToRemove = permissions.filter((permission) =>\n peerIdsToRemove.includes(permission.appMetadata.senderId)\n )\n const permissionIdentifiersToRemove = permissionsToRemove.map(\n (permissionInfo) => permissionInfo.accountIdentifier\n )\n await this.permissionManager.removePermissions(permissionIdentifiersToRemove)\n }\n\n /**\n * Send an acknowledge message back to the sender\n *\n * @param message The message that was received\n */\n private async sendAcknowledgeResponse(\n request: BeaconRequestMessage | BeaconMessageWrapper<BeaconBaseMessage>,\n connectionContext: ConnectionContext\n ): Promise<void> {\n // Acknowledge the message\n const acknowledgeResponse: AcknowledgeResponseInput = {\n id: request.id,\n type: BeaconMessageType.Acknowledge\n }\n\n await OutgoingResponseInterceptor.intercept({\n senderId: await getSenderId(await this.beaconId),\n request,\n message: acknowledgeResponse,\n ownAppMetadata: await this.getOwnAppMetadata(),\n permissionManager: this.permissionManager,\n appMetadataManager: this.appMetadataManager,\n interceptorCallback: async (response: BeaconMessage): Promise<void> => {\n await this.respondToMessage(response, connectionContext)\n }\n })\n }\n\n /**\n * An internal method to send a BeaconMessage to the DApp\n *\n * @param response Send a message back to the DApp\n */\n private async respondToMessage(\n response: BeaconMessage,\n connectionContext: ConnectionContext\n ): Promise<void> {\n const serializedMessage: string = await new Serializer().serialize(response)\n if (connectionContext) {\n const peerInfos = await this.getPeers()\n const peer = peerInfos.find((peerInfo) => peerInfo.publicKey === connectionContext.id)\n await (await this.transport).send(serializedMessage, peer)\n } else {\n await (await this.transport).send(serializedMessage)\n }\n }\n\n private async disconnect(senderId: string) {\n const transport = await this.transport\n const peers: ExtendedPeerInfo[] = await transport.getPeers()\n const peer: ExtendedPeerInfo | undefined = peers.find((peerEl) => peerEl.senderId === senderId)\n\n if (!peer) {\n return\n }\n\n let removePeerError: unknown\n try {\n await this.removePeer(peer as any)\n } catch (error) {\n removePeerError = error\n }\n\n this.notifyDisconnectListeners(senderId)\n\n if (removePeerError) {\n throw removePeerError\n }\n }\n\n private notifyDisconnectListeners(senderId: string): void {\n for (const listener of Array.from(this.disconnectListeners)) {\n try {\n Promise.resolve(listener(senderId)).catch((error) => {\n logger.error('disconnect listener', error)\n })\n } catch (error) {\n logger.error('disconnect listener', error)\n }\n }\n }\n\n private getDisconnectSenderId(\n message: BeaconRequestMessage | BeaconMessageWrapper<BeaconBaseMessage> | DisconnectMessage\n ): string | undefined {\n if (message.version === '3') {\n const wrappedMessage = message as BeaconMessageWrapper<BeaconBaseMessage>\n if (wrappedMessage.message?.type === BeaconMessageType.Disconnect) {\n return wrappedMessage.senderId\n }\n }\n\n const typedMessage = message as DisconnectMessage\n\n return typedMessage.type === BeaconMessageType.Disconnect ? typedMessage.senderId : undefined\n }\n}\n"]}
@@ -2,6 +2,7 @@ import { Client } from '@tezos-x/octez.connect-core';
2
2
  import { ExposedPromise } from '@tezos-x/octez.connect-utils';
3
3
  import { ConnectionContext, ExtendedP2PPairingResponse, PeerInfo, TransportType, BeaconRequestOutputMessage, BeaconResponseInputMessage, AppMetadata, PermissionInfo, PushToken } from '@tezos-x/octez.connect-types';
4
4
  import { WalletClientOptions } from './WalletClientOptions';
5
+ type DisconnectListener = (senderId: string) => void | Promise<void>;
5
6
  /**
6
7
  * @publicapi
7
8
  *
@@ -22,6 +23,7 @@ export declare class WalletClient extends Client {
22
23
  * This array stores pending requests, meaning requests we received and have not yet handled / sent a response.
23
24
  */
24
25
  private pendingRequests;
26
+ private readonly disconnectListeners;
25
27
  constructor(config: WalletClientOptions);
26
28
  init(): Promise<TransportType>;
27
29
  /**
@@ -31,6 +33,17 @@ export declare class WalletClient extends Client {
31
33
  * @param newMessageCallback The callback that will be invoked for every message the transport receives.
32
34
  */
33
35
  connect(newMessageCallback: (message: BeaconRequestOutputMessage, connectionContext: ConnectionContext) => void): Promise<void>;
36
+ /**
37
+ * Subscribe to inbound disconnects from known peers. Duplicate listener identities are ignored.
38
+ *
39
+ * Listeners are notified after local peer cleanup is attempted. Listener failures are logged and do
40
+ * not prevent other listeners from running.
41
+ */
42
+ subscribeToDisconnect(listener: DisconnectListener): void;
43
+ /**
44
+ * Unsubscribe a disconnect listener by identity.
45
+ */
46
+ unsubscribeFromDisconnect(listener: DisconnectListener): void;
34
47
  getRegisterPushChallenge(backendUrl: string, accountPublicKey: string, oracleUrl?: string): Promise<{
35
48
  challenge: {
36
49
  id: string;
@@ -82,4 +95,7 @@ export declare class WalletClient extends Client {
82
95
  */
83
96
  private respondToMessage;
84
97
  private disconnect;
98
+ private notifyDisconnectListeners;
99
+ private getDisconnectSenderId;
85
100
  }
101
+ export {};
@@ -27,6 +27,7 @@ export class WalletClient extends Client {
27
27
  * This array stores pending requests, meaning requests we received and have not yet handled / sent a response.
28
28
  */
29
29
  pendingRequests = [];
30
+ disconnectListeners = new Set();
30
31
  constructor(config) {
31
32
  super({
32
33
  storage: config && config.storage ? config.storage : new LocalStorage(),
@@ -50,8 +51,9 @@ export class WalletClient extends Client {
50
51
  this.handleResponse = async (message, connectionContext) => {
51
52
  if (message.version === '3') {
52
53
  const typedMessage = message;
53
- if (typedMessage.message.type === BeaconMessageType.Disconnect) {
54
- return this.disconnect(typedMessage.senderId);
54
+ const disconnectSenderId = this.getDisconnectSenderId(message);
55
+ if (disconnectSenderId) {
56
+ return this.disconnect(disconnectSenderId);
55
57
  }
56
58
  if (!this.pendingRequests.some((request) => request[0].id === message.id)) {
57
59
  this.pendingRequests.push([typedMessage, connectionContext]);
@@ -85,6 +87,21 @@ export class WalletClient extends Client {
85
87
  };
86
88
  return this._connect();
87
89
  }
90
+ /**
91
+ * Subscribe to inbound disconnects from known peers. Duplicate listener identities are ignored.
92
+ *
93
+ * Listeners are notified after local peer cleanup is attempted. Listener failures are logged and do
94
+ * not prevent other listeners from running.
95
+ */
96
+ subscribeToDisconnect(listener) {
97
+ this.disconnectListeners.add(listener);
98
+ }
99
+ /**
100
+ * Unsubscribe a disconnect listener by identity.
101
+ */
102
+ unsubscribeFromDisconnect(listener) {
103
+ this.disconnectListeners.delete(listener);
104
+ }
88
105
  async getRegisterPushChallenge(backendUrl, accountPublicKey, oracleUrl = NOTIFICATION_ORACLE_URL) {
89
106
  // Check if account is already registered
90
107
  const challengeResponse = await fetch(`${oracleUrl}/challenge`);
@@ -308,11 +325,42 @@ export class WalletClient extends Client {
308
325
  const transport = await this.transport;
309
326
  const peers = await transport.getPeers();
310
327
  const peer = peers.find((peerEl) => peerEl.senderId === senderId);
311
- if (peer) {
328
+ if (!peer) {
329
+ return;
330
+ }
331
+ let removePeerError;
332
+ try {
312
333
  await this.removePeer(peer);
313
334
  }
314
- await transport.disconnect();
315
- return;
335
+ catch (error) {
336
+ removePeerError = error;
337
+ }
338
+ this.notifyDisconnectListeners(senderId);
339
+ if (removePeerError) {
340
+ throw removePeerError;
341
+ }
342
+ }
343
+ notifyDisconnectListeners(senderId) {
344
+ for (const listener of Array.from(this.disconnectListeners)) {
345
+ try {
346
+ Promise.resolve(listener(senderId)).catch((error) => {
347
+ logger.error('disconnect listener', error);
348
+ });
349
+ }
350
+ catch (error) {
351
+ logger.error('disconnect listener', error);
352
+ }
353
+ }
354
+ }
355
+ getDisconnectSenderId(message) {
356
+ if (message.version === '3') {
357
+ const wrappedMessage = message;
358
+ if (wrappedMessage.message?.type === BeaconMessageType.Disconnect) {
359
+ return wrappedMessage.senderId;
360
+ }
361
+ }
362
+ const typedMessage = message;
363
+ return typedMessage.type === BeaconMessageType.Disconnect ? typedMessage.senderId : undefined;
316
364
  }
317
365
  }
318
366
  //# sourceMappingURL=WalletClient.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WalletClient.js","sourceRoot":"","sources":["../../../src/client/WalletClient.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Serializer,\n Client,\n LocalStorage,\n PermissionManager,\n AppMetadataManager,\n getSenderId,\n Logger,\n NOTIFICATION_ORACLE_URL\n} from '@tezos-x/octez.connect-core'\n\nimport { ExposedPromise, toHex } from '@tezos-x/octez.connect-utils'\n\nimport {\n ConnectionContext,\n BeaconRequestMessage,\n BeaconMessageType,\n AcknowledgeResponseInput,\n ExtendedP2PPairingResponse,\n ExtendedPeerInfo,\n PeerInfo,\n DisconnectMessage,\n TransportType,\n BeaconRequestOutputMessage,\n BeaconResponseInputMessage,\n AppMetadata,\n PermissionInfo,\n TransportStatus,\n BeaconMessage,\n BeaconMessageWrapper,\n BeaconBaseMessage,\n StorageKey,\n PushToken,\n PostMessagePairingRequest,\n ExtendedPostMessagePairingRequest,\n P2PPairingRequest,\n ExtendedP2PPairingRequest,\n ExtendedWalletConnectPairingRequest\n} from '@tezos-x/octez.connect-types'\nimport { WalletClientOptions } from './WalletClientOptions'\nimport { WalletP2PTransport } from '../transports/WalletP2PTransport'\nimport { IncomingRequestInterceptor } from '../interceptors/IncomingRequestInterceptor'\nimport { OutgoingResponseInterceptor } from '../interceptors/OutgoingResponseInterceptor'\n\nconst logger = new Logger('WalletClient')\n\n/**\n * @publicapi\n *\n * The WalletClient has to be used in the wallet. It handles all the logic related to connecting to beacon-compatible\n * dapps and handling/responding to requests.\n *\n * @category Wallet\n */\nexport class WalletClient extends Client {\n /**\n * Returns whether or not the transport is connected\n */\n protected readonly _isConnected: ExposedPromise<boolean> = new ExposedPromise()\n public get isConnected(): Promise<boolean> {\n return this._isConnected.promise\n }\n\n private readonly permissionManager: PermissionManager\n private readonly appMetadataManager: AppMetadataManager\n\n /**\n * This array stores pending requests, meaning requests we received and have not yet handled / sent a response.\n */\n private pendingRequests: [\n BeaconRequestMessage | BeaconMessageWrapper<BeaconBaseMessage>,\n ConnectionContext\n ][] = []\n\n constructor(config: WalletClientOptions) {\n super({\n storage: config && config.storage ? config.storage : new LocalStorage(),\n ...config\n })\n this.permissionManager = new PermissionManager(this.storage)\n this.appMetadataManager = new AppMetadataManager(this.storage)\n }\n\n public async init(): Promise<TransportType> {\n const keyPair = await this.keyPair // We wait for keypair here so the P2P Transport creation is not delayed and causing issues\n const p2pTransport = new WalletP2PTransport(\n this.name,\n keyPair,\n this.storage,\n this.matrixNodes,\n this.iconUrl,\n this.appUrl\n )\n\n return super.init(p2pTransport)\n }\n\n /**\n * This method initiates a connection to the P2P network and registers a callback that will be called\n * whenever a message is received.\n *\n * @param newMessageCallback The callback that will be invoked for every message the transport receives.\n */\n public async connect(\n newMessageCallback: (\n message: BeaconRequestOutputMessage,\n connectionContext: ConnectionContext\n ) => void\n ): Promise<void> {\n this.handleResponse = async (\n message: BeaconRequestMessage | BeaconMessageWrapper<BeaconBaseMessage> | DisconnectMessage,\n connectionContext: ConnectionContext\n ): Promise<void> => {\n if (message.version === '3') {\n const typedMessage = message as BeaconMessageWrapper<BeaconBaseMessage>\n\n if (typedMessage.message.type === BeaconMessageType.Disconnect) {\n return this.disconnect(typedMessage.senderId)\n }\n\n if (!this.pendingRequests.some((request) => request[0].id === message.id)) {\n this.pendingRequests.push([typedMessage, connectionContext])\n\n await this.sendAcknowledgeResponse(typedMessage, connectionContext)\n\n await IncomingRequestInterceptor.intercept({\n message: typedMessage,\n connectionInfo: connectionContext,\n appMetadataManager: this.appMetadataManager,\n interceptorCallback: newMessageCallback\n })\n }\n } else {\n const typedMessage = message as BeaconRequestMessage | DisconnectMessage\n\n if (typedMessage.type === BeaconMessageType.Disconnect) {\n return this.disconnect(typedMessage.senderId)\n }\n\n if (!this.pendingRequests.some((request) => request[0].id === message.id)) {\n this.pendingRequests.push([typedMessage, connectionContext])\n\n if (typedMessage.version !== '1') {\n await this.sendAcknowledgeResponse(typedMessage, connectionContext)\n }\n\n await IncomingRequestInterceptor.intercept({\n message: typedMessage,\n connectionInfo: connectionContext,\n appMetadataManager: this.appMetadataManager,\n interceptorCallback: newMessageCallback\n })\n }\n }\n }\n\n return this._connect()\n }\n\n public async getRegisterPushChallenge(\n backendUrl: string,\n accountPublicKey: string,\n oracleUrl: string = NOTIFICATION_ORACLE_URL\n ) {\n // Check if account is already registered\n const challengeResponse = await fetch(`${oracleUrl}/challenge`)\n if (!challengeResponse.ok) {\n throw new Error(\n `getRegisterPushChallenge failed: ${challengeResponse.status} ${challengeResponse.statusText}`\n )\n }\n const challenge: { id: string; timestamp: string } = await challengeResponse.json()\n\n const constructedString = [\n 'Tezos Signed Message: ',\n challenge.id,\n challenge.timestamp,\n accountPublicKey,\n backendUrl\n ].join(' ')\n\n const bytes = toHex(constructedString)\n const payloadBytes = '05' + '01' + bytes.length.toString(16).padStart(8, '0') + bytes\n\n return {\n challenge,\n payloadToSign: payloadBytes\n }\n }\n\n public async registerPush(\n challenge: { id: string; timestamp: string },\n signature: string,\n backendUrl: string,\n accountPublicKey: string,\n protocolIdentifier: string,\n deviceId: string,\n oracleUrl: string = NOTIFICATION_ORACLE_URL\n ): Promise<PushToken> {\n const tokens = await this.storage.get(StorageKey.PUSH_TOKENS)\n const token = tokens.find(\n (el) => el.publicKey === accountPublicKey && el.backendUrl === backendUrl\n )\n if (token) {\n return token\n }\n\n const registerResponse = await fetch(`${oracleUrl}/register`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: this.name,\n challenge,\n accountPublicKey,\n signature,\n backendUrl,\n protocolIdentifier,\n deviceId\n })\n })\n if (!registerResponse.ok) {\n throw new Error(\n `registerPush failed: ${registerResponse.status} ${registerResponse.statusText}`\n )\n }\n const register: {\n accessToken: string\n managementToken: string\n message: string\n success: boolean\n } = await registerResponse.json()\n\n const newToken = {\n publicKey: accountPublicKey,\n backendUrl,\n accessToken: register.accessToken,\n managementToken: register.managementToken\n }\n\n tokens.push(newToken)\n\n await this.storage.set(StorageKey.PUSH_TOKENS, tokens)\n\n return newToken\n }\n\n /**\n * The method will attempt to initiate a connection using the active transport.\n */\n public async _connect(attempts: number = 3): Promise<void> {\n const transport: WalletP2PTransport = (await this.transport) as WalletP2PTransport\n if (attempts == 0 || transport.connectionStatus !== TransportStatus.NOT_CONNECTED) {\n return\n }\n\n try {\n await transport.connect()\n } catch (err: any) {\n logger.warn('_connect', err.message)\n await transport.disconnect()\n await this._connect(--attempts)\n return\n }\n\n transport\n .addListener(async (message: unknown, connectionInfo: ConnectionContext) => {\n if (typeof message === 'string') {\n const deserializedMessage = (await new Serializer().deserialize(\n message\n )) as BeaconRequestMessage\n this.handleResponse(deserializedMessage, connectionInfo)\n }\n })\n .catch((error) => logger.log('_connect', error))\n this._isConnected.resolve(true)\n }\n\n /**\n * This method sends a response for a specific request back to the DApp\n *\n * @param message The BeaconResponseMessage that will be sent back to the DApp\n */\n public async respond(message: BeaconResponseInputMessage): Promise<void> {\n logger.log('RESPONSE', message)\n const request = this.pendingRequests.find(\n (pendingRequest) => pendingRequest[0].id === message.id\n )\n if (!request) {\n throw new Error('No matching request found!')\n }\n\n this.pendingRequests = this.pendingRequests.filter(\n (pendingRequest) => pendingRequest[0].id !== message.id\n )\n\n await OutgoingResponseInterceptor.intercept({\n senderId: await getSenderId(await this.beaconId),\n request: request[0],\n message,\n ownAppMetadata: await this.getOwnAppMetadata(),\n permissionManager: this.permissionManager,\n appMetadataManager: this.appMetadataManager,\n interceptorCallback: async (response: BeaconMessage): Promise<void> => {\n await this.respondToMessage(response, request[1])\n }\n })\n }\n\n public async getAppMetadataList(): Promise<AppMetadata[]> {\n return this.appMetadataManager.getAppMetadataList()\n }\n\n public async getAppMetadata(senderId: string): Promise<AppMetadata | undefined> {\n return this.appMetadataManager.getAppMetadata(senderId)\n }\n\n public async removeAppMetadata(senderId: string): Promise<void> {\n return this.appMetadataManager.removeAppMetadata(senderId)\n }\n\n public async removeAllAppMetadata(): Promise<void> {\n return this.appMetadataManager.removeAllAppMetadata()\n }\n\n public async getPermissions(): Promise<PermissionInfo[]> {\n return this.permissionManager.getPermissions()\n }\n\n public async getPermission(accountIdentifier: string): Promise<PermissionInfo | undefined> {\n return this.permissionManager.getPermission(accountIdentifier)\n }\n\n public async removePermission(accountIdentifier: string, senderId: string): Promise<void> {\n return this.permissionManager.removePermission(accountIdentifier, senderId)\n }\n\n public async removeAllPermissions(): Promise<void> {\n return this.permissionManager.removeAllPermissions()\n }\n\n private async getPeerInfo(peer: PeerInfo): Promise<ExtendedPeerInfo> {\n const senderId = await getSenderId(peer.publicKey)\n\n if (peer instanceof PostMessagePairingRequest) {\n return new ExtendedPostMessagePairingRequest(\n peer.id,\n peer.name,\n peer.publicKey,\n peer.version,\n senderId\n )\n } else if (peer instanceof P2PPairingRequest) {\n return new ExtendedP2PPairingRequest(\n peer.id,\n peer.name,\n peer.publicKey,\n peer.version,\n peer.relayServer,\n senderId\n )\n } else if (peer instanceof ExtendedWalletConnectPairingRequest) {\n return new ExtendedWalletConnectPairingRequest(\n peer.id,\n peer.name,\n peer.publicKey,\n peer.version,\n senderId,\n peer.uri\n )\n } else {\n return {\n ...peer,\n senderId\n }\n }\n }\n\n /**\n * Add a new peer to the known peers\n * @param peer The new peer to add\n */\n public async addPeer(peer: PeerInfo, sendPairingResponse: boolean = true): Promise<void> {\n return (await this.transport).addPeer(await this.getPeerInfo(peer), sendPairingResponse)\n }\n\n public async removePeer(\n peer: ExtendedP2PPairingResponse,\n sendDisconnectToPeer: boolean = false\n ): Promise<void> {\n const removePeerResult = (await this.transport).removePeer(peer)\n\n await this.removePermissionsForPeers([peer])\n\n if (sendDisconnectToPeer) {\n await this.sendDisconnectToPeer(peer)\n }\n\n return removePeerResult\n }\n\n public async removeAllPeers(sendDisconnectToPeers: boolean = false): Promise<void> {\n const peers: ExtendedP2PPairingResponse[] = await (await this.transport).getPeers()\n const removePeerResult = (await this.transport).removeAllPeers()\n\n await this.removePermissionsForPeers(peers)\n\n if (sendDisconnectToPeers) {\n const disconnectPromises = peers.map((peer) => this.sendDisconnectToPeer(peer))\n\n await Promise.all(disconnectPromises)\n }\n\n return removePeerResult\n }\n\n private async removePermissionsForPeers(\n peersToRemove: ExtendedP2PPairingResponse[]\n ): Promise<void> {\n const permissions = await this.permissionManager.getPermissions()\n\n const peerIdsToRemove = peersToRemove.map((peer) => peer.senderId)\n // Remove all permissions with origin of the specified peer\n const permissionsToRemove = permissions.filter((permission) =>\n peerIdsToRemove.includes(permission.appMetadata.senderId)\n )\n const permissionIdentifiersToRemove = permissionsToRemove.map(\n (permissionInfo) => permissionInfo.accountIdentifier\n )\n await this.permissionManager.removePermissions(permissionIdentifiersToRemove)\n }\n\n /**\n * Send an acknowledge message back to the sender\n *\n * @param message The message that was received\n */\n private async sendAcknowledgeResponse(\n request: BeaconRequestMessage | BeaconMessageWrapper<BeaconBaseMessage>,\n connectionContext: ConnectionContext\n ): Promise<void> {\n // Acknowledge the message\n const acknowledgeResponse: AcknowledgeResponseInput = {\n id: request.id,\n type: BeaconMessageType.Acknowledge\n }\n\n await OutgoingResponseInterceptor.intercept({\n senderId: await getSenderId(await this.beaconId),\n request,\n message: acknowledgeResponse,\n ownAppMetadata: await this.getOwnAppMetadata(),\n permissionManager: this.permissionManager,\n appMetadataManager: this.appMetadataManager,\n interceptorCallback: async (response: BeaconMessage): Promise<void> => {\n await this.respondToMessage(response, connectionContext)\n }\n })\n }\n\n /**\n * An internal method to send a BeaconMessage to the DApp\n *\n * @param response Send a message back to the DApp\n */\n private async respondToMessage(\n response: BeaconMessage,\n connectionContext: ConnectionContext\n ): Promise<void> {\n const serializedMessage: string = await new Serializer().serialize(response)\n if (connectionContext) {\n const peerInfos = await this.getPeers()\n const peer = peerInfos.find((peerInfo) => peerInfo.publicKey === connectionContext.id)\n await (await this.transport).send(serializedMessage, peer)\n } else {\n await (await this.transport).send(serializedMessage)\n }\n }\n\n private async disconnect(senderId: string) {\n const transport = await this.transport\n const peers: ExtendedPeerInfo[] = await transport.getPeers()\n const peer: ExtendedPeerInfo | undefined = peers.find((peerEl) => peerEl.senderId === senderId)\n\n if (peer) {\n await this.removePeer(peer as any)\n }\n\n await transport.disconnect()\n\n return\n }\n}\n"]}
1
+ {"version":3,"file":"WalletClient.js","sourceRoot":"","sources":["../../../src/client/WalletClient.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Serializer,\n Client,\n LocalStorage,\n PermissionManager,\n AppMetadataManager,\n getSenderId,\n Logger,\n NOTIFICATION_ORACLE_URL\n} from '@tezos-x/octez.connect-core'\n\nimport { ExposedPromise, toHex } from '@tezos-x/octez.connect-utils'\n\nimport {\n ConnectionContext,\n BeaconRequestMessage,\n BeaconMessageType,\n AcknowledgeResponseInput,\n ExtendedP2PPairingResponse,\n ExtendedPeerInfo,\n PeerInfo,\n DisconnectMessage,\n TransportType,\n BeaconRequestOutputMessage,\n BeaconResponseInputMessage,\n AppMetadata,\n PermissionInfo,\n TransportStatus,\n BeaconMessage,\n BeaconMessageWrapper,\n BeaconBaseMessage,\n StorageKey,\n PushToken,\n PostMessagePairingRequest,\n ExtendedPostMessagePairingRequest,\n P2PPairingRequest,\n ExtendedP2PPairingRequest,\n ExtendedWalletConnectPairingRequest\n} from '@tezos-x/octez.connect-types'\nimport { WalletClientOptions } from './WalletClientOptions'\nimport { WalletP2PTransport } from '../transports/WalletP2PTransport'\nimport { IncomingRequestInterceptor } from '../interceptors/IncomingRequestInterceptor'\nimport { OutgoingResponseInterceptor } from '../interceptors/OutgoingResponseInterceptor'\n\nconst logger = new Logger('WalletClient')\n\ntype DisconnectListener = (senderId: string) => void | Promise<void>\n\n/**\n * @publicapi\n *\n * The WalletClient has to be used in the wallet. It handles all the logic related to connecting to beacon-compatible\n * dapps and handling/responding to requests.\n *\n * @category Wallet\n */\nexport class WalletClient extends Client {\n /**\n * Returns whether or not the transport is connected\n */\n protected readonly _isConnected: ExposedPromise<boolean> = new ExposedPromise()\n public get isConnected(): Promise<boolean> {\n return this._isConnected.promise\n }\n\n private readonly permissionManager: PermissionManager\n private readonly appMetadataManager: AppMetadataManager\n\n /**\n * This array stores pending requests, meaning requests we received and have not yet handled / sent a response.\n */\n private pendingRequests: [\n BeaconRequestMessage | BeaconMessageWrapper<BeaconBaseMessage>,\n ConnectionContext\n ][] = []\n private readonly disconnectListeners: Set<DisconnectListener> = new Set()\n\n constructor(config: WalletClientOptions) {\n super({\n storage: config && config.storage ? config.storage : new LocalStorage(),\n ...config\n })\n this.permissionManager = new PermissionManager(this.storage)\n this.appMetadataManager = new AppMetadataManager(this.storage)\n }\n\n public async init(): Promise<TransportType> {\n const keyPair = await this.keyPair // We wait for keypair here so the P2P Transport creation is not delayed and causing issues\n const p2pTransport = new WalletP2PTransport(\n this.name,\n keyPair,\n this.storage,\n this.matrixNodes,\n this.iconUrl,\n this.appUrl\n )\n\n return super.init(p2pTransport)\n }\n\n /**\n * This method initiates a connection to the P2P network and registers a callback that will be called\n * whenever a message is received.\n *\n * @param newMessageCallback The callback that will be invoked for every message the transport receives.\n */\n public async connect(\n newMessageCallback: (\n message: BeaconRequestOutputMessage,\n connectionContext: ConnectionContext\n ) => void\n ): Promise<void> {\n this.handleResponse = async (\n message: BeaconRequestMessage | BeaconMessageWrapper<BeaconBaseMessage> | DisconnectMessage,\n connectionContext: ConnectionContext\n ): Promise<void> => {\n if (message.version === '3') {\n const typedMessage = message as BeaconMessageWrapper<BeaconBaseMessage>\n const disconnectSenderId = this.getDisconnectSenderId(message)\n\n if (disconnectSenderId) {\n return this.disconnect(disconnectSenderId)\n }\n\n if (!this.pendingRequests.some((request) => request[0].id === message.id)) {\n this.pendingRequests.push([typedMessage, connectionContext])\n\n await this.sendAcknowledgeResponse(typedMessage, connectionContext)\n\n await IncomingRequestInterceptor.intercept({\n message: typedMessage,\n connectionInfo: connectionContext,\n appMetadataManager: this.appMetadataManager,\n interceptorCallback: newMessageCallback\n })\n }\n } else {\n const typedMessage = message as BeaconRequestMessage | DisconnectMessage\n\n if (typedMessage.type === BeaconMessageType.Disconnect) {\n return this.disconnect(typedMessage.senderId)\n }\n\n if (!this.pendingRequests.some((request) => request[0].id === message.id)) {\n this.pendingRequests.push([typedMessage, connectionContext])\n\n if (typedMessage.version !== '1') {\n await this.sendAcknowledgeResponse(typedMessage, connectionContext)\n }\n\n await IncomingRequestInterceptor.intercept({\n message: typedMessage,\n connectionInfo: connectionContext,\n appMetadataManager: this.appMetadataManager,\n interceptorCallback: newMessageCallback\n })\n }\n }\n }\n\n return this._connect()\n }\n\n /**\n * Subscribe to inbound disconnects from known peers. Duplicate listener identities are ignored.\n *\n * Listeners are notified after local peer cleanup is attempted. Listener failures are logged and do\n * not prevent other listeners from running.\n */\n public subscribeToDisconnect(listener: DisconnectListener): void {\n this.disconnectListeners.add(listener)\n }\n\n /**\n * Unsubscribe a disconnect listener by identity.\n */\n public unsubscribeFromDisconnect(listener: DisconnectListener): void {\n this.disconnectListeners.delete(listener)\n }\n\n public async getRegisterPushChallenge(\n backendUrl: string,\n accountPublicKey: string,\n oracleUrl: string = NOTIFICATION_ORACLE_URL\n ) {\n // Check if account is already registered\n const challengeResponse = await fetch(`${oracleUrl}/challenge`)\n if (!challengeResponse.ok) {\n throw new Error(\n `getRegisterPushChallenge failed: ${challengeResponse.status} ${challengeResponse.statusText}`\n )\n }\n const challenge: { id: string; timestamp: string } = await challengeResponse.json()\n\n const constructedString = [\n 'Tezos Signed Message: ',\n challenge.id,\n challenge.timestamp,\n accountPublicKey,\n backendUrl\n ].join(' ')\n\n const bytes = toHex(constructedString)\n const payloadBytes = '05' + '01' + bytes.length.toString(16).padStart(8, '0') + bytes\n\n return {\n challenge,\n payloadToSign: payloadBytes\n }\n }\n\n public async registerPush(\n challenge: { id: string; timestamp: string },\n signature: string,\n backendUrl: string,\n accountPublicKey: string,\n protocolIdentifier: string,\n deviceId: string,\n oracleUrl: string = NOTIFICATION_ORACLE_URL\n ): Promise<PushToken> {\n const tokens = await this.storage.get(StorageKey.PUSH_TOKENS)\n const token = tokens.find(\n (el) => el.publicKey === accountPublicKey && el.backendUrl === backendUrl\n )\n if (token) {\n return token\n }\n\n const registerResponse = await fetch(`${oracleUrl}/register`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: this.name,\n challenge,\n accountPublicKey,\n signature,\n backendUrl,\n protocolIdentifier,\n deviceId\n })\n })\n if (!registerResponse.ok) {\n throw new Error(\n `registerPush failed: ${registerResponse.status} ${registerResponse.statusText}`\n )\n }\n const register: {\n accessToken: string\n managementToken: string\n message: string\n success: boolean\n } = await registerResponse.json()\n\n const newToken = {\n publicKey: accountPublicKey,\n backendUrl,\n accessToken: register.accessToken,\n managementToken: register.managementToken\n }\n\n tokens.push(newToken)\n\n await this.storage.set(StorageKey.PUSH_TOKENS, tokens)\n\n return newToken\n }\n\n /**\n * The method will attempt to initiate a connection using the active transport.\n */\n public async _connect(attempts: number = 3): Promise<void> {\n const transport: WalletP2PTransport = (await this.transport) as WalletP2PTransport\n if (attempts == 0 || transport.connectionStatus !== TransportStatus.NOT_CONNECTED) {\n return\n }\n\n try {\n await transport.connect()\n } catch (err: any) {\n logger.warn('_connect', err.message)\n await transport.disconnect()\n await this._connect(--attempts)\n return\n }\n\n transport\n .addListener(async (message: unknown, connectionInfo: ConnectionContext) => {\n if (typeof message === 'string') {\n const deserializedMessage = (await new Serializer().deserialize(\n message\n )) as BeaconRequestMessage\n this.handleResponse(deserializedMessage, connectionInfo)\n }\n })\n .catch((error) => logger.log('_connect', error))\n this._isConnected.resolve(true)\n }\n\n /**\n * This method sends a response for a specific request back to the DApp\n *\n * @param message The BeaconResponseMessage that will be sent back to the DApp\n */\n public async respond(message: BeaconResponseInputMessage): Promise<void> {\n logger.log('RESPONSE', message)\n const request = this.pendingRequests.find(\n (pendingRequest) => pendingRequest[0].id === message.id\n )\n if (!request) {\n throw new Error('No matching request found!')\n }\n\n this.pendingRequests = this.pendingRequests.filter(\n (pendingRequest) => pendingRequest[0].id !== message.id\n )\n\n await OutgoingResponseInterceptor.intercept({\n senderId: await getSenderId(await this.beaconId),\n request: request[0],\n message,\n ownAppMetadata: await this.getOwnAppMetadata(),\n permissionManager: this.permissionManager,\n appMetadataManager: this.appMetadataManager,\n interceptorCallback: async (response: BeaconMessage): Promise<void> => {\n await this.respondToMessage(response, request[1])\n }\n })\n }\n\n public async getAppMetadataList(): Promise<AppMetadata[]> {\n return this.appMetadataManager.getAppMetadataList()\n }\n\n public async getAppMetadata(senderId: string): Promise<AppMetadata | undefined> {\n return this.appMetadataManager.getAppMetadata(senderId)\n }\n\n public async removeAppMetadata(senderId: string): Promise<void> {\n return this.appMetadataManager.removeAppMetadata(senderId)\n }\n\n public async removeAllAppMetadata(): Promise<void> {\n return this.appMetadataManager.removeAllAppMetadata()\n }\n\n public async getPermissions(): Promise<PermissionInfo[]> {\n return this.permissionManager.getPermissions()\n }\n\n public async getPermission(accountIdentifier: string): Promise<PermissionInfo | undefined> {\n return this.permissionManager.getPermission(accountIdentifier)\n }\n\n public async removePermission(accountIdentifier: string, senderId: string): Promise<void> {\n return this.permissionManager.removePermission(accountIdentifier, senderId)\n }\n\n public async removeAllPermissions(): Promise<void> {\n return this.permissionManager.removeAllPermissions()\n }\n\n private async getPeerInfo(peer: PeerInfo): Promise<ExtendedPeerInfo> {\n const senderId = await getSenderId(peer.publicKey)\n\n if (peer instanceof PostMessagePairingRequest) {\n return new ExtendedPostMessagePairingRequest(\n peer.id,\n peer.name,\n peer.publicKey,\n peer.version,\n senderId\n )\n } else if (peer instanceof P2PPairingRequest) {\n return new ExtendedP2PPairingRequest(\n peer.id,\n peer.name,\n peer.publicKey,\n peer.version,\n peer.relayServer,\n senderId\n )\n } else if (peer instanceof ExtendedWalletConnectPairingRequest) {\n return new ExtendedWalletConnectPairingRequest(\n peer.id,\n peer.name,\n peer.publicKey,\n peer.version,\n senderId,\n peer.uri\n )\n } else {\n return {\n ...peer,\n senderId\n }\n }\n }\n\n /**\n * Add a new peer to the known peers\n * @param peer The new peer to add\n */\n public async addPeer(peer: PeerInfo, sendPairingResponse: boolean = true): Promise<void> {\n return (await this.transport).addPeer(await this.getPeerInfo(peer), sendPairingResponse)\n }\n\n public async removePeer(\n peer: ExtendedP2PPairingResponse,\n sendDisconnectToPeer: boolean = false\n ): Promise<void> {\n const removePeerResult = (await this.transport).removePeer(peer)\n\n await this.removePermissionsForPeers([peer])\n\n if (sendDisconnectToPeer) {\n await this.sendDisconnectToPeer(peer)\n }\n\n return removePeerResult\n }\n\n public async removeAllPeers(sendDisconnectToPeers: boolean = false): Promise<void> {\n const peers: ExtendedP2PPairingResponse[] = await (await this.transport).getPeers()\n const removePeerResult = (await this.transport).removeAllPeers()\n\n await this.removePermissionsForPeers(peers)\n\n if (sendDisconnectToPeers) {\n const disconnectPromises = peers.map((peer) => this.sendDisconnectToPeer(peer))\n\n await Promise.all(disconnectPromises)\n }\n\n return removePeerResult\n }\n\n private async removePermissionsForPeers(\n peersToRemove: ExtendedP2PPairingResponse[]\n ): Promise<void> {\n const permissions = await this.permissionManager.getPermissions()\n\n const peerIdsToRemove = peersToRemove.map((peer) => peer.senderId)\n // Remove all permissions with origin of the specified peer\n const permissionsToRemove = permissions.filter((permission) =>\n peerIdsToRemove.includes(permission.appMetadata.senderId)\n )\n const permissionIdentifiersToRemove = permissionsToRemove.map(\n (permissionInfo) => permissionInfo.accountIdentifier\n )\n await this.permissionManager.removePermissions(permissionIdentifiersToRemove)\n }\n\n /**\n * Send an acknowledge message back to the sender\n *\n * @param message The message that was received\n */\n private async sendAcknowledgeResponse(\n request: BeaconRequestMessage | BeaconMessageWrapper<BeaconBaseMessage>,\n connectionContext: ConnectionContext\n ): Promise<void> {\n // Acknowledge the message\n const acknowledgeResponse: AcknowledgeResponseInput = {\n id: request.id,\n type: BeaconMessageType.Acknowledge\n }\n\n await OutgoingResponseInterceptor.intercept({\n senderId: await getSenderId(await this.beaconId),\n request,\n message: acknowledgeResponse,\n ownAppMetadata: await this.getOwnAppMetadata(),\n permissionManager: this.permissionManager,\n appMetadataManager: this.appMetadataManager,\n interceptorCallback: async (response: BeaconMessage): Promise<void> => {\n await this.respondToMessage(response, connectionContext)\n }\n })\n }\n\n /**\n * An internal method to send a BeaconMessage to the DApp\n *\n * @param response Send a message back to the DApp\n */\n private async respondToMessage(\n response: BeaconMessage,\n connectionContext: ConnectionContext\n ): Promise<void> {\n const serializedMessage: string = await new Serializer().serialize(response)\n if (connectionContext) {\n const peerInfos = await this.getPeers()\n const peer = peerInfos.find((peerInfo) => peerInfo.publicKey === connectionContext.id)\n await (await this.transport).send(serializedMessage, peer)\n } else {\n await (await this.transport).send(serializedMessage)\n }\n }\n\n private async disconnect(senderId: string) {\n const transport = await this.transport\n const peers: ExtendedPeerInfo[] = await transport.getPeers()\n const peer: ExtendedPeerInfo | undefined = peers.find((peerEl) => peerEl.senderId === senderId)\n\n if (!peer) {\n return\n }\n\n let removePeerError: unknown\n try {\n await this.removePeer(peer as any)\n } catch (error) {\n removePeerError = error\n }\n\n this.notifyDisconnectListeners(senderId)\n\n if (removePeerError) {\n throw removePeerError\n }\n }\n\n private notifyDisconnectListeners(senderId: string): void {\n for (const listener of Array.from(this.disconnectListeners)) {\n try {\n Promise.resolve(listener(senderId)).catch((error) => {\n logger.error('disconnect listener', error)\n })\n } catch (error) {\n logger.error('disconnect listener', error)\n }\n }\n }\n\n private getDisconnectSenderId(\n message: BeaconRequestMessage | BeaconMessageWrapper<BeaconBaseMessage> | DisconnectMessage\n ): string | undefined {\n if (message.version === '3') {\n const wrappedMessage = message as BeaconMessageWrapper<BeaconBaseMessage>\n if (wrappedMessage.message?.type === BeaconMessageType.Disconnect) {\n return wrappedMessage.senderId\n }\n }\n\n const typedMessage = message as DisconnectMessage\n\n return typedMessage.type === BeaconMessageType.Disconnect ? typedMessage.senderId : undefined\n }\n}\n"]}