@metamask/snaps-controllers 18.0.4 → 19.0.1
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 +108 -1
- package/dist/cronjob/CronjobController-method-action-types.cjs +7 -0
- package/dist/cronjob/CronjobController-method-action-types.cjs.map +1 -0
- package/dist/cronjob/CronjobController-method-action-types.d.cts +51 -0
- package/dist/cronjob/CronjobController-method-action-types.d.cts.map +1 -0
- package/dist/cronjob/CronjobController-method-action-types.d.mts +51 -0
- package/dist/cronjob/CronjobController-method-action-types.d.mts.map +1 -0
- package/dist/cronjob/CronjobController-method-action-types.mjs +6 -0
- package/dist/cronjob/CronjobController-method-action-types.mjs.map +1 -0
- package/dist/cronjob/CronjobController.cjs +7 -4
- package/dist/cronjob/CronjobController.cjs.map +1 -1
- package/dist/cronjob/CronjobController.d.cts +8 -25
- package/dist/cronjob/CronjobController.d.cts.map +1 -1
- package/dist/cronjob/CronjobController.d.mts +8 -25
- package/dist/cronjob/CronjobController.d.mts.map +1 -1
- package/dist/cronjob/CronjobController.mjs +7 -4
- package/dist/cronjob/CronjobController.mjs.map +1 -1
- package/dist/cronjob/index.cjs +3 -15
- package/dist/cronjob/index.cjs.map +1 -1
- package/dist/cronjob/index.d.cts +3 -1
- package/dist/cronjob/index.d.cts.map +1 -1
- package/dist/cronjob/index.d.mts +3 -1
- package/dist/cronjob/index.d.mts.map +1 -1
- package/dist/cronjob/index.mjs +1 -1
- package/dist/cronjob/index.mjs.map +1 -1
- package/dist/insights/SnapInsightsController.cjs +1 -3
- package/dist/insights/SnapInsightsController.cjs.map +1 -1
- package/dist/insights/SnapInsightsController.d.cts +9 -9
- package/dist/insights/SnapInsightsController.d.cts.map +1 -1
- package/dist/insights/SnapInsightsController.d.mts +9 -9
- package/dist/insights/SnapInsightsController.d.mts.map +1 -1
- package/dist/insights/SnapInsightsController.mjs +1 -3
- package/dist/insights/SnapInsightsController.mjs.map +1 -1
- package/dist/insights/index.cjs +3 -15
- package/dist/insights/index.cjs.map +1 -1
- package/dist/insights/index.d.cts +2 -1
- package/dist/insights/index.d.cts.map +1 -1
- package/dist/insights/index.d.mts +2 -1
- package/dist/insights/index.d.mts.map +1 -1
- package/dist/insights/index.mjs +1 -1
- package/dist/insights/index.mjs.map +1 -1
- package/dist/interface/SnapInterfaceController-method-action-types.cjs +7 -0
- package/dist/interface/SnapInterfaceController-method-action-types.cjs.map +1 -0
- package/dist/interface/SnapInterfaceController-method-action-types.d.cts +99 -0
- package/dist/interface/SnapInterfaceController-method-action-types.d.cts.map +1 -0
- package/dist/interface/SnapInterfaceController-method-action-types.d.mts +99 -0
- package/dist/interface/SnapInterfaceController-method-action-types.d.mts.map +1 -0
- package/dist/interface/SnapInterfaceController-method-action-types.mjs +6 -0
- package/dist/interface/SnapInterfaceController-method-action-types.mjs.map +1 -0
- package/dist/interface/SnapInterfaceController.cjs +12 -16
- package/dist/interface/SnapInterfaceController.cjs.map +1 -1
- package/dist/interface/SnapInterfaceController.d.cts +10 -40
- package/dist/interface/SnapInterfaceController.d.cts.map +1 -1
- package/dist/interface/SnapInterfaceController.d.mts +10 -40
- package/dist/interface/SnapInterfaceController.d.mts.map +1 -1
- package/dist/interface/SnapInterfaceController.mjs +12 -16
- package/dist/interface/SnapInterfaceController.mjs.map +1 -1
- package/dist/interface/index.cjs +3 -15
- package/dist/interface/index.cjs.map +1 -1
- package/dist/interface/index.d.cts +3 -1
- package/dist/interface/index.d.cts.map +1 -1
- package/dist/interface/index.d.mts +3 -1
- package/dist/interface/index.d.mts.map +1 -1
- package/dist/interface/index.mjs +1 -1
- package/dist/interface/index.mjs.map +1 -1
- package/dist/multichain/MultichainRoutingService-method-action-types.cjs +7 -0
- package/dist/multichain/MultichainRoutingService-method-action-types.cjs.map +1 -0
- package/dist/multichain/MultichainRoutingService-method-action-types.d.cts +61 -0
- package/dist/multichain/MultichainRoutingService-method-action-types.d.cts.map +1 -0
- package/dist/multichain/MultichainRoutingService-method-action-types.d.mts +61 -0
- package/dist/multichain/MultichainRoutingService-method-action-types.d.mts.map +1 -0
- package/dist/multichain/MultichainRoutingService-method-action-types.mjs +6 -0
- package/dist/multichain/MultichainRoutingService-method-action-types.mjs.map +1 -0
- package/dist/multichain/{MultichainRouter.cjs → MultichainRoutingService.cjs} +14 -13
- package/dist/multichain/MultichainRoutingService.cjs.map +1 -0
- package/dist/multichain/{MultichainRouter.d.mts → MultichainRoutingService.d.cts} +14 -29
- package/dist/multichain/MultichainRoutingService.d.cts.map +1 -0
- package/dist/multichain/{MultichainRouter.d.cts → MultichainRoutingService.d.mts} +14 -29
- package/dist/multichain/MultichainRoutingService.d.mts.map +1 -0
- package/dist/multichain/{MultichainRouter.mjs → MultichainRoutingService.mjs} +12 -11
- package/dist/multichain/MultichainRoutingService.mjs.map +1 -0
- package/dist/multichain/index.cjs +3 -15
- package/dist/multichain/index.cjs.map +1 -1
- package/dist/multichain/index.d.cts +3 -1
- package/dist/multichain/index.d.cts.map +1 -1
- package/dist/multichain/index.d.mts +3 -1
- package/dist/multichain/index.d.mts.map +1 -1
- package/dist/multichain/index.mjs +1 -1
- package/dist/multichain/index.mjs.map +1 -1
- package/dist/services/ExecutionService-method-action-types.cjs +7 -0
- package/dist/services/ExecutionService-method-action-types.cjs.map +1 -0
- package/dist/services/ExecutionService-method-action-types.d.cts +50 -0
- package/dist/services/ExecutionService-method-action-types.d.cts.map +1 -0
- package/dist/services/ExecutionService-method-action-types.d.mts +50 -0
- package/dist/services/ExecutionService-method-action-types.d.mts.map +1 -0
- package/dist/services/ExecutionService-method-action-types.mjs +6 -0
- package/dist/services/ExecutionService-method-action-types.mjs.map +1 -0
- package/dist/services/ExecutionService.cjs +287 -0
- package/dist/services/ExecutionService.cjs.map +1 -1
- package/dist/services/ExecutionService.d.cts +100 -46
- package/dist/services/ExecutionService.d.cts.map +1 -1
- package/dist/services/ExecutionService.d.mts +100 -46
- package/dist/services/ExecutionService.d.mts.map +1 -1
- package/dist/services/ExecutionService.mjs +285 -1
- package/dist/services/ExecutionService.mjs.map +1 -1
- package/dist/services/browser.cjs +5 -2
- package/dist/services/browser.cjs.map +1 -1
- package/dist/services/browser.d.cts +4 -2
- package/dist/services/browser.d.cts.map +1 -1
- package/dist/services/browser.d.mts +4 -2
- package/dist/services/browser.d.mts.map +1 -1
- package/dist/services/browser.mjs +2 -2
- package/dist/services/browser.mjs.map +1 -1
- package/dist/services/iframe/IframeExecutionService.cjs +2 -2
- package/dist/services/iframe/IframeExecutionService.cjs.map +1 -1
- package/dist/services/iframe/IframeExecutionService.d.cts +3 -3
- package/dist/services/iframe/IframeExecutionService.d.cts.map +1 -1
- package/dist/services/iframe/IframeExecutionService.d.mts +3 -3
- package/dist/services/iframe/IframeExecutionService.d.mts.map +1 -1
- package/dist/services/iframe/IframeExecutionService.mjs +2 -2
- package/dist/services/iframe/IframeExecutionService.mjs.map +1 -1
- package/dist/services/index.cjs +5 -1
- package/dist/services/index.cjs.map +1 -1
- package/dist/services/index.d.cts +4 -2
- package/dist/services/index.d.cts.map +1 -1
- package/dist/services/index.d.mts +4 -2
- package/dist/services/index.d.mts.map +1 -1
- package/dist/services/index.mjs +2 -1
- package/dist/services/index.mjs.map +1 -1
- package/dist/services/multiplex.cjs +27 -0
- package/dist/services/multiplex.cjs.map +1 -0
- package/dist/services/multiplex.d.cts +11 -0
- package/dist/services/multiplex.d.cts.map +1 -0
- package/dist/services/multiplex.d.mts +11 -0
- package/dist/services/multiplex.d.mts.map +1 -0
- package/dist/services/multiplex.mjs +27 -0
- package/dist/services/multiplex.mjs.map +1 -0
- package/dist/services/node-js/NodeProcessExecutionService.cjs +2 -2
- package/dist/services/node-js/NodeProcessExecutionService.cjs.map +1 -1
- package/dist/services/node-js/NodeProcessExecutionService.d.cts +3 -3
- package/dist/services/node-js/NodeProcessExecutionService.d.cts.map +1 -1
- package/dist/services/node-js/NodeProcessExecutionService.d.mts +3 -3
- package/dist/services/node-js/NodeProcessExecutionService.d.mts.map +1 -1
- package/dist/services/node-js/NodeProcessExecutionService.mjs +2 -2
- package/dist/services/node-js/NodeProcessExecutionService.mjs.map +1 -1
- package/dist/services/node-js/NodeThreadExecutionService.cjs +2 -5
- package/dist/services/node-js/NodeThreadExecutionService.cjs.map +1 -1
- package/dist/services/node-js/NodeThreadExecutionService.d.cts +3 -3
- package/dist/services/node-js/NodeThreadExecutionService.d.cts.map +1 -1
- package/dist/services/node-js/NodeThreadExecutionService.d.mts +3 -3
- package/dist/services/node-js/NodeThreadExecutionService.d.mts.map +1 -1
- package/dist/services/node-js/NodeThreadExecutionService.mjs +2 -5
- package/dist/services/node-js/NodeThreadExecutionService.mjs.map +1 -1
- package/dist/services/offscreen/OffscreenExecutionService.cjs.map +1 -1
- package/dist/services/offscreen/OffscreenExecutionService.d.cts +1 -1
- package/dist/services/offscreen/OffscreenExecutionService.d.cts.map +1 -1
- package/dist/services/offscreen/OffscreenExecutionService.d.mts +1 -1
- package/dist/services/offscreen/OffscreenExecutionService.d.mts.map +1 -1
- package/dist/services/offscreen/OffscreenExecutionService.mjs.map +1 -1
- package/dist/services/proxy/ProxyExecutionService.cjs +2 -5
- package/dist/services/proxy/ProxyExecutionService.cjs.map +1 -1
- package/dist/services/proxy/ProxyExecutionService.d.cts +3 -3
- package/dist/services/proxy/ProxyExecutionService.d.cts.map +1 -1
- package/dist/services/proxy/ProxyExecutionService.d.mts +3 -3
- package/dist/services/proxy/ProxyExecutionService.d.mts.map +1 -1
- package/dist/services/proxy/ProxyExecutionService.mjs +2 -5
- package/dist/services/proxy/ProxyExecutionService.mjs.map +1 -1
- package/dist/services/webview/WebViewExecutionService.cjs +2 -2
- package/dist/services/webview/WebViewExecutionService.cjs.map +1 -1
- package/dist/services/webview/WebViewExecutionService.d.cts +3 -3
- package/dist/services/webview/WebViewExecutionService.d.cts.map +1 -1
- package/dist/services/webview/WebViewExecutionService.d.mts +3 -3
- package/dist/services/webview/WebViewExecutionService.d.mts.map +1 -1
- package/dist/services/webview/WebViewExecutionService.mjs +2 -2
- package/dist/services/webview/WebViewExecutionService.mjs.map +1 -1
- package/dist/snaps/SnapController-method-action-types.cjs +7 -0
- package/dist/snaps/SnapController-method-action-types.cjs.map +1 -0
- package/dist/snaps/SnapController-method-action-types.d.cts +284 -0
- package/dist/snaps/SnapController-method-action-types.d.cts.map +1 -0
- package/dist/snaps/SnapController-method-action-types.d.mts +284 -0
- package/dist/snaps/SnapController-method-action-types.d.mts.map +1 -0
- package/dist/snaps/SnapController-method-action-types.mjs +6 -0
- package/dist/snaps/SnapController-method-action-types.mjs.map +1 -0
- package/dist/snaps/SnapController.cjs +118 -113
- package/dist/snaps/SnapController.cjs.map +1 -1
- package/dist/snaps/SnapController.d.cts +33 -190
- package/dist/snaps/SnapController.d.cts.map +1 -1
- package/dist/snaps/SnapController.d.mts +33 -190
- package/dist/snaps/SnapController.d.mts.map +1 -1
- package/dist/snaps/SnapController.mjs +119 -114
- package/dist/snaps/SnapController.mjs.map +1 -1
- package/dist/snaps/index.cjs +3 -1
- package/dist/snaps/index.cjs.map +1 -1
- package/dist/snaps/index.d.cts +3 -1
- package/dist/snaps/index.d.cts.map +1 -1
- package/dist/snaps/index.d.mts +3 -1
- package/dist/snaps/index.d.mts.map +1 -1
- package/dist/snaps/index.mjs +1 -1
- package/dist/snaps/index.mjs.map +1 -1
- package/dist/snaps/registry/SnapRegistryController-method-action-types.cjs +7 -0
- package/dist/snaps/registry/SnapRegistryController-method-action-types.cjs.map +1 -0
- package/dist/snaps/registry/SnapRegistryController-method-action-types.d.cts +46 -0
- package/dist/snaps/registry/SnapRegistryController-method-action-types.d.cts.map +1 -0
- package/dist/snaps/registry/SnapRegistryController-method-action-types.d.mts +46 -0
- package/dist/snaps/registry/SnapRegistryController-method-action-types.d.mts.map +1 -0
- package/dist/snaps/registry/SnapRegistryController-method-action-types.mjs +6 -0
- package/dist/snaps/registry/SnapRegistryController-method-action-types.mjs.map +1 -0
- package/dist/snaps/registry/{json.cjs → SnapRegistryController.cjs} +27 -24
- package/dist/snaps/registry/SnapRegistryController.cjs.map +1 -0
- package/dist/snaps/registry/SnapRegistryController.d.cts +67 -0
- package/dist/snaps/registry/SnapRegistryController.d.cts.map +1 -0
- package/dist/snaps/registry/SnapRegistryController.d.mts +67 -0
- package/dist/snaps/registry/SnapRegistryController.d.mts.map +1 -0
- package/dist/snaps/registry/{json.mjs → SnapRegistryController.mjs} +25 -22
- package/dist/snaps/registry/SnapRegistryController.mjs.map +1 -0
- package/dist/snaps/registry/index.cjs +5 -16
- package/dist/snaps/registry/index.cjs.map +1 -1
- package/dist/snaps/registry/index.d.cts +5 -2
- package/dist/snaps/registry/index.d.cts.map +1 -1
- package/dist/snaps/registry/index.d.mts +5 -2
- package/dist/snaps/registry/index.d.mts.map +1 -1
- package/dist/snaps/registry/index.mjs +2 -2
- package/dist/snaps/registry/index.mjs.map +1 -1
- package/dist/snaps/registry/types.cjs +11 -0
- package/dist/snaps/registry/types.cjs.map +1 -0
- package/dist/snaps/registry/types.d.cts +20 -0
- package/dist/snaps/registry/types.d.cts.map +1 -0
- package/dist/snaps/registry/types.d.mts +20 -0
- package/dist/snaps/registry/types.d.mts.map +1 -0
- package/dist/snaps/registry/types.mjs +8 -0
- package/dist/snaps/registry/types.mjs.map +1 -0
- package/dist/types/controllers.cjs.map +1 -1
- package/dist/types/controllers.d.cts +1 -1
- package/dist/types/controllers.d.cts.map +1 -1
- package/dist/types/controllers.d.mts +1 -1
- package/dist/types/controllers.d.mts.map +1 -1
- package/dist/types/controllers.mjs.map +1 -1
- package/dist/websocket/WebSocketService-method-action-types.cjs +7 -0
- package/dist/websocket/WebSocketService-method-action-types.cjs.map +1 -0
- package/dist/websocket/WebSocketService-method-action-types.d.cts +54 -0
- package/dist/websocket/WebSocketService-method-action-types.d.cts.map +1 -0
- package/dist/websocket/WebSocketService-method-action-types.d.mts +54 -0
- package/dist/websocket/WebSocketService-method-action-types.d.mts.map +1 -0
- package/dist/websocket/WebSocketService-method-action-types.mjs +6 -0
- package/dist/websocket/WebSocketService-method-action-types.mjs.map +1 -0
- package/dist/websocket/WebSocketService.cjs +14 -11
- package/dist/websocket/WebSocketService.cjs.map +1 -1
- package/dist/websocket/WebSocketService.d.cts +43 -22
- package/dist/websocket/WebSocketService.d.cts.map +1 -1
- package/dist/websocket/WebSocketService.d.mts +43 -22
- package/dist/websocket/WebSocketService.d.mts.map +1 -1
- package/dist/websocket/WebSocketService.mjs +14 -11
- package/dist/websocket/WebSocketService.mjs.map +1 -1
- package/dist/websocket/index.cjs +3 -15
- package/dist/websocket/index.cjs.map +1 -1
- package/dist/websocket/index.d.cts +3 -1
- package/dist/websocket/index.d.cts.map +1 -1
- package/dist/websocket/index.d.mts +3 -1
- package/dist/websocket/index.d.mts.map +1 -1
- package/dist/websocket/index.mjs +1 -1
- package/dist/websocket/index.mjs.map +1 -1
- package/package.json +12 -11
- package/dist/multichain/MultichainRouter.cjs.map +0 -1
- package/dist/multichain/MultichainRouter.d.cts.map +0 -1
- package/dist/multichain/MultichainRouter.d.mts.map +0 -1
- package/dist/multichain/MultichainRouter.mjs.map +0 -1
- package/dist/services/AbstractExecutionService.cjs +0 -314
- package/dist/services/AbstractExecutionService.cjs.map +0 -1
- package/dist/services/AbstractExecutionService.d.cts +0 -107
- package/dist/services/AbstractExecutionService.d.cts.map +0 -1
- package/dist/services/AbstractExecutionService.d.mts +0 -107
- package/dist/services/AbstractExecutionService.d.mts.map +0 -1
- package/dist/services/AbstractExecutionService.mjs +0 -313
- package/dist/services/AbstractExecutionService.mjs.map +0 -1
- package/dist/snaps/registry/json.cjs.map +0 -1
- package/dist/snaps/registry/json.d.cts +0 -58
- package/dist/snaps/registry/json.d.cts.map +0 -1
- package/dist/snaps/registry/json.d.mts +0 -58
- package/dist/snaps/registry/json.d.mts.map +0 -1
- package/dist/snaps/registry/json.mjs.map +0 -1
- package/dist/snaps/registry/registry.cjs +0 -11
- package/dist/snaps/registry/registry.cjs.map +0 -1
- package/dist/snaps/registry/registry.d.cts +0 -41
- package/dist/snaps/registry/registry.d.cts.map +0 -1
- package/dist/snaps/registry/registry.d.mts +0 -41
- package/dist/snaps/registry/registry.d.mts.map +0 -1
- package/dist/snaps/registry/registry.mjs +0 -8
- package/dist/snaps/registry/registry.mjs.map +0 -1
|
@@ -22,7 +22,35 @@ const fsm_2 = require("../fsm.cjs");
|
|
|
22
22
|
const logging_1 = require("../logging.cjs");
|
|
23
23
|
const utils_2 = require("../utils.cjs");
|
|
24
24
|
exports.controllerName = 'SnapController';
|
|
25
|
-
//
|
|
25
|
+
// This is used by the `generate-method-action-types` script.
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
27
|
+
const MESSENGER_EXPOSED_METHODS = [
|
|
28
|
+
'init',
|
|
29
|
+
'updateRegistry',
|
|
30
|
+
'enableSnap',
|
|
31
|
+
'disableSnap',
|
|
32
|
+
'stopSnap',
|
|
33
|
+
'stopAllSnaps',
|
|
34
|
+
'isSnapRunning',
|
|
35
|
+
'hasSnap',
|
|
36
|
+
'getSnap',
|
|
37
|
+
'updateSnapState',
|
|
38
|
+
'clearSnapState',
|
|
39
|
+
'getSnapState',
|
|
40
|
+
'getSnapFile',
|
|
41
|
+
'isMinimumPlatformVersion',
|
|
42
|
+
'clearState',
|
|
43
|
+
'removeSnap',
|
|
44
|
+
'removeSnaps',
|
|
45
|
+
'disconnectOrigin',
|
|
46
|
+
'revokeDynamicSnapPermissions',
|
|
47
|
+
'getAllSnaps',
|
|
48
|
+
'getRunnableSnaps',
|
|
49
|
+
'getPermittedSnaps',
|
|
50
|
+
'installSnaps',
|
|
51
|
+
'handleRequest',
|
|
52
|
+
'setClientActive',
|
|
53
|
+
];
|
|
26
54
|
exports.SNAP_APPROVAL_INSTALL = 'wallet_installSnap';
|
|
27
55
|
exports.SNAP_APPROVAL_UPDATE = 'wallet_updateSnap';
|
|
28
56
|
exports.SNAP_APPROVAL_RESULT = 'wallet_installSnapResult';
|
|
@@ -188,7 +216,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
188
216
|
});
|
|
189
217
|
});
|
|
190
218
|
this.messenger.subscribe('KeyringController:lock', this.#handleLock.bind(this));
|
|
191
|
-
this.messenger.subscribe('
|
|
219
|
+
this.messenger.subscribe('SnapRegistryController:stateChange', () => {
|
|
192
220
|
this.#handleRegistryUpdate().catch((error) => {
|
|
193
221
|
(0, snaps_utils_1.logError)(`Error when processing Snaps registry update: ${(0, snaps_sdk_1.getErrorMessage)(error)}`);
|
|
194
222
|
});
|
|
@@ -197,7 +225,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
197
225
|
this.#registerMessageHandlers();
|
|
198
226
|
Object.values(this.state?.snaps ?? {}).forEach((snap) => this.#setupRuntime(snap.id));
|
|
199
227
|
this.#trackSnapExport = (0, utils_2.throttleTracking)((snapId, handler, success, origin) => {
|
|
200
|
-
const snapMetadata = this.messenger.call('
|
|
228
|
+
const snapMetadata = this.messenger.call('SnapRegistryController:getMetadata', snapId);
|
|
201
229
|
this.#trackEvent({
|
|
202
230
|
event: 'Snap Export Used',
|
|
203
231
|
category: 'Snaps',
|
|
@@ -224,7 +252,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
224
252
|
// In the future, side-effects could be added to the machine during transitions.
|
|
225
253
|
#initializeStateMachine() {
|
|
226
254
|
const disableGuard = ({ snapId }) => {
|
|
227
|
-
return this.
|
|
255
|
+
return this.getSnapExpect(snapId).enabled;
|
|
228
256
|
};
|
|
229
257
|
const statusConfig = {
|
|
230
258
|
initial: snaps_utils_1.SnapStatus.Installing,
|
|
@@ -282,24 +310,22 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
282
310
|
#registerMessageHandlers() {
|
|
283
311
|
this.messenger.registerActionHandler(`${exports.controllerName}:init`, async (...args) => this.init(...args));
|
|
284
312
|
this.messenger.registerActionHandler(`${exports.controllerName}:clearSnapState`, (...args) => this.clearSnapState(...args));
|
|
285
|
-
this.messenger.registerActionHandler(`${exports.controllerName}:
|
|
313
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:getSnap`, (...args) => this.getSnap(...args));
|
|
286
314
|
this.messenger.registerActionHandler(`${exports.controllerName}:getSnapState`, async (...args) => this.getSnapState(...args));
|
|
287
315
|
this.messenger.registerActionHandler(`${exports.controllerName}:handleRequest`, async (...args) => this.handleRequest(...args));
|
|
288
|
-
this.messenger.registerActionHandler(`${exports.controllerName}:
|
|
316
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:hasSnap`, (...args) => this.hasSnap(...args));
|
|
289
317
|
this.messenger.registerActionHandler(`${exports.controllerName}:updateRegistry`, async () => this.updateRegistry());
|
|
290
318
|
this.messenger.registerActionHandler(`${exports.controllerName}:updateSnapState`, async (...args) => this.updateSnapState(...args));
|
|
291
|
-
this.messenger.registerActionHandler(`${exports.controllerName}:
|
|
292
|
-
this.messenger.registerActionHandler(`${exports.controllerName}:
|
|
293
|
-
this.messenger.registerActionHandler(`${exports.controllerName}:
|
|
294
|
-
this.messenger.registerActionHandler(`${exports.controllerName}:
|
|
295
|
-
this.messenger.registerActionHandler(`${exports.controllerName}:
|
|
296
|
-
this.messenger.registerActionHandler(`${exports.controllerName}:
|
|
319
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:enableSnap`, (...args) => this.enableSnap(...args));
|
|
320
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:disableSnap`, async (...args) => this.disableSnap(...args));
|
|
321
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:removeSnap`, async (...args) => this.removeSnap(...args));
|
|
322
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:getPermittedSnaps`, (...args) => this.getPermittedSnaps(...args));
|
|
323
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:installSnaps`, async (...args) => this.installSnaps(...args));
|
|
324
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:getAllSnaps`, (...args) => this.getAllSnaps(...args));
|
|
297
325
|
this.messenger.registerActionHandler(`${exports.controllerName}:getRunnableSnaps`, (...args) => this.getRunnableSnaps(...args));
|
|
298
|
-
this.messenger.registerActionHandler(`${exports.controllerName}:
|
|
299
|
-
this.messenger.registerActionHandler(`${exports.controllerName}:
|
|
300
|
-
this.messenger.registerActionHandler(`${exports.controllerName}:
|
|
301
|
-
this.messenger.registerActionHandler(`${exports.controllerName}:revokeDynamicPermissions`, (...args) => this.revokeDynamicSnapPermissions(...args));
|
|
302
|
-
this.messenger.registerActionHandler(`${exports.controllerName}:getFile`, async (...args) => this.getSnapFile(...args));
|
|
326
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:disconnectOrigin`, (...args) => this.disconnectOrigin(...args));
|
|
327
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:revokeDynamicSnapPermissions`, (...args) => this.revokeDynamicSnapPermissions(...args));
|
|
328
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:getSnapFile`, async (...args) => this.getSnapFile(...args));
|
|
303
329
|
this.messenger.registerActionHandler(`${exports.controllerName}:stopAllSnaps`, async (...args) => this.stopAllSnaps(...args));
|
|
304
330
|
this.messenger.registerActionHandler(`${exports.controllerName}:isMinimumPlatformVersion`, (...args) => this.isMinimumPlatformVersion(...args));
|
|
305
331
|
this.messenger.registerActionHandler(`${exports.controllerName}:setClientActive`, (...args) => this.setClientActive(...args));
|
|
@@ -334,8 +360,8 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
334
360
|
}
|
|
335
361
|
async #handlePreinstalledSnaps(preinstalledSnaps) {
|
|
336
362
|
for (const { snapId, manifest, files, removable, hidden, hideSnapBranding, } of preinstalledSnaps) {
|
|
337
|
-
const existingSnap = this.
|
|
338
|
-
const isAlreadyInstalled = existingSnap !==
|
|
363
|
+
const existingSnap = this.getSnap(snapId);
|
|
364
|
+
const isAlreadyInstalled = existingSnap !== null;
|
|
339
365
|
const isUpdate = isAlreadyInstalled && (0, utils_1.gtVersion)(manifest.version, existingSnap.version);
|
|
340
366
|
const isPreinstalled = existingSnap?.preinstalled === true;
|
|
341
367
|
const isMissingSource = isAlreadyInstalled &&
|
|
@@ -398,10 +424,10 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
398
424
|
this.#setupRuntime(snapId);
|
|
399
425
|
// Emit events
|
|
400
426
|
if (isUpdate) {
|
|
401
|
-
this.messenger.publish('SnapController:snapUpdated', this
|
|
427
|
+
this.messenger.publish('SnapController:snapUpdated', this.#getTruncatedSnapExpect(snapId), existingSnap.version, constants_1.METAMASK_ORIGIN, true);
|
|
402
428
|
}
|
|
403
429
|
else if (!isMissingSource) {
|
|
404
|
-
this.messenger.publish('SnapController:snapInstalled', this
|
|
430
|
+
this.messenger.publish('SnapController:snapInstalled', this.#getTruncatedSnapExpect(snapId), constants_1.METAMASK_ORIGIN, true);
|
|
405
431
|
}
|
|
406
432
|
if (isMissingSource) {
|
|
407
433
|
(0, snaps_utils_1.logWarning)(`The source code for "${snapId}" was missing and has been automatically restored. If you see this message, please file a bug report.`);
|
|
@@ -457,7 +483,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
457
483
|
*/
|
|
458
484
|
async updateRegistry() {
|
|
459
485
|
await this.#ensureCanUsePlatform();
|
|
460
|
-
await this.messenger.call('
|
|
486
|
+
await this.messenger.call('SnapRegistryController:requestUpdate');
|
|
461
487
|
}
|
|
462
488
|
/**
|
|
463
489
|
* Checks all installed Snaps against the blocklist and
|
|
@@ -467,7 +493,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
467
493
|
* Also updates any preinstalled Snaps to the latest allowlisted version.
|
|
468
494
|
*/
|
|
469
495
|
async #handleRegistryUpdate() {
|
|
470
|
-
const blockedSnaps = await this.messenger.call('
|
|
496
|
+
const blockedSnaps = await this.messenger.call('SnapRegistryController:get', Object.values(this.state.snaps).reduce((blockListArg, snap) => {
|
|
471
497
|
blockListArg[snap.id] = {
|
|
472
498
|
version: snap.version,
|
|
473
499
|
checksum: snap.manifest.source.shasum,
|
|
@@ -475,7 +501,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
475
501
|
return blockListArg;
|
|
476
502
|
}, {}));
|
|
477
503
|
await Promise.all(Object.entries(blockedSnaps).map(async ([snapId, { status, reason }]) => {
|
|
478
|
-
if (status === registry_1.
|
|
504
|
+
if (status === registry_1.SnapRegistryStatus.Blocked) {
|
|
479
505
|
return this.#blockSnap(snapId, reason);
|
|
480
506
|
}
|
|
481
507
|
return this.#unblockSnap(snapId);
|
|
@@ -508,13 +534,13 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
508
534
|
}
|
|
509
535
|
/**
|
|
510
536
|
* Blocks an installed snap and prevents it from being started again. Emits
|
|
511
|
-
* {@link
|
|
537
|
+
* {@link SnapControllerSnapBlockedEvent}. Does nothing if the snap is not installed.
|
|
512
538
|
*
|
|
513
539
|
* @param snapId - The snap to block.
|
|
514
540
|
* @param blockedSnapInfo - Information detailing why the snap is blocked.
|
|
515
541
|
*/
|
|
516
542
|
async #blockSnap(snapId, blockedSnapInfo) {
|
|
517
|
-
if (!this.
|
|
543
|
+
if (!this.hasSnap(snapId)) {
|
|
518
544
|
return;
|
|
519
545
|
}
|
|
520
546
|
try {
|
|
@@ -531,13 +557,13 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
531
557
|
}
|
|
532
558
|
/**
|
|
533
559
|
* Unblocks a snap so that it can be enabled and started again. Emits
|
|
534
|
-
* {@link
|
|
560
|
+
* {@link SnapControllerSnapUnblockedEvent}. Does nothing if the snap is not installed or already
|
|
535
561
|
* unblocked.
|
|
536
562
|
*
|
|
537
563
|
* @param snapId - The id of the snap to unblock.
|
|
538
564
|
*/
|
|
539
565
|
#unblockSnap(snapId) {
|
|
540
|
-
if (!this.
|
|
566
|
+
if (!this.hasSnap(snapId) || !this.state.snaps[snapId].blocked) {
|
|
541
567
|
return;
|
|
542
568
|
}
|
|
543
569
|
this.update((state) => {
|
|
@@ -547,18 +573,18 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
547
573
|
this.messenger.publish(`${exports.controllerName}:snapUnblocked`, snapId);
|
|
548
574
|
}
|
|
549
575
|
async #assertIsInstallAllowed(snapId, { platformVersion, ...snapInfo }) {
|
|
550
|
-
const results = await this.messenger.call('
|
|
576
|
+
const results = await this.messenger.call('SnapRegistryController:get', {
|
|
551
577
|
[snapId]: snapInfo,
|
|
552
578
|
});
|
|
553
579
|
const result = results[snapId];
|
|
554
|
-
if (result.status === registry_1.
|
|
580
|
+
if (result.status === registry_1.SnapRegistryStatus.Blocked) {
|
|
555
581
|
throw new Error(`Cannot install version "${snapInfo.version}" of snap "${snapId}": The version is blocked. ${result.reason?.explanation ?? ''}`);
|
|
556
582
|
}
|
|
557
583
|
const isAllowlistingRequired = Object.keys(snapInfo.permissions).some((permission) => !constants_1.ALLOWED_PERMISSIONS.includes(permission));
|
|
558
584
|
if (this.#featureFlags.requireAllowlist &&
|
|
559
585
|
isAllowlistingRequired &&
|
|
560
|
-
result.status !== registry_1.
|
|
561
|
-
throw new Error(`Cannot install version "${snapInfo.version}" of snap "${snapId}": ${result.status === registry_1.
|
|
586
|
+
result.status !== registry_1.SnapRegistryStatus.Verified) {
|
|
587
|
+
throw new Error(`Cannot install version "${snapInfo.version}" of snap "${snapId}": ${result.status === registry_1.SnapRegistryStatus.Unavailable
|
|
562
588
|
? 'The registry is temporarily unavailable.'
|
|
563
589
|
: 'The snap is not on the allowlist.'}`);
|
|
564
590
|
}
|
|
@@ -592,8 +618,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
592
618
|
async #stopSnapsLastRequestPastMax() {
|
|
593
619
|
const entries = [...this.#snapsRuntimeData.entries()];
|
|
594
620
|
return Promise.all(entries
|
|
595
|
-
.filter(([_snapId, runtime]) => runtime.
|
|
596
|
-
runtime.pendingInboundRequests.length === 0 &&
|
|
621
|
+
.filter(([_snapId, runtime]) => runtime.pendingInboundRequests.length === 0 &&
|
|
597
622
|
runtime.lastRequest &&
|
|
598
623
|
this.#maxIdleTime &&
|
|
599
624
|
(0, utils_1.timeSince)(runtime.lastRequest) > this.#maxIdleTime)
|
|
@@ -670,14 +695,14 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
670
695
|
* @param snapId - The id of the Snap to enable.
|
|
671
696
|
*/
|
|
672
697
|
enableSnap(snapId) {
|
|
673
|
-
this.
|
|
698
|
+
this.getSnapExpect(snapId);
|
|
674
699
|
if (this.state.snaps[snapId].blocked) {
|
|
675
700
|
throw new Error(`Snap "${snapId}" is blocked and cannot be enabled.`);
|
|
676
701
|
}
|
|
677
702
|
this.update((state) => {
|
|
678
703
|
state.snaps[snapId].enabled = true;
|
|
679
704
|
});
|
|
680
|
-
this.messenger.publish('SnapController:snapEnabled', this
|
|
705
|
+
this.messenger.publish('SnapController:snapEnabled', this.#getTruncatedSnapExpect(snapId));
|
|
681
706
|
}
|
|
682
707
|
/**
|
|
683
708
|
* Disables the given snap. A snap can only be started if it is enabled.
|
|
@@ -686,16 +711,16 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
686
711
|
* @returns A promise that resolves once the snap has been disabled.
|
|
687
712
|
*/
|
|
688
713
|
async disableSnap(snapId) {
|
|
689
|
-
if (!this.
|
|
714
|
+
if (!this.hasSnap(snapId)) {
|
|
690
715
|
throw new Error(`Snap "${snapId}" not found.`);
|
|
691
716
|
}
|
|
692
717
|
this.update((state) => {
|
|
693
718
|
state.snaps[snapId].enabled = false;
|
|
694
719
|
});
|
|
695
|
-
if (this.
|
|
720
|
+
if (this.isSnapRunning(snapId)) {
|
|
696
721
|
await this.stopSnap(snapId, snaps_utils_1.SnapStatusEvents.Stop);
|
|
697
722
|
}
|
|
698
|
-
this.messenger.publish('SnapController:snapDisabled', this
|
|
723
|
+
this.messenger.publish('SnapController:snapDisabled', this.#getTruncatedSnapExpect(snapId));
|
|
699
724
|
}
|
|
700
725
|
/**
|
|
701
726
|
* Stops the given snap, removes all hooks, closes all connections, and
|
|
@@ -720,7 +745,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
720
745
|
const { promise, resolve } = (0, utils_1.createDeferredPromise)();
|
|
721
746
|
runtime.stopPromise = promise;
|
|
722
747
|
try {
|
|
723
|
-
if (this.
|
|
748
|
+
if (this.isSnapRunning(snapId)) {
|
|
724
749
|
await this.#terminateSnap(snapId);
|
|
725
750
|
}
|
|
726
751
|
}
|
|
@@ -730,7 +755,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
730
755
|
runtime.pendingInboundRequests = [];
|
|
731
756
|
runtime.pendingOutboundRequests = 0;
|
|
732
757
|
runtime.stopPromise = null;
|
|
733
|
-
if (this.
|
|
758
|
+
if (this.isSnapRunning(snapId)) {
|
|
734
759
|
this.#transition(snapId, statusEvent);
|
|
735
760
|
}
|
|
736
761
|
resolve();
|
|
@@ -744,7 +769,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
744
769
|
* stopped.
|
|
745
770
|
*/
|
|
746
771
|
async stopAllSnaps(statusEvent = snaps_utils_1.SnapStatusEvents.Stop) {
|
|
747
|
-
const snaps = Object.values(this.state.snaps).filter((snap) => this.
|
|
772
|
+
const snaps = Object.values(this.state.snaps).filter((snap) => this.isSnapRunning(snap.id));
|
|
748
773
|
const promises = snaps.map(async (snap) => this.stopSnap(snap.id, statusEvent));
|
|
749
774
|
await Promise.allSettled(promises);
|
|
750
775
|
}
|
|
@@ -764,7 +789,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
764
789
|
.forEach((pendingRequest) => pendingRequest.timer.finish());
|
|
765
790
|
// Hack to give up execution for a bit to let timed out requests return.
|
|
766
791
|
await new Promise((resolve) => setTimeout(resolve, 1));
|
|
767
|
-
this.messenger.publish('SnapController:snapTerminated', this
|
|
792
|
+
this.messenger.publish('SnapController:snapTerminated', this.#getTruncatedSnapExpect(snapId));
|
|
768
793
|
}
|
|
769
794
|
/**
|
|
770
795
|
* Returns whether the given snap is running.
|
|
@@ -773,8 +798,8 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
773
798
|
* @param snapId - The id of the Snap to check.
|
|
774
799
|
* @returns `true` if the snap is running, otherwise `false`.
|
|
775
800
|
*/
|
|
776
|
-
|
|
777
|
-
return this.
|
|
801
|
+
isSnapRunning(snapId) {
|
|
802
|
+
return this.getSnapExpect(snapId).status === 'running';
|
|
778
803
|
}
|
|
779
804
|
/**
|
|
780
805
|
* Returns whether the given snap has been added to state.
|
|
@@ -782,8 +807,8 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
782
807
|
* @param snapId - The id of the Snap to check for.
|
|
783
808
|
* @returns `true` if the snap exists in the controller state, otherwise `false`.
|
|
784
809
|
*/
|
|
785
|
-
|
|
786
|
-
return Boolean(this.
|
|
810
|
+
hasSnap(snapId) {
|
|
811
|
+
return Boolean(this.getSnap(snapId));
|
|
787
812
|
}
|
|
788
813
|
/**
|
|
789
814
|
* Gets the snap with the given id if it exists, including all data.
|
|
@@ -793,22 +818,22 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
793
818
|
* @param snapId - The id of the Snap to get.
|
|
794
819
|
* @returns The entire snap object from the controller state.
|
|
795
820
|
*/
|
|
796
|
-
|
|
797
|
-
return this.state.snaps[snapId];
|
|
821
|
+
getSnap(snapId) {
|
|
822
|
+
return this.state.snaps[snapId] ?? null;
|
|
798
823
|
}
|
|
799
824
|
/**
|
|
800
825
|
* Gets the snap with the given id, throws if doesn't.
|
|
801
826
|
* This should not be used if the snap is to be serializable, as e.g.
|
|
802
827
|
* the snap sourceCode may be quite large.
|
|
803
828
|
*
|
|
804
|
-
* @see {@link SnapController.
|
|
829
|
+
* @see {@link SnapController.getSnap}
|
|
805
830
|
* @throws {@link Error}. If the snap doesn't exist
|
|
806
831
|
* @param snapId - The id of the snap to get.
|
|
807
832
|
* @returns The entire snap object.
|
|
808
833
|
*/
|
|
809
|
-
|
|
810
|
-
const snap = this.
|
|
811
|
-
(0, utils_1.assert)(snap !==
|
|
834
|
+
getSnapExpect(snapId) {
|
|
835
|
+
const snap = this.getSnap(snapId);
|
|
836
|
+
(0, utils_1.assert)(snap !== null, `Snap "${snapId}" not found.`);
|
|
812
837
|
return snap;
|
|
813
838
|
}
|
|
814
839
|
/**
|
|
@@ -818,9 +843,8 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
818
843
|
* @param snapId - The id of the Snap to get.
|
|
819
844
|
* @returns A truncated version of the snap state, that is less expensive to serialize.
|
|
820
845
|
*/
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
const snap = this.get(snapId);
|
|
846
|
+
#getTruncatedSnap(snapId) {
|
|
847
|
+
const snap = this.getSnap(snapId);
|
|
824
848
|
return snap ? truncateSnap(snap) : null;
|
|
825
849
|
}
|
|
826
850
|
/**
|
|
@@ -830,8 +854,8 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
830
854
|
* @param snapId - The id of the snap to get.
|
|
831
855
|
* @returns A truncated version of the snap state, that is less expensive to serialize.
|
|
832
856
|
*/
|
|
833
|
-
|
|
834
|
-
return truncateSnap(this.
|
|
857
|
+
#getTruncatedSnapExpect(snapId) {
|
|
858
|
+
return truncateSnap(this.getSnapExpect(snapId));
|
|
835
859
|
}
|
|
836
860
|
/**
|
|
837
861
|
* Check if a given Snap has a cached encryption key stored in the runtime.
|
|
@@ -1062,7 +1086,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1062
1086
|
* @returns The file requested in the chosen file encoding or null if the file is not found.
|
|
1063
1087
|
*/
|
|
1064
1088
|
async getSnapFile(snapId, path, encoding = snaps_sdk_1.AuxiliaryFileEncoding.Base64) {
|
|
1065
|
-
const snap = this.
|
|
1089
|
+
const snap = this.getSnapExpect(snapId);
|
|
1066
1090
|
const normalizedPath = (0, snaps_utils_1.normalizeRelative)(path);
|
|
1067
1091
|
const value = snap.auxiliaryFiles?.find((file) => file.path === normalizedPath)?.value;
|
|
1068
1092
|
if (!value) {
|
|
@@ -1081,7 +1105,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1081
1105
|
* @returns True if the platform version is equal or greater to the passed version, false otherwise.
|
|
1082
1106
|
*/
|
|
1083
1107
|
isMinimumPlatformVersion(snapId, version) {
|
|
1084
|
-
const snap = this.
|
|
1108
|
+
const snap = this.getSnapExpect(snapId);
|
|
1085
1109
|
const { platformVersion } = snap.manifest;
|
|
1086
1110
|
if (!platformVersion) {
|
|
1087
1111
|
return false;
|
|
@@ -1131,12 +1155,12 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1131
1155
|
throw new Error('Expected array of snap ids.');
|
|
1132
1156
|
}
|
|
1133
1157
|
snapIds.forEach((snapId) => {
|
|
1134
|
-
const snap = this.
|
|
1158
|
+
const snap = this.getSnapExpect(snapId);
|
|
1135
1159
|
(0, utils_1.assert)(snap.removable !== false, `${snapId} is not removable.`);
|
|
1136
1160
|
});
|
|
1137
1161
|
await Promise.all(snapIds.map(async (snapId) => {
|
|
1138
|
-
const snap = this.
|
|
1139
|
-
const truncated = this
|
|
1162
|
+
const snap = this.getSnapExpect(snapId);
|
|
1163
|
+
const truncated = this.#getTruncatedSnapExpect(snapId);
|
|
1140
1164
|
// Disable the snap and revoke all of its permissions before deleting
|
|
1141
1165
|
// it. This ensures that the snap will not be restarted or otherwise
|
|
1142
1166
|
// affect the host environment while we are deleting it.
|
|
@@ -1160,7 +1184,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1160
1184
|
if (previousInitialConnections) {
|
|
1161
1185
|
const revokedInitialConnections = (0, utils_2.setDiff)(previousInitialConnections, initialConnections);
|
|
1162
1186
|
for (const origin of Object.keys(revokedInitialConnections)) {
|
|
1163
|
-
this.
|
|
1187
|
+
this.disconnectOrigin(origin, snapId);
|
|
1164
1188
|
}
|
|
1165
1189
|
}
|
|
1166
1190
|
for (const origin of Object.keys(initialConnections)) {
|
|
@@ -1198,12 +1222,13 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1198
1222
|
});
|
|
1199
1223
|
}
|
|
1200
1224
|
/**
|
|
1201
|
-
*
|
|
1225
|
+
* Disconnect the Snap from the given origin, meaning the origin can no longer
|
|
1226
|
+
* interact with the Snap until it is reconnected.
|
|
1202
1227
|
*
|
|
1203
|
-
* @param origin - The origin from which to remove the
|
|
1228
|
+
* @param origin - The origin from which to remove the Snap.
|
|
1204
1229
|
* @param snapId - The id of the snap to remove.
|
|
1205
1230
|
*/
|
|
1206
|
-
|
|
1231
|
+
disconnectOrigin(origin, snapId) {
|
|
1207
1232
|
const subjectPermissions = this.messenger.call('PermissionController:getPermissions', origin);
|
|
1208
1233
|
const snapIdsCaveat = subjectPermissions?.[snaps_rpc_methods_1.WALLET_SNAP_PERMISSION_KEY]?.caveats?.find((caveat) => caveat.type === snaps_utils_1.SnapCaveatType.SnapIds);
|
|
1209
1234
|
if (!snapIdsCaveat) {
|
|
@@ -1246,7 +1271,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1246
1271
|
#removeSnapFromSubjects(snapId) {
|
|
1247
1272
|
const subjects = this.messenger.call('PermissionController:getSubjectNames');
|
|
1248
1273
|
for (const subject of subjects) {
|
|
1249
|
-
this.
|
|
1274
|
+
this.disconnectOrigin(subject, snapId);
|
|
1250
1275
|
}
|
|
1251
1276
|
}
|
|
1252
1277
|
/**
|
|
@@ -1259,25 +1284,6 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1259
1284
|
this.messenger.call('PermissionController:revokeAllPermissions', snapId);
|
|
1260
1285
|
}
|
|
1261
1286
|
}
|
|
1262
|
-
/**
|
|
1263
|
-
* Handles incrementing the activeReferences counter.
|
|
1264
|
-
*
|
|
1265
|
-
* @param snapId - The snap id of the snap that was referenced.
|
|
1266
|
-
*/
|
|
1267
|
-
incrementActiveReferences(snapId) {
|
|
1268
|
-
const runtime = this.#getRuntimeExpect(snapId);
|
|
1269
|
-
runtime.activeReferences += 1;
|
|
1270
|
-
}
|
|
1271
|
-
/**
|
|
1272
|
-
* Handles decrement the activeReferences counter.
|
|
1273
|
-
*
|
|
1274
|
-
* @param snapId - The snap id of the snap that was referenced..
|
|
1275
|
-
*/
|
|
1276
|
-
decrementActiveReferences(snapId) {
|
|
1277
|
-
const runtime = this.#getRuntimeExpect(snapId);
|
|
1278
|
-
(0, utils_1.assert)(runtime.activeReferences > 0, 'SnapController reference management is in an invalid state.');
|
|
1279
|
-
runtime.activeReferences -= 1;
|
|
1280
|
-
}
|
|
1281
1287
|
/**
|
|
1282
1288
|
* Gets all snaps in their truncated format.
|
|
1283
1289
|
*
|
|
@@ -1304,8 +1310,8 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1304
1310
|
const permissions = this.messenger.call('PermissionController:getPermissions', origin) ?? {};
|
|
1305
1311
|
const snaps = permissions[snaps_rpc_methods_1.WALLET_SNAP_PERMISSION_KEY]?.caveats?.find((caveat) => caveat.type === snaps_utils_1.SnapCaveatType.SnapIds)?.value ?? {};
|
|
1306
1312
|
return Object.keys(snaps).reduce((permittedSnaps, snapId) => {
|
|
1307
|
-
const snap = this.
|
|
1308
|
-
const truncatedSnap = this
|
|
1313
|
+
const snap = this.getSnap(snapId);
|
|
1314
|
+
const truncatedSnap = this.#getTruncatedSnap(snapId);
|
|
1309
1315
|
if (truncatedSnap && snap?.status !== snaps_utils_1.SnapStatus.Installing) {
|
|
1310
1316
|
permittedSnaps[snapId] = truncatedSnap;
|
|
1311
1317
|
}
|
|
@@ -1345,9 +1351,9 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1345
1351
|
});
|
|
1346
1352
|
// Existing snaps may need to be updated, unless they should be re-installed (e.g. local snaps)
|
|
1347
1353
|
// Everything else is treated as an install
|
|
1348
|
-
const isUpdate = this.
|
|
1354
|
+
const isUpdate = this.hasSnap(snapId) && !location.shouldAlwaysReload;
|
|
1349
1355
|
if (isUpdate && this.#isValidUpdate(snapId, version)) {
|
|
1350
|
-
const existingSnap = this.
|
|
1356
|
+
const existingSnap = this.getSnapExpect(snapId);
|
|
1351
1357
|
pendingUpdates.push({ snapId, oldVersion: existingSnap.version });
|
|
1352
1358
|
let rollbackSnapshot = this.#getRollbackSnapshot(snapId);
|
|
1353
1359
|
if (rollbackSnapshot === undefined) {
|
|
@@ -1364,12 +1370,12 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1364
1370
|
result[snapId] = await this.#processRequestedSnap(origin, snapId, location, version);
|
|
1365
1371
|
}
|
|
1366
1372
|
// Once we finish all installs / updates, emit events.
|
|
1367
|
-
pendingInstalls.forEach((snapId) => this.messenger.publish(`SnapController:snapInstalled`, this
|
|
1368
|
-
pendingUpdates.forEach(({ snapId, oldVersion }) => this.messenger.publish(`SnapController:snapUpdated`, this
|
|
1373
|
+
pendingInstalls.forEach((snapId) => this.messenger.publish(`SnapController:snapInstalled`, this.#getTruncatedSnapExpect(snapId), origin, false));
|
|
1374
|
+
pendingUpdates.forEach(({ snapId, oldVersion }) => this.messenger.publish(`SnapController:snapUpdated`, this.#getTruncatedSnapExpect(snapId), oldVersion, origin, false));
|
|
1369
1375
|
snapIds.forEach((snapId) => this.#rollbackSnapshots.delete(snapId));
|
|
1370
1376
|
}
|
|
1371
1377
|
catch (error) {
|
|
1372
|
-
const installed = pendingInstalls.filter((snapId) => this.
|
|
1378
|
+
const installed = pendingInstalls.filter((snapId) => this.hasSnap(snapId));
|
|
1373
1379
|
await this.removeSnaps(installed);
|
|
1374
1380
|
const snapshottedSnaps = [...this.#rollbackSnapshots.keys()];
|
|
1375
1381
|
const snapsToRollback = pendingUpdates
|
|
@@ -1391,7 +1397,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1391
1397
|
* @returns The resulting snap object, or an error if something went wrong.
|
|
1392
1398
|
*/
|
|
1393
1399
|
async #processRequestedSnap(origin, snapId, location, versionRange) {
|
|
1394
|
-
const existingSnap = this
|
|
1400
|
+
const existingSnap = this.#getTruncatedSnap(snapId);
|
|
1395
1401
|
// For devX we always re-install local snaps.
|
|
1396
1402
|
if (existingSnap && !location.shouldAlwaysReload) {
|
|
1397
1403
|
if ((0, utils_1.satisfiesVersionRange)(existingSnap.version, versionRange)) {
|
|
@@ -1412,7 +1418,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1412
1418
|
});
|
|
1413
1419
|
this.messenger.publish('SnapController:snapInstallStarted', snapId, origin, false);
|
|
1414
1420
|
// Existing snaps must be stopped before overwriting
|
|
1415
|
-
if (existingSnap && this.
|
|
1421
|
+
if (existingSnap && this.isSnapRunning(snapId)) {
|
|
1416
1422
|
await this.stopSnap(snapId, snaps_utils_1.SnapStatusEvents.Stop);
|
|
1417
1423
|
}
|
|
1418
1424
|
// Existing snaps that should be re-installed should not maintain their existing permissions
|
|
@@ -1436,7 +1442,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1436
1442
|
snapId,
|
|
1437
1443
|
sourceCode,
|
|
1438
1444
|
});
|
|
1439
|
-
const truncated = this
|
|
1445
|
+
const truncated = this.#getTruncatedSnapExpect(snapId);
|
|
1440
1446
|
this.#updateApproval(pendingApproval.id, {
|
|
1441
1447
|
loading: false,
|
|
1442
1448
|
type: exports.SNAP_APPROVAL_INSTALL,
|
|
@@ -1509,7 +1515,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1509
1515
|
this.#assertCanInstallSnaps();
|
|
1510
1516
|
}
|
|
1511
1517
|
await this.#ensureCanUsePlatform();
|
|
1512
|
-
const snap = this.
|
|
1518
|
+
const snap = this.getSnapExpect(snapId);
|
|
1513
1519
|
const { preinstalled, removable, hidden, hideSnapBranding } = snap;
|
|
1514
1520
|
if (preinstalled && !automaticUpdate) {
|
|
1515
1521
|
throw new Error('Preinstalled Snaps cannot be manually updated.');
|
|
@@ -1571,7 +1577,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1571
1577
|
(0, utils_1.assert)(automaticUpdate);
|
|
1572
1578
|
approvedNewPermissions = newPermissions;
|
|
1573
1579
|
}
|
|
1574
|
-
if (this.
|
|
1580
|
+
if (this.isSnapRunning(snapId)) {
|
|
1575
1581
|
await this.stopSnap(snapId, snaps_utils_1.SnapStatusEvents.Stop);
|
|
1576
1582
|
}
|
|
1577
1583
|
this.#transition(snapId, snaps_utils_1.SnapStatusEvents.Update);
|
|
@@ -1611,7 +1617,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1611
1617
|
catch {
|
|
1612
1618
|
throw new Error(`Snap ${snapId} crashed with updated source code.`);
|
|
1613
1619
|
}
|
|
1614
|
-
const truncatedSnap = this
|
|
1620
|
+
const truncatedSnap = this.#getTruncatedSnapExpect(snapId);
|
|
1615
1621
|
if (pendingApproval) {
|
|
1616
1622
|
this.#updateApproval(pendingApproval.id, {
|
|
1617
1623
|
loading: false,
|
|
@@ -1635,7 +1641,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1635
1641
|
}
|
|
1636
1642
|
}
|
|
1637
1643
|
async #resolveAllowlistVersion(snapId, versionRange) {
|
|
1638
|
-
return await this.messenger.call('
|
|
1644
|
+
return await this.messenger.call('SnapRegistryController:resolveVersion', snapId, versionRange);
|
|
1639
1645
|
}
|
|
1640
1646
|
/**
|
|
1641
1647
|
* Returns a promise representing the complete installation of the requested snap.
|
|
@@ -1693,7 +1699,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1693
1699
|
}
|
|
1694
1700
|
async #startSnap(snapData) {
|
|
1695
1701
|
const { snapId } = snapData;
|
|
1696
|
-
if (this.
|
|
1702
|
+
if (this.isSnapRunning(snapId)) {
|
|
1697
1703
|
throw new Error(`Snap "${snapId}" is already started.`);
|
|
1698
1704
|
}
|
|
1699
1705
|
try {
|
|
@@ -1936,7 +1942,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1936
1942
|
*/
|
|
1937
1943
|
async handleRequest({ snapId, origin, handler: handlerType, request: rawRequest, }) {
|
|
1938
1944
|
await this.#ensureCanUsePlatform();
|
|
1939
|
-
const snap = this.
|
|
1945
|
+
const snap = this.getSnap(snapId);
|
|
1940
1946
|
(0, utils_1.assert)(snap, `The Snap "${snapId}" is not installed. Please install it before invoking it.`);
|
|
1941
1947
|
(0, utils_1.assert)(origin === constants_1.METAMASK_ORIGIN || (0, snaps_utils_1.isValidUrl)(origin), "'origin' must be a valid URL or 'metamask'.");
|
|
1942
1948
|
const request = {
|
|
@@ -1983,7 +1989,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1983
1989
|
if (runtime.stopPromise) {
|
|
1984
1990
|
await runtime.stopPromise;
|
|
1985
1991
|
}
|
|
1986
|
-
if (!this.
|
|
1992
|
+
if (!this.isSnapRunning(snapId)) {
|
|
1987
1993
|
if (!runtime.startPromise) {
|
|
1988
1994
|
runtime.startPromise = this.startSnap(snapId);
|
|
1989
1995
|
}
|
|
@@ -2002,7 +2008,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
2002
2008
|
try {
|
|
2003
2009
|
const result = await (0, utils_2.withTimeout)(handleRpcRequestPromise, timer);
|
|
2004
2010
|
if (result === utils_2.hasTimedOut) {
|
|
2005
|
-
const stopping = runtime.stopPromise !== null || !this.
|
|
2011
|
+
const stopping = runtime.stopPromise !== null || !this.isSnapRunning(snapId);
|
|
2006
2012
|
throw new Error(stopping
|
|
2007
2013
|
? `${snapId} was stopped and the request was cancelled. This is likely because the Snap crashed.`
|
|
2008
2014
|
: `${snapId} failed to respond to the request in time.`);
|
|
@@ -2023,7 +2029,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
2023
2029
|
// We flag the RPC request as finished early since termination may affect pending requests
|
|
2024
2030
|
this.#recordSnapRpcRequestFinish(snapId, transformedRequest.id, handlerType, origin, false);
|
|
2025
2031
|
const [jsonRpcError, handled] = (0, snaps_utils_1.unwrapError)(error);
|
|
2026
|
-
const stopping = runtime.stopPromise !== null || !this.
|
|
2032
|
+
const stopping = runtime.stopPromise !== null || !this.isSnapRunning(snapId);
|
|
2027
2033
|
if (!handled) {
|
|
2028
2034
|
if (!stopping) {
|
|
2029
2035
|
(0, snaps_utils_1.logError)(`"${snapId}" crashed due to an unhandled error:`, jsonRpcError);
|
|
@@ -2286,7 +2292,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
2286
2292
|
if (runtime.pendingInboundRequests.length === 0) {
|
|
2287
2293
|
runtime.lastRequest = Date.now();
|
|
2288
2294
|
}
|
|
2289
|
-
const snap = this.
|
|
2295
|
+
const snap = this.getSnap(snapId);
|
|
2290
2296
|
if ((0, utils_2.isTrackableHandler)(handlerType) && !snap?.preinstalled) {
|
|
2291
2297
|
try {
|
|
2292
2298
|
this.#trackSnapExport(snapId, handlerType, success, origin);
|
|
@@ -2342,7 +2348,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
2342
2348
|
}
|
|
2343
2349
|
await this.stopSnap(snapId, snaps_utils_1.SnapStatusEvents.Stop);
|
|
2344
2350
|
// Always set to stopped even if it wasn't running initially
|
|
2345
|
-
if (this.
|
|
2351
|
+
if (this.getSnap(snapId)?.status !== snaps_utils_1.SnapStatus.Stopped) {
|
|
2346
2352
|
this.#transition(snapId, snaps_utils_1.SnapStatusEvents.Stop);
|
|
2347
2353
|
}
|
|
2348
2354
|
const { statePatches, permissions, previousInitialConnections, newInitialConnections, previousSourceCode, } = rollbackSnapshot;
|
|
@@ -2356,7 +2362,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
2356
2362
|
}
|
|
2357
2363
|
// Reset snap status, as we may have been in another state when we stored state patches
|
|
2358
2364
|
// But now we are 100% in a stopped state
|
|
2359
|
-
if (this.
|
|
2365
|
+
if (this.getSnap(snapId)?.status !== snaps_utils_1.SnapStatus.Stopped) {
|
|
2360
2366
|
this.update((state) => {
|
|
2361
2367
|
state.snaps[snapId].status = snaps_utils_1.SnapStatus.Stopped;
|
|
2362
2368
|
});
|
|
@@ -2369,7 +2375,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
2369
2375
|
});
|
|
2370
2376
|
// Calling this in reverse order to undo the changes
|
|
2371
2377
|
this.#handleInitialConnections(snapId, newInitialConnections ?? null, previousInitialConnections ?? {});
|
|
2372
|
-
const truncatedSnap = this
|
|
2378
|
+
const truncatedSnap = this.#getTruncatedSnapExpect(snapId);
|
|
2373
2379
|
this.messenger.publish('SnapController:snapRolledback', truncatedSnap, rollbackSnapshot.newVersion);
|
|
2374
2380
|
this.#rollbackSnapshots.delete(snapId);
|
|
2375
2381
|
}
|
|
@@ -2396,7 +2402,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
2396
2402
|
if (this.#snapsRuntimeData.has(snapId)) {
|
|
2397
2403
|
return;
|
|
2398
2404
|
}
|
|
2399
|
-
const snap = this.
|
|
2405
|
+
const snap = this.getSnap(snapId);
|
|
2400
2406
|
const interpreter = (0, fsm_1.interpret)(this.#statusMachine);
|
|
2401
2407
|
interpreter.start({
|
|
2402
2408
|
context: { snapId },
|
|
@@ -2411,7 +2417,6 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
2411
2417
|
installPromise: null,
|
|
2412
2418
|
encryptionKey: null,
|
|
2413
2419
|
encryptionSalt: null,
|
|
2414
|
-
activeReferences: 0,
|
|
2415
2420
|
pendingInboundRequests: [],
|
|
2416
2421
|
pendingOutboundRequests: 0,
|
|
2417
2422
|
interpreter,
|
|
@@ -2522,7 +2527,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
2522
2527
|
* @returns `true` if validation checks pass and `false` if they do not.
|
|
2523
2528
|
*/
|
|
2524
2529
|
#isValidUpdate(snapId, newVersionRange) {
|
|
2525
|
-
const existingSnap = this.
|
|
2530
|
+
const existingSnap = this.getSnapExpect(snapId);
|
|
2526
2531
|
if ((0, utils_1.satisfiesVersionRange)(existingSnap.version, newVersionRange)) {
|
|
2527
2532
|
return false;
|
|
2528
2533
|
}
|