Source code

Revision control

Copy as Markdown

Other Tools

function createFetchWorker(url) {
return `fetch("${url}");`;
}
function createXHRWorker(url) {
return `
try {
var xhr = new XMLHttpRequest();
xhr.open("GET", "${url}");
xhr.send();
} catch(ex) {}
`;
}
function createImportScriptsWorker(url) {
return `
try {
importScripts("${url}");
} catch(ex) {}
`;
}
function createChildWorkerURL(params) {
let url = SJS + "?" + params.toString();
return `new Worker("${url}");`;
}
function createChildWorkerBlob(params) {
let url = SJS + "?" + params.toString();
return `
try {
var xhr = new XMLHttpRequest();
xhr.open("GET", "${url}");
xhr.responseType = "blob";
xhr.send();
xhr.onload = () => {
new Worker(URL.createObjectURL(xhr.response));};
} catch(ex) {}
`;
}
function handleRequest(request, response) {
let params = new URLSearchParams(request.queryString);
let id = params.get("id");
let base = unescape(params.get("base"));
let child = params.has("child") ? params.get("child") : "";
//avoid confusing cache behaviors
response.setHeader("Cache-Control", "no-cache", false);
response.setHeader("Content-Type", "application/javascript");
// Deliver the CSP policy encoded in the URL
if (params.has("csp")) {
response.setHeader(
"Content-Security-Policy",
unescape(params.get("csp")),
false
);
}
if (child) {
let childCsp = params.has("childCsp") ? params.get("childCsp") : "";
params.delete("csp");
params.delete("child");
params.delete("childCsp");
params.append("csp", childCsp);
switch (child) {
case "blob":
response.write(createChildWorkerBlob(params));
break;
case "url":
response.write(createChildWorkerURL(params));
break;
default:
response.setStatusLine(request.httpVersion, 400, "Bad request");
break;
}
return;
}
if (params.has("action")) {
switch (params.get("action")) {
case "fetch":
response.write(createFetchWorker(base + "?id=" + id));
break;
case "xhr":
response.write(createXHRWorker(base + "?id=" + id));
break;
case "importScripts":
response.write(createImportScriptsWorker(base + "?id=" + id));
break;
default:
response.setStatusLine(request.httpVersion, 400, "Bad request");
break;
}
return;
}
response.write("I don't know action ");
}