@w3ux/observables-connect 0.9.3 → 0.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3 @@
1
+ import type { ExternalAccount } from '@w3ux/types';
2
+ export declare const getActiveAccountLocal: (network: string, ss58: number) => string | null;
3
+ export declare const getLocalExternalAccounts: (network?: string) => ExternalAccount[];
@@ -0,0 +1,22 @@
1
+ import { formatAccountSs58, localStorageOrDefault } from '@w3ux/utils';
2
+ export const getActiveAccountLocal = (network, ss58) => {
3
+ const account = localStorageOrDefault(`${network}_active_account`, null);
4
+ if (account !== null) {
5
+ const formattedAddress = formatAccountSs58(account, ss58);
6
+ if (formattedAddress) {
7
+ return formattedAddress;
8
+ }
9
+ }
10
+ return null;
11
+ };
12
+ export const getLocalExternalAccounts = (network) => {
13
+ let localAccounts = localStorageOrDefault('external_accounts', [], true);
14
+ if (network) {
15
+ localAccounts = localAccounts.filter((l) => l.network === network);
16
+ }
17
+ return localAccounts;
18
+ };
19
+
20
+ //# sourceMappingURL=local.js.map
21
+
22
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/accounts/local.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAGtE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,OAAe,EACf,IAAY,EACG,EAAE;IACjB,MAAM,OAAO,GAAG,qBAAqB,CAAC,GAAG,OAAO,iBAAiB,EAAE,IAAI,CAAC,CAAA;IACxE,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QACzD,IAAI,gBAAgB,EAAE,CAAC;YACrB,OAAO,gBAAgB,CAAA;QACzB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,OAAgB,EAAE,EAAE;IAC3D,IAAI,aAAa,GAAG,qBAAqB,CACvC,mBAAmB,EACnB,EAAE,EACF,IAAI,CACgB,CAAA;IACtB,IAAI,OAAO,EAAE,CAAC;QACZ,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAA;IACpE,CAAC;IACD,OAAO,aAAa,CAAA;AACtB,CAAC,CAAA","file":"local.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExternalAccount } from '@w3ux/types'\nimport { formatAccountSs58, localStorageOrDefault } from '@w3ux/utils'\n\n// Gets local active account for a network\nexport const getActiveAccountLocal = (\n network: string,\n ss58: number\n): string | null => {\n const account = localStorageOrDefault(`${network}_active_account`, null)\n if (account !== null) {\n const formattedAddress = formatAccountSs58(account, ss58)\n if (formattedAddress) {\n return formattedAddress\n }\n }\n return null\n}\n\n// Gets local external accounts for a network\nexport const getLocalExternalAccounts = (network?: string) => {\n let localAccounts = localStorageOrDefault<ExternalAccount[]>(\n 'external_accounts',\n [],\n true\n ) as ExternalAccount[]\n if (network) {\n localAccounts = localAccounts.filter((l) => l.network === network)\n }\n return localAccounts\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { ExtensionAccount, ExtensionEnableResults, HandleImportExtension, ImportedAccount } from '@w3ux/types';
2
+ export declare const getAccountsFromExtensions: (extensions: ExtensionEnableResults) => Promise<ExtensionAccount[]>;
3
+ export declare const handleExtensionAccountsUpdate: (id: string, currentAccounts: ExtensionAccount[], signer: unknown, accounts: ExtensionAccount[], network: string, ss58: number) => HandleImportExtension;
4
+ export declare const getInExternalAccounts: (accounts: ImportedAccount[], network: string) => import("@w3ux/types").ExternalAccount[];
@@ -0,0 +1,85 @@
1
+ import { formatAccountSs58, isValidAddress } from '@w3ux/utils';
2
+ import { DefaultHandleImportExtension, DefaultSS58 } from '../consts';
3
+ import { getActiveAccountLocal, getLocalExternalAccounts } from './local';
4
+ export const getAccountsFromExtensions = async (extensions) => {
5
+ try {
6
+ const results = await Promise.allSettled(Array.from(extensions.values()).map(({ extension }) => extension.accounts.get()));
7
+ const extensionEntries = Array.from(extensions.entries());
8
+ const accounts = [];
9
+ for (let i = 0; i < results.length; i++) {
10
+ const result = results[i];
11
+ const source = extensionEntries[i][0];
12
+ const signer = extensionEntries[i][1].extension.signer;
13
+ if (result.status === 'fulfilled') {
14
+ const filtered = result.value
15
+ .map((account) => {
16
+ const address = formatAccountSs58(account.address, DefaultSS58);
17
+ if (!address) {
18
+ return null;
19
+ }
20
+ return {
21
+ ...account,
22
+ address,
23
+ };
24
+ })
25
+ .filter((a) => a !== null)
26
+ .filter(({ address }) => !accounts.find((a) => address === a.address))
27
+ .map(({ address, name }) => ({
28
+ address,
29
+ name,
30
+ source,
31
+ signer,
32
+ }));
33
+ accounts.push(...filtered);
34
+ }
35
+ }
36
+ return accounts;
37
+ }
38
+ catch (e) {
39
+ console.error('Error during enable and format call: ', e);
40
+ return [];
41
+ }
42
+ };
43
+ export const handleExtensionAccountsUpdate = (id, currentAccounts, signer, accounts, network, ss58) => {
44
+ if (!accounts.length) {
45
+ return DefaultHandleImportExtension;
46
+ }
47
+ accounts = accounts
48
+ .filter(({ address }) => isValidAddress(address))
49
+ .map((account) => {
50
+ const formattedAddress = formatAccountSs58(account.address, ss58);
51
+ if (!formattedAddress) {
52
+ return null;
53
+ }
54
+ account.address = formattedAddress;
55
+ return account;
56
+ })
57
+ .filter((account) => account !== null);
58
+ const inExternal = getInExternalAccounts(accounts, network);
59
+ const removedAccounts = currentAccounts
60
+ .filter((j) => j.source === id)
61
+ .filter((j) => !accounts.find((i) => i.address === j.address));
62
+ const removedActiveAccount = removedAccounts.find(({ address }) => address === getActiveAccountLocal(network, ss58))?.address || null;
63
+ accounts = accounts.filter(({ address }) => !currentAccounts.find((j) => j.address === address && j.source !== 'external'));
64
+ accounts = accounts.map(({ address, name }) => ({
65
+ address,
66
+ name,
67
+ source: id,
68
+ signer,
69
+ }));
70
+ return {
71
+ newAccounts: accounts,
72
+ meta: {
73
+ accountsToRemove: [...inExternal, ...removedAccounts],
74
+ removedActiveAccount,
75
+ },
76
+ };
77
+ };
78
+ export const getInExternalAccounts = (accounts, network) => {
79
+ const localExternalAccounts = getLocalExternalAccounts(network);
80
+ return (localExternalAccounts.filter((a) => (accounts || []).find((b) => b.address === a.address) !== undefined) || []);
81
+ };
82
+
83
+ //# sourceMappingURL=util.js.map
84
+
85
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/accounts/util.ts"],"names":[],"mappings":"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","file":"util.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n ExtensionAccount,\n ExtensionEnableResults,\n HandleImportExtension,\n ImportedAccount,\n} from '@w3ux/types'\nimport { formatAccountSs58, isValidAddress } from '@w3ux/utils'\nimport { DefaultHandleImportExtension, DefaultSS58 } from '../consts'\nimport { getActiveAccountLocal, getLocalExternalAccounts } from './local'\n\n// Connects to the provided extensions and fetches their accounts\nexport const getAccountsFromExtensions = async (\n extensions: ExtensionEnableResults\n): Promise<ExtensionAccount[]> => {\n try {\n const results = await Promise.allSettled(\n Array.from(extensions.values()).map(({ extension }) =>\n extension.accounts.get()\n )\n )\n const extensionEntries = Array.from(extensions.entries())\n const accounts: ExtensionAccount[] = []\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i]\n const source = extensionEntries[i][0]\n const signer = extensionEntries[i][1].extension.signer\n\n if (result.status === 'fulfilled') {\n const filtered = result.value\n // Reformat addresses with default ss58 prefix\n .map((account) => {\n const address = formatAccountSs58(account.address, DefaultSS58)\n if (!address) {\n return null\n }\n return {\n ...account,\n address,\n }\n })\n // Remove null entries resulting from invalid formatted addresses\n .filter((a) => a !== null)\n // Remove accounts that have already been imported\n .filter(({ address }) => !accounts.find((a) => address === a.address))\n // Reformat entries to include extension source\n .map(({ address, name }) => ({\n address,\n name,\n source,\n signer,\n }))\n\n accounts.push(...filtered)\n }\n }\n return accounts\n } catch (e) {\n console.error('Error during enable and format call: ', e)\n return []\n }\n}\n\n// Gets accounts to be imported and commits them to state.\nexport const handleExtensionAccountsUpdate = (\n id: string,\n currentAccounts: ExtensionAccount[],\n signer: unknown,\n accounts: ExtensionAccount[],\n network: string,\n ss58: number\n): HandleImportExtension => {\n if (!accounts.length) {\n return DefaultHandleImportExtension\n }\n\n accounts = accounts\n // Remove accounts that do not contain correctly formatted addresses\n .filter(({ address }) => isValidAddress(address))\n // Reformat addresses to ensure default ss58 format\n .map((account) => {\n const formattedAddress = formatAccountSs58(account.address, ss58)\n if (!formattedAddress) {\n return null\n }\n account.address = formattedAddress\n return account\n })\n // Remove null entries resulting from invalid formatted addresses\n .filter((account) => account !== null)\n\n // Remove accounts from local external accounts if present\n const inExternal = getInExternalAccounts(accounts, network)\n\n // Find any accounts that have been removed from this extension\n const removedAccounts = currentAccounts\n .filter((j) => j.source === id)\n .filter((j) => !accounts.find((i) => i.address === j.address))\n\n // Check whether active account is present in forgotten accounts\n const removedActiveAccount =\n removedAccounts.find(\n ({ address }) => address === getActiveAccountLocal(network, ss58)\n )?.address || null\n\n // Remove accounts that have already been added to `currentAccounts` via another extension\n accounts = accounts.filter(\n ({ address }) =>\n !currentAccounts.find(\n (j) => j.address === address && j.source !== 'external'\n )\n )\n\n // Format accounts properties\n accounts = accounts.map(({ address, name }) => ({\n address,\n name,\n source: id,\n signer,\n }))\n\n return {\n newAccounts: accounts,\n meta: {\n accountsToRemove: [...inExternal, ...removedAccounts],\n removedActiveAccount,\n },\n }\n}\n\n// Gets accounts that exist in local external accounts\nexport const getInExternalAccounts = (\n accounts: ImportedAccount[],\n network: string\n) => {\n const localExternalAccounts = getLocalExternalAccounts(network)\n return (\n localExternalAccounts.filter(\n (a) => (accounts || []).find((b) => b.address === a.address) !== undefined\n ) || []\n )\n}\n"]}
package/consts.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/consts.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,4BAA4B,GAA0B;IACjE,WAAW,EAAE,EAAE;IACf,IAAI,EAAE;QACJ,gBAAgB,EAAE,EAAE;QACpB,oBAAoB,EAAE,IAAI;KAC3B;CACF,CAAA;AAGD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAA;AAG5B,MAAM,CAAC,MAAM,mBAAmB,GAAG,mBAAmB,CAAA","file":"consts.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { HandleImportExtension } from '@w3ux/types'\n\nexport const DefaultHandleImportExtension: HandleImportExtension = {\n newAccounts: [],\n meta: {\n accountsToRemove: [],\n removedActiveAccount: null,\n },\n}\n\n// The default ss58 prefix accounts are formatted to\nexport const DefaultSS58 = 0\n\n// Local storage active extensions key\nexport const ActiveExtensionsKey = 'active_extensions'\n"]}
@@ -0,0 +1,4 @@
1
+ import type { ExtensionEnableResults } from '@w3ux/types';
2
+ export declare const connectActiveExtensions: (dappName: string, ids?: string[]) => Promise<void>;
3
+ export declare const filterConnectedExtensions: (extensions: ExtensionEnableResults) => ExtensionEnableResults;
4
+ export declare const filterFailedExtensions: (extensions: ExtensionEnableResults) => ExtensionEnableResults;
@@ -0,0 +1,44 @@
1
+ import { enableExtensions } from 'extensions/enable';
2
+ import { addExtensionToLocal, removeExtensionFromLocal } from 'extensions/local';
3
+ import { _extensionsStatus, _initialisedExtensions, } from 'extensions/observables';
4
+ export const connectActiveExtensions = async (dappName, ids) => {
5
+ const extensionIds = ids || Object.keys(_extensionsStatus.getValue());
6
+ if (!extensionIds.length) {
7
+ return;
8
+ }
9
+ const enableResults = await enableExtensions(extensionIds, dappName);
10
+ const [connected, withError] = [
11
+ filterConnectedExtensions(enableResults),
12
+ filterFailedExtensions(enableResults),
13
+ ];
14
+ Array.from(connected.keys()).forEach((id) => addExtensionToLocal(id));
15
+ Array.from(withError.keys()).forEach((id) => removeExtensionFromLocal(id));
16
+ const newStatus = { ..._extensionsStatus.getValue() };
17
+ Array.from(connected.keys()).forEach((id) => {
18
+ newStatus[id] = 'connected';
19
+ });
20
+ Array.from(withError.entries()).forEach(([id, { error }]) => {
21
+ if (error.startsWith('Error')) {
22
+ if (error.substring(0, 17) === 'NotInstalledError') {
23
+ delete newStatus[id];
24
+ }
25
+ else {
26
+ newStatus[id] = 'not_authenticated';
27
+ }
28
+ }
29
+ });
30
+ const newInitialised = { ..._initialisedExtensions.getValue() };
31
+ extensionIds.forEach((id) => {
32
+ if (!newInitialised.includes(id)) {
33
+ newInitialised.push(id);
34
+ }
35
+ });
36
+ _extensionsStatus.next(newStatus);
37
+ _initialisedExtensions.next(newInitialised);
38
+ };
39
+ export const filterConnectedExtensions = (extensions) => new Map(Array.from(extensions.entries()).filter(([, state]) => state.connected));
40
+ export const filterFailedExtensions = (extensions) => new Map(Array.from(extensions.entries()).filter(([, state]) => !state.connected));
41
+
42
+ //# sourceMappingURL=connect.js.map
43
+
44
+ //# sourceMappingURL=connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/extensions/connect.ts"],"names":[],"mappings":"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","file":"connect.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExtensionEnableResults } from '@w3ux/types'\nimport { enableExtensions } from 'extensions/enable'\nimport { addExtensionToLocal, removeExtensionFromLocal } from 'extensions/local'\nimport {\n _extensionsStatus,\n _initialisedExtensions,\n} from 'extensions/observables'\n\n// Connects to currently discovered extensions, or to a specific set of extensions\nexport const connectActiveExtensions = async (\n dappName: string,\n ids?: string[]\n) => {\n const extensionIds = ids || Object.keys(_extensionsStatus.getValue())\n if (!extensionIds.length) {\n return\n }\n\n // Get extensions and enable them\n const enableResults = await enableExtensions(extensionIds, dappName)\n\n // Determine which extensions are connected and which have errors\n const [connected, withError] = [\n filterConnectedExtensions(enableResults),\n filterFailedExtensions(enableResults),\n ]\n\n // Manage local storage depending on connection status\n Array.from(connected.keys()).forEach((id) => addExtensionToLocal(id))\n Array.from(withError.keys()).forEach((id) => removeExtensionFromLocal(id))\n\n // Handle new extension statuses\n const newStatus = { ..._extensionsStatus.getValue() }\n Array.from(connected.keys()).forEach((id) => {\n newStatus[id] = 'connected'\n })\n Array.from(withError.entries()).forEach(([id, { error }]) => {\n if (error.startsWith('Error')) {\n // Extension not found - remove from state\n if (error.substring(0, 17) === 'NotInstalledError') {\n delete newStatus[id]\n } else {\n // Assume extension not authenticated\n newStatus[id] = 'not_authenticated'\n }\n }\n })\n\n // Record initialised extensions\n const newInitialised = { ..._initialisedExtensions.getValue() }\n extensionIds.forEach((id) => {\n if (!newInitialised.includes(id)) {\n newInitialised.push(id)\n }\n })\n\n // Commit updates to observables\n _extensionsStatus.next(newStatus)\n _initialisedExtensions.next(newInitialised)\n}\n\n// Filter successfully connected extensions\nexport const filterConnectedExtensions = (\n extensions: ExtensionEnableResults\n): ExtensionEnableResults =>\n new Map(\n Array.from(extensions.entries()).filter(([, state]) => state.connected)\n )\n\n// Filter extensions that failed to connect\nexport const filterFailedExtensions = (\n extensions: ExtensionEnableResults\n): ExtensionEnableResults =>\n new Map(\n Array.from(extensions.entries()).filter(([, state]) => !state.connected)\n )\n"]}
@@ -0,0 +1,3 @@
1
+ import type { ExtensionEnableResults, RawExtensionEnable } from '@w3ux/types';
2
+ export declare const enableExtensions: (ids: string[], dappName: string) => Promise<ExtensionEnableResults>;
3
+ export declare const getExtensionsById: (ids: string[]) => Map<string, RawExtensionEnable>;
@@ -0,0 +1,53 @@
1
+ import { isExtensionLocal, removeExtensionFromLocal } from './local';
2
+ export const enableExtensions = async (ids, dappName) => {
3
+ const extensions = getExtensionsById(ids);
4
+ return formatEnabledExtensions(extensions, await doEnableExtensions(extensions, dappName));
5
+ };
6
+ export const getExtensionsById = (ids) => {
7
+ const extensions = new Map();
8
+ ids.forEach(async (id) => {
9
+ if (isExtensionLocal(id)) {
10
+ const enable = window.injectedWeb3?.[id]?.enable;
11
+ if (enable !== undefined && typeof enable === 'function') {
12
+ extensions.set(id, enable);
13
+ }
14
+ else {
15
+ removeExtensionFromLocal(id);
16
+ }
17
+ }
18
+ });
19
+ return extensions;
20
+ };
21
+ const formatEnabledExtensions = (extensions, results) => {
22
+ const extensionsState = new Map();
23
+ for (let i = 0; i < results.length; i++) {
24
+ const result = results[i];
25
+ const id = Array.from(extensions.keys())[i];
26
+ if (result.status === 'fulfilled') {
27
+ extensionsState.set(id, {
28
+ extension: result.value,
29
+ connected: true,
30
+ });
31
+ }
32
+ else if (result.status === 'rejected') {
33
+ extensionsState.set(id, {
34
+ connected: false,
35
+ error: result.reason,
36
+ });
37
+ }
38
+ }
39
+ return extensionsState;
40
+ };
41
+ const doEnableExtensions = async (extensions, dappName) => {
42
+ try {
43
+ return await Promise.allSettled(Array.from(extensions.values()).map((fn) => fn(dappName)));
44
+ }
45
+ catch (e) {
46
+ console.error("Error during 'enable' extensions call: ", e);
47
+ return [];
48
+ }
49
+ };
50
+
51
+ //# sourceMappingURL=enable.js.map
52
+
53
+ //# sourceMappingURL=enable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/extensions/enable.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAGpE,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,GAAa,EAAE,QAAgB,EAAE,EAAE;IACxE,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA;IACzC,OAAO,uBAAuB,CAC5B,UAAU,EACV,MAAM,kBAAkB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAC/C,CAAA;AACH,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAa,EAAE,EAAE;IACjD,MAAM,UAAU,GAAG,IAAI,GAAG,EAA8B,CAAA;IACxD,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QACvB,IAAI,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;YAChD,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;gBACzD,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;YAC5B,CAAC;iBAAM,CAAC;gBACN,wBAAwB,CAAC,EAAE,CAAC,CAAA;YAC9B,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAA;IACF,OAAO,UAAU,CAAA;AACnB,CAAC,CAAA;AAGD,MAAM,uBAAuB,GAAG,CAC9B,UAAyB,EACzB,OAAmD,EAC3B,EAAE;IAC1B,MAAM,eAAe,GAAG,IAAI,GAAG,EAAiC,CAAA;IAEhE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;QACzB,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAE3C,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE;gBACtB,SAAS,EAAE,MAAM,CAAC,KAAK;gBACvB,SAAS,EAAE,IAAI;aAChB,CAAC,CAAA;QACJ,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACxC,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE;gBACtB,SAAS,EAAE,KAAK;gBAChB,KAAK,EAAE,MAAM,CAAC,MAAM;aACrB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IACD,OAAO,eAAe,CAAA;AACxB,CAAC,CAAA;AAGD,MAAM,kBAAkB,GAAG,KAAK,EAC9B,UAAyB,EACzB,QAAgB,EAChB,EAAE;IACF,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,UAAU,CAC7B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAC1D,CAAA;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,CAAC,CAAC,CAAA;QAC3D,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC,CAAA","file":"enable.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n ExtensionEnableResult,\n ExtensionEnableResults,\n ExtensionInterface,\n RawExtensionEnable,\n RawExtensions,\n} from '@w3ux/types'\nimport { isExtensionLocal, removeExtensionFromLocal } from './local'\n\n// Get extensions and enable them\nexport const enableExtensions = async (ids: string[], dappName: string) => {\n const extensions = getExtensionsById(ids)\n return formatEnabledExtensions(\n extensions,\n await doEnableExtensions(extensions, dappName)\n )\n}\n\n// Gets extensions from injectedWeb3 by their ids\nexport const getExtensionsById = (ids: string[]) => {\n const extensions = new Map<string, RawExtensionEnable>()\n ids.forEach(async (id) => {\n if (isExtensionLocal(id)) {\n const enable = window.injectedWeb3?.[id]?.enable\n if (enable !== undefined && typeof enable === 'function') {\n extensions.set(id, enable)\n } else {\n removeExtensionFromLocal(id)\n }\n }\n })\n return extensions\n}\n\n// Formats the results of an extension's enable function\nconst formatEnabledExtensions = (\n extensions: RawExtensions,\n results: PromiseSettledResult<ExtensionInterface>[]\n): ExtensionEnableResults => {\n const extensionsState = new Map<string, ExtensionEnableResult>()\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i]\n const id = Array.from(extensions.keys())[i]\n\n if (result.status === 'fulfilled') {\n extensionsState.set(id, {\n extension: result.value,\n connected: true,\n })\n } else if (result.status === 'rejected') {\n extensionsState.set(id, {\n connected: false,\n error: result.reason,\n })\n }\n }\n return extensionsState\n}\n\n// Calls enable for the provided extensions\nconst doEnableExtensions = async (\n extensions: RawExtensions,\n dappName: string\n) => {\n try {\n return await Promise.allSettled(\n Array.from(extensions.values()).map((fn) => fn(dappName))\n )\n } catch (e) {\n console.error(\"Error during 'enable' extensions call: \", e)\n return []\n }\n}\n"]}
@@ -1,6 +1 @@
1
- import type { ExtensionStatus } from '@w3ux/types';
2
1
  export declare const getExtensions: () => Promise<void>;
