Incognito3 / vendor /scramjet /dist /scramjet.worker.js.map
Alex Scott
rebrand space to incognito
46c7a16
{"version":3,"file":"scramjet.worker.js","sources":["webpack://@mercuryworkshop/scramjet/./src/log.ts","webpack://@mercuryworkshop/scramjet/./src/worker/fakesw.ts","webpack://@mercuryworkshop/scramjet/./src/scramjet.ts","webpack://@mercuryworkshop/scramjet/./src/shared.ts","webpack://@mercuryworkshop/scramjet/./src/worker/fetch.ts","webpack://@mercuryworkshop/scramjet/./src/worker/error.ts","webpack://@mercuryworkshop/scramjet/./src/worker/index.ts"],"sourcesContent":["export default {\n\tfmt: function (severity: string, message: string, ...args: any[]) {\n\t\tconst old = Error.prepareStackTrace;\n\n\t\tError.prepareStackTrace = (_, stack) => {\n\t\t\tstack.shift(); // stack();\n\t\t\tstack.shift(); // fmt();\n\t\t\tstack.shift();\n\n\t\t\tlet fmt = \"\";\n\t\t\tfor (let i = 1; i < Math.min(2, stack.length); i++) {\n\t\t\t\tif (stack[i].getFunctionName()) {\n\t\t\t\t\t// const f = stack[i].getThis()?.constructor?.name;\n\t\t\t\t\t// if (f) fmt += `${f}.`\n\t\t\t\t\tfmt += `${stack[i].getFunctionName()} -> ` + fmt;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfmt += stack[0].getFunctionName() || \"Anonymous\";\n\n\t\t\treturn fmt;\n\t\t};\n\n\t\tconst fmt = (function stack() {\n\t\t\ttry {\n\t\t\t\tthrow new Error();\n\t\t\t} catch (e) {\n\t\t\t\treturn e.stack;\n\t\t\t}\n\t\t})();\n\n\t\tError.prepareStackTrace = old;\n\n\t\tconst fn = console[severity] || console.log;\n\t\tconst bg = {\n\t\t\tlog: \"#000\",\n\t\t\twarn: \"#f80\",\n\t\t\terror: \"#f00\",\n\t\t\tdebug: \"transparent\",\n\t\t}[severity];\n\t\tconst fg = {\n\t\t\tlog: \"#fff\",\n\t\t\twarn: \"#fff\",\n\t\t\terror: \"#fff\",\n\t\t\tdebug: \"gray\",\n\t\t}[severity];\n\t\tconst padding = {\n\t\t\tlog: 2,\n\t\t\twarn: 4,\n\t\t\terror: 4,\n\t\t\tdebug: 0,\n\t\t}[severity];\n\n\t\tfn(\n\t\t\t`%c${fmt}%c ${message}`,\n\t\t\t`\n\t\tbackground-color: ${bg};\n\t\tcolor: ${fg};\n\t\tpadding: ${padding}px;\n\t\tfont-weight: bold;\n\t\tfont-family: monospace;\n\t\tfont-size: 0.9em;\n\t`,\n\t\t\t`${severity === \"debug\" ? \"color: gray\" : \"\"}`,\n\t\t\t...args\n\t\t);\n\t},\n\tlog: function (message: string, ...args: any[]) {\n\t\tthis.fmt(\"log\", message, ...args);\n\t},\n\twarn: function (message: string, ...args: any[]) {\n\t\tthis.fmt(\"warn\", message, ...args);\n\t},\n\terror: function (message: string, ...args: any[]) {\n\t\tthis.fmt(\"error\", message, ...args);\n\t},\n\tdebug: function (message: string, ...args: any[]) {\n\t\tthis.fmt(\"debug\", message, ...args);\n\t},\n};\n","import { type MessageW2R, type MessageR2W } from \"../client/swruntime\";\n\nexport class FakeServiceWorker {\n\tsyncToken = 0;\n\tpromises: Record<number, (val?: MessageR2W) => void> = {};\n\tmessageChannel = new MessageChannel();\n\tconnected = false;\n\n\tconstructor(\n\t\tpublic handle: MessagePort,\n\t\tpublic origin: string\n\t) {\n\t\tthis.messageChannel.port1.addEventListener(\"message\", (event) => {\n\t\t\tif (\"scramjet$type\" in event.data) {\n\t\t\t\tif (event.data.scramjet$type === \"init\") {\n\t\t\t\t\tthis.connected = true;\n\t\t\t\t} else {\n\t\t\t\t\tthis.handleMessage(event.data);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tthis.messageChannel.port1.start();\n\n\t\tthis.handle.postMessage(\n\t\t\t{\n\t\t\t\tscramjet$type: \"init\",\n\t\t\t\tscramjet$port: this.messageChannel.port2,\n\t\t\t},\n\t\t\t[this.messageChannel.port2]\n\t\t);\n\t}\n\n\thandleMessage(data: MessageR2W) {\n\t\tconst cb = this.promises[data.scramjet$token];\n\t\tif (cb) {\n\t\t\tcb(data);\n\t\t\tdelete this.promises[data.scramjet$token];\n\t\t}\n\t}\n\n\tasync fetch(request: Request): Promise<Response | false> {\n\t\tconst token = this.syncToken++;\n\n\t\tconst message: MessageW2R = {\n\t\t\tscramjet$type: \"fetch\",\n\t\t\tscramjet$token: token,\n\t\t\tscramjet$request: {\n\t\t\t\turl: request.url,\n\t\t\t\tbody: request.body,\n\t\t\t\theaders: Array.from(request.headers.entries()),\n\t\t\t\tmethod: request.method,\n\t\t\t\tmode: request.mode,\n\t\t\t\tdestinitation: request.destination,\n\t\t\t},\n\t\t};\n\n\t\tconst transfer = request.body ? [request.body] : [];\n\n\t\tthis.handle.postMessage(message, transfer);\n\n\t\tconst { scramjet$response: r } = (await new Promise((resolve) => {\n\t\t\tthis.promises[token] = resolve;\n\t\t})) as MessageR2W;\n\n\t\tif (!r) return false;\n\n\t\treturn new Response(r.body, {\n\t\t\theaders: r.headers,\n\t\t\tstatus: r.status,\n\t\t\tstatusText: r.statusText,\n\t\t});\n\t}\n}\n","import { ScramjetFlags } from \"./types\";\n\nif (!(\"$scramjet\" in self)) {\n\t// @ts-expect-error ts stuff\n\tself.$scramjet = {\n\t\tversion: {\n\t\t\tbuild: COMMITHASH,\n\t\t\tversion: VERSION,\n\t\t},\n\t\tcodec: {},\n\t\tflagEnabled,\n\t};\n}\n\nexport const $scramjet = self.$scramjet;\n\nconst nativeFunction = Function;\nexport function loadCodecs() {\n\t$scramjet.codec.encode = nativeFunction(\n\t\t\"url\",\n\t\t$scramjet.config.codec.encode\n\t) as any;\n\t$scramjet.codec.decode = nativeFunction(\n\t\t\"url\",\n\t\t$scramjet.config.codec.decode\n\t) as any;\n}\n\nexport function flagEnabled(flag: keyof ScramjetFlags, url: URL): boolean {\n\tconst value = $scramjet.config.flags[flag];\n\tfor (const regex in $scramjet.config.siteFlags) {\n\t\tconst partialflags = $scramjet.config.siteFlags[regex];\n\t\tif (new RegExp(regex).test(url.href) && flag in partialflags) {\n\t\t\treturn partialflags[flag];\n\t\t}\n\t}\n\n\treturn value;\n}\n","import { $scramjet } from \"./scramjet\";\n\nexport const {\n\tutil: { BareClient, ScramjetHeaders, BareMuxConnection },\n\turl: { rewriteUrl, unrewriteUrl, rewriteBlob, unrewriteBlob },\n\trewrite: {\n\t\trewriteCss,\n\t\tunrewriteCss,\n\t\trewriteHtml,\n\t\tunrewriteHtml,\n\t\trewriteSrcset,\n\t\trewriteJs,\n\t\trewriteHeaders,\n\t\trewriteWorkers,\n\t\thtmlRules,\n\t},\n\tCookieStore,\n} = $scramjet.shared;\n\nexport const config = $scramjet.config;\n","import { BareResponseFetch } from \"@mercuryworkshop/bare-mux\";\nimport { MessageW2C, ScramjetServiceWorker } from \".\";\nimport { renderError } from \"./error\";\nimport { FakeServiceWorker } from \"./fakesw\";\nimport { CookieStore } from \"../shared/cookie\";\nimport {\n\tScramjetHeaders,\n\tunrewriteUrl,\n\trewriteUrl,\n\trewriteCss,\n\trewriteHeaders,\n\trewriteHtml,\n\trewriteJs,\n\trewriteWorkers,\n\tunrewriteBlob,\n} from \"../shared\";\n\nimport type { URLMeta } from \"../shared/rewriters/url\";\nimport { $scramjet } from \"../scramjet\";\n\nfunction newmeta(url: URL): URLMeta {\n\treturn {\n\t\torigin: url,\n\t\tbase: url,\n\t};\n}\n\nexport async function handleFetch(\n\tthis: ScramjetServiceWorker,\n\trequest: Request,\n\tclient: Client | null\n) {\n\tconst urlParam = new URLSearchParams(new URL(request.url).search);\n\n\tif (urlParam.has(\"url\")) {\n\t\treturn Response.redirect(\n\t\t\trewriteUrl(urlParam.get(\"url\"), newmeta(new URL(urlParam.get(\"url\"))))\n\t\t);\n\t}\n\n\ttry {\n\t\tconst requesturl = new URL(request.url);\n\t\tlet workertype = \"\";\n\t\tif (requesturl.searchParams.has(\"type\")) {\n\t\t\tworkertype = requesturl.searchParams.get(\"type\") as string;\n\t\t\trequesturl.searchParams.delete(\"type\");\n\t\t}\n\t\tif (requesturl.searchParams.has(\"dest\")) {\n\t\t\trequesturl.searchParams.delete(\"dest\");\n\t\t}\n\n\t\tif (\n\t\t\trequesturl.pathname.startsWith(this.config.prefix + \"blob:\") ||\n\t\t\trequesturl.pathname.startsWith(this.config.prefix + \"data:\")\n\t\t) {\n\t\t\tlet dataurl = requesturl.pathname.substring(this.config.prefix.length);\n\t\t\tif (dataurl.startsWith(\"blob:\")) {\n\t\t\t\tdataurl = unrewriteBlob(dataurl);\n\t\t\t}\n\n\t\t\tconst response: Partial<BareResponseFetch> = await fetch(dataurl, {});\n\t\t\tconst url = dataurl.startsWith(\"blob:\") ? dataurl : \"(data url)\";\n\t\t\tresponse.finalURL = url;\n\t\t\tlet body: BodyType;\n\n\t\t\tif (response.body) {\n\t\t\t\tbody = await rewriteBody(\n\t\t\t\t\tresponse as BareResponseFetch,\n\t\t\t\t\tclient\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tbase: new URL(new URL(client.url).origin),\n\t\t\t\t\t\t\t\torigin: new URL(new URL(client.url).origin),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: newmeta(new URL(unrewriteUrl(request.referrer))),\n\t\t\t\t\trequest.destination,\n\t\t\t\t\tworkertype,\n\t\t\t\t\tthis.cookieStore\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst headers = Object.fromEntries(response.headers.entries());\n\n\t\t\tif (crossOriginIsolated) {\n\t\t\t\theaders[\"Cross-Origin-Opener-Policy\"] = \"same-origin\";\n\t\t\t\theaders[\"Cross-Origin-Embedder-Policy\"] = \"require-corp\";\n\t\t\t}\n\n\t\t\treturn new Response(body, {\n\t\t\t\tstatus: response.status,\n\t\t\t\tstatusText: response.statusText,\n\t\t\t\theaders: headers,\n\t\t\t});\n\t\t}\n\n\t\tconst url = new URL(unrewriteUrl(requesturl));\n\n\t\tconst activeWorker: FakeServiceWorker | null = this.serviceWorkers.find(\n\t\t\t(w) => w.origin === url.origin\n\t\t);\n\n\t\tif (\n\t\t\tactiveWorker &&\n\t\t\tactiveWorker.connected &&\n\t\t\turlParam.get(\"from\") !== \"swruntime\"\n\t\t) {\n\t\t\t// TODO: check scope\n\t\t\tconst r = await activeWorker.fetch(request);\n\t\t\tif (r) return r;\n\t\t}\n\t\tif (url.origin == new URL(request.url).origin) {\n\t\t\tthrow new Error(\n\t\t\t\t\"attempted to fetch from same origin - this means the site has obtained a reference to the real origin, aborting\"\n\t\t\t);\n\t\t}\n\n\t\tconst headers = new ScramjetHeaders();\n\t\tfor (const [key, value] of request.headers.entries()) {\n\t\t\theaders.set(key, value);\n\t\t}\n\n\t\tif (\n\t\t\tclient &&\n\t\t\tnew URL(client.url).pathname.startsWith($scramjet.config.prefix)\n\t\t) {\n\t\t\t// TODO: i was against cors emulation but we might actually break stuff if we send full origin/referrer always\n\t\t\tconst clientURL = new URL(unrewriteUrl(client.url));\n\t\t\tif (clientURL.toString().includes(\"youtube.com\")) {\n\t\t\t\t// console.log(headers);\n\t\t\t} else {\n\t\t\t\theaders.set(\"Referer\", clientURL.toString());\n\t\t\t\theaders.set(\n\t\t\t\t\t\"Origin\",\n\t\t\t\t\tclientURL.origin ? `${clientURL.protocol}//${clientURL.host}` : \"null\"\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst cookies = this.cookieStore.getCookies(url, false);\n\n\t\tif (cookies.length) {\n\t\t\theaders.set(\"Cookie\", cookies);\n\t\t}\n\n\t\theaders.set(\"Sec-Fetch-Dest\", request.destination);\n\t\t//TODO: Emulate this later (like really)\n\t\theaders.set(\"Sec-Fetch-Site\", \"same-origin\");\n\t\theaders.set(\n\t\t\t\"Sec-Fetch-Mode\",\n\t\t\trequest.mode === \"cors\" ? request.mode : \"same-origin\"\n\t\t);\n\n\t\tconst ev = new ScramjetRequestEvent(\n\t\t\turl,\n\t\t\trequest.body,\n\t\t\trequest.method,\n\t\t\trequest.destination,\n\t\t\tclient,\n\t\t\theaders.headers\n\t\t);\n\t\tthis.dispatchEvent(ev);\n\n\t\tconst response: BareResponseFetch =\n\t\t\tev.response ||\n\t\t\t(await this.client.fetch(ev.url, {\n\t\t\t\tmethod: ev.method,\n\t\t\t\tbody: ev.body,\n\t\t\t\theaders: ev.requestHeaders,\n\t\t\t\tcredentials: \"omit\",\n\t\t\t\tmode: request.mode === \"cors\" ? request.mode : \"same-origin\",\n\t\t\t\tcache: request.cache,\n\t\t\t\tredirect: \"manual\",\n\t\t\t\t//@ts-ignore why the fuck is this not typed mircosoft\n\t\t\t\tduplex: \"half\",\n\t\t\t}));\n\n\t\treturn await handleResponse(\n\t\t\turl,\n\t\t\tworkertype,\n\t\t\trequest.destination,\n\t\t\tresponse,\n\t\t\tthis.cookieStore,\n\t\t\tclient,\n\t\t\tthis\n\t\t);\n\t} catch (err) {\n\t\tconst errorDetails = {\n\t\t\tmessage: err.message,\n\t\t\turl: request.url,\n\t\t\tdestination: request.destination,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\t\tif (err.stack) {\n\t\t\terrorDetails[\"stack\"] = err.stack;\n\t\t}\n\n\t\tconsole.error(\"ERROR FROM SERVICE WORKER FETCH: \", errorDetails);\n\n\t\tif (![\"document\", \"iframe\"].includes(request.destination))\n\t\t\treturn new Response(undefined, { status: 500 });\n\n\t\tconst formattedError = Object.entries(errorDetails)\n\t\t\t.map(\n\t\t\t\t([key, value]) =>\n\t\t\t\t\t`${key.charAt(0).toUpperCase() + key.slice(1)}: ${value}`\n\t\t\t)\n\t\t\t.join(\"\\n\\n\");\n\n\t\treturn renderError(formattedError, unrewriteUrl(request.url));\n\t}\n}\n\nasync function handleResponse(\n\turl: URL,\n\tworkertype: string,\n\tdestination: RequestDestination,\n\tresponse: BareResponseFetch,\n\tcookieStore: CookieStore,\n\tclient: Client,\n\tswtarget: ScramjetServiceWorker\n): Promise<Response> {\n\tlet responseBody: BodyType;\n\tconst responseHeaders = rewriteHeaders(response.rawHeaders, newmeta(url));\n\n\tconst maybeHeaders = responseHeaders[\"set-cookie\"] || [];\n\tfor (const cookie in maybeHeaders) {\n\t\tif (client)\n\t\t\tclient.postMessage({\n\t\t\t\tscramjet$type: \"cookie\",\n\t\t\t\tcookie,\n\t\t\t\turl: url.href,\n\t\t\t} as MessageW2C);\n\t}\n\n\tawait cookieStore.setCookies(\n\t\tmaybeHeaders instanceof Array ? maybeHeaders : [maybeHeaders],\n\t\turl\n\t);\n\n\tfor (const header in responseHeaders) {\n\t\t// flatten everything past here\n\t\tif (Array.isArray(responseHeaders[header]))\n\t\t\tresponseHeaders[header] = responseHeaders[header][0];\n\t}\n\n\tif (response.body) {\n\t\tresponseBody = await rewriteBody(\n\t\t\tresponse,\n\t\t\tnewmeta(url),\n\t\t\tdestination,\n\t\t\tworkertype,\n\t\t\tcookieStore\n\t\t);\n\t}\n\n\t// downloads\n\tif ([\"document\", \"iframe\"].includes(destination)) {\n\t\tconst header = responseHeaders[\"content-disposition\"];\n\n\t\t// validate header and test for filename\n\t\tif (!/\\s*?((inline|attachment);\\s*?)filename=/i.test(header)) {\n\t\t\t// if filename= wasn\"t specified then maybe the remote specified to download this as an attachment?\n\t\t\t// if it\"s invalid then we can still possibly test for the attachment/inline type\n\t\t\tconst type = /^\\s*?attachment/i.test(header) ? \"attachment\" : \"inline\";\n\n\t\t\t// set the filename\n\t\t\tconst [filename] = new URL(response.finalURL).pathname\n\t\t\t\t.split(\"/\")\n\t\t\t\t.slice(-1);\n\n\t\t\tresponseHeaders[\"content-disposition\"] =\n\t\t\t\t`${type}; filename=${JSON.stringify(filename)}`;\n\t\t}\n\t}\n\tif (responseHeaders[\"accept\"] === \"text/event-stream\") {\n\t\tresponseHeaders[\"content-type\"] = \"text/event-stream\";\n\t}\n\n\t// scramjet runtime can use features that permissions-policy blocks\n\tdelete responseHeaders[\"permissions-policy\"];\n\n\tif (\n\t\tcrossOriginIsolated &&\n\t\t[\n\t\t\t\"document\",\n\t\t\t\"iframe\",\n\t\t\t\"worker\",\n\t\t\t\"sharedworker\",\n\t\t\t\"style\",\n\t\t\t\"script\",\n\t\t].includes(destination)\n\t) {\n\t\tresponseHeaders[\"Cross-Origin-Embedder-Policy\"] = \"require-corp\";\n\t\tresponseHeaders[\"Cross-Origin-Opener-Policy\"] = \"same-origin\";\n\t}\n\n\tconst ev = new ScramjetHandleResponseEvent(\n\t\tresponseBody,\n\t\tresponseHeaders,\n\t\tresponse.status,\n\t\tresponse.statusText,\n\t\tdestination,\n\t\turl,\n\t\tresponse,\n\t\tclient\n\t);\n\tswtarget.dispatchEvent(ev);\n\n\treturn new Response(ev.responseBody, {\n\t\theaders: ev.responseHeaders as HeadersInit,\n\t\tstatus: ev.status,\n\t\tstatusText: ev.statusText,\n\t});\n}\n\nasync function rewriteBody(\n\tresponse: BareResponseFetch,\n\tmeta: URLMeta,\n\tdestination: RequestDestination,\n\tworkertype: string,\n\tcookieStore: CookieStore\n): Promise<BodyType> {\n\tswitch (destination) {\n\t\tcase \"iframe\":\n\t\tcase \"document\":\n\t\t\tif (response.headers.get(\"content-type\")?.startsWith(\"text/html\")) {\n\t\t\t\t// note from percs: i think this has the potential to be slow asf, but for right now its fine (we should probably look for a better solution)\n\t\t\t\t// another note from percs: regex seems to be broken, gonna comment this out\n\t\t\t\t/*\n\t\t\t\tconst buf = await response.arrayBuffer();\n\t\t\t\tconst decode = new TextDecoder(\"utf-8\").decode(buf);\n\t\t\t\tconst charsetHeader = response.headers.get(\"content-type\");\n\t\t\t\tconst charset =\n\t\t\t\t\tcharsetHeader?.split(\"charset=\")[1] ||\n\t\t\t\t\tdecode.match(/charset=([^\"]+)/)?.[1] ||\n\t\t\t\t\t\"utf-8\";\n\t\t\t\tconst htmlContent = charset\n\t\t\t\t\t? new TextDecoder(charset).decode(buf)\n\t\t\t\t\t: decode;\n\t\t\t\t*/\n\t\t\t\treturn rewriteHtml(await response.text(), cookieStore, meta, true);\n\t\t\t} else {\n\t\t\t\treturn response.body;\n\t\t\t}\n\t\tcase \"script\":\n\t\t\treturn rewriteJs(await response.arrayBuffer(), response.finalURL, meta);\n\t\tcase \"style\":\n\t\t\treturn rewriteCss(await response.text(), meta);\n\t\tcase \"sharedworker\":\n\t\tcase \"worker\":\n\t\t\treturn rewriteWorkers(\n\t\t\t\tawait response.arrayBuffer(),\n\t\t\t\tworkertype,\n\t\t\t\tresponse.finalURL,\n\t\t\t\tmeta\n\t\t\t);\n\t\tdefault:\n\t\t\treturn response.body;\n\t}\n}\n\ntype BodyType = string | ArrayBuffer | Blob | ReadableStream<any>;\n\nexport class ScramjetHandleResponseEvent extends Event {\n\tconstructor(\n\t\tpublic responseBody: BodyType,\n\t\tpublic responseHeaders: Record<string, string>,\n\t\tpublic status: number,\n\t\tpublic statusText: string,\n\t\tpublic destination: string,\n\t\tpublic url: URL,\n\t\tpublic rawResponse: BareResponseFetch,\n\t\tpublic client: Client\n\t) {\n\t\tsuper(\"handleResponse\");\n\t}\n}\n\nexport class ScramjetRequestEvent extends Event {\n\tconstructor(\n\t\tpublic url: URL,\n\t\tpublic body: BodyType,\n\t\tpublic method: string,\n\t\tpublic destination: string,\n\t\tpublic client: Client,\n\t\tpublic requestHeaders: Record<string, string>\n\t) {\n\t\tsuper(\"request\");\n\t}\n\tpublic response?: BareResponseFetch;\n}\n","import { $scramjet } from \"../scramjet\";\n\nexport function errorTemplate(trace: string, fetchedURL: string) {\n\t// turn script into a data URI so we don\"t have to escape any HTML values\n\tconst script = `\n errorTrace.value = ${JSON.stringify(trace)};\n fetchedURL.textContent = ${JSON.stringify(fetchedURL)};\n for (const node of document.querySelectorAll(\"#hostname\")) node.textContent = ${JSON.stringify(location.hostname)};\n reload.addEventListener(\"click\", () => location.reload());\n version.textContent = ${JSON.stringify($scramjet.version.version)};\n build.textContent = ${JSON.stringify($scramjet.version.build)};\n \n document.getElementById('copy-button').addEventListener('click', async () => {\n const text = document.getElementById('errorTrace').value;\n await navigator.clipboard.writeText(text);\n const btn = document.getElementById('copy-button');\n btn.textContent = 'Copied!';\n setTimeout(() => btn.textContent = 'Copy', 2000);\n });\n `;\n\n\treturn `<!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\" />\n <title>Scramjet</title>\n <style>\n :root {\n --deep: #080602;\n --shallow: #181412;\n --beach: #f1e8e1;\n --shore: #b1a8a1;\n --accent: #ffa938;\n --font-sans: -apple-system, system-ui, BlinkMacSystemFont, sans-serif;\n --font-monospace: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n }\n\n *:not(div,p,span,ul,li,i,span) {\n background-color: var(--deep);\n color: var(--beach);\n font-family: var(--font-sans);\n }\n\n textarea,\n button {\n background-color: var(--shallow);\n border-radius: 0.6em;\n padding: 0.6em;\n border: none;\n appearance: none;\n font-family: var(--font-sans);\n color: var(--beach);\n }\n\n button.primary {\n background-color: var(--accent);\n color: var(--deep);\n font-weight: bold;\n }\n\n textarea {\n resize: none;\n height: 20em;\n text-align: left;\n font-family: var(--font-monospace);\n }\n\n body {\n width: 100vw;\n height: 100vh;\n justify-content: center;\n align-items: center;\n }\n\n body,\n html,\n #inner {\n display: flex;\n align-items: center;\n flex-direction: column;\n gap: 0.5em;\n overflow: hidden;\n }\n\n #inner {\n z-index: 100;\n }\n\n #cover {\n position: absolute;\n width: 100%;\n height: 100%;\n background-color: color-mix(in srgb, var(--deep) 70%, transparent);\n z-index: 99;\n }\n\n #info {\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n gap: 1em;\n }\n\n #version-wrapper {\n width: auto;\n text-align: right;\n position: absolute;\n top: 0.5rem;\n right: 0.5rem;\n font-size: 0.8rem;\n color: var(--shore)!important;\n i {\n background-color: color-mix(in srgb, var(--deep), transparent 50%);\n border-radius: 9999px;\n padding: 0.2em 0.5em;\n }\n z-index: 101;\n }\n\n #errorTrace-wrapper {\n position: relative;\n width: fit-content;\n }\n\n #copy-button {\n position: absolute;\n top: 0.5em;\n right: 0.5em;\n padding: 0.23em;\n cursor: pointer;\n opacity: 0;\n transition: opacity 0.4s;\n font-size: 0.9em;\n }\n\n #errorTrace-wrapper:hover #copy-button {\n opacity: 1;\n }\n </style>\n </head>\n <body>\n <div id=\"cover\"></div>\n <div id=\"inner\">\n <h1 id=\"errorTitle\">Uh oh!</h1>\n <p>There was an error loading <b id=\"fetchedURL\"></b></p>\n <!-- <p id=\"errorMessage\">Internal Server Error</p> -->\n\n <div id=\"info\">\n <div id=\"errorTrace-wrapper\">\n <textarea id=\"errorTrace\" cols=\"40\" rows=\"10\" readonly></textarea>\n <button id=\"copy-button\" class=\"primary\">Copy</button>\n </div>\n <div id=\"troubleshooting\">\n <p>Try:</p>\n <ul>\n <li>Checking your internet connection</li>\n <li>Verifying you entered the correct address</li>\n <li>Clearing the site data</li>\n <li>Contacting <b id=\"hostname\"></b>'s administrator</li>\n <li>Verify the server isn't censored</li>\n </ul>\n <p>If you're the administrator of <b id=\"hostname\"></b>, try:</p>\n <ul>\n <li>Restarting your server</li>\n <li>Updating Scramjet</li>\n <li>Troubleshooting the error on the <a href=\"https://github.com/MercuryWorkshop/scramjet\" target=\"_blank\">GitHub repository</a></li>\n </ul>\n </div>\n </div>\n <br>\n <button id=\"reload\" class=\"primary\">Reload</button>\n </div>\n <p id=\"version-wrapper\"><i>Scramjet v<span id=\"version\"></span> (build <span id=\"build\"></span>)</i></p>\n <script src=\"${\"data:application/javascript,\" + encodeURIComponent(script)}\"></script>\n </body>\n </html>\n `;\n}\n\nexport function renderError(err: unknown, fetchedURL: string) {\n\tconst headers = {\n\t\t\"content-type\": \"text/html\",\n\t};\n\tif (crossOriginIsolated) {\n\t\theaders[\"Cross-Origin-Embedder-Policy\"] = \"require-corp\";\n\t}\n\n\treturn new Response(errorTemplate(String(err), fetchedURL), {\n\t\tstatus: 500,\n\t\theaders: headers,\n\t});\n}\n","import { FakeServiceWorker } from \"./fakesw\";\nimport { handleFetch } from \"./fetch\";\nimport type BareClient from \"@mercuryworkshop/bare-mux\";\nimport { ScramjetConfig } from \"../types\";\nimport { $scramjet, loadCodecs } from \"../scramjet\";\n\nexport class ScramjetServiceWorker extends EventTarget {\n\tclient: BareClient;\n\tconfig: ScramjetConfig;\n\n\tsyncPool: Record<number, (val?: any) => void> = {};\n\tsynctoken = 0;\n\n\tcookieStore = new $scramjet.shared.CookieStore();\n\n\tserviceWorkers: FakeServiceWorker[] = [];\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.client = new $scramjet.shared.util.BareClient();\n\n\t\tconst db = indexedDB.open(\"$scramjet\", 1);\n\n\t\tdb.onsuccess = () => {\n\t\t\tconst res = db.result;\n\t\t\tconst tx = res.transaction(\"cookies\", \"readonly\");\n\t\t\tconst store = tx.objectStore(\"cookies\");\n\t\t\tconst cookies = store.get(\"cookies\");\n\n\t\t\tcookies.onsuccess = () => {\n\t\t\t\tif (cookies.result) {\n\t\t\t\t\tthis.cookieStore.load(cookies.result);\n\t\t\t\t\tdbg.log(\"Loaded cookies from IDB!\");\n\t\t\t\t}\n\t\t\t};\n\t\t};\n\n\t\taddEventListener(\"message\", async ({ data }: { data: MessageC2W }) => {\n\t\t\tif (!(\"scramjet$type\" in data)) return;\n\n\t\t\tif (data.scramjet$type === \"registerServiceWorker\") {\n\t\t\t\tthis.serviceWorkers.push(new FakeServiceWorker(data.port, data.origin));\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (data.scramjet$type === \"cookie\") {\n\t\t\t\tthis.cookieStore.setCookies([data.cookie], new URL(data.url));\n\t\t\t\tconst res = db.result;\n\t\t\t\tconst tx = res.transaction(\"cookies\", \"readwrite\");\n\t\t\t\tconst store = tx.objectStore(\"cookies\");\n\t\t\t\tstore.put(JSON.parse(this.cookieStore.dump()), \"cookies\");\n\t\t\t}\n\t\t});\n\t}\n\n\tasync loadConfig() {\n\t\tif (this.config) return;\n\n\t\tconst request = indexedDB.open(\"$scramjet\", 1);\n\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\trequest.onsuccess = async () => {\n\t\t\t\tconst db = request.result;\n\t\t\t\tconst tx = db.transaction(\"config\", \"readonly\");\n\t\t\t\tconst store = tx.objectStore(\"config\");\n\t\t\t\tconst config = store.get(\"config\");\n\n\t\t\t\tconfig.onsuccess = () => {\n\t\t\t\t\tthis.config = config.result;\n\t\t\t\t\t$scramjet.config = config.result;\n\n\t\t\t\t\tloadCodecs();\n\n\t\t\t\t\tresolve();\n\t\t\t\t};\n\t\t\t\tconfig.onerror = () => reject(config.error);\n\t\t\t};\n\n\t\t\trequest.onerror = () => reject(request.error);\n\t\t});\n\t}\n\n\troute({ request }: FetchEvent) {\n\t\tif (request.url.startsWith(location.origin + this.config.prefix))\n\t\t\treturn true;\n\t\telse return false;\n\t}\n\n\tasync fetch({ request, clientId }: FetchEvent) {\n\t\tconst client = await self.clients.get(clientId);\n\n\t\treturn handleFetch.call(this, request, client);\n\t}\n}\n\n// @ts-ignore\nself.ScramjetServiceWorker = ScramjetServiceWorker;\n\ntype RegisterServiceWorkerMessage = {\n\tscramjet$type: \"registerServiceWorker\";\n\tport: MessagePort;\n\torigin: string;\n};\n\ntype CookieMessage = {\n\tscramjet$type: \"cookie\";\n\tcookie: string;\n\turl: string;\n};\n\ntype MessageCommon = {\n\tscramjet$type: string;\n\tscramjet$token: number;\n};\n\ntype MessageTypeC2W = RegisterServiceWorkerMessage | CookieMessage;\ntype MessageTypeW2C = CookieMessage;\n\n// c2w: client to (service) worker\nexport type MessageC2W = MessageCommon & MessageTypeC2W;\nexport type MessageW2C = MessageCommon & MessageTypeW2C;\n"],"names":["severity","message","args","old","Error","_","stack","fmt","i","Math","e","fn","console","FakeServiceWorker","handle","origin","MessageChannel","event","data","cb","request","token","Array","transfer","r","Promise","resolve","Response","self","COMMITHASH","VERSION","flagEnabled","flag","url","value","$scramjet","regex","partialflags","RegExp","nativeFunction","Function","BareClient","ScramjetHeaders","BareMuxConnection","rewriteUrl","unrewriteUrl","rewriteBlob","unrewriteBlob","rewriteCss","unrewriteCss","rewriteHtml","unrewriteHtml","rewriteSrcset","rewriteJs","rewriteHeaders","rewriteWorkers","htmlRules","CookieStore","newmeta","handleFetch","client","urlParam","URLSearchParams","URL","requesturl","workertype","body","dataurl","response","fetch","rewriteBody","headers","Object","crossOriginIsolated","activeWorker","w","key","clientURL","cookies","ev","ScramjetRequestEvent","handleResponse","err","errorDetails","Date","undefined","renderError","fetchedURL","errorTemplate","trace","script","JSON","location","encodeURIComponent","String","destination","cookieStore","swtarget","responseBody","responseHeaders","maybeHeaders","cookie","header","type","filename","ScramjetHandleResponseEvent","meta","Event","status","statusText","rawResponse","method","requestHeaders","ScramjetServiceWorker","EventTarget","db","indexedDB","store","tx","res","dbg","addEventListener","reject","config","clientId"],"mappings":"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"}