Source code

Revision control

Copy as Markdown

Other Tools

"use strict";
let client;
function is(got, expected, name) {
client.postMessage({ type: "is", got, expected, name });
}
self.onactivate = e =>
e.waitUntil(
(async () => {
await self.clients.claim();
const allClients = await self.clients.matchAll();
client = allClients[0];
is(allClients.length, 1, "allClients.length");
})()
);
let expected_start = 0;
let response_data = [
// One Array element for each response in order:
{
complete_length: "*",
body: "O",
},
{
complete_length: "3",
body: "g",
},
{
// Extend length to test that the remainder is fetched.
complete_length: "6",
body: "g",
},
{
// Reduce length to test that no more is fetched.
complete_length: "4",
body: "S",
},
];
self.onfetch = e => {
if (!e.request.url.endsWith("/media-resource")) {
return; // fall back to network fetch
}
is(
response_data.length >= 1,
true,
`response_data.length (${response_data.length}) > 0`
);
const { complete_length, body } = response_data.shift();
const range = e.request.headers.get("Range");
const match = range.match(/^bytes=(\d+)-/);
is(Array.isArray(match), true, `Array.isArray(match) for ${range}`);
const first = parseInt(match[1]);
is(first, expected_start, "first");
const last = first + body.length - 1; // inclusive
expected_start = last + 1;
const init = {
status: 206, // Partial Content
headers: {
"Accept-Ranges": "bytes",
"Content-Type": "audio/ogg",
"Content-Range": `bytes ${first}-${last}/${complete_length}`,
"Content-Length": body.length,
},
};
e.respondWith(new Response(body, init));
};
self.onmessage = e => {
switch (e.data.type) {
case "got error event":
// Check that all expected requests were received.
is(response_data.length, 0, "missing fetch count");
client.postMessage({ type: "done" });
return;
default:
is(e.data.type, "__KNOWN__", "e.data.type");
}
};