3
- export declare const getStatus: (id: string) => ExtensionStatus;
4
- export declare const setStatus: (id: string, status: ExtensionStatus) => void;
5
- export declare const removeStatus: (id: string) => void;
6
- export declare const canConnect: (id: string) => boolean;
@@ -1,5 +1,5 @@
1
1
  import extensions from '@w3ux/extension-assets';
2
- import { _extensionsStatus, _gettingExtensions } from '../index';
2
+ import { _extensionsStatus, _gettingExtensions } from './observables';
3
3
  export const getExtensions = async () => {
4
4
  _gettingExtensions.next(true);
5
5
  let injectedWeb3Interval = null;
@@ -31,17 +31,6 @@ export const getExtensions = async () => {
31
31
  }
32
32
  }, interval);
33
33
  };
34
- export const getStatus = (id) => _extensionsStatus.getValue()[id] || undefined;
35
- export const setStatus = (id, status) => {
36
- const newValue = { ..._extensionsStatus.getValue() };
37
- newValue[id] = status;
38
- _extensionsStatus.next(newValue);
39
- };
40
- export const removeStatus = (id) => {
41
- const { [id]: _, ...rest } = _extensionsStatus.getValue();
42
- _extensionsStatus.next(rest);
43
- };
44
- export const canConnect = (id) => ![undefined, 'connected'].includes(_extensionsStatus.getValue()[id]);
45
34
 
