UNPKG

@metamask/snaps-simulation

Version:

A simulation framework for MetaMask Snaps, enabling headless testing of Snaps in a controlled environment

288 lines 10.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getHelpers = void 0; const snaps_utils_1 = require("@metamask/snaps-utils"); const superstruct_1 = require("@metamask/superstruct"); const utils_1 = require("@metamask/utils"); const logger_1 = require("./logger.cjs"); const request_1 = require("./request.cjs"); const store_1 = require("./store/index.cjs"); const structs_1 = require("./structs.cjs"); const log = (0, utils_1.createModuleLogger)(logger_1.rootLogger, 'helpers'); /** * Get the helper functions for the Snap. * * @param snap - The installed Snap. * @param snap.snapId - The ID of the Snap. * @param snap.store - The Redux store. * @param snap.executionService - The execution service. * @param snap.runSaga - The `runSaga` function. * @param snap.controllerMessenger - The controller messenger. * @param snap.options - The simulation options. * @returns The Snap helpers. */ function getHelpers({ snapId, store, executionService, runSaga, controllerMessenger, options, }) { const onTransaction = async (request) => { log('Sending transaction %o.', request); const { origin: transactionOrigin, chainId, ...transaction } = (0, superstruct_1.create)(request, structs_1.TransactionOptionsStruct); const response = await (0, request_1.handleRequest)({ snapId, store, executionService, runSaga, controllerMessenger, simulationOptions: options, handler: snaps_utils_1.HandlerType.OnTransaction, request: { method: '', params: { chainId, transaction, transactionOrigin, }, }, }); (0, structs_1.assertIsResponseWithInterface)(response); return response; }; // This can't be async because it returns a `SnapRequest`. // eslint-disable-next-line @typescript-eslint/promise-function-async const onCronjob = (request) => { log('Running cronjob %o.', options); return (0, request_1.handleRequest)({ snapId, store, executionService, controllerMessenger, simulationOptions: options, runSaga, handler: snaps_utils_1.HandlerType.OnCronjob, request, }); }; // This can't be async because it returns a `SnapRequest`. // eslint-disable-next-line @typescript-eslint/promise-function-async const onKeyringRequest = (request) => { log('Sending keyring request %o.', request); return (0, request_1.handleRequest)({ snapId, store, executionService, runSaga, controllerMessenger, simulationOptions: options, handler: snaps_utils_1.HandlerType.OnKeyringRequest, request, }); }; return { // This can't be async because it returns a `SnapRequest`. // eslint-disable-next-line @typescript-eslint/promise-function-async request: (request) => { log('Sending request %o.', request); return (0, request_1.handleRequest)({ snapId, store, executionService, controllerMessenger, simulationOptions: options, runSaga, handler: snaps_utils_1.HandlerType.OnRpcRequest, request, }); }, onTransaction, sendTransaction: onTransaction, onKeyringRequest, // This can't be async because it returns a `SnapRequest`. // eslint-disable-next-line @typescript-eslint/promise-function-async onInstall: (request) => { log('Running onInstall handler.'); return (0, request_1.handleRequest)({ snapId, store, executionService, controllerMessenger, simulationOptions: options, runSaga, handler: snaps_utils_1.HandlerType.OnInstall, request: { method: '', ...request, }, }); }, // This can't be async because it returns a `SnapRequest`. // eslint-disable-next-line @typescript-eslint/promise-function-async onUpdate: (request) => { log('Running onUpdate handler.'); return (0, request_1.handleRequest)({ snapId, store, executionService, controllerMessenger, simulationOptions: options, runSaga, handler: snaps_utils_1.HandlerType.OnUpdate, request: { method: '', ...request, }, }); }, // This can't be async because it returns a `SnapRequest`. // eslint-disable-next-line @typescript-eslint/promise-function-async onStart: (request) => { log('Running onStart handler.'); return (0, request_1.handleRequest)({ snapId, store, executionService, controllerMessenger, simulationOptions: options, runSaga, handler: snaps_utils_1.HandlerType.OnStart, request: { method: '', ...request, }, }); }, onNameLookup: async (nameLookupOptions) => { log('Requesting name lookup %o.', nameLookupOptions); const params = (0, superstruct_1.create)(nameLookupOptions, structs_1.NameLookupOptionsStruct); const response = await (0, request_1.handleRequest)({ snapId, store, executionService, controllerMessenger, simulationOptions: options, runSaga, handler: snaps_utils_1.HandlerType.OnNameLookup, request: { method: '', params, }, }); return response; }, onSignature: async (request) => { log('Requesting signature %o.', request); const { origin: signatureOrigin, ...signature } = (0, superstruct_1.create)(request, structs_1.SignatureOptionsStruct); const response = await (0, request_1.handleRequest)({ snapId, store, executionService, controllerMessenger, simulationOptions: options, runSaga, handler: snaps_utils_1.HandlerType.OnSignature, request: { method: '', params: { signature, signatureOrigin, }, }, }); (0, structs_1.assertIsResponseWithInterface)(response); return response; }, onCronjob, runCronjob: onCronjob, onBackgroundEvent: onCronjob, onHomePage: async () => { log('Rendering home page.'); const response = await (0, request_1.handleRequest)({ snapId, store, executionService, controllerMessenger, simulationOptions: options, runSaga, handler: snaps_utils_1.HandlerType.OnHomePage, request: { method: '', }, }); (0, structs_1.assertIsResponseWithInterface)(response); return response; }, onSettingsPage: async () => { log('Rendering settings page.'); const response = await (0, request_1.handleRequest)({ snapId, store, executionService, controllerMessenger, simulationOptions: options, runSaga, handler: snaps_utils_1.HandlerType.OnSettingsPage, request: { method: '', }, }); (0, structs_1.assertIsResponseWithInterface)(response); return response; }, onProtocolRequest: async (scope, rawRequest) => { log('Sending protocol request.'); const request = { jsonrpc: '2.0', id: rawRequest.id ?? 1, method: rawRequest.method, ...(rawRequest.params ? { params: rawRequest.params } : {}), }; const response = await (0, request_1.handleRequest)({ snapId, store, executionService, controllerMessenger, simulationOptions: options, runSaga, handler: snaps_utils_1.HandlerType.OnProtocolRequest, request: { origin: rawRequest.origin, method: '', params: { scope, request, }, }, }); return response; }, // This can't be async because it returns a `SnapRequest`. // eslint-disable-next-line @typescript-eslint/promise-function-async onClientRequest: (request) => { log('Sending client request.'); return (0, request_1.handleRequest)({ snapId, store, executionService, controllerMessenger, simulationOptions: options, runSaga, handler: snaps_utils_1.HandlerType.OnClientRequest, request, }); }, mockJsonRpc(mock) { log('Mocking JSON-RPC request %o.', mock); const { method, result } = (0, superstruct_1.create)(mock, structs_1.JsonRpcMockOptionsStruct); store.dispatch((0, store_1.addJsonRpcMock)({ method, result })); return { unmock() { log('Unmocking JSON-RPC request %o.', mock); store.dispatch((0, store_1.removeJsonRpcMock)(method)); }, }; }, close: async () => { log('Closing execution service.'); await executionService.terminateAllSnaps(); }, }; } exports.getHelpers = getHelpers; //# sourceMappingURL=helpers.cjs.map