@metamask/snaps-execution-environments 5.0.1 → 5.0.3

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 (84) hide show
  1. package/CHANGELOG.md +12 -1
  2. package/dist/browserify/iframe/bundle.js +5 -5
  3. package/dist/browserify/iframe/index.html +3 -0
  4. package/dist/browserify/node-process/bundle.js +7 -4
  5. package/dist/browserify/node-thread/bundle.js +7 -4
  6. package/dist/browserify/webview/bundle.js +4 -4
  7. package/dist/browserify/webview/index.html +3 -0
  8. package/dist/browserify/worker-executor/bundle.js +8 -5
  9. package/dist/browserify/worker-pool/bundle.js +4 -4
  10. package/dist/browserify/worker-pool/index.html +3 -0
  11. package/dist/{chunk-4CGJF3BT.mjs → chunk-3IL5HX3I.mjs} +2 -2
  12. package/dist/{chunk-5FG5IBYT.mjs → chunk-4DDRUOJT.mjs} +2 -2
  13. package/dist/{chunk-USHNZDGV.mjs → chunk-6TRAXSD2.mjs} +2 -2
  14. package/dist/{chunk-ERB7OLAB.mjs → chunk-6TW5IC2Y.mjs} +2 -2
  15. package/dist/{chunk-Z4WSS7YZ.js → chunk-C7XBEPVO.js} +1 -1
  16. package/dist/chunk-C7XBEPVO.js.map +1 -0
  17. package/dist/{chunk-RZNKZRAD.js → chunk-CBFVKEU2.js} +3 -3
  18. package/dist/{chunk-QVIHE3WB.mjs → chunk-DTUHBZ7B.mjs} +3 -3
  19. package/dist/chunk-DTUHBZ7B.mjs.map +1 -0
  20. package/dist/{chunk-Y7MVNOPY.mjs → chunk-G2KQG3ZY.mjs} +2 -2
  21. package/dist/{chunk-PTCQ2I47.mjs → chunk-HBVPZMDK.mjs} +1 -1
  22. package/dist/chunk-HBVPZMDK.mjs.map +1 -0
  23. package/dist/{chunk-MOXNHXPG.js → chunk-HCAXYGTC.js} +3 -3
  24. package/dist/{chunk-3Y4ZRKNE.js → chunk-HP7NXQDB.js} +3 -3
  25. package/dist/{chunk-VKFZ4EB5.mjs → chunk-IEDU7Y5Q.mjs} +2 -2
  26. package/dist/{chunk-JW3JHJ7S.js → chunk-KCIOH4SA.js} +3 -3
  27. package/dist/{chunk-CWIFVPLR.js → chunk-PYVUMOEV.js} +8 -8
  28. package/dist/{chunk-F37LPBJS.js → chunk-QAHK6SLR.js} +3 -3
  29. package/dist/{chunk-DTF6YTIS.js → chunk-S55SWI44.js} +13 -13
  30. package/dist/chunk-S55SWI44.js.map +1 -0
  31. package/dist/{chunk-QJB4J7WL.mjs → chunk-VV2DBGFP.mjs} +2 -2
  32. package/dist/{chunk-44XYIN4N.js → chunk-VYSBMOIL.js} +3 -3
  33. package/dist/common/BaseSnapExecutor.js +6 -6
  34. package/dist/common/BaseSnapExecutor.mjs +5 -5
  35. package/dist/common/endowments/commonEndowmentFactory.js +4 -4
  36. package/dist/common/endowments/commonEndowmentFactory.mjs +3 -3
  37. package/dist/common/endowments/index.js +5 -5
  38. package/dist/common/endowments/index.mjs +4 -4
  39. package/dist/common/endowments/network.js +3 -3
  40. package/dist/common/endowments/network.mjs +2 -2
  41. package/dist/common/utils.js +2 -2
  42. package/dist/common/utils.mjs +1 -1
  43. package/dist/iframe/IFrameSnapExecutor.js +7 -7
  44. package/dist/iframe/IFrameSnapExecutor.mjs +6 -6
  45. package/dist/iframe/index.js +7 -7
  46. package/dist/iframe/index.mjs +6 -6
  47. package/dist/node-process/ChildProcessSnapExecutor.js +7 -7
  48. package/dist/node-process/ChildProcessSnapExecutor.mjs +6 -6
  49. package/dist/node-process/index.js +7 -7
  50. package/dist/node-process/index.mjs +6 -6
  51. package/dist/node-thread/ThreadSnapExecutor.js +7 -7
  52. package/dist/node-thread/ThreadSnapExecutor.mjs +6 -6
  53. package/dist/node-thread/index.js +7 -7
  54. package/dist/node-thread/index.mjs +6 -6
  55. package/dist/tsconfig.build.tsbuildinfo +1 -1
  56. package/dist/types/common/utils.d.ts +1 -2
  57. package/dist/types/common/validation.d.ts +8 -0
  58. package/dist/types/vendor/providers.d.js +1 -0
  59. package/dist/types/vendor/providers.d.js.map +1 -0
  60. package/dist/types/vendor/providers.d.mjs +1 -0
  61. package/dist/types/vendor/providers.d.mjs.map +1 -0
  62. package/dist/webworker/executor/WebWorkerSnapExecutor.js +7 -7
  63. package/dist/webworker/executor/WebWorkerSnapExecutor.mjs +6 -6
  64. package/dist/webworker/executor/index.js +7 -7
  65. package/dist/webworker/executor/index.mjs +6 -6
  66. package/package.json +9 -9
  67. package/dist/chunk-DTF6YTIS.js.map +0 -1
  68. package/dist/chunk-PTCQ2I47.mjs.map +0 -1
  69. package/dist/chunk-QVIHE3WB.mjs.map +0 -1
  70. package/dist/chunk-Z4WSS7YZ.js.map +0 -1
  71. /package/dist/{chunk-4CGJF3BT.mjs.map → chunk-3IL5HX3I.mjs.map} +0 -0
  72. /package/dist/{chunk-5FG5IBYT.mjs.map → chunk-4DDRUOJT.mjs.map} +0 -0
  73. /package/dist/{chunk-USHNZDGV.mjs.map → chunk-6TRAXSD2.mjs.map} +0 -0
  74. /package/dist/{chunk-ERB7OLAB.mjs.map → chunk-6TW5IC2Y.mjs.map} +0 -0
  75. /package/dist/{chunk-RZNKZRAD.js.map → chunk-CBFVKEU2.js.map} +0 -0
  76. /package/dist/{chunk-Y7MVNOPY.mjs.map → chunk-G2KQG3ZY.mjs.map} +0 -0
  77. /package/dist/{chunk-MOXNHXPG.js.map → chunk-HCAXYGTC.js.map} +0 -0
  78. /package/dist/{chunk-3Y4ZRKNE.js.map → chunk-HP7NXQDB.js.map} +0 -0
  79. /package/dist/{chunk-VKFZ4EB5.mjs.map → chunk-IEDU7Y5Q.mjs.map} +0 -0
  80. /package/dist/{chunk-JW3JHJ7S.js.map → chunk-KCIOH4SA.js.map} +0 -0
  81. /package/dist/{chunk-CWIFVPLR.js.map → chunk-PYVUMOEV.js.map} +0 -0
  82. /package/dist/{chunk-F37LPBJS.js.map → chunk-QAHK6SLR.js.map} +0 -0
  83. /package/dist/{chunk-QJB4J7WL.mjs.map → chunk-VV2DBGFP.mjs.map} +0 -0
  84. /package/dist/{chunk-44XYIN4N.js.map → chunk-VYSBMOIL.js.map} +0 -0
@@ -11811,6 +11811,9 @@ function observeImports(map, importName, importIndex) {
11811
11811
  stackFiltering: 'verbose',
11812
11812
  // prevents most common override mistake cases from tripping up users
11813
11813
  overrideTaming: 'severe',
11814
+ // preserves JS locale methods, to avoid confusing users
11815
+ // prevents aliasing: toLocaleString() to toString(), etc
11816
+ localeTaming: 'unsafe',
11814
11817
  }
11815
11818
 
11816
11819
  lockdown(lockdownOptions)
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  withTeardown
3
- } from "./chunk-PTCQ2I47.mjs";
3
+ } from "./chunk-HBVPZMDK.mjs";
4
4
  import {
5
5
  __privateAdd,
6
6
  __privateGet,
@@ -259,4 +259,4 @@ var network_default = endowmentModule;
259
259
  export {
260
260
  network_default
261
261
  };
262
- //# sourceMappingURL=chunk-4CGJF3BT.mjs.map
262
+ //# sourceMappingURL=chunk-3IL5HX3I.mjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  BaseSnapExecutor
3
- } from "./chunk-QVIHE3WB.mjs";
3
+ } from "./chunk-DTUHBZ7B.mjs";
4
4
  import {
5
5
  log
6
6
  } from "./chunk-5DEV3QQU.mjs";
@@ -30,4 +30,4 @@ var ThreadSnapExecutor = class _ThreadSnapExecutor extends BaseSnapExecutor {
30
30
  export {
31
31
  ThreadSnapExecutor
32
32
  };
33
- //# sourceMappingURL=chunk-5FG5IBYT.mjs.map
33
+ //# sourceMappingURL=chunk-4DDRUOJT.mjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  BaseSnapExecutor
3
- } from "./chunk-QVIHE3WB.mjs";
3
+ } from "./chunk-DTUHBZ7B.mjs";
4
4
  import {
5
5
  log
6
6
  } from "./chunk-5DEV3QQU.mjs";
@@ -30,4 +30,4 @@ var ChildProcessSnapExecutor = class _ChildProcessSnapExecutor extends BaseSnapE
30
30
  export {
31
31
  ChildProcessSnapExecutor
32
32
  };
33
- //# sourceMappingURL=chunk-USHNZDGV.mjs.map
33
+ //# sourceMappingURL=chunk-6TRAXSD2.mjs.map
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-BCBKEUCG.mjs";
7
7
  import {
8
8
  network_default
9
- } from "./chunk-4CGJF3BT.mjs";
9
+ } from "./chunk-3IL5HX3I.mjs";
10
10
  import {
11
11
  textDecoder_default
12
12
  } from "./chunk-53ZULHPK.mjs";
