diff --git a/packages/snaps-controllers/coverage.json b/packages/snaps-controllers/coverage.json index eb73c36a0b..8f93da8746 100644 --- a/packages/snaps-controllers/coverage.json +++ b/packages/snaps-controllers/coverage.json @@ -1,6 +1,6 @@ { - "branches": 95.63, - "functions": 98.99, - "lines": 98.88, - "statements": 98.71 + "branches": 95.23, + "functions": 99, + "lines": 98.74, + "statements": 98.58 } diff --git a/packages/snaps-controllers/src/services/AbstractExecutionService.ts b/packages/snaps-controllers/src/services/AbstractExecutionService.ts index 1b6f823747..49758b73f7 100644 --- a/packages/snaps-controllers/src/services/AbstractExecutionService.ts +++ b/packages/snaps-controllers/src/services/AbstractExecutionService.ts @@ -307,8 +307,31 @@ export abstract class AbstractExecutionService }; commandStream.on('data', notificationHandler); + const rpcStream = mux.createStream(SNAP_STREAM_NAMES.JSON_RPC); + rpcStream.on('data', (chunk) => { + if (chunk?.data && hasProperty(chunk?.data, 'id')) { + this.#messenger.publish('ExecutionService:outboundRequest', snapId); + } + }); + + const originalWrite = rpcStream.write.bind(rpcStream); + + // @ts-expect-error Hack to inspect the messages being written to the stream. + rpcStream.write = (chunk, encoding, callback) => { + // Ignore chain switching notifications as it doesn't matter for the SnapProvider. + if (chunk?.data?.method === 'metamask_chainChanged') { + return true; + } + + if (chunk?.data && hasProperty(chunk?.data, 'id')) { + this.#messenger.publish('ExecutionService:outboundResponse', snapId); + } + + return originalWrite(chunk, encoding, callback); + }; + // Typecast: stream type mismatch return { streams: { diff --git a/packages/snaps-execution-environments/coverage.json b/packages/snaps-execution-environments/coverage.json index e4e7ddfae4..4a327b8cc6 100644 --- a/packages/snaps-execution-environments/coverage.json +++ b/packages/snaps-execution-environments/coverage.json @@ -1,6 +1,6 @@ { - "branches": 90.04, - "functions": 94.69, - "lines": 90.42, - "statements": 89.62 + "branches": 90.09, + "functions": 94.73, + "lines": 90.24, + "statements": 89.37 } diff --git a/packages/snaps-execution-environments/src/common/BaseSnapExecutor.test.browser.ts b/packages/snaps-execution-environments/src/common/BaseSnapExecutor.test.browser.ts index 5e1f93575d..a0b358791b 100644 --- a/packages/snaps-execution-environments/src/common/BaseSnapExecutor.test.browser.ts +++ b/packages/snaps-execution-environments/src/common/BaseSnapExecutor.test.browser.ts @@ -189,12 +189,6 @@ describe('BaseSnapExecutor', () => { ], }); - expect(await executor.readCommand()).toStrictEqual({ - jsonrpc: '2.0', - method: 'OutboundRequest', - params: { source: 'ethereum.request' }, - }); - const blockNumRequest = await executor.readRpc(); expect(blockNumRequest).toStrictEqual({ name: 'metamask-provider', @@ -216,12 +210,6 @@ describe('BaseSnapExecutor', () => { }, }); - expect(await executor.readCommand()).toStrictEqual({ - jsonrpc: '2.0', - method: 'OutboundResponse', - params: { source: 'ethereum.request' }, - }); - expect(await executor.readCommand()).toStrictEqual({ id: 2, jsonrpc: '2.0', @@ -255,12 +243,6 @@ describe('BaseSnapExecutor', () => { ], }); - expect(await executor.readCommand()).toStrictEqual({ - jsonrpc: '2.0', - method: 'OutboundRequest', - params: { source: 'snap.request' }, - }); - const walletRequest = await executor.readRpc(); expect(walletRequest).toStrictEqual({ name: 'metamask-provider', @@ -282,12 +264,6 @@ describe('BaseSnapExecutor', () => { }, }); - expect(await executor.readCommand()).toStrictEqual({ - jsonrpc: '2.0', - method: 'OutboundResponse', - params: { source: 'snap.request' }, - }); - expect(await executor.readCommand()).toStrictEqual({ id: 2, jsonrpc: '2.0', @@ -369,12 +345,6 @@ describe('BaseSnapExecutor', () => { ], }); - expect(await executor.readCommand()).toStrictEqual({ - jsonrpc: '2.0', - method: 'OutboundRequest', - params: { source: 'ethereum.request' }, - }); - const blockNumRequest = await executor.readRpc(); expect(blockNumRequest).toStrictEqual({ name: 'metamask-provider', @@ -396,12 +366,6 @@ describe('BaseSnapExecutor', () => { }, }); - expect(await executor.readCommand()).toStrictEqual({ - jsonrpc: '2.0', - method: 'OutboundResponse', - params: { source: 'ethereum.request' }, - }); - expect(await executor.readCommand()).toStrictEqual({ id: 2, jsonrpc: '2.0', @@ -437,12 +401,6 @@ describe('BaseSnapExecutor', () => { ], }); - expect(await executor.readCommand()).toStrictEqual({ - jsonrpc: '2.0', - method: 'OutboundRequest', - params: { source: 'snap.request' }, - }); - const getSnapsRequest = await executor.readRpc(); expect(getSnapsRequest).toStrictEqual({ name: 'metamask-provider', @@ -471,12 +429,6 @@ describe('BaseSnapExecutor', () => { }, }); - expect(await executor.readCommand()).toStrictEqual({ - jsonrpc: '2.0', - method: 'OutboundResponse', - params: { source: 'snap.request' }, - }); - expect(await executor.readCommand()).toStrictEqual({ id: 2, jsonrpc: '2.0', @@ -808,12 +760,6 @@ describe('BaseSnapExecutor', () => { ], }); - expect(await executor.readCommand()).toStrictEqual({ - jsonrpc: '2.0', - method: 'OutboundRequest', - params: { source: 'snap.request' }, - }); - const request = await executor.readRpc(); expect(request).toStrictEqual({ name: 'metamask-provider', @@ -841,12 +787,6 @@ describe('BaseSnapExecutor', () => { }, }); - expect(await executor.readCommand()).toStrictEqual({ - jsonrpc: '2.0', - method: 'OutboundResponse', - params: { source: 'snap.request' }, - }); - expect(await executor.readCommand()).toStrictEqual({ id: 2, jsonrpc: '2.0', @@ -885,12 +825,6 @@ describe('BaseSnapExecutor', () => { ], }); - expect(await executor.readCommand()).toStrictEqual({ - jsonrpc: '2.0', - method: 'OutboundRequest', - params: { source: 'ethereum.request' }, - }); - const request = await executor.readRpc(); expect(request).toStrictEqual({ name: 'metamask-provider', @@ -920,12 +854,6 @@ describe('BaseSnapExecutor', () => { }, }); - expect(await executor.readCommand()).toStrictEqual({ - jsonrpc: '2.0', - method: 'OutboundResponse', - params: { source: 'ethereum.request' }, - }); - expect(await executor.readCommand()).toStrictEqual({ id: 2, jsonrpc: '2.0', @@ -2075,12 +2003,6 @@ describe('BaseSnapExecutor', () => { ], }); - expect(await executor.readCommand()).toStrictEqual({ - jsonrpc: '2.0', - method: 'OutboundRequest', - params: { source: 'ethereum.request' }, - }); - const blockNumRequest = await executor.readRpc(); expect(blockNumRequest).toStrictEqual({ name: 'metamask-provider', @@ -2120,12 +2042,6 @@ describe('BaseSnapExecutor', () => { }, }); - expect(await executor.readCommand()).toStrictEqual({ - jsonrpc: '2.0', - method: 'OutboundResponse', - params: { source: 'ethereum.request' }, - }); - expect(await executor.readCommand()).toStrictEqual({ id: 3, jsonrpc: '2.0', @@ -2184,12 +2100,6 @@ describe('BaseSnapExecutor', () => { ], }); - expect(await executor.readCommand()).toStrictEqual({ - jsonrpc: '2.0', - method: 'OutboundRequest', - params: { source: 'ethereum.request' }, - }); - const blockNumRequest = await executor.readRpc(); expect(blockNumRequest).toStrictEqual({ name: 'metamask-provider', @@ -2232,12 +2142,6 @@ describe('BaseSnapExecutor', () => { }, }); - expect(await executor.readCommand()).toStrictEqual({ - jsonrpc: '2.0', - method: 'OutboundResponse', - params: { source: 'ethereum.request' }, - }); - expect(await executor.readCommand()).toStrictEqual({ id: 3, jsonrpc: '2.0', @@ -2278,12 +2182,6 @@ describe('BaseSnapExecutor', () => { ], }); - expect(await executor.readCommand()).toStrictEqual({ - jsonrpc: '2.0', - method: 'OutboundRequest', - params: { source: 'ethereum.request' }, - }); - const blockNumRequest = await executor.readRpc(); expect(blockNumRequest).toStrictEqual({ name: 'metamask-provider', @@ -2308,12 +2206,6 @@ describe('BaseSnapExecutor', () => { }, }); - expect(await executor.readCommand()).toStrictEqual({ - jsonrpc: '2.0', - method: 'OutboundResponse', - params: { source: 'ethereum.request' }, - }); - expect(await executor.readCommand()).toStrictEqual({ id: 2, jsonrpc: '2.0', diff --git a/packages/snaps-execution-environments/src/common/BaseSnapExecutor.ts b/packages/snaps-execution-environments/src/common/BaseSnapExecutor.ts index 724057521d..96c7a954b1 100644 --- a/packages/snaps-execution-environments/src/common/BaseSnapExecutor.ts +++ b/packages/snaps-execution-environments/src/common/BaseSnapExecutor.ts @@ -529,26 +529,7 @@ export class BaseSnapExecutor { // As part of the sanitization, we validate that the args are valid JSON. const sanitizedArgs = sanitizeRequestArguments(args); assertSnapOutboundRequest(sanitizedArgs); - return await withTeardown( - (async () => { - try { - const promise = originalRequest(sanitizedArgs); - - await this.#notify({ - method: 'OutboundRequest', - params: { source: 'snap.request' }, - }); - - return await promise; - } finally { - await this.#notify({ - method: 'OutboundResponse', - params: { source: 'snap.request' }, - }); - } - })(), - this as any, - ); + return await withTeardown(originalRequest(sanitizedArgs), this as any); }; const snapsProvider = { request } as SnapsProvider; @@ -574,26 +555,7 @@ export class BaseSnapExecutor { // As part of the sanitization, we validate that the args are valid JSON. const sanitizedArgs = sanitizeRequestArguments(args); assertEthereumOutboundRequest(sanitizedArgs); - return await withTeardown( - (async () => { - try { - const promise = originalRequest(sanitizedArgs); - - await this.#notify({ - method: 'OutboundRequest', - params: { source: 'ethereum.request' }, - }); - - return await promise; - } finally { - await this.#notify({ - method: 'OutboundResponse', - params: { source: 'ethereum.request' }, - }); - } - })(), - this as any, - ); + return await withTeardown(originalRequest(sanitizedArgs), this as any); }; const ethereumProvider = { request };