80 lines
2 KiB
JavaScript
80 lines
2 KiB
JavaScript
"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");
|
|
}
|
|
};
|