UNPKG

1.99 kBJavaScriptView Raw
1/* Partytown 0.2.1 - MIT builder.io */
2const resolves = new Map;
3
4const swMessageError = (accessReq, $error$) => ({
5 $msgId$: accessReq.$msgId$,
6 $error$: $error$
7});
8
9const httpRequestFromWebWorker = req => new Promise((async resolve => {
10 const accessReq = await req.clone().json();
11 const responseData = await (accessReq => new Promise((async resolve => {
12 const clients = await self.clients.matchAll();
13 const client = [ ...clients ].sort(((a, b) => a.url > b.url ? -1 : a.url < b.url ? 1 : 0))[0];
14 if (client) {
15 const timeout = 12e4;
16 const msgResolve = [ resolve, setTimeout((() => {
17 resolves.delete(accessReq.$msgId$);
18 resolve(swMessageError(accessReq, "Timeout"));
19 }), timeout) ];
20 resolves.set(accessReq.$msgId$, msgResolve);
21 client.postMessage(accessReq);
22 } else {
23 resolve(swMessageError(accessReq, "NoParty"));
24 }
25 })))(accessReq);
26 resolve(response(JSON.stringify(responseData), "application/json"));
27}));
28
29const response = (body, contentType) => new Response(body, {
30 headers: {
31 "content-type": contentType || "text/html",
32 "Cache-Control": "no-store"
33 }
34});
35
36self.oninstall = () => self.skipWaiting();
37
38self.onactivate = () => self.clients.claim();
39
40self.onmessage = ev => {
41 const accessRsp = ev.data;
42 const r = resolves.get(accessRsp.$msgId$);
43 if (r) {
44 resolves.delete(accessRsp.$msgId$);
45 clearTimeout(r[1]);
46 r[0](accessRsp);
47 }
48};
49
50self.onfetch = ev => {
51 const req = ev.request;
52 const url = new URL(req.url);
53 const pathname = url.pathname;
54 if (pathname.endsWith("sw.html")) {
55 ev.respondWith(response('<!DOCTYPE html><html><head><meta charset="utf-8"><script src="./partytown-sandbox-sw.js"><\/script></head></html>'));
56 } else {
57 pathname.endsWith("proxytown") && ev.respondWith(httpRequestFromWebWorker(req));
58 }
59};