@@ -83,4 +83,4 @@ var commonEndowmentFactory_default = buildCommonEndowments;
83
83
  export {
84
84
  commonEndowmentFactory_default
85
85
  };
86
- //# sourceMappingURL=chunk-ERB7OLAB.mjs.map
86
+ //# sourceMappingURL=chunk-6TW5IC2Y.mjs.map
@@ -144,4 +144,4 @@ function isValidResponse(response) {
144
144
 
145
145
 
146
146
  exports.withTeardown = withTeardown; exports.proxyStreamProvider = proxyStreamProvider; exports.BLOCKED_RPC_METHODS = BLOCKED_RPC_METHODS; exports.assertSnapOutboundRequest = assertSnapOutboundRequest; exports.assertEthereumOutboundRequest = assertEthereumOutboundRequest; exports.sanitizeRequestArguments = sanitizeRequestArguments; exports.isValidResponse = isValidResponse;
147
- //# sourceMappingURL=chunk-Z4WSS7YZ.js.map
147
+ //# sourceMappingURL=chunk-C7XBEPVO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/common/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { StreamProvider, RequestArguments } from '@metamask/providers';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport {\n assert,\n assertStruct,\n getJsonSize,\n getSafeJson,\n isObject,\n JsonStruct,\n} from '@metamask/utils';\n\nimport { log } from '../logging';\n\n// 64 MB - we chose this number because it is the size limit for postMessage\n// between the extension and the dapp enforced by Chrome.\nconst MAX_RESPONSE_JSON_SIZE = 64_000_000;\n\n/**\n * Make proxy for Promise and handle the teardown process properly.\n * If the teardown is called in the meanwhile, Promise result will not be\n * exposed to the snap anymore and warning will be logged to the console.\n *\n * @param originalPromise - Original promise.\n * @param teardownRef - Reference containing teardown count.\n * @param teardownRef.lastTeardown - Number of the last teardown.\n * @returns New proxy promise.\n */\nexport async function withTeardown<Type>(\n originalPromise: Promise<Type>,\n teardownRef: { lastTeardown: number },\n): Promise<Type> {\n const myTeardown = teardownRef.lastTeardown;\n return new Promise<Type>((resolve, reject) => {\n originalPromise\n .then((value) => {\n if (teardownRef.lastTeardown === myTeardown) {\n resolve(value);\n } else {\n log(\n 'Late promise received after Snap finished execution. Promise will be dropped.',\n );\n }\n })\n .catch((reason) => {\n if (teardownRef.lastTeardown === myTeardown) {\n reject(reason);\n } else {\n log(\n 'Late promise received after Snap finished execution. Promise will be dropped.',\n );\n }\n });\n });\n}\n\n/**\n * Returns a Proxy that narrows down (attenuates) the fields available on\n * the StreamProvider and replaces the request implementation.\n *\n * @param provider - Instance of a StreamProvider to be limited.\n * @param request - Custom attenuated request object.\n * @returns Proxy to the StreamProvider instance.\n */\nexport function proxyStreamProvider(\n provider: StreamProvider,\n request: unknown,\n): StreamProvider {\n // Proxy target is intentionally set to be an empty object, to ensure\n // that access to the prototype chain is not possible.\n const proxy = new Proxy(\n {},\n {\n has(_target: object, prop: string | symbol) {\n return (\n typeof prop === 'string' &&\n ['request', 'on', 'removeListener'].includes(prop)\n );\n },\n get(_target, prop: keyof StreamProvider) {\n if (prop === 'request') {\n return request;\n } else if (['on', 'removeListener'].includes(prop)) {\n return provider[prop];\n }\n\n return undefined;\n },\n },\n );\n\n return proxy as StreamProvider;\n}\n\n// We're blocking these RPC methods for v1, will revisit later.\nexport const BLOCKED_RPC_METHODS = Object.freeze([\n 'wallet_requestSnaps',\n 'wallet_requestPermissions',\n 'wallet_revokePermissions',\n // We disallow all of these confirmations for now, since the screens are not ready for Snaps.\n 'eth_sendRawTransaction',\n 'eth_sendTransaction',\n 'eth_sign',\n 'eth_signTypedData',\n 'eth_signTypedData_v1',\n 'eth_signTypedData_v3',\n 'eth_signTypedData_v4',\n 'eth_decrypt',\n 'eth_getEncryptionPublicKey',\n 'wallet_addEthereumChain',\n 'wallet_switchEthereumChain',\n 'wallet_watchAsset',\n 'wallet_registerOnboarding',\n 'wallet_scanQRCode',\n]);\n\n/**\n * Asserts the validity of request arguments for a snap outbound request using the `snap.request` API.\n *\n * @param args - The arguments to validate.\n */\nexport function assertSnapOutboundRequest(args: RequestArguments) {\n // Disallow any non `wallet_` or `snap_` methods for separation of concerns.\n assert(\n String.prototype.startsWith.call(args.method, 'wallet_') ||\n String.prototype.startsWith.call(args.method, 'snap_'),\n 'The global Snap API only allows RPC methods starting with `wallet_*` and `snap_*`.',\n rpcErrors.methodNotSupported,\n );\n assert(\n !BLOCKED_RPC_METHODS.includes(args.method),\n rpcErrors.methodNotFound({\n data: {\n method: args.method,\n },\n }),\n );\n assertStruct(\n args,\n JsonStruct,\n 'Provided value is not JSON-RPC compatible',\n rpcErrors.invalidParams,\n );\n}\n\n/**\n * Asserts the validity of request arguments for an ethereum outbound request using the `ethereum.request` API.\n *\n * @param args - The arguments to validate.\n */\nexport function assertEthereumOutboundRequest(args: RequestArguments) {\n // Disallow snaps methods for separation of concerns.\n assert(\n !String.prototype.startsWith.call(args.method, 'snap_'),\n rpcErrors.methodNotFound({\n data: {\n method: args.method,\n },\n }),\n );\n assert(\n !BLOCKED_RPC_METHODS.includes(args.method),\n rpcErrors.methodNotFound({\n data: {\n method: args.method,\n },\n }),\n );\n assertStruct(\n args,\n JsonStruct,\n 'Provided value is not JSON-RPC compatible',\n rpcErrors.invalidParams,\n );\n}\n\n/**\n * Gets a sanitized value to be used for passing to the underlying MetaMask provider.\n *\n * @param value - An unsanitized value from a snap.\n * @returns A sanitized value ready to be passed to a MetaMask provider.\n */\nexport function sanitizeRequestArguments(value: unknown): RequestArguments {\n // Before passing to getSafeJson we run the value through JSON serialization.\n // This lets request arguments contain undefined which is normally disallowed.\n const json = JSON.parse(JSON.stringify(value));\n return getSafeJson(json) as RequestArguments;\n}\n\n/**\n * Check if the input is a valid response.\n *\n * @param response - The response.\n * @returns True if the response is valid, otherwise false.\n */\nexport function isValidResponse(response: Record<string, unknown>) {\n if (!isObject(response)) {\n return false;\n }\n\n try {\n // If the JSON is invalid this will throw and we should return false.\n const size = getJsonSize(response);\n return size < MAX_RESPONSE_JSON_SIZE;\n } catch {\n return false;\n }\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2
2
 
3
- var _chunkDTF6YTISjs = require('./chunk-DTF6YTIS.js');
3
+ var _chunkS55SWI44js = require('./chunk-S55SWI44.js');
4
4
 
5
5
 
6
6
  var _chunkZ7BOREC4js = require('./chunk-Z7BOREC4.js');
@@ -10,7 +10,7 @@ var _objectmultiplex = require('@metamask/object-multiplex'); var _objectmultipl
10
10
  var _postmessagestream = require('@metamask/post-message-stream');
11
11
  var _snapsutils = require('@metamask/snaps-utils');
12
12
  var _readablestream = require('readable-stream');
13
- var WebWorkerSnapExecutor = class _WebWorkerSnapExecutor extends _chunkDTF6YTISjs.BaseSnapExecutor {
13
+ var WebWorkerSnapExecutor = class _WebWorkerSnapExecutor extends _chunkS55SWI44js.BaseSnapExecutor {
14
14
  /**
15
15
  * Initialize the WebWorkerSnapExecutor. This creates a post message stream
16
16
  * from and to the parent window, for two-way communication with the iframe.
@@ -37,4 +37,4 @@ var WebWorkerSnapExecutor = class _WebWorkerSnapExecutor extends _chunkDTF6YTISj
37
37
 
38
38
 
39
39
  exports.WebWorkerSnapExecutor = WebWorkerSnapExecutor;
40
- //# sourceMappingURL=chunk-RZNKZRAD.js.map
40
+ //# sourceMappingURL=chunk-CBFVKEU2.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createEndowments
3
- } from "./chunk-QJB4J7WL.mjs";
3
+ } from "./chunk-VV2DBGFP.mjs";
4
4
  import {
5
5
  assertEthereumOutboundRequest,
6
6
  assertSnapOutboundRequest,
@@ -8,7 +8,7 @@ import {
8
8
  proxyStreamProvider,
9
9
  sanitizeRequestArguments,
10
10
  withTeardown
11
- } from "./chunk-PTCQ2I47.mjs";
11
+ } from "./chunk-HBVPZMDK.mjs";
12
12
  import {
13
13
  log
14
14
  } from "./chunk-5DEV3QQU.mjs";
@@ -481,4 +481,4 @@ respond_fn = async function(id, response) {
481
481
  export {
482
482
  BaseSnapExecutor
483
483
  };
484
- //# sourceMappingURL=chunk-QVIHE3WB.mjs.map
484
+ //# sourceMappingURL=chunk-DTUHBZ7B.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/common/BaseSnapExecutor.ts"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/triple-slash-reference, spaced-comment\n/// <reference path=\"../../../../node_modules/ses/types.d.ts\" />\nimport { createIdRemapMiddleware } from '@metamask/json-rpc-engine';\nimport type { RequestArguments } from '@metamask/providers';\nimport { StreamProvider } from '@metamask/providers/dist/StreamProvider';\nimport { errorCodes, rpcErrors, serializeError } from '@metamask/rpc-errors';\nimport type { SnapsProvider } from '@metamask/snaps-sdk';\nimport { getErrorData } from '@metamask/snaps-sdk';\nimport type {\n SnapExports,\n HandlerType,\n SnapExportsParameters,\n} from '@metamask/snaps-utils';\nimport {\n SNAP_EXPORT_NAMES,\n logError,\n SNAP_EXPORTS,\n WrappedSnapError,\n unwrapError,\n logInfo,\n} from '@metamask/snaps-utils';\nimport type {\n JsonRpcNotification,\n JsonRpcId,\n JsonRpcRequest,\n Json,\n} from '@metamask/utils';\nimport {\n assert,\n isJsonRpcRequest,\n hasProperty,\n getSafeJson,\n JsonRpcIdStruct,\n} from '@metamask/utils';\nimport type { Duplex } from 'readable-stream';\nimport { validate, is } from 'superstruct';\n\nimport { log } from '../logging';\nimport type { CommandMethodsMapping } from './commands';\nimport { getCommandMethodImplementations } from './commands';\nimport { createEndowments } from './endowments';\nimport { addEventListener, removeEventListener } from './globalEvents';\nimport { sortParamKeys } from './sortParams';\nimport {\n assertEthereumOutboundRequest,\n assertSnapOutboundRequest,\n sanitizeRequestArguments,\n proxyStreamProvider,\n withTeardown,\n isValidResponse,\n} from './utils';\nimport {\n ExecuteSnapRequestArgumentsStruct,\n PingRequestArgumentsStruct,\n SnapRpcRequestArgumentsStruct,\n TerminateRequestArgumentsStruct,\n} from './validation';\n\ntype EvaluationData = {\n stop: () => void;\n};\n\ntype SnapData = {\n exports: SnapExports;\n runningEvaluations: Set<EvaluationData>;\n idleTeardown: () => Promise<void>;\n};\n\nconst fallbackError = {\n code: errorCodes.rpc.internal,\n message: 'Execution Environment Error',\n};\n\nconst unhandledError = rpcErrors\n .internal<Json>({\n message: 'Unhandled Snap Error',\n })\n .serialize();\n\nexport type InvokeSnapArgs = Omit<SnapExportsParameters[0], 'chainId'>;\n\nexport type InvokeSnap = (\n target: string,\n handler: HandlerType,\n args: InvokeSnapArgs | undefined,\n) => Promise<Json>;\n\n/**\n * The supported methods in the execution environment. The validator checks the\n * incoming JSON-RPC request, and the `params` property is used for sorting the\n * parameters, if they are an object.\n */\nconst EXECUTION_ENVIRONMENT_METHODS = {\n ping: {\n struct: PingRequestArgumentsStruct,\n params: [],\n },\n executeSnap: {\n struct: ExecuteSnapRequestArgumentsStruct,\n params: ['snapId', 'sourceCode', 'endowments'],\n },\n terminate: {\n struct: TerminateRequestArgumentsStruct,\n params: [],\n },\n snapRpc: {\n struct: SnapRpcRequestArgumentsStruct,\n params: ['target', 'handler', 'origin', 'request'],\n },\n};\n\ntype Methods = typeof EXECUTION_ENVIRONMENT_METHODS;\n\nexport type NotifyFunction = (\n notification: Omit<JsonRpcNotification, 'jsonrpc'>,\n) => Promise<void>;\n\nexport class BaseSnapExecutor {\n private readonly snapData: Map<string, SnapData>;\n\n private readonly commandStream: Duplex;\n\n private readonly rpcStream: Duplex;\n\n private readonly methods: CommandMethodsMapping;\n\n private snapErrorHandler?: (event: ErrorEvent) => void;\n\n private snapPromiseErrorHandler?: (event: PromiseRejectionEvent) => void;\n\n private lastTeardown = 0;\n\n protected constructor(commandStream: Duplex, rpcStream: Duplex) {\n this.snapData = new Map();\n this.commandStream = commandStream;\n this.commandStream.on('data', (data) => {\n this.onCommandRequest(data).catch((error) => {\n // TODO: Decide how to handle errors.\n logError(error);\n });\n });\n this.rpcStream = rpcStream;\n\n this.methods = getCommandMethodImplementations(\n this.startSnap.bind(this),\n async (target, handlerType, args) => {\n const data = this.snapData.get(target);\n // We're capturing the handler in case someone modifies the data object\n // before the call.\n const handler = data?.exports[handlerType];\n const { required } = SNAP_EXPORTS[handlerType];\n\n assert(\n !required || handler !== undefined,\n `No ${handlerType} handler exported for snap \"${target}`,\n rpcErrors.methodNotSupported,\n );\n\n // Certain handlers are not required. If they are not exported, we\n // return null.\n if (!handler) {\n return null;\n }\n\n let result = await this.executeInSnapContext(target, () =>\n // TODO: fix handler args type cast\n handler(args as any),\n );\n\n // The handler might not return anything, but undefined is not valid JSON.\n if (result === undefined) {\n result = null;\n }\n\n // /!\\ Always return only sanitized JSON to prevent security flaws. /!\\\n try {\n return getSafeJson(result);\n } catch (error) {\n throw rpcErrors.internal(\n `Received non-JSON-serializable value: ${error.message.replace(\n /^Assertion failed: /u,\n '',\n )}`,\n );\n }\n },\n this.onTerminate.bind(this),\n );\n }\n\n private errorHandler(error: unknown, data: Record<string, Json>) {\n const serializedError = serializeError(error, {\n fallbackError: unhandledError,\n shouldIncludeStack: false,\n });\n\n const errorData = getErrorData(serializedError);\n\n this.#notify({\n method: 'UnhandledError',\n params: {\n error: {\n ...serializedError,\n data: {\n ...errorData,\n ...data,\n },\n },\n },\n }).catch((notifyError) => {\n logError(notifyError);\n });\n }\n\n private async onCommandRequest(message: JsonRpcRequest) {\n if (!isJsonRpcRequest(message)) {\n if (\n hasProperty(message, 'id') &&\n is((message as Pick<JsonRpcRequest, 'id'>).id, JsonRpcIdStruct)\n ) {\n // Instead of throwing, we directly respond with an error.\n // We can only do this if the message ID is still valid.\n await this.#write({\n error: serializeError(\n rpcErrors.internal(\n 'JSON-RPC requests must be JSON serializable objects.',\n ),\n ),\n id: (message as Pick<JsonRpcRequest, 'id'>).id,\n jsonrpc: '2.0',\n });\n } else {\n logInfo(\n 'Command stream received a non-JSON-RPC request, and was unable to respond.',\n );\n }\n return;\n }\n\n const { id, method, params } = message;\n\n if (!hasProperty(EXECUTION_ENVIRONMENT_METHODS, method)) {\n await this.#respond(id, {\n error: rpcErrors\n .methodNotFound({\n data: {\n method,\n },\n })\n .serialize(),\n });\n return;\n }\n\n const methodObject = EXECUTION_ENVIRONMENT_METHODS[method as keyof Methods];\n\n // support params by-name and by-position\n const paramsAsArray = sortParamKeys(methodObject.params, params);\n\n const [error] = validate<any, any>(paramsAsArray, methodObject.struct);\n if (error) {\n await this.#respond(id, {\n error: rpcErrors\n .invalidParams({\n message: `Invalid parameters for method \"${method}\": ${error.message}.`,\n data: {\n method,\n params: paramsAsArray,\n },\n })\n .serialize(),\n });\n return;\n }\n\n try {\n const result = await (this.methods as any)[method](...paramsAsArray);\n await this.#respond(id, { result });\n } catch (rpcError) {\n await this.#respond(id, {\n error: serializeError(rpcError, {\n fallbackError,\n }),\n });\n }\n }\n\n // Awaitable function that writes back to the command stream\n // To prevent snap execution from blocking writing we wrap in a promise\n // and await it before continuing execution\n async #write(chunk: Json) {\n return new Promise<void>((resolve, reject) => {\n this.commandStream.write(chunk, (error) => {\n if (error) {\n reject(error);\n return;\n }\n resolve();\n });\n });\n }\n\n async #notify(notification: Omit<JsonRpcNotification, 'jsonrpc'>) {\n if (!isValidResponse(notification)) {\n throw rpcErrors.internal(\n 'JSON-RPC notifications must be JSON serializable objects smaller than 64 MB.',\n );\n }\n\n await this.#write({\n ...notification,\n jsonrpc: '2.0',\n });\n }\n\n async #respond(id: JsonRpcId, response: Record<string, unknown>) {\n if (!isValidResponse(response)) {\n // Instead of throwing, we directly respond with an error.\n // This prevents an issue where we wouldn't respond when errors were non-serializable\n await this.#write({\n error: serializeError(\n rpcErrors.internal(\n 'JSON-RPC responses must be JSON serializable objects smaller than 64 MB.',\n ),\n ),\n id,\n jsonrpc: '2.0',\n });\n return;\n }\n\n await this.#write({\n ...response,\n id,\n jsonrpc: '2.0',\n });\n }\n\n /**\n * Attempts to evaluate a snap in SES. Generates APIs for the snap. May throw\n * on errors.\n *\n * @param snapId - The id of the snap.\n * @param sourceCode - The source code of the snap, in IIFE format.\n * @param _endowments - An array of the names of the endowments.\n */\n protected async startSnap(\n snapId: string,\n sourceCode: string,\n _endowments: string[],\n ): Promise<void> {\n log(`Starting snap '${snapId}' in worker.`);\n if (this.snapPromiseErrorHandler) {\n removeEventListener('unhandledrejection', this.snapPromiseErrorHandler);\n }\n\n if (this.snapErrorHandler) {\n removeEventListener('error', this.snapErrorHandler);\n }\n\n this.snapErrorHandler = (error: ErrorEvent) => {\n this.errorHandler(error.error, { snapId });\n };\n\n this.snapPromiseErrorHandler = (error: PromiseRejectionEvent) => {\n this.errorHandler(error instanceof Error ? error : error.reason, {\n snapId,\n });\n };\n\n const provider = new StreamProvider(this.rpcStream, {\n jsonRpcStreamName: 'metamask-provider',\n rpcMiddleware: [createIdRemapMiddleware()],\n });\n\n await provider.initialize();\n\n const snap = this.createSnapGlobal(provider);\n const ethereum = this.createEIP1193Provider(provider);\n // We specifically use any type because the Snap can modify the object any way they want\n const snapModule: any = { exports: {} };\n\n try {\n const { endowments, teardown: endowmentTeardown } = createEndowments({\n snap,\n ethereum,\n snapId,\n endowments: _endowments,\n notify: this.#notify.bind(this),\n });\n\n // !!! Ensure that this is the only place the data is being set.\n // Other methods access the object value and mutate its properties.\n this.snapData.set(snapId, {\n idleTeardown: endowmentTeardown,\n runningEvaluations: new Set(),\n exports: {},\n });\n\n addEventListener('unhandledRejection', this.snapPromiseErrorHandler);\n addEventListener('error', this.snapErrorHandler);\n\n const compartment = new Compartment({\n ...endowments,\n module: snapModule,\n exports: snapModule.exports,\n });\n\n // All of those are JavaScript runtime specific and self referential,\n // but we add them for compatibility sake with external libraries.\n //\n // We can't do that in the injected globals object above\n // because SES creates its own globalThis\n compartment.globalThis.self = compartment.globalThis;\n compartment.globalThis.global = compartment.globalThis;\n compartment.globalThis.window = compartment.globalThis;\n\n await this.executeInSnapContext(snapId, () => {\n compartment.evaluate(sourceCode);\n this.registerSnapExports(snapId, snapModule);\n });\n } catch (error) {\n this.removeSnap(snapId);\n\n const [cause] = unwrapError(error);\n throw rpcErrors.internal({\n message: `Error while running snap '${snapId}': ${cause.message}`,\n data: {\n cause: cause.serialize(),\n },\n });\n }\n }\n\n /**\n * Cancels all running evaluations of all snaps and clears all snap data.\n * NOTE:** Should only be called in response to the `terminate` RPC command.\n */\n protected onTerminate() {\n // `stop()` tears down snap endowments.\n // Teardown will also be run for each snap as soon as there are\n // no more running evaluations for that snap.\n this.snapData.forEach((data) =>\n data.runningEvaluations.forEach((evaluation) => evaluation.stop()),\n );\n this.snapData.clear();\n }\n\n private registerSnapExports(snapId: string, snapModule: any) {\n const data = this.snapData.get(snapId);\n // Somebody deleted the snap before we could register.\n if (!data) {\n return;\n }\n\n data.exports = SNAP_EXPORT_NAMES.reduce((acc, exportName) => {\n const snapExport = snapModule.exports[exportName];\n const { validator } = SNAP_EXPORTS[exportName];\n if (validator(snapExport)) {\n return { ...acc, [exportName]: snapExport };\n }\n return acc;\n }, {});\n }\n\n /**\n * Instantiates a snap API object (i.e. `globalThis.snap`).\n *\n * @param provider - A StreamProvider connected to MetaMask.\n * @returns The snap provider object.\n */\n private createSnapGlobal(provider: StreamProvider): SnapsProvider {\n const originalRequest = provider.request.bind(provider);\n\n const request = async (args: RequestArguments) => {\n const sanitizedArgs = sanitizeRequestArguments(args);\n assertSnapOutboundRequest(sanitizedArgs);\n return await withTeardown(\n (async () => {\n await this.#notify({\n method: 'OutboundRequest',\n params: { source: 'snap.request' },\n });\n try {\n return await originalRequest(sanitizedArgs);\n } finally {\n await this.#notify({\n method: 'OutboundResponse',\n params: { source: 'snap.request' },\n });\n }\n })(),\n this as any,\n );\n };\n\n // Proxy target is intentionally set to be an empty object, to ensure\n // that access to the prototype chain is not possible.\n const snapGlobalProxy = new Proxy(\n {},\n {\n has(_target: object, prop: string | symbol) {\n return typeof prop === 'string' && ['request'].includes(prop);\n },\n get(_target, prop: keyof StreamProvider) {\n if (prop === 'request') {\n return request;\n }\n\n return undefined;\n },\n },\n ) as SnapsProvider;\n\n return harden(snapGlobalProxy);\n }\n\n /**\n * Instantiates an EIP-1193 Ethereum provider object (i.e. `globalThis.ethereum`).\n *\n * @param provider - A StreamProvider connected to MetaMask.\n * @returns The EIP-1193 Ethereum provider object.\n */\n private createEIP1193Provider(provider: StreamProvider): StreamProvider {\n const originalRequest = provider.request.bind(provider);\n\n const request = async (args: RequestArguments) => {\n const sanitizedArgs = sanitizeRequestArguments(args);\n assertEthereumOutboundRequest(sanitizedArgs);\n return await withTeardown(\n (async () => {\n await this.#notify({\n method: 'OutboundRequest',\n params: { source: 'ethereum.request' },\n });\n try {\n return await originalRequest(sanitizedArgs);\n } finally {\n await this.#notify({\n method: 'OutboundResponse',\n params: { source: 'ethereum.request' },\n });\n }\n })(),\n this as any,\n );\n };\n\n const streamProviderProxy = proxyStreamProvider(provider, request);\n\n return harden(streamProviderProxy);\n }\n\n /**\n * Removes the snap with the given name.\n *\n * @param snapId - The id of the snap to remove.\n */\n private removeSnap(snapId: string): void {\n this.snapData.delete(snapId);\n }\n\n /**\n * Calls the specified executor function in the context of the specified snap.\n * Essentially, this means that the operation performed by the executor is\n * counted as an evaluation of the specified snap. When the count of running\n * evaluations of a snap reaches zero, its endowments are torn down.\n *\n * @param snapId - The id of the snap whose context to execute in.\n * @param executor - The function that will be executed in the snap's context.\n * @returns The executor's return value.\n * @template Result - The return value of the executor.\n */\n private async executeInSnapContext<Result>(\n snapId: string,\n executor: () => Promise<Result> | Result,\n ): Promise<Result> {\n const data = this.snapData.get(snapId);\n if (data === undefined) {\n throw rpcErrors.internal(\n `Tried to execute in context of unknown snap: \"${snapId}\".`,\n );\n }\n\n let stop: () => void;\n const stopPromise = new Promise<never>(\n (_, reject) =>\n (stop = () =>\n reject(\n // TODO(rekmarks): Specify / standardize error code for this case.\n rpcErrors.internal(\n `The snap \"${snapId}\" has been terminated during execution.`,\n ),\n )),\n );\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const evaluationData = { stop: stop! };\n\n try {\n data.runningEvaluations.add(evaluationData);\n // Notice that we have to await this executor.\n // If we didn't, we would decrease the amount of running evaluations\n // before the promise actually resolves\n return await Promise.race([executor(), stopPromise]);\n } catch (error) {\n throw new WrappedSnapError(error);\n } finally {\n data.runningEvaluations.delete(evaluationData);\n\n if (data.runningEvaluations.size === 0) {\n this.lastTeardown += 1;\n await data.idleTeardown();\n }\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  BaseSnapExecutor
3
- } from "./chunk-QVIHE3WB.mjs";
3
+ } from "./chunk-DTUHBZ7B.mjs";
4
4
  import {
5
5
  log
6
6
  } from "./chunk-5DEV3QQU.mjs";
@@ -42,4 +42,4 @@ var IFrameSnapExecutor = class _IFrameSnapExecutor extends BaseSnapExecutor {
42
42
  export {
43
43
  IFrameSnapExecutor
44
44
  };
45
- //# sourceMappingURL=chunk-Y7MVNOPY.mjs.map
45
+ //# sourceMappingURL=chunk-G2KQG3ZY.mjs.map
@@ -144,4 +144,4 @@ export {
144
144
  sanitizeRequestArguments,
145
145
  isValidResponse
146
146
  };
147
- //# sourceMappingURL=chunk-PTCQ2I47.mjs.map
147
+ //# sourceMappingURL=chunk-HBVPZMDK.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/common/utils.ts"],"sourcesContent":["import type { StreamProvider, RequestArguments } from '@metamask/providers';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport {\n assert,\n assertStruct,\n getJsonSize,\n getSafeJson,\n isObject,\n JsonStruct,\n} from '@metamask/utils';\n\nimport { log } from '../logging';\n\n// 64 MB - we chose this number because it is the size limit for postMessage\n// between the extension and the dapp enforced by Chrome.\nconst MAX_RESPONSE_JSON_SIZE = 64_000_000;\n\n/**\n * Make proxy for Promise and handle the teardown process properly.\n * If the teardown is called in the meanwhile, Promise result will not be\n * exposed to the snap anymore and warning will be logged to the console.\n *\n * @param originalPromise - Original promise.\n * @param teardownRef - Reference containing teardown count.\n * @param teardownRef.lastTeardown - Number of the last teardown.\n * @returns New proxy promise.\n */\nexport async function withTeardown<Type>(\n originalPromise: Promise<Type>,\n teardownRef: { lastTeardown: number },\n): Promise<Type> {\n const myTeardown = teardownRef.lastTeardown;\n return new Promise<Type>((resolve, reject) => {\n originalPromise\n .then((value) => {\n if (teardownRef.lastTeardown === myTeardown) {\n resolve(value);\n } else {\n log(\n 'Late promise received after Snap finished execution. Promise will be dropped.',\n );\n }\n })\n .catch((reason) => {\n if (teardownRef.lastTeardown === myTeardown) {\n reject(reason);\n } else {\n log(\n 'Late promise received after Snap finished execution. Promise will be dropped.',\n );\n }\n });\n });\n}\n\n/**\n * Returns a Proxy that narrows down (attenuates) the fields available on\n * the StreamProvider and replaces the request implementation.\n *\n * @param provider - Instance of a StreamProvider to be limited.\n * @param request - Custom attenuated request object.\n * @returns Proxy to the StreamProvider instance.\n */\nexport function proxyStreamProvider(\n provider: StreamProvider,\n request: unknown,\n): StreamProvider {\n // Proxy target is intentionally set to be an empty object, to ensure\n // that access to the prototype chain is not possible.\n const proxy = new Proxy(\n {},\n {\n has(_target: object, prop: string | symbol) {\n return (\n typeof prop === 'string' &&\n ['request', 'on', 'removeListener'].includes(prop)\n );\n },\n get(_target, prop: keyof StreamProvider) {\n if (prop === 'request') {\n return request;\n } else if (['on', 'removeListener'].includes(prop)) {\n return provider[prop];\n }\n\n return undefined;\n },\n },\n );\n\n return proxy as StreamProvider;\n}\n\n// We're blocking these RPC methods for v1, will revisit later.\nexport const BLOCKED_RPC_METHODS = Object.freeze([\n 'wallet_requestSnaps',\n 'wallet_requestPermissions',\n 'wallet_revokePermissions',\n // We disallow all of these confirmations for now, since the screens are not ready for Snaps.\n 'eth_sendRawTransaction',\n 'eth_sendTransaction',\n 'eth_sign',\n 'eth_signTypedData',\n 'eth_signTypedData_v1',\n 'eth_signTypedData_v3',\n 'eth_signTypedData_v4',\n 'eth_decrypt',\n 'eth_getEncryptionPublicKey',\n 'wallet_addEthereumChain',\n 'wallet_switchEthereumChain',\n 'wallet_watchAsset',\n 'wallet_registerOnboarding',\n 'wallet_scanQRCode',\n]);\n\n/**\n * Asserts the validity of request arguments for a snap outbound request using the `snap.request` API.\n *\n * @param args - The arguments to validate.\n */\nexport function assertSnapOutboundRequest(args: RequestArguments) {\n // Disallow any non `wallet_` or `snap_` methods for separation of concerns.\n assert(\n String.prototype.startsWith.call(args.method, 'wallet_') ||\n String.prototype.startsWith.call(args.method, 'snap_'),\n 'The global Snap API only allows RPC methods starting with `wallet_*` and `snap_*`.',\n rpcErrors.methodNotSupported,\n );\n assert(\n !BLOCKED_RPC_METHODS.includes(args.method),\n rpcErrors.methodNotFound({\n data: {\n method: args.method,\n },\n }),\n );\n assertStruct(\n args,\n JsonStruct,\n 'Provided value is not JSON-RPC compatible',\n rpcErrors.invalidParams,\n );\n}\n\n/**\n * Asserts the validity of request arguments for an ethereum outbound request using the `ethereum.request` API.\n *\n * @param args - The arguments to validate.\n */\nexport function assertEthereumOutboundRequest(args: RequestArguments) {\n // Disallow snaps methods for separation of concerns.\n assert(\n !String.prototype.startsWith.call(args.method, 'snap_'),\n rpcErrors.methodNotFound({\n data: {\n method: args.method,\n },\n }),\n );\n assert(\n !BLOCKED_RPC_METHODS.includes(args.method),\n rpcErrors.methodNotFound({\n data: {\n method: args.method,\n },\n }),\n );\n assertStruct(\n args,\n JsonStruct,\n 'Provided value is not JSON-RPC compatible',\n rpcErrors.invalidParams,\n );\n}\n\n/**\n * Gets a sanitized value to be used for passing to the underlying MetaMask provider.\n *\n * @param value - An unsanitized value from a snap.\n * @returns A sanitized value ready to be passed to a MetaMask provider.\n */\nexport function sanitizeRequestArguments(value: unknown): RequestArguments {\n // Before passing to getSafeJson we run the value through JSON serialization.\n // This lets request arguments contain undefined which is normally disallowed.\n const json = JSON.parse(JSON.stringify(value));\n return getSafeJson(json) as RequestArguments;\n}\n\n/**\n * Check if the input is a valid response.\n *\n * @param response - The response.\n * @returns True if the response is valid, otherwise false.\n */\nexport function isValidResponse(response: Record<string, unknown>) {\n if (!isObject(response)) {\n return false;\n }\n\n try {\n // If the JSON is invalid this will throw and we should return false.\n const size = getJsonSize(response);\n return size < MAX_RESPONSE_JSON_SIZE;\n } catch {\n return false;\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunk44XYIN4Njs = require('./chunk-44XYIN4N.js');
3
+ var _chunkVYSBMOILjs = require('./chunk-VYSBMOIL.js');
4
4
 
5
5
 
6
6
  var _chunkDLLLH5HNjs = require('./chunk-DLLLH5HN.js');
@@ -9,7 +9,7 @@ var _chunkDLLLH5HNjs = require('./chunk-DLLLH5HN.js');
9
9
  var _rpcerrors = require('@metamask/rpc-errors');
10
10
  var _snapsutils = require('@metamask/snaps-utils');
11
11
  var _utils = require('@metamask/utils');
12
- var registeredEndowments = _chunk44XYIN4Njs.commonEndowmentFactory_default.call(void 0, );
12
+ var registeredEndowments = _chunkVYSBMOILjs.commonEndowmentFactory_default.call(void 0, );
13
13
  var endowmentFactories = registeredEndowments.reduce((factories, builder) => {
14
14
  builder.names.forEach((name) => {
15
15
  factories.set(name, builder.factory);
@@ -64,4 +64,4 @@ function createEndowments({
64
64
 
65
65
 
66
66
  exports.createEndowments = createEndowments;
67
- //# sourceMappingURL=chunk-MOXNHXPG.js.map
67
+ //# sourceMappingURL=chunk-HCAXYGTC.js.map
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2
2
 
3
- var _chunkDTF6YTISjs = require('./chunk-DTF6YTIS.js');
3
+ var _chunkS55SWI44js = require('./chunk-S55SWI44.js');
4
4
 
5
5
 
6
6
  var _chunkZ7BOREC4js = require('./chunk-Z7BOREC4.js');
@@ -10,7 +10,7 @@ var _objectmultiplex = require('@metamask/object-multiplex'); var _objectmultipl
10
10
  var _postmessagestream = require('@metamask/post-message-stream');
11
11
  var _snapsutils = require('@metamask/snaps-utils');
12
12
  var _readablestream = require('readable-stream');
13
- var ThreadSnapExecutor = class _ThreadSnapExecutor extends _chunkDTF6YTISjs.BaseSnapExecutor {
13
+ var ThreadSnapExecutor = class _ThreadSnapExecutor extends _chunkS55SWI44js.BaseSnapExecutor {
14
14
  static initialize() {
15
15
  _chunkZ7BOREC4js.log.call(void 0, "Worker: Connecting to parent.");
16
16
  const parentStream = new (0, _postmessagestream.ThreadMessageStream)();
@@ -30,4 +30,4 @@ var ThreadSnapExecutor = class _ThreadSnapExecutor extends _chunkDTF6YTISjs.Base
30
30
 
31
31
 
32
32
  exports.ThreadSnapExecutor = ThreadSnapExecutor;
33
- //# sourceMappingURL=chunk-3Y4ZRKNE.js.map
33
+ //# sourceMappingURL=chunk-HP7NXQDB.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  BaseSnapExecutor
3
- } from "./chunk-QVIHE3WB.mjs";
3
+ } from "./chunk-DTUHBZ7B.mjs";
4
4
  import {
5
5
  log
6
6
  } from "./chunk-5DEV3QQU.mjs";
@@ -37,4 +37,4 @@ var WebWorkerSnapExecutor = class _WebWorkerSnapExecutor extends BaseSnapExecuto
37
37
  export {
38
38
  WebWorkerSnapExecutor
39
39
  };
40
- //# sourceMappingURL=chunk-VKFZ4EB5.mjs.map
40
+ //# sourceMappingURL=chunk-IEDU7Y5Q.mjs.map
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2
2
 
3
- var _chunkDTF6YTISjs = require('./chunk-DTF6YTIS.js');
3
+ var _chunkS55SWI44js = require('./chunk-S55SWI44.js');
4
4
 
5
5
 
6
6
  var _chunkZ7BOREC4js = require('./chunk-Z7BOREC4.js');
@@ -10,7 +10,7 @@ var _objectmultiplex = require('@metamask/object-multiplex'); var _objectmultipl
10
10
  var _postmessagestream = require('@metamask/post-message-stream');
11
11
  var _snapsutils = require('@metamask/snaps-utils');
12
12
  var _readablestream = require('readable-stream');
13
- var IFrameSnapExecutor = class _IFrameSnapExecutor extends _chunkDTF6YTISjs.BaseSnapExecutor {
13
+ var IFrameSnapExecutor = class _IFrameSnapExecutor extends _chunkS55SWI44js.BaseSnapExecutor {
14
14
  /**
15
15
  * Initialize the IFrameSnapExecutor. This creates a post message stream from
16
16
  * and to the parent window, for two-way communication with the iframe.
@@ -42,4 +42,4 @@ var IFrameSnapExecutor = class _IFrameSnapExecutor extends _chunkDTF6YTISjs.Base
42
42
 
43
43
 
44
44
  exports.IFrameSnapExecutor = IFrameSnapExecutor;
45
- //# sourceMappingURL=chunk-JW3JHJ7S.js.map
45
+ //# sourceMappingURL=chunk-KCIOH4SA.js.map
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkZ4WSS7YZjs = require('./chunk-Z4WSS7YZ.js');
3
+ var _chunkC7XBEPVOjs = require('./chunk-C7XBEPVO.js');
4
4
 
5
5
 
6
6
 
@@ -49,7 +49,7 @@ var _ResponseWrapper = class _ResponseWrapper {
49
49
  return _chunkEXN2TFDJjs.__privateGet.call(void 0, this, _ogResponse).url;
50
50
  }
51
51
  async text() {
52
- return await _chunkZ4WSS7YZjs.withTeardown.call(void 0,
52
+ return await _chunkC7XBEPVOjs.withTeardown.call(void 0,
53
53
  (async () => {
54
54
  await _chunkEXN2TFDJjs.__privateGet.call(void 0, this, _onStart).call(this);
55
55
  try {
@@ -62,7 +62,7 @@ var _ResponseWrapper = class _ResponseWrapper {
62
62
  );
63
63
  }
64
64
  async arrayBuffer() {
65
- return await _chunkZ4WSS7YZjs.withTeardown.call(void 0,
65
+ return await _chunkC7XBEPVOjs.withTeardown.call(void 0,
66
66
  (async () => {
67
67
  await _chunkEXN2TFDJjs.__privateGet.call(void 0, this, _onStart).call(this);
68
68
  try {
@@ -75,7 +75,7 @@ var _ResponseWrapper = class _ResponseWrapper {
75
75
  );
76
76
  }
77
77
  async blob() {
78
- return await _chunkZ4WSS7YZjs.withTeardown.call(void 0,
78
+ return await _chunkC7XBEPVOjs.withTeardown.call(void 0,
79
79
  (async () => {
80
80
  await _chunkEXN2TFDJjs.__privateGet.call(void 0, this, _onStart).call(this);
81
81
  try {
@@ -97,7 +97,7 @@ var _ResponseWrapper = class _ResponseWrapper {
97
97
  );
98
98
  }
99
99
  async formData() {
100
- return await _chunkZ4WSS7YZjs.withTeardown.call(void 0,
100
+ return await _chunkC7XBEPVOjs.withTeardown.call(void 0,
101
101
  (async () => {
102
102
  await _chunkEXN2TFDJjs.__privateGet.call(void 0, this, _onStart).call(this);
103
103
  try {
@@ -110,7 +110,7 @@ var _ResponseWrapper = class _ResponseWrapper {
110
110
  );
111
111
  }
112
112
  async json() {
113
- return await _chunkZ4WSS7YZjs.withTeardown.call(void 0,
113
+ return await _chunkC7XBEPVOjs.withTeardown.call(void 0,
114
114
  (async () => {
115
115
  await _chunkEXN2TFDJjs.__privateGet.call(void 0, this, _onStart).call(this);
116
116
  try {
@@ -170,7 +170,7 @@ var createNetwork = ({ notify } = {}) => {
170
170
  };
171
171
  let res;
172
172
  let openFetchConnection;
173
- return await _chunkZ4WSS7YZjs.withTeardown.call(void 0,
173
+ return await _chunkC7XBEPVOjs.withTeardown.call(void 0,
174
174
  (async () => {
175
175
  try {
176
176
  await notify({
@@ -259,4 +259,4 @@ var network_default = endowmentModule;
259
259
 
260
260
 
261
261
  exports.network_default = network_default;
262
- //# sourceMappingURL=chunk-CWIFVPLR.js.map
262
+ //# sourceMappingURL=chunk-PYVUMOEV.js.map
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2
2
 
3
- var _chunkDTF6YTISjs = require('./chunk-DTF6YTIS.js');
3
+ var _chunkS55SWI44js = require('./chunk-S55SWI44.js');
4
4
 
5
5
 
6
6
  var _chunkZ7BOREC4js = require('./chunk-Z7BOREC4.js');
@@ -10,7 +10,7 @@ var _objectmultiplex = require('@metamask/object-multiplex'); var _objectmultipl
10
10
  var _postmessagestream = require('@metamask/post-message-stream');
11
11
  var _snapsutils = require('@metamask/snaps-utils');
12
12
  var _readablestream = require('readable-stream');
13
- var ChildProcessSnapExecutor = class _ChildProcessSnapExecutor extends _chunkDTF6YTISjs.BaseSnapExecutor {
13
+ var ChildProcessSnapExecutor = class _ChildProcessSnapExecutor extends _chunkS55SWI44js.BaseSnapExecutor {
14
14
  static initialize() {
15
15
  _chunkZ7BOREC4js.log.call(void 0, "Worker: Connecting to parent.");
16
16
  const parentStream = new (0, _postmessagestream.ProcessMessageStream)();
@@ -30,4 +30,4 @@ var ChildProcessSnapExecutor = class _ChildProcessSnapExecutor extends _chunkDTF
30
30
 
31
31
 
32
32
  exports.ChildProcessSnapExecutor = ChildProcessSnapExecutor;
33
- //# sourceMappingURL=chunk-F37LPBJS.js.map
33
+ //# sourceMappingURL=chunk-QAHK6SLR.js.map
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkMOXNHXPGjs = require('./chunk-MOXNHXPG.js');
3
+ var _chunkHCAXYGTCjs = require('./chunk-HCAXYGTC.js');
4
4
 
5
5
 
6
6
 
@@ -8,7 +8,7 @@ var _chunkMOXNHXPGjs = require('./chunk-MOXNHXPG.js');
8
8
 
9
9
 
10
10
 
11
- var _chunkZ4WSS7YZjs = require('./chunk-Z4WSS7YZ.js');
11
+ var _chunkC7XBEPVOjs = require('./chunk-C7XBEPVO.js');
12
12
 
13
13
 
14
14
  var _chunkZ7BOREC4js = require('./chunk-Z7BOREC4.js');
@@ -245,7 +245,7 @@ var BaseSnapExecutor = class {
245
245
  const ethereum = this.createEIP1193Provider(provider);
246
246
  const snapModule = { exports: {} };
247
247
  try {
248
- const { endowments, teardown: endowmentTeardown } = _chunkMOXNHXPGjs.createEndowments.call(void 0, {
248
+ const { endowments, teardown: endowmentTeardown } = _chunkHCAXYGTCjs.createEndowments.call(void 0, {
249
249
  snap,
250
250
  ethereum,
251
251
  snapId,
@@ -315,9 +315,9 @@ var BaseSnapExecutor = class {
315
315
  createSnapGlobal(provider) {
316
316
  const originalRequest = provider.request.bind(provider);
317
317
  const request = async (args) => {
318
- const sanitizedArgs = _chunkZ4WSS7YZjs.sanitizeRequestArguments.call(void 0, args);
319
- _chunkZ4WSS7YZjs.assertSnapOutboundRequest.call(void 0, sanitizedArgs);
320
- return await _chunkZ4WSS7YZjs.withTeardown.call(void 0,
318
+ const sanitizedArgs = _chunkC7XBEPVOjs.sanitizeRequestArguments.call(void 0, args);
319
+ _chunkC7XBEPVOjs.assertSnapOutboundRequest.call(void 0, sanitizedArgs);
320
+ return await _chunkC7XBEPVOjs.withTeardown.call(void 0,
321
321
  (async () => {
322
322
  await _chunkEXN2TFDJjs.__privateMethod.call(void 0, this, _notify, notify_fn).call(this, {
323
323
  method: "OutboundRequest",
@@ -360,9 +360,9 @@ var BaseSnapExecutor = class {
360
360
  createEIP1193Provider(provider) {
361
361
  const originalRequest = provider.request.bind(provider);
362
362
  const request = async (args) => {
363
- const sanitizedArgs = _chunkZ4WSS7YZjs.sanitizeRequestArguments.call(void 0, args);
364
- _chunkZ4WSS7YZjs.assertEthereumOutboundRequest.call(void 0, sanitizedArgs);
365
- return await _chunkZ4WSS7YZjs.withTeardown.call(void 0,
363
+ const sanitizedArgs = _chunkC7XBEPVOjs.sanitizeRequestArguments.call(void 0, args);
364
+ _chunkC7XBEPVOjs.assertEthereumOutboundRequest.call(void 0, sanitizedArgs);
365
+ return await _chunkC7XBEPVOjs.withTeardown.call(void 0,
366
366
  (async () => {
367
367
  await _chunkEXN2TFDJjs.__privateMethod.call(void 0, this, _notify, notify_fn).call(this, {
368
368
  method: "OutboundRequest",
@@ -380,7 +380,7 @@ var BaseSnapExecutor = class {
380
380
  this
381
381
  );
382
382
  };
383
- const streamProviderProxy = _chunkZ4WSS7YZjs.proxyStreamProvider.call(void 0, provider, request);
383
+ const streamProviderProxy = _chunkC7XBEPVOjs.proxyStreamProvider.call(void 0, provider, request);
384
384
  return harden(streamProviderProxy);
385
385
  }
386
386
  /**
@@ -447,7 +447,7 @@ write_fn = async function(chunk) {
447
447
  };
448
448
  _notify = new WeakSet();
449
449
  notify_fn = async function(notification) {
450
- if (!_chunkZ4WSS7YZjs.isValidResponse.call(void 0, notification)) {
450
+ if (!_chunkC7XBEPVOjs.isValidResponse.call(void 0, notification)) {
451
451
  throw _rpcerrors.rpcErrors.internal(
452
452
  "JSON-RPC notifications must be JSON serializable objects smaller than 64 MB."
453
453
  );
@@ -459,7 +459,7 @@ notify_fn = async function(notification) {
459
459
  };
460
460
  _respond = new WeakSet();
461
461
  respond_fn = async function(id, response) {
462
- if (!_chunkZ4WSS7YZjs.isValidResponse.call(void 0, response)) {
462
+ if (!_chunkC7XBEPVOjs.isValidResponse.call(void 0, response)) {
463
463
  await _chunkEXN2TFDJjs.__privateMethod.call(void 0, this, _write, write_fn).call(this, {
464
464
  error: _rpcerrors.serializeError.call(void 0,
465
465
  _rpcerrors.rpcErrors.internal(
@@ -481,4 +481,4 @@ respond_fn = async function(id, response) {
481
481
 
482
482
 
483
483
  exports.BaseSnapExecutor = BaseSnapExecutor;
484
- //# sourceMappingURL=chunk-DTF6YTIS.js.map
484
+ //# sourceMappingURL=chunk-S55SWI44.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/common/BaseSnapExecutor.ts"],"names":[],"mappings":"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","sourcesContent":["// eslint-disable-next-line @typescript-eslint/triple-slash-reference, spaced-comment\n/// <reference path=\"../../../../node_modules/ses/types.d.ts\" />\nimport { createIdRemapMiddleware } from '@metamask/json-rpc-engine';\nimport type { RequestArguments } from '@metamask/providers';\nimport { StreamProvider } from '@metamask/providers/dist/StreamProvider';\nimport { errorCodes, rpcErrors, serializeError } from '@metamask/rpc-errors';\nimport type { SnapsProvider } from '@metamask/snaps-sdk';\nimport { getErrorData } from '@metamask/snaps-sdk';\nimport type {\n SnapExports,\n HandlerType,\n SnapExportsParameters,\n} from '@metamask/snaps-utils';\nimport {\n SNAP_EXPORT_NAMES,\n logError,\n SNAP_EXPORTS,\n WrappedSnapError,\n unwrapError,\n logInfo,\n} from '@metamask/snaps-utils';\nimport type {\n JsonRpcNotification,\n JsonRpcId,\n JsonRpcRequest,\n Json,\n} from '@metamask/utils';\nimport {\n assert,\n isJsonRpcRequest,\n hasProperty,\n getSafeJson,\n JsonRpcIdStruct,\n} from '@metamask/utils';\nimport type { Duplex } from 'readable-stream';\nimport { validate, is } from 'superstruct';\n\nimport { log } from '../logging';\nimport type { CommandMethodsMapping } from './commands';\nimport { getCommandMethodImplementations } from './commands';\nimport { createEndowments } from './endowments';\nimport { addEventListener, removeEventListener } from './globalEvents';\nimport { sortParamKeys } from './sortParams';\nimport {\n assertEthereumOutboundRequest,\n assertSnapOutboundRequest,\n sanitizeRequestArguments,\n proxyStreamProvider,\n withTeardown,\n isValidResponse,\n} from './utils';\nimport {\n ExecuteSnapRequestArgumentsStruct,\n PingRequestArgumentsStruct,\n SnapRpcRequestArgumentsStruct,\n TerminateRequestArgumentsStruct,\n} from './validation';\n\ntype EvaluationData = {\n stop: () => void;\n};\n\ntype SnapData = {\n exports: SnapExports;\n runningEvaluations: Set<EvaluationData>;\n idleTeardown: () => Promise<void>;\n};\n\nconst fallbackError = {\n code: errorCodes.rpc.internal,\n message: 'Execution Environment Error',\n};\n\nconst unhandledError = rpcErrors\n .internal<Json>({\n message: 'Unhandled Snap Error',\n })\n .serialize();\n\nexport type InvokeSnapArgs = Omit<SnapExportsParameters[0], 'chainId'>;\n\nexport type InvokeSnap = (\n target: string,\n handler: HandlerType,\n args: InvokeSnapArgs | undefined,\n) => Promise<Json>;\n\n/**\n * The supported methods in the execution environment. The validator checks the\n * incoming JSON-RPC request, and the `params` property is used for sorting the\n * parameters, if they are an object.\n */\nconst EXECUTION_ENVIRONMENT_METHODS = {\n ping: {\n struct: PingRequestArgumentsStruct,\n params: [],\n },\n executeSnap: {\n struct: ExecuteSnapRequestArgumentsStruct,\n params: ['snapId', 'sourceCode', 'endowments'],\n },\n terminate: {\n struct: TerminateRequestArgumentsStruct,\n params: [],\n },\n snapRpc: {\n struct: SnapRpcRequestArgumentsStruct,\n params: ['target', 'handler', 'origin', 'request'],\n },\n};\n\ntype Methods = typeof EXECUTION_ENVIRONMENT_METHODS;\n\nexport type NotifyFunction = (\n notification: Omit<JsonRpcNotification, 'jsonrpc'>,\n) => Promise<void>;\n\nexport class BaseSnapExecutor {\n private readonly snapData: Map<string, SnapData>;\n\n private readonly commandStream: Duplex;\n\n private readonly rpcStream: Duplex;\n\n private readonly methods: CommandMethodsMapping;\n\n private snapErrorHandler?: (event: ErrorEvent) => void;\n\n private snapPromiseErrorHandler?: (event: PromiseRejectionEvent) => void;\n\n private lastTeardown = 0;\n\n protected constructor(commandStream: Duplex, rpcStream: Duplex) {\n this.snapData = new Map();\n this.commandStream = commandStream;\n this.commandStream.on('data', (data) => {\n this.onCommandRequest(data).catch((error) => {\n // TODO: Decide how to handle errors.\n logError(error);\n });\n });\n this.rpcStream = rpcStream;\n\n this.methods = getCommandMethodImplementations(\n this.startSnap.bind(this),\n async (target, handlerType, args) => {\n const data = this.snapData.get(target);\n // We're capturing the handler in case someone modifies the data object\n // before the call.\n const handler = data?.exports[handlerType];\n const { required } = SNAP_EXPORTS[handlerType];\n\n assert(\n !required || handler !== undefined,\n `No ${handlerType} handler exported for snap \"${target}`,\n rpcErrors.methodNotSupported,\n );\n\n // Certain handlers are not required. If they are not exported, we\n // return null.\n if (!handler) {\n return null;\n }\n\n let result = await this.executeInSnapContext(target, () =>\n // TODO: fix handler args type cast\n handler(args as any),\n );\n\n // The handler might not return anything, but undefined is not valid JSON.\n if (result === undefined) {\n result = null;\n }\n\n // /!\\ Always return only sanitized JSON to prevent security flaws. /!\\\n try {\n return getSafeJson(result);\n } catch (error) {\n throw rpcErrors.internal(\n `Received non-JSON-serializable value: ${error.message.replace(\n /^Assertion failed: /u,\n '',\n )}`,\n );\n }\n },\n this.onTerminate.bind(this),\n );\n }\n\n private errorHandler(error: unknown, data: Record<string, Json>) {\n const serializedError = serializeError(error, {\n fallbackError: unhandledError,\n shouldIncludeStack: false,\n });\n\n const errorData = getErrorData(serializedError);\n\n this.#notify({\n method: 'UnhandledError',\n params: {\n error: {\n ...serializedError,\n data: {\n ...errorData,\n ...data,\n },\n },\n },\n }).catch((notifyError) => {\n logError(notifyError);\n });\n }\n\n private async onCommandRequest(message: JsonRpcRequest) {\n if (!isJsonRpcRequest(message)) {\n if (\n hasProperty(message, 'id') &&\n is((message as Pick<JsonRpcRequest, 'id'>).id, JsonRpcIdStruct)\n ) {\n // Instead of throwing, we directly respond with an error.\n // We can only do this if the message ID is still valid.\n await this.#write({\n error: serializeError(\n rpcErrors.internal(\n 'JSON-RPC requests must be JSON serializable objects.',\n ),\n ),\n id: (message as Pick<JsonRpcRequest, 'id'>).id,\n jsonrpc: '2.0',\n });\n } else {\n logInfo(\n 'Command stream received a non-JSON-RPC request, and was unable to respond.',\n );\n }\n return;\n }\n\n const { id, method, params } = message;\n\n if (!hasProperty(EXECUTION_ENVIRONMENT_METHODS, method)) {\n await this.#respond(id, {\n error: rpcErrors\n .methodNotFound({\n data: {\n method,\n },\n })\n .serialize(),\n });\n return;\n }\n\n const methodObject = EXECUTION_ENVIRONMENT_METHODS[method as keyof Methods];\n\n // support params by-name and by-position\n const paramsAsArray = sortParamKeys(methodObject.params, params);\n\n const [error] = validate<any, any>(paramsAsArray, methodObject.struct);\n if (error) {\n await this.#respond(id, {\n error: rpcErrors\n .invalidParams({\n message: `Invalid parameters for method \"${method}\": ${error.message}.`,\n data: {\n method,\n params: paramsAsArray,\n },\n })\n .serialize(),\n });\n return;\n }\n\n try {\n const result = await (this.methods as any)[method](...paramsAsArray);\n await this.#respond(id, { result });\n } catch (rpcError) {\n await this.#respond(id, {\n error: serializeError(rpcError, {\n fallbackError,\n }),\n });\n }\n }\n\n // Awaitable function that writes back to the command stream\n // To prevent snap execution from blocking writing we wrap in a promise\n // and await it before continuing execution\n async #write(chunk: Json) {\n return new Promise<void>((resolve, reject) => {\n this.commandStream.write(chunk, (error) => {\n if (error) {\n reject(error);\n return;\n }\n resolve();\n });\n });\n }\n\n async #notify(notification: Omit<JsonRpcNotification, 'jsonrpc'>) {\n if (!isValidResponse(notification)) {\n throw rpcErrors.internal(\n 'JSON-RPC notifications must be JSON serializable objects smaller than 64 MB.',\n );\n }\n\n await this.#write({\n ...notification,\n jsonrpc: '2.0',\n });\n }\n\n async #respond(id: JsonRpcId, response: Record<string, unknown>) {\n if (!isValidResponse(response)) {\n // Instead of throwing, we directly respond with an error.\n // This prevents an issue where we wouldn't respond when errors were non-serializable\n await this.#write({\n error: serializeError(\n rpcErrors.internal(\n 'JSON-RPC responses must be JSON serializable objects smaller than 64 MB.',\n ),\n ),\n id,\n jsonrpc: '2.0',\n });\n return;\n }\n\n await this.#write({\n ...response,\n id,\n jsonrpc: '2.0',\n });\n }\n\n /**\n * Attempts to evaluate a snap in SES. Generates APIs for the snap. May throw\n * on errors.\n *\n * @param snapId - The id of the snap.\n * @param sourceCode - The source code of the snap, in IIFE format.\n * @param _endowments - An array of the names of the endowments.\n */\n protected async startSnap(\n snapId: string,\n sourceCode: string,\n _endowments: string[],\n ): Promise<void> {\n log(`Starting snap '${snapId}' in worker.`);\n if (this.snapPromiseErrorHandler) {\n removeEventListener('unhandledrejection', this.snapPromiseErrorHandler);\n }\n\n if (this.snapErrorHandler) {\n removeEventListener('error', this.snapErrorHandler);\n }\n\n this.snapErrorHandler = (error: ErrorEvent) => {\n this.errorHandler(error.error, { snapId });\n };\n\n this.snapPromiseErrorHandler = (error: PromiseRejectionEvent) => {\n this.errorHandler(error instanceof Error ? error : error.reason, {\n snapId,\n });\n };\n\n const provider = new StreamProvider(this.rpcStream, {\n jsonRpcStreamName: 'metamask-provider',\n rpcMiddleware: [createIdRemapMiddleware()],\n });\n\n await provider.initialize();\n\n const snap = this.createSnapGlobal(provider);\n const ethereum = this.createEIP1193Provider(provider);\n // We specifically use any type because the Snap can modify the object any way they want\n const snapModule: any = { exports: {} };\n\n try {\n const { endowments, teardown: endowmentTeardown } = createEndowments({\n snap,\n ethereum,\n snapId,\n endowments: _endowments,\n notify: this.#notify.bind(this),\n });\n\n // !!! Ensure that this is the only place the data is being set.\n // Other methods access the object value and mutate its properties.\n this.snapData.set(snapId, {\n idleTeardown: endowmentTeardown,\n runningEvaluations: new Set(),\n exports: {},\n });\n\n addEventListener('unhandledRejection', this.snapPromiseErrorHandler);\n addEventListener('error', this.snapErrorHandler);\n\n const compartment = new Compartment({\n ...endowments,\n module: snapModule,\n exports: snapModule.exports,\n });\n\n // All of those are JavaScript runtime specific and self referential,\n // but we add them for compatibility sake with external libraries.\n //\n // We can't do that in the injected globals object above\n // because SES creates its own globalThis\n compartment.globalThis.self = compartment.globalThis;\n compartment.globalThis.global = compartment.globalThis;\n compartment.globalThis.window = compartment.globalThis;\n\n await this.executeInSnapContext(snapId, () => {\n compartment.evaluate(sourceCode);\n this.registerSnapExports(snapId, snapModule);\n });\n } catch (error) {\n this.removeSnap(snapId);\n\n const [cause] = unwrapError(error);\n throw rpcErrors.internal({\n message: `Error while running snap '${snapId}': ${cause.message}`,\n data: {\n cause: cause.serialize(),\n },\n });\n }\n }\n\n /**\n * Cancels all running evaluations of all snaps and clears all snap data.\n * NOTE:** Should only be called in response to the `terminate` RPC command.\n */\n protected onTerminate() {\n // `stop()` tears down snap endowments.\n // Teardown will also be run for each snap as soon as there are\n // no more running evaluations for that snap.\n this.snapData.forEach((data) =>\n data.runningEvaluations.forEach((evaluation) => evaluation.stop()),\n );\n this.snapData.clear();\n }\n\n private registerSnapExports(snapId: string, snapModule: any) {\n const data = this.snapData.get(snapId);\n // Somebody deleted the snap before we could register.\n if (!data) {\n return;\n }\n\n data.exports = SNAP_EXPORT_NAMES.reduce((acc, exportName) => {\n const snapExport = snapModule.exports[exportName];\n const { validator } = SNAP_EXPORTS[exportName];\n if (validator(snapExport)) {\n return { ...acc, [exportName]: snapExport };\n }\n return acc;\n }, {});\n }\n\n /**\n * Instantiates a snap API object (i.e. `globalThis.snap`).\n *\n * @param provider - A StreamProvider connected to MetaMask.\n * @returns The snap provider object.\n */\n private createSnapGlobal(provider: StreamProvider): SnapsProvider {\n const originalRequest = provider.request.bind(provider);\n\n const request = async (args: RequestArguments) => {\n const sanitizedArgs = sanitizeRequestArguments(args);\n assertSnapOutboundRequest(sanitizedArgs);\n return await withTeardown(\n (async () => {\n await this.#notify({\n method: 'OutboundRequest',\n params: { source: 'snap.request' },\n });\n try {\n return await originalRequest(sanitizedArgs);\n } finally {\n await this.#notify({\n method: 'OutboundResponse',\n params: { source: 'snap.request' },\n });\n }\n })(),\n this as any,\n );\n };\n\n // Proxy target is intentionally set to be an empty object, to ensure\n // that access to the prototype chain is not possible.\n const snapGlobalProxy = new Proxy(\n {},\n {\n has(_target: object, prop: string | symbol) {\n return typeof prop === 'string' && ['request'].includes(prop);\n },\n get(_target, prop: keyof StreamProvider) {\n if (prop === 'request') {\n return request;\n }\n\n return undefined;\n },\n },\n ) as SnapsProvider;\n\n return harden(snapGlobalProxy);\n }\n\n /**\n * Instantiates an EIP-1193 Ethereum provider object (i.e. `globalThis.ethereum`).\n *\n * @param provider - A StreamProvider connected to MetaMask.\n * @returns The EIP-1193 Ethereum provider object.\n */\n private createEIP1193Provider(provider: StreamProvider): StreamProvider {\n const originalRequest = provider.request.bind(provider);\n\n const request = async (args: RequestArguments) => {\n const sanitizedArgs = sanitizeRequestArguments(args);\n assertEthereumOutboundRequest(sanitizedArgs);\n return await withTeardown(\n (async () => {\n await this.#notify({\n method: 'OutboundRequest',\n params: { source: 'ethereum.request' },\n });\n try {\n return await originalRequest(sanitizedArgs);\n } finally {\n await this.#notify({\n method: 'OutboundResponse',\n params: { source: 'ethereum.request' },\n });\n }\n })(),\n this as any,\n );\n };\n\n const streamProviderProxy = proxyStreamProvider(provider, request);\n\n return harden(streamProviderProxy);\n }\n\n /**\n * Removes the snap with the given name.\n *\n * @param snapId - The id of the snap to remove.\n */\n private removeSnap(snapId: string): void {\n this.snapData.delete(snapId);\n }\n\n /**\n * Calls the specified executor function in the context of the specified snap.\n * Essentially, this means that the operation performed by the executor is\n * counted as an evaluation of the specified snap. When the count of running\n * evaluations of a snap reaches zero, its endowments are torn down.\n *\n * @param snapId - The id of the snap whose context to execute in.\n * @param executor - The function that will be executed in the snap's context.\n * @returns The executor's return value.\n * @template Result - The return value of the executor.\n */\n private async executeInSnapContext<Result>(\n snapId: string,\n executor: () => Promise<Result> | Result,\n ): Promise<Result> {\n const data = this.snapData.get(snapId);\n if (data === undefined) {\n throw rpcErrors.internal(\n `Tried to execute in context of unknown snap: \"${snapId}\".`,\n );\n }\n\n let stop: () => void;\n const stopPromise = new Promise<never>(\n (_, reject) =>\n (stop = () =>\n reject(\n // TODO(rekmarks): Specify / standardize error code for this case.\n rpcErrors.internal(\n `The snap \"${snapId}\" has been terminated during execution.`,\n ),\n )),\n );\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const evaluationData = { stop: stop! };\n\n try {\n data.runningEvaluations.add(evaluationData);\n // Notice that we have to await this executor.\n // If we didn't, we would decrease the amount of running evaluations\n // before the promise actually resolves\n return await Promise.race([executor(), stopPromise]);\n } catch (error) {\n throw new WrappedSnapError(error);\n } finally {\n data.runningEvaluations.delete(evaluationData);\n\n if (data.runningEvaluations.size === 0) {\n this.lastTeardown += 1;\n await data.idleTeardown();\n }\n }\n }\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  commonEndowmentFactory_default
3
- } from "./chunk-ERB7OLAB.mjs";
3
+ } from "./chunk-6TW5IC2Y.mjs";
4
4
  import {
5
5
  rootRealmGlobal
6
6
  } from "./chunk-IX5S3V47.mjs";
@@ -64,4 +64,4 @@ function createEndowments({
64
64
  export {
65
65
  createEndowments
66
66
  };
67
- //# sourceMappingURL=chunk-QJB4J7WL.mjs.map
67
+ //# sourceMappingURL=chunk-VV2DBGFP.mjs.map
@@ -6,7 +6,7 @@ var _chunkHKHW6TTXjs = require('./chunk-HKHW6TTX.js');
6
6
  var _chunkMS2LQQYHjs = require('./chunk-MS2LQQYH.js');
7
7
 
8
8
 
9
- var _chunkCWIFVPLRjs = require('./chunk-CWIFVPLR.js');
9
+ var _chunkPYVUMOEVjs = require('./chunk-PYVUMOEV.js');
10
10
 
11
11
 
12
12
  var _chunkFOEAIF5Ujs = require('./chunk-FOEAIF5U.js');
@@ -57,7 +57,7 @@ var buildCommonEndowments = () => {
57
57
  _chunkHGLRZZ56js.crypto_default,
58
58
  _chunkHKHW6TTXjs.interval_default,
59
59
  _chunkMS2LQQYHjs.math_default,
60
- _chunkCWIFVPLRjs.network_default,
60
+ _chunkPYVUMOEVjs.network_default,
61
61
  _chunkB3JZNNZDjs.timeout_default,
62
62
  _chunkFOEAIF5Ujs.textDecoder_default,
63
63
  _chunkLO5ORVRCjs.textEncoder_default,
@@ -83,4 +83,4 @@ var commonEndowmentFactory_default = buildCommonEndowments;
83
83
 
84
84
 
85
85
  exports.commonEndowmentFactory_default = commonEndowmentFactory_default;
86
- //# sourceMappingURL=chunk-44XYIN4N.js.map
86
+ //# sourceMappingURL=chunk-VYSBMOIL.js.map