46
35
  //# sourceMappingURL=index.js.map
47
36
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/extensions/index.ts"],"names":[],"mappings":"AAGA,OAAO,UAAU,MAAM,wBAAwB,CAAA;AAE/C,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAGhE,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE;IACtC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC7B,IAAI,oBAAoB,GAAmC,IAAI,CAAA;IAG/D,MAAM,eAAe,GAAG,GAAG,EAAE,CAC3B,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAC5B,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACX,GAAG,CAAC,GAAG,CAAC;YACN,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAClE,OAAO,GAAG,CAAA;IACZ,CAAC,EACD,EAAE,GAAG,iBAAiB,CAAC,QAAQ,EAAE,EAAE,CACpC,CAAA;IAGH,MAAM,eAAe,GAAG,KAAK,EAAE,eAAwB,EAAE,EAAE;QACzD,aAAa,CAAC,oBAAoB,CAAC,CAAA;QACnC,IAAI,eAAe,EAAE,CAAC;YACpB,iBAAiB,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAA;QAC3C,CAAC;QACD,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAChC,CAAC,CAAA;IAGD,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,MAAM,QAAQ,GAAG,GAAG,CAAA;IACpB,MAAM,SAAS,GAAG,EAAE,CAAA;IACpB,oBAAoB,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,OAAO,EAAE,CAAA;QACT,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,eAAe,CAAC,KAAK,CAAC,CAAA;QACxB,CAAC;aAAM,CAAC;YAEN,MAAM,YAAY,GAAG,MAAM,EAAE,YAAY,IAAI,IAAI,CAAA;YACjD,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;gBAC1B,eAAe,CAAC,IAAI,CAAC,CAAA;YACvB,CAAC;QACH,CAAC;IACH,CAAC,EAAE,QAAQ,CAAC,CAAA;AACd,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAU,EAAmB,EAAE,CACvD,iBAAiB,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,IAAI,SAAS,CAAA;AAG/C,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAU,EAAE,MAAuB,EAAE,EAAE;IAC/D,MAAM,QAAQ,GAAG,EAAE,GAAG,iBAAiB,CAAC,QAAQ,EAAE,EAAE,CAAA;IACpD,QAAQ,CAAC,EAAE,CAAC,GAAG,MAAM,CAAA;IACrB,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;AAClC,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAU,EAAE,EAAE;IACzC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,iBAAiB,CAAC,QAAQ,EAAE,CAAA;IACzD,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC9B,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAAU,EAAE,EAAE,CACvC,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA","file":"index.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport extensions from '@w3ux/extension-assets'\nimport type { ExtensionStatus } from '@w3ux/types'\nimport { _extensionsStatus, _gettingExtensions } from '../index'\n\n// Gets extensions from injectedWeb3\nexport const getExtensions = async () => {\n _gettingExtensions.next(true)\n let injectedWeb3Interval: ReturnType<typeof setInterval> = null\n\n // Format installed extensions\n const formatInstalled = () =>\n Object.keys(extensions).reduce(\n (acc, key) => {\n acc[key] =\n window?.injectedWeb3[key] !== undefined ? 'installed' : acc[key]\n return acc\n },\n { ..._extensionsStatus.getValue() }\n )\n\n // Handle completed interval check\n const handleCompleted = async (foundExtensions: boolean) => {\n clearInterval(injectedWeb3Interval)\n if (foundExtensions) {\n _extensionsStatus.next(formatInstalled())\n }\n _gettingExtensions.next(false)\n }\n\n // Getter for the currently installed extensions\n let counter = 0\n const interval = 300\n const maxChecks = 10\n injectedWeb3Interval = setInterval(() => {\n counter++\n if (counter === maxChecks) {\n handleCompleted(false)\n } else {\n // `injectedWeb3` is present\n const injectedWeb3 = window?.injectedWeb3 || null\n if (injectedWeb3 !== null) {\n handleCompleted(true)\n }\n }\n }, interval)\n}\n\n// Gets an extension status\nexport const getStatus = (id: string): ExtensionStatus =>\n _extensionsStatus.getValue()[id] || undefined\n\n// Sets an extension status\nexport const setStatus = (id: string, status: ExtensionStatus) => {\n const newValue = { ..._extensionsStatus.getValue() }\n newValue[id] = status\n _extensionsStatus.next(newValue)\n}\n\n// Removes an extension status\nexport const removeStatus = (id: string) => {\n const { [id]: _, ...rest } = _extensionsStatus.getValue()\n _extensionsStatus.next(rest)\n}\n\n// Whether an extension can be connected\nexport const canConnect = (id: string) =>\n ![undefined, 'connected'].includes(_extensionsStatus.getValue()[id])\n"]}
1
+ {"version":3,"sources":["../src/extensions/index.ts"],"names":[],"mappings":"AAGA,OAAO,UAAU,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAGrE,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE;IACtC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC7B,IAAI,oBAAoB,GAAmC,IAAI,CAAA;IAG/D,MAAM,eAAe,GAAG,GAAG,EAAE,CAC3B,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAC5B,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACX,GAAG,CAAC,GAAG,CAAC;YACN,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAClE,OAAO,GAAG,CAAA;IACZ,CAAC,EACD,EAAE,GAAG,iBAAiB,CAAC,QAAQ,EAAE,EAAE,CACpC,CAAA;IAGH,MAAM,eAAe,GAAG,KAAK,EAAE,eAAwB,EAAE,EAAE;QACzD,aAAa,CAAC,oBAAoB,CAAC,CAAA;QACnC,IAAI,eAAe,EAAE,CAAC;YACpB,iBAAiB,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAA;QAC3C,CAAC;QACD,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAChC,CAAC,CAAA;IAGD,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,MAAM,QAAQ,GAAG,GAAG,CAAA;IACpB,MAAM,SAAS,GAAG,EAAE,CAAA;IACpB,oBAAoB,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,OAAO,EAAE,CAAA;QACT,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,eAAe,CAAC,KAAK,CAAC,CAAA;QACxB,CAAC;aAAM,CAAC;YAEN,MAAM,YAAY,GAAG,MAAM,EAAE,YAAY,IAAI,IAAI,CAAA;YACjD,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;gBAC1B,eAAe,CAAC,IAAI,CAAC,CAAA;YACvB,CAAC;QACH,CAAC;IACH,CAAC,EAAE,QAAQ,CAAC,CAAA;AACd,CAAC,CAAA","file":"index.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport extensions from '@w3ux/extension-assets'\nimport { _extensionsStatus, _gettingExtensions } from './observables'\n\n// Gets extensions from injectedWeb3\nexport const getExtensions = async () => {\n _gettingExtensions.next(true)\n let injectedWeb3Interval: ReturnType<typeof setInterval> = null\n\n // Format installed extensions\n const formatInstalled = () =>\n Object.keys(extensions).reduce(\n (acc, key) => {\n acc[key] =\n window?.injectedWeb3[key] !== undefined ? 'installed' : acc[key]\n return acc\n },\n { ..._extensionsStatus.getValue() }\n )\n\n // Handle completed interval check\n const handleCompleted = async (foundExtensions: boolean) => {\n clearInterval(injectedWeb3Interval)\n if (foundExtensions) {\n _extensionsStatus.next(formatInstalled())\n }\n _gettingExtensions.next(false)\n }\n\n // Getter for the currently installed extensions\n let counter = 0\n const interval = 300\n const maxChecks = 10\n injectedWeb3Interval = setInterval(() => {\n counter++\n if (counter === maxChecks) {\n handleCompleted(false)\n } else {\n // `injectedWeb3` is present\n const injectedWeb3 = window?.injectedWeb3 || null\n if (injectedWeb3 !== null) {\n handleCompleted(true)\n }\n }\n }, interval)\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { localStorageOrDefault } from '@w3ux/utils';
2
- import { ActiveExtensionsKey } from '../accounts/consts';
2
+ import { ActiveExtensionsKey } from '../consts';
3
3
  export const isExtensionLocal = (id) => {
4
4
  const current = localStorageOrDefault(ActiveExtensionsKey, [], true);
5
5
  return Array.isArray(current) && current.includes(id);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/extensions/local.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAGxD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAU,EAAW,EAAE;IACtD,MAAM,OAAO,GAAG,qBAAqB,CAAW,mBAAmB,EAAE,EAAE,EAAE,IAAI,CAAC,CAAA;IAC9E,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;AACvD,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAAU,EAAQ,EAAE;IACtD,MAAM,OAAO,GAAG,qBAAqB,CAAW,mBAAmB,EAAE,EAAE,EAAE,IAAI,CAAC,CAAA;IAC9E,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;QACpD,YAAY,CAAC,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;IAC7E,CAAC;AACH,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,EAAU,EAAQ,EAAE;IAC3D,MAAM,OAAO,GAAG,qBAAqB,CAAW,mBAAmB,EAAE,EAAE,EAAE,IAAI,CAAC,CAAA;IAC9E,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,YAAY,CAAC,OAAO,CAClB,mBAAmB,EACnB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAC5D,CAAA;IACH,CAAC;AACH,CAAC,CAAA","file":"local.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { localStorageOrDefault } from '@w3ux/utils'\nimport { ActiveExtensionsKey } from '../accounts/consts'\n\n// Check if an extension exists in local storage\nexport const isExtensionLocal = (id: string): boolean => {\n const current = localStorageOrDefault<string[]>(ActiveExtensionsKey, [], true)\n return Array.isArray(current) && current.includes(id)\n}\n\n// Adds an extension to local storage\nexport const addExtensionToLocal = (id: string): void => {\n const current = localStorageOrDefault<string[]>(ActiveExtensionsKey, [], true)\n if (Array.isArray(current) && !current.includes(id)) {\n localStorage.setItem(ActiveExtensionsKey, JSON.stringify([...current, id]))\n }\n}\n\n// Removes extension from local storage\nexport const removeExtensionFromLocal = (id: string): void => {\n const current = localStorageOrDefault<string[]>(ActiveExtensionsKey, [], true)\n if (Array.isArray(current)) {\n localStorage.setItem(\n ActiveExtensionsKey,\n JSON.stringify(current.filter((localId) => localId !== id))\n )\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/extensions/local.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAG/C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAU,EAAW,EAAE;IACtD,MAAM,OAAO,GAAG,qBAAqB,CAAW,mBAAmB,EAAE,EAAE,EAAE,IAAI,CAAC,CAAA;IAC9E,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;AACvD,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAAU,EAAQ,EAAE;IACtD,MAAM,OAAO,GAAG,qBAAqB,CAAW,mBAAmB,EAAE,EAAE,EAAE,IAAI,CAAC,CAAA;IAC9E,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;QACpD,YAAY,CAAC,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;IAC7E,CAAC;AACH,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,EAAU,EAAQ,EAAE;IAC3D,MAAM,OAAO,GAAG,qBAAqB,CAAW,mBAAmB,EAAE,EAAE,EAAE,IAAI,CAAC,CAAA;IAC9E,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,YAAY,CAAC,OAAO,CAClB,mBAAmB,EACnB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAC5D,CAAA;IACH,CAAC;AACH,CAAC,CAAA","file":"local.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { localStorageOrDefault } from '@w3ux/utils'\nimport { ActiveExtensionsKey } from '../consts'\n\n// Check if an extension exists in local storage\nexport const isExtensionLocal = (id: string): boolean => {\n const current = localStorageOrDefault<string[]>(ActiveExtensionsKey, [], true)\n return Array.isArray(current) && current.includes(id)\n}\n\n// Adds an extension to local storage\nexport const addExtensionToLocal = (id: string): void => {\n const current = localStorageOrDefault<string[]>(ActiveExtensionsKey, [], true)\n if (Array.isArray(current) && !current.includes(id)) {\n localStorage.setItem(ActiveExtensionsKey, JSON.stringify([...current, id]))\n }\n}\n\n// Removes extension from local storage\nexport const removeExtensionFromLocal = (id: string): void => {\n const current = localStorageOrDefault<string[]>(ActiveExtensionsKey, [], true)\n if (Array.isArray(current)) {\n localStorage.setItem(\n ActiveExtensionsKey,\n JSON.stringify(current.filter((localId) => localId !== id))\n )\n }\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import type { ExtensionsStatus } from '@w3ux/types';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ export declare const _extensionsStatus: BehaviorSubject<ExtensionsStatus>;
4
+ export declare const extensionsStatus$: import("rxjs").Observable<ExtensionsStatus>;
5
+ export declare const _gettingExtensions: BehaviorSubject<boolean>;
6
+ export declare const gettingExtensions$: import("rxjs").Observable<boolean>;
7
+ export declare const _initialisedExtensions: BehaviorSubject<string[]>;
8
+ export declare const initialisedExtensions$: import("rxjs").Observable<string[]>;
@@ -0,0 +1,11 @@
1
+ import { BehaviorSubject } from 'rxjs';
2
+ export const _extensionsStatus = new BehaviorSubject({});
3
+ export const extensionsStatus$ = _extensionsStatus.asObservable();
4
+ export const _gettingExtensions = new BehaviorSubject(true);
5
+ export const gettingExtensions$ = _gettingExtensions.asObservable();
6
+ export const _initialisedExtensions = new BehaviorSubject([]);
7
+ export const initialisedExtensions$ = _initialisedExtensions.asObservable();
8
+
9
+ //# sourceMappingURL=observables.js.map
10
+
11
+ //# sourceMappingURL=observables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/extensions/observables.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAGtC,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,eAAe,CAAmB,EAAE,CAAC,CAAA;AAC1E,MAAM,CAAC,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,YAAY,EAAE,CAAA;AAGjE,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,eAAe,CAAU,IAAI,CAAC,CAAA;AACpE,MAAM,CAAC,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,YAAY,EAAE,CAAA;AAGnE,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,eAAe,CAAW,EAAE,CAAC,CAAA;AACvE,MAAM,CAAC,MAAM,sBAAsB,GAAG,sBAAsB,CAAC,YAAY,EAAE,CAAA","file":"observables.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExtensionsStatus } from '@w3ux/types'\nimport { BehaviorSubject } from 'rxjs'\n\n// Discovered extensions along with their status\nexport const _extensionsStatus = new BehaviorSubject<ExtensionsStatus>({})\nexport const extensionsStatus$ = _extensionsStatus.asObservable()\n\n// Whether extensions are being checked\nexport const _gettingExtensions = new BehaviorSubject<boolean>(true)\nexport const gettingExtensions$ = _gettingExtensions.asObservable()\n\n// Extensions that have successfully connected\nexport const _initialisedExtensions = new BehaviorSubject<string[]>([])\nexport const initialisedExtensions$ = _initialisedExtensions.asObservable()\n"]}
@@ -0,0 +1,5 @@
1
+ import type { ExtensionStatus } from '@w3ux/types';
2
+ export declare const getStatus: (id: string) => ExtensionStatus;
3
+ export declare const setStatus: (id: string, status: ExtensionStatus) => void;
4
+ export declare const removeStatus: (id: string) => void;
5
+ export declare const canConnect: (id: string) => boolean;
@@ -0,0 +1,16 @@
1
+ import { _extensionsStatus } from './observables';
2
+ export const getStatus = (id) => _extensionsStatus.getValue()[id] || undefined;
3
+ export const setStatus = (id, status) => {
4
+ const newValue = { ..._extensionsStatus.getValue() };
5
+ newValue[id] = status;
6
+ _extensionsStatus.next(newValue);
7
+ };
8
+ export const removeStatus = (id) => {
9
+ const { [id]: _, ...rest } = _extensionsStatus.getValue();
10
+ _extensionsStatus.next(rest);
11
+ };
12
+ export const canConnect = (id) => ![undefined, 'connected'].includes(_extensionsStatus.getValue()[id]);
13
+
14
+ //# sourceMappingURL=state.js.map
15
+
16
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/extensions/state.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAGjD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAU,EAAmB,EAAE,CACvD,iBAAiB,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,IAAI,SAAS,CAAA;AAG/C,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAU,EAAE,MAAuB,EAAE,EAAE;IAC/D,MAAM,QAAQ,GAAG,EAAE,GAAG,iBAAiB,CAAC,QAAQ,EAAE,EAAE,CAAA;IACpD,QAAQ,CAAC,EAAE,CAAC,GAAG,MAAM,CAAA;IACrB,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;AAClC,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAU,EAAE,EAAE;IACzC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,iBAAiB,CAAC,QAAQ,EAAE,CAAA;IACzD,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC9B,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAAU,EAAE,EAAE,CACvC,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA","file":"state.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExtensionStatus } from '@w3ux/types'\nimport { _extensionsStatus } from './observables'\n\n// Gets an extension status\nexport const getStatus = (id: string): ExtensionStatus =>\n _extensionsStatus.getValue()[id] || undefined\n\n// Sets an extension status\nexport const setStatus = (id: string, status: ExtensionStatus) => {\n const newValue = { ..._extensionsStatus.getValue() }\n newValue[id] = status\n _extensionsStatus.next(newValue)\n}\n\n// Removes an extension status\nexport const removeStatus = (id: string) => {\n const { [id]: _, ...rest } = _extensionsStatus.getValue()\n _extensionsStatus.next(rest)\n}\n\n// Whether an extension can be connected\nexport const canConnect = (id: string) =>\n ![undefined, 'connected'].includes(_extensionsStatus.getValue()[id])\n"]}
package/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import type { ExtensionsStatus } from '@w3ux/types';
1
+ import type { ImportedAccount, Sync } from '@w3ux/types';
2
2
  import { BehaviorSubject } from 'rxjs';
3
- export declare const _gettingExtensions: BehaviorSubject<boolean>;
4
- export declare const gettingExtensions$: import("rxjs").Observable<boolean>;
5
- export declare const _extensionsStatus: BehaviorSubject<ExtensionsStatus>;
6
- export declare const extensionsStatus$: import("rxjs").Observable<ExtensionsStatus>;
3
+ export declare const _extensionAccountsSync: BehaviorSubject<Sync>;
4
+ export declare const extensionAccountsSync$: import("rxjs").Observable<Sync>;
5
+ export declare const _extensionAccounts: BehaviorSubject<ImportedAccount[]>;
6
+ export declare const extensionAccounts$: import("rxjs").Observable<ImportedAccount[]>;
package/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { BehaviorSubject } from 'rxjs';
2
- export const _gettingExtensions = new BehaviorSubject(true);
3
- export const gettingExtensions$ = _gettingExtensions.asObservable();
4
- export const _extensionsStatus = new BehaviorSubject({});
5
- export const extensionsStatus$ = _extensionsStatus.asObservable();
2
+ export const _extensionAccountsSync = new BehaviorSubject('unsynced');
3
+ export const extensionAccountsSync$ = _extensionAccountsSync.asObservable();
4
+ export const _extensionAccounts = new BehaviorSubject([]);
5
+ export const extensionAccounts$ = _extensionAccounts.asObservable();
6
6
 
7
7
  //# sourceMappingURL=index.js.map
8
8
 
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAGtC,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,eAAe,CAAU,IAAI,CAAC,CAAA;AACpE,MAAM,CAAC,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,YAAY,EAAE,CAAA;AAGnE,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,eAAe,CAAmB,EAAE,CAAC,CAAA;AAC1E,MAAM,CAAC,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,YAAY,EAAE,CAAA","file":"index.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExtensionsStatus } from '@w3ux/types'\nimport { BehaviorSubject } from 'rxjs'\n\n// Whether extensions are being checked\nexport const _gettingExtensions = new BehaviorSubject<boolean>(true)\nexport const gettingExtensions$ = _gettingExtensions.asObservable()\n\n// Discovered extensions along with their status\nexport const _extensionsStatus = new BehaviorSubject<ExtensionsStatus>({})\nexport const extensionsStatus$ = _extensionsStatus.asObservable()\n\n// Discovered extension accounts\n// export const _extensionAccounts = new BehaviorSubject<ImportedAccount[]>([])\n// export const extensionAccounts$ = _extensionAccounts.asObservable()\n\n// Sync status of extension accounts\n// export const _extensionAccountsSync = new BehaviorSubject<Sync>('unsynced')\n// export const extensionAccountsSync$ = _extensionAccountsSync.asObservable()\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAGtC,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,eAAe,CAAO,UAAU,CAAC,CAAA;AAC3E,MAAM,CAAC,MAAM,sBAAsB,GAAG,sBAAsB,CAAC,YAAY,EAAE,CAAA;AAG3E,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,eAAe,CAAoB,EAAE,CAAC,CAAA;AAC5E,MAAM,CAAC,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,YAAY,EAAE,CAAA","file":"index.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ImportedAccount, Sync } from '@w3ux/types'\nimport { BehaviorSubject } from 'rxjs'\n\n// Sync status of extension accounts\nexport const _extensionAccountsSync = new BehaviorSubject<Sync>('unsynced')\nexport const extensionAccountsSync$ = _extensionAccountsSync.asObservable()\n\n// Discovered extension accounts\nexport const _extensionAccounts = new BehaviorSubject<ImportedAccount[]>([])\nexport const extensionAccounts$ = _extensionAccounts.asObservable()\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@w3ux/observables-connect",
3
- "version": "0.9.3",
3
+ "version": "0.9.5",
4
4
  "license": "GPL-3.0-only",
