@tezos-x/octez.connect-core 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.
Files changed (61) hide show
  1. package/dist/cjs/clients/client/Client.d.ts +6 -1
  2. package/dist/cjs/clients/client/Client.js +17 -4
  3. package/dist/cjs/clients/client/Client.js.map +1 -1
  4. package/dist/cjs/constants.js +1 -1
  5. package/dist/cjs/constants.js.map +1 -1
  6. package/dist/cjs/errors/PeerUnreachableBeaconError.d.ts +9 -0
  7. package/dist/cjs/errors/PeerUnreachableBeaconError.js +17 -0
  8. package/dist/cjs/errors/PeerUnreachableBeaconError.js.map +1 -0
  9. package/dist/cjs/errors/get-error.js +3 -0
  10. package/dist/cjs/errors/get-error.js.map +1 -1
  11. package/dist/cjs/index.d.ts +2 -1
  12. package/dist/cjs/index.js +3 -1
  13. package/dist/cjs/index.js.map +1 -1
  14. package/dist/cjs/storage/ChromeStorage.js +6 -15
  15. package/dist/cjs/storage/ChromeStorage.js.map +1 -1
  16. package/dist/cjs/storage/IndexedDBStorage.js +8 -1
  17. package/dist/cjs/storage/IndexedDBStorage.js.map +1 -1
  18. package/dist/cjs/storage/LocalStorage.js +5 -16
  19. package/dist/cjs/storage/LocalStorage.js.map +1 -1
  20. package/dist/cjs/storage/WCStorage.d.ts +1 -2
  21. package/dist/cjs/storage/WCStorage.js +40 -19
  22. package/dist/cjs/storage/WCStorage.js.map +1 -1
  23. package/dist/cjs/storage/storage-normalization.d.ts +9 -0
  24. package/dist/cjs/storage/storage-normalization.js +135 -0
  25. package/dist/cjs/storage/storage-normalization.js.map +1 -0
  26. package/dist/cjs/transports/Transport.js +6 -2
  27. package/dist/cjs/transports/Transport.js.map +1 -1
  28. package/dist/cjs/utils/multi-tab-channel.d.ts +1 -0
  29. package/dist/cjs/utils/multi-tab-channel.js +15 -0
  30. package/dist/cjs/utils/multi-tab-channel.js.map +1 -1
  31. package/dist/esm/clients/client/Client.d.ts +6 -1
  32. package/dist/esm/clients/client/Client.js +17 -4
  33. package/dist/esm/clients/client/Client.js.map +1 -1
  34. package/dist/esm/constants.js +1 -1
  35. package/dist/esm/constants.js.map +1 -1
  36. package/dist/esm/errors/PeerUnreachableBeaconError.d.ts +9 -0
  37. package/dist/esm/errors/PeerUnreachableBeaconError.js +13 -0
  38. package/dist/esm/errors/PeerUnreachableBeaconError.js.map +1 -0
  39. package/dist/esm/errors/get-error.js +3 -0
  40. package/dist/esm/errors/get-error.js.map +1 -1
  41. package/dist/esm/index.d.ts +2 -1
  42. package/dist/esm/index.js +2 -1
  43. package/dist/esm/index.js.map +1 -1
  44. package/dist/esm/storage/ChromeStorage.js +6 -15
  45. package/dist/esm/storage/ChromeStorage.js.map +1 -1
  46. package/dist/esm/storage/IndexedDBStorage.js +8 -1
  47. package/dist/esm/storage/IndexedDBStorage.js.map +1 -1
  48. package/dist/esm/storage/LocalStorage.js +6 -17
  49. package/dist/esm/storage/LocalStorage.js.map +1 -1
  50. package/dist/esm/storage/WCStorage.d.ts +1 -2
  51. package/dist/esm/storage/WCStorage.js +40 -17
  52. package/dist/esm/storage/WCStorage.js.map +1 -1
  53. package/dist/esm/storage/storage-normalization.d.ts +9 -0
  54. package/dist/esm/storage/storage-normalization.js +128 -0
  55. package/dist/esm/storage/storage-normalization.js.map +1 -0
  56. package/dist/esm/transports/Transport.js +6 -2
  57. package/dist/esm/transports/Transport.js.map +1 -1
  58. package/dist/esm/utils/multi-tab-channel.d.ts +1 -0
  59. package/dist/esm/utils/multi-tab-channel.js +13 -0
  60. package/dist/esm/utils/multi-tab-channel.js.map +1 -1
  61. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-normalization.js","sourceRoot":"","sources":["../../../src/storage/storage-normalization.ts"],"names":[],"mappings":"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","sourcesContent":["import { StorageKey, StorageKeyReturnType, defaultValues } from '@tezos-x/octez.connect-types'\n\nexport const ARRAY_STORAGE_KEYS = new Set<StorageKey>([\n StorageKey.TRANSPORT_P2P_PEERS_DAPP,\n StorageKey.TRANSPORT_P2P_PEERS_WALLET,\n StorageKey.TRANSPORT_POSTMESSAGE_PEERS_DAPP,\n StorageKey.TRANSPORT_POSTMESSAGE_PEERS_WALLET,\n StorageKey.TRANSPORT_WALLETCONNECT_PEERS_DAPP,\n StorageKey.ACCOUNTS,\n StorageKey.PUSH_TOKENS,\n StorageKey.APP_METADATA_LIST,\n StorageKey.PERMISSION_LIST,\n StorageKey.ONGOING_PROOF_OF_EVENT_CHALLENGES\n])\n\nexport const BOOLEAN_STORAGE_KEYS = new Set<StorageKey>([\n StorageKey.MULTI_NODE_SETUP_DONE,\n StorageKey.ENABLE_METRICS\n])\n\nexport const OBJECT_STORAGE_KEYS = new Set<StorageKey>([\n StorageKey.LAST_SELECTED_WALLET,\n StorageKey.MATRIX_PRESERVED_STATE,\n StorageKey.MATRIX_PEER_ROOM_IDS\n])\n\nexport const STRING_STORAGE_KEYS = new Set<StorageKey>([\n StorageKey.ACTIVE_ACCOUNT,\n StorageKey.BEACON_SDK_SECRET_SEED,\n StorageKey.BEACON_LAST_ERROR,\n StorageKey.BEACON_SDK_VERSION,\n StorageKey.MATRIX_SELECTED_NODE,\n StorageKey.USER_ID,\n StorageKey.WC_INIT_ERROR,\n StorageKey.WC_2_CLIENT_SESSION,\n StorageKey.WC_2_CORE_PAIRING,\n StorageKey.WC_2_CORE_KEYCHAIN,\n StorageKey.WC_2_CORE_MESSAGES,\n StorageKey.WC_2_CLIENT_PROPOSAL,\n StorageKey.WC_2_CORE_SUBSCRIPTION,\n StorageKey.WC_2_CORE_HISTORY,\n StorageKey.WC_2_CORE_EXPIRER\n])\n\nconst SENTINEL_STRINGS = new Set(['undefined', 'null'])\nconst CLASSIFIED_STORAGE_KEYS = [\n ...ARRAY_STORAGE_KEYS,\n ...BOOLEAN_STORAGE_KEYS,\n ...OBJECT_STORAGE_KEYS,\n ...STRING_STORAGE_KEYS\n]\nconst STORAGE_KEY_VALUES = new Set<string>(Object.values(StorageKey))\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst defaultValue = <K extends StorageKey>(key: K): StorageKeyReturnType[K] => {\n const value = defaultValues[key]\n\n return (\n isRecord(value) || Array.isArray(value) ? JSON.parse(JSON.stringify(value)) : value\n ) as StorageKeyReturnType[K]\n}\n\nconst parseStringifiedString = (rawValue: string): unknown => {\n try {\n return JSON.parse(rawValue)\n } catch {\n return undefined\n }\n}\n\nconst parseStoredValue = (rawValue: string): unknown => {\n try {\n return JSON.parse(rawValue)\n } catch {\n return rawValue\n }\n}\n\nconst normalizeRawStringValue = <K extends StorageKey>(\n key: K,\n rawValue: string\n): StorageKeyReturnType[K] => {\n // STRING keys are SDK-controlled identifiers and serialized WalletConnect blobs, not free-form text.\n if (!rawValue.startsWith('\"')) {\n return rawValue as StorageKeyReturnType[K]\n }\n\n const parsedValue = parseStringifiedString(rawValue)\n\n if (typeof parsedValue !== 'string' || !parsedValue || SENTINEL_STRINGS.has(parsedValue)) {\n return defaultValue(key)\n }\n\n return parsedValue as StorageKeyReturnType[K]\n}\n\nconst formatKeys = (keys: readonly string[]): string =>\n keys.length === 0 ? 'none' : keys.join(', ')\n\nexport const normalizeParsedStoredValue = <K extends StorageKey>(\n key: K,\n value: unknown\n): StorageKeyReturnType[K] => {\n if (\n value === undefined ||\n value === null ||\n (typeof value === 'string' && (!value || SENTINEL_STRINGS.has(value)))\n ) {\n return defaultValue(key)\n }\n\n if (ARRAY_STORAGE_KEYS.has(key)) {\n return (Array.isArray(value) ? value : defaultValue(key)) as StorageKeyReturnType[K]\n }\n\n if (BOOLEAN_STORAGE_KEYS.has(key)) {\n return (typeof value === 'boolean' ? value : defaultValue(key)) as StorageKeyReturnType[K]\n }\n\n if (OBJECT_STORAGE_KEYS.has(key)) {\n return (isRecord(value) ? value : defaultValue(key)) as StorageKeyReturnType[K]\n }\n\n if (STRING_STORAGE_KEYS.has(key)) {\n return (typeof value === 'string' ? value : defaultValue(key)) as StorageKeyReturnType[K]\n }\n\n return defaultValue(key)\n}\n\n// LocalStorage exposes raw strings; Chrome and IndexedDB expose already-decoded JS values.\nexport const normalizeStoredValue = <K extends StorageKey>(\n key: K,\n rawValue: string | null | undefined\n): StorageKeyReturnType[K] => {\n if (!rawValue || SENTINEL_STRINGS.has(rawValue)) {\n return defaultValue(key)\n }\n\n if (STRING_STORAGE_KEYS.has(key)) {\n return normalizeRawStringValue(key, rawValue)\n }\n\n return normalizeParsedStoredValue(key, parseStoredValue(rawValue))\n}\n\nexport const isStorageKey = (key: string): key is StorageKey => STORAGE_KEY_VALUES.has(key)\n\nexport const assertStorageKeyNormalizationIsExhaustive = (\n expectedStorageKeys: readonly string[] = Object.values(StorageKey)\n): void => {\n const expectedKeys = new Set(expectedStorageKeys)\n const classifiedKeyValues = new Set<string>(CLASSIFIED_STORAGE_KEYS)\n const missingKeys = expectedStorageKeys.filter((key) => !classifiedKeyValues.has(key))\n const extraKeys = CLASSIFIED_STORAGE_KEYS.filter((key) => !expectedKeys.has(key))\n const duplicateKeys = CLASSIFIED_STORAGE_KEYS.filter(\n (key, index) => CLASSIFIED_STORAGE_KEYS.indexOf(key) !== index\n )\n\n if (missingKeys.length > 0 || extraKeys.length > 0 || duplicateKeys.length > 0) {\n throw new Error(\n [\n 'Storage normalization keys are not exhaustive.',\n `Missing: ${formatKeys(missingKeys)}.`,\n `Extra: ${formatKeys(extraKeys)}.`,\n `Duplicate: ${formatKeys(duplicateKeys)}.`\n ].join(' ')\n )\n }\n}\n\nassertStorageKeyNormalizationIsExhaustive()\n"]}
@@ -81,8 +81,12 @@ export class Transport {
81
81
  else {
82
82
  const knownPeers = await this.getPeers();
83
83
  // A broadcast request has to be sent everywhere.
84
- const promises = knownPeers.map((peerEl) => this.client.sendMessage(message, peerEl));
85
- return (await Promise.all(promises))[0];
84
+ const results = await Promise.allSettled(knownPeers.map((peerEl) => this.client.sendMessage(message, peerEl)));
85
+ results.forEach((result) => {
86
+ if (result.status === 'rejected') {
87
+ logger.warn('Transport.send broadcast', result.reason);
88
+ }
89
+ });
86
90
  }
87
91
  }
88
92
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"Transport.js","sourceRoot":"","sources":["../../../src/transports/Transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from '../utils/Logger'\nimport {\n TransportType,\n TransportStatus,\n PeerInfo,\n StorageKey,\n StorageKeyReturnType,\n ConnectionContext\n} from '@tezos-x/octez.connect-types'\nimport { PeerManager } from '../managers/PeerManager'\nimport { ArrayElem } from '../managers/StorageManager'\nimport { CommunicationClient } from './clients/CommunicationClient'\nimport { ClientEvents } from './clients/ClientEvents'\n\nconst logger = new Logger('Transport')\n\n/**\n * @internalapi\n *\n *\n */\nexport abstract class Transport<\n T extends PeerInfo = PeerInfo,\n K extends\n | StorageKey.TRANSPORT_P2P_PEERS_DAPP\n | StorageKey.TRANSPORT_P2P_PEERS_WALLET\n | StorageKey.TRANSPORT_POSTMESSAGE_PEERS_DAPP\n | StorageKey.TRANSPORT_POSTMESSAGE_PEERS_WALLET\n | StorageKey.TRANSPORT_WALLETCONNECT_PEERS_DAPP = any,\n S extends CommunicationClient = any\n> {\n /**\n * The type of the transport\n */\n public readonly type: TransportType = TransportType.POST_MESSAGE\n\n /**\n * The name of the app\n */\n protected readonly name: string\n\n /**\n * The status of the transport\n */\n protected _isConnected: TransportStatus = TransportStatus.NOT_CONNECTED\n\n protected readonly peerManager: PeerManager<K>\n\n /**\n * The client handling the encryption/decryption of messages\n */\n protected client: S\n\n /**\n * The listener that will be invoked when a new peer is connected\n */\n protected newPeerListener?: (peer: T) => void\n\n setEventHandler(event: ClientEvents, fun: Function) {\n this.client.eventHandlers.set(event, fun)\n }\n\n /**\n * The listeners that will be notified when new messages are coming in\n */\n private listeners: ((message: unknown, connectionInfo: ConnectionContext) => void)[] = []\n\n /**\n * Return the status of the connection\n */\n public get connectionStatus(): TransportStatus {\n return this._isConnected\n }\n\n constructor(name: string, client: S, peerManager: PeerManager<K>) {\n this.name = name\n this.client = client\n this.peerManager = peerManager\n }\n\n /**\n * Returns a promise that resolves to true if the transport is available, false if it is not\n */\n public static async isAvailable(): Promise<boolean> {\n return Promise.resolve(false)\n }\n\n /**\n * Connect the transport\n */\n public async connect(): Promise<void> {\n logger.log('connect')\n this._isConnected = TransportStatus.CONNECTED\n\n return\n }\n\n /**\n * Disconnect the transport\n */\n public async disconnect(): Promise<void> {\n logger.log('disconnect')\n this._isConnected = TransportStatus.NOT_CONNECTED\n\n return\n }\n\n /**\n * Send a message through the transport\n *\n * @param message The message to send\n * @param recipient The recipient of the message\n */\n public async send(message: string, peer?: PeerInfo): Promise<void> {\n if (peer) {\n return this.client.sendMessage(message, peer)\n } else {\n const knownPeers = await this.getPeers()\n // A broadcast request has to be sent everywhere.\n const promises = knownPeers.map((peerEl) => this.client.sendMessage(message, peerEl))\n\n return (await Promise.all(promises))[0]\n }\n }\n\n /**\n * Add a listener to be called when a new message is received\n *\n * @param listener The listener that will be registered\n */\n public async addListener(\n listener: (message: unknown, connectionInfo: ConnectionContext) => void\n ): Promise<void> {\n logger.debug('addListener')\n\n this.listeners.push(listener)\n\n return\n }\n\n /**\n * Remove a listener\n *\n * @param listener\n */\n public async removeListener(\n listener: (message: string, connectionInfo: ConnectionContext) => void\n ): Promise<void> {\n logger.log('removeListener')\n\n this.listeners = this.listeners.filter((element) => element !== listener)\n\n return\n }\n\n public async getPeers(): Promise<T[]> {\n return this.peerManager.getPeers() as any // TODO: Fix type\n }\n\n public async addPeer(newPeer: T, _sendPairingResponse: boolean = true): Promise<void> {\n logger.log('addPeer', 'adding peer', newPeer)\n await this.peerManager.addPeer(newPeer as ArrayElem<StorageKeyReturnType[K]>) // TODO: Fix type\n await this.listen(newPeer.publicKey)\n }\n\n public async removePeer(peerToBeRemoved: T): Promise<void> {\n logger.log('removePeer', 'removing peer', peerToBeRemoved)\n await this.peerManager.removePeer(peerToBeRemoved.publicKey)\n if (this.client) {\n await this.client.unsubscribeFromEncryptedMessage(peerToBeRemoved.publicKey)\n }\n }\n\n public async removeAllPeers(): Promise<void> {\n logger.log('removeAllPeers')\n await this.peerManager.removeAllPeers()\n if (this.client) {\n await this.client.unsubscribeFromEncryptedMessages()\n }\n }\n\n /**\n * Notify the listeners when a new message comes in\n *\n * @param message Message\n * @param connectionInfo Context info about the connection\n */\n protected async notifyListeners(\n message: unknown,\n connectionInfo: ConnectionContext\n ): Promise<void> {\n if (this.listeners.length === 0) {\n logger.warn('notifyListeners', '0 listeners notified!', this)\n } else {\n logger.log('notifyListeners', `Notifying ${this.listeners.length} listeners`, this)\n }\n\n this.listeners.forEach((listener) => {\n listener(message, connectionInfo)\n })\n\n return\n }\n\n abstract listen(publicKey: string): Promise<void>\n}\n"]}
1
+ {"version":3,"file":"Transport.js","sourceRoot":"","sources":["../../../src/transports/Transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from '../utils/Logger'\nimport {\n TransportType,\n TransportStatus,\n PeerInfo,\n StorageKey,\n StorageKeyReturnType,\n ConnectionContext\n} from '@tezos-x/octez.connect-types'\nimport { PeerManager } from '../managers/PeerManager'\nimport { ArrayElem } from '../managers/StorageManager'\nimport { CommunicationClient } from './clients/CommunicationClient'\nimport { ClientEvents } from './clients/ClientEvents'\n\nconst logger = new Logger('Transport')\n\n/**\n * @internalapi\n *\n *\n */\nexport abstract class Transport<\n T extends PeerInfo = PeerInfo,\n K extends\n | StorageKey.TRANSPORT_P2P_PEERS_DAPP\n | StorageKey.TRANSPORT_P2P_PEERS_WALLET\n | StorageKey.TRANSPORT_POSTMESSAGE_PEERS_DAPP\n | StorageKey.TRANSPORT_POSTMESSAGE_PEERS_WALLET\n | StorageKey.TRANSPORT_WALLETCONNECT_PEERS_DAPP = any,\n S extends CommunicationClient = any\n> {\n /**\n * The type of the transport\n */\n public readonly type: TransportType = TransportType.POST_MESSAGE\n\n /**\n * The name of the app\n */\n protected readonly name: string\n\n /**\n * The status of the transport\n */\n protected _isConnected: TransportStatus = TransportStatus.NOT_CONNECTED\n\n protected readonly peerManager: PeerManager<K>\n\n /**\n * The client handling the encryption/decryption of messages\n */\n protected client: S\n\n /**\n * The listener that will be invoked when a new peer is connected\n */\n protected newPeerListener?: (peer: T) => void\n\n setEventHandler(event: ClientEvents, fun: Function) {\n this.client.eventHandlers.set(event, fun)\n }\n\n /**\n * The listeners that will be notified when new messages are coming in\n */\n private listeners: ((message: unknown, connectionInfo: ConnectionContext) => void)[] = []\n\n /**\n * Return the status of the connection\n */\n public get connectionStatus(): TransportStatus {\n return this._isConnected\n }\n\n constructor(name: string, client: S, peerManager: PeerManager<K>) {\n this.name = name\n this.client = client\n this.peerManager = peerManager\n }\n\n /**\n * Returns a promise that resolves to true if the transport is available, false if it is not\n */\n public static async isAvailable(): Promise<boolean> {\n return Promise.resolve(false)\n }\n\n /**\n * Connect the transport\n */\n public async connect(): Promise<void> {\n logger.log('connect')\n this._isConnected = TransportStatus.CONNECTED\n\n return\n }\n\n /**\n * Disconnect the transport\n */\n public async disconnect(): Promise<void> {\n logger.log('disconnect')\n this._isConnected = TransportStatus.NOT_CONNECTED\n\n return\n }\n\n /**\n * Send a message through the transport\n *\n * @param message The message to send\n * @param recipient The recipient of the message\n */\n public async send(message: string, peer?: PeerInfo): Promise<void> {\n if (peer) {\n return this.client.sendMessage(message, peer)\n } else {\n const knownPeers = await this.getPeers()\n // A broadcast request has to be sent everywhere.\n const results = await Promise.allSettled(\n knownPeers.map((peerEl) => this.client.sendMessage(message, peerEl))\n )\n results.forEach((result) => {\n if (result.status === 'rejected') {\n logger.warn('Transport.send broadcast', result.reason)\n }\n })\n }\n }\n\n /**\n * Add a listener to be called when a new message is received\n *\n * @param listener The listener that will be registered\n */\n public async addListener(\n listener: (message: unknown, connectionInfo: ConnectionContext) => void\n ): Promise<void> {\n logger.debug('addListener')\n\n this.listeners.push(listener)\n\n return\n }\n\n /**\n * Remove a listener\n *\n * @param listener\n */\n public async removeListener(\n listener: (message: string, connectionInfo: ConnectionContext) => void\n ): Promise<void> {\n logger.log('removeListener')\n\n this.listeners = this.listeners.filter((element) => element !== listener)\n\n return\n }\n\n public async getPeers(): Promise<T[]> {\n return this.peerManager.getPeers() as any // TODO: Fix type\n }\n\n public async addPeer(newPeer: T, _sendPairingResponse: boolean = true): Promise<void> {\n logger.log('addPeer', 'adding peer', newPeer)\n await this.peerManager.addPeer(newPeer as ArrayElem<StorageKeyReturnType[K]>) // TODO: Fix type\n await this.listen(newPeer.publicKey)\n }\n\n public async removePeer(peerToBeRemoved: T): Promise<void> {\n logger.log('removePeer', 'removing peer', peerToBeRemoved)\n await this.peerManager.removePeer(peerToBeRemoved.publicKey)\n if (this.client) {\n await this.client.unsubscribeFromEncryptedMessage(peerToBeRemoved.publicKey)\n }\n }\n\n public async removeAllPeers(): Promise<void> {\n logger.log('removeAllPeers')\n await this.peerManager.removeAllPeers()\n if (this.client) {\n await this.client.unsubscribeFromEncryptedMessages()\n }\n }\n\n /**\n * Notify the listeners when a new message comes in\n *\n * @param message Message\n * @param connectionInfo Context info about the connection\n */\n protected async notifyListeners(\n message: unknown,\n connectionInfo: ConnectionContext\n ): Promise<void> {\n if (this.listeners.length === 0) {\n logger.warn('notifyListeners', '0 listeners notified!', this)\n } else {\n logger.log('notifyListeners', `Notifying ${this.listeners.length} listeners`, this)\n }\n\n this.listeners.forEach((listener) => {\n listener(message, connectionInfo)\n })\n\n return\n }\n\n abstract listen(publicKey: string): Promise<void>\n}\n"]}
@@ -8,6 +8,7 @@ export declare class MultiTabChannel {
8
8
  private initialized;
9
9
  constructor(name: string, onBCMessageHandler: Function, onElectedLeaderHandler: Function);
10
10
  init(): Promise<void>;
11
+ close(): Promise<void>;
11
12
  private onBeforeUnloadHandler;
12
13
  private onMessageHandler;
13
14
  isLeader(): boolean;
@@ -31,6 +31,19 @@ export class MultiTabChannel {
31
31
  window?.addEventListener('beforeunload', this.eventListeners[0]);
32
32
  this.initialized = true;
33
33
  }
34
+ async close() {
35
+ const wasLeader = this.wasLeader;
36
+ window?.removeEventListener('beforeunload', this.eventListeners[0]);
37
+ this.channel.removeEventListener('message', this.eventListeners[1]);
38
+ this.channel.onmessage = null;
39
+ await this.elector.die();
40
+ if (wasLeader) {
41
+ this.postMessage({ type: 'LEADER_DEAD' });
42
+ }
43
+ await this.channel.close();
44
+ this.initialized = false;
45
+ this.wasLeader = false;
46
+ }
34
47
  async onBeforeUnloadHandler() {
35
48
  if (this.wasLeader) {
36
49
  await this.elector.die();
@@ -1 +1 @@
1
- {"version":3,"file":"multi-tab-channel.js","sourceRoot":"","sources":["../../../src/utils/multi-tab-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAiB,MAAM,mBAAmB,CAAA;AAQzF,MAAM,OAAO,eAAe;IAClB,OAAO,CAAkB;IACzB,OAAO,CAAe;IACtB,cAAc,GAAG;QACvB,GAAG,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE;QAClC,CAAC,OAAY,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;KACjD,CAAA;IACO,kBAAkB,CAAU;IAC5B,sBAAsB,CAAU;IACxC,uDAAuD;IACvD,4DAA4D;IACpD,SAAS,GAAY,KAAK,CAAA;IAC1B,WAAW,GAAY,KAAK,CAAA;IAEpC,YAAY,IAAY,EAAE,kBAA4B,EAAE,sBAAgC;QACtF,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAA;QAC5C,IAAI,CAAC,sBAAsB,GAAG,sBAAsB,CAAA;QACpD,IAAI,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAA;QACzC,IAAI,CAAC,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACnD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAM;QACR,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAA;QAEhD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAA;YACpC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAClC,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAA;QAC/C,MAAM,EAAE,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;QAEhE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;IACzB,CAAC;IAEO,KAAK,CAAC,qBAAqB;QACjC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAA;YACxB,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAA;QAC3C,CAAC;QAED,MAAM,EAAE,mBAAmB,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;QACnE,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;IACrE,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,OAAgB;QAC7C,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACnC,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAA;YAEpC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;YAEhC,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACpB,IAAI,CAAC,sBAAsB,EAAE,CAAA;YAC/B,CAAC;YACD,OAAM;QACR,CAAC;QAED,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAClC,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAA;IACvC,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAA;IACjC,CAAC;IAED,WAAW,CAAC,OAAY;QACtB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;IACnC,CAAC;CACF","sourcesContent":["import { createLeaderElection, BroadcastChannel, LeaderElector } from 'broadcast-channel'\n\ntype Message = {\n type: string\n id: string\n data: any\n}\n\nexport class MultiTabChannel {\n private channel: BroadcastChannel\n private elector: LeaderElector\n private eventListeners = [\n () => this.onBeforeUnloadHandler(),\n (message: any) => this.onMessageHandler(message)\n ]\n private onBCMessageHandler: Function\n private onElectedLeaderHandler: Function\n // Auxiliary variable needed for handling beforeUnload.\n // Closing a tab causes the elector to be killed immediately\n private wasLeader: boolean = false\n private initialized: boolean = false\n\n constructor(name: string, onBCMessageHandler: Function, onElectedLeaderHandler: Function) {\n this.onBCMessageHandler = onBCMessageHandler\n this.onElectedLeaderHandler = onElectedLeaderHandler\n this.channel = new BroadcastChannel(name)\n this.elector = createLeaderElection(this.channel)\n }\n\n async init() {\n if (this.initialized) {\n return\n }\n\n const hasLeader = await this.elector.hasLeader()\n\n if (!hasLeader) {\n await this.elector.awaitLeadership()\n this.wasLeader = this.isLeader()\n }\n\n this.channel.onmessage = this.eventListeners[1]\n window?.addEventListener('beforeunload', this.eventListeners[0])\n\n this.initialized = true\n }\n\n private async onBeforeUnloadHandler() {\n if (this.wasLeader) {\n await this.elector.die()\n this.postMessage({ type: 'LEADER_DEAD' })\n }\n\n window?.removeEventListener('beforeunload', this.eventListeners[0])\n this.channel.removeEventListener('message', this.eventListeners[1])\n }\n\n private async onMessageHandler(message: Message) {\n if (message.type === 'LEADER_DEAD') {\n await this.elector.awaitLeadership()\n\n this.wasLeader = this.isLeader()\n\n if (this.isLeader()) {\n this.onElectedLeaderHandler()\n }\n return\n }\n\n this.onBCMessageHandler(message)\n }\n\n isLeader(): boolean {\n return this.elector.isLeader\n }\n\n async getLeadership() {\n return this.elector.awaitLeadership()\n }\n\n async hasLeader(): Promise<boolean> {\n return this.elector.hasLeader()\n }\n\n postMessage(message: any): void {\n this.channel.postMessage(message)\n }\n}\n"]}
1
+ {"version":3,"file":"multi-tab-channel.js","sourceRoot":"","sources":["../../../src/utils/multi-tab-channel.ts"],"names":[],"mappings":"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","sourcesContent":["import { createLeaderElection, BroadcastChannel, LeaderElector } from 'broadcast-channel'\n\ntype Message = {\n type: string\n id: string\n data: any\n}\n\nexport class MultiTabChannel {\n private channel: BroadcastChannel\n private elector: LeaderElector\n private eventListeners = [\n () => this.onBeforeUnloadHandler(),\n (message: any) => this.onMessageHandler(message)\n ]\n private onBCMessageHandler: Function\n private onElectedLeaderHandler: Function\n // Auxiliary variable needed for handling beforeUnload.\n // Closing a tab causes the elector to be killed immediately\n private wasLeader: boolean = false\n private initialized: boolean = false\n\n constructor(name: string, onBCMessageHandler: Function, onElectedLeaderHandler: Function) {\n this.onBCMessageHandler = onBCMessageHandler\n this.onElectedLeaderHandler = onElectedLeaderHandler\n this.channel = new BroadcastChannel(name)\n this.elector = createLeaderElection(this.channel)\n }\n\n async init() {\n if (this.initialized) {\n return\n }\n\n const hasLeader = await this.elector.hasLeader()\n\n if (!hasLeader) {\n await this.elector.awaitLeadership()\n this.wasLeader = this.isLeader()\n }\n\n this.channel.onmessage = this.eventListeners[1]\n window?.addEventListener('beforeunload', this.eventListeners[0])\n\n this.initialized = true\n }\n\n public async close() {\n const wasLeader = this.wasLeader\n window?.removeEventListener('beforeunload', this.eventListeners[0])\n this.channel.removeEventListener('message', this.eventListeners[1])\n this.channel.onmessage = null\n await this.elector.die()\n if (wasLeader) {\n this.postMessage({ type: 'LEADER_DEAD' })\n }\n await this.channel.close()\n this.initialized = false\n this.wasLeader = false\n }\n\n private async onBeforeUnloadHandler() {\n if (this.wasLeader) {\n await this.elector.die()\n this.postMessage({ type: 'LEADER_DEAD' })\n }\n\n window?.removeEventListener('beforeunload', this.eventListeners[0])\n this.channel.removeEventListener('message', this.eventListeners[1])\n }\n\n private async onMessageHandler(message: Message) {\n if (message.type === 'LEADER_DEAD') {\n await this.elector.awaitLeadership()\n\n this.wasLeader = this.isLeader()\n\n if (this.isLeader()) {\n this.onElectedLeaderHandler()\n }\n return\n }\n\n this.onBCMessageHandler(message)\n }\n\n isLeader(): boolean {\n return this.elector.isLeader\n }\n\n async getLeadership() {\n return this.elector.awaitLeadership()\n }\n\n async hasLeader(): Promise<boolean> {\n return this.elector.hasLeader()\n }\n\n postMessage(message: any): void {\n this.channel.postMessage(message)\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tezos-x/octez.connect-core",
3
- "version": "4.8.4",
3
+ "version": "4.8.5",
4
4
  "description": "Core client, storage, and protocol helpers shared across the octez.connect SDK packages.",
5
5
  "author": "Trilitech",
6
6
  "license": "ISC",
@@ -38,8 +38,8 @@
38
38
  "@stablelib/nacl": "^2.0.1",
39
39
  "@stablelib/utf8": "^2.1.0",
40
40
  "@stablelib/x25519-session": "^2.0.1",
41
- "@tezos-x/octez.connect-types": "4.8.4",
42
- "@tezos-x/octez.connect-utils": "4.8.4",
41
+ "@tezos-x/octez.connect-types": "4.8.5",
42
+ "@tezos-x/octez.connect-utils": "4.8.5",
43
43
  "broadcast-channel": "^7.3.0",
44
44
  "bs58check": "4.0.0"
45
45
  }