Files
watchparty/public/sw.min.js
T
2026-06-21 03:53:06 +03:00

83 lines
3.1 KiB
JavaScript

(() => {
"use strict";
let e = !1;
(self.addEventListener("install", () => {
self.skipWaiting();
}),
self.addEventListener("fetch", (s) => {
const t = ((s) => {
const { url: t } = s.request;
return t.includes(self.registration.scope + "webtorrent/")
? t.includes(self.registration.scope + "webtorrent/keepalive/")
? new Response()
: t.includes(self.registration.scope + "webtorrent/cancel/")
? new Response(
new ReadableStream({
cancel() {
e = !0;
},
}),
)
: (async function ({ request: s }) {
const { url: t, method: n, headers: o, destination: a } = s,
l = await clients.matchAll({
type: "window",
includeUncontrolled: !0,
}),
[r, i] = await new Promise((e) => {
for (const s of l) {
const l = new MessageChannel(),
{ port1: r, port2: i } = l;
((r.onmessage = ({ data: s }) => {
e([s, r]);
}),
s.postMessage(
{
url: t,
method: n,
headers: Object.fromEntries(o.entries()),
scope: self.registration.scope,
destination: a,
type: "webtorrent",
},
[i],
));
}
});
let c = null;
const d = () => {
(i.postMessage(!1), clearTimeout(c), (i.onmessage = null));
};
return "STREAM" !== r.body
? (d(), new Response(r.body, r))
: new Response(
new ReadableStream({
pull: (s) =>
new Promise((t) => {
((i.onmessage = ({ data: e }) => {
(e ? s.enqueue(e) : (d(), s.close()), t());
}),
e ||
(clearTimeout(c),
"document" !== a &&
(c = setTimeout(() => {
(d(), t());
}, 5e3))),
i.postMessage(!0));
}),
cancel() {
d();
},
}),
r,
);
})(s)
: null;
})(s);
t && s.respondWith(t);
}),
self.addEventListener("activate", () => {
self.clients.claim();
}));
})();