5
5
  "dependencies": {
6
6
  "@w3ux/extension-assets": "^2.2.0",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/accounts/consts.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,4BAA4B,GAA0B;IACjE,WAAW,EAAE,EAAE;IACf,IAAI,EAAE;QACJ,gBAAgB,EAAE,EAAE;QACpB,oBAAoB,EAAE,IAAI;KAC3B;CACF,CAAA;AAGD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAA;AAG5B,MAAM,CAAC,MAAM,mBAAmB,GAAG,mBAAmB,CAAA","file":"consts.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { HandleImportExtension } from '@w3ux/types'\n\nexport const DefaultHandleImportExtension: HandleImportExtension = {\n newAccounts: [],\n meta: {\n accountsToRemove: [],\n removedActiveAccount: null,\n },\n}\n\n// The default ss58 prefix accounts are formatted to\nexport const DefaultSS58 = 0\n\n// Local storage active extensions key\nexport const ActiveExtensionsKey = 'active_extensions'\n"]}
@@ -1,7 +0,0 @@
1
- import type { ExtensionAccount, ExtensionEnableResults, ExtensionInterface, RawExtensionEnable, RawExtensions } from '@w3ux/types';
2
- export declare const getExtensionsById: (extensionIds: string[]) => Map<string, RawExtensionEnable>;
3
- export declare const enableExtensions: (extensions: RawExtensions, dappName: string) => Promise<PromiseSettledResult<ExtensionInterface>[]>;
4
- export declare const formatEnabledExtensions: (extensions: RawExtensions, results: PromiseSettledResult<ExtensionInterface>[]) => ExtensionEnableResults;
5
- export declare const connectedExtensions: (extensions: ExtensionEnableResults) => ExtensionEnableResults;
6
- export declare const extensionsWithError: (extensions: ExtensionEnableResults) => ExtensionEnableResults;
7
- export declare const getAccountsFromExtensions: (extensions: ExtensionEnableResults) => Promise<ExtensionAccount[]>;
package/accounts/index.js DELETED
@@ -1,92 +0,0 @@
1
- import { formatAccountSs58 } from '@w3ux/utils';
2
- import { isExtensionLocal, removeExtensionFromLocal } from '../extensions/local';
3
- import { DefaultSS58 } from './consts';
4
- export const getExtensionsById = (extensionIds) => {
5
- const rawExtensions = new Map();
6
- extensionIds.forEach(async (id) => {
7
- if (isExtensionLocal(id)) {
8
- const { enable } = window.injectedWeb3[id];
9
- if (enable !== undefined && typeof enable === 'function') {
10
- rawExtensions.set(id, enable);
11
- }
12
- else {
13
- removeExtensionFromLocal(id);
14
- }
15
- }
16
- });
17
- return rawExtensions;
18
- };
19
- export const enableExtensions = async (extensions, dappName) => {
20
- try {
21
- return await Promise.allSettled(Array.from(extensions.values()).map((fn) => fn(dappName)));
22
- }
23
- catch (e) {
24
- console.error("Error during 'enable' extensions call: ", e);
25
- return [];
26
- }
27
- };
28
- export const formatEnabledExtensions = (extensions, results) => {
29
- const extensionsState = new Map();
30
- for (let i = 0; i < results.length; i++) {
31
- const result = results[i];
32
- const id = Array.from(extensions.keys())[i];
33
- if (result.status === 'fulfilled') {
34
- extensionsState.set(id, {
35
- extension: result.value,
36
- connected: true,
37
- });
38
- }
39
- else if (result.status === 'rejected') {
40
- extensionsState.set(id, {
41
- connected: false,
42
- error: result.reason,
43
- });
44
- }
45
- }
46
- return extensionsState;
47
- };
48
- export const connectedExtensions = (extensions) => new Map(Array.from(extensions.entries()).filter(([, state]) => state.connected));
49
- export const extensionsWithError = (extensions) => new Map(Array.from(extensions.entries()).filter(([, state]) => !state.connected));
50
- export const getAccountsFromExtensions = async (extensions) => {
51
- try {
52
- const results = await Promise.allSettled(Array.from(extensions.values()).map(({ extension }) => extension.accounts.get()));
53
- const extensionEntries = Array.from(extensions.entries());
54
- const accounts = [];
55
- for (let i = 0; i < results.length; i++) {
56
- const result = results[i];
57
- const source = extensionEntries[i][0];
58
- const signer = extensionEntries[i][1].extension.signer;
59
- if (result.status === 'fulfilled') {
60
- const filtered = result.value
61
- .map((account) => {
62
- const adddress = formatAccountSs58(account.address, DefaultSS58);
63
- if (!adddress) {
64
- return null;
65
- }
66
- return {
67
- ...account,
68
- adddress,
69
- };
70
- })
71
- .filter((a) => a !== null)
72
- .filter(({ address }) => !accounts.find((a) => address === a.address))
73
- .map(({ address, name }) => ({
74
- address,
75
- name,
76
- source,
77
- signer,
78
- }));
79
- accounts.push(...filtered);
80
- }
81
- }
82
- return accounts;
83
- }
84
- catch (e) {
85
- console.error('Error during enable and format call: ', e);
86
- return [];
87
- }
88
- };
89
-
90
- //# sourceMappingURL=index.js.map
91
-
92
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/accounts/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n ExtensionAccount,\n ExtensionEnableResult,\n ExtensionEnableResults,\n ExtensionInterface,\n RawExtensionEnable,\n RawExtensions,\n} from '@w3ux/types'\nimport { formatAccountSs58 } from '@w3ux/utils'\nimport { isExtensionLocal, removeExtensionFromLocal } from '../extensions/local'\nimport { DefaultSS58 } from './consts'\n\n// Gets raw extensions by their ids\nexport const getExtensionsById = (extensionIds: string[]) => {\n const rawExtensions = new Map<string, RawExtensionEnable>()\n\n extensionIds.forEach(async (id) => {\n if (isExtensionLocal(id)) {\n const { enable } = window.injectedWeb3[id]\n if (enable !== undefined && typeof enable === 'function') {\n rawExtensions.set(id, enable)\n } else {\n removeExtensionFromLocal(id)\n }\n }\n })\n return rawExtensions\n}\n\n// Calls enable for the provided extensions\nexport const enableExtensions = async (\n extensions: RawExtensions,\n dappName: string\n) => {\n try {\n return await Promise.allSettled(\n Array.from(extensions.values()).map((fn) => fn(dappName))\n )\n } catch (e) {\n console.error(\"Error during 'enable' extensions call: \", e)\n return []\n }\n}\n\n// Formats the results of an extension's enable function\nexport const formatEnabledExtensions = (\n extensions: RawExtensions,\n results: PromiseSettledResult<ExtensionInterface>[]\n): ExtensionEnableResults => {\n const extensionsState = new Map<string, ExtensionEnableResult>()\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i]\n const id = Array.from(extensions.keys())[i]\n\n if (result.status === 'fulfilled') {\n extensionsState.set(id, {\n extension: result.value,\n connected: true,\n })\n } else if (result.status === 'rejected') {\n extensionsState.set(id, {\n connected: false,\n error: result.reason,\n })\n }\n }\n return extensionsState\n}\n\n// Get successfully connected extensions\nexport const connectedExtensions = (\n extensions: ExtensionEnableResults\n): ExtensionEnableResults =>\n new Map(\n Array.from(extensions.entries()).filter(([, state]) => state.connected)\n )\n\n// Get extensions that failed to connect\nexport const extensionsWithError = (\n extensions: ExtensionEnableResults\n): ExtensionEnableResults =>\n new Map(\n Array.from(extensions.entries()).filter(([, state]) => !state.connected)\n )\n\n// Connects to the provided extensions and fetches their accounts\nexport const getAccountsFromExtensions = async (\n extensions: ExtensionEnableResults\n): Promise<ExtensionAccount[]> => {\n try {\n const results = await Promise.allSettled(\n Array.from(extensions.values()).map(({ extension }) =>\n extension.accounts.get()\n )\n )\n const extensionEntries = Array.from(extensions.entries())\n const accounts: ExtensionAccount[] = []\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i]\n const source = extensionEntries[i][0]\n const signer = extensionEntries[i][1].extension.signer\n\n if (result.status === 'fulfilled') {\n const filtered = result.value\n // Reformat addresses with default ss58 prefix\n .map((account) => {\n const adddress = formatAccountSs58(account.address, DefaultSS58)\n if (!adddress) {\n return null\n }\n return {\n ...account,\n adddress,\n }\n })\n // Remove null entries resulting from invalid formatted addresses\n .filter((a) => a !== null)\n // Remove accounts that have already been imported\n .filter(({ address }) => !accounts.find((a) => address === a.address))\n // Reformat entries to include extension source\n .map(({ address, name }) => ({\n address,\n name,\n source,\n signer,\n }))\n\n accounts.push(...filtered)\n }\n }\n return accounts\n } catch (e) {\n console.error('Error during enable and format call: ', e)\n return []\n }\n}\n"]}
File without changes
File without changes