@metamask/snaps-controllers 17.2.0 → 18.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 +35 -1
- package/dist/multichain/MultichainRouter.cjs +33 -10
- package/dist/multichain/MultichainRouter.cjs.map +1 -1
- package/dist/multichain/MultichainRouter.d.cts +5 -7
- package/dist/multichain/MultichainRouter.d.cts.map +1 -1
- package/dist/multichain/MultichainRouter.d.mts +5 -7
- package/dist/multichain/MultichainRouter.d.mts.map +1 -1
- package/dist/multichain/MultichainRouter.mjs +34 -11
- package/dist/multichain/MultichainRouter.mjs.map +1 -1
- package/dist/services/AbstractExecutionService.cjs +5 -7
- package/dist/services/AbstractExecutionService.cjs.map +1 -1
- package/dist/services/AbstractExecutionService.d.cts +3 -2
- package/dist/services/AbstractExecutionService.d.cts.map +1 -1
- package/dist/services/AbstractExecutionService.d.mts +3 -2
- package/dist/services/AbstractExecutionService.d.mts.map +1 -1
- package/dist/services/AbstractExecutionService.mjs +5 -7
- package/dist/services/AbstractExecutionService.mjs.map +1 -1
- package/dist/services/iframe/IframeExecutionService.cjs +12 -2
- package/dist/services/iframe/IframeExecutionService.cjs.map +1 -1
- package/dist/services/iframe/IframeExecutionService.d.cts +1 -1
- package/dist/services/iframe/IframeExecutionService.d.cts.map +1 -1
- package/dist/services/iframe/IframeExecutionService.d.mts +1 -1
- package/dist/services/iframe/IframeExecutionService.d.mts.map +1 -1
- package/dist/services/iframe/IframeExecutionService.mjs +12 -2
- package/dist/services/iframe/IframeExecutionService.mjs.map +1 -1
- package/dist/services/node-js/NodeProcessExecutionService.cjs +1 -1
- package/dist/services/node-js/NodeProcessExecutionService.cjs.map +1 -1
- package/dist/services/node-js/NodeProcessExecutionService.d.cts +1 -1
- package/dist/services/node-js/NodeProcessExecutionService.d.cts.map +1 -1
- package/dist/services/node-js/NodeProcessExecutionService.d.mts +1 -1
- package/dist/services/node-js/NodeProcessExecutionService.d.mts.map +1 -1
- package/dist/services/node-js/NodeProcessExecutionService.mjs +1 -1
- package/dist/services/node-js/NodeProcessExecutionService.mjs.map +1 -1
- package/dist/services/webview/WebViewExecutionService.cjs +1 -1
- package/dist/services/webview/WebViewExecutionService.cjs.map +1 -1
- package/dist/services/webview/WebViewExecutionService.d.cts +1 -1
- package/dist/services/webview/WebViewExecutionService.d.cts.map +1 -1
- package/dist/services/webview/WebViewExecutionService.d.mts +1 -1
- package/dist/services/webview/WebViewExecutionService.d.mts.map +1 -1
- package/dist/services/webview/WebViewExecutionService.mjs +1 -1
- package/dist/services/webview/WebViewExecutionService.mjs.map +1 -1
- package/dist/snaps/SnapController.cjs +111 -26
- package/dist/snaps/SnapController.cjs.map +1 -1
- package/dist/snaps/SnapController.d.cts +10 -17
- package/dist/snaps/SnapController.d.cts.map +1 -1
- package/dist/snaps/SnapController.d.mts +10 -17
- package/dist/snaps/SnapController.d.mts.map +1 -1
- package/dist/snaps/SnapController.mjs +111 -26
- package/dist/snaps/SnapController.mjs.map +1 -1
- package/dist/utils.d.cts +1 -0
- package/dist/utils.d.cts.map +1 -1
- package/dist/utils.d.mts +1 -0
- package/dist/utils.d.mts.map +1 -1
- package/package.json +12 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebViewExecutionService.cjs","sourceRoot":"","sources":["../../../src/services/webview/WebViewExecutionService.ts"],"names":[],"mappings":";;;AACA,qEAA8D;AAC9D,8EAAuE;AAWvE,MAAa,uBAAwB,SAAQ,mDAA0C;IAC5E,cAAc,CAAC;IAEf,cAAc,CAAC;IAExB,YAAY,EACV,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,GAAG,IAAI,EACqB;QAC5B,KAAK,CAAC;YACJ,GAAG,IAAI;YACP,SAAS;YACT,iBAAiB;SAClB,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QACpC,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;IACtC,CAAC;IAED;;;;;;OAMG;IACO,KAAK,CAAC,aAAa,CAAC,MAAc;QAC1C,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAE3C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAElD,MAAM,MAAM,GAAG,IAAI,2CAAoB,CAAC;YACtC,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,OAAO;YACf,OAAO;SACR,CAAC,CAAC;QAEH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACrC,CAAC;IAES,
|
|
1
|
+
{"version":3,"file":"WebViewExecutionService.cjs","sourceRoot":"","sources":["../../../src/services/webview/WebViewExecutionService.ts"],"names":[],"mappings":";;;AACA,qEAA8D;AAC9D,8EAAuE;AAWvE,MAAa,uBAAwB,SAAQ,mDAA0C;IAC5E,cAAc,CAAC;IAEf,cAAc,CAAC;IAExB,YAAY,EACV,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,GAAG,IAAI,EACqB;QAC5B,KAAK,CAAC;YACJ,GAAG,IAAI;YACP,SAAS;YACT,iBAAiB;SAClB,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QACpC,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;IACtC,CAAC;IAED;;;;;;OAMG;IACO,KAAK,CAAC,aAAa,CAAC,MAAc;QAC1C,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAE3C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAElD,MAAM,MAAM,GAAG,IAAI,2CAAoB,CAAC;YACtC,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,OAAO;YACf,OAAO;SACR,CAAC,CAAC;QAEH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACrC,CAAC;IAES,KAAK,CAAC,YAAY,CAC1B,UAA8C;QAE9C,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC;CACF;AA/CD,0DA+CC","sourcesContent":["import type { WebViewInterface } from './WebViewMessageStream';\nimport { WebViewMessageStream } from './WebViewMessageStream';\nimport { AbstractExecutionService } from '../AbstractExecutionService';\nimport type {\n ExecutionServiceArgs,\n TerminateJobArgs,\n} from '../AbstractExecutionService';\n\nexport type WebViewExecutionServiceArgs = ExecutionServiceArgs & {\n createWebView: (jobId: string) => Promise<WebViewInterface>;\n removeWebView: (jobId: string) => void;\n};\n\nexport class WebViewExecutionService extends AbstractExecutionService<WebViewInterface> {\n readonly #createWebView;\n\n readonly #removeWebView;\n\n constructor({\n messenger,\n setupSnapProvider,\n createWebView,\n removeWebView,\n ...args\n }: WebViewExecutionServiceArgs) {\n super({\n ...args,\n messenger,\n setupSnapProvider,\n });\n this.#createWebView = createWebView;\n this.#removeWebView = removeWebView;\n }\n\n /**\n * Create a new stream for the specified Snap. This wraps the runtime stream\n * in a stream specific to the Snap.\n *\n * @param snapId - The Snap ID.\n * @returns An object with the webview and stream.\n */\n protected async initEnvStream(snapId: string) {\n this.setSnapStatus(snapId, 'initializing');\n\n const webView = await this.#createWebView(snapId);\n\n const stream = new WebViewMessageStream({\n name: 'parent',\n target: 'child',\n webView,\n });\n\n return { worker: webView, stream };\n }\n\n protected async terminateJob(\n jobWrapper: TerminateJobArgs<WebViewInterface>,\n ): Promise<void> {\n this.#removeWebView(jobWrapper.id);\n }\n}\n"]}
|
|
@@ -20,6 +20,6 @@ export declare class WebViewExecutionService extends AbstractExecutionService<We
|
|
|
20
20
|
worker: WebViewInterface;
|
|
21
21
|
stream: WebViewMessageStream;
|
|
22
22
|
}>;
|
|
23
|
-
protected terminateJob(jobWrapper: TerminateJobArgs<WebViewInterface>): void
|
|
23
|
+
protected terminateJob(jobWrapper: TerminateJobArgs<WebViewInterface>): Promise<void>;
|
|
24
24
|
}
|
|
25
25
|
//# sourceMappingURL=WebViewExecutionService.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebViewExecutionService.d.cts","sourceRoot":"","sources":["../../../src/services/webview/WebViewExecutionService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,mCAA+B;AAC/D,OAAO,EAAE,oBAAoB,EAAE,mCAA+B;AAC9D,OAAO,EAAE,wBAAwB,EAAE,wCAAoC;AACvE,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EACjB,wCAAoC;AAErC,MAAM,MAAM,2BAA2B,GAAG,oBAAoB,GAAG;IAC/D,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC5D,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,CAAC;AAEF,qBAAa,uBAAwB,SAAQ,wBAAwB,CAAC,gBAAgB,CAAC;;gBAKzE,EACV,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,GAAG,IAAI,EACR,EAAE,2BAA2B;IAU9B;;;;;;OAMG;cACa,aAAa,CAAC,MAAM,EAAE,MAAM;;;;
|
|
1
|
+
{"version":3,"file":"WebViewExecutionService.d.cts","sourceRoot":"","sources":["../../../src/services/webview/WebViewExecutionService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,mCAA+B;AAC/D,OAAO,EAAE,oBAAoB,EAAE,mCAA+B;AAC9D,OAAO,EAAE,wBAAwB,EAAE,wCAAoC;AACvE,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EACjB,wCAAoC;AAErC,MAAM,MAAM,2BAA2B,GAAG,oBAAoB,GAAG;IAC/D,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC5D,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,CAAC;AAEF,qBAAa,uBAAwB,SAAQ,wBAAwB,CAAC,gBAAgB,CAAC;;gBAKzE,EACV,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,GAAG,IAAI,EACR,EAAE,2BAA2B;IAU9B;;;;;;OAMG;cACa,aAAa,CAAC,MAAM,EAAE,MAAM;;;;cAc5B,YAAY,CAC1B,UAAU,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,GAC7C,OAAO,CAAC,IAAI,CAAC;CAGjB"}
|
|
@@ -20,6 +20,6 @@ export declare class WebViewExecutionService extends AbstractExecutionService<We
|
|
|
20
20
|
worker: WebViewInterface;
|
|
21
21
|
stream: WebViewMessageStream;
|
|
22
22
|
}>;
|
|
23
|
-
protected terminateJob(jobWrapper: TerminateJobArgs<WebViewInterface>): void
|
|
23
|
+
protected terminateJob(jobWrapper: TerminateJobArgs<WebViewInterface>): Promise<void>;
|
|
24
24
|
}
|
|
25
25
|
//# sourceMappingURL=WebViewExecutionService.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebViewExecutionService.d.mts","sourceRoot":"","sources":["../../../src/services/webview/WebViewExecutionService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,mCAA+B;AAC/D,OAAO,EAAE,oBAAoB,EAAE,mCAA+B;AAC9D,OAAO,EAAE,wBAAwB,EAAE,wCAAoC;AACvE,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EACjB,wCAAoC;AAErC,MAAM,MAAM,2BAA2B,GAAG,oBAAoB,GAAG;IAC/D,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC5D,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,CAAC;AAEF,qBAAa,uBAAwB,SAAQ,wBAAwB,CAAC,gBAAgB,CAAC;;gBAKzE,EACV,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,GAAG,IAAI,EACR,EAAE,2BAA2B;IAU9B;;;;;;OAMG;cACa,aAAa,CAAC,MAAM,EAAE,MAAM;;;;
|
|
1
|
+
{"version":3,"file":"WebViewExecutionService.d.mts","sourceRoot":"","sources":["../../../src/services/webview/WebViewExecutionService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,mCAA+B;AAC/D,OAAO,EAAE,oBAAoB,EAAE,mCAA+B;AAC9D,OAAO,EAAE,wBAAwB,EAAE,wCAAoC;AACvE,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EACjB,wCAAoC;AAErC,MAAM,MAAM,2BAA2B,GAAG,oBAAoB,GAAG;IAC/D,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC5D,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,CAAC;AAEF,qBAAa,uBAAwB,SAAQ,wBAAwB,CAAC,gBAAgB,CAAC;;gBAKzE,EACV,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,GAAG,IAAI,EACR,EAAE,2BAA2B;IAU9B;;;;;;OAMG;cACa,aAAa,CAAC,MAAM,EAAE,MAAM;;;;cAc5B,YAAY,CAC1B,UAAU,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,GAC7C,OAAO,CAAC,IAAI,CAAC;CAGjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebViewExecutionService.mjs","sourceRoot":"","sources":["../../../src/services/webview/WebViewExecutionService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,mCAA+B;AAC9D,OAAO,EAAE,wBAAwB,EAAE,wCAAoC;AAWvE,MAAM,OAAO,uBAAwB,SAAQ,wBAA0C;IAC5E,cAAc,CAAC;IAEf,cAAc,CAAC;IAExB,YAAY,EACV,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,GAAG,IAAI,EACqB;QAC5B,KAAK,CAAC;YACJ,GAAG,IAAI;YACP,SAAS;YACT,iBAAiB;SAClB,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QACpC,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;IACtC,CAAC;IAED;;;;;;OAMG;IACO,KAAK,CAAC,aAAa,CAAC,MAAc;QAC1C,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAE3C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAElD,MAAM,MAAM,GAAG,IAAI,oBAAoB,CAAC;YACtC,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,OAAO;YACf,OAAO;SACR,CAAC,CAAC;QAEH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACrC,CAAC;IAES,
|
|
1
|
+
{"version":3,"file":"WebViewExecutionService.mjs","sourceRoot":"","sources":["../../../src/services/webview/WebViewExecutionService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,mCAA+B;AAC9D,OAAO,EAAE,wBAAwB,EAAE,wCAAoC;AAWvE,MAAM,OAAO,uBAAwB,SAAQ,wBAA0C;IAC5E,cAAc,CAAC;IAEf,cAAc,CAAC;IAExB,YAAY,EACV,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,GAAG,IAAI,EACqB;QAC5B,KAAK,CAAC;YACJ,GAAG,IAAI;YACP,SAAS;YACT,iBAAiB;SAClB,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QACpC,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;IACtC,CAAC;IAED;;;;;;OAMG;IACO,KAAK,CAAC,aAAa,CAAC,MAAc;QAC1C,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAE3C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAElD,MAAM,MAAM,GAAG,IAAI,oBAAoB,CAAC;YACtC,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,OAAO;YACf,OAAO;SACR,CAAC,CAAC;QAEH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACrC,CAAC;IAES,KAAK,CAAC,YAAY,CAC1B,UAA8C;QAE9C,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC;CACF","sourcesContent":["import type { WebViewInterface } from './WebViewMessageStream';\nimport { WebViewMessageStream } from './WebViewMessageStream';\nimport { AbstractExecutionService } from '../AbstractExecutionService';\nimport type {\n ExecutionServiceArgs,\n TerminateJobArgs,\n} from '../AbstractExecutionService';\n\nexport type WebViewExecutionServiceArgs = ExecutionServiceArgs & {\n createWebView: (jobId: string) => Promise<WebViewInterface>;\n removeWebView: (jobId: string) => void;\n};\n\nexport class WebViewExecutionService extends AbstractExecutionService<WebViewInterface> {\n readonly #createWebView;\n\n readonly #removeWebView;\n\n constructor({\n messenger,\n setupSnapProvider,\n createWebView,\n removeWebView,\n ...args\n }: WebViewExecutionServiceArgs) {\n super({\n ...args,\n messenger,\n setupSnapProvider,\n });\n this.#createWebView = createWebView;\n this.#removeWebView = removeWebView;\n }\n\n /**\n * Create a new stream for the specified Snap. This wraps the runtime stream\n * in a stream specific to the Snap.\n *\n * @param snapId - The Snap ID.\n * @returns An object with the webview and stream.\n */\n protected async initEnvStream(snapId: string) {\n this.setSnapStatus(snapId, 'initializing');\n\n const webView = await this.#createWebView(snapId);\n\n const stream = new WebViewMessageStream({\n name: 'parent',\n target: 'child',\n webView,\n });\n\n return { worker: webView, stream };\n }\n\n protected async terminateJob(\n jobWrapper: TerminateJobArgs<WebViewInterface>,\n ): Promise<void> {\n this.#removeWebView(jobWrapper.id);\n }\n}\n"]}
|
|
@@ -61,7 +61,6 @@ function truncateSnap(snap) {
|
|
|
61
61
|
* - Start: Initializes the snap in its SES realm with the authorized permissions.
|
|
62
62
|
*/
|
|
63
63
|
class SnapController extends base_controller_1.BaseController {
|
|
64
|
-
#closeAllConnections;
|
|
65
64
|
#dynamicPermissions;
|
|
66
65
|
#environmentEndowmentPermissions;
|
|
67
66
|
#excludedPermissions;
|
|
@@ -85,7 +84,12 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
85
84
|
#trackEvent;
|
|
86
85
|
#trackSnapExport;
|
|
87
86
|
#ensureOnboardingComplete;
|
|
88
|
-
|
|
87
|
+
// A promise that resolves when the controller has finished setting up.
|
|
88
|
+
// This is used to ensure that the controller is ready to be used.
|
|
89
|
+
// It is resolved when the controller has finished setting up and the platform is ready.
|
|
90
|
+
// It is rejected if there is an error during setup.
|
|
91
|
+
#controllerSetup = (0, utils_1.createDeferredPromise)();
|
|
92
|
+
constructor({ messenger, state, dynamicPermissions = ['endowment:caip25', 'wallet_snap'], environmentEndowmentPermissions = [], excludedPermissions = {}, idleTimeCheckInterval = (0, utils_1.inMilliseconds)(5, utils_1.Duration.Second), maxIdleTime = (0, utils_1.inMilliseconds)(30, utils_1.Duration.Second), maxRequestTime = (0, utils_1.inMilliseconds)(60, utils_1.Duration.Second), fetchFunction = globalThis.fetch.bind(undefined), featureFlags = {}, detectSnapLocation: detectSnapLocationFunction = location_1.detectSnapLocation, preinstalledSnaps = null, encryptor, getMnemonicSeed, getFeatureFlags = () => ({}), clientCryptography, trackEvent, ensureOnboardingComplete, }) {
|
|
89
93
|
super({
|
|
90
94
|
messenger,
|
|
91
95
|
metadata: {
|
|
@@ -112,7 +116,6 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
112
116
|
// Delete larger snap properties
|
|
113
117
|
return Object.values(snaps).reduce((acc, snap) => {
|
|
114
118
|
const snapCopy = { ...snap };
|
|
115
|
-
delete snapCopy.sourceCode;
|
|
116
119
|
delete snapCopy.auxiliaryFiles;
|
|
117
120
|
acc[snap.id] = snapCopy;
|
|
118
121
|
return acc;
|
|
@@ -147,7 +150,6 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
147
150
|
...state,
|
|
148
151
|
},
|
|
149
152
|
});
|
|
150
|
-
this.#closeAllConnections = closeAllConnections;
|
|
151
153
|
this.#dynamicPermissions = dynamicPermissions;
|
|
152
154
|
this.#environmentEndowmentPermissions = environmentEndowmentPermissions;
|
|
153
155
|
this.#excludedPermissions = excludedPermissions;
|
|
@@ -186,12 +188,14 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
186
188
|
});
|
|
187
189
|
});
|
|
188
190
|
this.messenger.subscribe('KeyringController:lock', this.#handleLock.bind(this));
|
|
191
|
+
this.messenger.subscribe('SnapsRegistry:stateChange', () => {
|
|
192
|
+
this.#handleRegistryUpdate().catch((error) => {
|
|
193
|
+
(0, snaps_utils_1.logError)(`Error when processing Snaps registry update: ${(0, snaps_sdk_1.getErrorMessage)(error)}`);
|
|
194
|
+
});
|
|
195
|
+
}, ({ database }) => database);
|
|
189
196
|
this.#initializeStateMachine();
|
|
190
197
|
this.#registerMessageHandlers();
|
|
191
198
|
Object.values(this.state?.snaps ?? {}).forEach((snap) => this.#setupRuntime(snap.id));
|
|
192
|
-
if (this.#preinstalledSnaps) {
|
|
193
|
-
this.#handlePreinstalledSnaps(this.#preinstalledSnaps);
|
|
194
|
-
}
|
|
195
199
|
this.#trackSnapExport = (0, utils_2.throttleTracking)((snapId, handler, success, origin) => {
|
|
196
200
|
const snapMetadata = this.messenger.call('SnapsRegistry:getMetadata', snapId);
|
|
197
201
|
this.#trackEvent({
|
|
@@ -276,7 +280,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
276
280
|
* actions.
|
|
277
281
|
*/
|
|
278
282
|
#registerMessageHandlers() {
|
|
279
|
-
this.messenger.registerActionHandler(`${exports.controllerName}:init`, (...args) => this.init(...args));
|
|
283
|
+
this.messenger.registerActionHandler(`${exports.controllerName}:init`, async (...args) => this.init(...args));
|
|
280
284
|
this.messenger.registerActionHandler(`${exports.controllerName}:clearSnapState`, (...args) => this.clearSnapState(...args));
|
|
281
285
|
this.messenger.registerActionHandler(`${exports.controllerName}:get`, (...args) => this.get(...args));
|
|
282
286
|
this.messenger.registerActionHandler(`${exports.controllerName}:getSnapState`, async (...args) => this.getSnapState(...args));
|
|
@@ -303,15 +307,25 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
303
307
|
/**
|
|
304
308
|
* Initialise the SnapController.
|
|
305
309
|
*
|
|
306
|
-
* Currently this method calls the `onStart` lifecycle hook for all
|
|
310
|
+
* Currently this method sets up the controller and calls the `onStart` lifecycle hook for all
|
|
307
311
|
* runnable Snaps.
|
|
308
312
|
*/
|
|
309
|
-
init() {
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
+
async init() {
|
|
314
|
+
try {
|
|
315
|
+
if (this.#preinstalledSnaps) {
|
|
316
|
+
await this.#handlePreinstalledSnaps(this.#preinstalledSnaps);
|
|
317
|
+
}
|
|
318
|
+
this.#controllerSetup.resolve();
|
|
319
|
+
// Populate the `isReady` state.
|
|
320
|
+
await this.#ensureCanUsePlatform();
|
|
321
|
+
this.#callLifecycleHooks(constants_1.METAMASK_ORIGIN, snaps_utils_1.HandlerType.OnStart);
|
|
322
|
+
}
|
|
323
|
+
catch (error) {
|
|
324
|
+
this.#controllerSetup.reject(error);
|
|
325
|
+
(0, snaps_utils_1.logWarning)('Error during SnapController initialization.', error);
|
|
326
|
+
}
|
|
313
327
|
}
|
|
314
|
-
#handlePreinstalledSnaps(preinstalledSnaps) {
|
|
328
|
+
async #handlePreinstalledSnaps(preinstalledSnaps) {
|
|
315
329
|
for (const { snapId, manifest, files, removable, hidden, hideSnapBranding, } of preinstalledSnaps) {
|
|
316
330
|
const existingSnap = this.get(snapId);
|
|
317
331
|
const isAlreadyInstalled = existingSnap !== undefined;
|
|
@@ -346,7 +360,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
346
360
|
localizationFiles: validatedLocalizationFiles,
|
|
347
361
|
};
|
|
348
362
|
// Add snap to the SnapController state
|
|
349
|
-
this.#set({
|
|
363
|
+
await this.#set({
|
|
350
364
|
id: snapId,
|
|
351
365
|
origin: constants_1.METAMASK_ORIGIN,
|
|
352
366
|
files: filesObject,
|
|
@@ -419,15 +433,22 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
419
433
|
}, this.#idleTimeCheckInterval);
|
|
420
434
|
}
|
|
421
435
|
/**
|
|
422
|
-
*
|
|
423
|
-
* blocks/unblocks snaps as appropriate. See {@link SnapController.blockSnap}
|
|
424
|
-
* for more information.
|
|
436
|
+
* Trigger an update of the registry.
|
|
425
437
|
*
|
|
426
|
-
*
|
|
438
|
+
* As a side-effect of this, preinstalled Snaps may be updated and Snaps may be blocked/unblocked.
|
|
427
439
|
*/
|
|
428
440
|
async updateRegistry() {
|
|
429
441
|
await this.#ensureCanUsePlatform();
|
|
430
442
|
await this.messenger.call('SnapsRegistry:update');
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Checks all installed Snaps against the blocklist and
|
|
446
|
+
* blocks/unblocks Snaps as appropriate. See {@link SnapController.blockSnap}
|
|
447
|
+
* for more information.
|
|
448
|
+
*
|
|
449
|
+
* Also updates any preinstalled Snaps to the latest allowlisted version.
|
|
450
|
+
*/
|
|
451
|
+
async #handleRegistryUpdate() {
|
|
431
452
|
const blockedSnaps = await this.messenger.call('SnapsRegistry:get', Object.values(this.state.snaps).reduce((blockListArg, snap) => {
|
|
432
453
|
blockListArg[snap.id] = {
|
|
433
454
|
version: snap.version,
|
|
@@ -535,6 +556,8 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
535
556
|
* Waits for onboarding and then asserts whether the Snaps platform is allowed to run.
|
|
536
557
|
*/
|
|
537
558
|
async #ensureCanUsePlatform() {
|
|
559
|
+
// Ensure the controller has finished setting up.
|
|
560
|
+
await this.#controllerSetup.promise;
|
|
538
561
|
// Ensure the user has onboarded before allowing access to Snaps.
|
|
539
562
|
await this.#ensureOnboardingComplete();
|
|
540
563
|
const flags = this.#getFeatureFlags();
|
|
@@ -616,9 +639,10 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
616
639
|
if (!snap.enabled) {
|
|
617
640
|
throw new Error(`Snap "${snapId}" is disabled.`);
|
|
618
641
|
}
|
|
642
|
+
const sourceCode = await this.#getSourceCode(snapId);
|
|
619
643
|
await this.#startSnap({
|
|
620
644
|
snapId,
|
|
621
|
-
sourceCode
|
|
645
|
+
sourceCode,
|
|
622
646
|
});
|
|
623
647
|
}
|
|
624
648
|
/**
|
|
@@ -679,7 +703,6 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
679
703
|
runtime.stopPromise = promise;
|
|
680
704
|
try {
|
|
681
705
|
if (this.isRunning(snapId)) {
|
|
682
|
-
this.#closeAllConnections?.(snapId);
|
|
683
706
|
await this.#terminateSnap(snapId);
|
|
684
707
|
}
|
|
685
708
|
}
|
|
@@ -1063,9 +1086,10 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1063
1086
|
});
|
|
1064
1087
|
this.#snapsRuntimeData.clear();
|
|
1065
1088
|
this.#rollbackSnapshots.clear();
|
|
1089
|
+
await this.#clearStorageService();
|
|
1066
1090
|
// We want to remove all snaps & permissions, except for preinstalled snaps
|
|
1067
1091
|
if (this.#preinstalledSnaps) {
|
|
1068
|
-
this.#handlePreinstalledSnaps(this.#preinstalledSnaps);
|
|
1092
|
+
await this.#handlePreinstalledSnaps(this.#preinstalledSnaps);
|
|
1069
1093
|
}
|
|
1070
1094
|
}
|
|
1071
1095
|
/**
|
|
@@ -1107,6 +1131,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1107
1131
|
delete state.snapStates[snapId];
|
|
1108
1132
|
delete state.unencryptedSnapStates[snapId];
|
|
1109
1133
|
});
|
|
1134
|
+
await this.#removeSourceCode(snapId);
|
|
1110
1135
|
// If the snap has been fully installed before, also emit snapUninstalled.
|
|
1111
1136
|
if (snap.status !== snaps_utils_1.SnapStatus.Installing) {
|
|
1112
1137
|
this.messenger.publish(`SnapController:snapUninstalled`, truncated);
|
|
@@ -1532,7 +1557,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1532
1557
|
await this.stopSnap(snapId, snaps_utils_1.SnapStatusEvents.Stop);
|
|
1533
1558
|
}
|
|
1534
1559
|
this.#transition(snapId, snaps_utils_1.SnapStatusEvents.Update);
|
|
1535
|
-
this.#set({
|
|
1560
|
+
await this.#set({
|
|
1536
1561
|
origin,
|
|
1537
1562
|
id: snapId,
|
|
1538
1563
|
files: newSnap,
|
|
@@ -1719,7 +1744,7 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1719
1744
|
* @param args - The add snap args.
|
|
1720
1745
|
* @returns The resulting snap object.
|
|
1721
1746
|
*/
|
|
1722
|
-
#set(args) {
|
|
1747
|
+
async #set(args) {
|
|
1723
1748
|
const { id: snapId, origin, files, isUpdate = false, removable, preinstalled, hidden, hideSnapBranding, } = args;
|
|
1724
1749
|
const { manifest, sourceCode: sourceCodeFile, svgIcon, auxiliaryFiles: rawAuxiliaryFiles, localizationFiles, } = files;
|
|
1725
1750
|
(0, snaps_utils_1.assertIsSnapManifest)(manifest.result);
|
|
@@ -1761,7 +1786,6 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1761
1786
|
initialPermissions: manifest.result.initialPermissions,
|
|
1762
1787
|
manifest: manifest.result,
|
|
1763
1788
|
status: this.#statusMachine.config.initial,
|
|
1764
|
-
sourceCode,
|
|
1765
1789
|
version,
|
|
1766
1790
|
versionHistory,
|
|
1767
1791
|
auxiliaryFiles,
|
|
@@ -1778,9 +1802,14 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
1778
1802
|
if (isUpdate) {
|
|
1779
1803
|
const rollbackSnapshot = this.#getRollbackSnapshot(snapId);
|
|
1780
1804
|
if (rollbackSnapshot !== undefined) {
|
|
1805
|
+
// Save statePatches first, before any async operations that might throw.
|
|
1806
|
+
// This ensures rollback can revert state changes even if subsequent operations fail.
|
|
1781
1807
|
rollbackSnapshot.statePatches = inversePatches;
|
|
1808
|
+
const previousSourceCode = await this.#getSourceCode(snapId);
|
|
1809
|
+
rollbackSnapshot.previousSourceCode = previousSourceCode;
|
|
1782
1810
|
}
|
|
1783
1811
|
}
|
|
1812
|
+
await this.#setSourceCode(snapId, sourceCode);
|
|
1784
1813
|
// In case the Snap uses a localized manifest, we need to get the
|
|
1785
1814
|
// proposed name from the localized manifest.
|
|
1786
1815
|
const { proposedName } = (0, snaps_utils_1.getLocalizedSnapManifest)(manifest.result, 'en', localizedFiles);
|
|
@@ -2291,10 +2320,15 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
2291
2320
|
if (this.get(snapId)?.status !== snaps_utils_1.SnapStatus.Stopped) {
|
|
2292
2321
|
this.#transition(snapId, snaps_utils_1.SnapStatusEvents.Stop);
|
|
2293
2322
|
}
|
|
2294
|
-
const { statePatches, permissions, previousInitialConnections, newInitialConnections, } = rollbackSnapshot;
|
|
2323
|
+
const { statePatches, permissions, previousInitialConnections, newInitialConnections, previousSourceCode, } = rollbackSnapshot;
|
|
2295
2324
|
if (statePatches?.length) {
|
|
2296
2325
|
this.applyPatches(statePatches);
|
|
2297
2326
|
}
|
|
2327
|
+
// If the snap has a previous source code, set it back to the previous source code.
|
|
2328
|
+
// If it doesn't, we don't need to set it back to the previous source code because it means we haven't updated the source code.
|
|
2329
|
+
if (previousSourceCode) {
|
|
2330
|
+
await this.#setSourceCode(snapId, previousSourceCode);
|
|
2331
|
+
}
|
|
2298
2332
|
// Reset snap status, as we may have been in another state when we stored state patches
|
|
2299
2333
|
// But now we are 100% in a stopped state
|
|
2300
2334
|
if (this.get(snapId)?.status !== snaps_utils_1.SnapStatus.Stopped) {
|
|
@@ -2531,6 +2565,57 @@ class SnapController extends base_controller_1.BaseController {
|
|
|
2531
2565
|
runtime.state = undefined;
|
|
2532
2566
|
}
|
|
2533
2567
|
}
|
|
2568
|
+
/**
|
|
2569
|
+
* Retrieve the source code for a Snap from storage.
|
|
2570
|
+
*
|
|
2571
|
+
* @param snapId - The Snap ID.
|
|
2572
|
+
* @returns The source code for the Snap.
|
|
2573
|
+
*/
|
|
2574
|
+
async #getSourceCode(snapId) {
|
|
2575
|
+
const storage = await this.#getStorage(snapId);
|
|
2576
|
+
(0, utils_1.assert)(storage?.sourceCode, `Source code for Snap "${snapId}" not found.`);
|
|
2577
|
+
return storage.sourceCode;
|
|
2578
|
+
}
|
|
2579
|
+
/**
|
|
2580
|
+
* Retrieve the storage for a Snap from the StorageService.
|
|
2581
|
+
*
|
|
2582
|
+
* @param snapId - The Snap ID.
|
|
2583
|
+
* @returns The storage for the Snap.
|
|
2584
|
+
*/
|
|
2585
|
+
async #getStorage(snapId) {
|
|
2586
|
+
const { result, error } = await this.messenger.call('StorageService:getItem', this.name, snapId);
|
|
2587
|
+
(0, utils_1.assert)(!error, `Error retrieving storage for snap "${snapId}": ${error}`);
|
|
2588
|
+
return result;
|
|
2589
|
+
}
|
|
2590
|
+
/**
|
|
2591
|
+
* Store the source code for a Snap in storage.
|
|
2592
|
+
* For now we call the StorageService with just the source code
|
|
2593
|
+
* since that's all we store.
|
|
2594
|
+
*
|
|
2595
|
+
* @param snapId - The Snap ID.
|
|
2596
|
+
* @param sourceCode - The source code for the Snap.
|
|
2597
|
+
*/
|
|
2598
|
+
async #setSourceCode(snapId, sourceCode) {
|
|
2599
|
+
await this.messenger.call('StorageService:setItem', this.name, snapId, {
|
|
2600
|
+
sourceCode,
|
|
2601
|
+
});
|
|
2602
|
+
}
|
|
2603
|
+
/**
|
|
2604
|
+
* Remove the source code for a Snap from storage.
|
|
2605
|
+
* Since we only store source code, this effectively
|
|
2606
|
+
* removes all data for the Snap for now.
|
|
2607
|
+
*
|
|
2608
|
+
* @param snapId - The Snap ID.
|
|
2609
|
+
*/
|
|
2610
|
+
async #removeSourceCode(snapId) {
|
|
2611
|
+
await this.messenger.call('StorageService:removeItem', this.name, snapId);
|
|
2612
|
+
}
|
|
2613
|
+
/**
|
|
2614
|
+
* Clear all Snap data from the StorageService.
|
|
2615
|
+
*/
|
|
2616
|
+
async #clearStorageService() {
|
|
2617
|
+
await this.messenger.call('StorageService:clear', this.name);
|
|
2618
|
+
}
|
|
2534
2619
|
}
|
|
2535
2620
|
exports.SnapController = SnapController;
|
|
2536
2621
|
//# sourceMappingURL=SnapController.cjs.map
|