@metamask/multichain-account-service 9.0.0 → 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -1
- package/dist/MultichainAccountService-method-action-types.cjs.map +1 -1
- package/dist/MultichainAccountService-method-action-types.d.cts +1 -5
- package/dist/MultichainAccountService-method-action-types.d.cts.map +1 -1
- package/dist/MultichainAccountService-method-action-types.d.mts +1 -5
- package/dist/MultichainAccountService-method-action-types.d.mts.map +1 -1
- package/dist/MultichainAccountService-method-action-types.mjs.map +1 -1
- package/dist/MultichainAccountService.cjs +3 -15
- package/dist/MultichainAccountService.cjs.map +1 -1
- package/dist/MultichainAccountService.d.cts +1 -8
- package/dist/MultichainAccountService.d.cts.map +1 -1
- package/dist/MultichainAccountService.d.mts +1 -8
- package/dist/MultichainAccountService.d.mts.map +1 -1
- package/dist/MultichainAccountService.mjs +3 -15
- package/dist/MultichainAccountService.mjs.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/providers/SnapAccountProvider.cjs +6 -6
- package/dist/providers/SnapAccountProvider.cjs.map +1 -1
- package/dist/providers/SnapAccountProvider.d.cts +4 -4
- package/dist/providers/SnapAccountProvider.d.cts.map +1 -1
- package/dist/providers/SnapAccountProvider.d.mts +4 -4
- package/dist/providers/SnapAccountProvider.d.mts.map +1 -1
- package/dist/providers/SnapAccountProvider.mjs +6 -6
- package/dist/providers/SnapAccountProvider.mjs.map +1 -1
- package/dist/tests/accounts.cjs +1 -1
- package/dist/tests/accounts.cjs.map +1 -1
- package/dist/tests/accounts.d.cts +1 -1
- package/dist/tests/accounts.d.cts.map +1 -1
- package/dist/tests/accounts.d.mts +1 -1
- package/dist/tests/accounts.d.mts.map +1 -1
- package/dist/tests/accounts.mjs +1 -1
- package/dist/tests/accounts.mjs.map +1 -1
- package/dist/tests/messenger.cjs +1 -3
- package/dist/tests/messenger.cjs.map +1 -1
- package/dist/tests/messenger.d.cts.map +1 -1
- package/dist/tests/messenger.d.mts.map +1 -1
- package/dist/tests/messenger.mjs +1 -3
- package/dist/tests/messenger.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +5 -14
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +5 -14
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/package.json +4 -3
- package/dist/snaps/SnapPlatformWatcher.cjs +0 -124
- package/dist/snaps/SnapPlatformWatcher.cjs.map +0 -1
- package/dist/snaps/SnapPlatformWatcher.d.cts +0 -22
- package/dist/snaps/SnapPlatformWatcher.d.cts.map +0 -1
- package/dist/snaps/SnapPlatformWatcher.d.mts +0 -22
- package/dist/snaps/SnapPlatformWatcher.d.mts.map +0 -1
- package/dist/snaps/SnapPlatformWatcher.mjs +0 -121
- package/dist/snaps/SnapPlatformWatcher.mjs.map +0 -1
package/dist/types.d.mts
CHANGED
|
@@ -2,10 +2,11 @@ import type { Bip44Account, MultichainAccountGroup, MultichainAccountWalletId, M
|
|
|
2
2
|
import type { AccountsControllerAccountAddedEvent, AccountsControllerAccountRemovedEvent, AccountsControllerGetAccountAction, AccountsControllerGetAccountByAddressAction, AccountsControllerGetAccountsAction, AccountsControllerListMultichainAccountsAction } from "@metamask/accounts-controller";
|
|
3
3
|
import type { TraceCallback } from "@metamask/controller-utils";
|
|
4
4
|
import type { KeyringAccount } from "@metamask/keyring-api";
|
|
5
|
-
import type { KeyringControllerAddNewKeyringAction, KeyringControllerCreateNewVaultAndKeychainAction, KeyringControllerCreateNewVaultAndRestoreAction, KeyringControllerGetKeyringsByTypeAction, KeyringControllerGetStateAction, KeyringControllerRemoveAccountAction,
|
|
5
|
+
import type { KeyringControllerAddNewKeyringAction, KeyringControllerCreateNewVaultAndKeychainAction, KeyringControllerCreateNewVaultAndRestoreAction, KeyringControllerGetKeyringsByTypeAction, KeyringControllerGetStateAction, KeyringControllerRemoveAccountAction, KeyringControllerWithKeyringAction, KeyringControllerWithKeyringV2Action } from "@metamask/keyring-controller";
|
|
6
6
|
import type { Messenger } from "@metamask/messenger";
|
|
7
7
|
import type { NetworkControllerFindNetworkClientIdByChainIdAction, NetworkControllerGetNetworkClientByIdAction } from "@metamask/network-controller";
|
|
8
|
-
import type {
|
|
8
|
+
import type { SnapAccountServiceEnsureReadyAction } from "@metamask/snap-account-service";
|
|
9
|
+
import type { SnapControllerHandleRequestAction } from "@metamask/snaps-controllers";
|
|
9
10
|
import type { serviceName } from "./MultichainAccountService.mjs";
|
|
10
11
|
import type { MultichainAccountServiceMethodActions } from "./MultichainAccountService-method-action-types.mjs";
|
|
11
12
|
/**
|
|
@@ -34,29 +35,19 @@ export type MultichainAccountServiceEvents = MultichainAccountServiceMultichainA
|
|
|
34
35
|
* All actions registered by other modules that {@link MultichainAccountService}
|
|
35
36
|
* calls.
|
|
36
37
|
*/
|
|
37
|
-
type AllowedActions = AccountsControllerListMultichainAccountsAction | AccountsControllerGetAccountsAction | AccountsControllerGetAccountAction | AccountsControllerGetAccountByAddressAction | KeyringControllerWithKeyringAction | KeyringControllerWithKeyringV2Action | KeyringControllerGetStateAction | KeyringControllerGetKeyringsByTypeAction | KeyringControllerAddNewKeyringAction | NetworkControllerGetNetworkClientByIdAction | NetworkControllerFindNetworkClientIdByChainIdAction | KeyringControllerCreateNewVaultAndKeychainAction | KeyringControllerCreateNewVaultAndRestoreAction | KeyringControllerRemoveAccountAction |
|
|
38
|
+
type AllowedActions = AccountsControllerListMultichainAccountsAction | AccountsControllerGetAccountsAction | AccountsControllerGetAccountAction | AccountsControllerGetAccountByAddressAction | KeyringControllerWithKeyringAction | KeyringControllerWithKeyringV2Action | KeyringControllerGetStateAction | KeyringControllerGetKeyringsByTypeAction | KeyringControllerAddNewKeyringAction | NetworkControllerGetNetworkClientByIdAction | NetworkControllerFindNetworkClientIdByChainIdAction | KeyringControllerCreateNewVaultAndKeychainAction | KeyringControllerCreateNewVaultAndRestoreAction | KeyringControllerRemoveAccountAction | SnapControllerHandleRequestAction | SnapAccountServiceEnsureReadyAction;
|
|
38
39
|
/**
|
|
39
40
|
* All events published by other modules that {@link MultichainAccountService}
|
|
40
41
|
* subscribes to.
|
|
41
42
|
*/
|
|
42
|
-
type AllowedEvents = AccountsControllerAccountAddedEvent | AccountsControllerAccountRemovedEvent
|
|
43
|
+
type AllowedEvents = AccountsControllerAccountAddedEvent | AccountsControllerAccountRemovedEvent;
|
|
43
44
|
/**
|
|
44
45
|
* The messenger restricted to actions and events that
|
|
45
46
|
* {@link MultichainAccountService} needs to access.
|
|
46
47
|
*/
|
|
47
48
|
export type MultichainAccountServiceMessenger = Messenger<'MultichainAccountService', MultichainAccountServiceActions | AllowedActions, MultichainAccountServiceEvents | AllowedEvents>;
|
|
48
|
-
/**
|
|
49
|
-
* Config for the Snap platform watcher (SnapPlatformWatcher).
|
|
50
|
-
*/
|
|
51
|
-
export type SnapPlatformWatcherConfig = {
|
|
52
|
-
/**
|
|
53
|
-
* How long to wait for the Snap keyring to appear before rejecting (ms).
|
|
54
|
-
*/
|
|
55
|
-
timeoutMs?: number;
|
|
56
|
-
};
|
|
57
49
|
export type MultichainAccountServiceConfig = {
|
|
58
50
|
trace?: TraceCallback;
|
|
59
|
-
snapPlatformWatcher?: SnapPlatformWatcherConfig;
|
|
60
51
|
};
|
|
61
52
|
export {};
|
|
62
53
|
//# sourceMappingURL=types.d.mts.map
|
package/dist/types.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.mts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,sBAAsB,EACtB,yBAAyB,EACzB,6BAA6B,EAC9B,8BAA8B;AAC/B,OAAO,KAAK,EACV,mCAAmC,EACnC,qCAAqC,EACrC,kCAAkC,EAClC,2CAA2C,EAC3C,mCAAmC,EACnC,8CAA8C,EAC/C,sCAAsC;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,mCAAmC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,8BAA8B;AAC5D,OAAO,KAAK,EACV,oCAAoC,EACpC,gDAAgD,EAChD,+CAA+C,EAC/C,wCAAwC,EACxC,+BAA+B,EAC/B,oCAAoC,EACpC,
|
|
1
|
+
{"version":3,"file":"types.d.mts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,sBAAsB,EACtB,yBAAyB,EACzB,6BAA6B,EAC9B,8BAA8B;AAC/B,OAAO,KAAK,EACV,mCAAmC,EACnC,qCAAqC,EACrC,kCAAkC,EAClC,2CAA2C,EAC3C,mCAAmC,EACnC,8CAA8C,EAC/C,sCAAsC;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,mCAAmC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,8BAA8B;AAC5D,OAAO,KAAK,EACV,oCAAoC,EACpC,gDAAgD,EAChD,+CAA+C,EAC/C,wCAAwC,EACxC,+BAA+B,EAC/B,oCAAoC,EACpC,kCAAkC,EAClC,oCAAoC,EACrC,qCAAqC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AACrD,OAAO,KAAK,EACV,mDAAmD,EACnD,2CAA2C,EAC5C,qCAAqC;AACtC,OAAO,KAAK,EAAE,mCAAmC,EAAE,uCAAuC;AAC1F,OAAO,KAAK,EAAE,iCAAiC,EAAE,oCAAoC;AAErF,OAAO,KAAK,EAAE,WAAW,EAAE,uCAAmC;AAC9D,OAAO,KAAK,EAAE,qCAAqC,EAAE,2DAAuD;AAE5G;;;GAGG;AACH,MAAM,MAAM,+BAA+B,GACzC,qCAAqC,CAAC;AAExC,MAAM,MAAM,0DAA0D,GAAG;IACvE,IAAI,EAAE,GAAG,OAAO,WAAW,gCAAgC,CAAC;IAC5D,OAAO,EAAE,CAAC,sBAAsB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;CACjE,CAAC;AAEF,MAAM,MAAM,0DAA0D,GAAG;IACvE,IAAI,EAAE,GAAG,OAAO,WAAW,gCAAgC,CAAC;IAC5D,OAAO,EAAE,CAAC,sBAAsB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;CACjE,CAAC;AAEF,MAAM,MAAM,+CAA+C,GAAG;IAC5D,IAAI,EAAE,GAAG,OAAO,WAAW,qBAAqB,CAAC;IACjD,OAAO,EAAE,CAAC,yBAAyB,EAAE,6BAA6B,CAAC,CAAC;CACrE,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,8BAA8B,GACtC,0DAA0D,GAC1D,0DAA0D,GAC1D,+CAA+C,CAAC;AAEpD;;;GAGG;AACH,KAAK,cAAc,GACf,8CAA8C,GAC9C,mCAAmC,GACnC,kCAAkC,GAClC,2CAA2C,GAC3C,kCAAkC,GAClC,oCAAoC,GACpC,+BAA+B,GAC/B,wCAAwC,GACxC,oCAAoC,GACpC,2CAA2C,GAC3C,mDAAmD,GACnD,gDAAgD,GAChD,+CAA+C,GAC/C,oCAAoC,GACpC,iCAAiC,GACjC,mCAAmC,CAAC;AAExC;;;GAGG;AACH,KAAK,aAAa,GACd,mCAAmC,GACnC,qCAAqC,CAAC;AAE1C;;;GAGG;AACH,MAAM,MAAM,iCAAiC,GAAG,SAAS,CACvD,0BAA0B,EAC1B,+BAA+B,GAAG,cAAc,EAChD,8BAA8B,GAAG,aAAa,CAC/C,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB,CAAC"}
|
package/dist/types.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.mjs","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n Bip44Account,\n MultichainAccountGroup,\n MultichainAccountWalletId,\n MultichainAccountWalletStatus,\n} from '@metamask/account-api';\nimport type {\n AccountsControllerAccountAddedEvent,\n AccountsControllerAccountRemovedEvent,\n AccountsControllerGetAccountAction,\n AccountsControllerGetAccountByAddressAction,\n AccountsControllerGetAccountsAction,\n AccountsControllerListMultichainAccountsAction,\n} from '@metamask/accounts-controller';\nimport type { TraceCallback } from '@metamask/controller-utils';\nimport type { KeyringAccount } from '@metamask/keyring-api';\nimport type {\n KeyringControllerAddNewKeyringAction,\n KeyringControllerCreateNewVaultAndKeychainAction,\n KeyringControllerCreateNewVaultAndRestoreAction,\n KeyringControllerGetKeyringsByTypeAction,\n KeyringControllerGetStateAction,\n KeyringControllerRemoveAccountAction,\n
|
|
1
|
+
{"version":3,"file":"types.mjs","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n Bip44Account,\n MultichainAccountGroup,\n MultichainAccountWalletId,\n MultichainAccountWalletStatus,\n} from '@metamask/account-api';\nimport type {\n AccountsControllerAccountAddedEvent,\n AccountsControllerAccountRemovedEvent,\n AccountsControllerGetAccountAction,\n AccountsControllerGetAccountByAddressAction,\n AccountsControllerGetAccountsAction,\n AccountsControllerListMultichainAccountsAction,\n} from '@metamask/accounts-controller';\nimport type { TraceCallback } from '@metamask/controller-utils';\nimport type { KeyringAccount } from '@metamask/keyring-api';\nimport type {\n KeyringControllerAddNewKeyringAction,\n KeyringControllerCreateNewVaultAndKeychainAction,\n KeyringControllerCreateNewVaultAndRestoreAction,\n KeyringControllerGetKeyringsByTypeAction,\n KeyringControllerGetStateAction,\n KeyringControllerRemoveAccountAction,\n KeyringControllerWithKeyringAction,\n KeyringControllerWithKeyringV2Action,\n} from '@metamask/keyring-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type {\n NetworkControllerFindNetworkClientIdByChainIdAction,\n NetworkControllerGetNetworkClientByIdAction,\n} from '@metamask/network-controller';\nimport type { SnapAccountServiceEnsureReadyAction } from '@metamask/snap-account-service';\nimport type { SnapControllerHandleRequestAction } from '@metamask/snaps-controllers';\n\nimport type { serviceName } from './MultichainAccountService';\nimport type { MultichainAccountServiceMethodActions } from './MultichainAccountService-method-action-types';\n\n/**\n * All actions that {@link MultichainAccountService} registers so that other\n * modules can call them.\n */\nexport type MultichainAccountServiceActions =\n MultichainAccountServiceMethodActions;\n\nexport type MultichainAccountServiceMultichainAccountGroupCreatedEvent = {\n type: `${typeof serviceName}:multichainAccountGroupCreated`;\n payload: [MultichainAccountGroup<Bip44Account<KeyringAccount>>];\n};\n\nexport type MultichainAccountServiceMultichainAccountGroupUpdatedEvent = {\n type: `${typeof serviceName}:multichainAccountGroupUpdated`;\n payload: [MultichainAccountGroup<Bip44Account<KeyringAccount>>];\n};\n\nexport type MultichainAccountServiceWalletStatusChangeEvent = {\n type: `${typeof serviceName}:walletStatusChange`;\n payload: [MultichainAccountWalletId, MultichainAccountWalletStatus];\n};\n\n/**\n * All events that {@link MultichainAccountService} publishes so that other modules\n * can subscribe to them.\n */\nexport type MultichainAccountServiceEvents =\n | MultichainAccountServiceMultichainAccountGroupCreatedEvent\n | MultichainAccountServiceMultichainAccountGroupUpdatedEvent\n | MultichainAccountServiceWalletStatusChangeEvent;\n\n/**\n * All actions registered by other modules that {@link MultichainAccountService}\n * calls.\n */\ntype AllowedActions =\n | AccountsControllerListMultichainAccountsAction\n | AccountsControllerGetAccountsAction\n | AccountsControllerGetAccountAction\n | AccountsControllerGetAccountByAddressAction\n | KeyringControllerWithKeyringAction\n | KeyringControllerWithKeyringV2Action\n | KeyringControllerGetStateAction\n | KeyringControllerGetKeyringsByTypeAction\n | KeyringControllerAddNewKeyringAction\n | NetworkControllerGetNetworkClientByIdAction\n | NetworkControllerFindNetworkClientIdByChainIdAction\n | KeyringControllerCreateNewVaultAndKeychainAction\n | KeyringControllerCreateNewVaultAndRestoreAction\n | KeyringControllerRemoveAccountAction\n | SnapControllerHandleRequestAction\n | SnapAccountServiceEnsureReadyAction;\n\n/**\n * All events published by other modules that {@link MultichainAccountService}\n * subscribes to.\n */\ntype AllowedEvents =\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountRemovedEvent;\n\n/**\n * The messenger restricted to actions and events that\n * {@link MultichainAccountService} needs to access.\n */\nexport type MultichainAccountServiceMessenger = Messenger<\n 'MultichainAccountService',\n MultichainAccountServiceActions | AllowedActions,\n MultichainAccountServiceEvents | AllowedEvents\n>;\n\nexport type MultichainAccountServiceConfig = {\n trace?: TraceCallback;\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask/multichain-account-service",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "10.0.0",
|
|
4
4
|
"description": "Service to manage multichain accounts",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Ethereum",
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
},
|
|
55
55
|
"dependencies": {
|
|
56
56
|
"@ethereumjs/util": "^9.1.0",
|
|
57
|
-
"@metamask/accounts-controller": "^38.
|
|
57
|
+
"@metamask/accounts-controller": "^38.1.1",
|
|
58
58
|
"@metamask/base-controller": "^9.1.0",
|
|
59
59
|
"@metamask/eth-snap-keyring": "^22.0.1",
|
|
60
60
|
"@metamask/key-tree": "^10.1.1",
|
|
@@ -64,6 +64,7 @@
|
|
|
64
64
|
"@metamask/keyring-snap-client": "^9.0.2",
|
|
65
65
|
"@metamask/keyring-utils": "^3.2.1",
|
|
66
66
|
"@metamask/messenger": "^1.2.0",
|
|
67
|
+
"@metamask/snap-account-service": "^0.1.0",
|
|
67
68
|
"@metamask/snaps-controllers": "^19.0.0",
|
|
68
69
|
"@metamask/snaps-sdk": "^11.0.0",
|
|
69
70
|
"@metamask/snaps-utils": "^12.1.2",
|
|
@@ -75,7 +76,7 @@
|
|
|
75
76
|
"devDependencies": {
|
|
76
77
|
"@metamask/account-api": "^1.0.4",
|
|
77
78
|
"@metamask/auto-changelog": "^6.1.0",
|
|
78
|
-
"@metamask/controller-utils": "^
|
|
79
|
+
"@metamask/controller-utils": "^12.1.0",
|
|
79
80
|
"@metamask/eth-hd-keyring": "^14.1.1",
|
|
80
81
|
"@metamask/providers": "^22.1.0",
|
|
81
82
|
"@ts-bridge/cli": "^0.6.4",
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
-
};
|
|
8
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
-
};
|
|
13
|
-
var _SnapPlatformWatcher_instances, _SnapPlatformWatcher_messenger, _SnapPlatformWatcher_ensureOnboardingComplete, _SnapPlatformWatcher_snapKeyringWaitTimeoutMs, _SnapPlatformWatcher_isReadyOnce, _SnapPlatformWatcher_isReady, _SnapPlatformWatcher_waitForSnapKeyring, _SnapPlatformWatcher_hasSnapKeyring, _SnapPlatformWatcher_waitForSnapKeyringViaStateChange, _SnapPlatformWatcher_watch;
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.SnapPlatformWatcher = exports.DEFAULT_SNAP_KEYRING_WAIT_TIMEOUT_MS = void 0;
|
|
16
|
-
const keyring_controller_1 = require("@metamask/keyring-controller");
|
|
17
|
-
const utils_1 = require("@metamask/utils");
|
|
18
|
-
const lodash_1 = require("lodash");
|
|
19
|
-
const logger_1 = require("../logger.cjs");
|
|
20
|
-
/** Default wait for Snap keyring to appear before rejecting (ms). */
|
|
21
|
-
exports.DEFAULT_SNAP_KEYRING_WAIT_TIMEOUT_MS = 5000;
|
|
22
|
-
/** Error message when Snap keyring does not appear within the timeout. */
|
|
23
|
-
const SNAP_KEYRING_TIMEOUT_MESSAGE = 'Snap platform or keyrings still not ready. Aborting.';
|
|
24
|
-
/**
|
|
25
|
-
* Returns true if the given KeyringController state slice contains a Snap keyring.
|
|
26
|
-
*
|
|
27
|
-
* @param state - KeyringController state.
|
|
28
|
-
* @returns True if state.keyrings contains a keyring with type KeyringTypes.snap.
|
|
29
|
-
*/
|
|
30
|
-
function stateHasSnapKeyring(state) {
|
|
31
|
-
return state.keyrings.some((k) => k.type === keyring_controller_1.KeyringTypes.snap);
|
|
32
|
-
}
|
|
33
|
-
class SnapPlatformWatcher {
|
|
34
|
-
constructor(messenger, options = {}) {
|
|
35
|
-
_SnapPlatformWatcher_instances.add(this);
|
|
36
|
-
_SnapPlatformWatcher_messenger.set(this, void 0);
|
|
37
|
-
_SnapPlatformWatcher_ensureOnboardingComplete.set(this, void 0);
|
|
38
|
-
_SnapPlatformWatcher_snapKeyringWaitTimeoutMs.set(this, void 0);
|
|
39
|
-
_SnapPlatformWatcher_isReadyOnce.set(this, void 0);
|
|
40
|
-
_SnapPlatformWatcher_isReady.set(this, void 0);
|
|
41
|
-
__classPrivateFieldSet(this, _SnapPlatformWatcher_messenger, messenger, "f");
|
|
42
|
-
__classPrivateFieldSet(this, _SnapPlatformWatcher_ensureOnboardingComplete, options.ensureOnboardingComplete, "f");
|
|
43
|
-
__classPrivateFieldSet(this, _SnapPlatformWatcher_snapKeyringWaitTimeoutMs, options.snapKeyringWaitTimeoutMs ?? exports.DEFAULT_SNAP_KEYRING_WAIT_TIMEOUT_MS, "f");
|
|
44
|
-
__classPrivateFieldSet(this, _SnapPlatformWatcher_isReady, false, "f");
|
|
45
|
-
__classPrivateFieldSet(this, _SnapPlatformWatcher_isReadyOnce, (0, utils_1.createDeferredPromise)(), "f");
|
|
46
|
-
__classPrivateFieldGet(this, _SnapPlatformWatcher_instances, "m", _SnapPlatformWatcher_watch).call(this);
|
|
47
|
-
}
|
|
48
|
-
get isReady() {
|
|
49
|
-
return __classPrivateFieldGet(this, _SnapPlatformWatcher_isReady, "f");
|
|
50
|
-
}
|
|
51
|
-
async ensureCanUseSnapPlatform() {
|
|
52
|
-
// When ensureOnboardingComplete is provided, wait for the onboarding first.
|
|
53
|
-
await __classPrivateFieldGet(this, _SnapPlatformWatcher_ensureOnboardingComplete, "f")?.call(this);
|
|
54
|
-
// In all cases, we also require the Snap platform to be ready and available.
|
|
55
|
-
await __classPrivateFieldGet(this, _SnapPlatformWatcher_isReadyOnce, "f").promise;
|
|
56
|
-
if (!__classPrivateFieldGet(this, _SnapPlatformWatcher_isReady, "f")) {
|
|
57
|
-
throw new Error('Snap platform cannot be used now.');
|
|
58
|
-
}
|
|
59
|
-
// After a restore/reset, the Snap keyring is created lazily by the client (e.g. when
|
|
60
|
-
// getSnapKeyring() is called). Non-EVM account creation needs the keyring to exist, so we
|
|
61
|
-
// wait for it here with a timeout to avoid "Keyring not found" errors.
|
|
62
|
-
await __classPrivateFieldGet(this, _SnapPlatformWatcher_instances, "m", _SnapPlatformWatcher_waitForSnapKeyring).call(this);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
exports.SnapPlatformWatcher = SnapPlatformWatcher;
|
|
66
|
-
_SnapPlatformWatcher_messenger = new WeakMap(), _SnapPlatformWatcher_ensureOnboardingComplete = new WeakMap(), _SnapPlatformWatcher_snapKeyringWaitTimeoutMs = new WeakMap(), _SnapPlatformWatcher_isReadyOnce = new WeakMap(), _SnapPlatformWatcher_isReady = new WeakMap(), _SnapPlatformWatcher_instances = new WeakSet(), _SnapPlatformWatcher_waitForSnapKeyring =
|
|
67
|
-
/**
|
|
68
|
-
* Waits for KeyringController to have a Snap keyring available.
|
|
69
|
-
* Checks once, then subscribes to KeyringController:stateChange until the keyring
|
|
70
|
-
* appears or the timeout is reached (then throws).
|
|
71
|
-
*/
|
|
72
|
-
async function _SnapPlatformWatcher_waitForSnapKeyring() {
|
|
73
|
-
if (__classPrivateFieldGet(this, _SnapPlatformWatcher_instances, "m", _SnapPlatformWatcher_hasSnapKeyring).call(this)) {
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
await __classPrivateFieldGet(this, _SnapPlatformWatcher_instances, "m", _SnapPlatformWatcher_waitForSnapKeyringViaStateChange).call(this);
|
|
77
|
-
}, _SnapPlatformWatcher_hasSnapKeyring = function _SnapPlatformWatcher_hasSnapKeyring() {
|
|
78
|
-
try {
|
|
79
|
-
const state = __classPrivateFieldGet(this, _SnapPlatformWatcher_messenger, "f").call('KeyringController:getState');
|
|
80
|
-
return stateHasSnapKeyring(state);
|
|
81
|
-
}
|
|
82
|
-
catch (error) {
|
|
83
|
-
(0, logger_1.projectLogger)(`${logger_1.WARNING_PREFIX} KeyringController error while waiting for Snap keyring:`, error);
|
|
84
|
-
return false;
|
|
85
|
-
}
|
|
86
|
-
}, _SnapPlatformWatcher_waitForSnapKeyringViaStateChange =
|
|
87
|
-
/**
|
|
88
|
-
* Subscribes to KeyringController:stateChange and resolves when a Snap keyring
|
|
89
|
-
* appears in state, or rejects with an error after the timeout.
|
|
90
|
-
*/
|
|
91
|
-
async function _SnapPlatformWatcher_waitForSnapKeyringViaStateChange() {
|
|
92
|
-
await new Promise((resolve, reject) => {
|
|
93
|
-
const timeoutRef = {
|
|
94
|
-
id: undefined,
|
|
95
|
-
};
|
|
96
|
-
const listener = (keyrings) => {
|
|
97
|
-
if (stateHasSnapKeyring({ keyrings })) {
|
|
98
|
-
clearTimeout(timeoutRef.id);
|
|
99
|
-
__classPrivateFieldGet(this, _SnapPlatformWatcher_messenger, "f").unsubscribe('KeyringController:stateChange', listener);
|
|
100
|
-
resolve();
|
|
101
|
-
}
|
|
102
|
-
};
|
|
103
|
-
timeoutRef.id = setTimeout(() => {
|
|
104
|
-
__classPrivateFieldGet(this, _SnapPlatformWatcher_messenger, "f").unsubscribe('KeyringController:stateChange', listener);
|
|
105
|
-
reject(new Error(SNAP_KEYRING_TIMEOUT_MESSAGE));
|
|
106
|
-
}, __classPrivateFieldGet(this, _SnapPlatformWatcher_snapKeyringWaitTimeoutMs, "f"));
|
|
107
|
-
__classPrivateFieldGet(this, _SnapPlatformWatcher_messenger, "f").subscribe('KeyringController:stateChange', listener, (state) => state.keyrings);
|
|
108
|
-
});
|
|
109
|
-
}, _SnapPlatformWatcher_watch = function _SnapPlatformWatcher_watch() {
|
|
110
|
-
const logReadyOnce = (0, lodash_1.once)(() => (0, logger_1.projectLogger)('Snap platform is ready!'));
|
|
111
|
-
const initialState = __classPrivateFieldGet(this, _SnapPlatformWatcher_messenger, "f").call('SnapController:getState');
|
|
112
|
-
if (initialState.isReady) {
|
|
113
|
-
__classPrivateFieldSet(this, _SnapPlatformWatcher_isReady, true, "f");
|
|
114
|
-
__classPrivateFieldGet(this, _SnapPlatformWatcher_isReadyOnce, "f").resolve();
|
|
115
|
-
}
|
|
116
|
-
__classPrivateFieldGet(this, _SnapPlatformWatcher_messenger, "f").subscribe('SnapController:stateChange', (isReady) => {
|
|
117
|
-
__classPrivateFieldSet(this, _SnapPlatformWatcher_isReady, isReady, "f");
|
|
118
|
-
if (isReady) {
|
|
119
|
-
logReadyOnce();
|
|
120
|
-
__classPrivateFieldGet(this, _SnapPlatformWatcher_isReadyOnce, "f").resolve();
|
|
121
|
-
}
|
|
122
|
-
}, (state) => state.isReady);
|
|
123
|
-
};
|
|
124
|
-
//# sourceMappingURL=SnapPlatformWatcher.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SnapPlatformWatcher.cjs","sourceRoot":"","sources":["../../src/snaps/SnapPlatformWatcher.ts"],"names":[],"mappings":"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","sourcesContent":["import { KeyringTypes } from '@metamask/keyring-controller';\nimport { createDeferredPromise, DeferredPromise } from '@metamask/utils';\nimport { once } from 'lodash';\n\nimport { projectLogger as log, WARNING_PREFIX } from '../logger';\nimport { MultichainAccountServiceMessenger } from '../types';\n\n/** Minimal KeyringController state shape needed to detect Snap keyring. */\ntype KeyringControllerStateSlice = {\n keyrings: { type: string }[];\n};\n\n/** Default wait for Snap keyring to appear before rejecting (ms). */\nexport const DEFAULT_SNAP_KEYRING_WAIT_TIMEOUT_MS = 5_000;\n\n/** Error message when Snap keyring does not appear within the timeout. */\nconst SNAP_KEYRING_TIMEOUT_MESSAGE =\n 'Snap platform or keyrings still not ready. Aborting.';\n\n/**\n * Returns true if the given KeyringController state slice contains a Snap keyring.\n *\n * @param state - KeyringController state.\n * @returns True if state.keyrings contains a keyring with type KeyringTypes.snap.\n */\nfunction stateHasSnapKeyring(state: KeyringControllerStateSlice): boolean {\n return state.keyrings.some((k) => k.type === KeyringTypes.snap);\n}\n\nexport type SnapPlatformWatcherOptions = {\n /**\n * Resolves when onboarding is complete.\n */\n ensureOnboardingComplete?: () => Promise<void>;\n /**\n * How long to wait for the Snap keyring to appear before rejecting (ms).\n *\n * @default DEFAULT_SNAP_KEYRING_WAIT_TIMEOUT_MS\n */\n snapKeyringWaitTimeoutMs?: number;\n};\n\nexport class SnapPlatformWatcher {\n readonly #messenger: MultichainAccountServiceMessenger;\n\n readonly #ensureOnboardingComplete?: () => Promise<void>;\n\n readonly #snapKeyringWaitTimeoutMs: number;\n\n readonly #isReadyOnce: DeferredPromise<void>;\n\n #isReady: boolean;\n\n constructor(\n messenger: MultichainAccountServiceMessenger,\n options: SnapPlatformWatcherOptions = {},\n ) {\n this.#messenger = messenger;\n this.#ensureOnboardingComplete = options.ensureOnboardingComplete;\n this.#snapKeyringWaitTimeoutMs =\n options.snapKeyringWaitTimeoutMs ?? DEFAULT_SNAP_KEYRING_WAIT_TIMEOUT_MS;\n\n this.#isReady = false;\n this.#isReadyOnce = createDeferredPromise<void>();\n\n this.#watch();\n }\n\n get isReady(): boolean {\n return this.#isReady;\n }\n\n async ensureCanUseSnapPlatform(): Promise<void> {\n // When ensureOnboardingComplete is provided, wait for the onboarding first.\n await this.#ensureOnboardingComplete?.();\n\n // In all cases, we also require the Snap platform to be ready and available.\n await this.#isReadyOnce.promise;\n\n if (!this.#isReady) {\n throw new Error('Snap platform cannot be used now.');\n }\n\n // After a restore/reset, the Snap keyring is created lazily by the client (e.g. when\n // getSnapKeyring() is called). Non-EVM account creation needs the keyring to exist, so we\n // wait for it here with a timeout to avoid \"Keyring not found\" errors.\n await this.#waitForSnapKeyring();\n }\n\n /**\n * Waits for KeyringController to have a Snap keyring available.\n * Checks once, then subscribes to KeyringController:stateChange until the keyring\n * appears or the timeout is reached (then throws).\n */\n async #waitForSnapKeyring(): Promise<void> {\n if (this.#hasSnapKeyring()) {\n return;\n }\n await this.#waitForSnapKeyringViaStateChange();\n }\n\n /**\n * Returns true if KeyringController already has a Snap keyring.\n * Logs and returns false on error.\n *\n * @returns True if a Snap keyring exists, false otherwise or on error.\n */\n #hasSnapKeyring(): boolean {\n try {\n const state = this.#messenger.call(\n 'KeyringController:getState',\n ) as KeyringControllerStateSlice;\n return stateHasSnapKeyring(state);\n } catch (error) {\n log(\n `${WARNING_PREFIX} KeyringController error while waiting for Snap keyring:`,\n error,\n );\n return false;\n }\n }\n\n /**\n * Subscribes to KeyringController:stateChange and resolves when a Snap keyring\n * appears in state, or rejects with an error after the timeout.\n */\n async #waitForSnapKeyringViaStateChange(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const timeoutRef: { id: ReturnType<typeof setTimeout> | undefined } = {\n id: undefined,\n };\n\n const listener = (\n keyrings: KeyringControllerStateSlice['keyrings'],\n ): void => {\n if (stateHasSnapKeyring({ keyrings })) {\n clearTimeout(timeoutRef.id);\n this.#messenger.unsubscribe(\n 'KeyringController:stateChange',\n listener,\n );\n resolve();\n }\n };\n\n timeoutRef.id = setTimeout(() => {\n this.#messenger.unsubscribe('KeyringController:stateChange', listener);\n reject(new Error(SNAP_KEYRING_TIMEOUT_MESSAGE));\n }, this.#snapKeyringWaitTimeoutMs);\n\n this.#messenger.subscribe(\n 'KeyringController:stateChange',\n listener,\n (state) => state.keyrings,\n );\n });\n }\n\n #watch(): void {\n const logReadyOnce = once(() => log('Snap platform is ready!'));\n\n const initialState = this.#messenger.call('SnapController:getState');\n if (initialState.isReady) {\n this.#isReady = true;\n this.#isReadyOnce.resolve();\n }\n\n this.#messenger.subscribe(\n 'SnapController:stateChange',\n (isReady: boolean) => {\n this.#isReady = isReady;\n\n if (isReady) {\n logReadyOnce();\n this.#isReadyOnce.resolve();\n }\n },\n (state) => state.isReady,\n );\n }\n}\n"]}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { MultichainAccountServiceMessenger } from "../types.cjs";
|
|
2
|
-
/** Default wait for Snap keyring to appear before rejecting (ms). */
|
|
3
|
-
export declare const DEFAULT_SNAP_KEYRING_WAIT_TIMEOUT_MS = 5000;
|
|
4
|
-
export type SnapPlatformWatcherOptions = {
|
|
5
|
-
/**
|
|
6
|
-
* Resolves when onboarding is complete.
|
|
7
|
-
*/
|
|
8
|
-
ensureOnboardingComplete?: () => Promise<void>;
|
|
9
|
-
/**
|
|
10
|
-
* How long to wait for the Snap keyring to appear before rejecting (ms).
|
|
11
|
-
*
|
|
12
|
-
* @default DEFAULT_SNAP_KEYRING_WAIT_TIMEOUT_MS
|
|
13
|
-
*/
|
|
14
|
-
snapKeyringWaitTimeoutMs?: number;
|
|
15
|
-
};
|
|
16
|
-
export declare class SnapPlatformWatcher {
|
|
17
|
-
#private;
|
|
18
|
-
constructor(messenger: MultichainAccountServiceMessenger, options?: SnapPlatformWatcherOptions);
|
|
19
|
-
get isReady(): boolean;
|
|
20
|
-
ensureCanUseSnapPlatform(): Promise<void>;
|
|
21
|
-
}
|
|
22
|
-
//# sourceMappingURL=SnapPlatformWatcher.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SnapPlatformWatcher.d.cts","sourceRoot":"","sources":["../../src/snaps/SnapPlatformWatcher.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iCAAiC,EAAE,qBAAiB;AAO7D,qEAAqE;AACrE,eAAO,MAAM,oCAAoC,OAAQ,CAAC;AAgB1D,MAAM,MAAM,0BAA0B,GAAG;IACvC;;OAEG;IACH,wBAAwB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC,CAAC;AAEF,qBAAa,mBAAmB;;gBAY5B,SAAS,EAAE,iCAAiC,EAC5C,OAAO,GAAE,0BAA+B;IAa1C,IAAI,OAAO,IAAI,OAAO,CAErB;IAEK,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC;CA4GhD"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { MultichainAccountServiceMessenger } from "../types.mjs";
|
|
2
|
-
/** Default wait for Snap keyring to appear before rejecting (ms). */
|
|
3
|
-
export declare const DEFAULT_SNAP_KEYRING_WAIT_TIMEOUT_MS = 5000;
|
|
4
|
-
export type SnapPlatformWatcherOptions = {
|
|
5
|
-
/**
|
|
6
|
-
* Resolves when onboarding is complete.
|
|
7
|
-
*/
|
|
8
|
-
ensureOnboardingComplete?: () => Promise<void>;
|
|
9
|
-
/**
|
|
10
|
-
* How long to wait for the Snap keyring to appear before rejecting (ms).
|
|
11
|
-
*
|
|
12
|
-
* @default DEFAULT_SNAP_KEYRING_WAIT_TIMEOUT_MS
|
|
13
|
-
*/
|
|
14
|
-
snapKeyringWaitTimeoutMs?: number;
|
|
15
|
-
};
|
|
16
|
-
export declare class SnapPlatformWatcher {
|
|
17
|
-
#private;
|
|
18
|
-
constructor(messenger: MultichainAccountServiceMessenger, options?: SnapPlatformWatcherOptions);
|
|
19
|
-
get isReady(): boolean;
|
|
20
|
-
ensureCanUseSnapPlatform(): Promise<void>;
|
|
21
|
-
}
|
|
22
|
-
//# sourceMappingURL=SnapPlatformWatcher.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SnapPlatformWatcher.d.mts","sourceRoot":"","sources":["../../src/snaps/SnapPlatformWatcher.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iCAAiC,EAAE,qBAAiB;AAO7D,qEAAqE;AACrE,eAAO,MAAM,oCAAoC,OAAQ,CAAC;AAgB1D,MAAM,MAAM,0BAA0B,GAAG;IACvC;;OAEG;IACH,wBAAwB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC,CAAC;AAEF,qBAAa,mBAAmB;;gBAY5B,SAAS,EAAE,iCAAiC,EAC5C,OAAO,GAAE,0BAA+B;IAa1C,IAAI,OAAO,IAAI,OAAO,CAErB;IAEK,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC;CA4GhD"}
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
-
};
|
|
7
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
-
};
|
|
12
|
-
var _SnapPlatformWatcher_instances, _SnapPlatformWatcher_messenger, _SnapPlatformWatcher_ensureOnboardingComplete, _SnapPlatformWatcher_snapKeyringWaitTimeoutMs, _SnapPlatformWatcher_isReadyOnce, _SnapPlatformWatcher_isReady, _SnapPlatformWatcher_waitForSnapKeyring, _SnapPlatformWatcher_hasSnapKeyring, _SnapPlatformWatcher_waitForSnapKeyringViaStateChange, _SnapPlatformWatcher_watch;
|
|
13
|
-
import { KeyringTypes } from "@metamask/keyring-controller";
|
|
14
|
-
import { createDeferredPromise } from "@metamask/utils";
|
|
15
|
-
import $lodash from "lodash";
|
|
16
|
-
const { once } = $lodash;
|
|
17
|
-
import { projectLogger as log, WARNING_PREFIX } from "../logger.mjs";
|
|
18
|
-
/** Default wait for Snap keyring to appear before rejecting (ms). */
|
|
19
|
-
export const DEFAULT_SNAP_KEYRING_WAIT_TIMEOUT_MS = 5000;
|
|
20
|
-
/** Error message when Snap keyring does not appear within the timeout. */
|
|
21
|
-
const SNAP_KEYRING_TIMEOUT_MESSAGE = 'Snap platform or keyrings still not ready. Aborting.';
|
|
22
|
-
/**
|
|
23
|
-
* Returns true if the given KeyringController state slice contains a Snap keyring.
|
|
24
|
-
*
|
|
25
|
-
* @param state - KeyringController state.
|
|
26
|
-
* @returns True if state.keyrings contains a keyring with type KeyringTypes.snap.
|
|
27
|
-
*/
|
|
28
|
-
function stateHasSnapKeyring(state) {
|
|
29
|
-
return state.keyrings.some((k) => k.type === KeyringTypes.snap);
|
|
30
|
-
}
|
|
31
|
-
export class SnapPlatformWatcher {
|
|
32
|
-
constructor(messenger, options = {}) {
|
|
33
|
-
_SnapPlatformWatcher_instances.add(this);
|
|
34
|
-
_SnapPlatformWatcher_messenger.set(this, void 0);
|
|
35
|
-
_SnapPlatformWatcher_ensureOnboardingComplete.set(this, void 0);
|
|
36
|
-
_SnapPlatformWatcher_snapKeyringWaitTimeoutMs.set(this, void 0);
|
|
37
|
-
_SnapPlatformWatcher_isReadyOnce.set(this, void 0);
|
|
38
|
-
_SnapPlatformWatcher_isReady.set(this, void 0);
|
|
39
|
-
__classPrivateFieldSet(this, _SnapPlatformWatcher_messenger, messenger, "f");
|
|
40
|
-
__classPrivateFieldSet(this, _SnapPlatformWatcher_ensureOnboardingComplete, options.ensureOnboardingComplete, "f");
|
|
41
|
-
__classPrivateFieldSet(this, _SnapPlatformWatcher_snapKeyringWaitTimeoutMs, options.snapKeyringWaitTimeoutMs ?? DEFAULT_SNAP_KEYRING_WAIT_TIMEOUT_MS, "f");
|
|
42
|
-
__classPrivateFieldSet(this, _SnapPlatformWatcher_isReady, false, "f");
|
|
43
|
-
__classPrivateFieldSet(this, _SnapPlatformWatcher_isReadyOnce, createDeferredPromise(), "f");
|
|
44
|
-
__classPrivateFieldGet(this, _SnapPlatformWatcher_instances, "m", _SnapPlatformWatcher_watch).call(this);
|
|
45
|
-
}
|
|
46
|
-
get isReady() {
|
|
47
|
-
return __classPrivateFieldGet(this, _SnapPlatformWatcher_isReady, "f");
|
|
48
|
-
}
|
|
49
|
-
async ensureCanUseSnapPlatform() {
|
|
50
|
-
// When ensureOnboardingComplete is provided, wait for the onboarding first.
|
|
51
|
-
await __classPrivateFieldGet(this, _SnapPlatformWatcher_ensureOnboardingComplete, "f")?.call(this);
|
|
52
|
-
// In all cases, we also require the Snap platform to be ready and available.
|
|
53
|
-
await __classPrivateFieldGet(this, _SnapPlatformWatcher_isReadyOnce, "f").promise;
|
|
54
|
-
if (!__classPrivateFieldGet(this, _SnapPlatformWatcher_isReady, "f")) {
|
|
55
|
-
throw new Error('Snap platform cannot be used now.');
|
|
56
|
-
}
|
|
57
|
-
// After a restore/reset, the Snap keyring is created lazily by the client (e.g. when
|
|
58
|
-
// getSnapKeyring() is called). Non-EVM account creation needs the keyring to exist, so we
|
|
59
|
-
// wait for it here with a timeout to avoid "Keyring not found" errors.
|
|
60
|
-
await __classPrivateFieldGet(this, _SnapPlatformWatcher_instances, "m", _SnapPlatformWatcher_waitForSnapKeyring).call(this);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
_SnapPlatformWatcher_messenger = new WeakMap(), _SnapPlatformWatcher_ensureOnboardingComplete = new WeakMap(), _SnapPlatformWatcher_snapKeyringWaitTimeoutMs = new WeakMap(), _SnapPlatformWatcher_isReadyOnce = new WeakMap(), _SnapPlatformWatcher_isReady = new WeakMap(), _SnapPlatformWatcher_instances = new WeakSet(), _SnapPlatformWatcher_waitForSnapKeyring =
|
|
64
|
-
/**
|
|
65
|
-
* Waits for KeyringController to have a Snap keyring available.
|
|
66
|
-
* Checks once, then subscribes to KeyringController:stateChange until the keyring
|
|
67
|
-
* appears or the timeout is reached (then throws).
|
|
68
|
-
*/
|
|
69
|
-
async function _SnapPlatformWatcher_waitForSnapKeyring() {
|
|
70
|
-
if (__classPrivateFieldGet(this, _SnapPlatformWatcher_instances, "m", _SnapPlatformWatcher_hasSnapKeyring).call(this)) {
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
await __classPrivateFieldGet(this, _SnapPlatformWatcher_instances, "m", _SnapPlatformWatcher_waitForSnapKeyringViaStateChange).call(this);
|
|
74
|
-
}, _SnapPlatformWatcher_hasSnapKeyring = function _SnapPlatformWatcher_hasSnapKeyring() {
|
|
75
|
-
try {
|
|
76
|
-
const state = __classPrivateFieldGet(this, _SnapPlatformWatcher_messenger, "f").call('KeyringController:getState');
|
|
77
|
-
return stateHasSnapKeyring(state);
|
|
78
|
-
}
|
|
79
|
-
catch (error) {
|
|
80
|
-
log(`${WARNING_PREFIX} KeyringController error while waiting for Snap keyring:`, error);
|
|
81
|
-
return false;
|
|
82
|
-
}
|
|
83
|
-
}, _SnapPlatformWatcher_waitForSnapKeyringViaStateChange =
|
|
84
|
-
/**
|
|
85
|
-
* Subscribes to KeyringController:stateChange and resolves when a Snap keyring
|
|
86
|
-
* appears in state, or rejects with an error after the timeout.
|
|
87
|
-
*/
|
|
88
|
-
async function _SnapPlatformWatcher_waitForSnapKeyringViaStateChange() {
|
|
89
|
-
await new Promise((resolve, reject) => {
|
|
90
|
-
const timeoutRef = {
|
|
91
|
-
id: undefined,
|
|
92
|
-
};
|
|
93
|
-
const listener = (keyrings) => {
|
|
94
|
-
if (stateHasSnapKeyring({ keyrings })) {
|
|
95
|
-
clearTimeout(timeoutRef.id);
|
|
96
|
-
__classPrivateFieldGet(this, _SnapPlatformWatcher_messenger, "f").unsubscribe('KeyringController:stateChange', listener);
|
|
97
|
-
resolve();
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
|
-
timeoutRef.id = setTimeout(() => {
|
|
101
|
-
__classPrivateFieldGet(this, _SnapPlatformWatcher_messenger, "f").unsubscribe('KeyringController:stateChange', listener);
|
|
102
|
-
reject(new Error(SNAP_KEYRING_TIMEOUT_MESSAGE));
|
|
103
|
-
}, __classPrivateFieldGet(this, _SnapPlatformWatcher_snapKeyringWaitTimeoutMs, "f"));
|
|
104
|
-
__classPrivateFieldGet(this, _SnapPlatformWatcher_messenger, "f").subscribe('KeyringController:stateChange', listener, (state) => state.keyrings);
|
|
105
|
-
});
|
|
106
|
-
}, _SnapPlatformWatcher_watch = function _SnapPlatformWatcher_watch() {
|
|
107
|
-
const logReadyOnce = once(() => log('Snap platform is ready!'));
|
|
108
|
-
const initialState = __classPrivateFieldGet(this, _SnapPlatformWatcher_messenger, "f").call('SnapController:getState');
|
|
109
|
-
if (initialState.isReady) {
|
|
110
|
-
__classPrivateFieldSet(this, _SnapPlatformWatcher_isReady, true, "f");
|
|
111
|
-
__classPrivateFieldGet(this, _SnapPlatformWatcher_isReadyOnce, "f").resolve();
|
|
112
|
-
}
|
|
113
|
-
__classPrivateFieldGet(this, _SnapPlatformWatcher_messenger, "f").subscribe('SnapController:stateChange', (isReady) => {
|
|
114
|
-
__classPrivateFieldSet(this, _SnapPlatformWatcher_isReady, isReady, "f");
|
|
115
|
-
if (isReady) {
|
|
116
|
-
logReadyOnce();
|
|
117
|
-
__classPrivateFieldGet(this, _SnapPlatformWatcher_isReadyOnce, "f").resolve();
|
|
118
|
-
}
|
|
119
|
-
}, (state) => state.isReady);
|
|
120
|
-
};
|
|
121
|
-
//# sourceMappingURL=SnapPlatformWatcher.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SnapPlatformWatcher.mjs","sourceRoot":"","sources":["../../src/snaps/SnapPlatformWatcher.ts"],"names":[],"mappings":"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","sourcesContent":["import { KeyringTypes } from '@metamask/keyring-controller';\nimport { createDeferredPromise, DeferredPromise } from '@metamask/utils';\nimport { once } from 'lodash';\n\nimport { projectLogger as log, WARNING_PREFIX } from '../logger';\nimport { MultichainAccountServiceMessenger } from '../types';\n\n/** Minimal KeyringController state shape needed to detect Snap keyring. */\ntype KeyringControllerStateSlice = {\n keyrings: { type: string }[];\n};\n\n/** Default wait for Snap keyring to appear before rejecting (ms). */\nexport const DEFAULT_SNAP_KEYRING_WAIT_TIMEOUT_MS = 5_000;\n\n/** Error message when Snap keyring does not appear within the timeout. */\nconst SNAP_KEYRING_TIMEOUT_MESSAGE =\n 'Snap platform or keyrings still not ready. Aborting.';\n\n/**\n * Returns true if the given KeyringController state slice contains a Snap keyring.\n *\n * @param state - KeyringController state.\n * @returns True if state.keyrings contains a keyring with type KeyringTypes.snap.\n */\nfunction stateHasSnapKeyring(state: KeyringControllerStateSlice): boolean {\n return state.keyrings.some((k) => k.type === KeyringTypes.snap);\n}\n\nexport type SnapPlatformWatcherOptions = {\n /**\n * Resolves when onboarding is complete.\n */\n ensureOnboardingComplete?: () => Promise<void>;\n /**\n * How long to wait for the Snap keyring to appear before rejecting (ms).\n *\n * @default DEFAULT_SNAP_KEYRING_WAIT_TIMEOUT_MS\n */\n snapKeyringWaitTimeoutMs?: number;\n};\n\nexport class SnapPlatformWatcher {\n readonly #messenger: MultichainAccountServiceMessenger;\n\n readonly #ensureOnboardingComplete?: () => Promise<void>;\n\n readonly #snapKeyringWaitTimeoutMs: number;\n\n readonly #isReadyOnce: DeferredPromise<void>;\n\n #isReady: boolean;\n\n constructor(\n messenger: MultichainAccountServiceMessenger,\n options: SnapPlatformWatcherOptions = {},\n ) {\n this.#messenger = messenger;\n this.#ensureOnboardingComplete = options.ensureOnboardingComplete;\n this.#snapKeyringWaitTimeoutMs =\n options.snapKeyringWaitTimeoutMs ?? DEFAULT_SNAP_KEYRING_WAIT_TIMEOUT_MS;\n\n this.#isReady = false;\n this.#isReadyOnce = createDeferredPromise<void>();\n\n this.#watch();\n }\n\n get isReady(): boolean {\n return this.#isReady;\n }\n\n async ensureCanUseSnapPlatform(): Promise<void> {\n // When ensureOnboardingComplete is provided, wait for the onboarding first.\n await this.#ensureOnboardingComplete?.();\n\n // In all cases, we also require the Snap platform to be ready and available.\n await this.#isReadyOnce.promise;\n\n if (!this.#isReady) {\n throw new Error('Snap platform cannot be used now.');\n }\n\n // After a restore/reset, the Snap keyring is created lazily by the client (e.g. when\n // getSnapKeyring() is called). Non-EVM account creation needs the keyring to exist, so we\n // wait for it here with a timeout to avoid \"Keyring not found\" errors.\n await this.#waitForSnapKeyring();\n }\n\n /**\n * Waits for KeyringController to have a Snap keyring available.\n * Checks once, then subscribes to KeyringController:stateChange until the keyring\n * appears or the timeout is reached (then throws).\n */\n async #waitForSnapKeyring(): Promise<void> {\n if (this.#hasSnapKeyring()) {\n return;\n }\n await this.#waitForSnapKeyringViaStateChange();\n }\n\n /**\n * Returns true if KeyringController already has a Snap keyring.\n * Logs and returns false on error.\n *\n * @returns True if a Snap keyring exists, false otherwise or on error.\n */\n #hasSnapKeyring(): boolean {\n try {\n const state = this.#messenger.call(\n 'KeyringController:getState',\n ) as KeyringControllerStateSlice;\n return stateHasSnapKeyring(state);\n } catch (error) {\n log(\n `${WARNING_PREFIX} KeyringController error while waiting for Snap keyring:`,\n error,\n );\n return false;\n }\n }\n\n /**\n * Subscribes to KeyringController:stateChange and resolves when a Snap keyring\n * appears in state, or rejects with an error after the timeout.\n */\n async #waitForSnapKeyringViaStateChange(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const timeoutRef: { id: ReturnType<typeof setTimeout> | undefined } = {\n id: undefined,\n };\n\n const listener = (\n keyrings: KeyringControllerStateSlice['keyrings'],\n ): void => {\n if (stateHasSnapKeyring({ keyrings })) {\n clearTimeout(timeoutRef.id);\n this.#messenger.unsubscribe(\n 'KeyringController:stateChange',\n listener,\n );\n resolve();\n }\n };\n\n timeoutRef.id = setTimeout(() => {\n this.#messenger.unsubscribe('KeyringController:stateChange', listener);\n reject(new Error(SNAP_KEYRING_TIMEOUT_MESSAGE));\n }, this.#snapKeyringWaitTimeoutMs);\n\n this.#messenger.subscribe(\n 'KeyringController:stateChange',\n listener,\n (state) => state.keyrings,\n );\n });\n }\n\n #watch(): void {\n const logReadyOnce = once(() => log('Snap platform is ready!'));\n\n const initialState = this.#messenger.call('SnapController:getState');\n if (initialState.isReady) {\n this.#isReady = true;\n this.#isReadyOnce.resolve();\n }\n\n this.#messenger.subscribe(\n 'SnapController:stateChange',\n (isReady: boolean) => {\n this.#isReady = isReady;\n\n if (isReady) {\n logReadyOnce();\n this.#isReadyOnce.resolve();\n }\n },\n (state) => state.isReady,\n );\n }\n}\n"]}
|