Skip to content

Commit 18c2c76

Browse files
committed
Relax SharedArrayBuffer requirement for named workers
1 parent 075b611 commit 18c2c76

File tree

7 files changed

+52
-14
lines changed

7 files changed

+52
-14
lines changed

docs/index.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/index.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

esm/custom.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -62,18 +62,19 @@ export const handleCustomType = async (node) => {
6262
try {
6363
const worker = workerURL(node);
6464
if (worker) {
65+
const workerName = node.getAttribute('name');
6566
const xworker = XW.call(new Hook(null, hooks), worker, {
6667
...nodeInfo(node, type),
6768
version,
6869
configURL,
6970
type: runtime,
7071
custom: type,
7172
config: node.getAttribute('config') || config || {},
72-
async: node.hasAttribute('async')
73+
async: node.hasAttribute('async'),
74+
named: !!workerName,
7375
});
7476
defineProperty(node, 'xworker', { value: xworker });
7577
resolve({ type, xworker });
76-
const workerName = node.getAttribute('name');
7778
if (workerName) workers[workerName].resolve(xworker.ready);
7879
return;
7980
}

esm/script-handler.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -138,17 +138,18 @@ export const handle = async (script) => {
138138
/* c8 ignore start */
139139
const url = workerURL(script);
140140
if (url) {
141+
const workerName = wn?.value;
141142
const XWorker = $xworker(type, versionValue);
142143
const xworker = new XWorker(url, {
143144
...nodeInfo(script, type),
144145
async: !!isAsync,
145146
config: configValue,
147+
named: !!workerName,
146148
});
147149
handled.set(
148150
defineProperty(script, 'xworker', { value: xworker }),
149151
{ xworker },
150152
);
151-
const workerName = wn?.value;
152153
if (workerName) workers[workerName].resolve(xworker.ready);
153154
return;
154155
}

esm/worker/_template.js

+15-8
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import { configs, registry } from '../interpreters.js';
1313
import { getRuntime, getRuntimeID } from '../loader.js';
1414
import { patch, polluteJS, js as jsHooks, code as codeHooks } from '../hooks.js';
1515

16+
const SAB = 'SharedArrayBuffer';
17+
1618
let interpreter, runEvent, transform;
1719
const add = (type, fn) => {
1820
addEventListener(
@@ -43,7 +45,7 @@ const xworker = {
4345
sync,
4446
// allow access to the main thread world
4547
window,
46-
// allow introspection for foreign (main thread) refrences
48+
// allow introspection for foreign (main thread) references
4749
isWindowProxy,
4850
// standard worker related events / features
4951
onmessage: console.info,
@@ -55,7 +57,7 @@ const xworker = {
5557
add('message', ({ data: { options, config: baseURL, configURL, code, hooks } }) => {
5658
interpreter = (async () => {
5759
try {
58-
const { id, tag, type, custom, version, config, async: isAsync } = options;
60+
const { id, tag, type, custom, version, config, named, async: isAsync } = options;
5961

6062
const runtimeID = getRuntimeID(type, version);
6163

@@ -84,13 +86,18 @@ add('message', ({ data: { options, config: baseURL, configURL, code, hooks } })
8486
// if it does throw and `sync_main_only` was not `true`
8587
// then there's no way to go further
8688
if (syncMainAndWorker) {
87-
throw new Error(
88-
[
89-
'Unable to use SharedArrayBuffer due insecure environment.',
90-
'Please read requirements in MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer#security_requirements',
91-
].join('\n'),
92-
);
89+
const prefix = `Unable to use ${SAB}`;
90+
if (!named || sync_main_only === false) {
91+
throw new Error(
92+
[
93+
`${prefix} due insecure environment.`,
94+
`Please read requirements in MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/${SAB}#security_requirements`,
95+
].join('\n'),
96+
);
97+
}
98+
console.warn(`${prefix}. Fallback to async only interaction.`);
9399
}
100+
syncMainAndWorker = false;
94101
}
95102

96103
const details = create(registry.get(type));

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,6 @@
9191
"to-json-callback": "^0.1.1"
9292
},
9393
"worker": {
94-
"blob": "sha256-zrvckOW/DJa6Ds33kWWyNZtvV7aajCLCG+5LnBkpLiA="
94+
"blob": "sha256-FrixSFfNmrY7qKa+FUYOv6+j5y6mlvzlirb+qQII9SY="
9595
}
9696
}

test/worker/element.html

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8" />
5+
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
6+
<title>named workers</title>
7+
<script type="module" src="/dist/index.js"></script>
8+
</head>
9+
<body>
10+
<script type="micropython" async>
11+
from polyscript import workers
12+
13+
await (await workers["mpy"]).greetings()
14+
await (await workers["py"]).greetings()
15+
</script>
16+
<script type="micropython" worker name="mpy">
17+
def greetings():
18+
print("micropython")
19+
20+
__export__ = ['greetings']
21+
</script>
22+
<script type="pyodide" config='{"sync_main_only":true}' worker name="py">
23+
def greetings():
24+
print("pyodide")
25+
26+
__export__ = ['greetings']
27+
</script>
28+
</body>
29+
</html>

0 commit comments

Comments
 (0)