@w3ux/observables-connect 1.0.6 → 2.0.0

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/accounts/index.ts","../../src/accounts/util.ts","../../src/consts.ts","../../src/subjects.ts","../../src/local.ts","../../src/accounts/get.ts","../../src/accounts/unsubs.ts"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nexport * from './get'\nexport * from './unsubs'\nexport * from './util'\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tProcessExtensionAccountsResult,\n} from '@w3ux/types'\nimport { formatAccountSs58, isValidAddress } from '@w3ux/util-dedot'\nimport { DefaultProcessExtensionResult } from '../consts'\nimport { _extensionAccounts } from '../subjects'\n\n// Gets accounts to be imported and commits them to state\n\ninterface Config {\n\tsource: string\n\tss58: number\n}\nexport const processExtensionAccounts = (\n\tconfig: Config,\n\tsigner: unknown,\n\tnewAccounts: ExtensionAccount[],\n): ProcessExtensionAccountsResult => {\n\tconst { source, ss58 } = config\n\tif (!newAccounts.length) {\n\t\treturn DefaultProcessExtensionResult\n\t}\n\n\t// Get valid accounts from extension\n\tnewAccounts = formatExtensionAccounts(newAccounts, ss58)\n\n\t// Find any accounts that have been removed from this extension\n\tconst removedAccounts = _extensionAccounts\n\t\t.getValue()\n\t\t.filter((j) => j.source === source)\n\t\t.filter((j) => !newAccounts.find((i) => i.address === j.address))\n\n\t// Remove accounts that have already been imported\n\tnewAccounts = newAccounts.filter(\n\t\t({ address }) =>\n\t\t\t!_extensionAccounts\n\t\t\t\t.getValue()\n\t\t\t\t.find((j) => j.address === address && j.source === source),\n\t)\n\n\t// Format accounts properties\n\tnewAccounts = newAccounts.map(({ address, name }) => ({\n\t\taddress,\n\t\tname,\n\t\tsource,\n\t\tsigner,\n\t}))\n\n\t// Update observable state\n\tupdateAccounts({\n\t\tadd: newAccounts,\n\t\tremove: removedAccounts,\n\t})\n\n\treturn {\n\t\tnewAccounts,\n\t\tremovedAccounts: [...removedAccounts],\n\t}\n}\n\n// Formats accounts to correct ss58 and removes invalid accounts\nexport const formatExtensionAccounts = (\n\taccounts: ExtensionAccount[],\n\tss58: number,\n) => {\n\taccounts = accounts\n\t\t// Remove accounts that do not contain correctly formatted addresses\n\t\t.filter(({ address }) => isValidAddress(address))\n\t\t// Reformat addresses to ensure default ss58 format\n\t\t.map((account) => {\n\t\t\tconst formattedAddress = formatAccountSs58(account.address, ss58)\n\t\t\tif (!formattedAddress) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\taccount.address = formattedAddress\n\t\t\treturn account\n\t\t})\n\t\t// Remove null entries resulting from invalid formatted addresses\n\t\t.filter((account) => account !== null)\n\n\treturn accounts\n}\n\n// Updates accounts observable based on removed and added accounts\nexport const updateAccounts = ({\n\tadd,\n\tremove,\n}: {\n\tadd: ExtensionAccount[]\n\tremove: ExtensionAccount[]\n}) => {\n\tconst newAccounts = [..._extensionAccounts.getValue()]\n\t\t.concat(add)\n\t\t.filter(\n\t\t\t(a) =>\n\t\t\t\tremove.find((s) => s.address === a.address && s.source === a.source) ===\n\t\t\t\tundefined,\n\t\t)\n\t_extensionAccounts.next(newAccounts)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ProcessExtensionAccountsResult } from '@w3ux/types'\n\nexport const DefaultProcessExtensionResult: ProcessExtensionAccountsResult = {\n\tnewAccounts: [],\n\tremovedAccounts: [],\n}\n\n// Local storage active extensions key\nexport const ActiveExtensionsKey = 'active_extensions'\nexport const HardwareAccountsKey = 'hardware_accounts'\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tExtensionsStatus,\n\tHardwareAccount,\n\tSync,\n} from '@w3ux/types'\nimport { BehaviorSubject } from 'rxjs'\nimport { getHardwareAccountsLocal } from './local'\n\n// NOTE: These subjects stay private to the package and are not exported\n\nexport const _extensionsStatus = new BehaviorSubject<ExtensionsStatus>({})\nexport const _gettingExtensions = new BehaviorSubject<boolean>(true)\nexport const _initialisedExtensions = new BehaviorSubject<string[]>([])\nexport const _reconnectSync = new BehaviorSubject<Sync>('unsynced')\nexport const _extensionAccounts = new BehaviorSubject<ExtensionAccount[]>([])\nexport const _hardwareAccounts = new BehaviorSubject<HardwareAccount[]>(\n\tgetHardwareAccountsLocal(),\n)\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { HardwareAccount } from '@w3ux/types'\nimport { localStorageOrDefault } from '@w3ux/utils'\nimport { ActiveExtensionsKey, HardwareAccountsKey } from './consts'\n\n// Gets all active extensions from local storage\nexport const getActiveExtensionsLocal = (): string[] => {\n\tconst current = localStorageOrDefault<string[]>(ActiveExtensionsKey, [], true)\n\treturn Array.isArray(current) ? current : []\n}\n\n// Check if an extension exists in local storage\nexport const isExtensionLocal = (id: string): boolean =>\n\tgetActiveExtensionsLocal().includes(id)\n\n// Adds an extension to local storage\nexport const addExtensionToLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tif (!current.includes(id)) {\n\t\tlocalStorage.setItem(ActiveExtensionsKey, JSON.stringify([...current, id]))\n\t}\n}\n\n// Removes extension from local storage\nexport const removeExtensionFromLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tlocalStorage.setItem(\n\t\tActiveExtensionsKey,\n\t\tJSON.stringify(current.filter((localId) => localId !== id)),\n\t)\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n\ttypeof value === 'object' && value !== null\n\nconst asHardwareAccount = (value: unknown): HardwareAccount | null => {\n\tif (!isRecord(value)) {\n\t\treturn null\n\t}\n\n\tconst { address, name, source, network, index, group } = value\n\n\tif (\n\t\ttypeof address !== 'string' ||\n\t\ttypeof name !== 'string' ||\n\t\ttypeof source !== 'string' ||\n\t\ttypeof network !== 'string' ||\n\t\ttypeof index !== 'number' ||\n\t\t!Number.isFinite(index)\n\t) {\n\t\treturn null\n\t}\n\n\t// NOTE: Feb 14, 2026 - `group` is a recently added property, so we allow it to be optional for\n\t// backward compatibility for the time being\n\tif (group === undefined) {\n\t\treturn {\n\t\t\t...value,\n\t\t\taddress,\n\t\t\tname,\n\t\t\tsource,\n\t\t\tnetwork,\n\t\t\tindex,\n\t\t\tgroup: 1,\n\t\t} as HardwareAccount\n\t}\n\n\tif (typeof group !== 'number' || !Number.isFinite(group)) {\n\t\treturn null\n\t}\n\n\treturn {\n\t\t...value,\n\t\taddress,\n\t\tname,\n\t\tsource,\n\t\tnetwork,\n\t\tindex,\n\t\tgroup,\n\t} as HardwareAccount\n}\n\n// Gets imported hardware accounts from local storage\nexport const getHardwareAccountsLocal = (): HardwareAccount[] => {\n\tconst stored = localStorageOrDefault(HardwareAccountsKey, [], true)\n\tif (!Array.isArray(stored)) {\n\t\treturn []\n\t}\n\n\treturn stored\n\t\t.map((account) => asHardwareAccount(account))\n\t\t.filter((account): account is HardwareAccount => account !== null)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tExtensionEnableResults,\n\tExtensionInterface,\n} from '@w3ux/types'\nimport { formatExtensionAccounts } from './util'\n\n// Connects to provided extensions and gets all accounts\nexport const getAccountsFromExtensions = async (\n\textensions: ExtensionEnableResults,\n\tss58: number,\n): Promise<ExtensionAccount[]> => {\n\ttry {\n\t\tconst extensionEntries = Array.from(extensions.entries())\n\t\t\t.filter(([, { extension }]) => extension !== null)\n\t\t\t.map(\n\t\t\t\t([source, { extension }]) =>\n\t\t\t\t\t[source, extension] as [string, ExtensionInterface],\n\t\t\t)\n\n\t\tconst activeExtensions = extensionEntries.map(([, extension]) => extension)\n\n\t\tconst results = await Promise.allSettled(\n\t\t\tactiveExtensions.map((extension) => extension.accounts.get()),\n\t\t)\n\n\t\tconst allAccounts: ExtensionAccount[] = []\n\t\tfor (let i = 0; i < results.length; i++) {\n\t\t\tconst result = results[i]\n\t\t\tconst source = extensionEntries[i][0]\n\t\t\tconst signer = extensionEntries[i][1].signer\n\n\t\t\tif (result.status === 'fulfilled' && signer) {\n\t\t\t\tconst { value } = result\n\t\t\t\tconst accounts = formatExtensionAccounts(value, ss58).map(\n\t\t\t\t\t({ address, name }) => ({\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\tsigner,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\tallAccounts.push(...accounts)\n\t\t\t}\n\t\t}\n\t\treturn allAccounts\n\t} catch (e) {\n\t\tconsole.error('Error during account formatting: ', e)\n\t\treturn []\n\t}\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\n// Extension account subscription unsubs\nexport const unsubs: Record<string, () => void> = {}\n\n// Add an extension id to unsub state\nexport const addUnsub = (id: string, unsub: () => void) => {\n\tunsubs[id] = unsub\n}\n\n// Unsubscribe to all unsubs\nexport const unsubAll = () => {\n\tObject.values(unsubs).forEach((unsub) => {\n\t\tunsub()\n\t})\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/accounts/index.ts","../../src/accounts/util.ts","../../src/consts.ts","../../src/subjects.ts","../../src/local.ts","../../src/accounts/get.ts","../../src/accounts/unsubs.ts"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nexport * from './get'\nexport * from './unsubs'\nexport * from './util'\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { formatAccountSs58, isValidAddress } from '@w3ux/util-dedot'\nimport { DefaultProcessExtensionResult } from '../consts'\nimport { _extensionAccounts } from '../subjects'\nimport type { ExtensionAccount, ProcessExtensionAccountsResult } from '../types'\n\n// Gets accounts to be imported and commits them to state\n\ninterface Config {\n\tsource: string\n\tss58: number\n}\nexport const processExtensionAccounts = (\n\tconfig: Config,\n\tsigner: unknown,\n\tnewAccounts: ExtensionAccount[],\n): ProcessExtensionAccountsResult => {\n\tconst { source, ss58 } = config\n\tif (!newAccounts.length) {\n\t\treturn DefaultProcessExtensionResult\n\t}\n\n\t// Get valid accounts from extension\n\tnewAccounts = formatExtensionAccounts(newAccounts, ss58)\n\n\t// Find any accounts that have been removed from this extension\n\tconst removedAccounts = _extensionAccounts\n\t\t.getValue()\n\t\t.filter((j) => j.source === source)\n\t\t.filter((j) => !newAccounts.find((i) => i.address === j.address))\n\n\t// Remove accounts that have already been imported\n\tnewAccounts = newAccounts.filter(\n\t\t({ address }) =>\n\t\t\t!_extensionAccounts\n\t\t\t\t.getValue()\n\t\t\t\t.find((j) => j.address === address && j.source === source),\n\t)\n\n\t// Format accounts properties\n\tnewAccounts = newAccounts.map(({ address, name }) => ({\n\t\taddress,\n\t\tname,\n\t\tsource,\n\t\tsigner,\n\t}))\n\n\t// Update observable state\n\tupdateAccounts({\n\t\tadd: newAccounts,\n\t\tremove: removedAccounts,\n\t})\n\n\treturn {\n\t\tnewAccounts,\n\t\tremovedAccounts: [...removedAccounts],\n\t}\n}\n\n// Formats accounts to correct ss58 and removes invalid accounts\nexport const formatExtensionAccounts = (\n\taccounts: ExtensionAccount[],\n\tss58: number,\n) => {\n\taccounts = accounts\n\t\t// Remove accounts that do not contain correctly formatted addresses\n\t\t.filter(({ address }) => isValidAddress(address))\n\t\t// Reformat addresses to ensure default ss58 format\n\t\t.map((account) => {\n\t\t\tconst formattedAddress = formatAccountSs58(account.address, ss58)\n\t\t\tif (!formattedAddress) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\taccount.address = formattedAddress\n\t\t\treturn account\n\t\t})\n\t\t// Remove null entries resulting from invalid formatted addresses\n\t\t.filter((account) => account !== null)\n\n\treturn accounts\n}\n\n// Updates accounts observable based on removed and added accounts\nexport const updateAccounts = ({\n\tadd,\n\tremove,\n}: {\n\tadd: ExtensionAccount[]\n\tremove: ExtensionAccount[]\n}) => {\n\tconst newAccounts = [..._extensionAccounts.getValue()]\n\t\t.concat(add)\n\t\t.filter(\n\t\t\t(a) =>\n\t\t\t\tremove.find((s) => s.address === a.address && s.source === a.source) ===\n\t\t\t\tundefined,\n\t\t)\n\t_extensionAccounts.next(newAccounts)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ProcessExtensionAccountsResult } from './types'\n\nexport const DefaultProcessExtensionResult: ProcessExtensionAccountsResult = {\n\tnewAccounts: [],\n\tremovedAccounts: [],\n}\n\n// Local storage active extensions key\nexport const ActiveExtensionsKey = 'active_extensions'\nexport const HardwareAccountsKey = 'hardware_accounts'\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { BehaviorSubject } from 'rxjs'\nimport { getHardwareAccountsLocal } from './local'\nimport type {\n\tExtensionAccount,\n\tExtensionsStatus,\n\tHardwareAccount,\n\tSync,\n} from './types'\n\n// NOTE: These subjects stay private to the package and are not exported\n\nexport const _extensionsStatus = new BehaviorSubject<ExtensionsStatus>({})\nexport const _gettingExtensions = new BehaviorSubject<boolean>(true)\nexport const _initialisedExtensions = new BehaviorSubject<string[]>([])\nexport const _reconnectSync = new BehaviorSubject<Sync>('unsynced')\nexport const _extensionAccounts = new BehaviorSubject<ExtensionAccount[]>([])\nexport const _hardwareAccounts = new BehaviorSubject<HardwareAccount[]>(\n\tgetHardwareAccountsLocal(),\n)\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { localStorageOrDefault } from '@w3ux/utils'\nimport { ActiveExtensionsKey, HardwareAccountsKey } from './consts'\nimport type { HardwareAccount } from './types'\n\n// Gets all active extensions from local storage\nexport const getActiveExtensionsLocal = (): string[] => {\n\tconst current = localStorageOrDefault<string[]>(ActiveExtensionsKey, [], true)\n\treturn Array.isArray(current) ? current : []\n}\n\n// Check if an extension exists in local storage\nexport const isExtensionLocal = (id: string): boolean =>\n\tgetActiveExtensionsLocal().includes(id)\n\n// Adds an extension to local storage\nexport const addExtensionToLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tif (!current.includes(id)) {\n\t\tlocalStorage.setItem(ActiveExtensionsKey, JSON.stringify([...current, id]))\n\t}\n}\n\n// Removes extension from local storage\nexport const removeExtensionFromLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tlocalStorage.setItem(\n\t\tActiveExtensionsKey,\n\t\tJSON.stringify(current.filter((localId) => localId !== id)),\n\t)\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n\ttypeof value === 'object' && value !== null\n\nconst asHardwareAccount = (value: unknown): HardwareAccount | null => {\n\tif (!isRecord(value)) {\n\t\treturn null\n\t}\n\n\tconst { address, name, source, network, index, group } = value\n\n\tif (\n\t\ttypeof address !== 'string' ||\n\t\ttypeof name !== 'string' ||\n\t\ttypeof source !== 'string' ||\n\t\ttypeof network !== 'string' ||\n\t\ttypeof index !== 'number' ||\n\t\t!Number.isFinite(index)\n\t) {\n\t\treturn null\n\t}\n\n\t// NOTE: Feb 14, 2026 - `group` is a recently added property, so we allow it to be optional for\n\t// backward compatibility for the time being\n\tif (group === undefined) {\n\t\treturn {\n\t\t\t...value,\n\t\t\taddress,\n\t\t\tname,\n\t\t\tsource,\n\t\t\tnetwork,\n\t\t\tindex,\n\t\t\tgroup: 1,\n\t\t} as HardwareAccount\n\t}\n\n\tif (typeof group !== 'number' || !Number.isFinite(group)) {\n\t\treturn null\n\t}\n\n\treturn {\n\t\t...value,\n\t\taddress,\n\t\tname,\n\t\tsource,\n\t\tnetwork,\n\t\tindex,\n\t\tgroup,\n\t} as HardwareAccount\n}\n\n// Gets imported hardware accounts from local storage\nexport const getHardwareAccountsLocal = (): HardwareAccount[] => {\n\tconst stored = localStorageOrDefault(HardwareAccountsKey, [], true)\n\tif (!Array.isArray(stored)) {\n\t\treturn []\n\t}\n\n\treturn stored\n\t\t.map((account) => asHardwareAccount(account))\n\t\t.filter((account): account is HardwareAccount => account !== null)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tExtensionEnableResults,\n\tExtensionInterface,\n} from '../types'\nimport { formatExtensionAccounts } from './util'\n\n// Connects to provided extensions and gets all accounts\nexport const getAccountsFromExtensions = async (\n\textensions: ExtensionEnableResults,\n\tss58: number,\n): Promise<ExtensionAccount[]> => {\n\ttry {\n\t\tconst extensionEntries = Array.from(extensions.entries())\n\t\t\t.filter(([, { extension }]) => extension !== null)\n\t\t\t.map(\n\t\t\t\t([source, { extension }]) =>\n\t\t\t\t\t[source, extension] as [string, ExtensionInterface],\n\t\t\t)\n\n\t\tconst activeExtensions = extensionEntries.map(([, extension]) => extension)\n\n\t\tconst results = await Promise.allSettled(\n\t\t\tactiveExtensions.map((extension) => extension.accounts.get()),\n\t\t)\n\n\t\tconst allAccounts: ExtensionAccount[] = []\n\t\tfor (let i = 0; i < results.length; i++) {\n\t\t\tconst result = results[i]\n\t\t\tconst source = extensionEntries[i][0]\n\t\t\tconst signer = extensionEntries[i][1].signer\n\n\t\t\tif (result.status === 'fulfilled' && signer) {\n\t\t\t\tconst { value } = result\n\t\t\t\tconst accounts = formatExtensionAccounts(value, ss58).map(\n\t\t\t\t\t({ address, name }) => ({\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\tsigner,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\tallAccounts.push(...accounts)\n\t\t\t}\n\t\t}\n\t\treturn allAccounts\n\t} catch (e) {\n\t\tconsole.error('Error during account formatting: ', e)\n\t\treturn []\n\t}\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\n// Extension account subscription unsubs\nexport const unsubs: Record<string, () => void> = {}\n\n// Add an extension id to unsub state\nexport const addUnsub = (id: string, unsub: () => void) => {\n\tunsubs[id] = unsub\n}\n\n// Unsubscribe to all unsubs\nexport const unsubAll = () => {\n\tObject.values(unsubs).forEach((unsub) => {\n\t\tunsub()\n\t})\n}\n"],"mappings":"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","names":[]}
@@ -1,4 +1,5 @@
1
- import { ExtensionEnableResults, ExtensionAccount, ProcessExtensionAccountsResult } from '@w3ux/types';
1
+ import { ExtensionEnableResults, ExtensionAccount, ProcessExtensionAccountsResult } from '../types.cjs';
2
+ import 'react';
2
3
 
3
4
  declare const getAccountsFromExtensions: (extensions: ExtensionEnableResults, ss58: number) => Promise<ExtensionAccount[]>;
4
5
 
@@ -1,4 +1,5 @@
1
- import { ExtensionEnableResults, ExtensionAccount, ProcessExtensionAccountsResult } from '@w3ux/types';
1
+ import { ExtensionEnableResults, ExtensionAccount, ProcessExtensionAccountsResult } from '../types.js';
2
+ import 'react';
2
3
 
3
4
  declare const getAccountsFromExtensions: (extensions: ExtensionEnableResults, ss58: number) => Promise<ExtensionAccount[]>;
4
5
 
package/accounts/index.js CHANGED
@@ -6,8 +6,8 @@ import {
6
6
  unsubAll,
7
7
  unsubs,
8
8
  updateAccounts
9
- } from "../chunk-NZTFHLWC.js";
10
- import "../chunk-VNHVECK2.js";
9
+ } from "../chunk-4SKPT6WH.js";
10
+ import "../chunk-F7I65YDY.js";
11
11
  export {
12
12
  addUnsub,
13
13
  formatExtensionAccounts,
@@ -3,7 +3,7 @@ import {
3
3
  _extensionsStatus,
4
4
  _hardwareAccounts,
5
5
  _reconnectSync
6
- } from "./chunk-VNHVECK2.js";
6
+ } from "./chunk-F7I65YDY.js";
7
7
 
8
8
  // src/util.ts
9
9
  var getStatus = (id) => _extensionsStatus.getValue()[id] || void 0;
@@ -28,20 +28,15 @@ var getHardwareAccounts = () => _hardwareAccounts.getValue();
28
28
  var setHardwareAccounts = (accounts) => {
29
29
  _hardwareAccounts.next(accounts);
30
30
  };
31
- var isMimir = (id) => window.self !== window.top && id === "mimir";
32
31
  var hasValidEnable = (id) => {
33
32
  try {
34
- const enable = isMimir(id) ? window.injectedWeb3[id].enable : window.parent.injectedWeb3[id].enable;
33
+ const enable = window.parent.injectedWeb3[id].enable;
35
34
  return enable !== void 0 && typeof enable === "function";
36
35
  } catch {
37
36
  return false;
38
37
  }
39
38
  };
40
39
  var enableInjectedWeb3Entry = (id, dappName) => {
41
- if (isMimir(id)) {
42
- const result2 = window.injectedWeb3[id].enable(dappName);
43
- return result2;
44
- }
45
40
  const result = window.parent.injectedWeb3[id].enable(dappName);
46
41
  return result;
47
42
  };
@@ -56,10 +51,9 @@ export {
56
51
  setReconnectSync,
57
52
  getHardwareAccounts,
58
53
  setHardwareAccounts,
59
- isMimir,
60
54
  hasValidEnable,
61
55
  enableInjectedWeb3Entry
62
56
  };
63
57
  /* @license Copyright 2024 w3ux authors & contributors
64
58
  SPDX-License-Identifier: GPL-3.0-only */
