@metamask/snaps-simulation
Version:
A simulation framework for MetaMask Snaps, enabling headless testing of Snaps in a controlled environment
288 lines • 10.8 kB
JavaScript
"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