Skip to content

Commit 82c92f0

Browse files
committed
Added a service-worker utility to bring back sabayon when needed
1 parent 120889c commit 82c92f0

10 files changed

+78
-24
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.

docs/service-worker.js

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

esm/service-worker.js

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import sabayon from 'https://cdn.jsdelivr.net/npm/sabayon/dist/polyfill.js';
2+
3+
// ignore browsers that already support SharedArrayBuffer
4+
if (!globalThis.crossOriginIsolated) {
5+
const { isArray } = Array;
6+
7+
// early patch Blob to inject sabayon polyfill for service-worker
8+
globalThis.Blob = class extends Blob {
9+
constructor(blobParts, ...rest) {
10+
if (isArray(blobParts) && typeof blobParts.at(0) === 'string') {
11+
blobParts[0] = blobParts[0].replace(
12+
/^\/\*@\*\//,
13+
'import "https://cdn.jsdelivr.net/npm/sabayon/dist/polyfill.js";'
14+
);
15+
}
16+
super(blobParts, ...rest);
17+
}
18+
};
19+
20+
// early patch Worker to bootstrap sabayon for service-worker
21+
globalThis.Worker = class extends Worker {
22+
constructor(url, ...args) {
23+
if (args.length) {
24+
const sw = args[0].serviceWorker || args[0].service_worker;
25+
if (sw) sabayon(sw);
26+
}
27+
super(url, ...args);
28+
}
29+
};
30+
}

package-lock.json

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

package.json

+6-3
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@
5454
"c8": "^10.1.3",
5555
"chokidar": "^4.0.3",
5656
"eslint": "^9.25.1",
57-
"linkedom": "^0.18.9",
58-
"rollup": "^4.40.0",
57+
"linkedom": "^0.18.10",
58+
"rollup": "^4.40.1",
5959
"static-handler": "^0.5.3",
6060
"typescript": "^5.8.3"
6161
},
@@ -77,6 +77,9 @@
7777
"types": "./types/xworker.d.ts",
7878
"import": "./esm/xworker.js"
7979
},
80+
"./service-worker": {
81+
"import": "./esm/service-worker.js"
82+
},
8083
"./package.json": "./package.json"
8184
},
8285
"dependencies": {
@@ -94,6 +97,6 @@
9497
"to-json-callback": "^0.1.1"
9598
},
9699
"worker": {
97-
"blob": "sha256-iaE9TznK/Chitl2RyGnEcVbganaVJtMNGrTY6src9DA="
100+
"blob": "sha256-4cbYgQH1cfwMhG6Edre6Zo+y7y06Y7QKic9wfGdbArk="
98101
}
99102
}

rollup/build_xworker.cjs

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ for (const file of readdirSync(DIST_DIR)) {
5252
`const re = ${/import\((['"])([^)]+?\.js)\1\)/}g;`,
5353
`const place = ${(_,q,f) => `import(${q}${new URL(f,url).href}${q})`};`,
5454
...coincident,
55-
`export default (...args) => new Worker(URL.createObjectURL(new Blob([${js}.replace(re,place)],{type:'application/javascript'})), ...args)`,
55+
`export default (...args) => new Worker(URL.createObjectURL(new Blob(['/*@*/'+${js}.replace(re,place)],{type:'application/javascript'})), ...args)`,
5656
'/* c8 ignore stop */',
5757
''
5858
].join("\n")

rollup/core.config.js

+17-8
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,21 @@ import { createRequire } from "node:module";
88

99
createRequire(import.meta.url)("./build_xworker.cjs");
1010

11-
export default {
12-
input: "./esm/index.js",
13-
plugins: process.env.NO_MIN ? [nodeResolve()] : [nodeResolve(), terser()],
14-
output: {
15-
esModule: true,
16-
dir: "./dist",
17-
sourcemap: true,
11+
export default [
12+
{
13+
input: "./esm/index.js",
14+
plugins: process.env.NO_MIN ? [nodeResolve()] : [nodeResolve(), terser()],
15+
output: {
16+
esModule: true,
17+
dir: "./dist",
18+
sourcemap: true,
19+
},
1820
},
19-
};
21+
{
22+
input: "./esm/service-worker.js",
23+
plugins: process.env.NO_MIN ? [nodeResolve()] : [nodeResolve(), terser()],
24+
output: {
25+
file: "./dist/service-worker.js",
26+
},
27+
}
28+
];

test/no-sw.html renamed to test/sw.html

+5-4
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@
66
<title>python</title>
77
<link rel="stylesheet" href="style.css" />
88
<script defer src="./counter.js"></script>
9+
<script type="module" src="../dist/service-worker.js"></script>
910
<script type="module" src="../dist/index.js"></script>
1011
</head>
1112
<body>
12-
<script type="pyodide">
13-
import sys
14-
import js
15-
js.document.currentScript.target.textContent = sys.version
13+
<script type="pyodide" service-worker="./sw.js" worker>
14+
from polyscript import xworker
15+
window = xworker.window
16+
window.document.body.textContent = 'OK'
1617
</script>
1718
</body>
1819
</html>

test/sw.js

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

0 commit comments

Comments
 (0)