Skip to content

Commit 5052aaa

Browse files
perf: Remove unnecessary proxy for provider globals (#2850)
Removes unnecessary proxy wrapping of provider globals to reduce complexity and overhead.
1 parent 96a29cb commit 5052aaa

File tree

5 files changed

+19
-51
lines changed

5 files changed

+19
-51
lines changed
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
2-
"branches": 80.27,
3-
"functions": 90.13,
4-
"lines": 90.77,
5-
"statements": 90.15
2+
"branches": 80.55,
3+
"functions": 89.26,
4+
"lines": 90.66,
5+
"statements": 90.05
66
}

packages/snaps-execution-environments/src/common/BaseSnapExecutor.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { createIdRemapMiddleware } from '@metamask/json-rpc-engine';
44
import type { RequestArguments } from '@metamask/providers';
55
import { StreamProvider } from '@metamask/providers/stream-provider';
66
import { errorCodes, rpcErrors, serializeError } from '@metamask/rpc-errors';
7-
import type { SnapsProvider } from '@metamask/snaps-sdk';
7+
import type { SnapsEthereumProvider, SnapsProvider } from '@metamask/snaps-sdk';
88
import { getErrorData } from '@metamask/snaps-sdk';
99
import type {
1010
SnapExports,
@@ -45,7 +45,6 @@ import {
4545
assertEthereumOutboundRequest,
4646
assertSnapOutboundRequest,
4747
sanitizeRequestArguments,
48-
proxyStreamProvider,
4948
withTeardown,
5049
isValidResponse,
5150
} from './utils';
@@ -500,9 +499,9 @@ export class BaseSnapExecutor {
500499
);
501500
};
502501

503-
const snapGlobalProxy = proxyStreamProvider(request) as SnapsProvider;
502+
const snapsProvider = { request } as SnapsProvider;
504503

505-
return harden(snapGlobalProxy);
504+
return harden(snapsProvider);
506505
}
507506

508507
/**
@@ -511,7 +510,9 @@ export class BaseSnapExecutor {
511510
* @param provider - A StreamProvider connected to MetaMask.
512511
* @returns The EIP-1193 Ethereum provider object.
513512
*/
514-
private createEIP1193Provider(provider: StreamProvider): StreamProvider {
513+
private createEIP1193Provider(
514+
provider: StreamProvider,
515+
): SnapsEthereumProvider {
515516
const originalRequest = provider.request.bind(provider);
516517

517518
const request = async (args: RequestArguments) => {
@@ -537,9 +538,9 @@ export class BaseSnapExecutor {
537538
);
538539
};
539540

540-
const streamProviderProxy = proxyStreamProvider(request);
541+
const ethereumProvider = { request };
541542

542-
return harden(streamProviderProxy);
543+
return harden(ethereumProvider);
543544
}
544545

545546
/**

packages/snaps-execution-environments/src/common/endowments/index.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import type { StreamProvider } from '@metamask/providers';
21
import { rpcErrors } from '@metamask/rpc-errors';
3-
import type { SnapsProvider } from '@metamask/snaps-sdk';
2+
import type { SnapsEthereumProvider, SnapsProvider } from '@metamask/snaps-sdk';
43
import { logWarning } from '@metamask/snaps-utils';
54
import { hasProperty } from '@metamask/utils';
65

@@ -62,7 +61,7 @@ export function createEndowments({
6261
notify,
6362
}: {
6463
snap: SnapsProvider;
65-
ethereum: StreamProvider;
64+
ethereum: SnapsEthereumProvider;
6665
snapId: string;
6766
endowments: string[];
6867
notify: NotifyFunction;

packages/snaps-execution-environments/src/common/test-utils/endowments.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,10 @@ import { createIdRemapMiddleware } from '@metamask/json-rpc-engine';
44
import ObjectMultiplex from '@metamask/object-multiplex';
55
import type { RequestArguments } from '@metamask/providers';
66
import { StreamProvider } from '@metamask/providers/stream-provider';
7+
import type { SnapsEthereumProvider } from '@metamask/snaps-sdk';
78
import { SNAP_STREAM_NAMES } from '@metamask/snaps-utils';
89

9-
import {
10-
assertEthereumOutboundRequest,
11-
proxyStreamProvider,
12-
withTeardown,
13-
} from '../utils';
10+
import { assertEthereumOutboundRequest, withTeardown } from '../utils';
1411
import { SILENT_LOGGER } from './logger';
1512

1613
/**
@@ -42,7 +39,7 @@ export function walkAndSearch(subject: unknown, target: unknown) {
4239
*
4340
* @returns Proxy to StreamProvider instance.
4441
*/
45-
export function getMockedStreamProvider() {
42+
export function getMockedStreamProvider(): SnapsEthereumProvider {
4643
const mux = new ObjectMultiplex();
4744
const rpcStream = mux.createStream(SNAP_STREAM_NAMES.JSON_RPC);
4845

@@ -59,5 +56,5 @@ export function getMockedStreamProvider() {
5956
return await withTeardown(originalRequest(args), { lastTeardown: 0 });
6057
};
6158

62-
return proxyStreamProvider(request);
59+
return { request };
6360
}

packages/snaps-execution-environments/src/common/utils.ts

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { StreamProvider, RequestArguments } from '@metamask/providers';
1+
import type { RequestArguments } from '@metamask/providers';
22
import { rpcErrors } from '@metamask/rpc-errors';
33
import { assert, getJsonSize, getSafeJson, isObject } from '@metamask/utils';
44

@@ -46,35 +46,6 @@ export async function withTeardown<Type>(
4646
});
4747
}
4848

49-
/**
50-
* Returns a Proxy that only allows access to a `request` function.
51-
* This is useful for replacing StreamProvider with an attenuated version.
52-
*
53-
* @param request - Custom attenuated request function.
54-
* @returns Proxy that mimics a StreamProvider instance.
55-
*/
56-
export function proxyStreamProvider(request: unknown): StreamProvider {
57-
// Proxy target is intentionally set to be an empty object, to ensure
58-
// that access to the prototype chain is not possible.
59-
const proxy = new Proxy(
60-
{},
61-
{
62-
has(_target: object, prop: string | symbol) {
63-
return typeof prop === 'string' && ['request'].includes(prop);
64-
},
65-
get(_target, prop: keyof StreamProvider) {
66-
if (prop === 'request') {
67-
return request;
68-
}
69-
70-
return undefined;
71-
},
72-
},
73-
);
74-
75-
return proxy as StreamProvider;
76-
}
77-
7849
// We're blocking these RPC methods for v1, will revisit later.
7950
export const BLOCKED_RPC_METHODS = Object.freeze([
8051
'wallet_requestPermissions',

0 commit comments

Comments
 (0)