65
- //# sourceMappingURL=chunk-BZ4JF2XC.js.map
59
+ //# sourceMappingURL=chunk-2VNUX53X.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/util.ts"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport {\n\t_extensionAccounts,\n\t_extensionsStatus,\n\t_hardwareAccounts,\n\t_reconnectSync,\n} from './subjects'\nimport type { ExtensionStatus, HardwareAccount, Sync } from './types'\n\n// Gets an extension status\nexport const getStatus = (id: string): ExtensionStatus =>\n\t_extensionsStatus.getValue()[id] || undefined\n\n// Sets an extension status\nexport const setStatus = (id: string, status: ExtensionStatus) => {\n\tconst newValue = { ..._extensionsStatus.getValue() }\n\tnewValue[id] = status\n\t_extensionsStatus.next(newValue)\n}\n\n// Removes an extension status\nexport const removeStatus = (id: string) => {\n\tconst { [id]: _, ...rest } = _extensionsStatus.getValue()\n\t_extensionsStatus.next(rest)\n}\n\n// Whether an extension can be connected\nexport const canConnect = (id: string) =>\n\t![undefined, 'connected'].includes(_extensionsStatus.getValue()[id])\n\n// Reset accounts\nexport const resetAccounts = () => {\n\t_extensionAccounts.next([])\n}\n\n// Get previously enabled extension reconnect sync status\nexport const getReconnectSync = () => _reconnectSync.getValue()\n\n// Set previously enabled extension reconnect sync status\nexport const setReconnectSync = (sync: Sync) => {\n\t_reconnectSync.next(sync)\n}\n\n// Get hardware accounts\nexport const getHardwareAccounts = () => _hardwareAccounts.getValue()\n\n// Set hardware accounts\nexport const setHardwareAccounts = (accounts: HardwareAccount[]) => {\n\t_hardwareAccounts.next(accounts)\n}\n\n// Check if an injected web3 entry has a valid enable function\nexport const hasValidEnable = (id: string): boolean => {\n\ttry {\n\t\tconst enable = window.parent.injectedWeb3![id].enable\n\t\treturn enable !== undefined && typeof enable === 'function'\n\t} catch {\n\t\treturn false\n\t}\n}\n\n// Enable an injected web3 entry\nexport const enableInjectedWeb3Entry = (id: string, dappName: string) => {\n\tconst result = window.parent.injectedWeb3![id].enable(dappName)\n\treturn result\n}\n"],"mappings":";;;;;;;;AAYO,IAAM,YAAY,CAAC,OACzB,kBAAkB,SAAS,EAAE,EAAE,KAAK;AAG9B,IAAM,YAAY,CAAC,IAAY,WAA4B;AACjE,QAAM,WAAW,EAAE,GAAG,kBAAkB,SAAS,EAAE;AACnD,WAAS,EAAE,IAAI;AACf,oBAAkB,KAAK,QAAQ;AAChC;AAGO,IAAM,eAAe,CAAC,OAAe;AAC3C,QAAM,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,IAAI,kBAAkB,SAAS;AACxD,oBAAkB,KAAK,IAAI;AAC5B;AAGO,IAAM,aAAa,CAAC,OAC1B,CAAC,CAAC,QAAW,WAAW,EAAE,SAAS,kBAAkB,SAAS,EAAE,EAAE,CAAC;AAG7D,IAAM,gBAAgB,MAAM;AAClC,qBAAmB,KAAK,CAAC,CAAC;AAC3B;AAGO,IAAM,mBAAmB,MAAM,eAAe,SAAS;AAGvD,IAAM,mBAAmB,CAAC,SAAe;AAC/C,iBAAe,KAAK,IAAI;AACzB;AAGO,IAAM,sBAAsB,MAAM,kBAAkB,SAAS;AAG7D,IAAM,sBAAsB,CAAC,aAAgC;AACnE,oBAAkB,KAAK,QAAQ;AAChC;AAGO,IAAM,iBAAiB,CAAC,OAAwB;AACtD,MAAI;AACH,UAAM,SAAS,OAAO,OAAO,aAAc,EAAE,EAAE;AAC/C,WAAO,WAAW,UAAa,OAAO,WAAW;AAAA,EAClD,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAGO,IAAM,0BAA0B,CAAC,IAAY,aAAqB;AACxE,QAAM,SAAS,OAAO,OAAO,aAAc,EAAE,EAAE,OAAO,QAAQ;AAC9D,SAAO;AACR;","names":[]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DefaultProcessExtensionResult,
3
3
  _extensionAccounts
4
- } from "./chunk-VNHVECK2.js";
4
+ } from "./chunk-F7I65YDY.js";
5
5
 
6
6
  // src/accounts/util.ts
7
7
  import { formatAccountSs58, isValidAddress } from "@w3ux/util-dedot";
@@ -98,14 +98,14 @@ var unsubAll = () => {
98
98
  };
99
99
 
100
100
  export {
101
+ unsubs,
102
+ addUnsub,
103
+ unsubAll,
101
104
  processExtensionAccounts,
102
105
  formatExtensionAccounts,
103
106
  updateAccounts,
104
- getAccountsFromExtensions,
105
- unsubs,
106
- addUnsub,
107
- unsubAll
107
+ getAccountsFromExtensions
108
108
  };
109
109
  /* @license Copyright 2024 w3ux authors & contributors
110
110
  SPDX-License-Identifier: GPL-3.0-only */
111
- //# sourceMappingURL=chunk-NZTFHLWC.js.map
111
+ //# sourceMappingURL=chunk-4SKPT6WH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/accounts/util.ts","../src/accounts/get.ts","../src/accounts/unsubs.ts"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { formatAccountSs58, isValidAddress } from '@w3ux/util-dedot'\nimport { DefaultProcessExtensionResult } from '../consts'\nimport { _extensionAccounts } from '../subjects'\nimport type { ExtensionAccount, ProcessExtensionAccountsResult } from '../types'\n\n// Gets accounts to be imported and commits them to state\n\ninterface Config {\n\tsource: string\n\tss58: number\n}\nexport const processExtensionAccounts = (\n\tconfig: Config,\n\tsigner: unknown,\n\tnewAccounts: ExtensionAccount[],\n): ProcessExtensionAccountsResult => {\n\tconst { source, ss58 } = config\n\tif (!newAccounts.length) {\n\t\treturn DefaultProcessExtensionResult\n\t}\n\n\t// Get valid accounts from extension\n\tnewAccounts = formatExtensionAccounts(newAccounts, ss58)\n\n\t// Find any accounts that have been removed from this extension\n\tconst removedAccounts = _extensionAccounts\n\t\t.getValue()\n\t\t.filter((j) => j.source === source)\n\t\t.filter((j) => !newAccounts.find((i) => i.address === j.address))\n\n\t// Remove accounts that have already been imported\n\tnewAccounts = newAccounts.filter(\n\t\t({ address }) =>\n\t\t\t!_extensionAccounts\n\t\t\t\t.getValue()\n\t\t\t\t.find((j) => j.address === address && j.source === source),\n\t)\n\n\t// Format accounts properties\n\tnewAccounts = newAccounts.map(({ address, name }) => ({\n\t\taddress,\n\t\tname,\n\t\tsource,\n\t\tsigner,\n\t}))\n\n\t// Update observable state\n\tupdateAccounts({\n\t\tadd: newAccounts,\n\t\tremove: removedAccounts,\n\t})\n\n\treturn {\n\t\tnewAccounts,\n\t\tremovedAccounts: [...removedAccounts],\n\t}\n}\n\n// Formats accounts to correct ss58 and removes invalid accounts\nexport const formatExtensionAccounts = (\n\taccounts: ExtensionAccount[],\n\tss58: number,\n) => {\n\taccounts = accounts\n\t\t// Remove accounts that do not contain correctly formatted addresses\n\t\t.filter(({ address }) => isValidAddress(address))\n\t\t// Reformat addresses to ensure default ss58 format\n\t\t.map((account) => {\n\t\t\tconst formattedAddress = formatAccountSs58(account.address, ss58)\n\t\t\tif (!formattedAddress) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\taccount.address = formattedAddress\n\t\t\treturn account\n\t\t})\n\t\t// Remove null entries resulting from invalid formatted addresses\n\t\t.filter((account) => account !== null)\n\n\treturn accounts\n}\n\n// Updates accounts observable based on removed and added accounts\nexport const updateAccounts = ({\n\tadd,\n\tremove,\n}: {\n\tadd: ExtensionAccount[]\n\tremove: ExtensionAccount[]\n}) => {\n\tconst newAccounts = [..._extensionAccounts.getValue()]\n\t\t.concat(add)\n\t\t.filter(\n\t\t\t(a) =>\n\t\t\t\tremove.find((s) => s.address === a.address && s.source === a.source) ===\n\t\t\t\tundefined,\n\t\t)\n\t_extensionAccounts.next(newAccounts)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tExtensionEnableResults,\n\tExtensionInterface,\n} from '../types'\nimport { formatExtensionAccounts } from './util'\n\n// Connects to provided extensions and gets all accounts\nexport const getAccountsFromExtensions = async (\n\textensions: ExtensionEnableResults,\n\tss58: number,\n): Promise<ExtensionAccount[]> => {\n\ttry {\n\t\tconst extensionEntries = Array.from(extensions.entries())\n\t\t\t.filter(([, { extension }]) => extension !== null)\n\t\t\t.map(\n\t\t\t\t([source, { extension }]) =>\n\t\t\t\t\t[source, extension] as [string, ExtensionInterface],\n\t\t\t)\n\n\t\tconst activeExtensions = extensionEntries.map(([, extension]) => extension)\n\n\t\tconst results = await Promise.allSettled(\n\t\t\tactiveExtensions.map((extension) => extension.accounts.get()),\n\t\t)\n\n\t\tconst allAccounts: ExtensionAccount[] = []\n\t\tfor (let i = 0; i < results.length; i++) {\n\t\t\tconst result = results[i]\n\t\t\tconst source = extensionEntries[i][0]\n\t\t\tconst signer = extensionEntries[i][1].signer\n\n\t\t\tif (result.status === 'fulfilled' && signer) {\n\t\t\t\tconst { value } = result\n\t\t\t\tconst accounts = formatExtensionAccounts(value, ss58).map(\n\t\t\t\t\t({ address, name }) => ({\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\tsigner,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\tallAccounts.push(...accounts)\n\t\t\t}\n\t\t}\n\t\treturn allAccounts\n\t} catch (e) {\n\t\tconsole.error('Error during account formatting: ', e)\n\t\treturn []\n\t}\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\n// Extension account subscription unsubs\nexport const unsubs: Record<string, () => void> = {}\n\n// Add an extension id to unsub state\nexport const addUnsub = (id: string, unsub: () => void) => {\n\tunsubs[id] = unsub\n}\n\n// Unsubscribe to all unsubs\nexport const unsubAll = () => {\n\tObject.values(unsubs).forEach((unsub) => {\n\t\tunsub()\n\t})\n}\n"],"mappings":"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","names":[]}
@@ -96,4 +96,4 @@ export {
96
96
  };
97
97
  /* @license Copyright 2024 w3ux authors & contributors
98
98
  SPDX-License-Identifier: GPL-3.0-only */
99
- //# sourceMappingURL=chunk-VNHVECK2.js.map
99
+ //# sourceMappingURL=chunk-F7I65YDY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/consts.ts","../src/local.ts","../src/subjects.ts"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ProcessExtensionAccountsResult } from './types'\n\nexport const DefaultProcessExtensionResult: ProcessExtensionAccountsResult = {\n\tnewAccounts: [],\n\tremovedAccounts: [],\n}\n\n// Local storage active extensions key\nexport const ActiveExtensionsKey = 'active_extensions'\nexport const HardwareAccountsKey = 'hardware_accounts'\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { localStorageOrDefault } from '@w3ux/utils'\nimport { ActiveExtensionsKey, HardwareAccountsKey } from './consts'\nimport type { HardwareAccount } from './types'\n\n// Gets all active extensions from local storage\nexport const getActiveExtensionsLocal = (): string[] => {\n\tconst current = localStorageOrDefault<string[]>(ActiveExtensionsKey, [], true)\n\treturn Array.isArray(current) ? current : []\n}\n\n// Check if an extension exists in local storage\nexport const isExtensionLocal = (id: string): boolean =>\n\tgetActiveExtensionsLocal().includes(id)\n\n// Adds an extension to local storage\nexport const addExtensionToLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tif (!current.includes(id)) {\n\t\tlocalStorage.setItem(ActiveExtensionsKey, JSON.stringify([...current, id]))\n\t}\n}\n\n// Removes extension from local storage\nexport const removeExtensionFromLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tlocalStorage.setItem(\n\t\tActiveExtensionsKey,\n\t\tJSON.stringify(current.filter((localId) => localId !== id)),\n\t)\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n\ttypeof value === 'object' && value !== null\n\nconst asHardwareAccount = (value: unknown): HardwareAccount | null => {\n\tif (!isRecord(value)) {\n\t\treturn null\n\t}\n\n\tconst { address, name, source, network, index, group } = value\n\n\tif (\n\t\ttypeof address !== 'string' ||\n\t\ttypeof name !== 'string' ||\n\t\ttypeof source !== 'string' ||\n\t\ttypeof network !== 'string' ||\n\t\ttypeof index !== 'number' ||\n\t\t!Number.isFinite(index)\n\t) {\n\t\treturn null\n\t}\n\n\t// NOTE: Feb 14, 2026 - `group` is a recently added property, so we allow it to be optional for\n\t// backward compatibility for the time being\n\tif (group === undefined) {\n\t\treturn {\n\t\t\t...value,\n\t\t\taddress,\n\t\t\tname,\n\t\t\tsource,\n\t\t\tnetwork,\n\t\t\tindex,\n\t\t\tgroup: 1,\n\t\t} as HardwareAccount\n\t}\n\n\tif (typeof group !== 'number' || !Number.isFinite(group)) {\n\t\treturn null\n\t}\n\n\treturn {\n\t\t...value,\n\t\taddress,\n\t\tname,\n\t\tsource,\n\t\tnetwork,\n\t\tindex,\n\t\tgroup,\n\t} as HardwareAccount\n}\n\n// Gets imported hardware accounts from local storage\nexport const getHardwareAccountsLocal = (): HardwareAccount[] => {\n\tconst stored = localStorageOrDefault(HardwareAccountsKey, [], true)\n\tif (!Array.isArray(stored)) {\n\t\treturn []\n\t}\n\n\treturn stored\n\t\t.map((account) => asHardwareAccount(account))\n\t\t.filter((account): account is HardwareAccount => account !== null)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { BehaviorSubject } from 'rxjs'\nimport { getHardwareAccountsLocal } from './local'\nimport type {\n\tExtensionAccount,\n\tExtensionsStatus,\n\tHardwareAccount,\n\tSync,\n} from './types'\n\n// NOTE: These subjects stay private to the package and are not exported\n\nexport const _extensionsStatus = new BehaviorSubject<ExtensionsStatus>({})\nexport const _gettingExtensions = new BehaviorSubject<boolean>(true)\nexport const _initialisedExtensions = new BehaviorSubject<string[]>([])\nexport const _reconnectSync = new BehaviorSubject<Sync>('unsynced')\nexport const _extensionAccounts = new BehaviorSubject<ExtensionAccount[]>([])\nexport const _hardwareAccounts = new BehaviorSubject<HardwareAccount[]>(\n\tgetHardwareAccountsLocal(),\n)\n"],"mappings":";AAKO,IAAM,gCAAgE;AAAA,EAC5E,aAAa,CAAC;AAAA,EACd,iBAAiB,CAAC;AACnB;AAGO,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;;;ACTnC,SAAS,6BAA6B;AAK/B,IAAM,2BAA2B,MAAgB;AACvD,QAAM,UAAU,sBAAgC,qBAAqB,CAAC,GAAG,IAAI;AAC7E,SAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC;AAC5C;AAGO,IAAM,mBAAmB,CAAC,OAChC,yBAAyB,EAAE,SAAS,EAAE;AAGhC,IAAM,sBAAsB,CAAC,OAAqB;AACxD,QAAM,UAAU,yBAAyB;AACzC,MAAI,CAAC,QAAQ,SAAS,EAAE,GAAG;AAC1B,iBAAa,QAAQ,qBAAqB,KAAK,UAAU,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC;AAAA,EAC3E;AACD;AAGO,IAAM,2BAA2B,CAAC,OAAqB;AAC7D,QAAM,UAAU,yBAAyB;AACzC,eAAa;AAAA,IACZ;AAAA,IACA,KAAK,UAAU,QAAQ,OAAO,CAAC,YAAY,YAAY,EAAE,CAAC;AAAA,EAC3D;AACD;AAEA,IAAM,WAAW,CAAC,UACjB,OAAO,UAAU,YAAY,UAAU;AAExC,IAAM,oBAAoB,CAAC,UAA2C;AACrE,MAAI,CAAC,SAAS,KAAK,GAAG;AACrB,WAAO;AAAA,EACR;AAEA,QAAM,EAAE,SAAS,MAAM,QAAQ,SAAS,OAAO,MAAM,IAAI;AAEzD,MACC,OAAO,YAAY,YACnB,OAAO,SAAS,YAChB,OAAO,WAAW,YAClB,OAAO,YAAY,YACnB,OAAO,UAAU,YACjB,CAAC,OAAO,SAAS,KAAK,GACrB;AACD,WAAO;AAAA,EACR;AAIA,MAAI,UAAU,QAAW;AACxB,WAAO;AAAA,MACN,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IACR;AAAA,EACD;AAEA,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AACzD,WAAO;AAAA,EACR;AAEA,SAAO;AAAA,IACN,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;AAGO,IAAM,2BAA2B,MAAyB;AAChE,QAAM,SAAS,sBAAsB,qBAAqB,CAAC,GAAG,IAAI;AAClE,MAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC3B,WAAO,CAAC;AAAA,EACT;AAEA,SAAO,OACL,IAAI,CAAC,YAAY,kBAAkB,OAAO,CAAC,EAC3C,OAAO,CAAC,YAAwC,YAAY,IAAI;AACnE;;;AC3FA,SAAS,uBAAuB;AAWzB,IAAM,oBAAoB,IAAI,gBAAkC,CAAC,CAAC;AAClE,IAAM,qBAAqB,IAAI,gBAAyB,IAAI;AAC5D,IAAM,yBAAyB,IAAI,gBAA0B,CAAC,CAAC;AAC/D,IAAM,iBAAiB,IAAI,gBAAsB,UAAU;AAC3D,IAAM,qBAAqB,IAAI,gBAAoC,CAAC,CAAC;AACrE,IAAM,oBAAoB,IAAI;AAAA,EACpC,yBAAyB;AAC1B;","names":[]}
@@ -34,7 +34,6 @@ __export(extensions_exports, {
34
34
  enableExtensions: () => enableExtensions,
35
35
  getExtensions: () => getExtensions,
36
36
  initExtensions: () => initExtensions,
37
- injectMimir: () => injectMimir,
38
37
  reconnectExtensions: () => reconnectExtensions
39
38
  });
40
39
  module.exports = __toCommonJS(extensions_exports);
