@w3ux/observables-connect 0.9.2 → 0.9.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/accounts/index.d.ts +8 -1
- package/accounts/index.js +92 -5
- package/accounts/index.js.map +1 -1
- package/accounts/local.d.ts +3 -0
- package/accounts/local.js +22 -0
- package/accounts/local.js.map +1 -0
- package/package.json +1 -1
- package/accounts/enable.d.ts +0 -6
- package/accounts/enable.js +0 -51
- package/accounts/enable.js.map +0 -1
package/accounts/index.d.ts
CHANGED
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
import type { ExtensionAccount, ExtensionEnableResults } from '@w3ux/types';
|
|
1
|
+
import type { ExtensionAccount, ExtensionEnableResults, ExtensionInterface, HandleImportExtension, ImportedAccount, 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;
|
|
2
7
|
export declare const getAccountsFromExtensions: (extensions: ExtensionEnableResults) => Promise<ExtensionAccount[]>;
|
|
8
|
+
export declare const handleExtensionAccountsUdpdate: (id: string, currentAccounts: ExtensionAccount[], signer: unknown, accounts: ExtensionAccount[], network: string, ss58: number) => HandleImportExtension;
|
|
9
|
+
export declare const getInExternalAccounts: (accounts: ImportedAccount[], network: string) => import("@w3ux/types").ExternalAccount[];
|
package/accounts/index.js
CHANGED
|
@@ -1,5 +1,53 @@
|
|
|
1
|
-
import { formatAccountSs58 } from '@w3ux/utils';
|
|
2
|
-
import {
|
|
1
|
+
import { formatAccountSs58, isValidAddress } from '@w3ux/utils';
|
|
2
|
+
import { isExtensionLocal, removeExtensionFromLocal } from '../extensions/local';
|
|
3
|
+
import { DefaultHandleImportExtension, DefaultSS58 } from './consts';
|
|
4
|
+
import { getActiveAccountLocal, getLocalExternalAccounts } from './local';
|
|
5
|
+
export const getExtensionsById = (extensionIds) => {
|
|
6
|
+
const rawExtensions = new Map();
|
|
7
|
+
extensionIds.forEach(async (id) => {
|
|
8
|
+
if (isExtensionLocal(id)) {
|
|
9
|
+
const { enable } = window.injectedWeb3[id];
|
|
10
|
+
if (enable !== undefined && typeof enable === 'function') {
|
|
11
|
+
rawExtensions.set(id, enable);
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
removeExtensionFromLocal(id);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
return rawExtensions;
|
|
19
|
+
};
|
|
20
|
+
export const enableExtensions = async (extensions, dappName) => {
|
|
21
|
+
try {
|
|
22
|
+
return await Promise.allSettled(Array.from(extensions.values()).map((fn) => fn(dappName)));
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
console.error("Error during 'enable' extensions call: ", e);
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
export const formatEnabledExtensions = (extensions, results) => {
|
|
30
|
+
const extensionsState = new Map();
|
|
31
|
+
for (let i = 0; i < results.length; i++) {
|
|
32
|
+
const result = results[i];
|
|
33
|
+
const id = Array.from(extensions.keys())[i];
|
|
34
|
+
if (result.status === 'fulfilled') {
|
|
35
|
+
extensionsState.set(id, {
|
|
36
|
+
extension: result.value,
|
|
37
|
+
connected: true,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
else if (result.status === 'rejected') {
|
|
41
|
+
extensionsState.set(id, {
|
|
42
|
+
connected: false,
|
|
43
|
+
error: result.reason,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return extensionsState;
|
|
48
|
+
};
|
|
49
|
+
export const connectedExtensions = (extensions) => new Map(Array.from(extensions.entries()).filter(([, state]) => state.connected));
|
|
50
|
+
export const extensionsWithError = (extensions) => new Map(Array.from(extensions.entries()).filter(([, state]) => !state.connected));
|
|
3
51
|
export const getAccountsFromExtensions = async (extensions) => {
|
|
4
52
|
try {
|
|
5
53
|
const results = await Promise.allSettled(Array.from(extensions.values()).map(({ extension }) => extension.accounts.get()));
|
|
@@ -12,13 +60,13 @@ export const getAccountsFromExtensions = async (extensions) => {
|
|
|
12
60
|
if (result.status === 'fulfilled') {
|
|
13
61
|
const filtered = result.value
|
|
14
62
|
.map((account) => {
|
|
15
|
-
const
|
|
16
|
-
if (!
|
|
63
|
+
const address = formatAccountSs58(account.address, DefaultSS58);
|
|
64
|
+
if (!address) {
|
|
17
65
|
return null;
|
|
18
66
|
}
|
|
19
67
|
return {
|
|
20
68
|
...account,
|
|
21
|
-
|
|
69
|
+
address,
|
|
22
70
|
};
|
|
23
71
|
})
|
|
24
72
|
.filter((a) => a !== null)
|
|
@@ -39,6 +87,45 @@ export const getAccountsFromExtensions = async (extensions) => {
|
|
|
39
87
|
return [];
|
|
40
88
|
}
|
|
41
89
|
};
|
|
90
|
+
export const handleExtensionAccountsUdpdate = (id, currentAccounts, signer, accounts, network, ss58) => {
|
|
91
|
+
if (!accounts.length) {
|
|
92
|
+
return DefaultHandleImportExtension;
|
|
93
|
+
}
|
|
94
|
+
accounts = accounts
|
|
95
|
+
.filter(({ address }) => isValidAddress(address))
|
|
96
|
+
.map((account) => {
|
|
97
|
+
const formattedAddress = formatAccountSs58(account.address, ss58);
|
|
98
|
+
if (!formattedAddress) {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
account.address = formattedAddress;
|
|
102
|
+
return account;
|
|
103
|
+
})
|
|
104
|
+
.filter((account) => account !== null);
|
|
105
|
+
const inExternal = getInExternalAccounts(accounts, network);
|
|
106
|
+
const removedAccounts = currentAccounts
|
|
107
|
+
.filter((j) => j.source === id)
|
|
108
|
+
.filter((j) => !accounts.find((i) => i.address === j.address));
|
|
109
|
+
const removedActiveAccount = removedAccounts.find(({ address }) => address === getActiveAccountLocal(network, ss58))?.address || null;
|
|
110
|
+
accounts = accounts.filter(({ address }) => !currentAccounts.find((j) => j.address === address && j.source !== 'external'));
|
|
111
|
+
accounts = accounts.map(({ address, name }) => ({
|
|
112
|
+
address,
|
|
113
|
+
name,
|
|
114
|
+
source: id,
|
|
115
|
+
signer,
|
|
116
|
+
}));
|
|
117
|
+
return {
|
|
118
|
+
newAccounts: accounts,
|
|
119
|
+
meta: {
|
|
120
|
+
accountsToRemove: [...inExternal, ...removedAccounts],
|
|
121
|
+
removedActiveAccount,
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
export const getInExternalAccounts = (accounts, network) => {
|
|
126
|
+
const localExternalAccounts = getLocalExternalAccounts(network);
|
|
127
|
+
return (localExternalAccounts.filter((a) => (accounts || []).find((b) => b.address === a.address) !== undefined) || []);
|
|
128
|
+
};
|
|
42
129
|
|
|
43
130
|
//# sourceMappingURL=index.js.map
|
|
44
131
|
|
package/accounts/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/accounts/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAGtC,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,EAC5C,UAAkC,EACL,EAAE;IAC/B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CACpD,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,CACzB,CACF,CAAA;QACD,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAA;QACzD,MAAM,QAAQ,GAAuB,EAAE,CAAA;QAEvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;YACzB,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACrC,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAA;YAEtD,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK;qBAE1B,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;oBACf,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;oBAChE,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACd,OAAO,IAAI,CAAA;oBACb,CAAC;oBACD,OAAO;wBACL,GAAG,OAAO;wBACV,QAAQ;qBACT,CAAA;gBACH,CAAC,CAAC;qBAED,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;qBAEzB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;qBAErE,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;oBAC3B,OAAO;oBACP,IAAI;oBACJ,MAAM;oBACN,MAAM;iBACP,CAAC,CAAC,CAAA;gBAEL,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAA;YAC5B,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,CAAC,CAAC,CAAA;QACzD,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC,CAAA","file":"index.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExtensionAccount, ExtensionEnableResults } from '@w3ux/types'\nimport { formatAccountSs58 } from '@w3ux/utils'\nimport { DefaultSS58 } from './consts'\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"]}
|
|
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 HandleImportExtension,\n ImportedAccount,\n RawExtensionEnable,\n RawExtensions,\n} from '@w3ux/types'\nimport { formatAccountSs58, isValidAddress } from '@w3ux/utils'\nimport { isExtensionLocal, removeExtensionFromLocal } from '../extensions/local'\nimport { DefaultHandleImportExtension, DefaultSS58 } from './consts'\nimport { getActiveAccountLocal, getLocalExternalAccounts } from './local'\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 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 handleExtensionAccountsUdpdate = (\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"]}
|
|
@@ -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;IAExE,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_acount` for a network.\nexport const getActiveAccountLocal = (\n network: string,\n ss58: number\n): string | null => {\n const account = localStorageOrDefault(`${network}_active_account`, null)\n\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"]}
|
package/package.json
CHANGED
package/accounts/enable.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { ExtensionEnableResults, ExtensionInterface, RawExtensionEnable, RawExtensions } from '@w3ux/types';
|
|
2
|
-
export declare const getExtensionsById: (extensionIds: string[]) => Map<string, RawExtensionEnable>;
|
|
3
|
-
export declare const enable: (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;
|
package/accounts/enable.js
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { isExtensionLocal, removeExtensionFromLocal } from '../extensions/local';
|
|
2
|
-
export const getExtensionsById = (extensionIds) => {
|
|
3
|
-
const rawExtensions = new Map();
|
|
4
|
-
extensionIds.forEach(async (id) => {
|
|
5
|
-
if (isExtensionLocal(id)) {
|
|
6
|
-
const { enable } = window.injectedWeb3[id];
|
|
7
|
-
if (enable !== undefined && typeof enable === 'function') {
|
|
8
|
-
rawExtensions.set(id, enable);
|
|
9
|
-
}
|
|
10
|
-
else {
|
|
11
|
-
removeExtensionFromLocal(id);
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
});
|
|
15
|
-
return rawExtensions;
|
|
16
|
-
};
|
|
17
|
-
export const enable = async (extensions, dappName) => {
|
|
18
|
-
try {
|
|
19
|
-
return await Promise.allSettled(Array.from(extensions.values()).map((fn) => fn(dappName)));
|
|
20
|
-
}
|
|
21
|
-
catch (e) {
|
|
22
|
-
console.error("Error during 'enable' extensions call: ", e);
|
|
23
|
-
return [];
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
export const formatEnabledExtensions = (extensions, results) => {
|
|
27
|
-
const extensionsState = new Map();
|
|
28
|
-
for (let i = 0; i < results.length; i++) {
|
|
29
|
-
const result = results[i];
|
|
30
|
-
const id = Array.from(extensions.keys())[i];
|
|
31
|
-
if (result.status === 'fulfilled') {
|
|
32
|
-
extensionsState.set(id, {
|
|
33
|
-
extension: result.value,
|
|
34
|
-
connected: true,
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
else if (result.status === 'rejected') {
|
|
38
|
-
extensionsState.set(id, {
|
|
39
|
-
connected: false,
|
|
40
|
-
error: result.reason,
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return extensionsState;
|
|
45
|
-
};
|
|
46
|
-
export const connectedExtensions = (extensions) => new Map(Array.from(extensions.entries()).filter(([, state]) => state.connected));
|
|
47
|
-
export const extensionsWithError = (extensions) => new Map(Array.from(extensions.entries()).filter(([, state]) => !state.connected));
|
|
48
|
-
|
|
49
|
-
//# sourceMappingURL=enable.js.map
|
|
50
|
-
|
|
51
|
-
//# sourceMappingURL=enable.js.map
|
package/accounts/enable.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/accounts/enable.ts"],"names":[],"mappings":"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","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 '../extensions/local'\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 enable = async (extensions: RawExtensions, dappName: string) => {\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"]}
|