@w3ux/observables-connect 0.11.2 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/accounts/index.cjs +12 -10
- package/accounts/index.cjs.map +1 -1
- package/accounts/index.js +1 -1
- package/{chunk-QYR6WE5O.js → chunk-FS3ZTGV6.js} +7 -7
- package/chunk-FS3ZTGV6.js.map +1 -0
- package/{chunk-XVKV7X7C.js → chunk-TPEE4DI4.js} +13 -11
- package/chunk-TPEE4DI4.js.map +1 -0
- package/extensions/index.cjs +17 -15
- package/extensions/index.cjs.map +1 -1
- package/extensions/index.js +2 -2
- package/index.cjs +7 -7
- package/index.cjs.map +1 -1
- package/index.d.cts +2 -2
- package/index.d.ts +2 -2
- package/index.js +3 -3
- package/package.json +1 -1
- package/chunk-QYR6WE5O.js.map +0 -1
- package/chunk-XVKV7X7C.js.map +0 -1
package/accounts/index.cjs
CHANGED
|
@@ -73,7 +73,7 @@ var processExtensionAccounts = (config, signer, newAccounts) => {
|
|
|
73
73
|
newAccounts = formatExtensionAccounts(newAccounts, ss58);
|
|
74
74
|
const removedAccounts = _extensionAccounts.getValue().filter((j) => j.source === source).filter((j) => !newAccounts.find((i) => i.address === j.address));
|
|
75
75
|
newAccounts = newAccounts.filter(
|
|
76
|
-
({ address }) => !_extensionAccounts.getValue().find((j) => j.address === address)
|
|
76
|
+
({ address }) => !_extensionAccounts.getValue().find((j) => j.address === address && j.source === source)
|
|
77
77
|
);
|
|
78
78
|
newAccounts = newAccounts.map(({ address, name }) => ({
|
|
79
79
|
address,
|
|
@@ -105,7 +105,9 @@ var updateAccounts = ({
|
|
|
105
105
|
add,
|
|
106
106
|
remove
|
|
107
107
|
}) => {
|
|
108
|
-
const newAccounts = [..._extensionAccounts.getValue()].concat(add).filter(
|
|
108
|
+
const newAccounts = [..._extensionAccounts.getValue()].concat(add).filter(
|
|
109
|
+
(a) => remove.find((s) => s.address === a.address && s.source === a.source) === void 0
|
|
110
|
+
);
|
|
109
111
|
_extensionAccounts.next(newAccounts);
|
|
110
112
|
};
|
|
111
113
|
|
|
@@ -126,14 +128,14 @@ var getAccountsFromExtensions = async (extensions, ss58) => {
|
|
|
126
128
|
const signer = extensionEntries[i][1].signer;
|
|
127
129
|
if (result.status === "fulfilled" && signer) {
|
|
128
130
|
const { value } = result;
|
|
129
|
-
const accounts = formatExtensionAccounts(value, ss58).
|
|
130
|
-
({ address }) =>
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
131
|
+
const accounts = formatExtensionAccounts(value, ss58).map(
|
|
132
|
+
({ address, name }) => ({
|
|
133
|
+
address,
|
|
134
|
+
name,
|
|
135
|
+
source,
|
|
136
|
+
signer
|
|
137
|
+
})
|
|
138
|
+
);
|
|
137
139
|
allAccounts.push(...accounts);
|
|
138
140
|
}
|
|
139
141
|
}
|
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\tExtensionAccount,\n\tProcessExtensionAccountsResult,\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\tsource: string\n\tss58: number\n}\nexport const processExtensionAccounts = (\n\tconfig: Config,\n\tsigner: unknown,\n\tnewAccounts: ExtensionAccount[],\n): ProcessExtensionAccountsResult => {\n\tconst { source, ss58 } = config\n\tif (!newAccounts.length) {\n\t\treturn DefaultProcessExtensionResult\n\t}\n\n\t// Get valid accounts from extension\n\tnewAccounts = formatExtensionAccounts(newAccounts, ss58)\n\n\t// Find any accounts that have been removed from this extension\n\tconst removedAccounts = _extensionAccounts\n\t\t.getValue()\n\t\t.filter((j) => j.source === source)\n\t\t.filter((j) => !newAccounts.find((i) => i.address === j.address))\n\n\t// Remove accounts that have already been imported\n\tnewAccounts = newAccounts.filter(\n\t\t({ address }) =>\n\t\t\t!_extensionAccounts.getValue().find((j) => j.address === address),\n\t)\n\n\t// Format accounts properties\n\tnewAccounts = newAccounts.map(({ address, name }) => ({\n\t\taddress,\n\t\tname,\n\t\tsource,\n\t\tsigner,\n\t}))\n\n\t// Update observable state\n\tupdateAccounts({\n\t\tadd: newAccounts,\n\t\tremove: removedAccounts,\n\t})\n\n\treturn {\n\t\tnewAccounts,\n\t\tremovedAccounts: [...removedAccounts],\n\t}\n}\n\n// Formats accounts to correct ss58 and removes invalid accounts\nexport const formatExtensionAccounts = (\n\taccounts: ExtensionAccount[],\n\tss58: number,\n) => {\n\taccounts = accounts\n\t\t// Remove accounts that do not contain correctly formatted addresses\n\t\t.filter(({ address }) => isValidAddress(address))\n\t\t// Reformat addresses to ensure default ss58 format\n\t\t.map((account) => {\n\t\t\tconst formattedAddress = formatAccountSs58(account.address, ss58)\n\t\t\tif (!formattedAddress) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\taccount.address = formattedAddress\n\t\t\treturn account\n\t\t})\n\t\t// Remove null entries resulting from invalid formatted addresses\n\t\t.filter((account) => account !== null)\n\n\treturn accounts\n}\n\n// Updates accounts observable based on removed and added accounts\nexport const updateAccounts = ({\n\tadd,\n\tremove,\n}: {\n\tadd: ExtensionAccount[]\n\tremove: ExtensionAccount[]\n}) => {\n\tconst newAccounts = [..._extensionAccounts.getValue()]\n\t\t.concat(add)\n\t\t.filter((a) => remove.find((s) => s.address === a.address) === undefined)\n\t_extensionAccounts.next(newAccounts)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ProcessExtensionAccountsResult } from '@w3ux/types'\n\nexport const DefaultProcessExtensionResult: ProcessExtensionAccountsResult = {\n\tnewAccounts: [],\n\tremovedAccounts: [],\n}\n\n// Local storage active extensions key\nexport const ActiveExtensionsKey = 'active_extensions'\nexport const HardwareAccountsKey = 'hardware_accounts'\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tExtensionsStatus,\n\tHardwareAccount,\n\tSync,\n} from '@w3ux/types'\nimport { BehaviorSubject } from 'rxjs'\nimport { getHardwareAccountsLocal } from './local'\n\n// NOTE: These subjects stay private to the package and are not exported\n\nexport const _extensionsStatus = new BehaviorSubject<ExtensionsStatus>({})\nexport const _gettingExtensions = new BehaviorSubject<boolean>(true)\nexport const _initialisedExtensions = new BehaviorSubject<string[]>([])\nexport const _reconnectSync = new BehaviorSubject<Sync>('unsynced')\nexport const _extensionAccounts = new BehaviorSubject<ExtensionAccount[]>([])\nexport const _hardwareAccounts = new BehaviorSubject<HardwareAccount[]>(\n\tgetHardwareAccountsLocal(),\n)\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { HardwareAccount } from '@w3ux/types'\nimport { localStorageOrDefault } from '@w3ux/utils'\nimport { ActiveExtensionsKey, HardwareAccountsKey } from './consts'\n\n// Gets all active extensions from local storage\nexport const getActiveExtensionsLocal = (): string[] => {\n\tconst current = localStorageOrDefault<string[]>(ActiveExtensionsKey, [], true)\n\treturn Array.isArray(current) ? current : []\n}\n\n// Check if an extension exists in local storage\nexport const isExtensionLocal = (id: string): boolean =>\n\tgetActiveExtensionsLocal().includes(id)\n\n// Adds an extension to local storage\nexport const addExtensionToLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tif (!current.includes(id)) {\n\t\tlocalStorage.setItem(ActiveExtensionsKey, JSON.stringify([...current, id]))\n\t}\n}\n\n// Removes extension from local storage\nexport const removeExtensionFromLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tlocalStorage.setItem(\n\t\tActiveExtensionsKey,\n\t\tJSON.stringify(current.filter((localId) => localId !== id)),\n\t)\n}\n\n// Gets imported hardware accounts from local storage\nexport const getHardwareAccountsLocal = (): HardwareAccount[] => {\n\tconst accounts = localStorageOrDefault(\n\t\tHardwareAccountsKey,\n\t\t[],\n\t\ttrue,\n\t) as HardwareAccount[]\n\n\treturn accounts\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tExtensionEnableResults,\n\tExtensionInterface,\n} from '@w3ux/types'\nimport { formatExtensionAccounts } from './util'\n\n// Connects to provided extensions and gets all accounts\nexport const getAccountsFromExtensions = async (\n\textensions: ExtensionEnableResults,\n\tss58: number,\n): Promise<ExtensionAccount[]> => {\n\ttry {\n\t\tconst extensionEntries = Array.from(extensions.entries())\n\t\t\t.filter(([, { extension }]) => extension !== null)\n\t\t\t.map(\n\t\t\t\t([source, { extension }]) =>\n\t\t\t\t\t[source, extension] as [string, ExtensionInterface],\n\t\t\t)\n\n\t\tconst activeExtensions = extensionEntries.map(([, extension]) => extension)\n\n\t\tconst results = await Promise.allSettled(\n\t\t\tactiveExtensions.map((extension) => extension.accounts.get()),\n\t\t)\n\n\t\tconst allAccounts: ExtensionAccount[] = []\n\t\tfor (let i = 0; i < results.length; i++) {\n\t\t\tconst result = results[i]\n\t\t\tconst source = extensionEntries[i][0]\n\t\t\tconst signer = extensionEntries[i][1].signer\n\n\t\t\tif (result.status === 'fulfilled' && signer) {\n\t\t\t\tconst { value } = result\n\n\t\t\t\t// This is duplicating what `handleExtensionAccountsUpdate` is doing to accounts: --\n\t\t\t\tconst accounts = formatExtensionAccounts(value, ss58)\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t({ address }) => !allAccounts.find((a) => address === a.address),\n\t\t\t\t\t)\n\t\t\t\t\t.map(({ address, name }) => ({\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\tsigner,\n\t\t\t\t\t}))\n\t\t\t\tallAccounts.push(...accounts)\n\t\t\t}\n\t\t}\n\t\treturn allAccounts\n\t} catch (e) {\n\t\tconsole.error('Error during account formatting: ', e)\n\t\treturn []\n\t}\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\n// Extension account subscription unsubs\nexport const unsubs: Record<string, () => void> = {}\n\n// Add an extension id to unsub state\nexport const addUnsub = (id: string, unsub: () => void) => {\n\tunsubs[id] = unsub\n}\n\n// Unsubscribe to all unsubs\nexport const unsubAll = () => {\n\tObject.values(unsubs).forEach((unsub) => {\n\t\tunsub()\n\t})\n}\n"],"mappings":"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","names":["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\tExtensionAccount,\n\tProcessExtensionAccountsResult,\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\tsource: string\n\tss58: number\n}\nexport const processExtensionAccounts = (\n\tconfig: Config,\n\tsigner: unknown,\n\tnewAccounts: ExtensionAccount[],\n): ProcessExtensionAccountsResult => {\n\tconst { source, ss58 } = config\n\tif (!newAccounts.length) {\n\t\treturn DefaultProcessExtensionResult\n\t}\n\n\t// Get valid accounts from extension\n\tnewAccounts = formatExtensionAccounts(newAccounts, ss58)\n\n\t// Find any accounts that have been removed from this extension\n\tconst removedAccounts = _extensionAccounts\n\t\t.getValue()\n\t\t.filter((j) => j.source === source)\n\t\t.filter((j) => !newAccounts.find((i) => i.address === j.address))\n\n\t// Remove accounts that have already been imported\n\tnewAccounts = newAccounts.filter(\n\t\t({ address }) =>\n\t\t\t!_extensionAccounts\n\t\t\t\t.getValue()\n\t\t\t\t.find((j) => j.address === address && j.source === source),\n\t)\n\n\t// Format accounts properties\n\tnewAccounts = newAccounts.map(({ address, name }) => ({\n\t\taddress,\n\t\tname,\n\t\tsource,\n\t\tsigner,\n\t}))\n\n\t// Update observable state\n\tupdateAccounts({\n\t\tadd: newAccounts,\n\t\tremove: removedAccounts,\n\t})\n\n\treturn {\n\t\tnewAccounts,\n\t\tremovedAccounts: [...removedAccounts],\n\t}\n}\n\n// Formats accounts to correct ss58 and removes invalid accounts\nexport const formatExtensionAccounts = (\n\taccounts: ExtensionAccount[],\n\tss58: number,\n) => {\n\taccounts = accounts\n\t\t// Remove accounts that do not contain correctly formatted addresses\n\t\t.filter(({ address }) => isValidAddress(address))\n\t\t// Reformat addresses to ensure default ss58 format\n\t\t.map((account) => {\n\t\t\tconst formattedAddress = formatAccountSs58(account.address, ss58)\n\t\t\tif (!formattedAddress) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\taccount.address = formattedAddress\n\t\t\treturn account\n\t\t})\n\t\t// Remove null entries resulting from invalid formatted addresses\n\t\t.filter((account) => account !== null)\n\n\treturn accounts\n}\n\n// Updates accounts observable based on removed and added accounts\nexport const updateAccounts = ({\n\tadd,\n\tremove,\n}: {\n\tadd: ExtensionAccount[]\n\tremove: ExtensionAccount[]\n}) => {\n\tconst newAccounts = [..._extensionAccounts.getValue()]\n\t\t.concat(add)\n\t\t.filter(\n\t\t\t(a) =>\n\t\t\t\tremove.find((s) => s.address === a.address && s.source === a.source) ===\n\t\t\t\tundefined,\n\t\t)\n\t_extensionAccounts.next(newAccounts)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ProcessExtensionAccountsResult } from '@w3ux/types'\n\nexport const DefaultProcessExtensionResult: ProcessExtensionAccountsResult = {\n\tnewAccounts: [],\n\tremovedAccounts: [],\n}\n\n// Local storage active extensions key\nexport const ActiveExtensionsKey = 'active_extensions'\nexport const HardwareAccountsKey = 'hardware_accounts'\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tExtensionsStatus,\n\tHardwareAccount,\n\tSync,\n} from '@w3ux/types'\nimport { BehaviorSubject } from 'rxjs'\nimport { getHardwareAccountsLocal } from './local'\n\n// NOTE: These subjects stay private to the package and are not exported\n\nexport const _extensionsStatus = new BehaviorSubject<ExtensionsStatus>({})\nexport const _gettingExtensions = new BehaviorSubject<boolean>(true)\nexport const _initialisedExtensions = new BehaviorSubject<string[]>([])\nexport const _reconnectSync = new BehaviorSubject<Sync>('unsynced')\nexport const _extensionAccounts = new BehaviorSubject<ExtensionAccount[]>([])\nexport const _hardwareAccounts = new BehaviorSubject<HardwareAccount[]>(\n\tgetHardwareAccountsLocal(),\n)\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { HardwareAccount } from '@w3ux/types'\nimport { localStorageOrDefault } from '@w3ux/utils'\nimport { ActiveExtensionsKey, HardwareAccountsKey } from './consts'\n\n// Gets all active extensions from local storage\nexport const getActiveExtensionsLocal = (): string[] => {\n\tconst current = localStorageOrDefault<string[]>(ActiveExtensionsKey, [], true)\n\treturn Array.isArray(current) ? current : []\n}\n\n// Check if an extension exists in local storage\nexport const isExtensionLocal = (id: string): boolean =>\n\tgetActiveExtensionsLocal().includes(id)\n\n// Adds an extension to local storage\nexport const addExtensionToLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tif (!current.includes(id)) {\n\t\tlocalStorage.setItem(ActiveExtensionsKey, JSON.stringify([...current, id]))\n\t}\n}\n\n// Removes extension from local storage\nexport const removeExtensionFromLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tlocalStorage.setItem(\n\t\tActiveExtensionsKey,\n\t\tJSON.stringify(current.filter((localId) => localId !== id)),\n\t)\n}\n\n// Gets imported hardware accounts from local storage\nexport const getHardwareAccountsLocal = (): HardwareAccount[] => {\n\tconst accounts = localStorageOrDefault(\n\t\tHardwareAccountsKey,\n\t\t[],\n\t\ttrue,\n\t) as HardwareAccount[]\n\n\treturn accounts\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tExtensionEnableResults,\n\tExtensionInterface,\n} from '@w3ux/types'\nimport { formatExtensionAccounts } from './util'\n\n// Connects to provided extensions and gets all accounts\nexport const getAccountsFromExtensions = async (\n\textensions: ExtensionEnableResults,\n\tss58: number,\n): Promise<ExtensionAccount[]> => {\n\ttry {\n\t\tconst extensionEntries = Array.from(extensions.entries())\n\t\t\t.filter(([, { extension }]) => extension !== null)\n\t\t\t.map(\n\t\t\t\t([source, { extension }]) =>\n\t\t\t\t\t[source, extension] as [string, ExtensionInterface],\n\t\t\t)\n\n\t\tconst activeExtensions = extensionEntries.map(([, extension]) => extension)\n\n\t\tconst results = await Promise.allSettled(\n\t\t\tactiveExtensions.map((extension) => extension.accounts.get()),\n\t\t)\n\n\t\tconst allAccounts: ExtensionAccount[] = []\n\t\tfor (let i = 0; i < results.length; i++) {\n\t\t\tconst result = results[i]\n\t\t\tconst source = extensionEntries[i][0]\n\t\t\tconst signer = extensionEntries[i][1].signer\n\n\t\t\tif (result.status === 'fulfilled' && signer) {\n\t\t\t\tconst { value } = result\n\t\t\t\tconst accounts = formatExtensionAccounts(value, ss58).map(\n\t\t\t\t\t({ address, name }) => ({\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\tsigner,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\tallAccounts.push(...accounts)\n\t\t\t}\n\t\t}\n\t\treturn allAccounts\n\t} catch (e) {\n\t\tconsole.error('Error during account formatting: ', e)\n\t\treturn []\n\t}\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\n// Extension account subscription unsubs\nexport const unsubs: Record<string, () => void> = {}\n\n// Add an extension id to unsub state\nexport const addUnsub = (id: string, unsub: () => void) => {\n\tunsubs[id] = unsub\n}\n\n// Unsubscribe to all unsubs\nexport const unsubAll = () => {\n\tObject.values(unsubs).forEach((unsub) => {\n\t\tunsub()\n\t})\n}\n"],"mappings":"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","names":["import_utils"]}
|
package/accounts/index.js
CHANGED
|
@@ -28,21 +28,21 @@ var getHardwareAccounts = () => _hardwareAccounts.getValue();
|
|
|
28
28
|
var setHardwareAccounts = (accounts) => {
|
|
29
29
|
_hardwareAccounts.next(accounts);
|
|
30
30
|
};
|
|
31
|
-
var
|
|
31
|
+
var isMimir = (id) => window.self !== window.top && id === "mimir";
|
|
32
32
|
var hasValidEnable = (id) => {
|
|
33
33
|
try {
|
|
34
|
-
const enable =
|
|
34
|
+
const enable = isMimir(id) ? window.injectedWeb3[id].enable : window.parent.injectedWeb3[id].enable;
|
|
35
35
|
return enable !== void 0 && typeof enable === "function";
|
|
36
36
|
} catch {
|
|
37
37
|
return false;
|
|
38
38
|
}
|
|
39
39
|
};
|
|
40
40
|
var enableInjectedWeb3Entry = (id, dappName) => {
|
|
41
|
-
if (
|
|
42
|
-
const result2 = window.
|
|
41
|
+
if (isMimir(id)) {
|
|
42
|
+
const result2 = window.injectedWeb3[id].enable(dappName);
|
|
43
43
|
return result2;
|
|
44
44
|
}
|
|
45
|
-
const result = window.injectedWeb3[id].enable(dappName);
|
|
45
|
+
const result = window.parent.injectedWeb3[id].enable(dappName);
|
|
46
46
|
return result;
|
|
47
47
|
};
|
|
48
48
|
|
|
@@ -56,10 +56,10 @@ export {
|
|
|
56
56
|
setReconnectSync,
|
|
57
57
|
getHardwareAccounts,
|
|
58
58
|
setHardwareAccounts,
|
|
59
|
-
|
|
59
|
+
isMimir,
|
|
60
60
|
hasValidEnable,
|
|
61
61
|
enableInjectedWeb3Entry
|
|
62
62
|
};
|
|
63
63
|
/* @license Copyright 2024 w3ux authors & contributors
|
|
64
64
|
SPDX-License-Identifier: GPL-3.0-only */
|
|
65
|
-
//# sourceMappingURL=chunk-
|
|
65
|
+
//# sourceMappingURL=chunk-FS3ZTGV6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/util.ts"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExtensionStatus, HardwareAccount, Sync } from '@w3ux/types'\nimport {\n\t_extensionAccounts,\n\t_extensionsStatus,\n\t_hardwareAccounts,\n\t_reconnectSync,\n} from './subjects'\n\n// Gets an extension status\nexport const getStatus = (id: string): ExtensionStatus =>\n\t_extensionsStatus.getValue()[id] || undefined\n\n// Sets an extension status\nexport const setStatus = (id: string, status: ExtensionStatus) => {\n\tconst newValue = { ..._extensionsStatus.getValue() }\n\tnewValue[id] = status\n\t_extensionsStatus.next(newValue)\n}\n\n// Removes an extension status\nexport const removeStatus = (id: string) => {\n\tconst { [id]: _, ...rest } = _extensionsStatus.getValue()\n\t_extensionsStatus.next(rest)\n}\n\n// Whether an extension can be connected\nexport const canConnect = (id: string) =>\n\t![undefined, 'connected'].includes(_extensionsStatus.getValue()[id])\n\n// Reset accounts\nexport const resetAccounts = () => {\n\t_extensionAccounts.next([])\n}\n\n// Get previously enabled extension reconnect sync status\nexport const getReconnectSync = () => _reconnectSync.getValue()\n\n// Set previously enabled extension reconnect sync status\nexport const setReconnectSync = (sync: Sync) => {\n\t_reconnectSync.next(sync)\n}\n\n// Get hardware accounts\nexport const getHardwareAccounts = () => _hardwareAccounts.getValue()\n\n// Set hardware accounts\nexport const setHardwareAccounts = (accounts: HardwareAccount[]) => {\n\t_hardwareAccounts.next(accounts)\n}\n\n// Checks whether app is open in a mimir iframe\nexport const isMimir = (id: string): boolean =>\n\twindow.self !== window.top && id === 'mimir'\n\n// Check if an injected web3 entry has a valid enable function\nexport const hasValidEnable = (id: string): boolean => {\n\ttry {\n\t\tconst enable = isMimir(id)\n\t\t\t? window.injectedWeb3![id].enable\n\t\t\t: window.parent.injectedWeb3![id].enable\n\n\t\treturn enable !== undefined && typeof enable === 'function'\n\t} catch {\n\t\treturn false\n\t}\n}\n\n// Enable an injected web3 entry\nexport const enableInjectedWeb3Entry = (id: string, dappName: string) => {\n\tif (isMimir(id)) {\n\t\tconst result = window.injectedWeb3![id].enable(dappName)\n\t\treturn result\n\t}\n\tconst result = window.parent.injectedWeb3![id].enable(dappName)\n\treturn result\n}\n"],"mappings":";;;;;;;;AAYO,IAAM,YAAY,CAAC,OACzB,kBAAkB,SAAS,EAAE,EAAE,KAAK;AAG9B,IAAM,YAAY,CAAC,IAAY,WAA4B;AACjE,QAAM,WAAW,EAAE,GAAG,kBAAkB,SAAS,EAAE;AACnD,WAAS,EAAE,IAAI;AACf,oBAAkB,KAAK,QAAQ;AAChC;AAGO,IAAM,eAAe,CAAC,OAAe;AAC3C,QAAM,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,IAAI,kBAAkB,SAAS;AACxD,oBAAkB,KAAK,IAAI;AAC5B;AAGO,IAAM,aAAa,CAAC,OAC1B,CAAC,CAAC,QAAW,WAAW,EAAE,SAAS,kBAAkB,SAAS,EAAE,EAAE,CAAC;AAG7D,IAAM,gBAAgB,MAAM;AAClC,qBAAmB,KAAK,CAAC,CAAC;AAC3B;AAGO,IAAM,mBAAmB,MAAM,eAAe,SAAS;AAGvD,IAAM,mBAAmB,CAAC,SAAe;AAC/C,iBAAe,KAAK,IAAI;AACzB;AAGO,IAAM,sBAAsB,MAAM,kBAAkB,SAAS;AAG7D,IAAM,sBAAsB,CAAC,aAAgC;AACnE,oBAAkB,KAAK,QAAQ;AAChC;AAGO,IAAM,UAAU,CAAC,OACvB,OAAO,SAAS,OAAO,OAAO,OAAO;AAG/B,IAAM,iBAAiB,CAAC,OAAwB;AACtD,MAAI;AACH,UAAM,SAAS,QAAQ,EAAE,IACtB,OAAO,aAAc,EAAE,EAAE,SACzB,OAAO,OAAO,aAAc,EAAE,EAAE;AAEnC,WAAO,WAAW,UAAa,OAAO,WAAW;AAAA,EAClD,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAGO,IAAM,0BAA0B,CAAC,IAAY,aAAqB;AACxE,MAAI,QAAQ,EAAE,GAAG;AAChB,UAAMA,UAAS,OAAO,aAAc,EAAE,EAAE,OAAO,QAAQ;AACvD,WAAOA;AAAA,EACR;AACA,QAAM,SAAS,OAAO,OAAO,aAAc,EAAE,EAAE,OAAO,QAAQ;AAC9D,SAAO;AACR;","names":["result"]}
|
|
@@ -13,7 +13,7 @@ var processExtensionAccounts = (config, signer, newAccounts) => {
|
|
|
13
13
|
newAccounts = formatExtensionAccounts(newAccounts, ss58);
|
|
14
14
|
const removedAccounts = _extensionAccounts.getValue().filter((j) => j.source === source).filter((j) => !newAccounts.find((i) => i.address === j.address));
|
|
15
15
|
newAccounts = newAccounts.filter(
|
|
16
|
-
({ address }) => !_extensionAccounts.getValue().find((j) => j.address === address)
|
|
16
|
+
({ address }) => !_extensionAccounts.getValue().find((j) => j.address === address && j.source === source)
|
|
17
17
|
);
|
|
18
18
|
newAccounts = newAccounts.map(({ address, name }) => ({
|
|
19
19
|
address,
|
|
@@ -45,7 +45,9 @@ var updateAccounts = ({
|
|
|
45
45
|
add,
|
|
46
46
|
remove
|
|
47
47
|
}) => {
|
|
48
|
-
const newAccounts = [..._extensionAccounts.getValue()].concat(add).filter(
|
|
48
|
+
const newAccounts = [..._extensionAccounts.getValue()].concat(add).filter(
|
|
49
|
+
(a) => remove.find((s) => s.address === a.address && s.source === a.source) === void 0
|
|
50
|
+
);
|
|
49
51
|
_extensionAccounts.next(newAccounts);
|
|
50
52
|
};
|
|
51
53
|
|
|
@@ -66,14 +68,14 @@ var getAccountsFromExtensions = async (extensions, ss58) => {
|
|
|
66
68
|
const signer = extensionEntries[i][1].signer;
|
|
67
69
|
if (result.status === "fulfilled" && signer) {
|
|
68
70
|
const { value } = result;
|
|
69
|
-
const accounts = formatExtensionAccounts(value, ss58).
|
|
70
|
-
({ address }) =>
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
71
|
+
const accounts = formatExtensionAccounts(value, ss58).map(
|
|
72
|
+
({ address, name }) => ({
|
|
73
|
+
address,
|
|
74
|
+
name,
|
|
75
|
+
source,
|
|
76
|
+
signer
|
|
77
|
+
})
|
|
78
|
+
);
|
|
77
79
|
allAccounts.push(...accounts);
|
|
78
80
|
}
|
|
79
81
|
}
|
|
@@ -106,4 +108,4 @@ export {
|
|
|
106
108
|
};
|
|
107
109
|
/* @license Copyright 2024 w3ux authors & contributors
|
|
108
110
|
SPDX-License-Identifier: GPL-3.0-only */
|
|
109
|
-
//# sourceMappingURL=chunk-
|
|
111
|
+
//# sourceMappingURL=chunk-TPEE4DI4.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\tExtensionAccount,\n\tProcessExtensionAccountsResult,\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\tsource: string\n\tss58: number\n}\nexport const processExtensionAccounts = (\n\tconfig: Config,\n\tsigner: unknown,\n\tnewAccounts: ExtensionAccount[],\n): ProcessExtensionAccountsResult => {\n\tconst { source, ss58 } = config\n\tif (!newAccounts.length) {\n\t\treturn DefaultProcessExtensionResult\n\t}\n\n\t// Get valid accounts from extension\n\tnewAccounts = formatExtensionAccounts(newAccounts, ss58)\n\n\t// Find any accounts that have been removed from this extension\n\tconst removedAccounts = _extensionAccounts\n\t\t.getValue()\n\t\t.filter((j) => j.source === source)\n\t\t.filter((j) => !newAccounts.find((i) => i.address === j.address))\n\n\t// Remove accounts that have already been imported\n\tnewAccounts = newAccounts.filter(\n\t\t({ address }) =>\n\t\t\t!_extensionAccounts\n\t\t\t\t.getValue()\n\t\t\t\t.find((j) => j.address === address && j.source === source),\n\t)\n\n\t// Format accounts properties\n\tnewAccounts = newAccounts.map(({ address, name }) => ({\n\t\taddress,\n\t\tname,\n\t\tsource,\n\t\tsigner,\n\t}))\n\n\t// Update observable state\n\tupdateAccounts({\n\t\tadd: newAccounts,\n\t\tremove: removedAccounts,\n\t})\n\n\treturn {\n\t\tnewAccounts,\n\t\tremovedAccounts: [...removedAccounts],\n\t}\n}\n\n// Formats accounts to correct ss58 and removes invalid accounts\nexport const formatExtensionAccounts = (\n\taccounts: ExtensionAccount[],\n\tss58: number,\n) => {\n\taccounts = accounts\n\t\t// Remove accounts that do not contain correctly formatted addresses\n\t\t.filter(({ address }) => isValidAddress(address))\n\t\t// Reformat addresses to ensure default ss58 format\n\t\t.map((account) => {\n\t\t\tconst formattedAddress = formatAccountSs58(account.address, ss58)\n\t\t\tif (!formattedAddress) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\taccount.address = formattedAddress\n\t\t\treturn account\n\t\t})\n\t\t// Remove null entries resulting from invalid formatted addresses\n\t\t.filter((account) => account !== null)\n\n\treturn accounts\n}\n\n// Updates accounts observable based on removed and added accounts\nexport const updateAccounts = ({\n\tadd,\n\tremove,\n}: {\n\tadd: ExtensionAccount[]\n\tremove: ExtensionAccount[]\n}) => {\n\tconst newAccounts = [..._extensionAccounts.getValue()]\n\t\t.concat(add)\n\t\t.filter(\n\t\t\t(a) =>\n\t\t\t\tremove.find((s) => s.address === a.address && s.source === a.source) ===\n\t\t\t\tundefined,\n\t\t)\n\t_extensionAccounts.next(newAccounts)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tExtensionEnableResults,\n\tExtensionInterface,\n} from '@w3ux/types'\nimport { formatExtensionAccounts } from './util'\n\n// Connects to provided extensions and gets all accounts\nexport const getAccountsFromExtensions = async (\n\textensions: ExtensionEnableResults,\n\tss58: number,\n): Promise<ExtensionAccount[]> => {\n\ttry {\n\t\tconst extensionEntries = Array.from(extensions.entries())\n\t\t\t.filter(([, { extension }]) => extension !== null)\n\t\t\t.map(\n\t\t\t\t([source, { extension }]) =>\n\t\t\t\t\t[source, extension] as [string, ExtensionInterface],\n\t\t\t)\n\n\t\tconst activeExtensions = extensionEntries.map(([, extension]) => extension)\n\n\t\tconst results = await Promise.allSettled(\n\t\t\tactiveExtensions.map((extension) => extension.accounts.get()),\n\t\t)\n\n\t\tconst allAccounts: ExtensionAccount[] = []\n\t\tfor (let i = 0; i < results.length; i++) {\n\t\t\tconst result = results[i]\n\t\t\tconst source = extensionEntries[i][0]\n\t\t\tconst signer = extensionEntries[i][1].signer\n\n\t\t\tif (result.status === 'fulfilled' && signer) {\n\t\t\t\tconst { value } = result\n\t\t\t\tconst accounts = formatExtensionAccounts(value, ss58).map(\n\t\t\t\t\t({ address, name }) => ({\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\tsigner,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\tallAccounts.push(...accounts)\n\t\t\t}\n\t\t}\n\t\treturn allAccounts\n\t} catch (e) {\n\t\tconsole.error('Error during account formatting: ', e)\n\t\treturn []\n\t}\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\n// Extension account subscription unsubs\nexport const unsubs: Record<string, () => void> = {}\n\n// Add an extension id to unsub state\nexport const addUnsub = (id: string, unsub: () => void) => {\n\tunsubs[id] = unsub\n}\n\n// Unsubscribe to all unsubs\nexport const unsubAll = () => {\n\tObject.values(unsubs).forEach((unsub) => {\n\t\tunsub()\n\t})\n}\n"],"mappings":";;;;;;AAOA,SAAS,mBAAmB,sBAAsB;AAU3C,IAAM,2BAA2B,CACvC,QACA,QACA,gBACoC;AACpC,QAAM,EAAE,QAAQ,KAAK,IAAI;AACzB,MAAI,CAAC,YAAY,QAAQ;AACxB,WAAO;AAAA,EACR;AAGA,gBAAc,wBAAwB,aAAa,IAAI;AAGvD,QAAM,kBAAkB,mBACtB,SAAS,EACT,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,EACjC,OAAO,CAAC,MAAM,CAAC,YAAY,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC;AAGjE,gBAAc,YAAY;AAAA,IACzB,CAAC,EAAE,QAAQ,MACV,CAAC,mBACC,SAAS,EACT,KAAK,CAAC,MAAM,EAAE,YAAY,WAAW,EAAE,WAAW,MAAM;AAAA,EAC5D;AAGA,gBAAc,YAAY,IAAI,CAAC,EAAE,SAAS,KAAK,OAAO;AAAA,IACrD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,EAAE;AAGF,iBAAe;AAAA,IACd,KAAK;AAAA,IACL,QAAQ;AAAA,EACT,CAAC;AAED,SAAO;AAAA,IACN;AAAA,IACA,iBAAiB,CAAC,GAAG,eAAe;AAAA,EACrC;AACD;AAGO,IAAM,0BAA0B,CACtC,UACA,SACI;AACJ,aAAW,SAET,OAAO,CAAC,EAAE,QAAQ,MAAM,eAAe,OAAO,CAAC,EAE/C,IAAI,CAAC,YAAY;AACjB,UAAM,mBAAmB,kBAAkB,QAAQ,SAAS,IAAI;AAChE,QAAI,CAAC,kBAAkB;AACtB,aAAO;AAAA,IACR;AACA,YAAQ,UAAU;AAClB,WAAO;AAAA,EACR,CAAC,EAEA,OAAO,CAAC,YAAY,YAAY,IAAI;AAEtC,SAAO;AACR;AAGO,IAAM,iBAAiB,CAAC;AAAA,EAC9B;AAAA,EACA;AACD,MAGM;AACL,QAAM,cAAc,CAAC,GAAG,mBAAmB,SAAS,CAAC,EACnD,OAAO,GAAG,EACV;AAAA,IACA,CAAC,MACA,OAAO,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,MACnE;AAAA,EACF;AACD,qBAAmB,KAAK,WAAW;AACpC;;;AC5FO,IAAM,4BAA4B,OACxC,YACA,SACiC;AACjC,MAAI;AACH,UAAM,mBAAmB,MAAM,KAAK,WAAW,QAAQ,CAAC,EACtD,OAAO,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,MAAM,cAAc,IAAI,EAChD;AAAA,MACA,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,MACtB,CAAC,QAAQ,SAAS;AAAA,IACpB;AAED,UAAM,mBAAmB,iBAAiB,IAAI,CAAC,CAAC,EAAE,SAAS,MAAM,SAAS;AAE1E,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC7B,iBAAiB,IAAI,CAAC,cAAc,UAAU,SAAS,IAAI,CAAC;AAAA,IAC7D;AAEA,UAAM,cAAkC,CAAC;AACzC,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACxC,YAAM,SAAS,QAAQ,CAAC;AACxB,YAAM,SAAS,iBAAiB,CAAC,EAAE,CAAC;AACpC,YAAM,SAAS,iBAAiB,CAAC,EAAE,CAAC,EAAE;AAEtC,UAAI,OAAO,WAAW,eAAe,QAAQ;AAC5C,cAAM,EAAE,MAAM,IAAI;AAClB,cAAM,WAAW,wBAAwB,OAAO,IAAI,EAAE;AAAA,UACrD,CAAC,EAAE,SAAS,KAAK,OAAO;AAAA,YACvB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACD;AAAA,QACD;AACA,oBAAY,KAAK,GAAG,QAAQ;AAAA,MAC7B;AAAA,IACD;AACA,WAAO;AAAA,EACR,SAAS,GAAG;AACX,YAAQ,MAAM,qCAAqC,CAAC;AACpD,WAAO,CAAC;AAAA,EACT;AACD;;;ACjDO,IAAM,SAAqC,CAAC;AAG5C,IAAM,WAAW,CAAC,IAAY,UAAsB;AAC1D,SAAO,EAAE,IAAI;AACd;AAGO,IAAM,WAAW,MAAM;AAC7B,SAAO,OAAO,MAAM,EAAE,QAAQ,CAAC,UAAU;AACxC,UAAM;AAAA,EACP,CAAC;AACF;","names":[]}
|
package/extensions/index.cjs
CHANGED
|
@@ -106,7 +106,7 @@ var processExtensionAccounts = (config, signer, newAccounts) => {
|
|
|
106
106
|
newAccounts = formatExtensionAccounts(newAccounts, ss58);
|
|
107
107
|
const removedAccounts = _extensionAccounts.getValue().filter((j) => j.source === source).filter((j) => !newAccounts.find((i) => i.address === j.address));
|
|
108
108
|
newAccounts = newAccounts.filter(
|
|
109
|
-
({ address }) => !_extensionAccounts.getValue().find((j) => j.address === address)
|
|
109
|
+
({ address }) => !_extensionAccounts.getValue().find((j) => j.address === address && j.source === source)
|
|
110
110
|
);
|
|
111
111
|
newAccounts = newAccounts.map(({ address, name }) => ({
|
|
112
112
|
address,
|
|
@@ -138,7 +138,9 @@ var updateAccounts = ({
|
|
|
138
138
|
add,
|
|
139
139
|
remove
|
|
140
140
|
}) => {
|
|
141
|
-
const newAccounts = [..._extensionAccounts.getValue()].concat(add).filter(
|
|
141
|
+
const newAccounts = [..._extensionAccounts.getValue()].concat(add).filter(
|
|
142
|
+
(a) => remove.find((s) => s.address === a.address && s.source === a.source) === void 0
|
|
143
|
+
);
|
|
142
144
|
_extensionAccounts.next(newAccounts);
|
|
143
145
|
};
|
|
144
146
|
|
|
@@ -147,21 +149,21 @@ var canConnect = (id) => ![void 0, "connected"].includes(_extensionsStatus.getVa
|
|
|
147
149
|
var setReconnectSync = (sync) => {
|
|
148
150
|
_reconnectSync.next(sync);
|
|
149
151
|
};
|
|
150
|
-
var
|
|
152
|
+
var isMimir = (id) => window.self !== window.top && id === "mimir";
|
|
151
153
|
var hasValidEnable = (id) => {
|
|
152
154
|
try {
|
|
153
|
-
const enable =
|
|
155
|
+
const enable = isMimir(id) ? window.injectedWeb3[id].enable : window.parent.injectedWeb3[id].enable;
|
|
154
156
|
return enable !== void 0 && typeof enable === "function";
|
|
155
157
|
} catch {
|
|
156
158
|
return false;
|
|
157
159
|
}
|
|
158
160
|
};
|
|
159
161
|
var enableInjectedWeb3Entry = (id, dappName) => {
|
|
160
|
-
if (
|
|
161
|
-
const result2 = window.
|
|
162
|
+
if (isMimir(id)) {
|
|
163
|
+
const result2 = window.injectedWeb3[id].enable(dappName);
|
|
162
164
|
return result2;
|
|
163
165
|
}
|
|
164
|
-
const result = window.injectedWeb3[id].enable(dappName);
|
|
166
|
+
const result = window.parent.injectedWeb3[id].enable(dappName);
|
|
165
167
|
return result;
|
|
166
168
|
};
|
|
167
169
|
|
|
@@ -367,14 +369,14 @@ var getAccountsFromExtensions = async (extensions2, ss58) => {
|
|
|
367
369
|
const signer = extensionEntries[i][1].signer;
|
|
368
370
|
if (result.status === "fulfilled" && signer) {
|
|
369
371
|
const { value } = result;
|
|
370
|
-
const accounts = formatExtensionAccounts(value, ss58).
|
|
371
|
-
({ address }) =>
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
372
|
+
const accounts = formatExtensionAccounts(value, ss58).map(
|
|
373
|
+
({ address, name }) => ({
|
|
374
|
+
address,
|
|
375
|
+
name,
|
|
376
|
+
source,
|
|
377
|
+
signer
|
|
378
|
+
})
|
|
379
|
+
);
|
|
378
380
|
allAccounts.push(...accounts);
|
|
379
381
|
}
|
|
380
382
|
}
|
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/extensions/mimir.ts","../../src/accounts/get.ts","../../src/extensions/reconnect.ts"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nexport * from './connect'\nexport * from './discover'\nexport * from './enable'\nexport * from './init'\nexport * from './mimir'\nexport * from './reconnect'\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\n// Extension account subscription unsubs\nexport const unsubs: Record<string, () => void> = {}\n\n// Add an extension id to unsub state\nexport const addUnsub = (id: string, unsub: () => void) => {\n\tunsubs[id] = unsub\n}\n\n// Unsubscribe to all unsubs\nexport const unsubAll = () => {\n\tObject.values(unsubs).forEach((unsub) => {\n\t\tunsub()\n\t})\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tProcessExtensionAccountsResult,\n} from '@w3ux/types'\nimport { formatAccountSs58, isValidAddress } from '@w3ux/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\tsource: string\n\tss58: number\n}\nexport const processExtensionAccounts = (\n\tconfig: Config,\n\tsigner: unknown,\n\tnewAccounts: ExtensionAccount[],\n): ProcessExtensionAccountsResult => {\n\tconst { source, ss58 } = config\n\tif (!newAccounts.length) {\n\t\treturn DefaultProcessExtensionResult\n\t}\n\n\t// Get valid accounts from extension\n\tnewAccounts = formatExtensionAccounts(newAccounts, ss58)\n\n\t// Find any accounts that have been removed from this extension\n\tconst removedAccounts = _extensionAccounts\n\t\t.getValue()\n\t\t.filter((j) => j.source === source)\n\t\t.filter((j) => !newAccounts.find((i) => i.address === j.address))\n\n\t// Remove accounts that have already been imported\n\tnewAccounts = newAccounts.filter(\n\t\t({ address }) =>\n\t\t\t!_extensionAccounts.getValue().find((j) => j.address === address),\n\t)\n\n\t// Format accounts properties\n\tnewAccounts = newAccounts.map(({ address, name }) => ({\n\t\taddress,\n\t\tname,\n\t\tsource,\n\t\tsigner,\n\t}))\n\n\t// Update observable state\n\tupdateAccounts({\n\t\tadd: newAccounts,\n\t\tremove: removedAccounts,\n\t})\n\n\treturn {\n\t\tnewAccounts,\n\t\tremovedAccounts: [...removedAccounts],\n\t}\n}\n\n// Formats accounts to correct ss58 and removes invalid accounts\nexport const formatExtensionAccounts = (\n\taccounts: ExtensionAccount[],\n\tss58: number,\n) => {\n\taccounts = accounts\n\t\t// Remove accounts that do not contain correctly formatted addresses\n\t\t.filter(({ address }) => isValidAddress(address))\n\t\t// Reformat addresses to ensure default ss58 format\n\t\t.map((account) => {\n\t\t\tconst formattedAddress = formatAccountSs58(account.address, ss58)\n\t\t\tif (!formattedAddress) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\taccount.address = formattedAddress\n\t\t\treturn account\n\t\t})\n\t\t// Remove null entries resulting from invalid formatted addresses\n\t\t.filter((account) => account !== null)\n\n\treturn accounts\n}\n\n// Updates accounts observable based on removed and added accounts\nexport const updateAccounts = ({\n\tadd,\n\tremove,\n}: {\n\tadd: ExtensionAccount[]\n\tremove: ExtensionAccount[]\n}) => {\n\tconst newAccounts = [..._extensionAccounts.getValue()]\n\t\t.concat(add)\n\t\t.filter((a) => remove.find((s) => s.address === a.address) === undefined)\n\t_extensionAccounts.next(newAccounts)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ProcessExtensionAccountsResult } from '@w3ux/types'\n\nexport const DefaultProcessExtensionResult: ProcessExtensionAccountsResult = {\n\tnewAccounts: [],\n\tremovedAccounts: [],\n}\n\n// Local storage active extensions key\nexport const ActiveExtensionsKey = 'active_extensions'\nexport const HardwareAccountsKey = 'hardware_accounts'\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tExtensionsStatus,\n\tHardwareAccount,\n\tSync,\n} from '@w3ux/types'\nimport { BehaviorSubject } from 'rxjs'\nimport { getHardwareAccountsLocal } from './local'\n\n// NOTE: These subjects stay private to the package and are not exported\n\nexport const _extensionsStatus = new BehaviorSubject<ExtensionsStatus>({})\nexport const _gettingExtensions = new BehaviorSubject<boolean>(true)\nexport const _initialisedExtensions = new BehaviorSubject<string[]>([])\nexport const _reconnectSync = new BehaviorSubject<Sync>('unsynced')\nexport const _extensionAccounts = new BehaviorSubject<ExtensionAccount[]>([])\nexport const _hardwareAccounts = new BehaviorSubject<HardwareAccount[]>(\n\tgetHardwareAccountsLocal(),\n)\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { HardwareAccount } from '@w3ux/types'\nimport { localStorageOrDefault } from '@w3ux/utils'\nimport { ActiveExtensionsKey, HardwareAccountsKey } from './consts'\n\n// Gets all active extensions from local storage\nexport const getActiveExtensionsLocal = (): string[] => {\n\tconst current = localStorageOrDefault<string[]>(ActiveExtensionsKey, [], true)\n\treturn Array.isArray(current) ? current : []\n}\n\n// Check if an extension exists in local storage\nexport const isExtensionLocal = (id: string): boolean =>\n\tgetActiveExtensionsLocal().includes(id)\n\n// Adds an extension to local storage\nexport const addExtensionToLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tif (!current.includes(id)) {\n\t\tlocalStorage.setItem(ActiveExtensionsKey, JSON.stringify([...current, id]))\n\t}\n}\n\n// Removes extension from local storage\nexport const removeExtensionFromLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tlocalStorage.setItem(\n\t\tActiveExtensionsKey,\n\t\tJSON.stringify(current.filter((localId) => localId !== id)),\n\t)\n}\n\n// Gets imported hardware accounts from local storage\nexport const getHardwareAccountsLocal = (): HardwareAccount[] => {\n\tconst accounts = localStorageOrDefault(\n\t\tHardwareAccountsKey,\n\t\t[],\n\t\ttrue,\n\t) as HardwareAccount[]\n\n\treturn 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\t_extensionAccounts,\n\t_extensionsStatus,\n\t_hardwareAccounts,\n\t_reconnectSync,\n} from './subjects'\n\n// Gets an extension status\nexport const getStatus = (id: string): ExtensionStatus =>\n\t_extensionsStatus.getValue()[id] || undefined\n\n// Sets an extension status\nexport const setStatus = (id: string, status: ExtensionStatus) => {\n\tconst newValue = { ..._extensionsStatus.getValue() }\n\tnewValue[id] = status\n\t_extensionsStatus.next(newValue)\n}\n\n// Removes an extension status\nexport const removeStatus = (id: string) => {\n\tconst { [id]: _, ...rest } = _extensionsStatus.getValue()\n\t_extensionsStatus.next(rest)\n}\n\n// Whether an extension can be connected\nexport const canConnect = (id: string) =>\n\t![undefined, 'connected'].includes(_extensionsStatus.getValue()[id])\n\n// Reset accounts\nexport const resetAccounts = () => {\n\t_extensionAccounts.next([])\n}\n\n// Get previously enabled extension reconnect sync status\nexport const getReconnectSync = () => _reconnectSync.getValue()\n\n// Set previously enabled extension reconnect sync status\nexport const setReconnectSync = (sync: Sync) => {\n\t_reconnectSync.next(sync)\n}\n\n// Get hardware accounts\nexport const getHardwareAccounts = () => _hardwareAccounts.getValue()\n\n// Set hardware accounts\nexport const setHardwareAccounts = (accounts: HardwareAccount[]) => {\n\t_hardwareAccounts.next(accounts)\n}\n\n// Checks whether app is open in an iframe\nexport const isInIframe = (): boolean => window.self !== window.top\n\n// Check if an injected web3 entry has a valid enable function\nexport const hasValidEnable = (id: string): boolean => {\n\ttry {\n\t\tconst enable = isInIframe()\n\t\t\t? window.parent.injectedWeb3![id].enable\n\t\t\t: window.injectedWeb3![id].enable\n\n\t\treturn enable !== undefined && typeof enable === 'function'\n\t} catch {\n\t\treturn false\n\t}\n}\n\n// Enable an injected web3 entry\nexport const enableInjectedWeb3Entry = (id: string, dappName: string) => {\n\tif (isInIframe()) {\n\t\tconst result = window.parent.injectedWeb3![id].enable(dappName)\n\t\treturn result\n\t}\n\tconst result = window.injectedWeb3![id].enable(dappName)\n\treturn result\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExtensionAccount, ExtensionInterface } from '@w3ux/types'\nimport { addUnsub } from '../accounts/unsubs'\nimport { processExtensionAccounts } from '../accounts/util'\nimport { canConnect } from '../util'\nimport { initExtensions } from './index'\n\n// Handles accounts from a single extension\nconst handleAccounts = (\n\tss58: number,\n\tid: string,\n\textension: ExtensionInterface,\n\taccounts: ExtensionAccount[],\n) => {\n\tprocessExtensionAccounts(\n\t\t{\n\t\t\tsource: id,\n\t\t\tss58,\n\t\t},\n\t\textension.signer,\n\t\taccounts,\n\t)\n}\n\n// Connects to a single extension and processes its accounts\nexport const connectExtension = async (\n\tdappName: string,\n\tss58: number,\n\tid: string,\n): Promise<boolean> => {\n\tif (canConnect(id)) {\n\t\tconst { connected } = await initExtensions(dappName, [id])\n\t\tif (connected.size === 0) {\n\t\t\treturn false\n\t\t}\n\t\tconst result = connected.get(id)\n\t\tconst extension = result?.extension\n\t\tconst canSubscribe =\n\t\t\t!!extension && typeof extension.accounts.subscribe === 'function'\n\n\t\t// If account subscriptions are not supported, simply get the account(s) from the extension,\n\t\t// otherwise, subscribe to accounts\n\t\tif (extension) {\n\t\t\tif (!canSubscribe) {\n\t\t\t\tconst accounts = await extension.accounts.get()\n\t\t\t\thandleAccounts(ss58, id, extension, accounts)\n\t\t\t} else {\n\t\t\t\tconst unsub = extension.accounts.subscribe((accounts) => {\n\t\t\t\t\thandleAccounts(ss58, id, extension, accounts)\n\t\t\t\t})\n\t\t\t\taddUnsub(id, unsub)\n\t\t\t}\n\t\t}\n\t\treturn true\n\t}\n\treturn false\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport extensions from '@w3ux/extension-assets'\nimport { _extensionsStatus, _gettingExtensions } from '../subjects'\n\n// Gets extensions from injectedWeb3\nexport const getExtensions = async () => {\n\t_gettingExtensions.next(true)\n\tlet injectedWeb3Interval: ReturnType<typeof setInterval> | undefined\n\n\t// Format installed extensions\n\tconst formatInstalled = () =>\n\t\tObject.keys(extensions).reduce(\n\t\t\t(acc, key) => {\n\t\t\t\tacc[key] =\n\t\t\t\t\twindow?.injectedWeb3?.[key] !== undefined ? 'installed' : acc[key]\n\t\t\t\treturn acc\n\t\t\t},\n\t\t\t{ ..._extensionsStatus.getValue() },\n\t\t)\n\n\t// Handle completed interval check\n\tconst handleCompleted = async (foundExtensions: boolean) => {\n\t\tclearInterval(injectedWeb3Interval)\n\t\tif (foundExtensions) {\n\t\t\t_extensionsStatus.next(formatInstalled())\n\t\t}\n\t\t_gettingExtensions.next(false)\n\t}\n\n\tconst interval = 200\n\tconst maxChecks = 10\n\tconst minVerifications = 2\n\n\t// Getter for the currently installed extensions\n\tlet counter = 0\n\tlet verifications = 0\n\tinjectedWeb3Interval = setInterval(() => {\n\t\tcounter++\n\t\tif (counter === maxChecks) {\n\t\t\thandleCompleted(false)\n\t\t} else {\n\t\t\tconst injected = window?.injectedWeb3\n\n\t\t\t// Check if injected exists and all extensions have a valid enable function\n\t\t\tconst ready =\n\t\t\t\tinjected !== undefined &&\n\t\t\t\tObject.entries(injected).every(\n\t\t\t\t\t([, ext]) => ext && typeof ext.enable === 'function',\n\t\t\t\t)\n\n\t\t\t// Increment verifications if the extensions are ready\n\t\t\tif (ready) {\n\t\t\t\tverifications++\n\t\t\t} else {\n\t\t\t\tverifications = 0\n\t\t\t}\n\n\t\t\tif (counter > 2 && verifications >= minVerifications) {\n\t\t\t\thandleCompleted(true)\n\t\t\t}\n\t\t}\n\t}, interval)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionEnableResult,\n\tExtensionEnableResults,\n\tExtensionInterface,\n} from '@w3ux/types'\nimport { enableInjectedWeb3Entry, hasValidEnable } from '../util'\n\n// Get extensions and enable them\nexport const enableExtensions = async (ids: string[], dappName: string) => {\n\tconst extensionIds = getExtensionsById(ids)\n\tconst enableResults = await doEnable(extensionIds, dappName)\n\n\treturn formatEnabledExtensions(extensionIds, enableResults)\n}\n\n// Gets extensions from injectedWeb3 by their ids\nconst getExtensionsById = (ids: string[]) => {\n\tconst validIds: string[] = []\n\tids.forEach((id) => {\n\t\tif (hasValidEnable(id)) {\n\t\t\tvalidIds.push(id)\n\t\t}\n\t})\n\treturn validIds\n}\n\n// Calls enable for the provided extensions\nconst doEnable = async (\n\textensionIds: string[],\n\tdappName: string,\n): Promise<PromiseSettledResult<ExtensionInterface>[]> =>\n\tawait Promise.allSettled(\n\t\tArray.from(extensionIds).map((id) => enableInjectedWeb3Entry(id, dappName)),\n\t)\n\nconst formatEnabledExtensions = (\n\textensionIds: string[],\n\tenabledResults: PromiseSettledResult<ExtensionInterface>[],\n): ExtensionEnableResults => {\n\tconst extensionsState = new Map<string, ExtensionEnableResult>()\n\n\tfor (let i = 0; i < enabledResults.length; i++) {\n\t\tconst result = enabledResults[i]\n\t\tconst id = extensionIds[i]\n\n\t\tif (result.status === 'fulfilled') {\n\t\t\textensionsState.set(id, {\n\t\t\t\textension: result.value,\n\t\t\t\tconnected: true,\n\t\t\t})\n\t\t} else if (result.status === 'rejected') {\n\t\t\textensionsState.set(id, {\n\t\t\t\textension: null,\n\t\t\t\tconnected: false,\n\t\t\t\terror: result.reason,\n\t\t\t})\n\t\t}\n\t}\n\treturn extensionsState\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExtensionEnableResults } from '@w3ux/types'\nimport { addExtensionToLocal, removeExtensionFromLocal } from '../local'\nimport { _extensionsStatus, _initialisedExtensions } from '../subjects'\nimport { enableExtensions } from './enable'\n\n// Connects to previously connected extensions, or to a specific set of extensions\nexport const initExtensions = async (\n\tdappName: string,\n\textensionIds: string[],\n): Promise<{ connected: ExtensionEnableResults }> => {\n\tif (!extensionIds.length) {\n\t\treturn {\n\t\t\tconnected: new Map(),\n\t\t}\n\t}\n\t// Get extensions and enable them\n\tconst enableResults = await enableExtensions(extensionIds, dappName)\n\n\t// Determine which extensions are connected and which have errors\n\tconst [connected, withError] = [\n\t\tfilterConnectedExtensions(enableResults),\n\t\tfilterFailedExtensions(enableResults),\n\t]\n\n\t// Manage local storage depending on connection status\n\tArray.from(connected.keys()).forEach((id) => {\n\t\taddExtensionToLocal(id)\n\t})\n\tArray.from(withError.keys()).forEach((id) => {\n\t\tremoveExtensionFromLocal(id)\n\t})\n\n\t// Handle new extension statuses\n\tconst newStatus = { ..._extensionsStatus.getValue() }\n\tArray.from(connected.keys()).forEach((id) => {\n\t\tnewStatus[id] = 'connected'\n\t})\n\tArray.from(withError.entries()).forEach(([id, { error }]) => {\n\t\tconst errStr = String(error || '')\n\t\tif (errStr.startsWith('Error')) {\n\t\t\t// Extension not found - remove from state\n\t\t\tif (errStr.substring(0, 17) === 'NotInstalledError') {\n\t\t\t\tdelete newStatus[id]\n\t\t\t} else {\n\t\t\t\t// Assume extension not authenticated\n\t\t\t\tnewStatus[id] = 'not_authenticated'\n\t\t\t}\n\t\t}\n\t})\n\n\t// Record initialised extensions\n\tconst newInitialised = [..._initialisedExtensions.getValue()]\n\textensionIds.forEach((id) => {\n\t\tif (!newInitialised.includes(id)) {\n\t\t\tnewInitialised.push(id)\n\t\t}\n\t})\n\n\t// Commit updates to observables\n\t_extensionsStatus.next(newStatus)\n\t_initialisedExtensions.next(newInitialised)\n\n\treturn { connected }\n}\n\n// Filter successfully connected extensions\nconst filterConnectedExtensions = (\n\textensions: ExtensionEnableResults,\n): ExtensionEnableResults =>\n\tnew Map(\n\t\tArray.from(extensions.entries()).filter(([, state]) => state.connected),\n\t)\n\n// Filter extensions that failed to connect\nconst filterFailedExtensions = (\n\textensions: ExtensionEnableResults,\n): ExtensionEnableResults =>\n\tnew Map(\n\t\tArray.from(extensions.entries()).filter(([, state]) => !state.connected),\n\t)\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { inject, isMimirReady, MIMIR_REGEXP } from '@mimirdev/apps-inject'\n\nexport const injectMimir = async () => {\n\tconst openInIframe = window !== window.parent\n\t// Return if not opened in an iframe\n\tif (!openInIframe) {\n\t\treturn\n\t}\n\tconst origin = await isMimirReady()\n\t// Return if not opened in Mimir\n\tif (!origin) {\n\t\treturn\n\t}\n\tif (MIMIR_REGEXP.test(origin)) {\n\t\tinject()\n\t}\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tExtensionEnableResults,\n\tExtensionInterface,\n} from '@w3ux/types'\nimport { formatExtensionAccounts } from './util'\n\n// Connects to provided extensions and gets all accounts\nexport const getAccountsFromExtensions = async (\n\textensions: ExtensionEnableResults,\n\tss58: number,\n): Promise<ExtensionAccount[]> => {\n\ttry {\n\t\tconst extensionEntries = Array.from(extensions.entries())\n\t\t\t.filter(([, { extension }]) => extension !== null)\n\t\t\t.map(\n\t\t\t\t([source, { extension }]) =>\n\t\t\t\t\t[source, extension] as [string, ExtensionInterface],\n\t\t\t)\n\n\t\tconst activeExtensions = extensionEntries.map(([, extension]) => extension)\n\n\t\tconst results = await Promise.allSettled(\n\t\t\tactiveExtensions.map((extension) => extension.accounts.get()),\n\t\t)\n\n\t\tconst allAccounts: ExtensionAccount[] = []\n\t\tfor (let i = 0; i < results.length; i++) {\n\t\t\tconst result = results[i]\n\t\t\tconst source = extensionEntries[i][0]\n\t\t\tconst signer = extensionEntries[i][1].signer\n\n\t\t\tif (result.status === 'fulfilled' && signer) {\n\t\t\t\tconst { value } = result\n\n\t\t\t\t// This is duplicating what `handleExtensionAccountsUpdate` is doing to accounts: --\n\t\t\t\tconst accounts = formatExtensionAccounts(value, ss58)\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t({ address }) => !allAccounts.find((a) => address === a.address),\n\t\t\t\t\t)\n\t\t\t\t\t.map(({ address, name }) => ({\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\tsigner,\n\t\t\t\t\t}))\n\t\t\t\tallAccounts.push(...accounts)\n\t\t\t}\n\t\t}\n\t\treturn allAccounts\n\t} catch (e) {\n\t\tconsole.error('Error during account formatting: ', e)\n\t\treturn []\n\t}\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport {\n\taddUnsub,\n\tgetAccountsFromExtensions,\n\tprocessExtensionAccounts,\n\tupdateAccounts,\n} from '../accounts/index'\nimport { getActiveExtensionsLocal } from '../local'\nimport { setReconnectSync } from '../util'\nimport { initExtensions } from '.'\n\nexport const reconnectExtensions = async (dappName: string, ss58: number) => {\n\tsetReconnectSync('syncing')\n\tconst { connected } = await initExtensions(\n\t\tdappName,\n\t\tgetActiveExtensionsLocal(),\n\t)\n\tif (connected.size > 0) {\n\t\t// Perform initial account state update\n\t\tupdateAccounts({\n\t\t\tadd: await getAccountsFromExtensions(connected, ss58),\n\t\t\tremove: [],\n\t\t})\n\n\t\t// If available, subscribe to accounts for each connected extension\n\t\tfor (const [id, { extension }] of Array.from(connected.entries())) {\n\t\t\tif (typeof extension!.accounts.subscribe === 'function') {\n\t\t\t\tconst unsub = extension!.accounts.subscribe((accounts) => {\n\t\t\t\t\tprocessExtensionAccounts(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsource: id,\n\t\t\t\t\t\t\tss58,\n\t\t\t\t\t\t},\n\t\t\t\t\t\textension!.signer,\n\t\t\t\t\t\taccounts,\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t\taddUnsub(id, unsub)\n\t\t\t}\n\t\t}\n\t}\n\tsetReconnectSync('synced')\n}\n"],"mappings":"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","names":["import_utils","result","extensions","extensions","extensions"]}
|
|
1
|
+
{"version":3,"sources":["../../src/extensions/index.ts","../../src/accounts/unsubs.ts","../../src/accounts/util.ts","../../src/consts.ts","../../src/subjects.ts","../../src/local.ts","../../src/util.ts","../../src/extensions/connect.ts","../../src/extensions/discover.ts","../../src/extensions/enable.ts","../../src/extensions/init.ts","../../src/extensions/mimir.ts","../../src/accounts/get.ts","../../src/extensions/reconnect.ts"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nexport * from './connect'\nexport * from './discover'\nexport * from './enable'\nexport * from './init'\nexport * from './mimir'\nexport * from './reconnect'\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\n// Extension account subscription unsubs\nexport const unsubs: Record<string, () => void> = {}\n\n// Add an extension id to unsub state\nexport const addUnsub = (id: string, unsub: () => void) => {\n\tunsubs[id] = unsub\n}\n\n// Unsubscribe to all unsubs\nexport const unsubAll = () => {\n\tObject.values(unsubs).forEach((unsub) => {\n\t\tunsub()\n\t})\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tProcessExtensionAccountsResult,\n} from '@w3ux/types'\nimport { formatAccountSs58, isValidAddress } from '@w3ux/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\tsource: string\n\tss58: number\n}\nexport const processExtensionAccounts = (\n\tconfig: Config,\n\tsigner: unknown,\n\tnewAccounts: ExtensionAccount[],\n): ProcessExtensionAccountsResult => {\n\tconst { source, ss58 } = config\n\tif (!newAccounts.length) {\n\t\treturn DefaultProcessExtensionResult\n\t}\n\n\t// Get valid accounts from extension\n\tnewAccounts = formatExtensionAccounts(newAccounts, ss58)\n\n\t// Find any accounts that have been removed from this extension\n\tconst removedAccounts = _extensionAccounts\n\t\t.getValue()\n\t\t.filter((j) => j.source === source)\n\t\t.filter((j) => !newAccounts.find((i) => i.address === j.address))\n\n\t// Remove accounts that have already been imported\n\tnewAccounts = newAccounts.filter(\n\t\t({ address }) =>\n\t\t\t!_extensionAccounts\n\t\t\t\t.getValue()\n\t\t\t\t.find((j) => j.address === address && j.source === source),\n\t)\n\n\t// Format accounts properties\n\tnewAccounts = newAccounts.map(({ address, name }) => ({\n\t\taddress,\n\t\tname,\n\t\tsource,\n\t\tsigner,\n\t}))\n\n\t// Update observable state\n\tupdateAccounts({\n\t\tadd: newAccounts,\n\t\tremove: removedAccounts,\n\t})\n\n\treturn {\n\t\tnewAccounts,\n\t\tremovedAccounts: [...removedAccounts],\n\t}\n}\n\n// Formats accounts to correct ss58 and removes invalid accounts\nexport const formatExtensionAccounts = (\n\taccounts: ExtensionAccount[],\n\tss58: number,\n) => {\n\taccounts = accounts\n\t\t// Remove accounts that do not contain correctly formatted addresses\n\t\t.filter(({ address }) => isValidAddress(address))\n\t\t// Reformat addresses to ensure default ss58 format\n\t\t.map((account) => {\n\t\t\tconst formattedAddress = formatAccountSs58(account.address, ss58)\n\t\t\tif (!formattedAddress) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\taccount.address = formattedAddress\n\t\t\treturn account\n\t\t})\n\t\t// Remove null entries resulting from invalid formatted addresses\n\t\t.filter((account) => account !== null)\n\n\treturn accounts\n}\n\n// Updates accounts observable based on removed and added accounts\nexport const updateAccounts = ({\n\tadd,\n\tremove,\n}: {\n\tadd: ExtensionAccount[]\n\tremove: ExtensionAccount[]\n}) => {\n\tconst newAccounts = [..._extensionAccounts.getValue()]\n\t\t.concat(add)\n\t\t.filter(\n\t\t\t(a) =>\n\t\t\t\tremove.find((s) => s.address === a.address && s.source === a.source) ===\n\t\t\t\tundefined,\n\t\t)\n\t_extensionAccounts.next(newAccounts)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ProcessExtensionAccountsResult } from '@w3ux/types'\n\nexport const DefaultProcessExtensionResult: ProcessExtensionAccountsResult = {\n\tnewAccounts: [],\n\tremovedAccounts: [],\n}\n\n// Local storage active extensions key\nexport const ActiveExtensionsKey = 'active_extensions'\nexport const HardwareAccountsKey = 'hardware_accounts'\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tExtensionsStatus,\n\tHardwareAccount,\n\tSync,\n} from '@w3ux/types'\nimport { BehaviorSubject } from 'rxjs'\nimport { getHardwareAccountsLocal } from './local'\n\n// NOTE: These subjects stay private to the package and are not exported\n\nexport const _extensionsStatus = new BehaviorSubject<ExtensionsStatus>({})\nexport const _gettingExtensions = new BehaviorSubject<boolean>(true)\nexport const _initialisedExtensions = new BehaviorSubject<string[]>([])\nexport const _reconnectSync = new BehaviorSubject<Sync>('unsynced')\nexport const _extensionAccounts = new BehaviorSubject<ExtensionAccount[]>([])\nexport const _hardwareAccounts = new BehaviorSubject<HardwareAccount[]>(\n\tgetHardwareAccountsLocal(),\n)\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { HardwareAccount } from '@w3ux/types'\nimport { localStorageOrDefault } from '@w3ux/utils'\nimport { ActiveExtensionsKey, HardwareAccountsKey } from './consts'\n\n// Gets all active extensions from local storage\nexport const getActiveExtensionsLocal = (): string[] => {\n\tconst current = localStorageOrDefault<string[]>(ActiveExtensionsKey, [], true)\n\treturn Array.isArray(current) ? current : []\n}\n\n// Check if an extension exists in local storage\nexport const isExtensionLocal = (id: string): boolean =>\n\tgetActiveExtensionsLocal().includes(id)\n\n// Adds an extension to local storage\nexport const addExtensionToLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tif (!current.includes(id)) {\n\t\tlocalStorage.setItem(ActiveExtensionsKey, JSON.stringify([...current, id]))\n\t}\n}\n\n// Removes extension from local storage\nexport const removeExtensionFromLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tlocalStorage.setItem(\n\t\tActiveExtensionsKey,\n\t\tJSON.stringify(current.filter((localId) => localId !== id)),\n\t)\n}\n\n// Gets imported hardware accounts from local storage\nexport const getHardwareAccountsLocal = (): HardwareAccount[] => {\n\tconst accounts = localStorageOrDefault(\n\t\tHardwareAccountsKey,\n\t\t[],\n\t\ttrue,\n\t) as HardwareAccount[]\n\n\treturn 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\t_extensionAccounts,\n\t_extensionsStatus,\n\t_hardwareAccounts,\n\t_reconnectSync,\n} from './subjects'\n\n// Gets an extension status\nexport const getStatus = (id: string): ExtensionStatus =>\n\t_extensionsStatus.getValue()[id] || undefined\n\n// Sets an extension status\nexport const setStatus = (id: string, status: ExtensionStatus) => {\n\tconst newValue = { ..._extensionsStatus.getValue() }\n\tnewValue[id] = status\n\t_extensionsStatus.next(newValue)\n}\n\n// Removes an extension status\nexport const removeStatus = (id: string) => {\n\tconst { [id]: _, ...rest } = _extensionsStatus.getValue()\n\t_extensionsStatus.next(rest)\n}\n\n// Whether an extension can be connected\nexport const canConnect = (id: string) =>\n\t![undefined, 'connected'].includes(_extensionsStatus.getValue()[id])\n\n// Reset accounts\nexport const resetAccounts = () => {\n\t_extensionAccounts.next([])\n}\n\n// Get previously enabled extension reconnect sync status\nexport const getReconnectSync = () => _reconnectSync.getValue()\n\n// Set previously enabled extension reconnect sync status\nexport const setReconnectSync = (sync: Sync) => {\n\t_reconnectSync.next(sync)\n}\n\n// Get hardware accounts\nexport const getHardwareAccounts = () => _hardwareAccounts.getValue()\n\n// Set hardware accounts\nexport const setHardwareAccounts = (accounts: HardwareAccount[]) => {\n\t_hardwareAccounts.next(accounts)\n}\n\n// Checks whether app is open in a mimir iframe\nexport const isMimir = (id: string): boolean =>\n\twindow.self !== window.top && id === 'mimir'\n\n// Check if an injected web3 entry has a valid enable function\nexport const hasValidEnable = (id: string): boolean => {\n\ttry {\n\t\tconst enable = isMimir(id)\n\t\t\t? window.injectedWeb3![id].enable\n\t\t\t: window.parent.injectedWeb3![id].enable\n\n\t\treturn enable !== undefined && typeof enable === 'function'\n\t} catch {\n\t\treturn false\n\t}\n}\n\n// Enable an injected web3 entry\nexport const enableInjectedWeb3Entry = (id: string, dappName: string) => {\n\tif (isMimir(id)) {\n\t\tconst result = window.injectedWeb3![id].enable(dappName)\n\t\treturn result\n\t}\n\tconst result = window.parent.injectedWeb3![id].enable(dappName)\n\treturn result\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExtensionAccount, ExtensionInterface } from '@w3ux/types'\nimport { addUnsub } from '../accounts/unsubs'\nimport { processExtensionAccounts } from '../accounts/util'\nimport { canConnect } from '../util'\nimport { initExtensions } from './index'\n\n// Handles accounts from a single extension\nconst handleAccounts = (\n\tss58: number,\n\tid: string,\n\textension: ExtensionInterface,\n\taccounts: ExtensionAccount[],\n) => {\n\tprocessExtensionAccounts(\n\t\t{\n\t\t\tsource: id,\n\t\t\tss58,\n\t\t},\n\t\textension.signer,\n\t\taccounts,\n\t)\n}\n\n// Connects to a single extension and processes its accounts\nexport const connectExtension = async (\n\tdappName: string,\n\tss58: number,\n\tid: string,\n): Promise<boolean> => {\n\tif (canConnect(id)) {\n\t\tconst { connected } = await initExtensions(dappName, [id])\n\t\tif (connected.size === 0) {\n\t\t\treturn false\n\t\t}\n\t\tconst result = connected.get(id)\n\t\tconst extension = result?.extension\n\t\tconst canSubscribe =\n\t\t\t!!extension && typeof extension.accounts.subscribe === 'function'\n\n\t\t// If account subscriptions are not supported, simply get the account(s) from the extension,\n\t\t// otherwise, subscribe to accounts\n\t\tif (extension) {\n\t\t\tif (!canSubscribe) {\n\t\t\t\tconst accounts = await extension.accounts.get()\n\t\t\t\thandleAccounts(ss58, id, extension, accounts)\n\t\t\t} else {\n\t\t\t\tconst unsub = extension.accounts.subscribe((accounts) => {\n\t\t\t\t\thandleAccounts(ss58, id, extension, accounts)\n\t\t\t\t})\n\t\t\t\taddUnsub(id, unsub)\n\t\t\t}\n\t\t}\n\t\treturn true\n\t}\n\treturn false\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport extensions from '@w3ux/extension-assets'\nimport { _extensionsStatus, _gettingExtensions } from '../subjects'\n\n// Gets extensions from injectedWeb3\nexport const getExtensions = async () => {\n\t_gettingExtensions.next(true)\n\tlet injectedWeb3Interval: ReturnType<typeof setInterval> | undefined\n\n\t// Format installed extensions\n\tconst formatInstalled = () =>\n\t\tObject.keys(extensions).reduce(\n\t\t\t(acc, key) => {\n\t\t\t\tacc[key] =\n\t\t\t\t\twindow?.injectedWeb3?.[key] !== undefined ? 'installed' : acc[key]\n\t\t\t\treturn acc\n\t\t\t},\n\t\t\t{ ..._extensionsStatus.getValue() },\n\t\t)\n\n\t// Handle completed interval check\n\tconst handleCompleted = async (foundExtensions: boolean) => {\n\t\tclearInterval(injectedWeb3Interval)\n\t\tif (foundExtensions) {\n\t\t\t_extensionsStatus.next(formatInstalled())\n\t\t}\n\t\t_gettingExtensions.next(false)\n\t}\n\n\tconst interval = 200\n\tconst maxChecks = 10\n\tconst minVerifications = 2\n\n\t// Getter for the currently installed extensions\n\tlet counter = 0\n\tlet verifications = 0\n\tinjectedWeb3Interval = setInterval(() => {\n\t\tcounter++\n\t\tif (counter === maxChecks) {\n\t\t\thandleCompleted(false)\n\t\t} else {\n\t\t\tconst injected = window?.injectedWeb3\n\n\t\t\t// Check if injected exists and all extensions have a valid enable function\n\t\t\tconst ready =\n\t\t\t\tinjected !== undefined &&\n\t\t\t\tObject.entries(injected).every(\n\t\t\t\t\t([, ext]) => ext && typeof ext.enable === 'function',\n\t\t\t\t)\n\n\t\t\t// Increment verifications if the extensions are ready\n\t\t\tif (ready) {\n\t\t\t\tverifications++\n\t\t\t} else {\n\t\t\t\tverifications = 0\n\t\t\t}\n\n\t\t\tif (counter > 2 && verifications >= minVerifications) {\n\t\t\t\thandleCompleted(true)\n\t\t\t}\n\t\t}\n\t}, interval)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionEnableResult,\n\tExtensionEnableResults,\n\tExtensionInterface,\n} from '@w3ux/types'\nimport { enableInjectedWeb3Entry, hasValidEnable } from '../util'\n\n// Get extensions and enable them\nexport const enableExtensions = async (ids: string[], dappName: string) => {\n\tconst extensionIds = getExtensionsById(ids)\n\tconst enableResults = await doEnable(extensionIds, dappName)\n\n\treturn formatEnabledExtensions(extensionIds, enableResults)\n}\n\n// Gets extensions from injectedWeb3 by their ids\nconst getExtensionsById = (ids: string[]) => {\n\tconst validIds: string[] = []\n\tids.forEach((id) => {\n\t\tif (hasValidEnable(id)) {\n\t\t\tvalidIds.push(id)\n\t\t}\n\t})\n\treturn validIds\n}\n\n// Calls enable for the provided extensions\nconst doEnable = async (\n\textensionIds: string[],\n\tdappName: string,\n): Promise<PromiseSettledResult<ExtensionInterface>[]> =>\n\tawait Promise.allSettled(\n\t\tArray.from(extensionIds).map((id) => enableInjectedWeb3Entry(id, dappName)),\n\t)\n\nconst formatEnabledExtensions = (\n\textensionIds: string[],\n\tenabledResults: PromiseSettledResult<ExtensionInterface>[],\n): ExtensionEnableResults => {\n\tconst extensionsState = new Map<string, ExtensionEnableResult>()\n\n\tfor (let i = 0; i < enabledResults.length; i++) {\n\t\tconst result = enabledResults[i]\n\t\tconst id = extensionIds[i]\n\n\t\tif (result.status === 'fulfilled') {\n\t\t\textensionsState.set(id, {\n\t\t\t\textension: result.value,\n\t\t\t\tconnected: true,\n\t\t\t})\n\t\t} else if (result.status === 'rejected') {\n\t\t\textensionsState.set(id, {\n\t\t\t\textension: null,\n\t\t\t\tconnected: false,\n\t\t\t\terror: result.reason,\n\t\t\t})\n\t\t}\n\t}\n\treturn extensionsState\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExtensionEnableResults } from '@w3ux/types'\nimport { addExtensionToLocal, removeExtensionFromLocal } from '../local'\nimport { _extensionsStatus, _initialisedExtensions } from '../subjects'\nimport { enableExtensions } from './enable'\n\n// Connects to previously connected extensions, or to a specific set of extensions\nexport const initExtensions = async (\n\tdappName: string,\n\textensionIds: string[],\n): Promise<{ connected: ExtensionEnableResults }> => {\n\tif (!extensionIds.length) {\n\t\treturn {\n\t\t\tconnected: new Map(),\n\t\t}\n\t}\n\t// Get extensions and enable them\n\tconst enableResults = await enableExtensions(extensionIds, dappName)\n\n\t// Determine which extensions are connected and which have errors\n\tconst [connected, withError] = [\n\t\tfilterConnectedExtensions(enableResults),\n\t\tfilterFailedExtensions(enableResults),\n\t]\n\n\t// Manage local storage depending on connection status\n\tArray.from(connected.keys()).forEach((id) => {\n\t\taddExtensionToLocal(id)\n\t})\n\tArray.from(withError.keys()).forEach((id) => {\n\t\tremoveExtensionFromLocal(id)\n\t})\n\n\t// Handle new extension statuses\n\tconst newStatus = { ..._extensionsStatus.getValue() }\n\tArray.from(connected.keys()).forEach((id) => {\n\t\tnewStatus[id] = 'connected'\n\t})\n\tArray.from(withError.entries()).forEach(([id, { error }]) => {\n\t\tconst errStr = String(error || '')\n\t\tif (errStr.startsWith('Error')) {\n\t\t\t// Extension not found - remove from state\n\t\t\tif (errStr.substring(0, 17) === 'NotInstalledError') {\n\t\t\t\tdelete newStatus[id]\n\t\t\t} else {\n\t\t\t\t// Assume extension not authenticated\n\t\t\t\tnewStatus[id] = 'not_authenticated'\n\t\t\t}\n\t\t}\n\t})\n\n\t// Record initialised extensions\n\tconst newInitialised = [..._initialisedExtensions.getValue()]\n\textensionIds.forEach((id) => {\n\t\tif (!newInitialised.includes(id)) {\n\t\t\tnewInitialised.push(id)\n\t\t}\n\t})\n\n\t// Commit updates to observables\n\t_extensionsStatus.next(newStatus)\n\t_initialisedExtensions.next(newInitialised)\n\n\treturn { connected }\n}\n\n// Filter successfully connected extensions\nconst filterConnectedExtensions = (\n\textensions: ExtensionEnableResults,\n): ExtensionEnableResults =>\n\tnew Map(\n\t\tArray.from(extensions.entries()).filter(([, state]) => state.connected),\n\t)\n\n// Filter extensions that failed to connect\nconst filterFailedExtensions = (\n\textensions: ExtensionEnableResults,\n): ExtensionEnableResults =>\n\tnew Map(\n\t\tArray.from(extensions.entries()).filter(([, state]) => !state.connected),\n\t)\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { inject, isMimirReady, MIMIR_REGEXP } from '@mimirdev/apps-inject'\n\nexport const injectMimir = async () => {\n\tconst openInIframe = window !== window.parent\n\t// Return if not opened in an iframe\n\tif (!openInIframe) {\n\t\treturn\n\t}\n\tconst origin = await isMimirReady()\n\t// Return if not opened in Mimir\n\tif (!origin) {\n\t\treturn\n\t}\n\tif (MIMIR_REGEXP.test(origin)) {\n\t\tinject()\n\t}\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tExtensionEnableResults,\n\tExtensionInterface,\n} from '@w3ux/types'\nimport { formatExtensionAccounts } from './util'\n\n// Connects to provided extensions and gets all accounts\nexport const getAccountsFromExtensions = async (\n\textensions: ExtensionEnableResults,\n\tss58: number,\n): Promise<ExtensionAccount[]> => {\n\ttry {\n\t\tconst extensionEntries = Array.from(extensions.entries())\n\t\t\t.filter(([, { extension }]) => extension !== null)\n\t\t\t.map(\n\t\t\t\t([source, { extension }]) =>\n\t\t\t\t\t[source, extension] as [string, ExtensionInterface],\n\t\t\t)\n\n\t\tconst activeExtensions = extensionEntries.map(([, extension]) => extension)\n\n\t\tconst results = await Promise.allSettled(\n\t\t\tactiveExtensions.map((extension) => extension.accounts.get()),\n\t\t)\n\n\t\tconst allAccounts: ExtensionAccount[] = []\n\t\tfor (let i = 0; i < results.length; i++) {\n\t\t\tconst result = results[i]\n\t\t\tconst source = extensionEntries[i][0]\n\t\t\tconst signer = extensionEntries[i][1].signer\n\n\t\t\tif (result.status === 'fulfilled' && signer) {\n\t\t\t\tconst { value } = result\n\t\t\t\tconst accounts = formatExtensionAccounts(value, ss58).map(\n\t\t\t\t\t({ address, name }) => ({\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\tsigner,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\tallAccounts.push(...accounts)\n\t\t\t}\n\t\t}\n\t\treturn allAccounts\n\t} catch (e) {\n\t\tconsole.error('Error during account formatting: ', e)\n\t\treturn []\n\t}\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport {\n\taddUnsub,\n\tgetAccountsFromExtensions,\n\tprocessExtensionAccounts,\n\tupdateAccounts,\n} from '../accounts/index'\nimport { getActiveExtensionsLocal } from '../local'\nimport { setReconnectSync } from '../util'\nimport { initExtensions } from '.'\n\nexport const reconnectExtensions = async (dappName: string, ss58: number) => {\n\tsetReconnectSync('syncing')\n\tconst { connected } = await initExtensions(\n\t\tdappName,\n\t\tgetActiveExtensionsLocal(),\n\t)\n\tif (connected.size > 0) {\n\t\t// Perform initial account state update\n\t\tupdateAccounts({\n\t\t\tadd: await getAccountsFromExtensions(connected, ss58),\n\t\t\tremove: [],\n\t\t})\n\n\t\t// If available, subscribe to accounts for each connected extension\n\t\tfor (const [id, { extension }] of Array.from(connected.entries())) {\n\t\t\tif (typeof extension!.accounts.subscribe === 'function') {\n\t\t\t\tconst unsub = extension!.accounts.subscribe((accounts) => {\n\t\t\t\t\tprocessExtensionAccounts(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsource: id,\n\t\t\t\t\t\t\tss58,\n\t\t\t\t\t\t},\n\t\t\t\t\t\textension!.signer,\n\t\t\t\t\t\taccounts,\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t\taddUnsub(id, unsub)\n\t\t\t}\n\t\t}\n\t}\n\tsetReconnectSync('synced')\n}\n"],"mappings":"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","names":["import_utils","result","extensions","extensions","extensions"]}
|
package/extensions/index.js
CHANGED
|
@@ -3,13 +3,13 @@ import {
|
|
|
3
3
|
enableInjectedWeb3Entry,
|
|
4
4
|
hasValidEnable,
|
|
5
5
|
setReconnectSync
|
|
6
|
-
} from "../chunk-
|
|
6
|
+
} from "../chunk-FS3ZTGV6.js";
|
|
7
7
|
import {
|
|
8
8
|
addUnsub,
|
|
9
9
|
getAccountsFromExtensions,
|
|
10
10
|
processExtensionAccounts,
|
|
11
11
|
updateAccounts
|
|
12
|
-
} from "../chunk-
|
|
12
|
+
} from "../chunk-TPEE4DI4.js";
|
|
13
13
|
import {
|
|
14
14
|
_extensionsStatus,
|
|
15
15
|
_gettingExtensions,
|
package/index.cjs
CHANGED
|
@@ -38,7 +38,7 @@ __export(index_exports, {
|
|
|
38
38
|
hasValidEnable: () => hasValidEnable,
|
|
39
39
|
initialisedExtensions$: () => initialisedExtensions$,
|
|
40
40
|
isExtensionLocal: () => isExtensionLocal,
|
|
41
|
-
|
|
41
|
+
isMimir: () => isMimir,
|
|
42
42
|
reconnectSync$: () => reconnectSync$,
|
|
43
43
|
removeExtensionFromLocal: () => removeExtensionFromLocal,
|
|
44
44
|
removeStatus: () => removeStatus,
|
|
@@ -128,21 +128,21 @@ var getHardwareAccounts = () => _hardwareAccounts.getValue();
|
|
|
128
128
|
var setHardwareAccounts = (accounts) => {
|
|
129
129
|
_hardwareAccounts.next(accounts);
|
|
130
130
|
};
|
|
131
|
-
var
|
|
131
|
+
var isMimir = (id) => window.self !== window.top && id === "mimir";
|
|
132
132
|
var hasValidEnable = (id) => {
|
|
133
133
|
try {
|
|
134
|
-
const enable =
|
|
134
|
+
const enable = isMimir(id) ? window.injectedWeb3[id].enable : window.parent.injectedWeb3[id].enable;
|
|
135
135
|
return enable !== void 0 && typeof enable === "function";
|
|
136
136
|
} catch {
|
|
137
137
|
return false;
|
|
138
138
|
}
|
|
139
139
|
};
|
|
140
140
|
var enableInjectedWeb3Entry = (id, dappName) => {
|
|
141
|
-
if (
|
|
142
|
-
const result2 = window.
|
|
141
|
+
if (isMimir(id)) {
|
|
142
|
+
const result2 = window.injectedWeb3[id].enable(dappName);
|
|
143
143
|
return result2;
|
|
144
144
|
}
|
|
145
|
-
const result = window.injectedWeb3[id].enable(dappName);
|
|
145
|
+
const result = window.parent.injectedWeb3[id].enable(dappName);
|
|
146
146
|
return result;
|
|
147
147
|
};
|
|
148
148
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -165,7 +165,7 @@ var enableInjectedWeb3Entry = (id, dappName) => {
|
|
|
165
165
|
hasValidEnable,
|
|
166
166
|
initialisedExtensions$,
|
|
167
167
|
isExtensionLocal,
|
|
168
|
-
|
|
168
|
+
isMimir,
|
|
169
169
|
reconnectSync$,
|
|
170
170
|
removeExtensionFromLocal,
|
|
171
171
|
removeStatus,
|
package/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/consts.ts","../src/local.ts","../src/subjects.ts","../src/observables.ts","../src/util.ts"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nexport * from './consts'\nexport * from './local'\nexport * from './observables'\nexport * from './util'\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ProcessExtensionAccountsResult } from '@w3ux/types'\n\nexport const DefaultProcessExtensionResult: ProcessExtensionAccountsResult = {\n\tnewAccounts: [],\n\tremovedAccounts: [],\n}\n\n// Local storage active extensions key\nexport const ActiveExtensionsKey = 'active_extensions'\nexport const HardwareAccountsKey = 'hardware_accounts'\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { HardwareAccount } from '@w3ux/types'\nimport { localStorageOrDefault } from '@w3ux/utils'\nimport { ActiveExtensionsKey, HardwareAccountsKey } from './consts'\n\n// Gets all active extensions from local storage\nexport const getActiveExtensionsLocal = (): string[] => {\n\tconst current = localStorageOrDefault<string[]>(ActiveExtensionsKey, [], true)\n\treturn Array.isArray(current) ? current : []\n}\n\n// Check if an extension exists in local storage\nexport const isExtensionLocal = (id: string): boolean =>\n\tgetActiveExtensionsLocal().includes(id)\n\n// Adds an extension to local storage\nexport const addExtensionToLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tif (!current.includes(id)) {\n\t\tlocalStorage.setItem(ActiveExtensionsKey, JSON.stringify([...current, id]))\n\t}\n}\n\n// Removes extension from local storage\nexport const removeExtensionFromLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tlocalStorage.setItem(\n\t\tActiveExtensionsKey,\n\t\tJSON.stringify(current.filter((localId) => localId !== id)),\n\t)\n}\n\n// Gets imported hardware accounts from local storage\nexport const getHardwareAccountsLocal = (): HardwareAccount[] => {\n\tconst accounts = localStorageOrDefault(\n\t\tHardwareAccountsKey,\n\t\t[],\n\t\ttrue,\n\t) as HardwareAccount[]\n\n\treturn accounts\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tExtensionsStatus,\n\tHardwareAccount,\n\tSync,\n} from '@w3ux/types'\nimport { BehaviorSubject } from 'rxjs'\nimport { getHardwareAccountsLocal } from './local'\n\n// NOTE: These subjects stay private to the package and are not exported\n\nexport const _extensionsStatus = new BehaviorSubject<ExtensionsStatus>({})\nexport const _gettingExtensions = new BehaviorSubject<boolean>(true)\nexport const _initialisedExtensions = new BehaviorSubject<string[]>([])\nexport const _reconnectSync = new BehaviorSubject<Sync>('unsynced')\nexport const _extensionAccounts = new BehaviorSubject<ExtensionAccount[]>([])\nexport const _hardwareAccounts = new BehaviorSubject<HardwareAccount[]>(\n\tgetHardwareAccountsLocal(),\n)\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport {\n\t_extensionAccounts,\n\t_extensionsStatus,\n\t_gettingExtensions,\n\t_hardwareAccounts,\n\t_initialisedExtensions,\n\t_reconnectSync,\n} from './subjects'\n\n// Discovered extensions along with their status\nexport const extensionsStatus$ = _extensionsStatus.asObservable()\n\n// Whether extensions are being checked\nexport const gettingExtensions$ = _gettingExtensions.asObservable()\n\n// Extensions that have successfully connected\nexport const initialisedExtensions$ = _initialisedExtensions.asObservable()\n\n// Sync status of reconnecting to previously enabled extensions\nexport const reconnectSync$ = _reconnectSync.asObservable()\n\n// Imported extension accounts\nexport const extensionAccounts$ = _extensionAccounts.asObservable()\n\n// Imported hardware accounts\nexport const hardwareAccounts$ = _hardwareAccounts.asObservable()\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExtensionStatus, HardwareAccount, Sync } from '@w3ux/types'\nimport {\n\t_extensionAccounts,\n\t_extensionsStatus,\n\t_hardwareAccounts,\n\t_reconnectSync,\n} from './subjects'\n\n// Gets an extension status\nexport const getStatus = (id: string): ExtensionStatus =>\n\t_extensionsStatus.getValue()[id] || undefined\n\n// Sets an extension status\nexport const setStatus = (id: string, status: ExtensionStatus) => {\n\tconst newValue = { ..._extensionsStatus.getValue() }\n\tnewValue[id] = status\n\t_extensionsStatus.next(newValue)\n}\n\n// Removes an extension status\nexport const removeStatus = (id: string) => {\n\tconst { [id]: _, ...rest } = _extensionsStatus.getValue()\n\t_extensionsStatus.next(rest)\n}\n\n// Whether an extension can be connected\nexport const canConnect = (id: string) =>\n\t![undefined, 'connected'].includes(_extensionsStatus.getValue()[id])\n\n// Reset accounts\nexport const resetAccounts = () => {\n\t_extensionAccounts.next([])\n}\n\n// Get previously enabled extension reconnect sync status\nexport const getReconnectSync = () => _reconnectSync.getValue()\n\n// Set previously enabled extension reconnect sync status\nexport const setReconnectSync = (sync: Sync) => {\n\t_reconnectSync.next(sync)\n}\n\n// Get hardware accounts\nexport const getHardwareAccounts = () => _hardwareAccounts.getValue()\n\n// Set hardware accounts\nexport const setHardwareAccounts = (accounts: HardwareAccount[]) => {\n\t_hardwareAccounts.next(accounts)\n}\n\n// Checks whether app is open in
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/consts.ts","../src/local.ts","../src/subjects.ts","../src/observables.ts","../src/util.ts"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nexport * from './consts'\nexport * from './local'\nexport * from './observables'\nexport * from './util'\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ProcessExtensionAccountsResult } from '@w3ux/types'\n\nexport const DefaultProcessExtensionResult: ProcessExtensionAccountsResult = {\n\tnewAccounts: [],\n\tremovedAccounts: [],\n}\n\n// Local storage active extensions key\nexport const ActiveExtensionsKey = 'active_extensions'\nexport const HardwareAccountsKey = 'hardware_accounts'\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { HardwareAccount } from '@w3ux/types'\nimport { localStorageOrDefault } from '@w3ux/utils'\nimport { ActiveExtensionsKey, HardwareAccountsKey } from './consts'\n\n// Gets all active extensions from local storage\nexport const getActiveExtensionsLocal = (): string[] => {\n\tconst current = localStorageOrDefault<string[]>(ActiveExtensionsKey, [], true)\n\treturn Array.isArray(current) ? current : []\n}\n\n// Check if an extension exists in local storage\nexport const isExtensionLocal = (id: string): boolean =>\n\tgetActiveExtensionsLocal().includes(id)\n\n// Adds an extension to local storage\nexport const addExtensionToLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tif (!current.includes(id)) {\n\t\tlocalStorage.setItem(ActiveExtensionsKey, JSON.stringify([...current, id]))\n\t}\n}\n\n// Removes extension from local storage\nexport const removeExtensionFromLocal = (id: string): void => {\n\tconst current = getActiveExtensionsLocal()\n\tlocalStorage.setItem(\n\t\tActiveExtensionsKey,\n\t\tJSON.stringify(current.filter((localId) => localId !== id)),\n\t)\n}\n\n// Gets imported hardware accounts from local storage\nexport const getHardwareAccountsLocal = (): HardwareAccount[] => {\n\tconst accounts = localStorageOrDefault(\n\t\tHardwareAccountsKey,\n\t\t[],\n\t\ttrue,\n\t) as HardwareAccount[]\n\n\treturn accounts\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tExtensionsStatus,\n\tHardwareAccount,\n\tSync,\n} from '@w3ux/types'\nimport { BehaviorSubject } from 'rxjs'\nimport { getHardwareAccountsLocal } from './local'\n\n// NOTE: These subjects stay private to the package and are not exported\n\nexport const _extensionsStatus = new BehaviorSubject<ExtensionsStatus>({})\nexport const _gettingExtensions = new BehaviorSubject<boolean>(true)\nexport const _initialisedExtensions = new BehaviorSubject<string[]>([])\nexport const _reconnectSync = new BehaviorSubject<Sync>('unsynced')\nexport const _extensionAccounts = new BehaviorSubject<ExtensionAccount[]>([])\nexport const _hardwareAccounts = new BehaviorSubject<HardwareAccount[]>(\n\tgetHardwareAccountsLocal(),\n)\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport {\n\t_extensionAccounts,\n\t_extensionsStatus,\n\t_gettingExtensions,\n\t_hardwareAccounts,\n\t_initialisedExtensions,\n\t_reconnectSync,\n} from './subjects'\n\n// Discovered extensions along with their status\nexport const extensionsStatus$ = _extensionsStatus.asObservable()\n\n// Whether extensions are being checked\nexport const gettingExtensions$ = _gettingExtensions.asObservable()\n\n// Extensions that have successfully connected\nexport const initialisedExtensions$ = _initialisedExtensions.asObservable()\n\n// Sync status of reconnecting to previously enabled extensions\nexport const reconnectSync$ = _reconnectSync.asObservable()\n\n// Imported extension accounts\nexport const extensionAccounts$ = _extensionAccounts.asObservable()\n\n// Imported hardware accounts\nexport const hardwareAccounts$ = _hardwareAccounts.asObservable()\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExtensionStatus, HardwareAccount, Sync } from '@w3ux/types'\nimport {\n\t_extensionAccounts,\n\t_extensionsStatus,\n\t_hardwareAccounts,\n\t_reconnectSync,\n} from './subjects'\n\n// Gets an extension status\nexport const getStatus = (id: string): ExtensionStatus =>\n\t_extensionsStatus.getValue()[id] || undefined\n\n// Sets an extension status\nexport const setStatus = (id: string, status: ExtensionStatus) => {\n\tconst newValue = { ..._extensionsStatus.getValue() }\n\tnewValue[id] = status\n\t_extensionsStatus.next(newValue)\n}\n\n// Removes an extension status\nexport const removeStatus = (id: string) => {\n\tconst { [id]: _, ...rest } = _extensionsStatus.getValue()\n\t_extensionsStatus.next(rest)\n}\n\n// Whether an extension can be connected\nexport const canConnect = (id: string) =>\n\t![undefined, 'connected'].includes(_extensionsStatus.getValue()[id])\n\n// Reset accounts\nexport const resetAccounts = () => {\n\t_extensionAccounts.next([])\n}\n\n// Get previously enabled extension reconnect sync status\nexport const getReconnectSync = () => _reconnectSync.getValue()\n\n// Set previously enabled extension reconnect sync status\nexport const setReconnectSync = (sync: Sync) => {\n\t_reconnectSync.next(sync)\n}\n\n// Get hardware accounts\nexport const getHardwareAccounts = () => _hardwareAccounts.getValue()\n\n// Set hardware accounts\nexport const setHardwareAccounts = (accounts: HardwareAccount[]) => {\n\t_hardwareAccounts.next(accounts)\n}\n\n// Checks whether app is open in a mimir iframe\nexport const isMimir = (id: string): boolean =>\n\twindow.self !== window.top && id === 'mimir'\n\n// Check if an injected web3 entry has a valid enable function\nexport const hasValidEnable = (id: string): boolean => {\n\ttry {\n\t\tconst enable = isMimir(id)\n\t\t\t? window.injectedWeb3![id].enable\n\t\t\t: window.parent.injectedWeb3![id].enable\n\n\t\treturn enable !== undefined && typeof enable === 'function'\n\t} catch {\n\t\treturn false\n\t}\n}\n\n// Enable an injected web3 entry\nexport const enableInjectedWeb3Entry = (id: string, dappName: string) => {\n\tif (isMimir(id)) {\n\t\tconst result = window.injectedWeb3![id].enable(dappName)\n\t\treturn result\n\t}\n\tconst result = window.parent.injectedWeb3![id].enable(dappName)\n\treturn result\n}\n"],"mappings":"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","names":["result"]}
|
package/index.d.cts
CHANGED
|
@@ -28,8 +28,8 @@ declare const getReconnectSync: () => Sync;
|
|
|
28
28
|
declare const setReconnectSync: (sync: Sync) => void;
|
|
29
29
|
declare const getHardwareAccounts: () => HardwareAccount[];
|
|
30
30
|
declare const setHardwareAccounts: (accounts: HardwareAccount[]) => void;
|
|
31
|
-
declare const
|
|
31
|
+
declare const isMimir: (id: string) => boolean;
|
|
32
32
|
declare const hasValidEnable: (id: string) => boolean;
|
|
33
33
|
declare const enableInjectedWeb3Entry: (id: string, dappName: string) => Promise<_w3ux_types.ExtensionInterface>;
|
|
34
34
|
|
|
35
|
-
export { ActiveExtensionsKey, DefaultProcessExtensionResult, HardwareAccountsKey, addExtensionToLocal, canConnect, enableInjectedWeb3Entry, extensionAccounts$, extensionsStatus$, getActiveExtensionsLocal, getHardwareAccounts, getHardwareAccountsLocal, getReconnectSync, getStatus, gettingExtensions$, hardwareAccounts$, hasValidEnable, initialisedExtensions$, isExtensionLocal,
|
|
35
|
+
export { ActiveExtensionsKey, DefaultProcessExtensionResult, HardwareAccountsKey, addExtensionToLocal, canConnect, enableInjectedWeb3Entry, extensionAccounts$, extensionsStatus$, getActiveExtensionsLocal, getHardwareAccounts, getHardwareAccountsLocal, getReconnectSync, getStatus, gettingExtensions$, hardwareAccounts$, hasValidEnable, initialisedExtensions$, isExtensionLocal, isMimir, reconnectSync$, removeExtensionFromLocal, removeStatus, resetAccounts, setHardwareAccounts, setReconnectSync, setStatus };
|
package/index.d.ts
CHANGED
|
@@ -28,8 +28,8 @@ declare const getReconnectSync: () => Sync;
|
|
|
28
28
|
declare const setReconnectSync: (sync: Sync) => void;
|
|
29
29
|
declare const getHardwareAccounts: () => HardwareAccount[];
|
|
30
30
|
declare const setHardwareAccounts: (accounts: HardwareAccount[]) => void;
|
|
31
|
-
declare const
|
|
31
|
+
declare const isMimir: (id: string) => boolean;
|
|
32
32
|
declare const hasValidEnable: (id: string) => boolean;
|
|
33
33
|
declare const enableInjectedWeb3Entry: (id: string, dappName: string) => Promise<_w3ux_types.ExtensionInterface>;
|
|
34
34
|
|
|
35
|
-
export { ActiveExtensionsKey, DefaultProcessExtensionResult, HardwareAccountsKey, addExtensionToLocal, canConnect, enableInjectedWeb3Entry, extensionAccounts$, extensionsStatus$, getActiveExtensionsLocal, getHardwareAccounts, getHardwareAccountsLocal, getReconnectSync, getStatus, gettingExtensions$, hardwareAccounts$, hasValidEnable, initialisedExtensions$, isExtensionLocal,
|
|
35
|
+
export { ActiveExtensionsKey, DefaultProcessExtensionResult, HardwareAccountsKey, addExtensionToLocal, canConnect, enableInjectedWeb3Entry, extensionAccounts$, extensionsStatus$, getActiveExtensionsLocal, getHardwareAccounts, getHardwareAccountsLocal, getReconnectSync, getStatus, gettingExtensions$, hardwareAccounts$, hasValidEnable, initialisedExtensions$, isExtensionLocal, isMimir, reconnectSync$, removeExtensionFromLocal, removeStatus, resetAccounts, setHardwareAccounts, setReconnectSync, setStatus };
|
package/index.js
CHANGED
|
@@ -5,13 +5,13 @@ import {
|
|
|
5
5
|
getReconnectSync,
|
|
6
6
|
getStatus,
|
|
7
7
|
hasValidEnable,
|
|
8
|
-
|
|
8
|
+
isMimir,
|
|
9
9
|
removeStatus,
|
|
10
10
|
resetAccounts,
|
|
11
11
|
setHardwareAccounts,
|
|
12
12
|
setReconnectSync,
|
|
13
13
|
setStatus
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-FS3ZTGV6.js";
|
|
15
15
|
import {
|
|
16
16
|
ActiveExtensionsKey,
|
|
17
17
|
DefaultProcessExtensionResult,
|
|
@@ -55,7 +55,7 @@ export {
|
|
|
55
55
|
hasValidEnable,
|
|
56
56
|
initialisedExtensions$,
|
|
57
57
|
isExtensionLocal,
|
|
58
|
-
|
|
58
|
+
isMimir,
|
|
59
59
|
reconnectSync$,
|
|
60
60
|
removeExtensionFromLocal,
|
|
61
61
|
removeStatus,
|
package/package.json
CHANGED
package/chunk-QYR6WE5O.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/util.ts"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExtensionStatus, HardwareAccount, Sync } from '@w3ux/types'\nimport {\n\t_extensionAccounts,\n\t_extensionsStatus,\n\t_hardwareAccounts,\n\t_reconnectSync,\n} from './subjects'\n\n// Gets an extension status\nexport const getStatus = (id: string): ExtensionStatus =>\n\t_extensionsStatus.getValue()[id] || undefined\n\n// Sets an extension status\nexport const setStatus = (id: string, status: ExtensionStatus) => {\n\tconst newValue = { ..._extensionsStatus.getValue() }\n\tnewValue[id] = status\n\t_extensionsStatus.next(newValue)\n}\n\n// Removes an extension status\nexport const removeStatus = (id: string) => {\n\tconst { [id]: _, ...rest } = _extensionsStatus.getValue()\n\t_extensionsStatus.next(rest)\n}\n\n// Whether an extension can be connected\nexport const canConnect = (id: string) =>\n\t![undefined, 'connected'].includes(_extensionsStatus.getValue()[id])\n\n// Reset accounts\nexport const resetAccounts = () => {\n\t_extensionAccounts.next([])\n}\n\n// Get previously enabled extension reconnect sync status\nexport const getReconnectSync = () => _reconnectSync.getValue()\n\n// Set previously enabled extension reconnect sync status\nexport const setReconnectSync = (sync: Sync) => {\n\t_reconnectSync.next(sync)\n}\n\n// Get hardware accounts\nexport const getHardwareAccounts = () => _hardwareAccounts.getValue()\n\n// Set hardware accounts\nexport const setHardwareAccounts = (accounts: HardwareAccount[]) => {\n\t_hardwareAccounts.next(accounts)\n}\n\n// Checks whether app is open in an iframe\nexport const isInIframe = (): boolean => window.self !== window.top\n\n// Check if an injected web3 entry has a valid enable function\nexport const hasValidEnable = (id: string): boolean => {\n\ttry {\n\t\tconst enable = isInIframe()\n\t\t\t? window.parent.injectedWeb3![id].enable\n\t\t\t: window.injectedWeb3![id].enable\n\n\t\treturn enable !== undefined && typeof enable === 'function'\n\t} catch {\n\t\treturn false\n\t}\n}\n\n// Enable an injected web3 entry\nexport const enableInjectedWeb3Entry = (id: string, dappName: string) => {\n\tif (isInIframe()) {\n\t\tconst result = window.parent.injectedWeb3![id].enable(dappName)\n\t\treturn result\n\t}\n\tconst result = window.injectedWeb3![id].enable(dappName)\n\treturn result\n}\n"],"mappings":";;;;;;;;AAYO,IAAM,YAAY,CAAC,OACzB,kBAAkB,SAAS,EAAE,EAAE,KAAK;AAG9B,IAAM,YAAY,CAAC,IAAY,WAA4B;AACjE,QAAM,WAAW,EAAE,GAAG,kBAAkB,SAAS,EAAE;AACnD,WAAS,EAAE,IAAI;AACf,oBAAkB,KAAK,QAAQ;AAChC;AAGO,IAAM,eAAe,CAAC,OAAe;AAC3C,QAAM,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,IAAI,kBAAkB,SAAS;AACxD,oBAAkB,KAAK,IAAI;AAC5B;AAGO,IAAM,aAAa,CAAC,OAC1B,CAAC,CAAC,QAAW,WAAW,EAAE,SAAS,kBAAkB,SAAS,EAAE,EAAE,CAAC;AAG7D,IAAM,gBAAgB,MAAM;AAClC,qBAAmB,KAAK,CAAC,CAAC;AAC3B;AAGO,IAAM,mBAAmB,MAAM,eAAe,SAAS;AAGvD,IAAM,mBAAmB,CAAC,SAAe;AAC/C,iBAAe,KAAK,IAAI;AACzB;AAGO,IAAM,sBAAsB,MAAM,kBAAkB,SAAS;AAG7D,IAAM,sBAAsB,CAAC,aAAgC;AACnE,oBAAkB,KAAK,QAAQ;AAChC;AAGO,IAAM,aAAa,MAAe,OAAO,SAAS,OAAO;AAGzD,IAAM,iBAAiB,CAAC,OAAwB;AACtD,MAAI;AACH,UAAM,SAAS,WAAW,IACvB,OAAO,OAAO,aAAc,EAAE,EAAE,SAChC,OAAO,aAAc,EAAE,EAAE;AAE5B,WAAO,WAAW,UAAa,OAAO,WAAW;AAAA,EAClD,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAGO,IAAM,0BAA0B,CAAC,IAAY,aAAqB;AACxE,MAAI,WAAW,GAAG;AACjB,UAAMA,UAAS,OAAO,OAAO,aAAc,EAAE,EAAE,OAAO,QAAQ;AAC9D,WAAOA;AAAA,EACR;AACA,QAAM,SAAS,OAAO,aAAc,EAAE,EAAE,OAAO,QAAQ;AACvD,SAAO;AACR;","names":["result"]}
|
package/chunk-XVKV7X7C.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\tExtensionAccount,\n\tProcessExtensionAccountsResult,\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\tsource: string\n\tss58: number\n}\nexport const processExtensionAccounts = (\n\tconfig: Config,\n\tsigner: unknown,\n\tnewAccounts: ExtensionAccount[],\n): ProcessExtensionAccountsResult => {\n\tconst { source, ss58 } = config\n\tif (!newAccounts.length) {\n\t\treturn DefaultProcessExtensionResult\n\t}\n\n\t// Get valid accounts from extension\n\tnewAccounts = formatExtensionAccounts(newAccounts, ss58)\n\n\t// Find any accounts that have been removed from this extension\n\tconst removedAccounts = _extensionAccounts\n\t\t.getValue()\n\t\t.filter((j) => j.source === source)\n\t\t.filter((j) => !newAccounts.find((i) => i.address === j.address))\n\n\t// Remove accounts that have already been imported\n\tnewAccounts = newAccounts.filter(\n\t\t({ address }) =>\n\t\t\t!_extensionAccounts.getValue().find((j) => j.address === address),\n\t)\n\n\t// Format accounts properties\n\tnewAccounts = newAccounts.map(({ address, name }) => ({\n\t\taddress,\n\t\tname,\n\t\tsource,\n\t\tsigner,\n\t}))\n\n\t// Update observable state\n\tupdateAccounts({\n\t\tadd: newAccounts,\n\t\tremove: removedAccounts,\n\t})\n\n\treturn {\n\t\tnewAccounts,\n\t\tremovedAccounts: [...removedAccounts],\n\t}\n}\n\n// Formats accounts to correct ss58 and removes invalid accounts\nexport const formatExtensionAccounts = (\n\taccounts: ExtensionAccount[],\n\tss58: number,\n) => {\n\taccounts = accounts\n\t\t// Remove accounts that do not contain correctly formatted addresses\n\t\t.filter(({ address }) => isValidAddress(address))\n\t\t// Reformat addresses to ensure default ss58 format\n\t\t.map((account) => {\n\t\t\tconst formattedAddress = formatAccountSs58(account.address, ss58)\n\t\t\tif (!formattedAddress) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\taccount.address = formattedAddress\n\t\t\treturn account\n\t\t})\n\t\t// Remove null entries resulting from invalid formatted addresses\n\t\t.filter((account) => account !== null)\n\n\treturn accounts\n}\n\n// Updates accounts observable based on removed and added accounts\nexport const updateAccounts = ({\n\tadd,\n\tremove,\n}: {\n\tadd: ExtensionAccount[]\n\tremove: ExtensionAccount[]\n}) => {\n\tconst newAccounts = [..._extensionAccounts.getValue()]\n\t\t.concat(add)\n\t\t.filter((a) => remove.find((s) => s.address === a.address) === undefined)\n\t_extensionAccounts.next(newAccounts)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n\tExtensionAccount,\n\tExtensionEnableResults,\n\tExtensionInterface,\n} from '@w3ux/types'\nimport { formatExtensionAccounts } from './util'\n\n// Connects to provided extensions and gets all accounts\nexport const getAccountsFromExtensions = async (\n\textensions: ExtensionEnableResults,\n\tss58: number,\n): Promise<ExtensionAccount[]> => {\n\ttry {\n\t\tconst extensionEntries = Array.from(extensions.entries())\n\t\t\t.filter(([, { extension }]) => extension !== null)\n\t\t\t.map(\n\t\t\t\t([source, { extension }]) =>\n\t\t\t\t\t[source, extension] as [string, ExtensionInterface],\n\t\t\t)\n\n\t\tconst activeExtensions = extensionEntries.map(([, extension]) => extension)\n\n\t\tconst results = await Promise.allSettled(\n\t\t\tactiveExtensions.map((extension) => extension.accounts.get()),\n\t\t)\n\n\t\tconst allAccounts: ExtensionAccount[] = []\n\t\tfor (let i = 0; i < results.length; i++) {\n\t\t\tconst result = results[i]\n\t\t\tconst source = extensionEntries[i][0]\n\t\t\tconst signer = extensionEntries[i][1].signer\n\n\t\t\tif (result.status === 'fulfilled' && signer) {\n\t\t\t\tconst { value } = result\n\n\t\t\t\t// This is duplicating what `handleExtensionAccountsUpdate` is doing to accounts: --\n\t\t\t\tconst accounts = formatExtensionAccounts(value, ss58)\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t({ address }) => !allAccounts.find((a) => address === a.address),\n\t\t\t\t\t)\n\t\t\t\t\t.map(({ address, name }) => ({\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\tsigner,\n\t\t\t\t\t}))\n\t\t\t\tallAccounts.push(...accounts)\n\t\t\t}\n\t\t}\n\t\treturn allAccounts\n\t} catch (e) {\n\t\tconsole.error('Error during account formatting: ', e)\n\t\treturn []\n\t}\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\n// Extension account subscription unsubs\nexport const unsubs: Record<string, () => void> = {}\n\n// Add an extension id to unsub state\nexport const addUnsub = (id: string, unsub: () => void) => {\n\tunsubs[id] = unsub\n}\n\n// Unsubscribe to all unsubs\nexport const unsubAll = () => {\n\tObject.values(unsubs).forEach((unsub) => {\n\t\tunsub()\n\t})\n}\n"],"mappings":"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","names":[]}
|