@@ -181,20 +180,15 @@ var canConnect = (id) => ![void 0, "connected"].includes(_extensionsStatus.getVa
181
180
  var setReconnectSync = (sync) => {
182
181
  _reconnectSync.next(sync);
183
182
  };
184
- var isMimir = (id) => window.self !== window.top && id === "mimir";
185
183
  var hasValidEnable = (id) => {
186
184
  try {
187
- const enable = isMimir(id) ? window.injectedWeb3[id].enable : window.parent.injectedWeb3[id].enable;
185
+ const enable = window.parent.injectedWeb3[id].enable;
188
186
  return enable !== void 0 && typeof enable === "function";
189
187
  } catch {
190
188
  return false;
191
189
  }
192
190
  };
193
191
  var enableInjectedWeb3Entry = (id, dappName) => {
194
- if (isMimir(id)) {
195
- const result2 = window.injectedWeb3[id].enable(dappName);
196
- return result2;
197
- }
198
192
  const result = window.parent.injectedWeb3[id].enable(dappName);
199
193
  return result;
200
194
  };
@@ -368,22 +362,6 @@ var filterFailedExtensions = (extensions2) => new Map(
368
362
  Array.from(extensions2.entries()).filter(([, state]) => !state.connected)
369
363
  );
370
364
 
371
- // src/extensions/mimir.ts
372
- var import_apps_inject = require("@mimirdev/apps-inject");
373
- var injectMimir = async () => {
374
- const openInIframe = window !== window.parent;
375
- if (!openInIframe) {
376
- return;
377
- }
378
- const origin = await (0, import_apps_inject.isMimirReady)();
379
- if (!origin) {
380
- return;
381
- }
382
- if (import_apps_inject.MIMIR_REGEXP.test(origin)) {
383
- (0, import_apps_inject.inject)();
384
- }
385
- };
386
-
387
365
  // src/accounts/get.ts
388
366
  var getAccountsFromExtensions = async (extensions2, ss58) => {
389
367
  try {
@@ -455,7 +433,6 @@ var reconnectExtensions = async (dappName, ss58) => {
455
433
  enableExtensions,
456
434
  getExtensions,
457
435
  initExtensions,
458
- injectMimir,
459
436
  reconnectExtensions
460
437
  });
461
438
  /* @license Copyright 2024 w3ux authors & contributors
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/extensions/index.ts","../../src/accounts/unsubs.ts","../../src/accounts/util.ts","../../src/consts.ts","../../src/subjects.ts","../../src/local.ts","../../src/util.ts","../../src/extensions/connect.ts","../../src/extensions/discover.ts","../../src/extensions/enable.ts","../../src/extensions/init.ts","../../src/extensions/mimir.ts","../../src/accounts/get.ts","../../src/extensions/reconnect.ts"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nexport * from './connect'\nexport * from './discover'\nexport * from './enable'\nexport * from './init'\nexport * from './mimir'\nexport * from './reconnect'\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\n// Extension account subscription unsubs\nexport const unsubs: Record<string, () => void> = {}\n\n// Add an extension id to unsub state\nexport const addUnsub = (id: string, unsub: () => void) => {\n\tunsubs[id] = unsub\n}\n\n// Unsubscribe to all unsubs\nexport const unsubAll = () => {\n\tObject.values(unsubs).forEach((unsub) => {\n\t\tunsub()\n\t})\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tProcessExtensionAccountsResult,\n} from '@w3ux/types'\nimport { formatAccountSs58, isValidAddress } from '@w3ux/util-dedot'\nimport { DefaultProcessExtensionResult } from '../consts'\nimport { _extensionAccounts } from '../subjects'\n\n// Gets accounts to be imported and commits them to state\n\ninterface Config {\n\tsource: string\n\tss58: number\n}\nexport const processExtensionAccounts = (\n\tconfig: Config,\n\tsigner: unknown,\n\tnewAccounts: ExtensionAccount[],\n): ProcessExtensionAccountsResult => {\n\tconst { source, ss58 } = config\n\tif (!newAccounts.length) {\n\t\treturn DefaultProcessExtensionResult\n\t}\n\n\t// Get valid accounts from extension\n\tnewAccounts = formatExtensionAccounts(newAccounts, ss58)\n\n\t// Find any accounts that have been removed from this extension\n\tconst removedAccounts = _extensionAccounts\n\t\t.getValue()\n\t\t.filter((j) => j.source === source)\n\t\t.filter((j) => !newAccounts.find((i) => i.address === j.address))\n\n\t// Remove accounts that have already been imported\n\tnewAccounts = newAccounts.filter(\n\t\t({ address }) =>\n\t\t\t!_extensionAccounts\n\t\t\t\t.getValue()\n\t\t\t\t.find((j) => j.address === address && j.source === source),\n\t)\n\n\t// Format accounts properties\n\tnewAccounts = newAccounts.map(({ address, name }) => ({\n\t\taddress,\n\t\tname,\n\t\tsource,\n\t\tsigner,\n\t}))\n\n\t// Update observable state\n\tupdateAccounts({\n\t\tadd: newAccounts,\n\t\tremove: removedAccounts,\n\t})\n\n\treturn {\n\t\tnewAccounts,\n\t\tremovedAccounts: [...removedAccounts],\n\t}\n}\n\n// Formats accounts to correct ss58 and removes invalid accounts\nexport const formatExtensionAccounts = (\n\taccounts: ExtensionAccount[],\n\tss58: number,\n) => {\n\taccounts = accounts\n\t\t// Remove accounts that do not contain correctly formatted addresses\n\t\t.filter(({ address }) => isValidAddress(address))\n\t\t// Reformat addresses to ensure default ss58 format\n\t\t.map((account) => {\n\t\t\tconst formattedAddress = formatAccountSs58(account.address, ss58)\n\t\t\tif (!formattedAddress) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\taccount.address = formattedAddress\n\t\t\treturn account\n\t\t})\n\t\t// Remove null entries resulting from invalid formatted addresses\n\t\t.filter((account) => account !== null)\n\n\treturn accounts\n}\n\n// Updates accounts observable based on removed and added accounts\nexport const updateAccounts = ({\n\tadd,\n\tremove,\n}: {\n\tadd: ExtensionAccount[]\n\tremove: ExtensionAccount[]\n}) => {\n\tconst newAccounts = [..._extensionAccounts.getValue()]\n\t\t.concat(add)\n\t\t.filter(\n\t\t\t(a) =>\n\t\t\t\tremove.find((s) => s.address === a.address && s.source === a.source) ===\n\t\t\t\tundefined,\n\t\t)\n\t_extensionAccounts.next(newAccounts)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ProcessExtensionAccountsResult } from '@w3ux/types'\n\nexport const DefaultProcessExtensionResult: ProcessExtensionAccountsResult = {\n\tnewAccounts: [],\n\tremovedAccounts: [],\n}\n\n// Local storage active extensions key\nexport const ActiveExtensionsKey = 'active_extensions'\nexport const HardwareAccountsKey = 'hardware_accounts'\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tExtensionsStatus,\n\tHardwareAccount,\n\tSync,\n} from '@w3ux/types'\nimport { BehaviorSubject } from 'rxjs'\nimport { getHardwareAccountsLocal } from './local'\n\n// NOTE: These subjects stay private to the package and are not exported\n\nexport const _extensionsStatus = new BehaviorSubject<ExtensionsStatus>({})\nexport const _gettingExtensions = new BehaviorSubject<boolean>(true)\nexport const _initialisedExtensions = new BehaviorSubject<string[]>([])\nexport const _reconnectSync = new BehaviorSubject<Sync>('unsynced')\nexport const _extensionAccounts = new BehaviorSubject<ExtensionAccount[]>([])\nexport const _hardwareAccounts = new BehaviorSubject<HardwareAccount[]>(\n\tgetHardwareAccountsLocal(),\n)\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { HardwareAccount } from '@w3ux/types'\nimport { localStorageOrDefault } from '@w3ux/utils'\nimport { ActiveExtensionsKey, HardwareAccountsKey } from './consts'\n\n// Gets all active extensions from local storage\nexport const getActiveExtensionsLocal = (): string[] => {\n\tconst current = localStorageOrDefault<string[]>(ActiveExtensionsKey, [], true)\n\treturn Array.isArray(current) ? current : []\n}\n\n// Check if an extension exists in local storage\nexport const isExtensionLocal = (id: string): boolean =>\n\tgetActiveExtensionsLocal().includes(id)\n\n// Adds an extension to local storage\nexport const addExtensionToLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tif (!current.includes(id)) {\n\t\tlocalStorage.setItem(ActiveExtensionsKey, JSON.stringify([...current, id]))\n\t}\n}\n\n// Removes extension from local storage\nexport const removeExtensionFromLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tlocalStorage.setItem(\n\t\tActiveExtensionsKey,\n\t\tJSON.stringify(current.filter((localId) => localId !== id)),\n\t)\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n\ttypeof value === 'object' && value !== null\n\nconst asHardwareAccount = (value: unknown): HardwareAccount | null => {\n\tif (!isRecord(value)) {\n\t\treturn null\n\t}\n\n\tconst { address, name, source, network, index, group } = value\n\n\tif (\n\t\ttypeof address !== 'string' ||\n\t\ttypeof name !== 'string' ||\n\t\ttypeof source !== 'string' ||\n\t\ttypeof network !== 'string' ||\n\t\ttypeof index !== 'number' ||\n\t\t!Number.isFinite(index)\n\t) {\n\t\treturn null\n\t}\n\n\t// NOTE: Feb 14, 2026 - `group` is a recently added property, so we allow it to be optional for\n\t// backward compatibility for the time being\n\tif (group === undefined) {\n\t\treturn {\n\t\t\t...value,\n\t\t\taddress,\n\t\t\tname,\n\t\t\tsource,\n\t\t\tnetwork,\n\t\t\tindex,\n\t\t\tgroup: 1,\n\t\t} as HardwareAccount\n\t}\n\n\tif (typeof group !== 'number' || !Number.isFinite(group)) {\n\t\treturn null\n\t}\n\n\treturn {\n\t\t...value,\n\t\taddress,\n\t\tname,\n\t\tsource,\n\t\tnetwork,\n\t\tindex,\n\t\tgroup,\n\t} as HardwareAccount\n}\n\n// Gets imported hardware accounts from local storage\nexport const getHardwareAccountsLocal = (): HardwareAccount[] => {\n\tconst stored = localStorageOrDefault(HardwareAccountsKey, [], true)\n\tif (!Array.isArray(stored)) {\n\t\treturn []\n\t}\n\n\treturn stored\n\t\t.map((account) => asHardwareAccount(account))\n\t\t.filter((account): account is HardwareAccount => account !== null)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExtensionStatus, HardwareAccount, Sync } from '@w3ux/types'\nimport {\n\t_extensionAccounts,\n\t_extensionsStatus,\n\t_hardwareAccounts,\n\t_reconnectSync,\n} from './subjects'\n\n// Gets an extension status\nexport const getStatus = (id: string): ExtensionStatus =>\n\t_extensionsStatus.getValue()[id] || undefined\n\n// Sets an extension status\nexport const setStatus = (id: string, status: ExtensionStatus) => {\n\tconst newValue = { ..._extensionsStatus.getValue() }\n\tnewValue[id] = status\n\t_extensionsStatus.next(newValue)\n}\n\n// Removes an extension status\nexport const removeStatus = (id: string) => {\n\tconst { [id]: _, ...rest } = _extensionsStatus.getValue()\n\t_extensionsStatus.next(rest)\n}\n\n// Whether an extension can be connected\nexport const canConnect = (id: string) =>\n\t![undefined, 'connected'].includes(_extensionsStatus.getValue()[id])\n\n// Reset accounts\nexport const resetAccounts = () => {\n\t_extensionAccounts.next([])\n}\n\n// Get previously enabled extension reconnect sync status\nexport const getReconnectSync = () => _reconnectSync.getValue()\n\n// Set previously enabled extension reconnect sync status\nexport const setReconnectSync = (sync: Sync) => {\n\t_reconnectSync.next(sync)\n}\n\n// Get hardware accounts\nexport const getHardwareAccounts = () => _hardwareAccounts.getValue()\n\n// Set hardware accounts\nexport const setHardwareAccounts = (accounts: HardwareAccount[]) => {\n\t_hardwareAccounts.next(accounts)\n}\n\n// Checks whether app is open in a mimir iframe\nexport const isMimir = (id: string): boolean =>\n\twindow.self !== window.top && id === 'mimir'\n\n// Check if an injected web3 entry has a valid enable function\nexport const hasValidEnable = (id: string): boolean => {\n\ttry {\n\t\tconst enable = isMimir(id)\n\t\t\t? window.injectedWeb3![id].enable\n\t\t\t: window.parent.injectedWeb3![id].enable\n\n\t\treturn enable !== undefined && typeof enable === 'function'\n\t} catch {\n\t\treturn false\n\t}\n}\n\n// Enable an injected web3 entry\nexport const enableInjectedWeb3Entry = (id: string, dappName: string) => {\n\tif (isMimir(id)) {\n\t\tconst result = window.injectedWeb3![id].enable(dappName)\n\t\treturn result\n\t}\n\tconst result = window.parent.injectedWeb3![id].enable(dappName)\n\treturn result\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExtensionAccount, ExtensionInterface } from '@w3ux/types'\nimport { addUnsub } from '../accounts/unsubs'\nimport { processExtensionAccounts } from '../accounts/util'\nimport { canConnect } from '../util'\nimport { initExtensions } from './index'\n\n// Handles accounts from a single extension\nconst handleAccounts = (\n\tss58: number,\n\tid: string,\n\textension: ExtensionInterface,\n\taccounts: ExtensionAccount[],\n) => {\n\tprocessExtensionAccounts(\n\t\t{\n\t\t\tsource: id,\n\t\t\tss58,\n\t\t},\n\t\textension.signer,\n\t\taccounts,\n\t)\n}\n\n// Connects to a single extension and processes its accounts\nexport const connectExtension = async (\n\tdappName: string,\n\tss58: number,\n\tid: string,\n): Promise<boolean> => {\n\tif (canConnect(id)) {\n\t\tconst { connected } = await initExtensions(dappName, [id])\n\t\tif (connected.size === 0) {\n\t\t\treturn false\n\t\t}\n\t\tconst result = connected.get(id)\n\t\tconst extension = result?.extension\n\t\tconst canSubscribe =\n\t\t\t!!extension && typeof extension.accounts.subscribe === 'function'\n\n\t\t// If account subscriptions are not supported, simply get the account(s) from the extension,\n\t\t// otherwise, subscribe to accounts\n\t\tif (extension) {\n\t\t\tif (!canSubscribe) {\n\t\t\t\tconst accounts = await extension.accounts.get()\n\t\t\t\thandleAccounts(ss58, id, extension, accounts)\n\t\t\t} else {\n\t\t\t\tconst unsub = extension.accounts.subscribe((accounts) => {\n\t\t\t\t\thandleAccounts(ss58, id, extension, accounts)\n\t\t\t\t})\n\t\t\t\taddUnsub(id, unsub)\n\t\t\t}\n\t\t}\n\t\treturn true\n\t}\n\treturn false\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport extensions from '@w3ux/extension-assets'\nimport { _extensionsStatus, _gettingExtensions } from '../subjects'\n\n// Gets extensions from injectedWeb3\nexport const getExtensions = async () => {\n\t_gettingExtensions.next(true)\n\tlet injectedWeb3Interval: ReturnType<typeof setInterval> | undefined\n\n\t// Format installed extensions\n\tconst formatInstalled = () =>\n\t\tObject.keys(extensions).reduce(\n\t\t\t(acc, key) => {\n\t\t\t\tacc[key] =\n\t\t\t\t\twindow?.injectedWeb3?.[key] !== undefined ? 'installed' : acc[key]\n\t\t\t\treturn acc\n\t\t\t},\n\t\t\t{ ..._extensionsStatus.getValue() },\n\t\t)\n\n\t// Handle completed interval check\n\tconst handleCompleted = async (foundExtensions: boolean) => {\n\t\tclearInterval(injectedWeb3Interval)\n\t\tif (foundExtensions) {\n\t\t\t_extensionsStatus.next(formatInstalled())\n\t\t}\n\t\t_gettingExtensions.next(false)\n\t}\n\n\tconst interval = 200\n\tconst maxChecks = 10\n\tconst minVerifications = 2\n\n\t// Getter for the currently installed extensions\n\tlet counter = 0\n\tlet verifications = 0\n\tinjectedWeb3Interval = setInterval(() => {\n\t\tcounter++\n\t\tif (counter === maxChecks) {\n\t\t\thandleCompleted(false)\n\t\t} else {\n\t\t\tconst injected = window?.injectedWeb3\n\n\t\t\t// Check if injected exists and all extensions have a valid enable function\n\t\t\tconst ready =\n\t\t\t\tinjected !== undefined &&\n\t\t\t\tObject.entries(injected).every(\n\t\t\t\t\t([, ext]) => ext && typeof ext.enable === 'function',\n\t\t\t\t)\n\n\t\t\t// Increment verifications if the extensions are ready\n\t\t\tif (ready) {\n\t\t\t\tverifications++\n\t\t\t} else {\n\t\t\t\tverifications = 0\n\t\t\t}\n\n\t\t\tif (counter > 2 && verifications >= minVerifications) {\n\t\t\t\thandleCompleted(true)\n\t\t\t}\n\t\t}\n\t}, interval)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionEnableResult,\n\tExtensionEnableResults,\n\tExtensionInterface,\n} from '@w3ux/types'\nimport { enableInjectedWeb3Entry, hasValidEnable } from '../util'\n\n// Get extensions and enable them\nexport const enableExtensions = async (ids: string[], dappName: string) => {\n\tconst extensionIds = getExtensionsById(ids)\n\tconst enableResults = await doEnable(extensionIds, dappName)\n\n\treturn formatEnabledExtensions(extensionIds, enableResults)\n}\n\n// Gets extensions from injectedWeb3 by their ids\nconst getExtensionsById = (ids: string[]) => {\n\tconst validIds: string[] = []\n\tids.forEach((id) => {\n\t\tif (hasValidEnable(id)) {\n\t\t\tvalidIds.push(id)\n\t\t}\n\t})\n\treturn validIds\n}\n\n// Calls enable for the provided extensions\nconst doEnable = async (\n\textensionIds: string[],\n\tdappName: string,\n): Promise<PromiseSettledResult<ExtensionInterface>[]> =>\n\tawait Promise.allSettled(\n\t\tArray.from(extensionIds).map((id) => enableInjectedWeb3Entry(id, dappName)),\n\t)\n\nconst formatEnabledExtensions = (\n\textensionIds: string[],\n\tenabledResults: PromiseSettledResult<ExtensionInterface>[],\n): ExtensionEnableResults => {\n\tconst extensionsState = new Map<string, ExtensionEnableResult>()\n\n\tfor (let i = 0; i < enabledResults.length; i++) {\n\t\tconst result = enabledResults[i]\n\t\tconst id = extensionIds[i]\n\n\t\tif (result.status === 'fulfilled') {\n\t\t\textensionsState.set(id, {\n\t\t\t\textension: result.value,\n\t\t\t\tconnected: true,\n\t\t\t})\n\t\t} else if (result.status === 'rejected') {\n\t\t\textensionsState.set(id, {\n\t\t\t\textension: null,\n\t\t\t\tconnected: false,\n\t\t\t\terror: result.reason,\n\t\t\t})\n\t\t}\n\t}\n\treturn extensionsState\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExtensionEnableResults } from '@w3ux/types'\nimport { addExtensionToLocal, removeExtensionFromLocal } from '../local'\nimport { _extensionsStatus, _initialisedExtensions } from '../subjects'\nimport { enableExtensions } from './enable'\n\n// Connects to previously connected extensions, or to a specific set of extensions\nexport const initExtensions = async (\n\tdappName: string,\n\textensionIds: string[],\n): Promise<{ connected: ExtensionEnableResults }> => {\n\tif (!extensionIds.length) {\n\t\treturn {\n\t\t\tconnected: new Map(),\n\t\t}\n\t}\n\t// Get extensions and enable them\n\tconst enableResults = await enableExtensions(extensionIds, dappName)\n\n\t// Determine which extensions are connected and which have errors\n\tconst [connected, withError] = [\n\t\tfilterConnectedExtensions(enableResults),\n\t\tfilterFailedExtensions(enableResults),\n\t]\n\n\t// Manage local storage depending on connection status\n\tArray.from(connected.keys()).forEach((id) => {\n\t\taddExtensionToLocal(id)\n\t})\n\tArray.from(withError.keys()).forEach((id) => {\n\t\tremoveExtensionFromLocal(id)\n\t})\n\n\t// Handle new extension statuses\n\tconst newStatus = { ..._extensionsStatus.getValue() }\n\tArray.from(connected.keys()).forEach((id) => {\n\t\tnewStatus[id] = 'connected'\n\t})\n\tArray.from(withError.entries()).forEach(([id, { error }]) => {\n\t\tconst errStr = String(error || '')\n\t\tif (errStr.startsWith('Error')) {\n\t\t\t// Extension not found - remove from state\n\t\t\tif (errStr.substring(0, 17) === 'NotInstalledError') {\n\t\t\t\tdelete newStatus[id]\n\t\t\t} else {\n\t\t\t\t// Assume extension not authenticated\n\t\t\t\tnewStatus[id] = 'not_authenticated'\n\t\t\t}\n\t\t}\n\t})\n\n\t// Record initialised extensions\n\tconst newInitialised = [..._initialisedExtensions.getValue()]\n\textensionIds.forEach((id) => {\n\t\tif (!newInitialised.includes(id)) {\n\t\t\tnewInitialised.push(id)\n\t\t}\n\t})\n\n\t// Commit updates to observables\n\t_extensionsStatus.next(newStatus)\n\t_initialisedExtensions.next(newInitialised)\n\n\treturn { connected }\n}\n\n// Filter successfully connected extensions\nconst filterConnectedExtensions = (\n\textensions: ExtensionEnableResults,\n): ExtensionEnableResults =>\n\tnew Map(\n\t\tArray.from(extensions.entries()).filter(([, state]) => state.connected),\n\t)\n\n// Filter extensions that failed to connect\nconst filterFailedExtensions = (\n\textensions: ExtensionEnableResults,\n): ExtensionEnableResults =>\n\tnew Map(\n\t\tArray.from(extensions.entries()).filter(([, state]) => !state.connected),\n\t)\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { inject, isMimirReady, MIMIR_REGEXP } from '@mimirdev/apps-inject'\n\nexport const injectMimir = async () => {\n\tconst openInIframe = window !== window.parent\n\t// Return if not opened in an iframe\n\tif (!openInIframe) {\n\t\treturn\n\t}\n\tconst origin = await isMimirReady()\n\t// Return if not opened in Mimir\n\tif (!origin) {\n\t\treturn\n\t}\n\tif (MIMIR_REGEXP.test(origin)) {\n\t\tinject()\n\t}\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tExtensionEnableResults,\n\tExtensionInterface,\n} from '@w3ux/types'\nimport { formatExtensionAccounts } from './util'\n\n// Connects to provided extensions and gets all accounts\nexport const getAccountsFromExtensions = async (\n\textensions: ExtensionEnableResults,\n\tss58: number,\n): Promise<ExtensionAccount[]> => {\n\ttry {\n\t\tconst extensionEntries = Array.from(extensions.entries())\n\t\t\t.filter(([, { extension }]) => extension !== null)\n\t\t\t.map(\n\t\t\t\t([source, { extension }]) =>\n\t\t\t\t\t[source, extension] as [string, ExtensionInterface],\n\t\t\t)\n\n\t\tconst activeExtensions = extensionEntries.map(([, extension]) => extension)\n\n\t\tconst results = await Promise.allSettled(\n\t\t\tactiveExtensions.map((extension) => extension.accounts.get()),\n\t\t)\n\n\t\tconst allAccounts: ExtensionAccount[] = []\n\t\tfor (let i = 0; i < results.length; i++) {\n\t\t\tconst result = results[i]\n\t\t\tconst source = extensionEntries[i][0]\n\t\t\tconst signer = extensionEntries[i][1].signer\n\n\t\t\tif (result.status === 'fulfilled' && signer) {\n\t\t\t\tconst { value } = result\n\t\t\t\tconst accounts = formatExtensionAccounts(value, ss58).map(\n\t\t\t\t\t({ address, name }) => ({\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\tsigner,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\tallAccounts.push(...accounts)\n\t\t\t}\n\t\t}\n\t\treturn allAccounts\n\t} catch (e) {\n\t\tconsole.error('Error during account formatting: ', e)\n\t\treturn []\n\t}\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport {\n\taddUnsub,\n\tgetAccountsFromExtensions,\n\tprocessExtensionAccounts,\n\tupdateAccounts,\n} from '../accounts/index'\nimport { getActiveExtensionsLocal } from '../local'\nimport { setReconnectSync } from '../util'\nimport { initExtensions } from '.'\n\nexport const reconnectExtensions = async (dappName: string, ss58: number) => {\n\tsetReconnectSync('syncing')\n\tconst { connected } = await initExtensions(\n\t\tdappName,\n\t\tgetActiveExtensionsLocal(),\n\t)\n\tif (connected.size > 0) {\n\t\t// Perform initial account state update\n\t\tupdateAccounts({\n\t\t\tadd: await getAccountsFromExtensions(connected, ss58),\n\t\t\tremove: [],\n\t\t})\n\n\t\t// If available, subscribe to accounts for each connected extension\n\t\tfor (const [id, { extension }] of Array.from(connected.entries())) {\n\t\t\tif (typeof extension!.accounts.subscribe === 'function') {\n\t\t\t\tconst unsub = extension!.accounts.subscribe((accounts) => {\n\t\t\t\t\tprocessExtensionAccounts(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsource: id,\n\t\t\t\t\t\t\tss58,\n\t\t\t\t\t\t},\n\t\t\t\t\t\textension!.signer,\n\t\t\t\t\t\taccounts,\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t\taddUnsub(id, unsub)\n\t\t\t}\n\t\t}\n\t}\n\tsetReconnectSync('synced')\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACIO,IAAM,SAAqC,CAAC;AAG5C,IAAM,WAAW,CAAC,IAAY,UAAsB;AAC1D,SAAO,EAAE,IAAI;AACd;;;ACFA,wBAAkD;;;ACF3C,IAAM,gCAAgE;AAAA,EAC5E,aAAa,CAAC;AAAA,EACd,iBAAiB,CAAC;AACnB;AAGO,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;;;ACHnC,kBAAgC;;;ACLhC,mBAAsC;AAI/B,IAAM,2BAA2B,MAAgB;AACvD,QAAM,cAAU,oCAAgC,qBAAqB,CAAC,GAAG,IAAI;AAC7E,SAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC;AAC5C;AAOO,IAAM,sBAAsB,CAAC,OAAqB;AACxD,QAAM,UAAU,yBAAyB;AACzC,MAAI,CAAC,QAAQ,SAAS,EAAE,GAAG;AAC1B,iBAAa,QAAQ,qBAAqB,KAAK,UAAU,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC;AAAA,EAC3E;AACD;AAGO,IAAM,2BAA2B,CAAC,OAAqB;AAC7D,QAAM,UAAU,yBAAyB;AACzC,eAAa;AAAA,IACZ;AAAA,IACA,KAAK,UAAU,QAAQ,OAAO,CAAC,YAAY,YAAY,EAAE,CAAC;AAAA,EAC3D;AACD;AAEA,IAAM,WAAW,CAAC,UACjB,OAAO,UAAU,YAAY,UAAU;AAExC,IAAM,oBAAoB,CAAC,UAA2C;AACrE,MAAI,CAAC,SAAS,KAAK,GAAG;AACrB,WAAO;AAAA,EACR;AAEA,QAAM,EAAE,SAAS,MAAM,QAAQ,SAAS,OAAO,MAAM,IAAI;AAEzD,MACC,OAAO,YAAY,YACnB,OAAO,SAAS,YAChB,OAAO,WAAW,YAClB,OAAO,YAAY,YACnB,OAAO,UAAU,YACjB,CAAC,OAAO,SAAS,KAAK,GACrB;AACD,WAAO;AAAA,EACR;AAIA,MAAI,UAAU,QAAW;AACxB,WAAO;AAAA,MACN,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IACR;AAAA,EACD;AAEA,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AACzD,WAAO;AAAA,EACR;AAEA,SAAO;AAAA,IACN,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;AAGO,IAAM,2BAA2B,MAAyB;AAChE,QAAM,aAAS,oCAAsB,qBAAqB,CAAC,GAAG,IAAI;AAClE,MAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC3B,WAAO,CAAC;AAAA,EACT;AAEA,SAAO,OACL,IAAI,CAAC,YAAY,kBAAkB,OAAO,CAAC,EAC3C,OAAO,CAAC,YAAwC,YAAY,IAAI;AACnE;;;ADhFO,IAAM,oBAAoB,IAAI,4BAAkC,CAAC,CAAC;AAClE,IAAM,qBAAqB,IAAI,4BAAyB,IAAI;AAC5D,IAAM,yBAAyB,IAAI,4BAA0B,CAAC,CAAC;AAC/D,IAAM,iBAAiB,IAAI,4BAAsB,UAAU;AAC3D,IAAM,qBAAqB,IAAI,4BAAoC,CAAC,CAAC;AACrE,IAAM,oBAAoB,IAAI;AAAA,EACpC,yBAAyB;AAC1B;;;AFJO,IAAM,2BAA2B,CACvC,QACA,QACA,gBACoC;AACpC,QAAM,EAAE,QAAQ,KAAK,IAAI;AACzB,MAAI,CAAC,YAAY,QAAQ;AACxB,WAAO;AAAA,EACR;AAGA,gBAAc,wBAAwB,aAAa,IAAI;AAGvD,QAAM,kBAAkB,mBACtB,SAAS,EACT,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,EACjC,OAAO,CAAC,MAAM,CAAC,YAAY,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC;AAGjE,gBAAc,YAAY;AAAA,IACzB,CAAC,EAAE,QAAQ,MACV,CAAC,mBACC,SAAS,EACT,KAAK,CAAC,MAAM,EAAE,YAAY,WAAW,EAAE,WAAW,MAAM;AAAA,EAC5D;AAGA,gBAAc,YAAY,IAAI,CAAC,EAAE,SAAS,KAAK,OAAO;AAAA,IACrD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,EAAE;AAGF,iBAAe;AAAA,IACd,KAAK;AAAA,IACL,QAAQ;AAAA,EACT,CAAC;AAED,SAAO;AAAA,IACN;AAAA,IACA,iBAAiB,CAAC,GAAG,eAAe;AAAA,EACrC;AACD;AAGO,IAAM,0BAA0B,CACtC,UACA,SACI;AACJ,aAAW,SAET,OAAO,CAAC,EAAE,QAAQ,UAAM,kCAAe,OAAO,CAAC,EAE/C,IAAI,CAAC,YAAY;AACjB,UAAM,uBAAmB,qCAAkB,QAAQ,SAAS,IAAI;AAChE,QAAI,CAAC,kBAAkB;AACtB,aAAO;AAAA,IACR;AACA,YAAQ,UAAU;AAClB,WAAO;AAAA,EACR,CAAC,EAEA,OAAO,CAAC,YAAY,YAAY,IAAI;AAEtC,SAAO;AACR;AAGO,IAAM,iBAAiB,CAAC;AAAA,EAC9B;AAAA,EACA;AACD,MAGM;AACL,QAAM,cAAc,CAAC,GAAG,mBAAmB,SAAS,CAAC,EACnD,OAAO,GAAG,EACV;AAAA,IACA,CAAC,MACA,OAAO,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,MACnE;AAAA,EACF;AACD,qBAAmB,KAAK,WAAW;AACpC;;;AI1EO,IAAM,aAAa,CAAC,OAC1B,CAAC,CAAC,QAAW,WAAW,EAAE,SAAS,kBAAkB,SAAS,EAAE,EAAE,CAAC;AAW7D,IAAM,mBAAmB,CAAC,SAAe;AAC/C,iBAAe,KAAK,IAAI;AACzB;AAWO,IAAM,UAAU,CAAC,OACvB,OAAO,SAAS,OAAO,OAAO,OAAO;AAG/B,IAAM,iBAAiB,CAAC,OAAwB;AACtD,MAAI;AACH,UAAM,SAAS,QAAQ,EAAE,IACtB,OAAO,aAAc,EAAE,EAAE,SACzB,OAAO,OAAO,aAAc,EAAE,EAAE;AAEnC,WAAO,WAAW,UAAa,OAAO,WAAW;AAAA,EAClD,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAGO,IAAM,0BAA0B,CAAC,IAAY,aAAqB;AACxE,MAAI,QAAQ,EAAE,GAAG;AAChB,UAAMA,UAAS,OAAO,aAAc,EAAE,EAAE,OAAO,QAAQ;AACvD,WAAOA;AAAA,EACR;AACA,QAAM,SAAS,OAAO,OAAO,aAAc,EAAE,EAAE,OAAO,QAAQ;AAC9D,SAAO;AACR;;;ACpEA,IAAM,iBAAiB,CACtB,MACA,IACA,WACA,aACI;AACJ;AAAA,IACC;AAAA,MACC,QAAQ;AAAA,MACR;AAAA,IACD;AAAA,IACA,UAAU;AAAA,IACV;AAAA,EACD;AACD;AAGO,IAAM,mBAAmB,OAC/B,UACA,MACA,OACsB;AACtB,MAAI,WAAW,EAAE,GAAG;AACnB,UAAM,EAAE,UAAU,IAAI,MAAM,eAAe,UAAU,CAAC,EAAE,CAAC;AACzD,QAAI,UAAU,SAAS,GAAG;AACzB,aAAO;AAAA,IACR;AACA,UAAM,SAAS,UAAU,IAAI,EAAE;AAC/B,UAAM,YAAY,QAAQ;AAC1B,UAAM,eACL,CAAC,CAAC,aAAa,OAAO,UAAU,SAAS,cAAc;AAIxD,QAAI,WAAW;AACd,UAAI,CAAC,cAAc;AAClB,cAAM,WAAW,MAAM,UAAU,SAAS,IAAI;AAC9C,uBAAe,MAAM,IAAI,WAAW,QAAQ;AAAA,MAC7C,OAAO;AACN,cAAM,QAAQ,UAAU,SAAS,UAAU,CAAC,aAAa;AACxD,yBAAe,MAAM,IAAI,WAAW,QAAQ;AAAA,QAC7C,CAAC;AACD,iBAAS,IAAI,KAAK;AAAA,MACnB;AAAA,IACD;AACA,WAAO;AAAA,EACR;AACA,SAAO;AACR;;;ACvDA,8BAAuB;AAIhB,IAAM,gBAAgB,YAAY;AACxC,qBAAmB,KAAK,IAAI;AAC5B,MAAI;AAGJ,QAAM,kBAAkB,MACvB,OAAO,KAAK,wBAAAC,OAAU,EAAE;AAAA,IACvB,CAAC,KAAK,QAAQ;AACb,UAAI,GAAG,IACN,QAAQ,eAAe,GAAG,MAAM,SAAY,cAAc,IAAI,GAAG;AAClE,aAAO;AAAA,IACR;AAAA,IACA,EAAE,GAAG,kBAAkB,SAAS,EAAE;AAAA,EACnC;AAGD,QAAM,kBAAkB,OAAO,oBAA6B;AAC3D,kBAAc,oBAAoB;AAClC,QAAI,iBAAiB;AACpB,wBAAkB,KAAK,gBAAgB,CAAC;AAAA,IACzC;AACA,uBAAmB,KAAK,KAAK;AAAA,EAC9B;AAEA,QAAM,WAAW;AACjB,QAAM,YAAY;AAClB,QAAM,mBAAmB;AAGzB,MAAI,UAAU;AACd,MAAI,gBAAgB;AACpB,yBAAuB,YAAY,MAAM;AACxC;AACA,QAAI,YAAY,WAAW;AAC1B,sBAAgB,KAAK;AAAA,IACtB,OAAO;AACN,YAAM,WAAW,QAAQ;AAGzB,YAAM,QACL,aAAa,UACb,OAAO,QAAQ,QAAQ,EAAE;AAAA,QACxB,CAAC,CAAC,EAAE,GAAG,MAAM,OAAO,OAAO,IAAI,WAAW;AAAA,MAC3C;AAGD,UAAI,OAAO;AACV;AAAA,MACD,OAAO;AACN,wBAAgB;AAAA,MACjB;AAEA,UAAI,UAAU,KAAK,iBAAiB,kBAAkB;AACrD,wBAAgB,IAAI;AAAA,MACrB;AAAA,IACD;AAAA,EACD,GAAG,QAAQ;AACZ;;;ACrDO,IAAM,mBAAmB,OAAO,KAAe,aAAqB;AAC1E,QAAM,eAAe,kBAAkB,GAAG;AAC1C,QAAM,gBAAgB,MAAM,SAAS,cAAc,QAAQ;AAE3D,SAAO,wBAAwB,cAAc,aAAa;AAC3D;AAGA,IAAM,oBAAoB,CAAC,QAAkB;AAC5C,QAAM,WAAqB,CAAC;AAC5B,MAAI,QAAQ,CAAC,OAAO;AACnB,QAAI,eAAe,EAAE,GAAG;AACvB,eAAS,KAAK,EAAE;AAAA,IACjB;AAAA,EACD,CAAC;AACD,SAAO;AACR;AAGA,IAAM,WAAW,OAChB,cACA,aAEA,MAAM,QAAQ;AAAA,EACb,MAAM,KAAK,YAAY,EAAE,IAAI,CAAC,OAAO,wBAAwB,IAAI,QAAQ,CAAC;AAC3E;AAED,IAAM,0BAA0B,CAC/B,cACA,mBAC4B;AAC5B,QAAM,kBAAkB,oBAAI,IAAmC;AAE/D,WAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;AAC/C,UAAM,SAAS,eAAe,CAAC;AAC/B,UAAM,KAAK,aAAa,CAAC;AAEzB,QAAI,OAAO,WAAW,aAAa;AAClC,sBAAgB,IAAI,IAAI;AAAA,QACvB,WAAW,OAAO;AAAA,QAClB,WAAW;AAAA,MACZ,CAAC;AAAA,IACF,WAAW,OAAO,WAAW,YAAY;AACxC,sBAAgB,IAAI,IAAI;AAAA,QACvB,WAAW;AAAA,QACX,WAAW;AAAA,QACX,OAAO,OAAO;AAAA,MACf,CAAC;AAAA,IACF;AAAA,EACD;AACA,SAAO;AACR;;;ACrDO,IAAM,iBAAiB,OAC7B,UACA,iBACoD;AACpD,MAAI,CAAC,aAAa,QAAQ;AACzB,WAAO;AAAA,MACN,WAAW,oBAAI,IAAI;AAAA,IACpB;AAAA,EACD;AAEA,QAAM,gBAAgB,MAAM,iBAAiB,cAAc,QAAQ;AAGnE,QAAM,CAAC,WAAW,SAAS,IAAI;AAAA,IAC9B,0BAA0B,aAAa;AAAA,IACvC,uBAAuB,aAAa;AAAA,EACrC;AAGA,QAAM,KAAK,UAAU,KAAK,CAAC,EAAE,QAAQ,CAAC,OAAO;AAC5C,wBAAoB,EAAE;AAAA,EACvB,CAAC;AACD,QAAM,KAAK,UAAU,KAAK,CAAC,EAAE,QAAQ,CAAC,OAAO;AAC5C,6BAAyB,EAAE;AAAA,EAC5B,CAAC;AAGD,QAAM,YAAY,EAAE,GAAG,kBAAkB,SAAS,EAAE;AACpD,QAAM,KAAK,UAAU,KAAK,CAAC,EAAE,QAAQ,CAAC,OAAO;AAC5C,cAAU,EAAE,IAAI;AAAA,EACjB,CAAC;AACD,QAAM,KAAK,UAAU,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM;AAC5D,UAAM,SAAS,OAAO,SAAS,EAAE;AACjC,QAAI,OAAO,WAAW,OAAO,GAAG;AAE/B,UAAI,OAAO,UAAU,GAAG,EAAE,MAAM,qBAAqB;AACpD,eAAO,UAAU,EAAE;AAAA,MACpB,OAAO;AAEN,kBAAU,EAAE,IAAI;AAAA,MACjB;AAAA,IACD;AAAA,EACD,CAAC;AAGD,QAAM,iBAAiB,CAAC,GAAG,uBAAuB,SAAS,CAAC;AAC5D,eAAa,QAAQ,CAAC,OAAO;AAC5B,QAAI,CAAC,eAAe,SAAS,EAAE,GAAG;AACjC,qBAAe,KAAK,EAAE;AAAA,IACvB;AAAA,EACD,CAAC;AAGD,oBAAkB,KAAK,SAAS;AAChC,yBAAuB,KAAK,cAAc;AAE1C,SAAO,EAAE,UAAU;AACpB;AAGA,IAAM,4BAA4B,CACjCC,gBAEA,IAAI;AAAA,EACH,MAAM,KAAKA,YAAW,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,MAAM,SAAS;AACvE;AAGD,IAAM,yBAAyB,CAC9BA,gBAEA,IAAI;AAAA,EACH,MAAM,KAAKA,YAAW,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,MAAM,SAAS;AACxE;;;AC/ED,yBAAmD;AAE5C,IAAM,cAAc,YAAY;AACtC,QAAM,eAAe,WAAW,OAAO;AAEvC,MAAI,CAAC,cAAc;AAClB;AAAA,EACD;AACA,QAAM,SAAS,UAAM,iCAAa;AAElC,MAAI,CAAC,QAAQ;AACZ;AAAA,EACD;AACA,MAAI,gCAAa,KAAK,MAAM,GAAG;AAC9B,mCAAO;AAAA,EACR;AACD;;;ACRO,IAAM,4BAA4B,OACxCC,aACA,SACiC;AACjC,MAAI;AACH,UAAM,mBAAmB,MAAM,KAAKA,YAAW,QAAQ,CAAC,EACtD,OAAO,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,MAAM,cAAc,IAAI,EAChD;AAAA,MACA,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,MACtB,CAAC,QAAQ,SAAS;AAAA,IACpB;AAED,UAAM,mBAAmB,iBAAiB,IAAI,CAAC,CAAC,EAAE,SAAS,MAAM,SAAS;AAE1E,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC7B,iBAAiB,IAAI,CAAC,cAAc,UAAU,SAAS,IAAI,CAAC;AAAA,IAC7D;AAEA,UAAM,cAAkC,CAAC;AACzC,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACxC,YAAM,SAAS,QAAQ,CAAC;AACxB,YAAM,SAAS,iBAAiB,CAAC,EAAE,CAAC;AACpC,YAAM,SAAS,iBAAiB,CAAC,EAAE,CAAC,EAAE;AAEtC,UAAI,OAAO,WAAW,eAAe,QAAQ;AAC5C,cAAM,EAAE,MAAM,IAAI;AAClB,cAAM,WAAW,wBAAwB,OAAO,IAAI,EAAE;AAAA,UACrD,CAAC,EAAE,SAAS,KAAK,OAAO;AAAA,YACvB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACD;AAAA,QACD;AACA,oBAAY,KAAK,GAAG,QAAQ;AAAA,MAC7B;AAAA,IACD;AACA,WAAO;AAAA,EACR,SAAS,GAAG;AACX,YAAQ,MAAM,qCAAqC,CAAC;AACpD,WAAO,CAAC;AAAA,EACT;AACD;;;ACxCO,IAAM,sBAAsB,OAAO,UAAkB,SAAiB;AAC5E,mBAAiB,SAAS;AAC1B,QAAM,EAAE,UAAU,IAAI,MAAM;AAAA,IAC3B;AAAA,IACA,yBAAyB;AAAA,EAC1B;AACA,MAAI,UAAU,OAAO,GAAG;AAEvB,mBAAe;AAAA,MACd,KAAK,MAAM,0BAA0B,WAAW,IAAI;AAAA,MACpD,QAAQ,CAAC;AAAA,IACV,CAAC;AAGD,eAAW,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,MAAM,KAAK,UAAU,QAAQ,CAAC,GAAG;AAClE,UAAI,OAAO,UAAW,SAAS,cAAc,YAAY;AACxD,cAAM,QAAQ,UAAW,SAAS,UAAU,CAAC,aAAa;AACzD;AAAA,YACC;AAAA,cACC,QAAQ;AAAA,cACR;AAAA,YACD;AAAA,YACA,UAAW;AAAA,YACX;AAAA,UACD;AAAA,QACD,CAAC;AACD,iBAAS,IAAI,KAAK;AAAA,MACnB;AAAA,IACD;AAAA,EACD;AACA,mBAAiB,QAAQ;AAC1B;","names":["result","extensions","extensions","extensions"]}
1
+ {"version":3,"sources":["../../src/extensions/index.ts","../../src/accounts/unsubs.ts","../../src/accounts/util.ts","../../src/consts.ts","../../src/subjects.ts","../../src/local.ts","../../src/util.ts","../../src/extensions/connect.ts","../../src/extensions/discover.ts","../../src/extensions/enable.ts","../../src/extensions/init.ts","../../src/accounts/get.ts","../../src/extensions/reconnect.ts"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nexport * from './connect'\nexport * from './discover'\nexport * from './enable'\nexport * from './init'\nexport * from './reconnect'\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\n// Extension account subscription unsubs\nexport const unsubs: Record<string, () => void> = {}\n\n// Add an extension id to unsub state\nexport const addUnsub = (id: string, unsub: () => void) => {\n\tunsubs[id] = unsub\n}\n\n// Unsubscribe to all unsubs\nexport const unsubAll = () => {\n\tObject.values(unsubs).forEach((unsub) => {\n\t\tunsub()\n\t})\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { formatAccountSs58, isValidAddress } from '@w3ux/util-dedot'\nimport { DefaultProcessExtensionResult } from '../consts'\nimport { _extensionAccounts } from '../subjects'\nimport type { ExtensionAccount, ProcessExtensionAccountsResult } from '../types'\n\n// Gets accounts to be imported and commits them to state\n\ninterface Config {\n\tsource: string\n\tss58: number\n}\nexport const processExtensionAccounts = (\n\tconfig: Config,\n\tsigner: unknown,\n\tnewAccounts: ExtensionAccount[],\n): ProcessExtensionAccountsResult => {\n\tconst { source, ss58 } = config\n\tif (!newAccounts.length) {\n\t\treturn DefaultProcessExtensionResult\n\t}\n\n\t// Get valid accounts from extension\n\tnewAccounts = formatExtensionAccounts(newAccounts, ss58)\n\n\t// Find any accounts that have been removed from this extension\n\tconst removedAccounts = _extensionAccounts\n\t\t.getValue()\n\t\t.filter((j) => j.source === source)\n\t\t.filter((j) => !newAccounts.find((i) => i.address === j.address))\n\n\t// Remove accounts that have already been imported\n\tnewAccounts = newAccounts.filter(\n\t\t({ address }) =>\n\t\t\t!_extensionAccounts\n\t\t\t\t.getValue()\n\t\t\t\t.find((j) => j.address === address && j.source === source),\n\t)\n\n\t// Format accounts properties\n\tnewAccounts = newAccounts.map(({ address, name }) => ({\n\t\taddress,\n\t\tname,\n\t\tsource,\n\t\tsigner,\n\t}))\n\n\t// Update observable state\n\tupdateAccounts({\n\t\tadd: newAccounts,\n\t\tremove: removedAccounts,\n\t})\n\n\treturn {\n\t\tnewAccounts,\n\t\tremovedAccounts: [...removedAccounts],\n\t}\n}\n\n// Formats accounts to correct ss58 and removes invalid accounts\nexport const formatExtensionAccounts = (\n\taccounts: ExtensionAccount[],\n\tss58: number,\n) => {\n\taccounts = accounts\n\t\t// Remove accounts that do not contain correctly formatted addresses\n\t\t.filter(({ address }) => isValidAddress(address))\n\t\t// Reformat addresses to ensure default ss58 format\n\t\t.map((account) => {\n\t\t\tconst formattedAddress = formatAccountSs58(account.address, ss58)\n\t\t\tif (!formattedAddress) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\taccount.address = formattedAddress\n\t\t\treturn account\n\t\t})\n\t\t// Remove null entries resulting from invalid formatted addresses\n\t\t.filter((account) => account !== null)\n\n\treturn accounts\n}\n\n// Updates accounts observable based on removed and added accounts\nexport const updateAccounts = ({\n\tadd,\n\tremove,\n}: {\n\tadd: ExtensionAccount[]\n\tremove: ExtensionAccount[]\n}) => {\n\tconst newAccounts = [..._extensionAccounts.getValue()]\n\t\t.concat(add)\n\t\t.filter(\n\t\t\t(a) =>\n\t\t\t\tremove.find((s) => s.address === a.address && s.source === a.source) ===\n\t\t\t\tundefined,\n\t\t)\n\t_extensionAccounts.next(newAccounts)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ProcessExtensionAccountsResult } from './types'\n\nexport const DefaultProcessExtensionResult: ProcessExtensionAccountsResult = {\n\tnewAccounts: [],\n\tremovedAccounts: [],\n}\n\n// Local storage active extensions key\nexport const ActiveExtensionsKey = 'active_extensions'\nexport const HardwareAccountsKey = 'hardware_accounts'\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { BehaviorSubject } from 'rxjs'\nimport { getHardwareAccountsLocal } from './local'\nimport type {\n\tExtensionAccount,\n\tExtensionsStatus,\n\tHardwareAccount,\n\tSync,\n} from './types'\n\n// NOTE: These subjects stay private to the package and are not exported\n\nexport const _extensionsStatus = new BehaviorSubject<ExtensionsStatus>({})\nexport const _gettingExtensions = new BehaviorSubject<boolean>(true)\nexport const _initialisedExtensions = new BehaviorSubject<string[]>([])\nexport const _reconnectSync = new BehaviorSubject<Sync>('unsynced')\nexport const _extensionAccounts = new BehaviorSubject<ExtensionAccount[]>([])\nexport const _hardwareAccounts = new BehaviorSubject<HardwareAccount[]>(\n\tgetHardwareAccountsLocal(),\n)\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { localStorageOrDefault } from '@w3ux/utils'\nimport { ActiveExtensionsKey, HardwareAccountsKey } from './consts'\nimport type { HardwareAccount } from './types'\n\n// Gets all active extensions from local storage\nexport const getActiveExtensionsLocal = (): string[] => {\n\tconst current = localStorageOrDefault<string[]>(ActiveExtensionsKey, [], true)\n\treturn Array.isArray(current) ? current : []\n}\n\n// Check if an extension exists in local storage\nexport const isExtensionLocal = (id: string): boolean =>\n\tgetActiveExtensionsLocal().includes(id)\n\n// Adds an extension to local storage\nexport const addExtensionToLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tif (!current.includes(id)) {\n\t\tlocalStorage.setItem(ActiveExtensionsKey, JSON.stringify([...current, id]))\n\t}\n}\n\n// Removes extension from local storage\nexport const removeExtensionFromLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tlocalStorage.setItem(\n\t\tActiveExtensionsKey,\n\t\tJSON.stringify(current.filter((localId) => localId !== id)),\n\t)\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n\ttypeof value === 'object' && value !== null\n\nconst asHardwareAccount = (value: unknown): HardwareAccount | null => {\n\tif (!isRecord(value)) {\n\t\treturn null\n\t}\n\n\tconst { address, name, source, network, index, group } = value\n\n\tif (\n\t\ttypeof address !== 'string' ||\n\t\ttypeof name !== 'string' ||\n\t\ttypeof source !== 'string' ||\n\t\ttypeof network !== 'string' ||\n\t\ttypeof index !== 'number' ||\n\t\t!Number.isFinite(index)\n\t) {\n\t\treturn null\n\t}\n\n\t// NOTE: Feb 14, 2026 - `group` is a recently added property, so we allow it to be optional for\n\t// backward compatibility for the time being\n\tif (group === undefined) {\n\t\treturn {\n\t\t\t...value,\n\t\t\taddress,\n\t\t\tname,\n\t\t\tsource,\n\t\t\tnetwork,\n\t\t\tindex,\n\t\t\tgroup: 1,\n\t\t} as HardwareAccount\n\t}\n\n\tif (typeof group !== 'number' || !Number.isFinite(group)) {\n\t\treturn null\n\t}\n\n\treturn {\n\t\t...value,\n\t\taddress,\n\t\tname,\n\t\tsource,\n\t\tnetwork,\n\t\tindex,\n\t\tgroup,\n\t} as HardwareAccount\n}\n\n// Gets imported hardware accounts from local storage\nexport const getHardwareAccountsLocal = (): HardwareAccount[] => {\n\tconst stored = localStorageOrDefault(HardwareAccountsKey, [], true)\n\tif (!Array.isArray(stored)) {\n\t\treturn []\n\t}\n\n\treturn stored\n\t\t.map((account) => asHardwareAccount(account))\n\t\t.filter((account): account is HardwareAccount => account !== null)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport {\n\t_extensionAccounts,\n\t_extensionsStatus,\n\t_hardwareAccounts,\n\t_reconnectSync,\n} from './subjects'\nimport type { ExtensionStatus, HardwareAccount, Sync } from './types'\n\n// Gets an extension status\nexport const getStatus = (id: string): ExtensionStatus =>\n\t_extensionsStatus.getValue()[id] || undefined\n\n// Sets an extension status\nexport const setStatus = (id: string, status: ExtensionStatus) => {\n\tconst newValue = { ..._extensionsStatus.getValue() }\n\tnewValue[id] = status\n\t_extensionsStatus.next(newValue)\n}\n\n// Removes an extension status\nexport const removeStatus = (id: string) => {\n\tconst { [id]: _, ...rest } = _extensionsStatus.getValue()\n\t_extensionsStatus.next(rest)\n}\n\n// Whether an extension can be connected\nexport const canConnect = (id: string) =>\n\t![undefined, 'connected'].includes(_extensionsStatus.getValue()[id])\n\n// Reset accounts\nexport const resetAccounts = () => {\n\t_extensionAccounts.next([])\n}\n\n// Get previously enabled extension reconnect sync status\nexport const getReconnectSync = () => _reconnectSync.getValue()\n\n// Set previously enabled extension reconnect sync status\nexport const setReconnectSync = (sync: Sync) => {\n\t_reconnectSync.next(sync)\n}\n\n// Get hardware accounts\nexport const getHardwareAccounts = () => _hardwareAccounts.getValue()\n\n// Set hardware accounts\nexport const setHardwareAccounts = (accounts: HardwareAccount[]) => {\n\t_hardwareAccounts.next(accounts)\n}\n\n// Check if an injected web3 entry has a valid enable function\nexport const hasValidEnable = (id: string): boolean => {\n\ttry {\n\t\tconst enable = window.parent.injectedWeb3![id].enable\n\t\treturn enable !== undefined && typeof enable === 'function'\n\t} catch {\n\t\treturn false\n\t}\n}\n\n// Enable an injected web3 entry\nexport const enableInjectedWeb3Entry = (id: string, dappName: string) => {\n\tconst result = window.parent.injectedWeb3![id].enable(dappName)\n\treturn result\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { addUnsub } from '../accounts/unsubs'\nimport { processExtensionAccounts } from '../accounts/util'\nimport type { ExtensionAccount, ExtensionInterface } from '../types'\nimport { canConnect } from '../util'\nimport { initExtensions } from './index'\n\n// Handles accounts from a single extension\nconst handleAccounts = (\n\tss58: number,\n\tid: string,\n\textension: ExtensionInterface,\n\taccounts: ExtensionAccount[],\n) => {\n\tprocessExtensionAccounts(\n\t\t{\n\t\t\tsource: id,\n\t\t\tss58,\n\t\t},\n\t\textension.signer,\n\t\taccounts,\n\t)\n}\n\n// Connects to a single extension and processes its accounts\nexport const connectExtension = async (\n\tdappName: string,\n\tss58: number,\n\tid: string,\n): Promise<boolean> => {\n\tif (canConnect(id)) {\n\t\tconst { connected } = await initExtensions(dappName, [id])\n\t\tif (connected.size === 0) {\n\t\t\treturn false\n\t\t}\n\t\tconst result = connected.get(id)\n\t\tconst extension = result?.extension\n\t\tconst canSubscribe =\n\t\t\t!!extension && typeof extension.accounts.subscribe === 'function'\n\n\t\t// If account subscriptions are not supported, simply get the account(s) from the extension,\n\t\t// otherwise, subscribe to accounts\n\t\tif (extension) {\n\t\t\tif (!canSubscribe) {\n\t\t\t\tconst accounts = await extension.accounts.get()\n\t\t\t\thandleAccounts(ss58, id, extension, accounts)\n\t\t\t} else {\n\t\t\t\tconst unsub = extension.accounts.subscribe((accounts) => {\n\t\t\t\t\thandleAccounts(ss58, id, extension, accounts)\n\t\t\t\t})\n\t\t\t\taddUnsub(id, unsub)\n\t\t\t}\n\t\t}\n\t\treturn true\n\t}\n\treturn false\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport extensions from '@w3ux/extension-assets'\nimport { _extensionsStatus, _gettingExtensions } from '../subjects'\n\n// Gets extensions from injectedWeb3\nexport const getExtensions = async () => {\n\t_gettingExtensions.next(true)\n\tlet injectedWeb3Interval: ReturnType<typeof setInterval> | undefined\n\n\t// Format installed extensions\n\tconst formatInstalled = () =>\n\t\tObject.keys(extensions).reduce(\n\t\t\t(acc, key) => {\n\t\t\t\tacc[key] =\n\t\t\t\t\twindow?.injectedWeb3?.[key] !== undefined ? 'installed' : acc[key]\n\t\t\t\treturn acc\n\t\t\t},\n\t\t\t{ ..._extensionsStatus.getValue() },\n\t\t)\n\n\t// Handle completed interval check\n\tconst handleCompleted = async (foundExtensions: boolean) => {\n\t\tclearInterval(injectedWeb3Interval)\n\t\tif (foundExtensions) {\n\t\t\t_extensionsStatus.next(formatInstalled())\n\t\t}\n\t\t_gettingExtensions.next(false)\n\t}\n\n\tconst interval = 200\n\tconst maxChecks = 10\n\tconst minVerifications = 2\n\n\t// Getter for the currently installed extensions\n\tlet counter = 0\n\tlet verifications = 0\n\tinjectedWeb3Interval = setInterval(() => {\n\t\tcounter++\n\t\tif (counter === maxChecks) {\n\t\t\thandleCompleted(false)\n\t\t} else {\n\t\t\tconst injected = window?.injectedWeb3\n\n\t\t\t// Check if injected exists and all extensions have a valid enable function\n\t\t\tconst ready =\n\t\t\t\tinjected !== undefined &&\n\t\t\t\tObject.entries(injected).every(\n\t\t\t\t\t([, ext]) => ext && typeof ext.enable === 'function',\n\t\t\t\t)\n\n\t\t\t// Increment verifications if the extensions are ready\n\t\t\tif (ready) {\n\t\t\t\tverifications++\n\t\t\t} else {\n\t\t\t\tverifications = 0\n\t\t\t}\n\n\t\t\tif (counter > 2 && verifications >= minVerifications) {\n\t\t\t\thandleCompleted(true)\n\t\t\t}\n\t\t}\n\t}, interval)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionEnableResult,\n\tExtensionEnableResults,\n\tExtensionInterface,\n} from '../types'\nimport { enableInjectedWeb3Entry, hasValidEnable } from '../util'\n\n// Get extensions and enable them\nexport const enableExtensions = async (ids: string[], dappName: string) => {\n\tconst extensionIds = getExtensionsById(ids)\n\tconst enableResults = await doEnable(extensionIds, dappName)\n\n\treturn formatEnabledExtensions(extensionIds, enableResults)\n}\n\n// Gets extensions from injectedWeb3 by their ids\nconst getExtensionsById = (ids: string[]) => {\n\tconst validIds: string[] = []\n\tids.forEach((id) => {\n\t\tif (hasValidEnable(id)) {\n\t\t\tvalidIds.push(id)\n\t\t}\n\t})\n\treturn validIds\n}\n\n// Calls enable for the provided extensions\nconst doEnable = async (\n\textensionIds: string[],\n\tdappName: string,\n): Promise<PromiseSettledResult<ExtensionInterface>[]> =>\n\tawait Promise.allSettled(\n\t\tArray.from(extensionIds).map((id) => enableInjectedWeb3Entry(id, dappName)),\n\t)\n\nconst formatEnabledExtensions = (\n\textensionIds: string[],\n\tenabledResults: PromiseSettledResult<ExtensionInterface>[],\n): ExtensionEnableResults => {\n\tconst extensionsState = new Map<string, ExtensionEnableResult>()\n\n\tfor (let i = 0; i < enabledResults.length; i++) {\n\t\tconst result = enabledResults[i]\n\t\tconst id = extensionIds[i]\n\n\t\tif (result.status === 'fulfilled') {\n\t\t\textensionsState.set(id, {\n\t\t\t\textension: result.value,\n\t\t\t\tconnected: true,\n\t\t\t})\n\t\t} else if (result.status === 'rejected') {\n\t\t\textensionsState.set(id, {\n\t\t\t\textension: null,\n\t\t\t\tconnected: false,\n\t\t\t\terror: result.reason,\n\t\t\t})\n\t\t}\n\t}\n\treturn extensionsState\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { addExtensionToLocal, removeExtensionFromLocal } from '../local'\nimport { _extensionsStatus, _initialisedExtensions } from '../subjects'\nimport type { ExtensionEnableResults } from '../types'\nimport { enableExtensions } from './enable'\n\n// Connects to previously connected extensions, or to a specific set of extensions\nexport const initExtensions = async (\n\tdappName: string,\n\textensionIds: string[],\n): Promise<{ connected: ExtensionEnableResults }> => {\n\tif (!extensionIds.length) {\n\t\treturn {\n\t\t\tconnected: new Map(),\n\t\t}\n\t}\n\t// Get extensions and enable them\n\tconst enableResults = await enableExtensions(extensionIds, dappName)\n\n\t// Determine which extensions are connected and which have errors\n\tconst [connected, withError] = [\n\t\tfilterConnectedExtensions(enableResults),\n\t\tfilterFailedExtensions(enableResults),\n\t]\n\n\t// Manage local storage depending on connection status\n\tArray.from(connected.keys()).forEach((id) => {\n\t\taddExtensionToLocal(id)\n\t})\n\tArray.from(withError.keys()).forEach((id) => {\n\t\tremoveExtensionFromLocal(id)\n\t})\n\n\t// Handle new extension statuses\n\tconst newStatus = { ..._extensionsStatus.getValue() }\n\tArray.from(connected.keys()).forEach((id) => {\n\t\tnewStatus[id] = 'connected'\n\t})\n\tArray.from(withError.entries()).forEach(([id, { error }]) => {\n\t\tconst errStr = String(error || '')\n\t\tif (errStr.startsWith('Error')) {\n\t\t\t// Extension not found - remove from state\n\t\t\tif (errStr.substring(0, 17) === 'NotInstalledError') {\n\t\t\t\tdelete newStatus[id]\n\t\t\t} else {\n\t\t\t\t// Assume extension not authenticated\n\t\t\t\tnewStatus[id] = 'not_authenticated'\n\t\t\t}\n\t\t}\n\t})\n\n\t// Record initialised extensions\n\tconst newInitialised = [..._initialisedExtensions.getValue()]\n\textensionIds.forEach((id) => {\n\t\tif (!newInitialised.includes(id)) {\n\t\t\tnewInitialised.push(id)\n\t\t}\n\t})\n\n\t// Commit updates to observables\n\t_extensionsStatus.next(newStatus)\n\t_initialisedExtensions.next(newInitialised)\n\n\treturn { connected }\n}\n\n// Filter successfully connected extensions\nconst filterConnectedExtensions = (\n\textensions: ExtensionEnableResults,\n): ExtensionEnableResults =>\n\tnew Map(\n\t\tArray.from(extensions.entries()).filter(([, state]) => state.connected),\n\t)\n\n// Filter extensions that failed to connect\nconst filterFailedExtensions = (\n\textensions: ExtensionEnableResults,\n): ExtensionEnableResults =>\n\tnew Map(\n\t\tArray.from(extensions.entries()).filter(([, state]) => !state.connected),\n\t)\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tExtensionEnableResults,\n\tExtensionInterface,\n} from '../types'\nimport { formatExtensionAccounts } from './util'\n\n// Connects to provided extensions and gets all accounts\nexport const getAccountsFromExtensions = async (\n\textensions: ExtensionEnableResults,\n\tss58: number,\n): Promise<ExtensionAccount[]> => {\n\ttry {\n\t\tconst extensionEntries = Array.from(extensions.entries())\n\t\t\t.filter(([, { extension }]) => extension !== null)\n\t\t\t.map(\n\t\t\t\t([source, { extension }]) =>\n\t\t\t\t\t[source, extension] as [string, ExtensionInterface],\n\t\t\t)\n\n\t\tconst activeExtensions = extensionEntries.map(([, extension]) => extension)\n\n\t\tconst results = await Promise.allSettled(\n\t\t\tactiveExtensions.map((extension) => extension.accounts.get()),\n\t\t)\n\n\t\tconst allAccounts: ExtensionAccount[] = []\n\t\tfor (let i = 0; i < results.length; i++) {\n\t\t\tconst result = results[i]\n\t\t\tconst source = extensionEntries[i][0]\n\t\t\tconst signer = extensionEntries[i][1].signer\n\n\t\t\tif (result.status === 'fulfilled' && signer) {\n\t\t\t\tconst { value } = result\n\t\t\t\tconst accounts = formatExtensionAccounts(value, ss58).map(\n\t\t\t\t\t({ address, name }) => ({\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\tsigner,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\tallAccounts.push(...accounts)\n\t\t\t}\n\t\t}\n\t\treturn allAccounts\n\t} catch (e) {\n\t\tconsole.error('Error during account formatting: ', e)\n\t\treturn []\n\t}\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport {\n\taddUnsub,\n\tgetAccountsFromExtensions,\n\tprocessExtensionAccounts,\n\tupdateAccounts,\n} from '../accounts/index'\nimport { getActiveExtensionsLocal } from '../local'\nimport { setReconnectSync } from '../util'\nimport { initExtensions } from '.'\n\nexport const reconnectExtensions = async (dappName: string, ss58: number) => {\n\tsetReconnectSync('syncing')\n\tconst { connected } = await initExtensions(\n\t\tdappName,\n\t\tgetActiveExtensionsLocal(),\n\t)\n\tif (connected.size > 0) {\n\t\t// Perform initial account state update\n\t\tupdateAccounts({\n\t\t\tadd: await getAccountsFromExtensions(connected, ss58),\n\t\t\tremove: [],\n\t\t})\n\n\t\t// If available, subscribe to accounts for each connected extension\n\t\tfor (const [id, { extension }] of Array.from(connected.entries())) {\n\t\t\tif (typeof extension!.accounts.subscribe === 'function') {\n\t\t\t\tconst unsub = extension!.accounts.subscribe((accounts) => {\n\t\t\t\t\tprocessExtensionAccounts(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsource: id,\n\t\t\t\t\t\t\tss58,\n\t\t\t\t\t\t},\n\t\t\t\t\t\textension!.signer,\n\t\t\t\t\t\taccounts,\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t\taddUnsub(id, unsub)\n\t\t\t}\n\t\t}\n\t}\n\tsetReconnectSync('synced')\n}\n"],"mappings":"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","names":["extensions","extensions","extensions"]}
@@ -1,4 +1,5 @@
1
- import { ExtensionEnableResults } from '@w3ux/types';
1
+ import { ExtensionEnableResults } from '../types.cjs';
2
+ import 'react';
2
3
 
3
4
  declare const connectExtension: (dappName: string, ss58: number, id: string) => Promise<boolean>;
4
5
 
@@ -10,8 +11,6 @@ declare const initExtensions: (dappName: string, extensionIds: string[]) => Prom
10
11
  connected: ExtensionEnableResults;
11
12
  }>;
12
13
 
13
- declare const injectMimir: () => Promise<void>;
14
-
15
14
  declare const reconnectExtensions: (dappName: string, ss58: number) => Promise<void>;
16
15
 
17
- export { connectExtension, enableExtensions, getExtensions, initExtensions, injectMimir, reconnectExtensions };
16
+ export { connectExtension, enableExtensions, getExtensions, initExtensions, reconnectExtensions };
@@ -1,4 +1,5 @@
1
- import { ExtensionEnableResults } from '@w3ux/types';
1
+ import { ExtensionEnableResults } from '../types.js';
2
+ import 'react';
2
3
 
3
4
  declare const connectExtension: (dappName: string, ss58: number, id: string) => Promise<boolean>;
4
5
 
@@ -10,8 +11,6 @@ declare const initExtensions: (dappName: string, extensionIds: string[]) => Prom
10
11
  connected: ExtensionEnableResults;
11
12
  }>;
12
13
 
13
- declare const injectMimir: () => Promise<void>;
14
-
15
14
  declare const reconnectExtensions: (dappName: string, ss58: number) => Promise<void>;
16
15
 
17
- export { connectExtension, enableExtensions, getExtensions, initExtensions, injectMimir, reconnectExtensions };
16
+ export { connectExtension, enableExtensions, getExtensions, initExtensions, reconnectExtensions };
@@ -3,13 +3,13 @@ import {
3
3
  enableInjectedWeb3Entry,
4
4
  hasValidEnable,
5
5
  setReconnectSync
6
- } from "../chunk-BZ4JF2XC.js";
6
+ } from "../chunk-2VNUX53X.js";
7
7
  import {
8
8
  addUnsub,
9
9
  getAccountsFromExtensions,
10
10
  processExtensionAccounts,
11
11
  updateAccounts
12
- } from "../chunk-NZTFHLWC.js";
12
+ } from "../chunk-4SKPT6WH.js";
13
13
  import {
14
14
  _extensionsStatus,
15
15
  _gettingExtensions,
@@ -17,7 +17,7 @@ import {
17
17
  addExtensionToLocal,
18
18
  getActiveExtensionsLocal,
19
19
  removeExtensionFromLocal
20
- } from "../chunk-VNHVECK2.js";
20
+ } from "../chunk-F7I65YDY.js";
21
21
 
22
22
  // src/extensions/connect.ts
23
23
  var handleAccounts = (ss58, id, extension, accounts) => {
@@ -188,22 +188,6 @@ var filterFailedExtensions = (extensions2) => new Map(
188
188
  Array.from(extensions2.entries()).filter(([, state]) => !state.connected)
189
189
  );
190
190
 
191
- // src/extensions/mimir.ts
192
- import { inject, isMimirReady, MIMIR_REGEXP } from "@mimirdev/apps-inject";
193
- var injectMimir = async () => {
194
- const openInIframe = window !== window.parent;
195
- if (!openInIframe) {
196
- return;
197
- }
198
- const origin = await isMimirReady();
199
- if (!origin) {
200
- return;
201
- }
202
- if (MIMIR_REGEXP.test(origin)) {
203
- inject();
204
- }
205
- };
206
-
207
191
  // src/extensions/reconnect.ts
208
192
  var reconnectExtensions = async (dappName, ss58) => {
209
193
  setReconnectSync("syncing");
@@ -239,7 +223,6 @@ export {
239
223
  enableExtensions,
240
224
  getExtensions,
241
225
  initExtensions,
242
- injectMimir,
243
226
  reconnectExtensions
244
227
  };
245
228
  /* @license Copyright 2024 w3ux authors & contributors
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/extensions/connect.ts","../../src/extensions/discover.ts","../../src/extensions/enable.ts","../../src/extensions/init.ts","../../src/extensions/mimir.ts","../../src/extensions/reconnect.ts"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExtensionAccount, ExtensionInterface } from '@w3ux/types'\nimport { addUnsub } from '../accounts/unsubs'\nimport { processExtensionAccounts } from '../accounts/util'\nimport { canConnect } from '../util'\nimport { initExtensions } from './index'\n\n// Handles accounts from a single extension\nconst handleAccounts = (\n\tss58: number,\n\tid: string,\n\textension: ExtensionInterface,\n\taccounts: ExtensionAccount[],\n) => {\n\tprocessExtensionAccounts(\n\t\t{\n\t\t\tsource: id,\n\t\t\tss58,\n\t\t},\n\t\textension.signer,\n\t\taccounts,\n\t)\n}\n\n// Connects to a single extension and processes its accounts\nexport const connectExtension = async (\n\tdappName: string,\n\tss58: number,\n\tid: string,\n): Promise<boolean> => {\n\tif (canConnect(id)) {\n\t\tconst { connected } = await initExtensions(dappName, [id])\n\t\tif (connected.size === 0) {\n\t\t\treturn false\n\t\t}\n\t\tconst result = connected.get(id)\n\t\tconst extension = result?.extension\n\t\tconst canSubscribe =\n\t\t\t!!extension && typeof extension.accounts.subscribe === 'function'\n\n\t\t// If account subscriptions are not supported, simply get the account(s) from the extension,\n\t\t// otherwise, subscribe to accounts\n\t\tif (extension) {\n\t\t\tif (!canSubscribe) {\n\t\t\t\tconst accounts = await extension.accounts.get()\n\t\t\t\thandleAccounts(ss58, id, extension, accounts)\n\t\t\t} else {\n\t\t\t\tconst unsub = extension.accounts.subscribe((accounts) => {\n\t\t\t\t\thandleAccounts(ss58, id, extension, accounts)\n\t\t\t\t})\n\t\t\t\taddUnsub(id, unsub)\n\t\t\t}\n\t\t}\n\t\treturn true\n\t}\n\treturn false\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport extensions from '@w3ux/extension-assets'\nimport { _extensionsStatus, _gettingExtensions } from '../subjects'\n\n// Gets extensions from injectedWeb3\nexport const getExtensions = async () => {\n\t_gettingExtensions.next(true)\n\tlet injectedWeb3Interval: ReturnType<typeof setInterval> | undefined\n\n\t// Format installed extensions\n\tconst formatInstalled = () =>\n\t\tObject.keys(extensions).reduce(\n\t\t\t(acc, key) => {\n\t\t\t\tacc[key] =\n\t\t\t\t\twindow?.injectedWeb3?.[key] !== undefined ? 'installed' : acc[key]\n\t\t\t\treturn acc\n\t\t\t},\n\t\t\t{ ..._extensionsStatus.getValue() },\n\t\t)\n\n\t// Handle completed interval check\n\tconst handleCompleted = async (foundExtensions: boolean) => {\n\t\tclearInterval(injectedWeb3Interval)\n\t\tif (foundExtensions) {\n\t\t\t_extensionsStatus.next(formatInstalled())\n\t\t}\n\t\t_gettingExtensions.next(false)\n\t}\n\n\tconst interval = 200\n\tconst maxChecks = 10\n\tconst minVerifications = 2\n\n\t// Getter for the currently installed extensions\n\tlet counter = 0\n\tlet verifications = 0\n\tinjectedWeb3Interval = setInterval(() => {\n\t\tcounter++\n\t\tif (counter === maxChecks) {\n\t\t\thandleCompleted(false)\n\t\t} else {\n\t\t\tconst injected = window?.injectedWeb3\n\n\t\t\t// Check if injected exists and all extensions have a valid enable function\n\t\t\tconst ready =\n\t\t\t\tinjected !== undefined &&\n\t\t\t\tObject.entries(injected).every(\n\t\t\t\t\t([, ext]) => ext && typeof ext.enable === 'function',\n\t\t\t\t)\n\n\t\t\t// Increment verifications if the extensions are ready\n\t\t\tif (ready) {\n\t\t\t\tverifications++\n\t\t\t} else {\n\t\t\t\tverifications = 0\n\t\t\t}\n\n\t\t\tif (counter > 2 && verifications >= minVerifications) {\n\t\t\t\thandleCompleted(true)\n\t\t\t}\n\t\t}\n\t}, interval)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionEnableResult,\n\tExtensionEnableResults,\n\tExtensionInterface,\n} from '@w3ux/types'\nimport { enableInjectedWeb3Entry, hasValidEnable } from '../util'\n\n// Get extensions and enable them\nexport const enableExtensions = async (ids: string[], dappName: string) => {\n\tconst extensionIds = getExtensionsById(ids)\n\tconst enableResults = await doEnable(extensionIds, dappName)\n\n\treturn formatEnabledExtensions(extensionIds, enableResults)\n}\n\n// Gets extensions from injectedWeb3 by their ids\nconst getExtensionsById = (ids: string[]) => {\n\tconst validIds: string[] = []\n\tids.forEach((id) => {\n\t\tif (hasValidEnable(id)) {\n\t\t\tvalidIds.push(id)\n\t\t}\n\t})\n\treturn validIds\n}\n\n// Calls enable for the provided extensions\nconst doEnable = async (\n\textensionIds: string[],\n\tdappName: string,\n): Promise<PromiseSettledResult<ExtensionInterface>[]> =>\n\tawait Promise.allSettled(\n\t\tArray.from(extensionIds).map((id) => enableInjectedWeb3Entry(id, dappName)),\n\t)\n\nconst formatEnabledExtensions = (\n\textensionIds: string[],\n\tenabledResults: PromiseSettledResult<ExtensionInterface>[],\n): ExtensionEnableResults => {\n\tconst extensionsState = new Map<string, ExtensionEnableResult>()\n\n\tfor (let i = 0; i < enabledResults.length; i++) {\n\t\tconst result = enabledResults[i]\n\t\tconst id = extensionIds[i]\n\n\t\tif (result.status === 'fulfilled') {\n\t\t\textensionsState.set(id, {\n\t\t\t\textension: result.value,\n\t\t\t\tconnected: true,\n\t\t\t})\n\t\t} else if (result.status === 'rejected') {\n\t\t\textensionsState.set(id, {\n\t\t\t\textension: null,\n\t\t\t\tconnected: false,\n\t\t\t\terror: result.reason,\n\t\t\t})\n\t\t}\n\t}\n\treturn extensionsState\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExtensionEnableResults } from '@w3ux/types'\nimport { addExtensionToLocal, removeExtensionFromLocal } from '../local'\nimport { _extensionsStatus, _initialisedExtensions } from '../subjects'\nimport { enableExtensions } from './enable'\n\n// Connects to previously connected extensions, or to a specific set of extensions\nexport const initExtensions = async (\n\tdappName: string,\n\textensionIds: string[],\n): Promise<{ connected: ExtensionEnableResults }> => {\n\tif (!extensionIds.length) {\n\t\treturn {\n\t\t\tconnected: new Map(),\n\t\t}\n\t}\n\t// Get extensions and enable them\n\tconst enableResults = await enableExtensions(extensionIds, dappName)\n\n\t// Determine which extensions are connected and which have errors\n\tconst [connected, withError] = [\n\t\tfilterConnectedExtensions(enableResults),\n\t\tfilterFailedExtensions(enableResults),\n\t]\n\n\t// Manage local storage depending on connection status\n\tArray.from(connected.keys()).forEach((id) => {\n\t\taddExtensionToLocal(id)\n\t})\n\tArray.from(withError.keys()).forEach((id) => {\n\t\tremoveExtensionFromLocal(id)\n\t})\n\n\t// Handle new extension statuses\n\tconst newStatus = { ..._extensionsStatus.getValue() }\n\tArray.from(connected.keys()).forEach((id) => {\n\t\tnewStatus[id] = 'connected'\n\t})\n\tArray.from(withError.entries()).forEach(([id, { error }]) => {\n\t\tconst errStr = String(error || '')\n\t\tif (errStr.startsWith('Error')) {\n\t\t\t// Extension not found - remove from state\n\t\t\tif (errStr.substring(0, 17) === 'NotInstalledError') {\n\t\t\t\tdelete newStatus[id]\n\t\t\t} else {\n\t\t\t\t// Assume extension not authenticated\n\t\t\t\tnewStatus[id] = 'not_authenticated'\n\t\t\t}\n\t\t}\n\t})\n\n\t// Record initialised extensions\n\tconst newInitialised = [..._initialisedExtensions.getValue()]\n\textensionIds.forEach((id) => {\n\t\tif (!newInitialised.includes(id)) {\n\t\t\tnewInitialised.push(id)\n\t\t}\n\t})\n\n\t// Commit updates to observables\n\t_extensionsStatus.next(newStatus)\n\t_initialisedExtensions.next(newInitialised)\n\n\treturn { connected }\n}\n\n// Filter successfully connected extensions\nconst filterConnectedExtensions = (\n\textensions: ExtensionEnableResults,\n): ExtensionEnableResults =>\n\tnew Map(\n\t\tArray.from(extensions.entries()).filter(([, state]) => state.connected),\n\t)\n\n// Filter extensions that failed to connect\nconst filterFailedExtensions = (\n\textensions: ExtensionEnableResults,\n): ExtensionEnableResults =>\n\tnew Map(\n\t\tArray.from(extensions.entries()).filter(([, state]) => !state.connected),\n\t)\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { inject, isMimirReady, MIMIR_REGEXP } from '@mimirdev/apps-inject'\n\nexport const injectMimir = async () => {\n\tconst openInIframe = window !== window.parent\n\t// Return if not opened in an iframe\n\tif (!openInIframe) {\n\t\treturn\n\t}\n\tconst origin = await isMimirReady()\n\t// Return if not opened in Mimir\n\tif (!origin) {\n\t\treturn\n\t}\n\tif (MIMIR_REGEXP.test(origin)) {\n\t\tinject()\n\t}\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport {\n\taddUnsub,\n\tgetAccountsFromExtensions,\n\tprocessExtensionAccounts,\n\tupdateAccounts,\n} from '../accounts/index'\nimport { getActiveExtensionsLocal } from '../local'\nimport { setReconnectSync } from '../util'\nimport { initExtensions } from '.'\n\nexport const reconnectExtensions = async (dappName: string, ss58: number) => {\n\tsetReconnectSync('syncing')\n\tconst { connected } = await initExtensions(\n\t\tdappName,\n\t\tgetActiveExtensionsLocal(),\n\t)\n\tif (connected.size > 0) {\n\t\t// Perform initial account state update\n\t\tupdateAccounts({\n\t\t\tadd: await getAccountsFromExtensions(connected, ss58),\n\t\t\tremove: [],\n\t\t})\n\n\t\t// If available, subscribe to accounts for each connected extension\n\t\tfor (const [id, { extension }] of Array.from(connected.entries())) {\n\t\t\tif (typeof extension!.accounts.subscribe === 'function') {\n\t\t\t\tconst unsub = extension!.accounts.subscribe((accounts) => {\n\t\t\t\t\tprocessExtensionAccounts(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsource: id,\n\t\t\t\t\t\t\tss58,\n\t\t\t\t\t\t},\n\t\t\t\t\t\textension!.signer,\n\t\t\t\t\t\taccounts,\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t\taddUnsub(id, unsub)\n\t\t\t}\n\t\t}\n\t}\n\tsetReconnectSync('synced')\n}\n"],"mappings":"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","names":["extensions"]}
1
+ {"version":3,"sources":["../../src/extensions/connect.ts","../../src/extensions/discover.ts","../../src/extensions/enable.ts","../../src/extensions/init.ts","../../src/extensions/reconnect.ts"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { addUnsub } from '../accounts/unsubs'\nimport { processExtensionAccounts } from '../accounts/util'\nimport type { ExtensionAccount, ExtensionInterface } from '../types'\nimport { canConnect } from '../util'\nimport { initExtensions } from './index'\n\n// Handles accounts from a single extension\nconst handleAccounts = (\n\tss58: number,\n\tid: string,\n\textension: ExtensionInterface,\n\taccounts: ExtensionAccount[],\n) => {\n\tprocessExtensionAccounts(\n\t\t{\n\t\t\tsource: id,\n\t\t\tss58,\n\t\t},\n\t\textension.signer,\n\t\taccounts,\n\t)\n}\n\n// Connects to a single extension and processes its accounts\nexport const connectExtension = async (\n\tdappName: string,\n\tss58: number,\n\tid: string,\n): Promise<boolean> => {\n\tif (canConnect(id)) {\n\t\tconst { connected } = await initExtensions(dappName, [id])\n\t\tif (connected.size === 0) {\n\t\t\treturn false\n\t\t}\n\t\tconst result = connected.get(id)\n\t\tconst extension = result?.extension\n\t\tconst canSubscribe =\n\t\t\t!!extension && typeof extension.accounts.subscribe === 'function'\n\n\t\t// If account subscriptions are not supported, simply get the account(s) from the extension,\n\t\t// otherwise, subscribe to accounts\n\t\tif (extension) {\n\t\t\tif (!canSubscribe) {\n\t\t\t\tconst accounts = await extension.accounts.get()\n\t\t\t\thandleAccounts(ss58, id, extension, accounts)\n\t\t\t} else {\n\t\t\t\tconst unsub = extension.accounts.subscribe((accounts) => {\n\t\t\t\t\thandleAccounts(ss58, id, extension, accounts)\n\t\t\t\t})\n\t\t\t\taddUnsub(id, unsub)\n\t\t\t}\n\t\t}\n\t\treturn true\n\t}\n\treturn false\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport extensions from '@w3ux/extension-assets'\nimport { _extensionsStatus, _gettingExtensions } from '../subjects'\n\n// Gets extensions from injectedWeb3\nexport const getExtensions = async () => {\n\t_gettingExtensions.next(true)\n\tlet injectedWeb3Interval: ReturnType<typeof setInterval> | undefined\n\n\t// Format installed extensions\n\tconst formatInstalled = () =>\n\t\tObject.keys(extensions).reduce(\n\t\t\t(acc, key) => {\n\t\t\t\tacc[key] =\n\t\t\t\t\twindow?.injectedWeb3?.[key] !== undefined ? 'installed' : acc[key]\n\t\t\t\treturn acc\n\t\t\t},\n\t\t\t{ ..._extensionsStatus.getValue() },\n\t\t)\n\n\t// Handle completed interval check\n\tconst handleCompleted = async (foundExtensions: boolean) => {\n\t\tclearInterval(injectedWeb3Interval)\n\t\tif (foundExtensions) {\n\t\t\t_extensionsStatus.next(formatInstalled())\n\t\t}\n\t\t_gettingExtensions.next(false)\n\t}\n\n\tconst interval = 200\n\tconst maxChecks = 10\n\tconst minVerifications = 2\n\n\t// Getter for the currently installed extensions\n\tlet counter = 0\n\tlet verifications = 0\n\tinjectedWeb3Interval = setInterval(() => {\n\t\tcounter++\n\t\tif (counter === maxChecks) {\n\t\t\thandleCompleted(false)\n\t\t} else {\n\t\t\tconst injected = window?.injectedWeb3\n\n\t\t\t// Check if injected exists and all extensions have a valid enable function\n\t\t\tconst ready =\n\t\t\t\tinjected !== undefined &&\n\t\t\t\tObject.entries(injected).every(\n\t\t\t\t\t([, ext]) => ext && typeof ext.enable === 'function',\n\t\t\t\t)\n\n\t\t\t// Increment verifications if the extensions are ready\n\t\t\tif (ready) {\n\t\t\t\tverifications++\n\t\t\t} else {\n\t\t\t\tverifications = 0\n\t\t\t}\n\n\t\t\tif (counter > 2 && verifications >= minVerifications) {\n\t\t\t\thandleCompleted(true)\n\t\t\t}\n\t\t}\n\t}, interval)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionEnableResult,\n\tExtensionEnableResults,\n\tExtensionInterface,\n} from '../types'\nimport { enableInjectedWeb3Entry, hasValidEnable } from '../util'\n\n// Get extensions and enable them\nexport const enableExtensions = async (ids: string[], dappName: string) => {\n\tconst extensionIds = getExtensionsById(ids)\n\tconst enableResults = await doEnable(extensionIds, dappName)\n\n\treturn formatEnabledExtensions(extensionIds, enableResults)\n}\n\n// Gets extensions from injectedWeb3 by their ids\nconst getExtensionsById = (ids: string[]) => {\n\tconst validIds: string[] = []\n\tids.forEach((id) => {\n\t\tif (hasValidEnable(id)) {\n\t\t\tvalidIds.push(id)\n\t\t}\n\t})\n\treturn validIds\n}\n\n// Calls enable for the provided extensions\nconst doEnable = async (\n\textensionIds: string[],\n\tdappName: string,\n): Promise<PromiseSettledResult<ExtensionInterface>[]> =>\n\tawait Promise.allSettled(\n\t\tArray.from(extensionIds).map((id) => enableInjectedWeb3Entry(id, dappName)),\n\t)\n\nconst formatEnabledExtensions = (\n\textensionIds: string[],\n\tenabledResults: PromiseSettledResult<ExtensionInterface>[],\n): ExtensionEnableResults => {\n\tconst extensionsState = new Map<string, ExtensionEnableResult>()\n\n\tfor (let i = 0; i < enabledResults.length; i++) {\n\t\tconst result = enabledResults[i]\n\t\tconst id = extensionIds[i]\n\n\t\tif (result.status === 'fulfilled') {\n\t\t\textensionsState.set(id, {\n\t\t\t\textension: result.value,\n\t\t\t\tconnected: true,\n\t\t\t})\n\t\t} else if (result.status === 'rejected') {\n\t\t\textensionsState.set(id, {\n\t\t\t\textension: null,\n\t\t\t\tconnected: false,\n\t\t\t\terror: result.reason,\n\t\t\t})\n\t\t}\n\t}\n\treturn extensionsState\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { addExtensionToLocal, removeExtensionFromLocal } from '../local'\nimport { _extensionsStatus, _initialisedExtensions } from '../subjects'\nimport type { ExtensionEnableResults } from '../types'\nimport { enableExtensions } from './enable'\n\n// Connects to previously connected extensions, or to a specific set of extensions\nexport const initExtensions = async (\n\tdappName: string,\n\textensionIds: string[],\n): Promise<{ connected: ExtensionEnableResults }> => {\n\tif (!extensionIds.length) {\n\t\treturn {\n\t\t\tconnected: new Map(),\n\t\t}\n\t}\n\t// Get extensions and enable them\n\tconst enableResults = await enableExtensions(extensionIds, dappName)\n\n\t// Determine which extensions are connected and which have errors\n\tconst [connected, withError] = [\n\t\tfilterConnectedExtensions(enableResults),\n\t\tfilterFailedExtensions(enableResults),\n\t]\n\n\t// Manage local storage depending on connection status\n\tArray.from(connected.keys()).forEach((id) => {\n\t\taddExtensionToLocal(id)\n\t})\n\tArray.from(withError.keys()).forEach((id) => {\n\t\tremoveExtensionFromLocal(id)\n\t})\n\n\t// Handle new extension statuses\n\tconst newStatus = { ..._extensionsStatus.getValue() }\n\tArray.from(connected.keys()).forEach((id) => {\n\t\tnewStatus[id] = 'connected'\n\t})\n\tArray.from(withError.entries()).forEach(([id, { error }]) => {\n\t\tconst errStr = String(error || '')\n\t\tif (errStr.startsWith('Error')) {\n\t\t\t// Extension not found - remove from state\n\t\t\tif (errStr.substring(0, 17) === 'NotInstalledError') {\n\t\t\t\tdelete newStatus[id]\n\t\t\t} else {\n\t\t\t\t// Assume extension not authenticated\n\t\t\t\tnewStatus[id] = 'not_authenticated'\n\t\t\t}\n\t\t}\n\t})\n\n\t// Record initialised extensions\n\tconst newInitialised = [..._initialisedExtensions.getValue()]\n\textensionIds.forEach((id) => {\n\t\tif (!newInitialised.includes(id)) {\n\t\t\tnewInitialised.push(id)\n\t\t}\n\t})\n\n\t// Commit updates to observables\n\t_extensionsStatus.next(newStatus)\n\t_initialisedExtensions.next(newInitialised)\n\n\treturn { connected }\n}\n\n// Filter successfully connected extensions\nconst filterConnectedExtensions = (\n\textensions: ExtensionEnableResults,\n): ExtensionEnableResults =>\n\tnew Map(\n\t\tArray.from(extensions.entries()).filter(([, state]) => state.connected),\n\t)\n\n// Filter extensions that failed to connect\nconst filterFailedExtensions = (\n\textensions: ExtensionEnableResults,\n): ExtensionEnableResults =>\n\tnew Map(\n\t\tArray.from(extensions.entries()).filter(([, state]) => !state.connected),\n\t)\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport {\n\taddUnsub,\n\tgetAccountsFromExtensions,\n\tprocessExtensionAccounts,\n\tupdateAccounts,\n} from '../accounts/index'\nimport { getActiveExtensionsLocal } from '../local'\nimport { setReconnectSync } from '../util'\nimport { initExtensions } from '.'\n\nexport const reconnectExtensions = async (dappName: string, ss58: number) => {\n\tsetReconnectSync('syncing')\n\tconst { connected } = await initExtensions(\n\t\tdappName,\n\t\tgetActiveExtensionsLocal(),\n\t)\n\tif (connected.size > 0) {\n\t\t// Perform initial account state update\n\t\tupdateAccounts({\n\t\t\tadd: await getAccountsFromExtensions(connected, ss58),\n\t\t\tremove: [],\n\t\t})\n\n\t\t// If available, subscribe to accounts for each connected extension\n\t\tfor (const [id, { extension }] of Array.from(connected.entries())) {\n\t\t\tif (typeof extension!.accounts.subscribe === 'function') {\n\t\t\t\tconst unsub = extension!.accounts.subscribe((accounts) => {\n\t\t\t\t\tprocessExtensionAccounts(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsource: id,\n\t\t\t\t\t\t\tss58,\n\t\t\t\t\t\t},\n\t\t\t\t\t\textension!.signer,\n\t\t\t\t\t\taccounts,\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t\taddUnsub(id, unsub)\n\t\t\t}\n\t\t}\n\t}\n\tsetReconnectSync('synced')\n}\n"],"mappings":"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","names":["extensions"]}
package/index.cjs CHANGED
@@ -38,7 +38,6 @@ __export(index_exports, {
38
38
  hasValidEnable: () => hasValidEnable,
39
39
  initialisedExtensions$: () => initialisedExtensions$,
40
40
  isExtensionLocal: () => isExtensionLocal,
41
- isMimir: () => isMimir,
42
41
  reconnectSync$: () => reconnectSync$,
43
42
  removeExtensionFromLocal: () => removeExtensionFromLocal,
44
43
  removeStatus: () => removeStatus,
@@ -160,20 +159,15 @@ var getHardwareAccounts = () => _hardwareAccounts.getValue();
160
159
  var setHardwareAccounts = (accounts) => {
161
160
  _hardwareAccounts.next(accounts);
162
161
  };
163
- var isMimir = (id) => window.self !== window.top && id === "mimir";
164
162
  var hasValidEnable = (id) => {
165
163
  try {
166
- const enable = isMimir(id) ? window.injectedWeb3[id].enable : window.parent.injectedWeb3[id].enable;
164
+ const enable = window.parent.injectedWeb3[id].enable;
167
165
  return enable !== void 0 && typeof enable === "function";
168
166
  } catch {
169
167
  return false;
170
168
  }
171
169
  };
172
170
  var enableInjectedWeb3Entry = (id, dappName) => {
173
- if (isMimir(id)) {
174
- const result2 = window.injectedWeb3[id].enable(dappName);
175
- return result2;
176
- }
177
171
  const result = window.parent.injectedWeb3[id].enable(dappName);
178
172
  return result;
179
173
  };
@@ -197,7 +191,6 @@ var enableInjectedWeb3Entry = (id, dappName) => {
197
191
  hasValidEnable,
198
192
  initialisedExtensions$,
199
193
  isExtensionLocal,
200
- isMimir,
201
194
  reconnectSync$,
202
195
  removeExtensionFromLocal,
203
196
  removeStatus,
package/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/consts.ts","../src/local.ts","../src/subjects.ts","../src/observables.ts","../src/util.ts"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nexport * from './consts'\nexport * from './local'\nexport * from './observables'\nexport * from './util'\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ProcessExtensionAccountsResult } from '@w3ux/types'\n\nexport const DefaultProcessExtensionResult: ProcessExtensionAccountsResult = {\n\tnewAccounts: [],\n\tremovedAccounts: [],\n}\n\n// Local storage active extensions key\nexport const ActiveExtensionsKey = 'active_extensions'\nexport const HardwareAccountsKey = 'hardware_accounts'\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { HardwareAccount } from '@w3ux/types'\nimport { localStorageOrDefault } from '@w3ux/utils'\nimport { ActiveExtensionsKey, HardwareAccountsKey } from './consts'\n\n// Gets all active extensions from local storage\nexport const getActiveExtensionsLocal = (): string[] => {\n\tconst current = localStorageOrDefault<string[]>(ActiveExtensionsKey, [], true)\n\treturn Array.isArray(current) ? current : []\n}\n\n// Check if an extension exists in local storage\nexport const isExtensionLocal = (id: string): boolean =>\n\tgetActiveExtensionsLocal().includes(id)\n\n// Adds an extension to local storage\nexport const addExtensionToLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tif (!current.includes(id)) {\n\t\tlocalStorage.setItem(ActiveExtensionsKey, JSON.stringify([...current, id]))\n\t}\n}\n\n// Removes extension from local storage\nexport const removeExtensionFromLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tlocalStorage.setItem(\n\t\tActiveExtensionsKey,\n\t\tJSON.stringify(current.filter((localId) => localId !== id)),\n\t)\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n\ttypeof value === 'object' && value !== null\n\nconst asHardwareAccount = (value: unknown): HardwareAccount | null => {\n\tif (!isRecord(value)) {\n\t\treturn null\n\t}\n\n\tconst { address, name, source, network, index, group } = value\n\n\tif (\n\t\ttypeof address !== 'string' ||\n\t\ttypeof name !== 'string' ||\n\t\ttypeof source !== 'string' ||\n\t\ttypeof network !== 'string' ||\n\t\ttypeof index !== 'number' ||\n\t\t!Number.isFinite(index)\n\t) {\n\t\treturn null\n\t}\n\n\t// NOTE: Feb 14, 2026 - `group` is a recently added property, so we allow it to be optional for\n\t// backward compatibility for the time being\n\tif (group === undefined) {\n\t\treturn {\n\t\t\t...value,\n\t\t\taddress,\n\t\t\tname,\n\t\t\tsource,\n\t\t\tnetwork,\n\t\t\tindex,\n\t\t\tgroup: 1,\n\t\t} as HardwareAccount\n\t}\n\n\tif (typeof group !== 'number' || !Number.isFinite(group)) {\n\t\treturn null\n\t}\n\n\treturn {\n\t\t...value,\n\t\taddress,\n\t\tname,\n\t\tsource,\n\t\tnetwork,\n\t\tindex,\n\t\tgroup,\n\t} as HardwareAccount\n}\n\n// Gets imported hardware accounts from local storage\nexport const getHardwareAccountsLocal = (): HardwareAccount[] => {\n\tconst stored = localStorageOrDefault(HardwareAccountsKey, [], true)\n\tif (!Array.isArray(stored)) {\n\t\treturn []\n\t}\n\n\treturn stored\n\t\t.map((account) => asHardwareAccount(account))\n\t\t.filter((account): account is HardwareAccount => account !== null)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tExtensionsStatus,\n\tHardwareAccount,\n\tSync,\n} from '@w3ux/types'\nimport { BehaviorSubject } from 'rxjs'\nimport { getHardwareAccountsLocal } from './local'\n\n// NOTE: These subjects stay private to the package and are not exported\n\nexport const _extensionsStatus = new BehaviorSubject<ExtensionsStatus>({})\nexport const _gettingExtensions = new BehaviorSubject<boolean>(true)\nexport const _initialisedExtensions = new BehaviorSubject<string[]>([])\nexport const _reconnectSync = new BehaviorSubject<Sync>('unsynced')\nexport const _extensionAccounts = new BehaviorSubject<ExtensionAccount[]>([])\nexport const _hardwareAccounts = new BehaviorSubject<HardwareAccount[]>(\n\tgetHardwareAccountsLocal(),\n)\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport {\n\t_extensionAccounts,\n\t_extensionsStatus,\n\t_gettingExtensions,\n\t_hardwareAccounts,\n\t_initialisedExtensions,\n\t_reconnectSync,\n} from './subjects'\n\n// Discovered extensions along with their status\nexport const extensionsStatus$ = _extensionsStatus.asObservable()\n\n// Whether extensions are being checked\nexport const gettingExtensions$ = _gettingExtensions.asObservable()\n\n// Extensions that have successfully connected\nexport const initialisedExtensions$ = _initialisedExtensions.asObservable()\n\n// Sync status of reconnecting to previously enabled extensions\nexport const reconnectSync$ = _reconnectSync.asObservable()\n\n// Imported extension accounts\nexport const extensionAccounts$ = _extensionAccounts.asObservable()\n\n// Imported hardware accounts\nexport const hardwareAccounts$ = _hardwareAccounts.asObservable()\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExtensionStatus, HardwareAccount, Sync } from '@w3ux/types'\nimport {\n\t_extensionAccounts,\n\t_extensionsStatus,\n\t_hardwareAccounts,\n\t_reconnectSync,\n} from './subjects'\n\n// Gets an extension status\nexport const getStatus = (id: string): ExtensionStatus =>\n\t_extensionsStatus.getValue()[id] || undefined\n\n// Sets an extension status\nexport const setStatus = (id: string, status: ExtensionStatus) => {\n\tconst newValue = { ..._extensionsStatus.getValue() }\n\tnewValue[id] = status\n\t_extensionsStatus.next(newValue)\n}\n\n// Removes an extension status\nexport const removeStatus = (id: string) => {\n\tconst { [id]: _, ...rest } = _extensionsStatus.getValue()\n\t_extensionsStatus.next(rest)\n}\n\n// Whether an extension can be connected\nexport const canConnect = (id: string) =>\n\t![undefined, 'connected'].includes(_extensionsStatus.getValue()[id])\n\n// Reset accounts\nexport const resetAccounts = () => {\n\t_extensionAccounts.next([])\n}\n\n// Get previously enabled extension reconnect sync status\nexport const getReconnectSync = () => _reconnectSync.getValue()\n\n// Set previously enabled extension reconnect sync status\nexport const setReconnectSync = (sync: Sync) => {\n\t_reconnectSync.next(sync)\n}\n\n// Get hardware accounts\nexport const getHardwareAccounts = () => _hardwareAccounts.getValue()\n\n// Set hardware accounts\nexport const setHardwareAccounts = (accounts: HardwareAccount[]) => {\n\t_hardwareAccounts.next(accounts)\n}\n\n// Checks whether app is open in a mimir iframe\nexport const isMimir = (id: string): boolean =>\n\twindow.self !== window.top && id === 'mimir'\n\n// Check if an injected web3 entry has a valid enable function\nexport const hasValidEnable = (id: string): boolean => {\n\ttry {\n\t\tconst enable = isMimir(id)\n\t\t\t? window.injectedWeb3![id].enable\n\t\t\t: window.parent.injectedWeb3![id].enable\n\n\t\treturn enable !== undefined && typeof enable === 'function'\n\t} catch {\n\t\treturn false\n\t}\n}\n\n// Enable an injected web3 entry\nexport const enableInjectedWeb3Entry = (id: string, dappName: string) => {\n\tif (isMimir(id)) {\n\t\tconst result = window.injectedWeb3![id].enable(dappName)\n\t\treturn result\n\t}\n\tconst result = window.parent.injectedWeb3![id].enable(dappName)\n\treturn result\n}\n"],"mappings":"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","names":["result"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/consts.ts","../src/local.ts","../src/subjects.ts","../src/observables.ts","../src/util.ts"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nexport * from './consts'\nexport * from './local'\nexport * from './observables'\nexport * from './util'\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ProcessExtensionAccountsResult } from './types'\n\nexport const DefaultProcessExtensionResult: ProcessExtensionAccountsResult = {\n\tnewAccounts: [],\n\tremovedAccounts: [],\n}\n\n// Local storage active extensions key\nexport const ActiveExtensionsKey = 'active_extensions'\nexport const HardwareAccountsKey = 'hardware_accounts'\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { localStorageOrDefault } from '@w3ux/utils'\nimport { ActiveExtensionsKey, HardwareAccountsKey } from './consts'\nimport type { HardwareAccount } from './types'\n\n// Gets all active extensions from local storage\nexport const getActiveExtensionsLocal = (): string[] => {\n\tconst current = localStorageOrDefault<string[]>(ActiveExtensionsKey, [], true)\n\treturn Array.isArray(current) ? current : []\n}\n\n// Check if an extension exists in local storage\nexport const isExtensionLocal = (id: string): boolean =>\n\tgetActiveExtensionsLocal().includes(id)\n\n// Adds an extension to local storage\nexport const addExtensionToLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tif (!current.includes(id)) {\n\t\tlocalStorage.setItem(ActiveExtensionsKey, JSON.stringify([...current, id]))\n\t}\n}\n\n// Removes extension from local storage\nexport const removeExtensionFromLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tlocalStorage.setItem(\n\t\tActiveExtensionsKey,\n\t\tJSON.stringify(current.filter((localId) => localId !== id)),\n\t)\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n\ttypeof value === 'object' && value !== null\n\nconst asHardwareAccount = (value: unknown): HardwareAccount | null => {\n\tif (!isRecord(value)) {\n\t\treturn null\n\t}\n\n\tconst { address, name, source, network, index, group } = value\n\n\tif (\n\t\ttypeof address !== 'string' ||\n\t\ttypeof name !== 'string' ||\n\t\ttypeof source !== 'string' ||\n\t\ttypeof network !== 'string' ||\n\t\ttypeof index !== 'number' ||\n\t\t!Number.isFinite(index)\n\t) {\n\t\treturn null\n\t}\n\n\t// NOTE: Feb 14, 2026 - `group` is a recently added property, so we allow it to be optional for\n\t// backward compatibility for the time being\n\tif (group === undefined) {\n\t\treturn {\n\t\t\t...value,\n\t\t\taddress,\n\t\t\tname,\n\t\t\tsource,\n\t\t\tnetwork,\n\t\t\tindex,\n\t\t\tgroup: 1,\n\t\t} as HardwareAccount\n\t}\n\n\tif (typeof group !== 'number' || !Number.isFinite(group)) {\n\t\treturn null\n\t}\n\n\treturn {\n\t\t...value,\n\t\taddress,\n\t\tname,\n\t\tsource,\n\t\tnetwork,\n\t\tindex,\n\t\tgroup,\n\t} as HardwareAccount\n}\n\n// Gets imported hardware accounts from local storage\nexport const getHardwareAccountsLocal = (): HardwareAccount[] => {\n\tconst stored = localStorageOrDefault(HardwareAccountsKey, [], true)\n\tif (!Array.isArray(stored)) {\n\t\treturn []\n\t}\n\n\treturn stored\n\t\t.map((account) => asHardwareAccount(account))\n\t\t.filter((account): account is HardwareAccount => account !== null)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { BehaviorSubject } from 'rxjs'\nimport { getHardwareAccountsLocal } from './local'\nimport type {\n\tExtensionAccount,\n\tExtensionsStatus,\n\tHardwareAccount,\n\tSync,\n} from './types'\n\n// NOTE: These subjects stay private to the package and are not exported\n\nexport const _extensionsStatus = new BehaviorSubject<ExtensionsStatus>({})\nexport const _gettingExtensions = new BehaviorSubject<boolean>(true)\nexport const _initialisedExtensions = new BehaviorSubject<string[]>([])\nexport const _reconnectSync = new BehaviorSubject<Sync>('unsynced')\nexport const _extensionAccounts = new BehaviorSubject<ExtensionAccount[]>([])\nexport const _hardwareAccounts = new BehaviorSubject<HardwareAccount[]>(\n\tgetHardwareAccountsLocal(),\n)\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport {\n\t_extensionAccounts,\n\t_extensionsStatus,\n\t_gettingExtensions,\n\t_hardwareAccounts,\n\t_initialisedExtensions,\n\t_reconnectSync,\n} from './subjects'\n\n// Discovered extensions along with their status\nexport const extensionsStatus$ = _extensionsStatus.asObservable()\n\n// Whether extensions are being checked\nexport const gettingExtensions$ = _gettingExtensions.asObservable()\n\n// Extensions that have successfully connected\nexport const initialisedExtensions$ = _initialisedExtensions.asObservable()\n\n// Sync status of reconnecting to previously enabled extensions\nexport const reconnectSync$ = _reconnectSync.asObservable()\n\n// Imported extension accounts\nexport const extensionAccounts$ = _extensionAccounts.asObservable()\n\n// Imported hardware accounts\nexport const hardwareAccounts$ = _hardwareAccounts.asObservable()\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport {\n\t_extensionAccounts,\n\t_extensionsStatus,\n\t_hardwareAccounts,\n\t_reconnectSync,\n} from './subjects'\nimport type { ExtensionStatus, HardwareAccount, Sync } from './types'\n\n// Gets an extension status\nexport const getStatus = (id: string): ExtensionStatus =>\n\t_extensionsStatus.getValue()[id] || undefined\n\n// Sets an extension status\nexport const setStatus = (id: string, status: ExtensionStatus) => {\n\tconst newValue = { ..._extensionsStatus.getValue() }\n\tnewValue[id] = status\n\t_extensionsStatus.next(newValue)\n}\n\n// Removes an extension status\nexport const removeStatus = (id: string) => {\n\tconst { [id]: _, ...rest } = _extensionsStatus.getValue()\n\t_extensionsStatus.next(rest)\n}\n\n// Whether an extension can be connected\nexport const canConnect = (id: string) =>\n\t![undefined, 'connected'].includes(_extensionsStatus.getValue()[id])\n\n// Reset accounts\nexport const resetAccounts = () => {\n\t_extensionAccounts.next([])\n}\n\n// Get previously enabled extension reconnect sync status\nexport const getReconnectSync = () => _reconnectSync.getValue()\n\n// Set previously enabled extension reconnect sync status\nexport const setReconnectSync = (sync: Sync) => {\n\t_reconnectSync.next(sync)\n}\n\n// Get hardware accounts\nexport const getHardwareAccounts = () => _hardwareAccounts.getValue()\n\n// Set hardware accounts\nexport const setHardwareAccounts = (accounts: HardwareAccount[]) => {\n\t_hardwareAccounts.next(accounts)\n}\n\n// Check if an injected web3 entry has a valid enable function\nexport const hasValidEnable = (id: string): boolean => {\n\ttry {\n\t\tconst enable = window.parent.injectedWeb3![id].enable\n\t\treturn enable !== undefined && typeof enable === 'function'\n\t} catch {\n\t\treturn false\n\t}\n}\n\n// Enable an injected web3 entry\nexport const enableInjectedWeb3Entry = (id: string, dappName: string) => {\n\tconst result = window.parent.injectedWeb3![id].enable(dappName)\n\treturn result\n}\n"],"mappings":"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","names":[]}
package/index.d.cts CHANGED
@@ -1,6 +1,6 @@
1
- import * as _w3ux_types from '@w3ux/types';
2
- import { ProcessExtensionAccountsResult, HardwareAccount, ExtensionStatus, Sync } from '@w3ux/types';
1
+ import { ProcessExtensionAccountsResult, HardwareAccount, ExtensionAccount, ExtensionsStatus, Sync, ExtensionInterface, ExtensionStatus } from './types.cjs';
3
2
  import * as rxjs from 'rxjs';
3
+ import 'react';
4
4
 
5
5
  declare const DefaultProcessExtensionResult: ProcessExtensionAccountsResult;
6
6
  declare const ActiveExtensionsKey = "active_extensions";
@@ -12,12 +12,12 @@ declare const addExtensionToLocal: (id: string) => void;
12
12
  declare const removeExtensionFromLocal: (id: string) => void;
13
13
  declare const getHardwareAccountsLocal: () => HardwareAccount[];
14
14
 
15
- declare const extensionsStatus$: rxjs.Observable<_w3ux_types.ExtensionsStatus>;
15
+ declare const extensionsStatus$: rxjs.Observable<ExtensionsStatus>;
16
16
  declare const gettingExtensions$: rxjs.Observable<boolean>;
17
17
  declare const initialisedExtensions$: rxjs.Observable<string[]>;
18
- declare const reconnectSync$: rxjs.Observable<_w3ux_types.Sync>;
19
- declare const extensionAccounts$: rxjs.Observable<_w3ux_types.ExtensionAccount[]>;
20
- declare const hardwareAccounts$: rxjs.Observable<_w3ux_types.HardwareAccount[]>;
18
+ declare const reconnectSync$: rxjs.Observable<Sync>;
19
+ declare const extensionAccounts$: rxjs.Observable<ExtensionAccount[]>;
20
+ declare const hardwareAccounts$: rxjs.Observable<HardwareAccount[]>;
21
21
 
22
22
  declare const getStatus: (id: string) => ExtensionStatus;
23
23
  declare const setStatus: (id: string, status: ExtensionStatus) => void;
@@ -28,8 +28,7 @@ declare const getReconnectSync: () => Sync;
28
28
  declare const setReconnectSync: (sync: Sync) => void;
29
29
  declare const getHardwareAccounts: () => HardwareAccount[];
30
30
  declare const setHardwareAccounts: (accounts: HardwareAccount[]) => void;
31
- declare const isMimir: (id: string) => boolean;
32
31
  declare const hasValidEnable: (id: string) => boolean;
33
- declare const enableInjectedWeb3Entry: (id: string, dappName: string) => Promise<_w3ux_types.ExtensionInterface>;
32
+ declare const enableInjectedWeb3Entry: (id: string, dappName: string) => Promise<ExtensionInterface>;
34
33
 
35
- export { ActiveExtensionsKey, DefaultProcessExtensionResult, HardwareAccountsKey, addExtensionToLocal, canConnect, enableInjectedWeb3Entry, extensionAccounts$, extensionsStatus$, getActiveExtensionsLocal, getHardwareAccounts, getHardwareAccountsLocal, getReconnectSync, getStatus, gettingExtensions$, hardwareAccounts$, hasValidEnable, initialisedExtensions$, isExtensionLocal, isMimir, reconnectSync$, removeExtensionFromLocal, removeStatus, resetAccounts, setHardwareAccounts, setReconnectSync, setStatus };
34
+ export { ActiveExtensionsKey, DefaultProcessExtensionResult, HardwareAccountsKey, addExtensionToLocal, canConnect, enableInjectedWeb3Entry, extensionAccounts$, extensionsStatus$, getActiveExtensionsLocal, getHardwareAccounts, getHardwareAccountsLocal, getReconnectSync, getStatus, gettingExtensions$, hardwareAccounts$, hasValidEnable, initialisedExtensions$, isExtensionLocal, reconnectSync$, removeExtensionFromLocal, removeStatus, resetAccounts, setHardwareAccounts, setReconnectSync, setStatus };
package/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import * as _w3ux_types from '@w3ux/types';
2
- import { ProcessExtensionAccountsResult, HardwareAccount, ExtensionStatus, Sync } from '@w3ux/types';
1
+ import { ProcessExtensionAccountsResult, HardwareAccount, ExtensionAccount, ExtensionsStatus, Sync, ExtensionInterface, ExtensionStatus } from './types.js';
3
2
  import * as rxjs from 'rxjs';
3
+ import 'react';
4
4
 
5
5
  declare const DefaultProcessExtensionResult: ProcessExtensionAccountsResult;
6
6
  declare const ActiveExtensionsKey = "active_extensions";
@@ -12,12 +12,12 @@ declare const addExtensionToLocal: (id: string) => void;
12
12
  declare const removeExtensionFromLocal: (id: string) => void;
13
13
  declare const getHardwareAccountsLocal: () => HardwareAccount[];
14
14
 
15
- declare const extensionsStatus$: rxjs.Observable<_w3ux_types.ExtensionsStatus>;
15
+ declare const extensionsStatus$: rxjs.Observable<ExtensionsStatus>;
16
16
  declare const gettingExtensions$: rxjs.Observable<boolean>;
17
17
  declare const initialisedExtensions$: rxjs.Observable<string[]>;
18
- declare const reconnectSync$: rxjs.Observable<_w3ux_types.Sync>;
19
- declare const extensionAccounts$: rxjs.Observable<_w3ux_types.ExtensionAccount[]>;
20
- declare const hardwareAccounts$: rxjs.Observable<_w3ux_types.HardwareAccount[]>;
18
+ declare const reconnectSync$: rxjs.Observable<Sync>;
19
+ declare const extensionAccounts$: rxjs.Observable<ExtensionAccount[]>;
20
+ declare const hardwareAccounts$: rxjs.Observable<HardwareAccount[]>;
21
21
 
22
22
  declare const getStatus: (id: string) => ExtensionStatus;
23
23
  declare const setStatus: (id: string, status: ExtensionStatus) => void;
@@ -28,8 +28,7 @@ declare const getReconnectSync: () => Sync;
28
28
  declare const setReconnectSync: (sync: Sync) => void;
29
29
  declare const getHardwareAccounts: () => HardwareAccount[];
30
30
  declare const setHardwareAccounts: (accounts: HardwareAccount[]) => void;
31
- declare const isMimir: (id: string) => boolean;
32
31
  declare const hasValidEnable: (id: string) => boolean;
33
- declare const enableInjectedWeb3Entry: (id: string, dappName: string) => Promise<_w3ux_types.ExtensionInterface>;
32
+ declare const enableInjectedWeb3Entry: (id: string, dappName: string) => Promise<ExtensionInterface>;
34
33
 
35
- export { ActiveExtensionsKey, DefaultProcessExtensionResult, HardwareAccountsKey, addExtensionToLocal, canConnect, enableInjectedWeb3Entry, extensionAccounts$, extensionsStatus$, getActiveExtensionsLocal, getHardwareAccounts, getHardwareAccountsLocal, getReconnectSync, getStatus, gettingExtensions$, hardwareAccounts$, hasValidEnable, initialisedExtensions$, isExtensionLocal, isMimir, reconnectSync$, removeExtensionFromLocal, removeStatus, resetAccounts, setHardwareAccounts, setReconnectSync, setStatus };
34
+ export { ActiveExtensionsKey, DefaultProcessExtensionResult, HardwareAccountsKey, addExtensionToLocal, canConnect, enableInjectedWeb3Entry, extensionAccounts$, extensionsStatus$, getActiveExtensionsLocal, getHardwareAccounts, getHardwareAccountsLocal, getReconnectSync, getStatus, gettingExtensions$, hardwareAccounts$, hasValidEnable, initialisedExtensions$, isExtensionLocal, reconnectSync$, removeExtensionFromLocal, removeStatus, resetAccounts, setHardwareAccounts, setReconnectSync, setStatus };
package/index.js CHANGED
@@ -5,13 +5,12 @@ import {
5
5
  getReconnectSync,
6
6
  getStatus,
7
7
  hasValidEnable,
8
- isMimir,
9
8
  removeStatus,
10
9
  resetAccounts,
11
10
  setHardwareAccounts,
12
11
  setReconnectSync,
13
12
  setStatus
14
- } from "./chunk-BZ4JF2XC.js";
13
+ } from "./chunk-2VNUX53X.js";
15
14
  import {
16
15
  ActiveExtensionsKey,
17
16
  DefaultProcessExtensionResult,
@@ -27,7 +26,7 @@ import {
27
26
  getHardwareAccountsLocal,
28
27
  isExtensionLocal,
29
28
  removeExtensionFromLocal
30
- } from "./chunk-VNHVECK2.js";
29
+ } from "./chunk-F7I65YDY.js";
31
30
 
32
31
  // src/observables.ts
33
32
  var extensionsStatus$ = _extensionsStatus.asObservable();
@@ -55,7 +54,6 @@ export {
55
54
  hasValidEnable,
56
55
  initialisedExtensions$,
57
56
  isExtensionLocal,
58
- isMimir,
59
57
  reconnectSync$,
60
58
  removeExtensionFromLocal,
61
59
  removeStatus,
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/observables.ts"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport {\n\t_extensionAccounts,\n\t_extensionsStatus,\n\t_gettingExtensions,\n\t_hardwareAccounts,\n\t_initialisedExtensions,\n\t_reconnectSync,\n} from './subjects'\n\n// Discovered extensions along with their status\nexport const extensionsStatus$ = _extensionsStatus.asObservable()\n\n// Whether extensions are being checked\nexport const gettingExtensions$ = _gettingExtensions.asObservable()\n\n// Extensions that have successfully connected\nexport const initialisedExtensions$ = _initialisedExtensions.asObservable()\n\n// Sync status of reconnecting to previously enabled extensions\nexport const reconnectSync$ = _reconnectSync.asObservable()\n\n// Imported extension accounts\nexport const extensionAccounts$ = _extensionAccounts.asObservable()\n\n// Imported hardware accounts\nexport const hardwareAccounts$ = _hardwareAccounts.asObservable()\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaO,IAAM,oBAAoB,kBAAkB,aAAa;AAGzD,IAAM,qBAAqB,mBAAmB,aAAa;AAG3D,IAAM,yBAAyB,uBAAuB,aAAa;AAGnE,IAAM,iBAAiB,eAAe,aAAa;AAGnD,IAAM,qBAAqB,mBAAmB,aAAa;AAG3D,IAAM,oBAAoB,kBAAkB,aAAa;","names":[]}
1
+ {"version":3,"sources":["../src/observables.ts"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport {\n\t_extensionAccounts,\n\t_extensionsStatus,\n\t_gettingExtensions,\n\t_hardwareAccounts,\n\t_initialisedExtensions,\n\t_reconnectSync,\n} from './subjects'\n\n// Discovered extensions along with their status\nexport const extensionsStatus$ = _extensionsStatus.asObservable()\n\n// Whether extensions are being checked\nexport const gettingExtensions$ = _gettingExtensions.asObservable()\n\n// Extensions that have successfully connected\nexport const initialisedExtensions$ = _initialisedExtensions.asObservable()\n\n// Sync status of reconnecting to previously enabled extensions\nexport const reconnectSync$ = _reconnectSync.asObservable()\n\n// Imported extension accounts\nexport const extensionAccounts$ = _extensionAccounts.asObservable()\n\n// Imported hardware accounts\nexport const hardwareAccounts$ = _hardwareAccounts.asObservable()\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaO,IAAM,oBAAoB,kBAAkB,aAAa;AAGzD,IAAM,qBAAqB,mBAAmB,aAAa;AAG3D,IAAM,yBAAyB,uBAAuB,aAAa;AAGnE,IAAM,iBAAiB,eAAe,aAAa;AAGnD,IAAM,qBAAqB,mBAAmB,aAAa;AAG3D,IAAM,oBAAoB,kBAAkB,aAAa;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@w3ux/observables-connect",
3
- "version": "1.0.6",
3
+ "version": "2.0.0",
4
4
  "license": "GPL-3.0-only",
5
5
  "type": "module",
6
6
  "description": "Observables for extensions and accounts discovery",
@@ -28,6 +28,10 @@
28
28
  "import": "./index.js",
29
29
  "require": "./index.cjs"
30
30
  },
31
+ "./types": {
32
+ "import": "./types.js",
33
+ "require": "./types.cjs"
34
+ },
31
35
  "./extensions": {
32
36
  "import": "./extensions/index.js",
33
37
  "require": "./extensions/index.cjs"
@@ -38,7 +42,6 @@
38
42
  }
39
43
  },
40
44
  "dependencies": {
41
- "@mimirdev/apps-inject": "^3.2.0",
42
45
  "@w3ux/extension-assets": "^2.2.5",
43
46
  "@w3ux/util-dedot": "^1.0.0",
44
47
  "@w3ux/utils": "^3.1.1"
package/types.cjs ADDED
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
+
16
+ // src/types.ts
17
+ var types_exports = {};
18
+ module.exports = __toCommonJS(types_exports);
19
+ /* @license Copyright 2024 w3ux authors & contributors
20
+ SPDX-License-Identifier: GPL-3.0-only */
21
+ //# sourceMappingURL=types.cjs.map
package/types.cjs.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { FunctionComponent, SVGProps } from 'react'\n\n// ----------------------------------------------------------------\n// Common\n// ----------------------------------------------------------------\n\nexport type MaybeString = string | null\n\nexport type Sync = 'synced' | 'unsynced' | 'syncing'\n\nexport type VoidFn = () => void\n\n// ----------------------------------------------------------------\n// Accounts\n// ----------------------------------------------------------------\n\nexport type HardwareAccountSource = 'ledger' | 'vault' | 'wallet_connect'\n\nexport type Account = ExtensionAccount | HardwareAccount\n\nexport type ExtensionAccount = AccountCommon & {\n\tsigner?: unknown\n}\n\nexport type HardwareAccount = AccountCommon & {\n\tnetwork: string\n\tgroup: number\n\tindex: number\n}\n\nexport interface AccountCommon {\n\taddress: string\n\tname: string\n\tsource: string\n}\n\n// ----------------------------------------------------------------\n// Extensions\n// ----------------------------------------------------------------\n\nexport type ExtensionStatus = 'installed' | 'not_authenticated' | 'connected'\n\nexport type ExtensionsStatus = Record<string, ExtensionStatus>\n\nexport interface ExtensionInjected extends ExtensionConfig {\n\tenable: (n?: string) => Promise<ExtensionInterface>\n}\n\nexport interface ExtensionInterface {\n\taccounts: {\n\t\tsubscribe: (a: (b: ExtensionAccount[]) => void) => VoidFn\n\t\tget: () => Promise<ExtensionAccount[]>\n\t}\n\tprovider: unknown\n\tmetadata: unknown\n\tsigner: unknown\n}\n\nexport interface ExtensionConfig {\n\tid: string\n\ttitle: string\n\ticon: FunctionComponent<\n\t\tSVGProps<SVGSVGElement> & { title?: string | undefined }\n\t>\n\turl: string\n}\n\nexport type RawExtensionEnable = (name?: string) => Promise<ExtensionInterface>\n\nexport type RawExtensions = Map<string, RawExtensionEnable>\n\nexport type ExtensionEnableStatus =\n\t| 'valid'\n\t| 'extension_not_found'\n\t| 'enable_invalid'\n\nexport type ExtensionEnableResults = Map<string, ExtensionEnableResult>\n\nexport interface ExtensionEnableResult {\n\textension: ExtensionInterface | null\n\tconnected: boolean\n\terror?: string\n}\n\nexport interface ProcessExtensionAccountsResult {\n\tnewAccounts: ExtensionAccount[]\n\tremovedAccounts: ExtensionAccount[]\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
package/types.d.cts ADDED
@@ -0,0 +1,57 @@
1
+ import { FunctionComponent, SVGProps } from 'react';
2
+
3
+ type MaybeString = string | null;
4
+ type Sync = 'synced' | 'unsynced' | 'syncing';
5
+ type VoidFn = () => void;
6
+ type HardwareAccountSource = 'ledger' | 'vault' | 'wallet_connect';
7
+ type Account = ExtensionAccount | HardwareAccount;
8
+ type ExtensionAccount = AccountCommon & {
9
+ signer?: unknown;
10
+ };
11
+ type HardwareAccount = AccountCommon & {
12
+ network: string;
13
+ group: number;
14
+ index: number;
15
+ };
16
+ interface AccountCommon {
17
+ address: string;
18
+ name: string;
19
+ source: string;
20
+ }
21
+ type ExtensionStatus = 'installed' | 'not_authenticated' | 'connected';
22
+ type ExtensionsStatus = Record<string, ExtensionStatus>;
23
+ interface ExtensionInjected extends ExtensionConfig {
24
+ enable: (n?: string) => Promise<ExtensionInterface>;
25
+ }
26
+ interface ExtensionInterface {
27
+ accounts: {
28
+ subscribe: (a: (b: ExtensionAccount[]) => void) => VoidFn;
29
+ get: () => Promise<ExtensionAccount[]>;
30
+ };
31
+ provider: unknown;
32
+ metadata: unknown;
33
+ signer: unknown;
34
+ }
35
+ interface ExtensionConfig {
36
+ id: string;
37
+ title: string;
38
+ icon: FunctionComponent<SVGProps<SVGSVGElement> & {
39
+ title?: string | undefined;
40
+ }>;
41
+ url: string;
42
+ }
43
+ type RawExtensionEnable = (name?: string) => Promise<ExtensionInterface>;
44
+ type RawExtensions = Map<string, RawExtensionEnable>;
45
+ type ExtensionEnableStatus = 'valid' | 'extension_not_found' | 'enable_invalid';
46
+ type ExtensionEnableResults = Map<string, ExtensionEnableResult>;
47
+ interface ExtensionEnableResult {
48
+ extension: ExtensionInterface | null;
49
+ connected: boolean;
50
+ error?: string;
51
+ }
52
+ interface ProcessExtensionAccountsResult {
53
+ newAccounts: ExtensionAccount[];
54
+ removedAccounts: ExtensionAccount[];
55
+ }
56
+
57
+ export type { Account, AccountCommon, ExtensionAccount, ExtensionConfig, ExtensionEnableResult, ExtensionEnableResults, ExtensionEnableStatus, ExtensionInjected, ExtensionInterface, ExtensionStatus, ExtensionsStatus, HardwareAccount, HardwareAccountSource, MaybeString, ProcessExtensionAccountsResult, RawExtensionEnable, RawExtensions, Sync, VoidFn };
package/types.d.ts ADDED
@@ -0,0 +1,57 @@
1
+ import { FunctionComponent, SVGProps } from 'react';
2
+
3
+ type MaybeString = string | null;
4
+ type Sync = 'synced' | 'unsynced' | 'syncing';
5
+ type VoidFn = () => void;
6
+ type HardwareAccountSource = 'ledger' | 'vault' | 'wallet_connect';
7
+ type Account = ExtensionAccount | HardwareAccount;
8
+ type ExtensionAccount = AccountCommon & {
9
+ signer?: unknown;
10
+ };
11
+ type HardwareAccount = AccountCommon & {
12
+ network: string;
13
+ group: number;
14
+ index: number;
15
+ };
16
+ interface AccountCommon {
17
+ address: string;
18
+ name: string;
19
+ source: string;
20
+ }
21
+ type ExtensionStatus = 'installed' | 'not_authenticated' | 'connected';
22
+ type ExtensionsStatus = Record<string, ExtensionStatus>;
23
+ interface ExtensionInjected extends ExtensionConfig {
24
+ enable: (n?: string) => Promise<ExtensionInterface>;
25
+ }
26
+ interface ExtensionInterface {
27
+ accounts: {
28
+ subscribe: (a: (b: ExtensionAccount[]) => void) => VoidFn;
29
+ get: () => Promise<ExtensionAccount[]>;
30
+ };
31
+ provider: unknown;
32
+ metadata: unknown;
33
+ signer: unknown;
34
+ }
35
+ interface ExtensionConfig {
36
+ id: string;
37
+ title: string;
38
+ icon: FunctionComponent<SVGProps<SVGSVGElement> & {
39
+ title?: string | undefined;
40
+ }>;
41
+ url: string;
42
+ }
43
+ type RawExtensionEnable = (name?: string) => Promise<ExtensionInterface>;
44
+ type RawExtensions = Map<string, RawExtensionEnable>;
45
+ type ExtensionEnableStatus = 'valid' | 'extension_not_found' | 'enable_invalid';
46
+ type ExtensionEnableResults = Map<string, ExtensionEnableResult>;
47
+ interface ExtensionEnableResult {
48
+ extension: ExtensionInterface | null;
49
+ connected: boolean;
50
+ error?: string;
51
+ }
52
+ interface ProcessExtensionAccountsResult {
53
+ newAccounts: ExtensionAccount[];
54
+ removedAccounts: ExtensionAccount[];
55
+ }
56
+
57
+ export type { Account, AccountCommon, ExtensionAccount, ExtensionConfig, ExtensionEnableResult, ExtensionEnableResults, ExtensionEnableStatus, ExtensionInjected, ExtensionInterface, ExtensionStatus, ExtensionsStatus, HardwareAccount, HardwareAccountSource, MaybeString, ProcessExtensionAccountsResult, RawExtensionEnable, RawExtensions, Sync, VoidFn };
package/types.js ADDED
@@ -0,0 +1,3 @@
1
+ /* @license Copyright 2024 w3ux authors & contributors
2
+ SPDX-License-Identifier: GPL-3.0-only */
3
+ //# sourceMappingURL=types.js.map
package/types.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/util.ts"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExtensionStatus, HardwareAccount, Sync } from '@w3ux/types'\nimport {\n\t_extensionAccounts,\n\t_extensionsStatus,\n\t_hardwareAccounts,\n\t_reconnectSync,\n} from './subjects'\n\n// Gets an extension status\nexport const getStatus = (id: string): ExtensionStatus =>\n\t_extensionsStatus.getValue()[id] || undefined\n\n// Sets an extension status\nexport const setStatus = (id: string, status: ExtensionStatus) => {\n\tconst newValue = { ..._extensionsStatus.getValue() }\n\tnewValue[id] = status\n\t_extensionsStatus.next(newValue)\n}\n\n// Removes an extension status\nexport const removeStatus = (id: string) => {\n\tconst { [id]: _, ...rest } = _extensionsStatus.getValue()\n\t_extensionsStatus.next(rest)\n}\n\n// Whether an extension can be connected\nexport const canConnect = (id: string) =>\n\t![undefined, 'connected'].includes(_extensionsStatus.getValue()[id])\n\n// Reset accounts\nexport const resetAccounts = () => {\n\t_extensionAccounts.next([])\n}\n\n// Get previously enabled extension reconnect sync status\nexport const getReconnectSync = () => _reconnectSync.getValue()\n\n// Set previously enabled extension reconnect sync status\nexport const setReconnectSync = (sync: Sync) => {\n\t_reconnectSync.next(sync)\n}\n\n// Get hardware accounts\nexport const getHardwareAccounts = () => _hardwareAccounts.getValue()\n\n// Set hardware accounts\nexport const setHardwareAccounts = (accounts: HardwareAccount[]) => {\n\t_hardwareAccounts.next(accounts)\n}\n\n// Checks whether app is open in a mimir iframe\nexport const isMimir = (id: string): boolean =>\n\twindow.self !== window.top && id === 'mimir'\n\n// Check if an injected web3 entry has a valid enable function\nexport const hasValidEnable = (id: string): boolean => {\n\ttry {\n\t\tconst enable = isMimir(id)\n\t\t\t? window.injectedWeb3![id].enable\n\t\t\t: window.parent.injectedWeb3![id].enable\n\n\t\treturn enable !== undefined && typeof enable === 'function'\n\t} catch {\n\t\treturn false\n\t}\n}\n\n// Enable an injected web3 entry\nexport const enableInjectedWeb3Entry = (id: string, dappName: string) => {\n\tif (isMimir(id)) {\n\t\tconst result = window.injectedWeb3![id].enable(dappName)\n\t\treturn result\n\t}\n\tconst result = window.parent.injectedWeb3![id].enable(dappName)\n\treturn result\n}\n"],"mappings":";;;;;;;;AAYO,IAAM,YAAY,CAAC,OACzB,kBAAkB,SAAS,EAAE,EAAE,KAAK;AAG9B,IAAM,YAAY,CAAC,IAAY,WAA4B;AACjE,QAAM,WAAW,EAAE,GAAG,kBAAkB,SAAS,EAAE;AACnD,WAAS,EAAE,IAAI;AACf,oBAAkB,KAAK,QAAQ;AAChC;AAGO,IAAM,eAAe,CAAC,OAAe;AAC3C,QAAM,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,IAAI,kBAAkB,SAAS;AACxD,oBAAkB,KAAK,IAAI;AAC5B;AAGO,IAAM,aAAa,CAAC,OAC1B,CAAC,CAAC,QAAW,WAAW,EAAE,SAAS,kBAAkB,SAAS,EAAE,EAAE,CAAC;AAG7D,IAAM,gBAAgB,MAAM;AAClC,qBAAmB,KAAK,CAAC,CAAC;AAC3B;AAGO,IAAM,mBAAmB,MAAM,eAAe,SAAS;AAGvD,IAAM,mBAAmB,CAAC,SAAe;AAC/C,iBAAe,KAAK,IAAI;AACzB;AAGO,IAAM,sBAAsB,MAAM,kBAAkB,SAAS;AAG7D,IAAM,sBAAsB,CAAC,aAAgC;AACnE,oBAAkB,KAAK,QAAQ;AAChC;AAGO,IAAM,UAAU,CAAC,OACvB,OAAO,SAAS,OAAO,OAAO,OAAO;AAG/B,IAAM,iBAAiB,CAAC,OAAwB;AACtD,MAAI;AACH,UAAM,SAAS,QAAQ,EAAE,IACtB,OAAO,aAAc,EAAE,EAAE,SACzB,OAAO,OAAO,aAAc,EAAE,EAAE;AAEnC,WAAO,WAAW,UAAa,OAAO,WAAW;AAAA,EAClD,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAGO,IAAM,0BAA0B,CAAC,IAAY,aAAqB;AACxE,MAAI,QAAQ,EAAE,GAAG;AAChB,UAAMA,UAAS,OAAO,aAAc,EAAE,EAAE,OAAO,QAAQ;AACvD,WAAOA;AAAA,EACR;AACA,QAAM,SAAS,OAAO,OAAO,aAAc,EAAE,EAAE,OAAO,QAAQ;AAC9D,SAAO;AACR;","names":["result"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/accounts/util.ts","../src/accounts/get.ts","../src/accounts/unsubs.ts"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tProcessExtensionAccountsResult,\n} from '@w3ux/types'\nimport { formatAccountSs58, isValidAddress } from '@w3ux/util-dedot'\nimport { DefaultProcessExtensionResult } from '../consts'\nimport { _extensionAccounts } from '../subjects'\n\n// Gets accounts to be imported and commits them to state\n\ninterface Config {\n\tsource: string\n\tss58: number\n}\nexport const processExtensionAccounts = (\n\tconfig: Config,\n\tsigner: unknown,\n\tnewAccounts: ExtensionAccount[],\n): ProcessExtensionAccountsResult => {\n\tconst { source, ss58 } = config\n\tif (!newAccounts.length) {\n\t\treturn DefaultProcessExtensionResult\n\t}\n\n\t// Get valid accounts from extension\n\tnewAccounts = formatExtensionAccounts(newAccounts, ss58)\n\n\t// Find any accounts that have been removed from this extension\n\tconst removedAccounts = _extensionAccounts\n\t\t.getValue()\n\t\t.filter((j) => j.source === source)\n\t\t.filter((j) => !newAccounts.find((i) => i.address === j.address))\n\n\t// Remove accounts that have already been imported\n\tnewAccounts = newAccounts.filter(\n\t\t({ address }) =>\n\t\t\t!_extensionAccounts\n\t\t\t\t.getValue()\n\t\t\t\t.find((j) => j.address === address && j.source === source),\n\t)\n\n\t// Format accounts properties\n\tnewAccounts = newAccounts.map(({ address, name }) => ({\n\t\taddress,\n\t\tname,\n\t\tsource,\n\t\tsigner,\n\t}))\n\n\t// Update observable state\n\tupdateAccounts({\n\t\tadd: newAccounts,\n\t\tremove: removedAccounts,\n\t})\n\n\treturn {\n\t\tnewAccounts,\n\t\tremovedAccounts: [...removedAccounts],\n\t}\n}\n\n// Formats accounts to correct ss58 and removes invalid accounts\nexport const formatExtensionAccounts = (\n\taccounts: ExtensionAccount[],\n\tss58: number,\n) => {\n\taccounts = accounts\n\t\t// Remove accounts that do not contain correctly formatted addresses\n\t\t.filter(({ address }) => isValidAddress(address))\n\t\t// Reformat addresses to ensure default ss58 format\n\t\t.map((account) => {\n\t\t\tconst formattedAddress = formatAccountSs58(account.address, ss58)\n\t\t\tif (!formattedAddress) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\taccount.address = formattedAddress\n\t\t\treturn account\n\t\t})\n\t\t// Remove null entries resulting from invalid formatted addresses\n\t\t.filter((account) => account !== null)\n\n\treturn accounts\n}\n\n// Updates accounts observable based on removed and added accounts\nexport const updateAccounts = ({\n\tadd,\n\tremove,\n}: {\n\tadd: ExtensionAccount[]\n\tremove: ExtensionAccount[]\n}) => {\n\tconst newAccounts = [..._extensionAccounts.getValue()]\n\t\t.concat(add)\n\t\t.filter(\n\t\t\t(a) =>\n\t\t\t\tremove.find((s) => s.address === a.address && s.source === a.source) ===\n\t\t\t\tundefined,\n\t\t)\n\t_extensionAccounts.next(newAccounts)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tExtensionEnableResults,\n\tExtensionInterface,\n} from '@w3ux/types'\nimport { formatExtensionAccounts } from './util'\n\n// Connects to provided extensions and gets all accounts\nexport const getAccountsFromExtensions = async (\n\textensions: ExtensionEnableResults,\n\tss58: number,\n): Promise<ExtensionAccount[]> => {\n\ttry {\n\t\tconst extensionEntries = Array.from(extensions.entries())\n\t\t\t.filter(([, { extension }]) => extension !== null)\n\t\t\t.map(\n\t\t\t\t([source, { extension }]) =>\n\t\t\t\t\t[source, extension] as [string, ExtensionInterface],\n\t\t\t)\n\n\t\tconst activeExtensions = extensionEntries.map(([, extension]) => extension)\n\n\t\tconst results = await Promise.allSettled(\n\t\t\tactiveExtensions.map((extension) => extension.accounts.get()),\n\t\t)\n\n\t\tconst allAccounts: ExtensionAccount[] = []\n\t\tfor (let i = 0; i < results.length; i++) {\n\t\t\tconst result = results[i]\n\t\t\tconst source = extensionEntries[i][0]\n\t\t\tconst signer = extensionEntries[i][1].signer\n\n\t\t\tif (result.status === 'fulfilled' && signer) {\n\t\t\t\tconst { value } = result\n\t\t\t\tconst accounts = formatExtensionAccounts(value, ss58).map(\n\t\t\t\t\t({ address, name }) => ({\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\tsigner,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\tallAccounts.push(...accounts)\n\t\t\t}\n\t\t}\n\t\treturn allAccounts\n\t} catch (e) {\n\t\tconsole.error('Error during account formatting: ', e)\n\t\treturn []\n\t}\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\n// Extension account subscription unsubs\nexport const unsubs: Record<string, () => void> = {}\n\n// Add an extension id to unsub state\nexport const addUnsub = (id: string, unsub: () => void) => {\n\tunsubs[id] = unsub\n}\n\n// Unsubscribe to all unsubs\nexport const unsubAll = () => {\n\tObject.values(unsubs).forEach((unsub) => {\n\t\tunsub()\n\t})\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/consts.ts","../src/local.ts","../src/subjects.ts"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ProcessExtensionAccountsResult } from '@w3ux/types'\n\nexport const DefaultProcessExtensionResult: ProcessExtensionAccountsResult = {\n\tnewAccounts: [],\n\tremovedAccounts: [],\n}\n\n// Local storage active extensions key\nexport const ActiveExtensionsKey = 'active_extensions'\nexport const HardwareAccountsKey = 'hardware_accounts'\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { HardwareAccount } from '@w3ux/types'\nimport { localStorageOrDefault } from '@w3ux/utils'\nimport { ActiveExtensionsKey, HardwareAccountsKey } from './consts'\n\n// Gets all active extensions from local storage\nexport const getActiveExtensionsLocal = (): string[] => {\n\tconst current = localStorageOrDefault<string[]>(ActiveExtensionsKey, [], true)\n\treturn Array.isArray(current) ? current : []\n}\n\n// Check if an extension exists in local storage\nexport const isExtensionLocal = (id: string): boolean =>\n\tgetActiveExtensionsLocal().includes(id)\n\n// Adds an extension to local storage\nexport const addExtensionToLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tif (!current.includes(id)) {\n\t\tlocalStorage.setItem(ActiveExtensionsKey, JSON.stringify([...current, id]))\n\t}\n}\n\n// Removes extension from local storage\nexport const removeExtensionFromLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tlocalStorage.setItem(\n\t\tActiveExtensionsKey,\n\t\tJSON.stringify(current.filter((localId) => localId !== id)),\n\t)\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n\ttypeof value === 'object' && value !== null\n\nconst asHardwareAccount = (value: unknown): HardwareAccount | null => {\n\tif (!isRecord(value)) {\n\t\treturn null\n\t}\n\n\tconst { address, name, source, network, index, group } = value\n\n\tif (\n\t\ttypeof address !== 'string' ||\n\t\ttypeof name !== 'string' ||\n\t\ttypeof source !== 'string' ||\n\t\ttypeof network !== 'string' ||\n\t\ttypeof index !== 'number' ||\n\t\t!Number.isFinite(index)\n\t) {\n\t\treturn null\n\t}\n\n\t// NOTE: Feb 14, 2026 - `group` is a recently added property, so we allow it to be optional for\n\t// backward compatibility for the time being\n\tif (group === undefined) {\n\t\treturn {\n\t\t\t...value,\n\t\t\taddress,\n\t\t\tname,\n\t\t\tsource,\n\t\t\tnetwork,\n\t\t\tindex,\n\t\t\tgroup: 1,\n\t\t} as HardwareAccount\n\t}\n\n\tif (typeof group !== 'number' || !Number.isFinite(group)) {\n\t\treturn null\n\t}\n\n\treturn {\n\t\t...value,\n\t\taddress,\n\t\tname,\n\t\tsource,\n\t\tnetwork,\n\t\tindex,\n\t\tgroup,\n\t} as HardwareAccount\n}\n\n// Gets imported hardware accounts from local storage\nexport const getHardwareAccountsLocal = (): HardwareAccount[] => {\n\tconst stored = localStorageOrDefault(HardwareAccountsKey, [], true)\n\tif (!Array.isArray(stored)) {\n\t\treturn []\n\t}\n\n\treturn stored\n\t\t.map((account) => asHardwareAccount(account))\n\t\t.filter((account): account is HardwareAccount => account !== null)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tExtensionsStatus,\n\tHardwareAccount,\n\tSync,\n} from '@w3ux/types'\nimport { BehaviorSubject } from 'rxjs'\nimport { getHardwareAccountsLocal } from './local'\n\n// NOTE: These subjects stay private to the package and are not exported\n\nexport const _extensionsStatus = new BehaviorSubject<ExtensionsStatus>({})\nexport const _gettingExtensions = new BehaviorSubject<boolean>(true)\nexport const _initialisedExtensions = new BehaviorSubject<string[]>([])\nexport const _reconnectSync = new BehaviorSubject<Sync>('unsynced')\nexport const _extensionAccounts = new BehaviorSubject<ExtensionAccount[]>([])\nexport const _hardwareAccounts = new BehaviorSubject<HardwareAccount[]>(\n\tgetHardwareAccountsLocal(),\n)\n"],"mappings":";AAKO,IAAM,gCAAgE;AAAA,EAC5E,aAAa,CAAC;AAAA,EACd,iBAAiB,CAAC;AACnB;AAGO,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;;;ACRnC,SAAS,6BAA6B;AAI/B,IAAM,2BAA2B,MAAgB;AACvD,QAAM,UAAU,sBAAgC,qBAAqB,CAAC,GAAG,IAAI;AAC7E,SAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC;AAC5C;AAGO,IAAM,mBAAmB,CAAC,OAChC,yBAAyB,EAAE,SAAS,EAAE;AAGhC,IAAM,sBAAsB,CAAC,OAAqB;AACxD,QAAM,UAAU,yBAAyB;AACzC,MAAI,CAAC,QAAQ,SAAS,EAAE,GAAG;AAC1B,iBAAa,QAAQ,qBAAqB,KAAK,UAAU,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC;AAAA,EAC3E;AACD;AAGO,IAAM,2BAA2B,CAAC,OAAqB;AAC7D,QAAM,UAAU,yBAAyB;AACzC,eAAa;AAAA,IACZ;AAAA,IACA,KAAK,UAAU,QAAQ,OAAO,CAAC,YAAY,YAAY,EAAE,CAAC;AAAA,EAC3D;AACD;AAEA,IAAM,WAAW,CAAC,UACjB,OAAO,UAAU,YAAY,UAAU;AAExC,IAAM,oBAAoB,CAAC,UAA2C;AACrE,MAAI,CAAC,SAAS,KAAK,GAAG;AACrB,WAAO;AAAA,EACR;AAEA,QAAM,EAAE,SAAS,MAAM,QAAQ,SAAS,OAAO,MAAM,IAAI;AAEzD,MACC,OAAO,YAAY,YACnB,OAAO,SAAS,YAChB,OAAO,WAAW,YAClB,OAAO,YAAY,YACnB,OAAO,UAAU,YACjB,CAAC,OAAO,SAAS,KAAK,GACrB;AACD,WAAO;AAAA,EACR;AAIA,MAAI,UAAU,QAAW;AACxB,WAAO;AAAA,MACN,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IACR;AAAA,EACD;AAEA,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AACzD,WAAO;AAAA,EACR;AAEA,SAAO;AAAA,IACN,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;AAGO,IAAM,2BAA2B,MAAyB;AAChE,QAAM,SAAS,sBAAsB,qBAAqB,CAAC,GAAG,IAAI;AAClE,MAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC3B,WAAO,CAAC;AAAA,EACT;AAEA,SAAO,OACL,IAAI,CAAC,YAAY,kBAAkB,OAAO,CAAC,EAC3C,OAAO,CAAC,YAAwC,YAAY,IAAI;AACnE;;;ACrFA,SAAS,uBAAuB;AAKzB,IAAM,oBAAoB,IAAI,gBAAkC,CAAC,CAAC;AAClE,IAAM,qBAAqB,IAAI,gBAAyB,IAAI;AAC5D,IAAM,yBAAyB,IAAI,gBAA0B,CAAC,CAAC;AAC/D,IAAM,iBAAiB,IAAI,gBAAsB,UAAU;AAC3D,IAAM,qBAAqB,IAAI,gBAAoC,CAAC,CAAC;AACrE,IAAM,oBAAoB,IAAI;AAAA,EACpC,yBAAyB;AAC1B;","names":[]}