@w3ux/observables-connect 0.10.2 → 0.10.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/accounts/index.cjs +6 -5
- package/accounts/index.cjs.map +1 -1
- package/accounts/index.js +1 -1
- package/{chunk-7HEVIWWS.js → chunk-Z6C6MK4P.js} +7 -6
- package/chunk-Z6C6MK4P.js.map +1 -0
- package/extensions/index.cjs +9 -7
- package/extensions/index.cjs.map +1 -1
- package/extensions/index.js +4 -3
- package/extensions/index.js.map +1 -1
- package/package.json +1 -1
- package/chunk-7HEVIWWS.js.map +0 -1
package/accounts/index.cjs
CHANGED
|
@@ -112,17 +112,18 @@ var updateAccounts = ({
|
|
|
112
112
|
// src/accounts/get.ts
|
|
113
113
|
var getAccountsFromExtensions = async (extensions, ss58) => {
|
|
114
114
|
try {
|
|
115
|
+
const extensionEntries = Array.from(extensions.entries()).filter(([, { extension }]) => extension !== null).map(
|
|
116
|
+
([source, { extension }]) => [source, extension]
|
|
117
|
+
);
|
|
118
|
+
const activeExtensions = extensionEntries.map(([, extension]) => extension);
|
|
115
119
|
const results = await Promise.allSettled(
|
|
116
|
-
|
|
117
|
-
({ extension }) => extension.accounts.get()
|
|
118
|
-
)
|
|
120
|
+
activeExtensions.map((extension) => extension.accounts.get())
|
|
119
121
|
);
|
|
120
122
|
const allAccounts = [];
|
|
121
|
-
const extensionEntries = Array.from(extensions.entries());
|
|
122
123
|
for (let i = 0; i < results.length; i++) {
|
|
123
124
|
const result = results[i];
|
|
124
125
|
const source = extensionEntries[i][0];
|
|
125
|
-
const signer = extensionEntries[i][1].
|
|
126
|
+
const signer = extensionEntries[i][1].signer;
|
|
126
127
|
if (result.status === "fulfilled" && signer) {
|
|
127
128
|
const { value } = result;
|
|
128
129
|
const accounts = formatExtensionAccounts(value, ss58).filter(
|
package/accounts/index.cjs.map
CHANGED
|
@@ -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 ExtensionAccount,\n ProcessExtensionAccountsResult,\n} from '@w3ux/types'\nimport { formatAccountSs58, isValidAddress } from '@w3ux/utils'\nimport { DefaultProcessExtensionResult } from '../consts'\nimport { _extensionAccounts } from '../subjects'\n\n// Gets accounts to be imported and commits them to state\n\ninterface Config {\n source: string\n ss58: number\n}\nexport const processExtensionAccounts = (\n config: Config,\n signer: unknown,\n newAccounts: ExtensionAccount[]\n): ProcessExtensionAccountsResult => {\n const { source, ss58 } = config\n if (!newAccounts.length) {\n return DefaultProcessExtensionResult\n }\n\n // Get valid accounts from extension\n newAccounts = formatExtensionAccounts(newAccounts, ss58)\n\n // Find any accounts that have been removed from this extension\n const removedAccounts = _extensionAccounts\n .getValue()\n .filter((j) => j.source === source)\n .filter((j) => !newAccounts.find((i) => i.address === j.address))\n\n // Remove accounts that have already been imported\n newAccounts = newAccounts.filter(\n ({ address }) =>\n !_extensionAccounts.getValue().find((j) => j.address === address)\n )\n\n // Format accounts properties\n newAccounts = newAccounts.map(({ address, name }) => ({\n address,\n name,\n source,\n signer,\n }))\n\n // Update observable state\n updateAccounts({\n add: newAccounts,\n remove: removedAccounts,\n })\n\n return {\n newAccounts,\n removedAccounts: [...removedAccounts],\n }\n}\n\n// Formats accounts to correct ss58 and removes invalid accounts\nexport const formatExtensionAccounts = (\n accounts: ExtensionAccount[],\n ss58: number\n) => {\n accounts = accounts\n // Remove accounts that do not contain correctly formatted addresses\n .filter(({ address }) => isValidAddress(address))\n // Reformat addresses to ensure default ss58 format\n .map((account) => {\n const formattedAddress = formatAccountSs58(account.address, ss58)\n if (!formattedAddress) {\n return null\n }\n account.address = formattedAddress\n return account\n })\n // Remove null entries resulting from invalid formatted addresses\n .filter((account) => account !== null)\n\n return accounts\n}\n\n// Updates accounts observable based on removed and added accounts\nexport const updateAccounts = ({\n add,\n remove,\n}: {\n add: ExtensionAccount[]\n remove: ExtensionAccount[]\n}) => {\n const newAccounts = [..._extensionAccounts.getValue()]\n .concat(add)\n .filter((a) => remove.find((s) => s.address === a.address) === undefined)\n _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 newAccounts: [],\n removedAccounts: [],\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 ExtensionAccount,\n ExtensionsStatus,\n HardwareAccount,\n Sync,\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 getHardwareAccountsLocal()\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 const current = localStorageOrDefault<string[]>(ActiveExtensionsKey, [], true)\n return Array.isArray(current) ? current : []\n}\n\n// Check if an extension exists in local storage\nexport const isExtensionLocal = (id: string): boolean =>\n getActiveExtensionsLocal().includes(id)\n\n// Adds an extension to local storage\nexport const addExtensionToLocal = (id: string): void => {\n const current = getActiveExtensionsLocal()\n if (!current.includes(id)) {\n localStorage.setItem(ActiveExtensionsKey, JSON.stringify([...current, id]))\n }\n}\n\n// Removes extension from local storage\nexport const removeExtensionFromLocal = (id: string): void => {\n const current = getActiveExtensionsLocal()\n localStorage.setItem(\n ActiveExtensionsKey,\n JSON.stringify(current.filter((localId) => localId !== id))\n )\n}\n\n// Gets imported hardware accounts from local storage\nexport const getHardwareAccountsLocal = (): HardwareAccount[] => {\n const accounts = localStorageOrDefault(\n HardwareAccountsKey,\n [],\n true\n ) as HardwareAccount[]\n\n return accounts\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExtensionAccount, ExtensionEnableResults } from '@w3ux/types'\nimport { formatExtensionAccounts } from './util'\n\n// Connects to provided extensions and gets all accounts\nexport const getAccountsFromExtensions = async (\n extensions: ExtensionEnableResults,\n ss58: number\n): Promise<ExtensionAccount[]> => {\n try {\n const results = await Promise.allSettled(\n Array.from(extensions.values()).map(({ extension }) =>\n extension!.accounts.get()\n )\n )\n\n const allAccounts: ExtensionAccount[] = []\n const extensionEntries = Array.from(extensions.entries())\n for (let i = 0; i < results.length; i++) {\n const result = results[i]\n const source = extensionEntries[i][0]\n const signer = extensionEntries[i][1].extension!.signer\n\n if (result.status === 'fulfilled' && signer) {\n const { value } = result\n\n // This is duplicating what `handleExtensionAccountsUpdate` is doing to accounts: --\n const accounts = formatExtensionAccounts(value, ss58)\n .filter(\n ({ address }) => !allAccounts.find((a) => address === a.address)\n )\n .map(({ address, name }) => ({\n address,\n name,\n source,\n signer,\n }))\n allAccounts.push(...accounts)\n }\n }\n return allAccounts\n } catch (e) {\n console.error('Error during account formatting: ', e)\n return []\n }\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 unsubs[id] = unsub\n}\n\n// Unsubscribe to all unsubs\nexport const unsubAll = () => {\n Object.values(unsubs).forEach((unsub) => {\n unsub()\n })\n}\n"],"mappings":"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","names":["import_utils"]}
|
|
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 ExtensionAccount,\n ProcessExtensionAccountsResult,\n} from '@w3ux/types'\nimport { formatAccountSs58, isValidAddress } from '@w3ux/utils'\nimport { DefaultProcessExtensionResult } from '../consts'\nimport { _extensionAccounts } from '../subjects'\n\n// Gets accounts to be imported and commits them to state\n\ninterface Config {\n source: string\n ss58: number\n}\nexport const processExtensionAccounts = (\n config: Config,\n signer: unknown,\n newAccounts: ExtensionAccount[]\n): ProcessExtensionAccountsResult => {\n const { source, ss58 } = config\n if (!newAccounts.length) {\n return DefaultProcessExtensionResult\n }\n\n // Get valid accounts from extension\n newAccounts = formatExtensionAccounts(newAccounts, ss58)\n\n // Find any accounts that have been removed from this extension\n const removedAccounts = _extensionAccounts\n .getValue()\n .filter((j) => j.source === source)\n .filter((j) => !newAccounts.find((i) => i.address === j.address))\n\n // Remove accounts that have already been imported\n newAccounts = newAccounts.filter(\n ({ address }) =>\n !_extensionAccounts.getValue().find((j) => j.address === address)\n )\n\n // Format accounts properties\n newAccounts = newAccounts.map(({ address, name }) => ({\n address,\n name,\n source,\n signer,\n }))\n\n // Update observable state\n updateAccounts({\n add: newAccounts,\n remove: removedAccounts,\n })\n\n return {\n newAccounts,\n removedAccounts: [...removedAccounts],\n }\n}\n\n// Formats accounts to correct ss58 and removes invalid accounts\nexport const formatExtensionAccounts = (\n accounts: ExtensionAccount[],\n ss58: number\n) => {\n accounts = accounts\n // Remove accounts that do not contain correctly formatted addresses\n .filter(({ address }) => isValidAddress(address))\n // Reformat addresses to ensure default ss58 format\n .map((account) => {\n const formattedAddress = formatAccountSs58(account.address, ss58)\n if (!formattedAddress) {\n return null\n }\n account.address = formattedAddress\n return account\n })\n // Remove null entries resulting from invalid formatted addresses\n .filter((account) => account !== null)\n\n return accounts\n}\n\n// Updates accounts observable based on removed and added accounts\nexport const updateAccounts = ({\n add,\n remove,\n}: {\n add: ExtensionAccount[]\n remove: ExtensionAccount[]\n}) => {\n const newAccounts = [..._extensionAccounts.getValue()]\n .concat(add)\n .filter((a) => remove.find((s) => s.address === a.address) === undefined)\n _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 newAccounts: [],\n removedAccounts: [],\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 ExtensionAccount,\n ExtensionsStatus,\n HardwareAccount,\n Sync,\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 getHardwareAccountsLocal()\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 const current = localStorageOrDefault<string[]>(ActiveExtensionsKey, [], true)\n return Array.isArray(current) ? current : []\n}\n\n// Check if an extension exists in local storage\nexport const isExtensionLocal = (id: string): boolean =>\n getActiveExtensionsLocal().includes(id)\n\n// Adds an extension to local storage\nexport const addExtensionToLocal = (id: string): void => {\n const current = getActiveExtensionsLocal()\n if (!current.includes(id)) {\n localStorage.setItem(ActiveExtensionsKey, JSON.stringify([...current, id]))\n }\n}\n\n// Removes extension from local storage\nexport const removeExtensionFromLocal = (id: string): void => {\n const current = getActiveExtensionsLocal()\n localStorage.setItem(\n ActiveExtensionsKey,\n JSON.stringify(current.filter((localId) => localId !== id))\n )\n}\n\n// Gets imported hardware accounts from local storage\nexport const getHardwareAccountsLocal = (): HardwareAccount[] => {\n const accounts = localStorageOrDefault(\n HardwareAccountsKey,\n [],\n true\n ) as HardwareAccount[]\n\n return accounts\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n ExtensionAccount,\n ExtensionEnableResults,\n ExtensionInterface,\n} from '@w3ux/types'\nimport { formatExtensionAccounts } from './util'\n\n// Connects to provided extensions and gets all accounts\nexport const getAccountsFromExtensions = async (\n extensions: ExtensionEnableResults,\n ss58: number\n): Promise<ExtensionAccount[]> => {\n try {\n const extensionEntries = Array.from(extensions.entries())\n .filter(([, { extension }]) => extension !== null)\n .map(\n ([source, { extension }]) =>\n [source, extension] as [string, ExtensionInterface]\n )\n\n const activeExtensions = extensionEntries.map(([, extension]) => extension)\n\n const results = await Promise.allSettled(\n activeExtensions.map((extension) => extension.accounts.get())\n )\n\n const allAccounts: ExtensionAccount[] = []\n for (let i = 0; i < results.length; i++) {\n const result = results[i]\n const source = extensionEntries[i][0]\n const signer = extensionEntries[i][1].signer\n\n if (result.status === 'fulfilled' && signer) {\n const { value } = result\n\n // This is duplicating what `handleExtensionAccountsUpdate` is doing to accounts: --\n const accounts = formatExtensionAccounts(value, ss58)\n .filter(\n ({ address }) => !allAccounts.find((a) => address === a.address)\n )\n .map(({ address, name }) => ({\n address,\n name,\n source,\n signer,\n }))\n allAccounts.push(...accounts)\n }\n }\n return allAccounts\n } catch (e) {\n console.error('Error during account formatting: ', e)\n return []\n }\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 unsubs[id] = unsub\n}\n\n// Unsubscribe to all unsubs\nexport const unsubAll = () => {\n Object.values(unsubs).forEach((unsub) => {\n unsub()\n })\n}\n"],"mappings":"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","names":["import_utils"]}
|
package/accounts/index.js
CHANGED
|
@@ -52,17 +52,18 @@ var updateAccounts = ({
|
|
|
52
52
|
// src/accounts/get.ts
|
|
53
53
|
var getAccountsFromExtensions = async (extensions, ss58) => {
|
|
54
54
|
try {
|
|
55
|
+
const extensionEntries = Array.from(extensions.entries()).filter(([, { extension }]) => extension !== null).map(
|
|
56
|
+
([source, { extension }]) => [source, extension]
|
|
57
|
+
);
|
|
58
|
+
const activeExtensions = extensionEntries.map(([, extension]) => extension);
|
|
55
59
|
const results = await Promise.allSettled(
|
|
56
|
-
|
|
57
|
-
({ extension }) => extension.accounts.get()
|
|
58
|
-
)
|
|
60
|
+
activeExtensions.map((extension) => extension.accounts.get())
|
|
59
61
|
);
|
|
60
62
|
const allAccounts = [];
|
|
61
|
-
const extensionEntries = Array.from(extensions.entries());
|
|
62
63
|
for (let i = 0; i < results.length; i++) {
|
|
63
64
|
const result = results[i];
|
|
64
65
|
const source = extensionEntries[i][0];
|
|
65
|
-
const signer = extensionEntries[i][1].
|
|
66
|
+
const signer = extensionEntries[i][1].signer;
|
|
66
67
|
if (result.status === "fulfilled" && signer) {
|
|
67
68
|
const { value } = result;
|
|
68
69
|
const accounts = formatExtensionAccounts(value, ss58).filter(
|
|
@@ -105,4 +106,4 @@ export {
|
|
|
105
106
|
};
|
|
106
107
|
/* @license Copyright 2024 w3ux authors & contributors
|
|
107
108
|
SPDX-License-Identifier: GPL-3.0-only */
|
|
108
|
-
//# sourceMappingURL=chunk-
|
|
109
|
+
//# sourceMappingURL=chunk-Z6C6MK4P.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 type {\n ExtensionAccount,\n ProcessExtensionAccountsResult,\n} from '@w3ux/types'\nimport { formatAccountSs58, isValidAddress } from '@w3ux/utils'\nimport { DefaultProcessExtensionResult } from '../consts'\nimport { _extensionAccounts } from '../subjects'\n\n// Gets accounts to be imported and commits them to state\n\ninterface Config {\n source: string\n ss58: number\n}\nexport const processExtensionAccounts = (\n config: Config,\n signer: unknown,\n newAccounts: ExtensionAccount[]\n): ProcessExtensionAccountsResult => {\n const { source, ss58 } = config\n if (!newAccounts.length) {\n return DefaultProcessExtensionResult\n }\n\n // Get valid accounts from extension\n newAccounts = formatExtensionAccounts(newAccounts, ss58)\n\n // Find any accounts that have been removed from this extension\n const removedAccounts = _extensionAccounts\n .getValue()\n .filter((j) => j.source === source)\n .filter((j) => !newAccounts.find((i) => i.address === j.address))\n\n // Remove accounts that have already been imported\n newAccounts = newAccounts.filter(\n ({ address }) =>\n !_extensionAccounts.getValue().find((j) => j.address === address)\n )\n\n // Format accounts properties\n newAccounts = newAccounts.map(({ address, name }) => ({\n address,\n name,\n source,\n signer,\n }))\n\n // Update observable state\n updateAccounts({\n add: newAccounts,\n remove: removedAccounts,\n })\n\n return {\n newAccounts,\n removedAccounts: [...removedAccounts],\n }\n}\n\n// Formats accounts to correct ss58 and removes invalid accounts\nexport const formatExtensionAccounts = (\n accounts: ExtensionAccount[],\n ss58: number\n) => {\n accounts = accounts\n // Remove accounts that do not contain correctly formatted addresses\n .filter(({ address }) => isValidAddress(address))\n // Reformat addresses to ensure default ss58 format\n .map((account) => {\n const formattedAddress = formatAccountSs58(account.address, ss58)\n if (!formattedAddress) {\n return null\n }\n account.address = formattedAddress\n return account\n })\n // Remove null entries resulting from invalid formatted addresses\n .filter((account) => account !== null)\n\n return accounts\n}\n\n// Updates accounts observable based on removed and added accounts\nexport const updateAccounts = ({\n add,\n remove,\n}: {\n add: ExtensionAccount[]\n remove: ExtensionAccount[]\n}) => {\n const newAccounts = [..._extensionAccounts.getValue()]\n .concat(add)\n .filter((a) => remove.find((s) => s.address === a.address) === undefined)\n _extensionAccounts.next(newAccounts)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n ExtensionAccount,\n ExtensionEnableResults,\n ExtensionInterface,\n} from '@w3ux/types'\nimport { formatExtensionAccounts } from './util'\n\n// Connects to provided extensions and gets all accounts\nexport const getAccountsFromExtensions = async (\n extensions: ExtensionEnableResults,\n ss58: number\n): Promise<ExtensionAccount[]> => {\n try {\n const extensionEntries = Array.from(extensions.entries())\n .filter(([, { extension }]) => extension !== null)\n .map(\n ([source, { extension }]) =>\n [source, extension] as [string, ExtensionInterface]\n )\n\n const activeExtensions = extensionEntries.map(([, extension]) => extension)\n\n const results = await Promise.allSettled(\n activeExtensions.map((extension) => extension.accounts.get())\n )\n\n const allAccounts: ExtensionAccount[] = []\n for (let i = 0; i < results.length; i++) {\n const result = results[i]\n const source = extensionEntries[i][0]\n const signer = extensionEntries[i][1].signer\n\n if (result.status === 'fulfilled' && signer) {\n const { value } = result\n\n // This is duplicating what `handleExtensionAccountsUpdate` is doing to accounts: --\n const accounts = formatExtensionAccounts(value, ss58)\n .filter(\n ({ address }) => !allAccounts.find((a) => address === a.address)\n )\n .map(({ address, name }) => ({\n address,\n name,\n source,\n signer,\n }))\n allAccounts.push(...accounts)\n }\n }\n return allAccounts\n } catch (e) {\n console.error('Error during account formatting: ', e)\n return []\n }\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 unsubs[id] = unsub\n}\n\n// Unsubscribe to all unsubs\nexport const unsubAll = () => {\n Object.values(unsubs).forEach((unsub) => {\n unsub()\n })\n}\n"],"mappings":"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","names":[]}
|
package/extensions/index.cjs
CHANGED
|
@@ -293,8 +293,9 @@ var initExtensions = async (dappName, extensionIds) => {
|
|
|
293
293
|
newStatus[id] = "connected";
|
|
294
294
|
});
|
|
295
295
|
Array.from(withError.entries()).forEach(([id, { error }]) => {
|
|
296
|
-
|
|
297
|
-
|
|
296
|
+
const errStr = String(error || "");
|
|
297
|
+
if (errStr.startsWith("Error")) {
|
|
298
|
+
if (errStr.substring(0, 17) === "NotInstalledError") {
|
|
298
299
|
delete newStatus[id];
|
|
299
300
|
} else {
|
|
300
301
|
newStatus[id] = "not_authenticated";
|
|
@@ -321,17 +322,18 @@ var filterFailedExtensions = (extensions2) => new Map(
|
|
|
321
322
|
// src/accounts/get.ts
|
|
322
323
|
var getAccountsFromExtensions = async (extensions2, ss58) => {
|
|
323
324
|
try {
|
|
325
|
+
const extensionEntries = Array.from(extensions2.entries()).filter(([, { extension }]) => extension !== null).map(
|
|
326
|
+
([source, { extension }]) => [source, extension]
|
|
327
|
+
);
|
|
328
|
+
const activeExtensions = extensionEntries.map(([, extension]) => extension);
|
|
324
329
|
const results = await Promise.allSettled(
|
|
325
|
-
|
|
326
|
-
({ extension }) => extension.accounts.get()
|
|
327
|
-
)
|
|
330
|
+
activeExtensions.map((extension) => extension.accounts.get())
|
|
328
331
|
);
|
|
329
332
|
const allAccounts = [];
|
|
330
|
-
const extensionEntries = Array.from(extensions2.entries());
|
|
331
333
|
for (let i = 0; i < results.length; i++) {
|
|
332
334
|
const result = results[i];
|
|
333
335
|
const source = extensionEntries[i][0];
|
|
334
|
-
const signer = extensionEntries[i][1].
|
|
336
|
+
const signer = extensionEntries[i][1].signer;
|
|
335
337
|
if (result.status === "fulfilled" && signer) {
|
|
336
338
|
const { value } = result;
|
|
337
339
|
const accounts = formatExtensionAccounts(value, ss58).filter(
|
package/extensions/index.cjs.map
CHANGED
|
@@ -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/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 unsubs[id] = unsub\n}\n\n// Unsubscribe to all unsubs\nexport const unsubAll = () => {\n Object.values(unsubs).forEach((unsub) => {\n unsub()\n })\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n ExtensionAccount,\n ProcessExtensionAccountsResult,\n} from '@w3ux/types'\nimport { formatAccountSs58, isValidAddress } from '@w3ux/utils'\nimport { DefaultProcessExtensionResult } from '../consts'\nimport { _extensionAccounts } from '../subjects'\n\n// Gets accounts to be imported and commits them to state\n\ninterface Config {\n source: string\n ss58: number\n}\nexport const processExtensionAccounts = (\n config: Config,\n signer: unknown,\n newAccounts: ExtensionAccount[]\n): ProcessExtensionAccountsResult => {\n const { source, ss58 } = config\n if (!newAccounts.length) {\n return DefaultProcessExtensionResult\n }\n\n // Get valid accounts from extension\n newAccounts = formatExtensionAccounts(newAccounts, ss58)\n\n // Find any accounts that have been removed from this extension\n const removedAccounts = _extensionAccounts\n .getValue()\n .filter((j) => j.source === source)\n .filter((j) => !newAccounts.find((i) => i.address === j.address))\n\n // Remove accounts that have already been imported\n newAccounts = newAccounts.filter(\n ({ address }) =>\n !_extensionAccounts.getValue().find((j) => j.address === address)\n )\n\n // Format accounts properties\n newAccounts = newAccounts.map(({ address, name }) => ({\n address,\n name,\n source,\n signer,\n }))\n\n // Update observable state\n updateAccounts({\n add: newAccounts,\n remove: removedAccounts,\n })\n\n return {\n newAccounts,\n removedAccounts: [...removedAccounts],\n }\n}\n\n// Formats accounts to correct ss58 and removes invalid accounts\nexport const formatExtensionAccounts = (\n accounts: ExtensionAccount[],\n ss58: number\n) => {\n accounts = accounts\n // Remove accounts that do not contain correctly formatted addresses\n .filter(({ address }) => isValidAddress(address))\n // Reformat addresses to ensure default ss58 format\n .map((account) => {\n const formattedAddress = formatAccountSs58(account.address, ss58)\n if (!formattedAddress) {\n return null\n }\n account.address = formattedAddress\n return account\n })\n // Remove null entries resulting from invalid formatted addresses\n .filter((account) => account !== null)\n\n return accounts\n}\n\n// Updates accounts observable based on removed and added accounts\nexport const updateAccounts = ({\n add,\n remove,\n}: {\n add: ExtensionAccount[]\n remove: ExtensionAccount[]\n}) => {\n const newAccounts = [..._extensionAccounts.getValue()]\n .concat(add)\n .filter((a) => remove.find((s) => s.address === a.address) === undefined)\n _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 newAccounts: [],\n removedAccounts: [],\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 ExtensionAccount,\n ExtensionsStatus,\n HardwareAccount,\n Sync,\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 getHardwareAccountsLocal()\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 const current = localStorageOrDefault<string[]>(ActiveExtensionsKey, [], true)\n return Array.isArray(current) ? current : []\n}\n\n// Check if an extension exists in local storage\nexport const isExtensionLocal = (id: string): boolean =>\n getActiveExtensionsLocal().includes(id)\n\n// Adds an extension to local storage\nexport const addExtensionToLocal = (id: string): void => {\n const current = getActiveExtensionsLocal()\n if (!current.includes(id)) {\n localStorage.setItem(ActiveExtensionsKey, JSON.stringify([...current, id]))\n }\n}\n\n// Removes extension from local storage\nexport const removeExtensionFromLocal = (id: string): void => {\n const current = getActiveExtensionsLocal()\n localStorage.setItem(\n ActiveExtensionsKey,\n JSON.stringify(current.filter((localId) => localId !== id))\n )\n}\n\n// Gets imported hardware accounts from local storage\nexport const getHardwareAccountsLocal = (): HardwareAccount[] => {\n const accounts = localStorageOrDefault(\n HardwareAccountsKey,\n [],\n true\n ) as HardwareAccount[]\n\n return accounts\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 _extensionAccounts,\n _extensionsStatus,\n _hardwareAccounts,\n _reconnectSync,\n} from './subjects'\n\n// Gets an extension status\nexport const getStatus = (id: string): ExtensionStatus =>\n _extensionsStatus.getValue()[id] || undefined\n\n// Sets an extension status\nexport const setStatus = (id: string, status: ExtensionStatus) => {\n const newValue = { ..._extensionsStatus.getValue() }\n newValue[id] = status\n _extensionsStatus.next(newValue)\n}\n\n// Removes an extension status\nexport const removeStatus = (id: string) => {\n const { [id]: _, ...rest } = _extensionsStatus.getValue()\n _extensionsStatus.next(rest)\n}\n\n// Whether an extension can be connected\nexport const canConnect = (id: string) =>\n ![undefined, 'connected'].includes(_extensionsStatus.getValue()[id])\n\n// Reset accounts\nexport const resetAccounts = () => {\n _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 _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 _hardwareAccounts.next(accounts)\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 ss58: number,\n id: string,\n extension: ExtensionInterface,\n accounts: ExtensionAccount[]\n) => {\n processExtensionAccounts(\n {\n source: id,\n ss58,\n },\n extension.signer,\n accounts\n )\n}\n\n// Connects to a single extension and processes its accounts\nexport const connectExtension = async (\n dappName: string,\n ss58: number,\n id: string\n): Promise<boolean> => {\n if (canConnect(id)) {\n const { connected } = await initExtensions(dappName, [id])\n if (connected.size === 0) {\n return false\n }\n const result = connected.get(id)\n const extension = result?.extension\n const canSubscribe =\n !!extension && typeof extension.accounts.subscribe === 'function'\n\n // If account subscriptions are not supported, simply get the account(s) from the extension,\n // otherwise, subscribe to accounts\n if (extension) {\n if (!canSubscribe) {\n const accounts = await extension.accounts.get()\n handleAccounts(ss58, id, extension, accounts)\n } else {\n const unsub = extension.accounts.subscribe((accounts) => {\n handleAccounts(ss58, id, extension, accounts)\n })\n addUnsub(id, unsub)\n }\n }\n return true\n }\n return 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 _gettingExtensions.next(true)\n let injectedWeb3Interval: ReturnType<typeof setInterval> | undefined =\n undefined\n\n // Format installed extensions\n const formatInstalled = () =>\n Object.keys(extensions).reduce(\n (acc, key) => {\n acc[key] =\n window?.injectedWeb3?.[key] !== undefined ? 'installed' : acc[key]\n return acc\n },\n { ..._extensionsStatus.getValue() }\n )\n\n // Handle completed interval check\n const handleCompleted = async (foundExtensions: boolean) => {\n clearInterval(injectedWeb3Interval)\n if (foundExtensions) {\n _extensionsStatus.next(formatInstalled())\n }\n _gettingExtensions.next(false)\n }\n\n const interval = 200\n const maxChecks = 10\n const minVerifications = 2\n\n // Getter for the currently installed extensions\n let counter = 0\n let verifications = 0\n injectedWeb3Interval = setInterval(() => {\n counter++\n if (counter === maxChecks) {\n handleCompleted(false)\n } else {\n const injected = window?.injectedWeb3\n\n // Check if injected exists and all extensions have a valid enable function\n const ready =\n injected !== undefined &&\n Object.entries(injected).every(\n ([, ext]) => ext && typeof ext.enable === 'function'\n )\n\n // Increment verifications if the extensions are ready\n if (ready) {\n verifications++\n } else {\n verifications = 0\n }\n\n if (counter > 2 && verifications >= minVerifications) {\n handleCompleted(true)\n }\n }\n }, interval)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n ExtensionEnableResult,\n ExtensionEnableResults,\n ExtensionInterface,\n} from '@w3ux/types'\nimport { withTimeoutThrow } from '@w3ux/utils'\n\n// Get extensions and enable them\nexport const enableExtensions = async (ids: string[], dappName: string) => {\n const extensionIds = getExtensionsById(ids)\n const enableResults = await doEnable(extensionIds, dappName)\n\n return formatEnabledExtensions(extensionIds, enableResults)\n}\n\n// Gets extensions from injectedWeb3 by their ids\nconst getExtensionsById = (ids: string[]) => {\n const validIds: string[] = []\n ids.forEach((id) => {\n const enable = window.injectedWeb3?.[id]?.enable\n if (enable !== undefined && typeof enable === 'function') {\n validIds.push(id)\n }\n })\n return validIds\n}\n\n// Calls enable for the provided extensions\nconst doEnable = async (\n extensionIds: string[],\n dappName: string\n): Promise<PromiseSettledResult<ExtensionInterface>[]> =>\n await Promise.allSettled(\n Array.from(extensionIds).map(\n (id) =>\n withTimeoutThrow(\n 1000,\n window.injectedWeb3![id].enable(dappName)\n ) as Promise<ExtensionInterface>\n )\n )\n\nconst formatEnabledExtensions = (\n extensionIds: string[],\n enabledResults: PromiseSettledResult<ExtensionInterface>[]\n): ExtensionEnableResults => {\n const extensionsState = new Map<string, ExtensionEnableResult>()\n\n for (let i = 0; i < enabledResults.length; i++) {\n const result = enabledResults[i]\n const id = extensionIds[i]\n\n if (result.status === 'fulfilled') {\n extensionsState.set(id, {\n extension: result.value,\n connected: true,\n })\n } else if (result.status === 'rejected') {\n extensionsState.set(id, {\n extension: null,\n connected: false,\n error: result.reason,\n })\n }\n }\n return 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 dappName: string,\n extensionIds: string[]\n): Promise<{ connected: ExtensionEnableResults }> => {\n if (!extensionIds.length) {\n return {\n connected: new Map(),\n }\n }\n // Get extensions and enable them\n const enableResults = await enableExtensions(extensionIds, dappName)\n\n // Determine which extensions are connected and which have errors\n const [connected, withError] = [\n filterConnectedExtensions(enableResults),\n filterFailedExtensions(enableResults),\n ]\n\n // Manage local storage depending on connection status\n Array.from(connected.keys()).forEach((id) => addExtensionToLocal(id))\n Array.from(withError.keys()).forEach((id) => removeExtensionFromLocal(id))\n\n // Handle new extension statuses\n const newStatus = { ..._extensionsStatus.getValue() }\n Array.from(connected.keys()).forEach((id) => {\n newStatus[id] = 'connected'\n })\n Array.from(withError.entries()).forEach(([id, { error }]) => {\n if (error?.startsWith('Error')) {\n // Extension not found - remove from state\n if (error.substring(0, 17) === 'NotInstalledError') {\n delete newStatus[id]\n } else {\n // Assume extension not authenticated\n newStatus[id] = 'not_authenticated'\n }\n }\n })\n\n // Record initialised extensions\n const newInitialised = [..._initialisedExtensions.getValue()]\n extensionIds.forEach((id) => {\n if (!newInitialised.includes(id)) {\n newInitialised.push(id)\n }\n })\n\n // Commit updates to observables\n _extensionsStatus.next(newStatus)\n _initialisedExtensions.next(newInitialised)\n\n return { connected }\n}\n\n// Filter successfully connected extensions\nconst filterConnectedExtensions = (\n extensions: ExtensionEnableResults\n): ExtensionEnableResults =>\n new Map(\n Array.from(extensions.entries()).filter(([, state]) => state.connected)\n )\n\n// Filter extensions that failed to connect\nconst filterFailedExtensions = (\n extensions: ExtensionEnableResults\n): ExtensionEnableResults =>\n new Map(\n Array.from(extensions.entries()).filter(([, state]) => !state.connected)\n )\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExtensionAccount, ExtensionEnableResults } from '@w3ux/types'\nimport { formatExtensionAccounts } from './util'\n\n// Connects to provided extensions and gets all accounts\nexport const getAccountsFromExtensions = async (\n extensions: ExtensionEnableResults,\n ss58: number\n): Promise<ExtensionAccount[]> => {\n try {\n const results = await Promise.allSettled(\n Array.from(extensions.values()).map(({ extension }) =>\n extension!.accounts.get()\n )\n )\n\n const allAccounts: ExtensionAccount[] = []\n const extensionEntries = Array.from(extensions.entries())\n for (let i = 0; i < results.length; i++) {\n const result = results[i]\n const source = extensionEntries[i][0]\n const signer = extensionEntries[i][1].extension!.signer\n\n if (result.status === 'fulfilled' && signer) {\n const { value } = result\n\n // This is duplicating what `handleExtensionAccountsUpdate` is doing to accounts: --\n const accounts = formatExtensionAccounts(value, ss58)\n .filter(\n ({ address }) => !allAccounts.find((a) => address === a.address)\n )\n .map(({ address, name }) => ({\n address,\n name,\n source,\n signer,\n }))\n allAccounts.push(...accounts)\n }\n }\n return allAccounts\n } catch (e) {\n console.error('Error during account formatting: ', e)\n return []\n }\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { initExtensions } from '.'\nimport {\n addUnsub,\n getAccountsFromExtensions,\n processExtensionAccounts,\n updateAccounts,\n} from '../accounts/index'\nimport { getActiveExtensionsLocal } from '../local'\nimport { setReconnectSync } from '../util'\n\nexport const reconnectExtensions = async (dappName: string, ss58: number) => {\n setReconnectSync('syncing')\n const { connected } = await initExtensions(\n dappName,\n getActiveExtensionsLocal()\n )\n if (connected.size > 0) {\n // Perform initial account state update\n updateAccounts({\n add: await getAccountsFromExtensions(connected, ss58),\n remove: [],\n })\n\n // If available, subscribe to accounts for each connected extension\n for (const [id, { extension }] of Array.from(connected.entries())) {\n if (typeof extension!.accounts.subscribe === 'function') {\n const unsub = extension!.accounts.subscribe((accounts) => {\n processExtensionAccounts(\n {\n source: id,\n ss58,\n },\n extension!.signer,\n accounts\n )\n })\n addUnsub(id, unsub)\n }\n }\n }\n setReconnectSync('synced')\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACIO,IAAM,SAAqC,CAAC;AAG5C,IAAM,WAAW,CAAC,IAAY,UAAsB;AACzD,SAAO,EAAE,IAAI;AACf;;;ACFA,IAAAA,gBAAkD;;;ACF3C,IAAM,gCAAgE;AAAA,EAC3E,aAAa,CAAC;AAAA,EACd,iBAAiB,CAAC;AACpB;AAGO,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;;;ACHnC,kBAAgC;;;ACLhC,mBAAsC;AAI/B,IAAM,2BAA2B,MAAgB;AACtD,QAAM,cAAU,oCAAgC,qBAAqB,CAAC,GAAG,IAAI;AAC7E,SAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC;AAC7C;AAOO,IAAM,sBAAsB,CAAC,OAAqB;AACvD,QAAM,UAAU,yBAAyB;AACzC,MAAI,CAAC,QAAQ,SAAS,EAAE,GAAG;AACzB,iBAAa,QAAQ,qBAAqB,KAAK,UAAU,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC;AAAA,EAC5E;AACF;AAGO,IAAM,2BAA2B,CAAC,OAAqB;AAC5D,QAAM,UAAU,yBAAyB;AACzC,eAAa;AAAA,IACX;AAAA,IACA,KAAK,UAAU,QAAQ,OAAO,CAAC,YAAY,YAAY,EAAE,CAAC;AAAA,EAC5D;AACF;AAGO,IAAM,2BAA2B,MAAyB;AAC/D,QAAM,eAAW;AAAA,IACf;AAAA,IACA,CAAC;AAAA,IACD;AAAA,EACF;AAEA,SAAO;AACT;;;AD7BO,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,EACnC,yBAAyB;AAC3B;;;AFJO,IAAM,2BAA2B,CACtC,QACA,QACA,gBACmC;AACnC,QAAM,EAAE,QAAQ,KAAK,IAAI;AACzB,MAAI,CAAC,YAAY,QAAQ;AACvB,WAAO;AAAA,EACT;AAGA,gBAAc,wBAAwB,aAAa,IAAI;AAGvD,QAAM,kBAAkB,mBACrB,SAAS,EACT,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,EACjC,OAAO,CAAC,MAAM,CAAC,YAAY,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC;AAGlE,gBAAc,YAAY;AAAA,IACxB,CAAC,EAAE,QAAQ,MACT,CAAC,mBAAmB,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,OAAO;AAAA,EACpE;AAGA,gBAAc,YAAY,IAAI,CAAC,EAAE,SAAS,KAAK,OAAO;AAAA,IACpD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE;AAGF,iBAAe;AAAA,IACb,KAAK;AAAA,IACL,QAAQ;AAAA,EACV,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA,iBAAiB,CAAC,GAAG,eAAe;AAAA,EACtC;AACF;AAGO,IAAM,0BAA0B,CACrC,UACA,SACG;AACH,aAAW,SAER,OAAO,CAAC,EAAE,QAAQ,UAAM,8BAAe,OAAO,CAAC,EAE/C,IAAI,CAAC,YAAY;AAChB,UAAM,uBAAmB,iCAAkB,QAAQ,SAAS,IAAI;AAChE,QAAI,CAAC,kBAAkB;AACrB,aAAO;AAAA,IACT;AACA,YAAQ,UAAU;AAClB,WAAO;AAAA,EACT,CAAC,EAEA,OAAO,CAAC,YAAY,YAAY,IAAI;AAEvC,SAAO;AACT;AAGO,IAAM,iBAAiB,CAAC;AAAA,EAC7B;AAAA,EACA;AACF,MAGM;AACJ,QAAM,cAAc,CAAC,GAAG,mBAAmB,SAAS,CAAC,EAClD,OAAO,GAAG,EACV,OAAO,CAAC,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,MAAM,MAAS;AAC1E,qBAAmB,KAAK,WAAW;AACrC;;;AIpEO,IAAM,aAAa,CAAC,OACzB,CAAC,CAAC,QAAW,WAAW,EAAE,SAAS,kBAAkB,SAAS,EAAE,EAAE,CAAC;AAW9D,IAAM,mBAAmB,CAAC,SAAe;AAC9C,iBAAe,KAAK,IAAI;AAC1B;;;ACjCA,IAAM,iBAAiB,CACrB,MACA,IACA,WACA,aACG;AACH;AAAA,IACE;AAAA,MACE,QAAQ;AAAA,MACR;AAAA,IACF;AAAA,IACA,UAAU;AAAA,IACV;AAAA,EACF;AACF;AAGO,IAAM,mBAAmB,OAC9B,UACA,MACA,OACqB;AACrB,MAAI,WAAW,EAAE,GAAG;AAClB,UAAM,EAAE,UAAU,IAAI,MAAM,eAAe,UAAU,CAAC,EAAE,CAAC;AACzD,QAAI,UAAU,SAAS,GAAG;AACxB,aAAO;AAAA,IACT;AACA,UAAM,SAAS,UAAU,IAAI,EAAE;AAC/B,UAAM,YAAY,QAAQ;AAC1B,UAAM,eACJ,CAAC,CAAC,aAAa,OAAO,UAAU,SAAS,cAAc;AAIzD,QAAI,WAAW;AACb,UAAI,CAAC,cAAc;AACjB,cAAM,WAAW,MAAM,UAAU,SAAS,IAAI;AAC9C,uBAAe,MAAM,IAAI,WAAW,QAAQ;AAAA,MAC9C,OAAO;AACL,cAAM,QAAQ,UAAU,SAAS,UAAU,CAAC,aAAa;AACvD,yBAAe,MAAM,IAAI,WAAW,QAAQ;AAAA,QAC9C,CAAC;AACD,iBAAS,IAAI,KAAK;AAAA,MACpB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;ACvDA,8BAAuB;AAIhB,IAAM,gBAAgB,YAAY;AACvC,qBAAmB,KAAK,IAAI;AAC5B,MAAI,uBACF;AAGF,QAAM,kBAAkB,MACtB,OAAO,KAAK,wBAAAC,OAAU,EAAE;AAAA,IACtB,CAAC,KAAK,QAAQ;AACZ,UAAI,GAAG,IACL,QAAQ,eAAe,GAAG,MAAM,SAAY,cAAc,IAAI,GAAG;AACnE,aAAO;AAAA,IACT;AAAA,IACA,EAAE,GAAG,kBAAkB,SAAS,EAAE;AAAA,EACpC;AAGF,QAAM,kBAAkB,OAAO,oBAA6B;AAC1D,kBAAc,oBAAoB;AAClC,QAAI,iBAAiB;AACnB,wBAAkB,KAAK,gBAAgB,CAAC;AAAA,IAC1C;AACA,uBAAmB,KAAK,KAAK;AAAA,EAC/B;AAEA,QAAM,WAAW;AACjB,QAAM,YAAY;AAClB,QAAM,mBAAmB;AAGzB,MAAI,UAAU;AACd,MAAI,gBAAgB;AACpB,yBAAuB,YAAY,MAAM;AACvC;AACA,QAAI,YAAY,WAAW;AACzB,sBAAgB,KAAK;AAAA,IACvB,OAAO;AACL,YAAM,WAAW,QAAQ;AAGzB,YAAM,QACJ,aAAa,UACb,OAAO,QAAQ,QAAQ,EAAE;AAAA,QACvB,CAAC,CAAC,EAAE,GAAG,MAAM,OAAO,OAAO,IAAI,WAAW;AAAA,MAC5C;AAGF,UAAI,OAAO;AACT;AAAA,MACF,OAAO;AACL,wBAAgB;AAAA,MAClB;AAEA,UAAI,UAAU,KAAK,iBAAiB,kBAAkB;AACpD,wBAAgB,IAAI;AAAA,MACtB;AAAA,IACF;AAAA,EACF,GAAG,QAAQ;AACb;;;ACzDA,IAAAC,gBAAiC;AAG1B,IAAM,mBAAmB,OAAO,KAAe,aAAqB;AACzE,QAAM,eAAe,kBAAkB,GAAG;AAC1C,QAAM,gBAAgB,MAAM,SAAS,cAAc,QAAQ;AAE3D,SAAO,wBAAwB,cAAc,aAAa;AAC5D;AAGA,IAAM,oBAAoB,CAAC,QAAkB;AAC3C,QAAM,WAAqB,CAAC;AAC5B,MAAI,QAAQ,CAAC,OAAO;AAClB,UAAM,SAAS,OAAO,eAAe,EAAE,GAAG;AAC1C,QAAI,WAAW,UAAa,OAAO,WAAW,YAAY;AACxD,eAAS,KAAK,EAAE;AAAA,IAClB;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAGA,IAAM,WAAW,OACf,cACA,aAEA,MAAM,QAAQ;AAAA,EACZ,MAAM,KAAK,YAAY,EAAE;AAAA,IACvB,CAAC,WACC;AAAA,MACE;AAAA,MACA,OAAO,aAAc,EAAE,EAAE,OAAO,QAAQ;AAAA,IAC1C;AAAA,EACJ;AACF;AAEF,IAAM,0BAA0B,CAC9B,cACA,mBAC2B;AAC3B,QAAM,kBAAkB,oBAAI,IAAmC;AAE/D,WAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;AAC9C,UAAM,SAAS,eAAe,CAAC;AAC/B,UAAM,KAAK,aAAa,CAAC;AAEzB,QAAI,OAAO,WAAW,aAAa;AACjC,sBAAgB,IAAI,IAAI;AAAA,QACtB,WAAW,OAAO;AAAA,QAClB,WAAW;AAAA,MACb,CAAC;AAAA,IACH,WAAW,OAAO,WAAW,YAAY;AACvC,sBAAgB,IAAI,IAAI;AAAA,QACtB,WAAW;AAAA,QACX,WAAW;AAAA,QACX,OAAO,OAAO;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;;;AC5DO,IAAM,iBAAiB,OAC5B,UACA,iBACmD;AACnD,MAAI,CAAC,aAAa,QAAQ;AACxB,WAAO;AAAA,MACL,WAAW,oBAAI,IAAI;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,gBAAgB,MAAM,iBAAiB,cAAc,QAAQ;AAGnE,QAAM,CAAC,WAAW,SAAS,IAAI;AAAA,IAC7B,0BAA0B,aAAa;AAAA,IACvC,uBAAuB,aAAa;AAAA,EACtC;AAGA,QAAM,KAAK,UAAU,KAAK,CAAC,EAAE,QAAQ,CAAC,OAAO,oBAAoB,EAAE,CAAC;AACpE,QAAM,KAAK,UAAU,KAAK,CAAC,EAAE,QAAQ,CAAC,OAAO,yBAAyB,EAAE,CAAC;AAGzE,QAAM,YAAY,EAAE,GAAG,kBAAkB,SAAS,EAAE;AACpD,QAAM,KAAK,UAAU,KAAK,CAAC,EAAE,QAAQ,CAAC,OAAO;AAC3C,cAAU,EAAE,IAAI;AAAA,EAClB,CAAC;AACD,QAAM,KAAK,UAAU,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM;AAC3D,QAAI,OAAO,WAAW,OAAO,GAAG;AAE9B,UAAI,MAAM,UAAU,GAAG,EAAE,MAAM,qBAAqB;AAClD,eAAO,UAAU,EAAE;AAAA,MACrB,OAAO;AAEL,kBAAU,EAAE,IAAI;AAAA,MAClB;AAAA,IACF;AAAA,EACF,CAAC;AAGD,QAAM,iBAAiB,CAAC,GAAG,uBAAuB,SAAS,CAAC;AAC5D,eAAa,QAAQ,CAAC,OAAO;AAC3B,QAAI,CAAC,eAAe,SAAS,EAAE,GAAG;AAChC,qBAAe,KAAK,EAAE;AAAA,IACxB;AAAA,EACF,CAAC;AAGD,oBAAkB,KAAK,SAAS;AAChC,yBAAuB,KAAK,cAAc;AAE1C,SAAO,EAAE,UAAU;AACrB;AAGA,IAAM,4BAA4B,CAChCC,gBAEA,IAAI;AAAA,EACF,MAAM,KAAKA,YAAW,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,MAAM,SAAS;AACxE;AAGF,IAAM,yBAAyB,CAC7BA,gBAEA,IAAI;AAAA,EACF,MAAM,KAAKA,YAAW,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,MAAM,SAAS;AACzE;;;ACtEK,IAAM,4BAA4B,OACvCC,aACA,SACgC;AAChC,MAAI;AACF,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC5B,MAAM,KAAKA,YAAW,OAAO,CAAC,EAAE;AAAA,QAAI,CAAC,EAAE,UAAU,MAC/C,UAAW,SAAS,IAAI;AAAA,MAC1B;AAAA,IACF;AAEA,UAAM,cAAkC,CAAC;AACzC,UAAM,mBAAmB,MAAM,KAAKA,YAAW,QAAQ,CAAC;AACxD,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAM,SAAS,QAAQ,CAAC;AACxB,YAAM,SAAS,iBAAiB,CAAC,EAAE,CAAC;AACpC,YAAM,SAAS,iBAAiB,CAAC,EAAE,CAAC,EAAE,UAAW;AAEjD,UAAI,OAAO,WAAW,eAAe,QAAQ;AAC3C,cAAM,EAAE,MAAM,IAAI;AAGlB,cAAM,WAAW,wBAAwB,OAAO,IAAI,EACjD;AAAA,UACC,CAAC,EAAE,QAAQ,MAAM,CAAC,YAAY,KAAK,CAAC,MAAM,YAAY,EAAE,OAAO;AAAA,QACjE,EACC,IAAI,CAAC,EAAE,SAAS,KAAK,OAAO;AAAA,UAC3B;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,EAAE;AACJ,oBAAY,KAAK,GAAG,QAAQ;AAAA,MAC9B;AAAA,IACF;AACA,WAAO;AAAA,EACT,SAAS,GAAG;AACV,YAAQ,MAAM,qCAAqC,CAAC;AACpD,WAAO,CAAC;AAAA,EACV;AACF;;;AClCO,IAAM,sBAAsB,OAAO,UAAkB,SAAiB;AAC3E,mBAAiB,SAAS;AAC1B,QAAM,EAAE,UAAU,IAAI,MAAM;AAAA,IAC1B;AAAA,IACA,yBAAyB;AAAA,EAC3B;AACA,MAAI,UAAU,OAAO,GAAG;AAEtB,mBAAe;AAAA,MACb,KAAK,MAAM,0BAA0B,WAAW,IAAI;AAAA,MACpD,QAAQ,CAAC;AAAA,IACX,CAAC;AAGD,eAAW,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,MAAM,KAAK,UAAU,QAAQ,CAAC,GAAG;AACjE,UAAI,OAAO,UAAW,SAAS,cAAc,YAAY;AACvD,cAAM,QAAQ,UAAW,SAAS,UAAU,CAAC,aAAa;AACxD;AAAA,YACE;AAAA,cACE,QAAQ;AAAA,cACR;AAAA,YACF;AAAA,YACA,UAAW;AAAA,YACX;AAAA,UACF;AAAA,QACF,CAAC;AACD,iBAAS,IAAI,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AACA,mBAAiB,QAAQ;AAC3B;","names":["import_utils","extensions","import_utils","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 unsubs[id] = unsub\n}\n\n// Unsubscribe to all unsubs\nexport const unsubAll = () => {\n Object.values(unsubs).forEach((unsub) => {\n unsub()\n })\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n ExtensionAccount,\n ProcessExtensionAccountsResult,\n} from '@w3ux/types'\nimport { formatAccountSs58, isValidAddress } from '@w3ux/utils'\nimport { DefaultProcessExtensionResult } from '../consts'\nimport { _extensionAccounts } from '../subjects'\n\n// Gets accounts to be imported and commits them to state\n\ninterface Config {\n source: string\n ss58: number\n}\nexport const processExtensionAccounts = (\n config: Config,\n signer: unknown,\n newAccounts: ExtensionAccount[]\n): ProcessExtensionAccountsResult => {\n const { source, ss58 } = config\n if (!newAccounts.length) {\n return DefaultProcessExtensionResult\n }\n\n // Get valid accounts from extension\n newAccounts = formatExtensionAccounts(newAccounts, ss58)\n\n // Find any accounts that have been removed from this extension\n const removedAccounts = _extensionAccounts\n .getValue()\n .filter((j) => j.source === source)\n .filter((j) => !newAccounts.find((i) => i.address === j.address))\n\n // Remove accounts that have already been imported\n newAccounts = newAccounts.filter(\n ({ address }) =>\n !_extensionAccounts.getValue().find((j) => j.address === address)\n )\n\n // Format accounts properties\n newAccounts = newAccounts.map(({ address, name }) => ({\n address,\n name,\n source,\n signer,\n }))\n\n // Update observable state\n updateAccounts({\n add: newAccounts,\n remove: removedAccounts,\n })\n\n return {\n newAccounts,\n removedAccounts: [...removedAccounts],\n }\n}\n\n// Formats accounts to correct ss58 and removes invalid accounts\nexport const formatExtensionAccounts = (\n accounts: ExtensionAccount[],\n ss58: number\n) => {\n accounts = accounts\n // Remove accounts that do not contain correctly formatted addresses\n .filter(({ address }) => isValidAddress(address))\n // Reformat addresses to ensure default ss58 format\n .map((account) => {\n const formattedAddress = formatAccountSs58(account.address, ss58)\n if (!formattedAddress) {\n return null\n }\n account.address = formattedAddress\n return account\n })\n // Remove null entries resulting from invalid formatted addresses\n .filter((account) => account !== null)\n\n return accounts\n}\n\n// Updates accounts observable based on removed and added accounts\nexport const updateAccounts = ({\n add,\n remove,\n}: {\n add: ExtensionAccount[]\n remove: ExtensionAccount[]\n}) => {\n const newAccounts = [..._extensionAccounts.getValue()]\n .concat(add)\n .filter((a) => remove.find((s) => s.address === a.address) === undefined)\n _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 newAccounts: [],\n removedAccounts: [],\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 ExtensionAccount,\n ExtensionsStatus,\n HardwareAccount,\n Sync,\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 getHardwareAccountsLocal()\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 const current = localStorageOrDefault<string[]>(ActiveExtensionsKey, [], true)\n return Array.isArray(current) ? current : []\n}\n\n// Check if an extension exists in local storage\nexport const isExtensionLocal = (id: string): boolean =>\n getActiveExtensionsLocal().includes(id)\n\n// Adds an extension to local storage\nexport const addExtensionToLocal = (id: string): void => {\n const current = getActiveExtensionsLocal()\n if (!current.includes(id)) {\n localStorage.setItem(ActiveExtensionsKey, JSON.stringify([...current, id]))\n }\n}\n\n// Removes extension from local storage\nexport const removeExtensionFromLocal = (id: string): void => {\n const current = getActiveExtensionsLocal()\n localStorage.setItem(\n ActiveExtensionsKey,\n JSON.stringify(current.filter((localId) => localId !== id))\n )\n}\n\n// Gets imported hardware accounts from local storage\nexport const getHardwareAccountsLocal = (): HardwareAccount[] => {\n const accounts = localStorageOrDefault(\n HardwareAccountsKey,\n [],\n true\n ) as HardwareAccount[]\n\n return accounts\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 _extensionAccounts,\n _extensionsStatus,\n _hardwareAccounts,\n _reconnectSync,\n} from './subjects'\n\n// Gets an extension status\nexport const getStatus = (id: string): ExtensionStatus =>\n _extensionsStatus.getValue()[id] || undefined\n\n// Sets an extension status\nexport const setStatus = (id: string, status: ExtensionStatus) => {\n const newValue = { ..._extensionsStatus.getValue() }\n newValue[id] = status\n _extensionsStatus.next(newValue)\n}\n\n// Removes an extension status\nexport const removeStatus = (id: string) => {\n const { [id]: _, ...rest } = _extensionsStatus.getValue()\n _extensionsStatus.next(rest)\n}\n\n// Whether an extension can be connected\nexport const canConnect = (id: string) =>\n ![undefined, 'connected'].includes(_extensionsStatus.getValue()[id])\n\n// Reset accounts\nexport const resetAccounts = () => {\n _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 _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 _hardwareAccounts.next(accounts)\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 ss58: number,\n id: string,\n extension: ExtensionInterface,\n accounts: ExtensionAccount[]\n) => {\n processExtensionAccounts(\n {\n source: id,\n ss58,\n },\n extension.signer,\n accounts\n )\n}\n\n// Connects to a single extension and processes its accounts\nexport const connectExtension = async (\n dappName: string,\n ss58: number,\n id: string\n): Promise<boolean> => {\n if (canConnect(id)) {\n const { connected } = await initExtensions(dappName, [id])\n if (connected.size === 0) {\n return false\n }\n const result = connected.get(id)\n const extension = result?.extension\n const canSubscribe =\n !!extension && typeof extension.accounts.subscribe === 'function'\n\n // If account subscriptions are not supported, simply get the account(s) from the extension,\n // otherwise, subscribe to accounts\n if (extension) {\n if (!canSubscribe) {\n const accounts = await extension.accounts.get()\n handleAccounts(ss58, id, extension, accounts)\n } else {\n const unsub = extension.accounts.subscribe((accounts) => {\n handleAccounts(ss58, id, extension, accounts)\n })\n addUnsub(id, unsub)\n }\n }\n return true\n }\n return 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 _gettingExtensions.next(true)\n let injectedWeb3Interval: ReturnType<typeof setInterval> | undefined =\n undefined\n\n // Format installed extensions\n const formatInstalled = () =>\n Object.keys(extensions).reduce(\n (acc, key) => {\n acc[key] =\n window?.injectedWeb3?.[key] !== undefined ? 'installed' : acc[key]\n return acc\n },\n { ..._extensionsStatus.getValue() }\n )\n\n // Handle completed interval check\n const handleCompleted = async (foundExtensions: boolean) => {\n clearInterval(injectedWeb3Interval)\n if (foundExtensions) {\n _extensionsStatus.next(formatInstalled())\n }\n _gettingExtensions.next(false)\n }\n\n const interval = 200\n const maxChecks = 10\n const minVerifications = 2\n\n // Getter for the currently installed extensions\n let counter = 0\n let verifications = 0\n injectedWeb3Interval = setInterval(() => {\n counter++\n if (counter === maxChecks) {\n handleCompleted(false)\n } else {\n const injected = window?.injectedWeb3\n\n // Check if injected exists and all extensions have a valid enable function\n const ready =\n injected !== undefined &&\n Object.entries(injected).every(\n ([, ext]) => ext && typeof ext.enable === 'function'\n )\n\n // Increment verifications if the extensions are ready\n if (ready) {\n verifications++\n } else {\n verifications = 0\n }\n\n if (counter > 2 && verifications >= minVerifications) {\n handleCompleted(true)\n }\n }\n }, interval)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n ExtensionEnableResult,\n ExtensionEnableResults,\n ExtensionInterface,\n} from '@w3ux/types'\nimport { withTimeoutThrow } from '@w3ux/utils'\n\n// Get extensions and enable them\nexport const enableExtensions = async (ids: string[], dappName: string) => {\n const extensionIds = getExtensionsById(ids)\n const enableResults = await doEnable(extensionIds, dappName)\n\n return formatEnabledExtensions(extensionIds, enableResults)\n}\n\n// Gets extensions from injectedWeb3 by their ids\nconst getExtensionsById = (ids: string[]) => {\n const validIds: string[] = []\n ids.forEach((id) => {\n const enable = window.injectedWeb3?.[id]?.enable\n if (enable !== undefined && typeof enable === 'function') {\n validIds.push(id)\n }\n })\n return validIds\n}\n\n// Calls enable for the provided extensions\nconst doEnable = async (\n extensionIds: string[],\n dappName: string\n): Promise<PromiseSettledResult<ExtensionInterface>[]> =>\n await Promise.allSettled(\n Array.from(extensionIds).map(\n (id) =>\n withTimeoutThrow(\n 1000,\n window.injectedWeb3![id].enable(dappName)\n ) as Promise<ExtensionInterface>\n )\n )\n\nconst formatEnabledExtensions = (\n extensionIds: string[],\n enabledResults: PromiseSettledResult<ExtensionInterface>[]\n): ExtensionEnableResults => {\n const extensionsState = new Map<string, ExtensionEnableResult>()\n\n for (let i = 0; i < enabledResults.length; i++) {\n const result = enabledResults[i]\n const id = extensionIds[i]\n\n if (result.status === 'fulfilled') {\n extensionsState.set(id, {\n extension: result.value,\n connected: true,\n })\n } else if (result.status === 'rejected') {\n extensionsState.set(id, {\n extension: null,\n connected: false,\n error: result.reason,\n })\n }\n }\n return 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 dappName: string,\n extensionIds: string[]\n): Promise<{ connected: ExtensionEnableResults }> => {\n if (!extensionIds.length) {\n return {\n connected: new Map(),\n }\n }\n // Get extensions and enable them\n const enableResults = await enableExtensions(extensionIds, dappName)\n\n // Determine which extensions are connected and which have errors\n const [connected, withError] = [\n filterConnectedExtensions(enableResults),\n filterFailedExtensions(enableResults),\n ]\n\n // Manage local storage depending on connection status\n Array.from(connected.keys()).forEach((id) => addExtensionToLocal(id))\n Array.from(withError.keys()).forEach((id) => removeExtensionFromLocal(id))\n\n // Handle new extension statuses\n const newStatus = { ..._extensionsStatus.getValue() }\n Array.from(connected.keys()).forEach((id) => {\n newStatus[id] = 'connected'\n })\n Array.from(withError.entries()).forEach(([id, { error }]) => {\n const errStr = String(error || '')\n if (errStr.startsWith('Error')) {\n // Extension not found - remove from state\n if (errStr.substring(0, 17) === 'NotInstalledError') {\n delete newStatus[id]\n } else {\n // Assume extension not authenticated\n newStatus[id] = 'not_authenticated'\n }\n }\n })\n\n // Record initialised extensions\n const newInitialised = [..._initialisedExtensions.getValue()]\n extensionIds.forEach((id) => {\n if (!newInitialised.includes(id)) {\n newInitialised.push(id)\n }\n })\n\n // Commit updates to observables\n _extensionsStatus.next(newStatus)\n _initialisedExtensions.next(newInitialised)\n\n return { connected }\n}\n\n// Filter successfully connected extensions\nconst filterConnectedExtensions = (\n extensions: ExtensionEnableResults\n): ExtensionEnableResults =>\n new Map(\n Array.from(extensions.entries()).filter(([, state]) => state.connected)\n )\n\n// Filter extensions that failed to connect\nconst filterFailedExtensions = (\n extensions: ExtensionEnableResults\n): ExtensionEnableResults =>\n new Map(\n Array.from(extensions.entries()).filter(([, state]) => !state.connected)\n )\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n ExtensionAccount,\n ExtensionEnableResults,\n ExtensionInterface,\n} from '@w3ux/types'\nimport { formatExtensionAccounts } from './util'\n\n// Connects to provided extensions and gets all accounts\nexport const getAccountsFromExtensions = async (\n extensions: ExtensionEnableResults,\n ss58: number\n): Promise<ExtensionAccount[]> => {\n try {\n const extensionEntries = Array.from(extensions.entries())\n .filter(([, { extension }]) => extension !== null)\n .map(\n ([source, { extension }]) =>\n [source, extension] as [string, ExtensionInterface]\n )\n\n const activeExtensions = extensionEntries.map(([, extension]) => extension)\n\n const results = await Promise.allSettled(\n activeExtensions.map((extension) => extension.accounts.get())\n )\n\n const allAccounts: ExtensionAccount[] = []\n for (let i = 0; i < results.length; i++) {\n const result = results[i]\n const source = extensionEntries[i][0]\n const signer = extensionEntries[i][1].signer\n\n if (result.status === 'fulfilled' && signer) {\n const { value } = result\n\n // This is duplicating what `handleExtensionAccountsUpdate` is doing to accounts: --\n const accounts = formatExtensionAccounts(value, ss58)\n .filter(\n ({ address }) => !allAccounts.find((a) => address === a.address)\n )\n .map(({ address, name }) => ({\n address,\n name,\n source,\n signer,\n }))\n allAccounts.push(...accounts)\n }\n }\n return allAccounts\n } catch (e) {\n console.error('Error during account formatting: ', e)\n return []\n }\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { initExtensions } from '.'\nimport {\n addUnsub,\n getAccountsFromExtensions,\n processExtensionAccounts,\n updateAccounts,\n} from '../accounts/index'\nimport { getActiveExtensionsLocal } from '../local'\nimport { setReconnectSync } from '../util'\n\nexport const reconnectExtensions = async (dappName: string, ss58: number) => {\n setReconnectSync('syncing')\n const { connected } = await initExtensions(\n dappName,\n getActiveExtensionsLocal()\n )\n if (connected.size > 0) {\n // Perform initial account state update\n updateAccounts({\n add: await getAccountsFromExtensions(connected, ss58),\n remove: [],\n })\n\n // If available, subscribe to accounts for each connected extension\n for (const [id, { extension }] of Array.from(connected.entries())) {\n if (typeof extension!.accounts.subscribe === 'function') {\n const unsub = extension!.accounts.subscribe((accounts) => {\n processExtensionAccounts(\n {\n source: id,\n ss58,\n },\n extension!.signer,\n accounts\n )\n })\n addUnsub(id, unsub)\n }\n }\n }\n setReconnectSync('synced')\n}\n"],"mappings":"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","names":["import_utils","extensions","import_utils","extensions","extensions"]}
|
package/extensions/index.js
CHANGED
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
getAccountsFromExtensions,
|
|
8
8
|
processExtensionAccounts,
|
|
9
9
|
updateAccounts
|
|
10
|
-
} from "../chunk-
|
|
10
|
+
} from "../chunk-Z6C6MK4P.js";
|
|
11
11
|
import {
|
|
12
12
|
_extensionsStatus,
|
|
13
13
|
_gettingExtensions,
|
|
@@ -163,8 +163,9 @@ var initExtensions = async (dappName, extensionIds) => {
|
|
|
163
163
|
newStatus[id] = "connected";
|
|
164
164
|
});
|
|
165
165
|
Array.from(withError.entries()).forEach(([id, { error }]) => {
|
|
166
|
-
|
|
167
|
-
|
|
166
|
+
const errStr = String(error || "");
|
|
167
|
+
if (errStr.startsWith("Error")) {
|
|
168
|
+
if (errStr.substring(0, 17) === "NotInstalledError") {
|
|
168
169
|
delete newStatus[id];
|
|
169
170
|
} else {
|
|
170
171
|
newStatus[id] = "not_authenticated";
|
package/extensions/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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 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 ss58: number,\n id: string,\n extension: ExtensionInterface,\n accounts: ExtensionAccount[]\n) => {\n processExtensionAccounts(\n {\n source: id,\n ss58,\n },\n extension.signer,\n accounts\n )\n}\n\n// Connects to a single extension and processes its accounts\nexport const connectExtension = async (\n dappName: string,\n ss58: number,\n id: string\n): Promise<boolean> => {\n if (canConnect(id)) {\n const { connected } = await initExtensions(dappName, [id])\n if (connected.size === 0) {\n return false\n }\n const result = connected.get(id)\n const extension = result?.extension\n const canSubscribe =\n !!extension && typeof extension.accounts.subscribe === 'function'\n\n // If account subscriptions are not supported, simply get the account(s) from the extension,\n // otherwise, subscribe to accounts\n if (extension) {\n if (!canSubscribe) {\n const accounts = await extension.accounts.get()\n handleAccounts(ss58, id, extension, accounts)\n } else {\n const unsub = extension.accounts.subscribe((accounts) => {\n handleAccounts(ss58, id, extension, accounts)\n })\n addUnsub(id, unsub)\n }\n }\n return true\n }\n return 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 _gettingExtensions.next(true)\n let injectedWeb3Interval: ReturnType<typeof setInterval> | undefined =\n undefined\n\n // Format installed extensions\n const formatInstalled = () =>\n Object.keys(extensions).reduce(\n (acc, key) => {\n acc[key] =\n window?.injectedWeb3?.[key] !== undefined ? 'installed' : acc[key]\n return acc\n },\n { ..._extensionsStatus.getValue() }\n )\n\n // Handle completed interval check\n const handleCompleted = async (foundExtensions: boolean) => {\n clearInterval(injectedWeb3Interval)\n if (foundExtensions) {\n _extensionsStatus.next(formatInstalled())\n }\n _gettingExtensions.next(false)\n }\n\n const interval = 200\n const maxChecks = 10\n const minVerifications = 2\n\n // Getter for the currently installed extensions\n let counter = 0\n let verifications = 0\n injectedWeb3Interval = setInterval(() => {\n counter++\n if (counter === maxChecks) {\n handleCompleted(false)\n } else {\n const injected = window?.injectedWeb3\n\n // Check if injected exists and all extensions have a valid enable function\n const ready =\n injected !== undefined &&\n Object.entries(injected).every(\n ([, ext]) => ext && typeof ext.enable === 'function'\n )\n\n // Increment verifications if the extensions are ready\n if (ready) {\n verifications++\n } else {\n verifications = 0\n }\n\n if (counter > 2 && verifications >= minVerifications) {\n handleCompleted(true)\n }\n }\n }, interval)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n ExtensionEnableResult,\n ExtensionEnableResults,\n ExtensionInterface,\n} from '@w3ux/types'\nimport { withTimeoutThrow } from '@w3ux/utils'\n\n// Get extensions and enable them\nexport const enableExtensions = async (ids: string[], dappName: string) => {\n const extensionIds = getExtensionsById(ids)\n const enableResults = await doEnable(extensionIds, dappName)\n\n return formatEnabledExtensions(extensionIds, enableResults)\n}\n\n// Gets extensions from injectedWeb3 by their ids\nconst getExtensionsById = (ids: string[]) => {\n const validIds: string[] = []\n ids.forEach((id) => {\n const enable = window.injectedWeb3?.[id]?.enable\n if (enable !== undefined && typeof enable === 'function') {\n validIds.push(id)\n }\n })\n return validIds\n}\n\n// Calls enable for the provided extensions\nconst doEnable = async (\n extensionIds: string[],\n dappName: string\n): Promise<PromiseSettledResult<ExtensionInterface>[]> =>\n await Promise.allSettled(\n Array.from(extensionIds).map(\n (id) =>\n withTimeoutThrow(\n 1000,\n window.injectedWeb3![id].enable(dappName)\n ) as Promise<ExtensionInterface>\n )\n )\n\nconst formatEnabledExtensions = (\n extensionIds: string[],\n enabledResults: PromiseSettledResult<ExtensionInterface>[]\n): ExtensionEnableResults => {\n const extensionsState = new Map<string, ExtensionEnableResult>()\n\n for (let i = 0; i < enabledResults.length; i++) {\n const result = enabledResults[i]\n const id = extensionIds[i]\n\n if (result.status === 'fulfilled') {\n extensionsState.set(id, {\n extension: result.value,\n connected: true,\n })\n } else if (result.status === 'rejected') {\n extensionsState.set(id, {\n extension: null,\n connected: false,\n error: result.reason,\n })\n }\n }\n return 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 dappName: string,\n extensionIds: string[]\n): Promise<{ connected: ExtensionEnableResults }> => {\n if (!extensionIds.length) {\n return {\n connected: new Map(),\n }\n }\n // Get extensions and enable them\n const enableResults = await enableExtensions(extensionIds, dappName)\n\n // Determine which extensions are connected and which have errors\n const [connected, withError] = [\n filterConnectedExtensions(enableResults),\n filterFailedExtensions(enableResults),\n ]\n\n // Manage local storage depending on connection status\n Array.from(connected.keys()).forEach((id) => addExtensionToLocal(id))\n Array.from(withError.keys()).forEach((id) => removeExtensionFromLocal(id))\n\n // Handle new extension statuses\n const newStatus = { ..._extensionsStatus.getValue() }\n Array.from(connected.keys()).forEach((id) => {\n newStatus[id] = 'connected'\n })\n Array.from(withError.entries()).forEach(([id, { error }]) => {\n if (error?.startsWith('Error')) {\n // Extension not found - remove from state\n if (error.substring(0, 17) === 'NotInstalledError') {\n delete newStatus[id]\n } else {\n // Assume extension not authenticated\n newStatus[id] = 'not_authenticated'\n }\n }\n })\n\n // Record initialised extensions\n const newInitialised = [..._initialisedExtensions.getValue()]\n extensionIds.forEach((id) => {\n if (!newInitialised.includes(id)) {\n newInitialised.push(id)\n }\n })\n\n // Commit updates to observables\n _extensionsStatus.next(newStatus)\n _initialisedExtensions.next(newInitialised)\n\n return { connected }\n}\n\n// Filter successfully connected extensions\nconst filterConnectedExtensions = (\n extensions: ExtensionEnableResults\n): ExtensionEnableResults =>\n new Map(\n Array.from(extensions.entries()).filter(([, state]) => state.connected)\n )\n\n// Filter extensions that failed to connect\nconst filterFailedExtensions = (\n extensions: ExtensionEnableResults\n): ExtensionEnableResults =>\n new Map(\n Array.from(extensions.entries()).filter(([, state]) => !state.connected)\n )\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { initExtensions } from '.'\nimport {\n addUnsub,\n getAccountsFromExtensions,\n processExtensionAccounts,\n updateAccounts,\n} from '../accounts/index'\nimport { getActiveExtensionsLocal } from '../local'\nimport { setReconnectSync } from '../util'\n\nexport const reconnectExtensions = async (dappName: string, ss58: number) => {\n setReconnectSync('syncing')\n const { connected } = await initExtensions(\n dappName,\n getActiveExtensionsLocal()\n )\n if (connected.size > 0) {\n // Perform initial account state update\n updateAccounts({\n add: await getAccountsFromExtensions(connected, ss58),\n remove: [],\n })\n\n // If available, subscribe to accounts for each connected extension\n for (const [id, { extension }] of Array.from(connected.entries())) {\n if (typeof extension!.accounts.subscribe === 'function') {\n const unsub = extension!.accounts.subscribe((accounts) => {\n processExtensionAccounts(\n {\n source: id,\n ss58,\n },\n extension!.signer,\n accounts\n )\n })\n addUnsub(id, unsub)\n }\n }\n }\n setReconnectSync('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 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 ss58: number,\n id: string,\n extension: ExtensionInterface,\n accounts: ExtensionAccount[]\n) => {\n processExtensionAccounts(\n {\n source: id,\n ss58,\n },\n extension.signer,\n accounts\n )\n}\n\n// Connects to a single extension and processes its accounts\nexport const connectExtension = async (\n dappName: string,\n ss58: number,\n id: string\n): Promise<boolean> => {\n if (canConnect(id)) {\n const { connected } = await initExtensions(dappName, [id])\n if (connected.size === 0) {\n return false\n }\n const result = connected.get(id)\n const extension = result?.extension\n const canSubscribe =\n !!extension && typeof extension.accounts.subscribe === 'function'\n\n // If account subscriptions are not supported, simply get the account(s) from the extension,\n // otherwise, subscribe to accounts\n if (extension) {\n if (!canSubscribe) {\n const accounts = await extension.accounts.get()\n handleAccounts(ss58, id, extension, accounts)\n } else {\n const unsub = extension.accounts.subscribe((accounts) => {\n handleAccounts(ss58, id, extension, accounts)\n })\n addUnsub(id, unsub)\n }\n }\n return true\n }\n return 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 _gettingExtensions.next(true)\n let injectedWeb3Interval: ReturnType<typeof setInterval> | undefined =\n undefined\n\n // Format installed extensions\n const formatInstalled = () =>\n Object.keys(extensions).reduce(\n (acc, key) => {\n acc[key] =\n window?.injectedWeb3?.[key] !== undefined ? 'installed' : acc[key]\n return acc\n },\n { ..._extensionsStatus.getValue() }\n )\n\n // Handle completed interval check\n const handleCompleted = async (foundExtensions: boolean) => {\n clearInterval(injectedWeb3Interval)\n if (foundExtensions) {\n _extensionsStatus.next(formatInstalled())\n }\n _gettingExtensions.next(false)\n }\n\n const interval = 200\n const maxChecks = 10\n const minVerifications = 2\n\n // Getter for the currently installed extensions\n let counter = 0\n let verifications = 0\n injectedWeb3Interval = setInterval(() => {\n counter++\n if (counter === maxChecks) {\n handleCompleted(false)\n } else {\n const injected = window?.injectedWeb3\n\n // Check if injected exists and all extensions have a valid enable function\n const ready =\n injected !== undefined &&\n Object.entries(injected).every(\n ([, ext]) => ext && typeof ext.enable === 'function'\n )\n\n // Increment verifications if the extensions are ready\n if (ready) {\n verifications++\n } else {\n verifications = 0\n }\n\n if (counter > 2 && verifications >= minVerifications) {\n handleCompleted(true)\n }\n }\n }, interval)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n ExtensionEnableResult,\n ExtensionEnableResults,\n ExtensionInterface,\n} from '@w3ux/types'\nimport { withTimeoutThrow } from '@w3ux/utils'\n\n// Get extensions and enable them\nexport const enableExtensions = async (ids: string[], dappName: string) => {\n const extensionIds = getExtensionsById(ids)\n const enableResults = await doEnable(extensionIds, dappName)\n\n return formatEnabledExtensions(extensionIds, enableResults)\n}\n\n// Gets extensions from injectedWeb3 by their ids\nconst getExtensionsById = (ids: string[]) => {\n const validIds: string[] = []\n ids.forEach((id) => {\n const enable = window.injectedWeb3?.[id]?.enable\n if (enable !== undefined && typeof enable === 'function') {\n validIds.push(id)\n }\n })\n return validIds\n}\n\n// Calls enable for the provided extensions\nconst doEnable = async (\n extensionIds: string[],\n dappName: string\n): Promise<PromiseSettledResult<ExtensionInterface>[]> =>\n await Promise.allSettled(\n Array.from(extensionIds).map(\n (id) =>\n withTimeoutThrow(\n 1000,\n window.injectedWeb3![id].enable(dappName)\n ) as Promise<ExtensionInterface>\n )\n )\n\nconst formatEnabledExtensions = (\n extensionIds: string[],\n enabledResults: PromiseSettledResult<ExtensionInterface>[]\n): ExtensionEnableResults => {\n const extensionsState = new Map<string, ExtensionEnableResult>()\n\n for (let i = 0; i < enabledResults.length; i++) {\n const result = enabledResults[i]\n const id = extensionIds[i]\n\n if (result.status === 'fulfilled') {\n extensionsState.set(id, {\n extension: result.value,\n connected: true,\n })\n } else if (result.status === 'rejected') {\n extensionsState.set(id, {\n extension: null,\n connected: false,\n error: result.reason,\n })\n }\n }\n return 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 dappName: string,\n extensionIds: string[]\n): Promise<{ connected: ExtensionEnableResults }> => {\n if (!extensionIds.length) {\n return {\n connected: new Map(),\n }\n }\n // Get extensions and enable them\n const enableResults = await enableExtensions(extensionIds, dappName)\n\n // Determine which extensions are connected and which have errors\n const [connected, withError] = [\n filterConnectedExtensions(enableResults),\n filterFailedExtensions(enableResults),\n ]\n\n // Manage local storage depending on connection status\n Array.from(connected.keys()).forEach((id) => addExtensionToLocal(id))\n Array.from(withError.keys()).forEach((id) => removeExtensionFromLocal(id))\n\n // Handle new extension statuses\n const newStatus = { ..._extensionsStatus.getValue() }\n Array.from(connected.keys()).forEach((id) => {\n newStatus[id] = 'connected'\n })\n Array.from(withError.entries()).forEach(([id, { error }]) => {\n const errStr = String(error || '')\n if (errStr.startsWith('Error')) {\n // Extension not found - remove from state\n if (errStr.substring(0, 17) === 'NotInstalledError') {\n delete newStatus[id]\n } else {\n // Assume extension not authenticated\n newStatus[id] = 'not_authenticated'\n }\n }\n })\n\n // Record initialised extensions\n const newInitialised = [..._initialisedExtensions.getValue()]\n extensionIds.forEach((id) => {\n if (!newInitialised.includes(id)) {\n newInitialised.push(id)\n }\n })\n\n // Commit updates to observables\n _extensionsStatus.next(newStatus)\n _initialisedExtensions.next(newInitialised)\n\n return { connected }\n}\n\n// Filter successfully connected extensions\nconst filterConnectedExtensions = (\n extensions: ExtensionEnableResults\n): ExtensionEnableResults =>\n new Map(\n Array.from(extensions.entries()).filter(([, state]) => state.connected)\n )\n\n// Filter extensions that failed to connect\nconst filterFailedExtensions = (\n extensions: ExtensionEnableResults\n): ExtensionEnableResults =>\n new Map(\n Array.from(extensions.entries()).filter(([, state]) => !state.connected)\n )\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { initExtensions } from '.'\nimport {\n addUnsub,\n getAccountsFromExtensions,\n processExtensionAccounts,\n updateAccounts,\n} from '../accounts/index'\nimport { getActiveExtensionsLocal } from '../local'\nimport { setReconnectSync } from '../util'\n\nexport const reconnectExtensions = async (dappName: string, ss58: number) => {\n setReconnectSync('syncing')\n const { connected } = await initExtensions(\n dappName,\n getActiveExtensionsLocal()\n )\n if (connected.size > 0) {\n // Perform initial account state update\n updateAccounts({\n add: await getAccountsFromExtensions(connected, ss58),\n remove: [],\n })\n\n // If available, subscribe to accounts for each connected extension\n for (const [id, { extension }] of Array.from(connected.entries())) {\n if (typeof extension!.accounts.subscribe === 'function') {\n const unsub = extension!.accounts.subscribe((accounts) => {\n processExtensionAccounts(\n {\n source: id,\n ss58,\n },\n extension!.signer,\n accounts\n )\n })\n addUnsub(id, unsub)\n }\n }\n }\n setReconnectSync('synced')\n}\n"],"mappings":"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","names":["extensions"]}
|
package/package.json
CHANGED
package/chunk-7HEVIWWS.js.map
DELETED
|
@@ -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 ExtensionAccount,\n ProcessExtensionAccountsResult,\n} from '@w3ux/types'\nimport { formatAccountSs58, isValidAddress } from '@w3ux/utils'\nimport { DefaultProcessExtensionResult } from '../consts'\nimport { _extensionAccounts } from '../subjects'\n\n// Gets accounts to be imported and commits them to state\n\ninterface Config {\n source: string\n ss58: number\n}\nexport const processExtensionAccounts = (\n config: Config,\n signer: unknown,\n newAccounts: ExtensionAccount[]\n): ProcessExtensionAccountsResult => {\n const { source, ss58 } = config\n if (!newAccounts.length) {\n return DefaultProcessExtensionResult\n }\n\n // Get valid accounts from extension\n newAccounts = formatExtensionAccounts(newAccounts, ss58)\n\n // Find any accounts that have been removed from this extension\n const removedAccounts = _extensionAccounts\n .getValue()\n .filter((j) => j.source === source)\n .filter((j) => !newAccounts.find((i) => i.address === j.address))\n\n // Remove accounts that have already been imported\n newAccounts = newAccounts.filter(\n ({ address }) =>\n !_extensionAccounts.getValue().find((j) => j.address === address)\n )\n\n // Format accounts properties\n newAccounts = newAccounts.map(({ address, name }) => ({\n address,\n name,\n source,\n signer,\n }))\n\n // Update observable state\n updateAccounts({\n add: newAccounts,\n remove: removedAccounts,\n })\n\n return {\n newAccounts,\n removedAccounts: [...removedAccounts],\n }\n}\n\n// Formats accounts to correct ss58 and removes invalid accounts\nexport const formatExtensionAccounts = (\n accounts: ExtensionAccount[],\n ss58: number\n) => {\n accounts = accounts\n // Remove accounts that do not contain correctly formatted addresses\n .filter(({ address }) => isValidAddress(address))\n // Reformat addresses to ensure default ss58 format\n .map((account) => {\n const formattedAddress = formatAccountSs58(account.address, ss58)\n if (!formattedAddress) {\n return null\n }\n account.address = formattedAddress\n return account\n })\n // Remove null entries resulting from invalid formatted addresses\n .filter((account) => account !== null)\n\n return accounts\n}\n\n// Updates accounts observable based on removed and added accounts\nexport const updateAccounts = ({\n add,\n remove,\n}: {\n add: ExtensionAccount[]\n remove: ExtensionAccount[]\n}) => {\n const newAccounts = [..._extensionAccounts.getValue()]\n .concat(add)\n .filter((a) => remove.find((s) => s.address === a.address) === undefined)\n _extensionAccounts.next(newAccounts)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExtensionAccount, ExtensionEnableResults } from '@w3ux/types'\nimport { formatExtensionAccounts } from './util'\n\n// Connects to provided extensions and gets all accounts\nexport const getAccountsFromExtensions = async (\n extensions: ExtensionEnableResults,\n ss58: number\n): Promise<ExtensionAccount[]> => {\n try {\n const results = await Promise.allSettled(\n Array.from(extensions.values()).map(({ extension }) =>\n extension!.accounts.get()\n )\n )\n\n const allAccounts: ExtensionAccount[] = []\n const extensionEntries = Array.from(extensions.entries())\n for (let i = 0; i < results.length; i++) {\n const result = results[i]\n const source = extensionEntries[i][0]\n const signer = extensionEntries[i][1].extension!.signer\n\n if (result.status === 'fulfilled' && signer) {\n const { value } = result\n\n // This is duplicating what `handleExtensionAccountsUpdate` is doing to accounts: --\n const accounts = formatExtensionAccounts(value, ss58)\n .filter(\n ({ address }) => !allAccounts.find((a) => address === a.address)\n )\n .map(({ address, name }) => ({\n address,\n name,\n source,\n signer,\n }))\n allAccounts.push(...accounts)\n }\n }\n return allAccounts\n } catch (e) {\n console.error('Error during account formatting: ', e)\n return []\n }\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 unsubs[id] = unsub\n}\n\n// Unsubscribe to all unsubs\nexport const unsubAll = () => {\n Object.values(unsubs).forEach((unsub) => {\n unsub()\n })\n}\n"],"mappings":"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","names":[]}
|