Skip to content

Commit e6c4719

Browse files
perf: Attempt local execution on mobile
1 parent cec343a commit e6c4719

File tree

6 files changed

+251
-22
lines changed

6 files changed

+251
-22
lines changed
Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,33 @@
1-
import type { ExecutionServiceArgs } from '../AbstractExecutionService';
2-
import { ProxyExecutionService } from '../proxy/ProxyExecutionService';
1+
import type { TerminateJobArgs } from '../AbstractExecutionService';
2+
import {
3+
AbstractExecutionService,
4+
type ExecutionServiceArgs,
5+
} from '../AbstractExecutionService';
36
import type { WebViewInterface } from './WebViewMessageStream';
47
import { WebViewMessageStream } from './WebViewMessageStream';
58

69
export type WebViewExecutionServiceArgs = ExecutionServiceArgs & {
7-
getWebView: () => Promise<WebViewInterface>;
10+
createWebView: (jobId: string) => Promise<WebViewInterface>;
11+
removeWebView: (jobId: string) => void;
812
};
913

10-
export class WebViewExecutionService extends ProxyExecutionService {
11-
#getWebView;
14+
export class WebViewExecutionService extends AbstractExecutionService<string> {
15+
#createWebView;
16+
17+
#removeWebView;
1218

1319
constructor({
1420
messenger,
1521
setupSnapProvider,
16-
getWebView,
22+
createWebView,
23+
removeWebView,
1724
}: WebViewExecutionServiceArgs) {
1825
super({
1926
messenger,
2027
setupSnapProvider,
21-
stream: new WebViewMessageStream({
22-
name: 'parent',
23-
target: 'child',
24-
getWebView,
25-
}),
2628
});
27-
this.#getWebView = getWebView;
29+
this.#createWebView = createWebView;
30+
this.#removeWebView = removeWebView;
2831
}
2932

3033
/**
@@ -35,16 +38,18 @@ export class WebViewExecutionService extends ProxyExecutionService {
3538
* @returns An object with the worker ID and stream.
3639
*/
3740
protected async initEnvStream(jobId: string) {
38-
// Ensure that the WebView has been loaded before we proceed.
39-
await this.#ensureWebViewLoaded();
41+
const webView = await this.#createWebView(jobId);
42+
43+
const stream = new WebViewMessageStream({
44+
name: 'parent',
45+
target: 'child',
46+
getWebView: async () => webView,
47+
});
4048

41-
return super.initEnvStream(jobId);
49+
return { worker: jobId, stream };
4250
}
4351

44-
/**
45-
* Ensure that the WebView has been loaded by awaiting the getWebView promise.
46-
*/
47-
async #ensureWebViewLoaded() {
48-
await this.#getWebView();
52+
protected terminateJob(jobWrapper: TerminateJobArgs<string>): void {
53+
this.#removeWebView(jobWrapper.id);
4954
}
5055
}
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
{
2+
"resources": {
3+
"@metamask/post-message-stream": {
4+
"globals": {
5+
"MessageEvent.prototype": true,
6+
"WorkerGlobalScope": true,
7+
"addEventListener": true,
8+
"browser": true,
9+
"chrome": true,
10+
"location.origin": true,
11+
"postMessage": true,
12+
"removeEventListener": true
13+
},
14+
"packages": {
15+
"@metamask/utils": true,
16+
"readable-stream": true
17+
}
18+
},
19+
"@metamask/rpc-errors": {
20+
"packages": {
21+
"@metamask/rpc-errors>fast-safe-stringify": true,
22+
"@metamask/utils": true
23+
}
24+
},
25+
"@metamask/snaps-sdk": {
26+
"globals": {
27+
"URL": true,
28+
"fetch": true
29+
},
30+
"packages": {
31+
"@metamask/rpc-errors": true,
32+
"@metamask/superstruct": true,
33+
"@metamask/utils": true
34+
}
35+
},
36+
"@metamask/snaps-utils": {
37+
"globals": {
38+
"URL": true,
39+
"console.error": true,
40+
"console.log": true,
41+
"console.warn": true,
42+
"document.body.appendChild": true,
43+
"document.createElement": true
44+
},
45+
"packages": {
46+
"@metamask/rpc-errors": true,
47+
"@metamask/snaps-sdk": true,
48+
"@metamask/superstruct": true,
49+
"@metamask/utils": true
50+
}
51+
},
52+
"@metamask/utils": {
53+
"globals": {
54+
"TextDecoder": true,
55+
"TextEncoder": true
56+
},
57+
"packages": {
58+
"@metamask/superstruct": true,
59+
"@metamask/utils>@noble/hashes": true,
60+
"@metamask/utils>@scure/base": true,
61+
"@metamask/utils>pony-cause": true,
62+
"browserify>buffer": true,
63+
"depcheck>semver": true,
64+
"eslint>debug": true
65+
}
66+
},
67+
"@metamask/utils>@noble/hashes": {
68+
"globals": {
69+
"TextEncoder": true,
70+
"crypto": true
71+
}
72+
},
73+
"@metamask/utils>@scure/base": {
74+
"globals": {
75+
"TextDecoder": true,
76+
"TextEncoder": true
77+
}
78+
},
79+
"browserify>browser-pack>safe-buffer": {
80+
"packages": {
81+
"browserify>buffer": true
82+
}
83+
},
84+
"browserify>buffer": {
85+
"globals": {
86+
"console": true
87+
},
88+
"packages": {
89+
"browserify>buffer>base64-js": true,
90+
"browserify>buffer>ieee754": true
91+
}
92+
},
93+
"browserify>events": {
94+
"globals": {
95+
"console": true
96+
}
97+
},
98+
"browserify>process": {
99+
"globals": {
100+
"clearTimeout": true,
101+
"setTimeout": true
102+
}
103+
},
104+
"browserify>string_decoder": {
105+
"packages": {
106+
"browserify>browser-pack>safe-buffer": true
107+
}
108+
},
109+
"depcheck>semver": {
110+
"globals": {
111+
"console.error": true
112+
},
113+
"packages": {
114+
"browserify>process": true
115+
}
116+
},
117+
"eslint>debug": {
118+
"globals": {
119+
"console": true,
120+
"document": true,
121+
"localStorage": true,
122+
"navigator": true,
123+
"process": true
124+
},
125+
"packages": {
126+
"browserify>process": true,
127+
"eslint>debug>ms": true
128+
}
129+
},
130+
"readable-stream": {
131+
"packages": {
132+
"browserify>browser-resolve": true,
133+
"browserify>buffer": true,
134+
"browserify>events": true,
135+
"browserify>inherits": true,
136+
"browserify>process": true,
137+
"browserify>string_decoder": true,
138+
"readable-stream>util-deprecate": true
139+
}
140+
},
141+
"readable-stream>util-deprecate": {
142+
"globals": {
143+
"console.trace": true,
144+
"console.warn": true,
145+
"localStorage": true
146+
}
147+
}
148+
}
149+
}

packages/snaps-execution-environments/lavamoat/browserify/webview/policy.json

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,26 @@
11
{
22
"resources": {
3+
"@metamask/json-rpc-engine": {
4+
"packages": {
5+
"@metamask/providers>@metamask/safe-event-emitter": true,
6+
"@metamask/rpc-errors": true,
7+
"@metamask/utils": true
8+
}
9+
},
10+
"@metamask/object-multiplex": {
11+
"globals": {
12+
"console.warn": true
13+
},
14+
"packages": {
15+
"@metamask/object-multiplex>once": true,
16+
"readable-stream": true
17+
}
18+
},
19+
"@metamask/object-multiplex>once": {
20+
"packages": {
21+
"@metamask/object-multiplex>once>wrappy": true
22+
}
23+
},
324
"@metamask/post-message-stream": {
425
"globals": {
526
"MessageEvent.prototype": true,
@@ -16,6 +37,39 @@
1637
"readable-stream": true
1738
}
1839
},
40+
"@metamask/providers": {
41+
"globals": {
42+
"console": true
43+
},
44+
"packages": {
45+
"@metamask/json-rpc-engine": true,
46+
"@metamask/providers>@metamask/json-rpc-middleware-stream": true,
47+
"@metamask/providers>@metamask/safe-event-emitter": true,
48+
"@metamask/providers>is-stream": true,
49+
"@metamask/rpc-errors": true,
50+
"eslint>fast-deep-equal": true,
51+
"readable-stream": true
52+
}
53+
},
54+
"@metamask/providers>@metamask/json-rpc-middleware-stream": {
55+
"globals": {
56+
"console.warn": true,
57+
"setTimeout": true
58+
},
59+
"packages": {
60+
"@metamask/providers>@metamask/safe-event-emitter": true,
61+
"@metamask/utils": true,
62+
"readable-stream": true
63+
}
64+
},
65+
"@metamask/providers>@metamask/safe-event-emitter": {
66+
"globals": {
67+
"setTimeout": true
68+
},
69+
"packages": {
70+
"browserify>events": true
71+
}
72+
},
1973
"@metamask/rpc-errors": {
2074
"packages": {
2175
"@metamask/rpc-errors>fast-safe-stringify": true,

packages/snaps-execution-environments/scripts/build.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ const ENTRY_POINTS = {
3131
entryPoint: './src/webworker/pool/index.ts',
3232
html: true,
3333
},
34+
'webview-proxy': {
35+
entryPoint: './src/webview/proxy.ts',
36+
html: true,
37+
inlineBundle: true,
38+
},
3439
webview: {
3540
entryPoint: './src/webview/index.ts',
3641
html: true,

packages/snaps-execution-environments/src/webview/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { executeLockdownEvents } from '../common/lockdown/lockdown-events';
22
import { executeLockdownMore } from '../common/lockdown/lockdown-more';
3-
import { ProxySnapExecutor } from '../proxy/ProxySnapExecutor';
3+
import { IFrameSnapExecutor } from '../iframe/IFrameSnapExecutor';
44
import { WebViewExecutorStream } from './WebViewExecutorStream';
55

66
// Lockdown is already applied in LavaMoat
@@ -13,4 +13,4 @@ const parentStream = new WebViewExecutorStream({
1313
targetWindow: window.ReactNativeWebView,
1414
});
1515

16-
ProxySnapExecutor.initialize(parentStream);
16+
IFrameSnapExecutor.initialize(parentStream);
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { executeLockdownEvents } from '../common/lockdown/lockdown-events';
2+
import { executeLockdownMore } from '../common/lockdown/lockdown-more';
3+
import { ProxySnapExecutor } from '../proxy/ProxySnapExecutor';
4+
import { WebViewExecutorStream } from './WebViewExecutorStream';
5+
6+
// Lockdown is already applied in LavaMoat
7+
executeLockdownMore();
8+
executeLockdownEvents();
9+
10+
const parentStream = new WebViewExecutorStream({
11+
name: 'child', // webview
12+
target: 'parent', // rnside
13+
targetWindow: window.ReactNativeWebView,
14+
});
15+
16+
ProxySnapExecutor.initialize(parentStream);

0 commit comments

Comments
 (0)