@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.
Files changed (54) hide show
  1. package/CHANGELOG.md +35 -1
  2. package/dist/multichain/MultichainRouter.cjs +33 -10
  3. package/dist/multichain/MultichainRouter.cjs.map +1 -1
  4. package/dist/multichain/MultichainRouter.d.cts +5 -7
  5. package/dist/multichain/MultichainRouter.d.cts.map +1 -1
  6. package/dist/multichain/MultichainRouter.d.mts +5 -7
  7. package/dist/multichain/MultichainRouter.d.mts.map +1 -1
  8. package/dist/multichain/MultichainRouter.mjs +34 -11
  9. package/dist/multichain/MultichainRouter.mjs.map +1 -1
  10. package/dist/services/AbstractExecutionService.cjs +5 -7
  11. package/dist/services/AbstractExecutionService.cjs.map +1 -1
  12. package/dist/services/AbstractExecutionService.d.cts +3 -2
  13. package/dist/services/AbstractExecutionService.d.cts.map +1 -1
  14. package/dist/services/AbstractExecutionService.d.mts +3 -2
  15. package/dist/services/AbstractExecutionService.d.mts.map +1 -1
  16. package/dist/services/AbstractExecutionService.mjs +5 -7
  17. package/dist/services/AbstractExecutionService.mjs.map +1 -1
  18. package/dist/services/iframe/IframeExecutionService.cjs +12 -2
  19. package/dist/services/iframe/IframeExecutionService.cjs.map +1 -1
  20. package/dist/services/iframe/IframeExecutionService.d.cts +1 -1
  21. package/dist/services/iframe/IframeExecutionService.d.cts.map +1 -1
  22. package/dist/services/iframe/IframeExecutionService.d.mts +1 -1
  23. package/dist/services/iframe/IframeExecutionService.d.mts.map +1 -1
  24. package/dist/services/iframe/IframeExecutionService.mjs +12 -2
  25. package/dist/services/iframe/IframeExecutionService.mjs.map +1 -1
  26. package/dist/services/node-js/NodeProcessExecutionService.cjs +1 -1
  27. package/dist/services/node-js/NodeProcessExecutionService.cjs.map +1 -1
  28. package/dist/services/node-js/NodeProcessExecutionService.d.cts +1 -1
  29. package/dist/services/node-js/NodeProcessExecutionService.d.cts.map +1 -1
  30. package/dist/services/node-js/NodeProcessExecutionService.d.mts +1 -1
  31. package/dist/services/node-js/NodeProcessExecutionService.d.mts.map +1 -1
  32. package/dist/services/node-js/NodeProcessExecutionService.mjs +1 -1
  33. package/dist/services/node-js/NodeProcessExecutionService.mjs.map +1 -1
  34. package/dist/services/webview/WebViewExecutionService.cjs +1 -1
  35. package/dist/services/webview/WebViewExecutionService.cjs.map +1 -1
  36. package/dist/services/webview/WebViewExecutionService.d.cts +1 -1
  37. package/dist/services/webview/WebViewExecutionService.d.cts.map +1 -1
  38. package/dist/services/webview/WebViewExecutionService.d.mts +1 -1
  39. package/dist/services/webview/WebViewExecutionService.d.mts.map +1 -1
  40. package/dist/services/webview/WebViewExecutionService.mjs +1 -1
  41. package/dist/services/webview/WebViewExecutionService.mjs.map +1 -1
  42. package/dist/snaps/SnapController.cjs +111 -26
  43. package/dist/snaps/SnapController.cjs.map +1 -1
  44. package/dist/snaps/SnapController.d.cts +10 -17
  45. package/dist/snaps/SnapController.d.cts.map +1 -1
  46. package/dist/snaps/SnapController.d.mts +10 -17
  47. package/dist/snaps/SnapController.d.mts.map +1 -1
  48. package/dist/snaps/SnapController.mjs +111 -26
  49. package/dist/snaps/SnapController.mjs.map +1 -1
  50. package/dist/utils.d.cts +1 -0
  51. package/dist/utils.d.cts.map +1 -1
  52. package/dist/utils.d.mts +1 -0
  53. package/dist/utils.d.mts.map +1 -1
  54. 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,YAAY,CAAC,UAA8C;QACnE,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC;CACF;AA7CD,0DA6CC","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 terminateJob(jobWrapper: TerminateJobArgs<WebViewInterface>): void {\n this.#removeWebView(jobWrapper.id);\n }\n}\n"]}
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;;;;IAc5C,SAAS,CAAC,YAAY,CAAC,UAAU,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,GAAG,IAAI;CAG7E"}
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;;;;IAc5C,SAAS,CAAC,YAAY,CAAC,UAAU,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,GAAG,IAAI;CAG7E"}
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"}
@@ -29,7 +29,7 @@ export class WebViewExecutionService extends AbstractExecutionService {
29
29
  });
30
30
  return { worker: webView, stream };
31
31
  }
32
- terminateJob(jobWrapper) {
32
+ async terminateJob(jobWrapper) {
33
33
  this.#removeWebView(jobWrapper.id);
34
34
  }
35
35
  }
@@ -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,YAAY,CAAC,UAA8C;QACnE,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 terminateJob(jobWrapper: TerminateJobArgs<WebViewInterface>): void {\n this.#removeWebView(jobWrapper.id);\n }\n}\n"]}
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
- constructor({ closeAllConnections, 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, }) {
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
- // Lazily populate the `isReady` state.
311
- this.#ensureCanUsePlatform().catch(snaps_utils_1.logWarning);
312
- this.#callLifecycleHooks(constants_1.METAMASK_ORIGIN, snaps_utils_1.HandlerType.OnStart);
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
- * Checks all installed snaps against the block list and
423
- * blocks/unblocks snaps as appropriate. See {@link SnapController.blockSnap}
424
- * for more information.
436
+ * Trigger an update of the registry.
425
437
  *
426
- * Also updates any preinstalled Snaps to the latest allowlisted version.
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: snap.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