@axis-network/butter-col 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +81 -2
  3. package/bin/butter-col.js +4 -0
  4. package/dist/bootstrap.html +67 -0
  5. package/dist/client.js +2 -0
  6. package/dist/client.js.map +7 -0
  7. package/dist/controller.mjs +2 -0
  8. package/dist/controller.mjs.map +7 -0
  9. package/dist/formatter.mjs +2 -0
  10. package/dist/formatter.mjs.map +7 -0
  11. package/dist/sw.js +30 -0
  12. package/dist/sw.js.map +7 -0
  13. package/dist/transports/butter.js +2 -0
  14. package/dist/transports/butter.js.map +7 -0
  15. package/dist/types/controller/index.d.ts +65 -0
  16. package/dist/types/formatter/codecs.d.ts +17 -0
  17. package/dist/types/formatter/css.d.ts +10 -0
  18. package/dist/types/formatter/html.d.ts +61 -0
  19. package/dist/types/formatter/index.d.ts +77 -0
  20. package/dist/types/formatter/js.d.ts +27 -0
  21. package/dist/types/formatter/url.d.ts +40 -0
  22. package/lib/cli.js +257 -0
  23. package/lib/index.d.ts +68 -0
  24. package/lib/index.js +166 -0
  25. package/package.json +77 -4
  26. package/server/conf/butter-proxy.conf.template +29 -0
  27. package/server/conf/mime.types +19 -0
  28. package/server/conf/nginx.conf.template +152 -0
  29. package/server/config.lua +34 -0
  30. package/server/lua/butter/config.lua +160 -0
  31. package/server/lua/butter/cookiejar.lua +197 -0
  32. package/server/lua/butter/dns.lua +67 -0
  33. package/server/lua/butter/guard.lua +78 -0
  34. package/server/lua/butter/headers.lua +83 -0
  35. package/server/lua/butter/init.lua +18 -0
  36. package/server/lua/butter/ip.lua +165 -0
  37. package/server/lua/butter/limit.lua +18 -0
  38. package/server/lua/butter/session.lua +42 -0
  39. package/server/lua/butter/store.lua +77 -0
  40. package/server/lua/butter/transport.lua +248 -0
  41. package/server/lua/butter/url.lua +78 -0
  42. package/site/app.css +373 -0
  43. package/site/app.js +335 -0
  44. package/site/butter-col.png +0 -0
  45. package/site/index.html +139 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/formatter/codecs.js", "../src/formatter/url.js", "../src/formatter/css.js", "../src/formatter/js.js", "../src/formatter/html.js", "../src/formatter/index.js", "../src/controller/index.ts"],
4
+ "sourcesContent": ["/**\n * URL codecs. A codec turns an absolute target URL (without its fragment)\n * into the string that follows the proxy prefix, and back again.\n *\n * Every codec must satisfy: decode(encode(url)) === url.\n */\n\n/** @typedef {{ encode(url: string): string, decode(encoded: string): string }} Codec */\n\n/** Structure preserving: /butter/go/https://example.com/a/b?c */\nconst none = {\n encode: (url) => url,\n decode: (encoded) => encoded,\n};\n\n/** encodeURIComponent of the whole URL (same idea as Scramjet's \"plain\"). */\nconst plain = {\n encode: (url) => encodeURIComponent(url),\n decode: (encoded) => decodeURIComponent(encoded),\n};\n\n/** XOR every second character with 2 (same scheme as Ultraviolet). */\nfunction xorString(str) {\n let out = \"\";\n for (let i = 0; i < str.length; i++) {\n out += i % 2 ? String.fromCharCode(str.charCodeAt(i) ^ 2) : str[i];\n }\n return out;\n}\n\nconst xor = {\n encode: (url) => encodeURIComponent(xorString(url)),\n decode: (encoded) => xorString(decodeURIComponent(encoded)),\n};\n\n/** URL-safe base64 of the UTF-8 bytes, without padding. */\nconst base64 = {\n encode(url) {\n const bytes = new TextEncoder().encode(url);\n let bin = \"\";\n for (let i = 0; i < bytes.length; i++) bin += String.fromCharCode(bytes[i]);\n return btoa(bin).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n },\n decode(encoded) {\n let b64 = encoded.replace(/-/g, \"+\").replace(/_/g, \"/\");\n while (b64.length % 4) b64 += \"=\";\n const bin = atob(b64);\n const bytes = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes);\n },\n};\n\n/** @type {Record<string, Codec>} */\nexport const codecs = { none, plain, xor, base64 };\n\n/**\n * @param {string} name\n * @returns {Codec}\n */\nexport function getCodec(name) {\n const codec = codecs[name];\n if (!codec) throw new Error(`butter: unknown codec \"${name}\"`);\n return codec;\n}\n", "import { getCodec } from \"./codecs.js\";\n\n/** Marker placed after the prefix for module workers: /butter/go/~m/<encoded> */\nexport const MODULE_WORKER_MARK = \"~m/\";\n\nconst PASSTHROUGH_SCHEMES = /^(?:data|blob|about|mailto|tel|sms|javascript|intent|chrome|chrome-extension|moz-extension|file|filesystem):/i;\nconst TARGET_SCHEME = /^(?:https?|wss?):\\/\\//i;\n\n/**\n * @typedef {object} UrlRewriterOptions\n * @property {string} origin Proxy origin, e.g. \"https://proxy.example\"\n * @property {string} prefix Path prefix for proxied URLs, e.g. \"/butter/go/\"\n * @property {string} codec Codec name, see codecs.js\n */\n\n/**\n * @param {UrlRewriterOptions} options\n */\nexport function createUrlRewriter({ origin, prefix, codec: codecName }) {\n const codec = getCodec(codecName);\n const absPrefix = origin + prefix;\n\n /**\n * Decode the part of a proxied path that follows the prefix.\n * Returns null when the tail is not a valid encoded URL (for example a\n * relative path that the browser resolved against the proxy URL).\n * @param {string} tail\n * @returns {string | null}\n */\n function decodeTail(tail) {\n if (tail.startsWith(MODULE_WORKER_MARK)) tail = tail.slice(MODULE_WORKER_MARK.length);\n let decoded;\n try {\n decoded = codec.decode(tail);\n } catch {\n return null;\n }\n if (!TARGET_SCHEME.test(decoded)) return null;\n try {\n return new URL(decoded).href;\n } catch {\n return null;\n }\n }\n\n /**\n * Is this an already rewritten URL (absolute or path-absolute)?\n * @param {string} url\n */\n function isProxied(url) {\n return url.startsWith(absPrefix) || url.startsWith(prefix);\n }\n\n /**\n * Rewrite a URL found in a page so that it points through the proxy.\n * Non-http(s) URLs and fragment-only references are returned unchanged.\n * @param {string} raw\n * @param {string | URL} base The target (unproxied) base URL\n * @param {{ moduleWorker?: boolean }} [opts]\n * @returns {string}\n */\n function rewrite(raw, base, opts) {\n if (raw == null) return raw;\n const str = String(raw);\n const trimmed = str.trim();\n if (!trimmed || trimmed.startsWith(\"#\") || PASSTHROUGH_SCHEMES.test(trimmed)) return str;\n if (isProxied(trimmed)) return trimmed;\n let abs;\n try {\n abs = new URL(trimmed, base);\n } catch {\n return str;\n }\n if (abs.protocol !== \"http:\" && abs.protocol !== \"https:\") return str;\n const hash = abs.hash;\n abs.hash = \"\";\n const mark = opts && opts.moduleWorker ? MODULE_WORKER_MARK : \"\";\n return absPrefix + mark + codec.encode(abs.href) + hash;\n }\n\n /**\n * Turn a proxied URL back into the target URL. Anything that is not a\n * proxied URL is returned unchanged.\n * @param {string} url\n * @returns {string}\n */\n function unrewrite(url) {\n if (url == null) return url;\n const str = String(url);\n let rest;\n if (str.startsWith(absPrefix)) rest = str.slice(absPrefix.length);\n else if (str.startsWith(prefix)) rest = str.slice(prefix.length);\n else return str;\n\n let hash = \"\";\n const hashAt = rest.indexOf(\"#\");\n if (hashAt !== -1) {\n hash = rest.slice(hashAt);\n rest = rest.slice(0, hashAt);\n }\n let search = \"\";\n const searchAt = rest.indexOf(\"?\");\n if (searchAt !== -1) {\n search = rest.slice(searchAt);\n rest = rest.slice(0, searchAt);\n }\n const decoded = decodeTail(rest);\n if (decoded === null) return str;\n if (!search) return decoded + hash;\n const target = new URL(decoded);\n target.search = search;\n return target.href + hash;\n }\n\n /**\n * @param {string} value A srcset attribute value\n * @param {string | URL} base\n * @param {(url: string, base: string | URL) => string} [map]\n */\n function rewriteSrcset(value, base, map = rewrite) {\n // Follows the HTML \"parse a srcset attribute\" algorithm closely enough to\n // keep data: URLs (which contain commas) intact.\n let out = \"\";\n let i = 0;\n const n = value.length;\n while (i < n) {\n const wsStart = i;\n while (i < n && (/\\s/.test(value[i]) || value[i] === \",\")) i++;\n out += value.slice(wsStart, i);\n if (i >= n) break;\n const urlStart = i;\n while (i < n && !/\\s/.test(value[i])) i++;\n let url = value.slice(urlStart, i);\n let trailing = \"\";\n const commas = url.match(/,+$/);\n if (commas) {\n trailing = commas[0];\n url = url.slice(0, -trailing.length);\n }\n out += map(url, base) + trailing;\n if (trailing) continue;\n // Descriptors run until the next comma that is not inside parentheses.\n const descStart = i;\n let depth = 0;\n while (i < n) {\n const ch = value[i];\n if (ch === \"(\") depth++;\n else if (ch === \")\") depth = Math.max(0, depth - 1);\n else if (ch === \",\" && depth === 0) break;\n i++;\n }\n out += value.slice(descStart, i);\n }\n return out;\n }\n\n return {\n origin,\n prefix,\n codec,\n decodeTail,\n isProxied,\n rewrite,\n unrewrite,\n rewriteSrcset,\n unrewriteSrcset: (value) => rewriteSrcset(value, \"\", (url) => unrewrite(url)),\n };\n}\n\n/** @typedef {ReturnType<typeof createUrlRewriter>} UrlRewriter */\n", "/**\n * CSS rewriting: url(...) references and @import strings.\n */\n\nconst URL_FUNCTION = /url\\(\\s*(?:\"((?:[^\"\\\\\\n]|\\\\.)*)\"|'((?:[^'\\\\\\n]|\\\\.)*)'|((?:[^)\\s\"'\\\\]|\\\\.)*))\\s*\\)/gi;\nconst IMPORT_STRING = /@import\\s+(?:\"((?:[^\"\\\\\\n]|\\\\.)*)\"|'((?:[^'\\\\\\n]|\\\\.)*)')/gi;\n\n/**\n * @param {string} css\n * @param {string | URL} base\n * @param {(url: string, base: string | URL) => string} rewriteUrl\n * @returns {string}\n */\nexport function rewriteCss(css, base, rewriteUrl) {\n if (!css || (css.indexOf(\"url(\") === -1 && css.indexOf(\"URL(\") === -1 && css.indexOf(\"@import\") === -1)) {\n return css;\n }\n const map = (raw) => {\n // CSS escapes inside URLs are rare; only unescape the trivial cases.\n const url = raw.replace(/\\\\([^0-9a-fA-F\\n])/g, \"$1\");\n if (!url || url.startsWith(\"#\") || /^data:/i.test(url)) return null;\n const rewritten = rewriteUrl(url, base);\n return rewritten === url ? null : rewritten;\n };\n return css\n .replace(URL_FUNCTION, (match, dq, sq, bare) => {\n const raw = dq ?? sq ?? bare ?? \"\";\n const rewritten = map(raw);\n return rewritten === null ? match : `url(\"${rewritten.replace(/[\"\\\\\\n]/g, \"\\\\$&\")}\")`;\n })\n .replace(IMPORT_STRING, (match, dq, sq) => {\n const rewritten = map(dq ?? sq ?? \"\");\n return rewritten === null ? match : `@import \"${rewritten.replace(/[\"\\\\\\n]/g, \"\\\\$&\")}\"`;\n });\n}\n", "/**\n * JavaScript rewriting.\n *\n * butter-col does not parse JavaScript into an AST. Instead a small,\n * error-tolerant tokenizer walks the source and applies a handful of targeted\n * edits. Everything else (fetches, imports, workers, ...) is handled at\n * runtime by the service worker and the client hooks, so the rewriter only\n * has to deal with what cannot be hooked:\n *\n * location / x.location / x?.location / x[\"location\"]\n * -> __butter$location (resolved by an accessor on Object.prototype)\n * eval(code)\n * -> eval(__butter$js(code)) (stays a *direct* eval)\n * import.meta.url\n * -> __butter$unrewrite(import.meta.url)\n *\n * The tokenizer never edits inside strings, template text, comments or regex\n * literals, and every edit is local, so a mis-scan can at worst miss an edit.\n */\n\nexport const LOCATION = \"__butter$location\";\nexport const EVAL_WRAP = \"__butter$js\";\nexport const UNREWRITE = \"__butter$unrewrite\";\n\nconst NEEDS_REWRITE = /location|eval|import\\s*\\.\\s*meta/;\n\n/** Identifiers after which a `/` starts a regular expression. */\nconst EXPR_KEYWORDS = new Set([\n \"return\", \"typeof\", \"instanceof\", \"in\", \"of\", \"new\", \"delete\", \"void\", \"throw\",\n \"case\", \"do\", \"else\", \"yield\", \"await\", \"extends\",\n]);\n\n/** Punctuators after which `{` opens an object literal rather than a block. */\nconst OBJECT_AFTER_PUNC = new Set([\n \"(\", \"[\", \",\", \"=\", \":\", \"?\", \"...\", \"!\", \"&\", \"|\", \"^\", \"~\", \"+\", \"-\", \"*\", \"/\", \"%\",\n \"<\", \">\", \"${\", \"??\", \"?.\",\n]);\nconst OBJECT_AFTER_KEYWORD = new Set([\n \"return\", \"yield\", \"await\", \"typeof\", \"void\", \"in\", \"of\", \"case\", \"throw\", \"delete\",\n]);\n\nconst IMPORT_META_URL = /import\\s*\\.\\s*meta\\s*\\.\\s*url(?![\\w$])/y;\n\nfunction isIdStart(c) {\n return (c >= 97 && c <= 122) || (c >= 65 && c <= 90) || c === 36 || c === 95 || c >= 128;\n}\n\nfunction isIdPart(c) {\n return isIdStart(c) || (c >= 48 && c <= 57);\n}\n\nfunction isWhitespace(c) {\n return c === 32 || c === 9 || c === 10 || c === 13 || c === 11 || c === 12 ||\n c === 0xa0 || c === 0xfeff || c === 0x2028 || c === 0x2029 || c === 0x1680 ||\n (c >= 0x2000 && c <= 0x200a) || c === 0x202f || c === 0x205f || c === 0x3000;\n}\n\nfunction isLineTerminator(c) {\n return c === 10 || c === 13 || c === 0x2028 || c === 0x2029;\n}\n\n/**\n * @param {string} src\n * @returns {string}\n */\nexport function rewriteJs(src) {\n if (typeof src !== \"string\" || !NEEDS_REWRITE.test(src)) return src;\n\n const n = src.length;\n /** @type {Array<[number, number, string]>} start, end, replacement */\n const edits = [];\n\n let prevType = \"\"; // \"id\" | \"num\" | \"str\" | \"tmpl\" | \"regex\" | \"punc\"\n let prevVal = \"\";\n let prev2Type = \"\";\n let prev2Val = \"\";\n /** Open `{` kinds: \"obj\" | \"block\" | \"ie-import\" | \"ie-export\" | \"tmpl\" */\n const braces = [];\n /** Open `(`: null, or the index of the `(` of an eval call */\n const parens = [];\n /** Inside an import statement, before `from` */\n let inImport = false;\n\n const push = (type, val) => {\n prev2Type = prevType;\n prev2Val = prevVal;\n prevType = type;\n prevVal = val;\n };\n\n /** Index of the next character that is not whitespace or a comment. */\n const skipTrivia = (pos) => {\n while (pos < n) {\n const c = src.charCodeAt(pos);\n if (isWhitespace(c)) {\n pos++;\n } else if (c === 47 && src.charCodeAt(pos + 1) === 47) {\n while (pos < n && !isLineTerminator(src.charCodeAt(pos))) pos++;\n } else if (c === 47 && src.charCodeAt(pos + 1) === 42) {\n const end = src.indexOf(\"*/\", pos + 2);\n pos = end === -1 ? n : end + 2;\n } else {\n break;\n }\n }\n return pos;\n };\n\n const peekWord = (pos) => {\n let j = skipTrivia(pos);\n const start = j;\n while (j < n && isIdPart(src.charCodeAt(j))) j++;\n return src.slice(start, j);\n };\n\n const regexAllowed = () => {\n if (!prevType) return true;\n if (prevType === \"punc\") return prevVal !== \")\" && prevVal !== \"]\" && prevVal !== \"++\" && prevVal !== \"--\";\n if (prevType === \"id\") return EXPR_KEYWORDS.has(prevVal);\n return false;\n };\n\n const scanString = (i, quote) => {\n let j = i + 1;\n while (j < n) {\n const c = src.charCodeAt(j);\n if (c === 92) j += 2;\n else if (c === quote) return j + 1;\n else if (c === 10 || c === 13) return j; // unterminated, recover\n else j++;\n }\n return n;\n };\n\n /** Scan template text starting at j. Returns [end, opensSubstitution]. */\n const scanTemplate = (j) => {\n while (j < n) {\n const c = src.charCodeAt(j);\n if (c === 92) j += 2;\n else if (c === 96) return [j + 1, false];\n else if (c === 36 && src.charCodeAt(j + 1) === 123) return [j + 2, true];\n else j++;\n }\n return [n, false];\n };\n\n /** Returns the end of the regex literal starting at i, or -1. */\n const scanRegex = (i) => {\n let j = i + 1;\n let inClass = false;\n while (j < n) {\n const c = src.charCodeAt(j);\n if (isLineTerminator(c)) return -1;\n if (c === 92) {\n if (j + 1 >= n || isLineTerminator(src.charCodeAt(j + 1))) return -1;\n j += 2;\n continue;\n }\n if (inClass) {\n if (c === 93) inClass = false;\n } else if (c === 91) {\n inClass = true;\n } else if (c === 47) {\n j++;\n while (j < n && isIdPart(src.charCodeAt(j))) j++;\n return j;\n }\n j++;\n }\n return -1;\n };\n\n const handleTemplate = (start) => {\n const [end, opens] = scanTemplate(start);\n if (opens) {\n braces.push(\"tmpl\");\n push(\"punc\", \"${\");\n } else {\n push(\"tmpl\", \"\");\n }\n return end;\n };\n\n const handleLocation = (start, end) => {\n if (prevType === \"punc\" && (prevVal === \".\" || prevVal === \"?.\")) {\n edits.push([start, end, LOCATION]);\n return;\n }\n const top = braces[braces.length - 1];\n if (top === \"ie-import\" || top === \"ie-export\") {\n const importing = top === \"ie-import\";\n if (prevType === \"id\" && prevVal === \"as\") {\n if (importing) edits.push([start, end, LOCATION]); // local binding\n } else if (peekWord(end) === \"as\") {\n if (!importing) edits.push([start, end, LOCATION]); // local binding\n } else {\n edits.push([start, end, importing ? `location as ${LOCATION}` : `${LOCATION} as location`]);\n }\n return;\n }\n if (top === \"obj\" && prevType === \"punc\" && (prevVal === \"{\" || prevVal === \",\")) {\n const next = src[skipTrivia(end)];\n if (next === \":\") return; // property key\n if (next === \",\" || next === \"}\") {\n edits.push([start, end, `location: ${LOCATION}`]); // shorthand property\n return;\n }\n }\n edits.push([start, end, LOCATION]);\n };\n\n let i = 0;\n if (src.startsWith(\"#!\")) {\n while (i < n && !isLineTerminator(src.charCodeAt(i))) i++;\n }\n\n while (i < n) {\n const c = src.charCodeAt(i);\n\n if (isWhitespace(c)) {\n i++;\n continue;\n }\n\n // Comments, regular expressions and division.\n if (c === 47) {\n const d = src.charCodeAt(i + 1);\n if (d === 47 || d === 42) {\n i = skipTrivia(i);\n continue;\n }\n if (regexAllowed()) {\n const end = scanRegex(i);\n if (end !== -1) {\n i = end;\n push(\"regex\", \"\");\n continue;\n }\n }\n i++;\n push(\"punc\", \"/\");\n continue;\n }\n\n // Strings.\n if (c === 34 || c === 39) {\n const end = scanString(i, c);\n const value = src.slice(i + 1, end - 1);\n if (\n value === \"location\" &&\n prevType === \"punc\" && prevVal === \"[\" &&\n ((prev2Type === \"id\" && !EXPR_KEYWORDS.has(prev2Val)) || prev2Val === \")\" || prev2Val === \"]\") &&\n src[skipTrivia(end)] === \"]\"\n ) {\n const quote = src[i];\n edits.push([i, end, quote + LOCATION + quote]);\n }\n i = end;\n push(\"str\", value);\n continue;\n }\n\n // Template literals.\n if (c === 96) {\n i = handleTemplate(i + 1);\n continue;\n }\n\n // Identifiers and keywords.\n if (isIdStart(c) || c === 92) {\n let j = i;\n let escaped = false;\n while (j < n) {\n const cc = src.charCodeAt(j);\n if (cc === 92) {\n // \\uXXXX or \\u{X...} escape inside an identifier\n escaped = true;\n if (src.charCodeAt(j + 2) === 123) {\n const close = src.indexOf(\"}\", j);\n j = close === -1 ? n : close + 1;\n } else {\n j += 6;\n }\n } else if (isIdPart(cc) && !isWhitespace(cc)) {\n j++;\n } else {\n break;\n }\n }\n const value = src.slice(i, j);\n const afterDot = prevType === \"punc\" && (prevVal === \".\" || prevVal === \"?.\");\n\n if (!escaped) {\n if (value === \"location\") {\n handleLocation(i, j);\n } else if (value === \"import\" && !afterDot) {\n IMPORT_META_URL.lastIndex = i;\n if (IMPORT_META_URL.test(src)) {\n const end = IMPORT_META_URL.lastIndex;\n edits.push([i, end, `${UNREWRITE}(import.meta.url)`]);\n i = end;\n push(\"punc\", \")\");\n continue;\n }\n const next = src[skipTrivia(j)];\n if (next !== \"(\" && next !== \".\") inImport = true;\n } else if (value === \"from\" && inImport) {\n inImport = false;\n }\n }\n\n i = j;\n push(\"id\", value);\n continue;\n }\n\n // Private names and numbers.\n if (c === 35) {\n let j = i + 1;\n while (j < n && isIdPart(src.charCodeAt(j))) j++;\n push(\"id\", src.slice(i, j));\n i = j;\n continue;\n }\n if ((c >= 48 && c <= 57) || (c === 46 && src.charCodeAt(i + 1) >= 48 && src.charCodeAt(i + 1) <= 57)) {\n let j = i + 1;\n while (j < n) {\n const cc = src.charCodeAt(j);\n if (isIdPart(cc) || cc === 46) j++;\n else break;\n }\n i = j;\n push(\"num\", \"\");\n continue;\n }\n\n // Punctuators.\n switch (c) {\n case 123: { // {\n let kind = \"block\";\n if (prevType === \"id\" && (prevVal === \"import\" || prevVal === \"export\") && prev2Val !== \".\" && prev2Val !== \"?.\") {\n kind = \"ie-\" + prevVal;\n } else if (inImport && prevType === \"punc\" && prevVal === \",\") {\n kind = \"ie-import\";\n } else if ((prevType === \"punc\" && OBJECT_AFTER_PUNC.has(prevVal)) || (prevType === \"id\" && OBJECT_AFTER_KEYWORD.has(prevVal))) {\n kind = \"obj\";\n }\n braces.push(kind);\n i++;\n push(\"punc\", \"{\");\n continue;\n }\n case 125: { // }\n const kind = braces.pop();\n if (kind === \"tmpl\") {\n i = handleTemplate(i + 1);\n continue;\n }\n i++;\n push(\"punc\", \"}\");\n continue;\n }\n case 40: { // (\n const isEvalCall = prevType === \"id\" && prevVal === \"eval\" &&\n prev2Val !== \".\" && prev2Val !== \"?.\" && prev2Val !== \"function\";\n parens.push(isEvalCall ? i : null);\n i++;\n push(\"punc\", \"(\");\n continue;\n }\n case 41: { // )\n const open = parens.pop();\n // `eval(x) {` is a method definition, not a call.\n if (open != null && src[skipTrivia(i + 1)] !== \"{\") {\n edits.push([open + 1, open + 1, EVAL_WRAP + \"(\"]);\n edits.push([i, i, \")\"]);\n }\n i++;\n push(\"punc\", \")\");\n continue;\n }\n case 46: // .\n if (src.charCodeAt(i + 1) === 46 && src.charCodeAt(i + 2) === 46) {\n i += 3;\n push(\"punc\", \"...\");\n } else {\n i++;\n push(\"punc\", \".\");\n }\n continue;\n case 63: { // ?\n const d = src.charCodeAt(i + 1);\n const e = src.charCodeAt(i + 2);\n if (d === 46 && !(e >= 48 && e <= 57)) {\n i += 2;\n push(\"punc\", \"?.\");\n } else if (d === 63) {\n i += 2;\n push(\"punc\", \"??\");\n } else {\n i++;\n push(\"punc\", \"?\");\n }\n continue;\n }\n case 43: // +\n case 45: // -\n if (src.charCodeAt(i + 1) === c) {\n i += 2;\n push(\"punc\", c === 43 ? \"++\" : \"--\");\n } else {\n i++;\n push(\"punc\", src[i - 1]);\n }\n continue;\n case 61: // =\n if (src.charCodeAt(i + 1) === 62) {\n i += 2;\n push(\"punc\", \"=>\");\n } else {\n i++;\n push(\"punc\", \"=\");\n }\n continue;\n case 59: // ;\n inImport = false;\n i++;\n push(\"punc\", \";\");\n continue;\n default:\n i++;\n push(\"punc\", src[i - 1]);\n }\n }\n\n if (edits.length === 0) return src;\n\n edits.sort((a, b) => a[0] - b[0] || (a[1] - a[0]) - (b[1] - b[0]));\n let out = \"\";\n let last = 0;\n for (const [start, end, text] of edits) {\n if (start < last) continue; // overlapping edit; keep the first\n out += src.slice(last, start) + text;\n last = end;\n }\n return out + src.slice(last);\n}\n", "/**\n * HTML rewriting with a small, forgiving tokenizer (service workers have no\n * DOMParser). Only start tags are modified; text, comments and end tags are\n * copied through byte for byte, and unchanged tags keep their exact source.\n */\n\nconst RAW_TEXT = new Set([\"script\", \"style\", \"textarea\", \"title\", \"xmp\", \"iframe\", \"noembed\", \"noframes\", \"plaintext\"]);\n\nconst JS_TYPE = /^(?:|module|(?:text|application)\\/(?:x-)?(?:javascript|ecmascript)|text\\/jscript|text\\/livescript|text\\/javascript1\\.[0-5])$/i;\n\n/** Attributes holding a single URL, on any element. */\nexport const URL_ATTRS = new Set([\n \"href\", \"src\", \"action\", \"formaction\", \"poster\", \"background\", \"cite\", \"longdesc\",\n \"manifest\", \"codebase\", \"icon\", \"lowsrc\", \"dynsrc\", \"xlink:href\",\n]);\n\n/** Attributes whose name is changed so the browser ignores them. */\nconst NEUTRALIZE = {\n integrity: \"data-butter-integrity\",\n sandbox: \"data-butter-sandbox\", // sandboxed frames cannot be controlled by the service worker\n};\n\nconst NAMED_ENTITIES = { amp: \"&\", lt: \"<\", gt: \">\", quot: '\"', apos: \"'\", nbsp: String.fromCharCode(0xa0) };\nconst ENTITY = /&(?:#(\\d{1,7});?|#[xX]([0-9a-fA-F]{1,6});?|(amp|lt|gt|quot|apos|nbsp)(?:;|(?![=\\w])))/g;\n\n/** @param {string} value */\nexport function decodeEntities(value) {\n if (value.indexOf(\"&\") === -1) return value;\n return value.replace(ENTITY, (match, dec, hex, named) => {\n if (named) return NAMED_ENTITIES[named];\n const code = dec ? parseInt(dec, 10) : parseInt(hex, 16);\n return code > 0 && code <= 0x10ffff ? String.fromCodePoint(code) : String.fromCharCode(0xfffd);\n });\n}\n\n/** @param {string} value */\nexport function escapeAttribute(value) {\n return value.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\");\n}\n\nfunction isWs(c) {\n return c === 32 || c === 9 || c === 10 || c === 12 || c === 13;\n}\n\nfunction isLetter(c) {\n return (c >= 97 && c <= 122) || (c >= 65 && c <= 90);\n}\n\n/**\n * @typedef {object} RewriteContext\n * @property {string} base Target base URL used to resolve relative URLs\n * @property {string} [inject] Markup inserted at the start of the document\n */\n\n/**\n * Rewrite one attribute value. Returns the new value (possibly identical).\n * Shared by the HTML rewriter and the client runtime's setAttribute hook.\n *\n * @param {import(\"./index.js\").Formatter} f\n * @param {string} tag Lower-case tag name\n * @param {string} name Attribute name\n * @param {string} value Decoded attribute value\n * @param {RewriteContext} ctx\n * @returns {string}\n */\nexport function rewriteAttribute(f, tag, name, value, ctx) {\n const attr = name.toLowerCase();\n if (attr.length > 2 && attr.startsWith(\"on\")) return f.js(value);\n switch (attr) {\n case \"style\":\n return f.css(value, ctx.base);\n case \"srcset\":\n case \"imagesrcset\":\n return f.url.rewriteSrcset(value, ctx.base);\n case \"ping\":\n return value.split(/(\\s+)/).map((part) => (part.trim() ? f.rewriteUrl(part, ctx.base) : part)).join(\"\");\n case \"srcdoc\":\n return tag === \"iframe\" ? f.html(value, { base: ctx.base, inject: ctx.inject }) : value;\n case \"data\":\n return tag === \"object\" ? f.rewriteUrl(value, ctx.base) : value;\n }\n if (URL_ATTRS.has(attr)) {\n const trimmed = value.trim();\n if (/^javascript:/i.test(trimmed)) {\n const code = trimmed.slice(11);\n return code.indexOf(\"%\") === -1 ? \"javascript:\" + f.js(code) : value;\n }\n return f.rewriteUrl(value, ctx.base);\n }\n return value;\n}\n\n/**\n * @typedef {object} Attr\n * @property {string} name\n * @property {string | null} value Decoded value, null for boolean attributes\n * @property {number} start\n * @property {number} end\n * @property {string} [newName]\n * @property {string | null} [newValue]\n */\n\n/**\n * Parse a start tag beginning at `i` (src[i] === \"<\", src[i + 1] is a letter).\n * @param {string} src\n * @param {number} i\n */\nfunction parseStartTag(src, i) {\n const n = src.length;\n let j = i + 1;\n while (j < n) {\n const c = src.charCodeAt(j);\n if (isWs(c) || c === 47 || c === 62) break;\n j++;\n }\n const name = src.slice(i + 1, j).toLowerCase();\n /** @type {Attr[]} */\n const attrs = [];\n let selfClosing = false;\n\n while (j < n) {\n let c = src.charCodeAt(j);\n if (isWs(c)) {\n j++;\n continue;\n }\n if (c === 47) {\n if (src.charCodeAt(j + 1) === 62) {\n selfClosing = true;\n return { name, attrs, selfClosing, end: j + 2 };\n }\n j++;\n continue;\n }\n if (c === 62) return { name, attrs, selfClosing, end: j + 1 };\n\n const start = j++;\n while (j < n) {\n c = src.charCodeAt(j);\n if (isWs(c) || c === 47 || c === 62 || c === 61) break;\n j++;\n }\n const attrName = src.slice(start, j);\n let k = j;\n while (k < n && isWs(src.charCodeAt(k))) k++;\n if (src.charCodeAt(k) !== 61) {\n attrs.push({ name: attrName, value: null, start, end: j });\n continue;\n }\n k++;\n while (k < n && isWs(src.charCodeAt(k))) k++;\n const q = src.charCodeAt(k);\n let raw;\n if (q === 34 || q === 39) {\n const close = src.indexOf(q === 34 ? '\"' : \"'\", k + 1);\n if (close === -1) return null;\n raw = src.slice(k + 1, close);\n j = close + 1;\n } else {\n const vs = k;\n while (k < n && !isWs(src.charCodeAt(k)) && src.charCodeAt(k) !== 62) k++;\n raw = src.slice(vs, k);\n j = k;\n }\n attrs.push({ name: attrName, value: decodeEntities(raw), start, end: j });\n }\n return null; // unterminated tag at end of input\n}\n\n/** @param {Attr[]} attrs @param {string} name */\nfunction findAttr(attrs, name) {\n for (const attr of attrs) if (attr.name.toLowerCase() === name) return attr;\n return undefined;\n}\n\n/**\n * Work out the changes for one start tag, recording them on the attrs.\n * @returns {boolean} whether anything changed\n */\nfunction transformTag(f, tag, ctx, state) {\n let changed = false;\n const { name, attrs } = tag;\n\n if (name === \"meta\") {\n const equiv = findAttr(attrs, \"http-equiv\");\n const kind = equiv && equiv.value ? equiv.value.trim().toLowerCase() : \"\";\n if (kind.startsWith(\"content-security-policy\")) {\n equiv.newName = \"data-butter-http-equiv\";\n return true;\n }\n if (kind === \"refresh\") {\n const content = findAttr(attrs, \"content\");\n if (content && content.value) {\n const value = rewriteRefresh(f, content.value, ctx.base);\n if (value !== content.value) {\n content.newValue = value;\n changed = true;\n }\n }\n }\n return changed;\n }\n\n if (name === \"base\" && !state.baseSeen) {\n const href = findAttr(attrs, \"href\");\n if (href && href.value !== null) {\n state.baseSeen = true;\n try {\n ctx.base = new URL(href.value.trim(), ctx.base).href;\n } catch {\n // keep the previous base\n }\n }\n }\n\n for (const attr of attrs) {\n if (attr.value === null) continue;\n const lower = attr.name.toLowerCase();\n if (lower === \"data-butter\") return false; // our own markup\n const rename = NEUTRALIZE[lower];\n if (rename && (lower !== \"sandbox\" || name === \"iframe\")) {\n attr.newName = rename;\n changed = true;\n continue;\n }\n const value = rewriteAttribute(f, name, attr.name, attr.value, ctx);\n if (value !== attr.value) {\n attr.newValue = value;\n changed = true;\n }\n }\n return changed;\n}\n\n/**\n * Rewrite the URL in a refresh value such as \"5; url=/next\".\n * @returns {string}\n */\nexport function rewriteRefresh(f, value, base) {\n const match = value.match(/^(\\s*[\\d.]*\\s*[;,]?\\s*(?:url\\s*=\\s*)?)(['\"]?)(.*?)\\2(\\s*)$/i);\n if (!match || !match[3]) return value;\n return match[1] + match[2] + f.rewriteUrl(match[3], base) + match[2] + match[4];\n}\n\nfunction serializeTag(src, tag, i) {\n let out = \"\";\n let last = i;\n for (const attr of tag.attrs) {\n if (attr.newName === undefined && attr.newValue === undefined) continue;\n const name = attr.newName ?? attr.name;\n const value = attr.newValue !== undefined ? attr.newValue : attr.value;\n out += src.slice(last, attr.start) + name + (value === null ? \"\" : `=\"${escapeAttribute(value)}\"`);\n last = attr.end;\n }\n return out + src.slice(last, tag.end);\n}\n\nconst closeTagCache = new Map();\nfunction findRawTextEnd(src, name, from) {\n let re = closeTagCache.get(name);\n if (!re) {\n re = new RegExp(`</${name}(?=[\\\\s/>])`, \"ig\");\n closeTagCache.set(name, re);\n }\n re.lastIndex = from;\n const match = re.exec(src);\n return match ? match.index : src.length;\n}\n\n/**\n * @param {string} html\n * @param {import(\"./index.js\").Formatter} f\n * @param {RewriteContext} options\n * @returns {string}\n */\nexport function rewriteHtml(html, f, options) {\n const ctx = { base: options.base, inject: options.inject };\n const state = { injected: !options.inject, baseSeen: false, foreign: 0, doctypeEnd: -1 };\n const n = html.length;\n let out = \"\";\n let i = 0;\n\n const inject = () => {\n state.injected = true;\n return ctx.inject || \"\";\n };\n\n while (i < n) {\n const lt = html.indexOf(\"<\", i);\n if (lt === -1) {\n out += html.slice(i);\n break;\n }\n out += html.slice(i, lt);\n i = lt;\n const next = html.charCodeAt(i + 1);\n\n // Comments, doctype, CDATA and other markup declarations.\n if (next === 33 || next === 63) {\n let end;\n if (html.startsWith(\"<!--\", i)) {\n if (html.startsWith(\"<!-->\", i)) end = i + 5;\n else if (html.startsWith(\"<!--->\", i)) end = i + 6;\n else {\n const close = html.indexOf(\"-->\", i + 4);\n end = close === -1 ? n : close + 3;\n }\n } else if (state.foreign && html.startsWith(\"<![CDATA[\", i)) {\n const close = html.indexOf(\"]]>\", i + 9);\n end = close === -1 ? n : close + 3;\n } else {\n const close = html.indexOf(\">\", i + 2);\n end = close === -1 ? n : close + 1;\n if (/^<!doctype/i.test(html.slice(i, i + 9))) state.doctypeEnd = out.length + (end - i);\n }\n out += html.slice(i, end);\n i = end;\n continue;\n }\n\n // End tags.\n if (next === 47) {\n const close = html.indexOf(\">\", i + 2);\n const end = close === -1 ? n : close + 1;\n if (isLetter(html.charCodeAt(i + 2))) {\n const name = html.slice(i + 2, end).match(/^[^\\s/>]*/)[0].toLowerCase();\n if ((name === \"svg\" || name === \"math\") && state.foreign > 0) state.foreign--;\n }\n out += html.slice(i, end);\n i = end;\n continue;\n }\n\n if (!isLetter(next)) {\n out += \"<\";\n i++;\n continue;\n }\n\n // Start tags.\n const tag = parseStartTag(html, i);\n if (!tag) {\n out += html.slice(i);\n break;\n }\n\n if (!state.injected && tag.name !== \"html\") {\n if (tag.name !== \"head\") out += inject();\n }\n\n out += transformTag(f, tag, ctx, state) ? serializeTag(html, tag, i) : html.slice(i, tag.end);\n i = tag.end;\n\n if (!state.injected && tag.name === \"head\") out += inject();\n if ((tag.name === \"svg\" || tag.name === \"math\") && !tag.selfClosing) state.foreign++;\n\n const raw = state.foreign\n ? (tag.name === \"script\" || tag.name === \"style\") && !tag.selfClosing\n : RAW_TEXT.has(tag.name);\n if (!raw) continue;\n\n if (tag.name === \"plaintext\") {\n out += html.slice(i);\n break;\n }\n const end = findRawTextEnd(html, tag.name, i);\n let content = html.slice(i, end);\n if (tag.name === \"script\" && !findAttr(tag.attrs, \"data-butter\")) {\n const type = findAttr(tag.attrs, \"type\");\n if (JS_TYPE.test(type && type.value ? type.value.trim() : \"\")) content = f.js(content);\n } else if (tag.name === \"style\") {\n content = f.css(content, ctx.base);\n }\n out += content;\n i = end;\n }\n\n if (!state.injected) {\n const markup = inject();\n if (state.doctypeEnd !== -1) out = out.slice(0, state.doctypeEnd) + markup + out.slice(state.doctypeEnd);\n else out = markup + out;\n }\n return out;\n}\n", "/**\n * butter-col formatter: everything that turns a target site's content into\n * content that keeps working when served from the proxy origin.\n *\n * It is shared by the service worker (src/sw) and the in-page runtime\n * (src/client) and has no dependencies on either environment beyond the\n * standard URL / TextEncoder APIs.\n */\n\nimport { createUrlRewriter, MODULE_WORKER_MARK } from \"./url.js\";\nimport { rewriteCss } from \"./css.js\";\nimport { rewriteJs, LOCATION, EVAL_WRAP, UNREWRITE } from \"./js.js\";\nimport { rewriteHtml, rewriteAttribute, rewriteRefresh, URL_ATTRS, decodeEntities, escapeAttribute } from \"./html.js\";\nimport { codecs, getCodec } from \"./codecs.js\";\n\n/**\n * @typedef {object} FormatterConfig\n * @property {string} origin Proxy origin\n * @property {string} prefix Prefix for proxied URLs, e.g. \"/butter/go/\"\n * @property {string} codec Codec name\n */\n\n/**\n * @param {FormatterConfig} config\n */\nexport function createFormatter(config) {\n const url = createUrlRewriter(config);\n\n const formatter = {\n config,\n url,\n /** @param {string} raw @param {string | URL} base @param {{ moduleWorker?: boolean }} [opts] */\n rewriteUrl: (raw, base, opts) => url.rewrite(raw, base, opts),\n /** @param {string} proxied */\n unrewriteUrl: (proxied) => url.unrewrite(proxied),\n /** @param {string} src @param {string | URL} base */\n css: (src, base) => rewriteCss(src, base, url.rewrite),\n /** @param {string} src */\n js: (src) => rewriteJs(src),\n /** @param {string} src @param {{ base: string, inject?: string }} options */\n html: (src, options) => rewriteHtml(src, formatter, options),\n /** @param {string} tag @param {string} name @param {string} value @param {{ base: string, inject?: string }} ctx */\n attr: (tag, name, value, ctx) => rewriteAttribute(formatter, tag, name, value, ctx),\n /** @param {string} value @param {string} base */\n refresh: (value, base) => rewriteRefresh(formatter, value, base),\n };\n return formatter;\n}\n\n/** @typedef {ReturnType<typeof createFormatter>} Formatter */\n\nexport {\n codecs,\n getCodec,\n rewriteCss,\n rewriteJs,\n rewriteHtml,\n decodeEntities,\n escapeAttribute,\n URL_ATTRS,\n MODULE_WORKER_MARK,\n LOCATION,\n EVAL_WRAP,\n UNREWRITE,\n};\n", "/**\n * ButterController: the page-side API of butter-col.\n *\n * import { ButterController } from \"/butter/controller.mjs\";\n * const butter = await new ButterController().init();\n * await butter.setTransport(\"bare\", { server: \"https://bare.example/\" });\n * butter.go(\"example.com\");\n *\n * It installs the service worker, reads /butter/config.js, encodes URLs with\n * the configured codec and talks to the service worker to list and switch\n * transports (the choice is remembered per browser).\n */\nimport type { ButterPublicConfig, TransportEntry } from \"@axis-network/butter-transport\";\nimport { createFormatter, type Formatter } from \"../formatter/index.js\";\n\nexport interface ButterControllerOptions {\n /** Service worker script (default \"/butter/sw.js\"). */\n serviceWorker?: string;\n /** Registration scope (default \"/\"); the server must allow it with Service-Worker-Allowed. */\n scope?: string;\n /** Configuration script (default \"/butter/config.js\"). */\n config?: string;\n /** Search URL used by go() for input that is not a URL; \"%s\" is the query. */\n searchEngine?: string;\n}\n\nexport interface TransportStatus {\n active: { name: string; url: string; options: unknown };\n available: Array<{ name: string; url: string; loaded: boolean }>;\n}\n\nexport class ButterController {\n readonly options: Required<ButterControllerOptions>;\n config: ButterPublicConfig | null = null;\n registration: ServiceWorkerRegistration | null = null;\n #formatter: Formatter | null = null;\n\n constructor(options: ButterControllerOptions = {}) {\n this.options = {\n serviceWorker: options.serviceWorker ?? \"/butter/sw.js\",\n scope: options.scope ?? \"/\",\n config: options.config ?? \"/butter/config.js\",\n searchEngine: options.searchEngine ?? \"https://duckduckgo.com/?q=%s\",\n };\n }\n\n /** Register the service worker (waiting until it is active) and load the configuration. */\n async init(): Promise<this> {\n if (!(\"serviceWorker\" in navigator)) {\n throw new Error(\"This browser has no service workers (private windows often disable them).\");\n }\n if (!window.isSecureContext) throw new Error(\"Service workers need HTTPS (or localhost).\");\n const [config, registration] = await Promise.all([this.#loadConfig(), this.#register()]);\n this.config = config;\n this.registration = registration;\n this.#formatter = createFormatter({ origin: location.origin, prefix: config.prefix, codec: config.codec });\n return this;\n }\n\n /** Proxy URL for an absolute target URL. */\n encodeUrl(url: string | URL): string {\n return this.#f().rewriteUrl(String(url), location.href);\n }\n\n /** Target URL for a proxy URL (input returned unchanged if it is not one). */\n decodeUrl(url: string | URL): string {\n return this.#f().unrewriteUrl(String(url));\n }\n\n /** Turn what someone typed into a URL: full URL, bare domain, or a search. */\n resolveInput(input: string): string {\n const value = input.trim();\n if (/^https?:\\/\\//i.test(value)) return value;\n if (/^[^\\s]+\\.[a-z]{2,}(?::\\d+)?(?:[/?#]\\S*)?$/i.test(value)) return \"https://\" + value;\n return this.options.searchEngine.replace(\"%s\", encodeURIComponent(value));\n }\n\n /** Navigate this tab to `input` through the proxy. */\n go(input: string): void {\n location.href = this.encodeUrl(this.resolveInput(input));\n }\n\n /** Transports this deployment offers (from the configuration). */\n get transports(): TransportEntry[] {\n return this.config?.transports ?? [];\n }\n\n /** Which transport is active for this browser, and which could be. */\n async getTransport(): Promise<TransportStatus> {\n return (await this.#ask({ type: \"butter:get-transport\" })) as TransportStatus;\n }\n\n /**\n * Switch transports for this browser. `options` replaces the configured\n * options for that transport; omit it to use the deployment's defaults.\n * Pages already open keep their WebSocket transport until reloaded.\n */\n async setTransport(name: string, options?: unknown): Promise<TransportStatus[\"active\"]> {\n const reply = (await this.#ask({ type: \"butter:set-transport\", name, options })) as { active: TransportStatus[\"active\"] };\n return reply.active;\n }\n\n /** Go back to the deployment's default transport. */\n async resetTransport(): Promise<TransportStatus[\"active\"]> {\n const reply = (await this.#ask({ type: \"butter:reset-transport\" })) as { active: TransportStatus[\"active\"] };\n return reply.active;\n }\n\n #f(): Formatter {\n if (!this.#formatter) throw new Error(\"ButterController: call init() first\");\n return this.#formatter;\n }\n\n async #loadConfig(): Promise<ButterPublicConfig> {\n const res = await fetch(this.options.config, { credentials: \"same-origin\", cache: \"no-cache\" });\n if (!res.ok) throw new Error(`Could not load ${this.options.config} (HTTP ${res.status}).`);\n const match = (await res.text()).match(/=\\s*(\\{[\\s\\S]*\\})\\s*;?\\s*$/);\n if (!match) throw new Error(`${this.options.config} is not a butter-col configuration.`);\n return JSON.parse(match[1]) as ButterPublicConfig;\n }\n\n async #register(): Promise<ServiceWorkerRegistration> {\n const registration = await navigator.serviceWorker.register(this.options.serviceWorker, { scope: this.options.scope });\n const worker = registration.installing || registration.waiting || registration.active;\n if (worker && worker.state !== \"activated\") {\n await new Promise<void>((resolve, reject) => {\n worker.addEventListener(\"statechange\", () => {\n if (worker.state === \"activated\") resolve();\n if (worker.state === \"redundant\") reject(new Error(\"The butter-col service worker failed to install.\"));\n });\n });\n }\n return registration;\n }\n\n async #ask(message: { type: string; [key: string]: unknown }): Promise<unknown> {\n const worker = this.registration?.active;\n if (!worker) throw new Error(\"ButterController: call init() first\");\n return new Promise((resolve, reject) => {\n const channel = new MessageChannel();\n const timer = setTimeout(() => reject(new Error(\"The service worker did not answer.\")), 10000);\n channel.port1.onmessage = (event) => {\n clearTimeout(timer);\n if (event.data?.ok) resolve(event.data.result);\n else reject(new Error(event.data?.error || \"The service worker refused the request.\"));\n };\n worker.postMessage(message, [channel.port2]);\n });\n }\n}\n\nexport default ButterController;\n"],
5
+ "mappings": "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",
6
+ "names": ["none", "url", "encoded", "plain", "xorString", "str", "out", "i", "xor", "base64", "bytes", "bin", "b64", "codecs", "getCodec", "name", "codec", "MODULE_WORKER_MARK", "PASSTHROUGH_SCHEMES", "TARGET_SCHEME", "createUrlRewriter", "origin", "prefix", "codecName", "codec", "getCodec", "absPrefix", "decodeTail", "tail", "decoded", "isProxied", "url", "rewrite", "raw", "base", "opts", "str", "trimmed", "abs", "hash", "mark", "unrewrite", "rest", "hashAt", "search", "searchAt", "target", "rewriteSrcset", "value", "map", "out", "i", "n", "wsStart", "urlStart", "trailing", "commas", "descStart", "depth", "ch", "URL_FUNCTION", "IMPORT_STRING", "rewriteCss", "css", "base", "rewriteUrl", "map", "raw", "url", "rewritten", "match", "dq", "sq", "bare", "LOCATION", "EVAL_WRAP", "UNREWRITE", "NEEDS_REWRITE", "EXPR_KEYWORDS", "OBJECT_AFTER_PUNC", "OBJECT_AFTER_KEYWORD", "IMPORT_META_URL", "isIdStart", "c", "isIdPart", "isWhitespace", "isLineTerminator", "rewriteJs", "src", "edits", "prevType", "prevVal", "prev2Type", "prev2Val", "braces", "parens", "inImport", "push", "type", "val", "skipTrivia", "pos", "end", "peekWord", "j", "start", "regexAllowed", "scanString", "i", "quote", "scanTemplate", "scanRegex", "inClass", "handleTemplate", "opens", "handleLocation", "top", "importing", "next", "d", "value", "escaped", "cc", "close", "afterDot", "kind", "isEvalCall", "open", "e", "a", "b", "out", "last", "text", "RAW_TEXT", "JS_TYPE", "URL_ATTRS", "NEUTRALIZE", "NAMED_ENTITIES", "ENTITY", "decodeEntities", "value", "match", "dec", "hex", "named", "code", "escapeAttribute", "isWs", "c", "isLetter", "rewriteAttribute", "f", "tag", "name", "ctx", "attr", "part", "trimmed", "parseStartTag", "src", "i", "n", "j", "attrs", "selfClosing", "start", "attrName", "k", "q", "raw", "close", "vs", "findAttr", "transformTag", "state", "changed", "equiv", "kind", "content", "rewriteRefresh", "href", "lower", "rename", "base", "serializeTag", "out", "last", "closeTagCache", "findRawTextEnd", "from", "re", "rewriteHtml", "html", "options", "inject", "lt", "next", "end", "type", "markup", "createFormatter", "config", "url", "createUrlRewriter", "formatter", "raw", "base", "opts", "proxied", "src", "rewriteCss", "rewriteJs", "options", "rewriteHtml", "tag", "name", "value", "ctx", "rewriteAttribute", "rewriteRefresh", "ButterController", "#formatter", "options", "config", "registration", "#loadConfig", "#register", "createFormatter", "url", "#f", "input", "value", "#ask", "name", "res", "match", "worker", "resolve", "reject", "message", "channel", "timer", "event", "index_default"]
7
+ }
@@ -0,0 +1,2 @@
1
+ var te={encode:e=>e,decode:e=>e},ne={encode:e=>encodeURIComponent(e),decode:e=>decodeURIComponent(e)};function P(e){let s="";for(let a=0;a<e.length;a++)s+=a%2?String.fromCharCode(e.charCodeAt(a)^2):e[a];return s}var re={encode:e=>encodeURIComponent(P(e)),decode:e=>P(decodeURIComponent(e))},ie={encode(e){let s=new TextEncoder().encode(e),a="";for(let t=0;t<s.length;t++)a+=String.fromCharCode(s[t]);return btoa(a).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")},decode(e){let s=e.replace(/-/g,"+").replace(/_/g,"/");for(;s.length%4;)s+="=";let a=atob(s),t=new Uint8Array(a.length);for(let r=0;r<a.length;r++)t[r]=a.charCodeAt(r);return new TextDecoder("utf-8",{fatal:!0}).decode(t)}},D={none:te,plain:ne,xor:re,base64:ie};function k(e){let s=D[e];if(!s)throw new Error(`butter: unknown codec "${e}"`);return s}var I="~m/",oe=/^(?:data|blob|about|mailto|tel|sms|javascript|intent|chrome|chrome-extension|moz-extension|file|filesystem):/i,se=/^(?:https?|wss?):\/\//i;function V({origin:e,prefix:s,codec:a}){let t=k(a),r=e+s;function f(o){o.startsWith(I)&&(o=o.slice(I.length));let d;try{d=t.decode(o)}catch{return null}if(!se.test(d))return null;try{return new URL(d).href}catch{return null}}function u(o){return o.startsWith(r)||o.startsWith(s)}function i(o,d,g){if(o==null)return o;let x=String(o),p=x.trim();if(!p||p.startsWith("#")||oe.test(p))return x;if(u(p))return p;let w;try{w=new URL(p,d)}catch{return x}if(w.protocol!=="http:"&&w.protocol!=="https:")return x;let A=w.hash;w.hash="";let R=g&&g.moduleWorker?I:"";return r+R+t.encode(w.href)+A}function b(o){if(o==null)return o;let d=String(o),g;if(d.startsWith(r))g=d.slice(r.length);else if(d.startsWith(s))g=d.slice(s.length);else return d;let x="",p=g.indexOf("#");p!==-1&&(x=g.slice(p),g=g.slice(0,p));let w="",A=g.indexOf("?");A!==-1&&(w=g.slice(A),g=g.slice(0,A));let R=f(g);if(R===null)return d;if(!w)return R+x;let E=new URL(R);return E.search=w,E.href+x}function m(o,d,g=i){let x="",p=0,w=o.length;for(;p<w;){let A=p;for(;p<w&&(/\s/.test(o[p])||o[p]===",");)p++;if(x+=o.slice(A,p),p>=w)break;let R=p;for(;p<w&&!/\s/.test(o[p]);)p++;let E=o.slice(R,p),c="",_=E.match(/,+$/);if(_&&(c=_[0],E=E.slice(0,-c.length)),x+=g(E,d)+c,c)continue;let S=p,l=0;for(;p<w;){let n=o[p];if(n==="(")l++;else if(n===")")l=Math.max(0,l-1);else if(n===","&&l===0)break;p++}x+=o.slice(S,p)}return x}return{origin:e,prefix:s,codec:t,decodeTail:f,isProxied:u,rewrite:i,unrewrite:b,rewriteSrcset:m,unrewriteSrcset:o=>m(o,"",d=>b(d))}}var ce=/url\(\s*(?:"((?:[^"\\\n]|\\.)*)"|'((?:[^'\\\n]|\\.)*)'|((?:[^)\s"'\\]|\\.)*))\s*\)/gi,ae=/@import\s+(?:"((?:[^"\\\n]|\\.)*)"|'((?:[^'\\\n]|\\.)*)')/gi;function q(e,s,a){if(!e||e.indexOf("url(")===-1&&e.indexOf("URL(")===-1&&e.indexOf("@import")===-1)return e;let t=r=>{let f=r.replace(/\\([^0-9a-fA-F\n])/g,"$1");if(!f||f.startsWith("#")||/^data:/i.test(f))return null;let u=a(f,s);return u===f?null:u};return e.replace(ce,(r,f,u,i)=>{let m=t(f??u??i??"");return m===null?r:`url("${m.replace(/["\\\n]/g,"\\$&")}")`}).replace(ae,(r,f,u)=>{let i=t(f??u??"");return i===null?r:`@import "${i.replace(/["\\\n]/g,"\\$&")}"`})}var T="__butter$location",H="__butter$js",K="__butter$unrewrite",le=/location|eval|import\s*\.\s*meta/,F=new Set(["return","typeof","instanceof","in","of","new","delete","void","throw","case","do","else","yield","await","extends"]),ue=new Set(["(","[",",","=",":","?","...","!","&","|","^","~","+","-","*","/","%","<",">","${","??","?."]),fe=new Set(["return","yield","await","typeof","void","in","of","case","throw","delete"]),$=/import\s*\.\s*meta\s*\.\s*url(?![\w$])/y;function J(e){return e>=97&&e<=122||e>=65&&e<=90||e===36||e===95||e>=128}function j(e){return J(e)||e>=48&&e<=57}function v(e){return e===32||e===9||e===10||e===13||e===11||e===12||e===160||e===65279||e===8232||e===8233||e===5760||e>=8192&&e<=8202||e===8239||e===8287||e===12288}function L(e){return e===10||e===13||e===8232||e===8233}function Y(e){if(typeof e!="string"||!le.test(e))return e;let s=e.length,a=[],t="",r="",f="",u="",i=[],b=[],m=!1,o=(l,n)=>{f=t,u=r,t=l,r=n},d=l=>{for(;l<s;){let n=e.charCodeAt(l);if(v(n))l++;else if(n===47&&e.charCodeAt(l+1)===47)for(;l<s&&!L(e.charCodeAt(l));)l++;else if(n===47&&e.charCodeAt(l+1)===42){let h=e.indexOf("*/",l+2);l=h===-1?s:h+2}else break}return l},g=l=>{let n=d(l),h=n;for(;n<s&&j(e.charCodeAt(n));)n++;return e.slice(h,n)},x=()=>t?t==="punc"?r!==")"&&r!=="]"&&r!=="++"&&r!=="--":t==="id"?F.has(r):!1:!0,p=(l,n)=>{let h=l+1;for(;h<s;){let C=e.charCodeAt(h);if(C===92)h+=2;else{if(C===n)return h+1;if(C===10||C===13)return h;h++}}return s},w=l=>{for(;l<s;){let n=e.charCodeAt(l);if(n===92)l+=2;else{if(n===96)return[l+1,!1];if(n===36&&e.charCodeAt(l+1)===123)return[l+2,!0];l++}}return[s,!1]},A=l=>{let n=l+1,h=!1;for(;n<s;){let C=e.charCodeAt(n);if(L(C))return-1;if(C===92){if(n+1>=s||L(e.charCodeAt(n+1)))return-1;n+=2;continue}if(h)C===93&&(h=!1);else if(C===91)h=!0;else if(C===47){for(n++;n<s&&j(e.charCodeAt(n));)n++;return n}n++}return-1},R=l=>{let[n,h]=w(l);return h?(i.push("tmpl"),o("punc","${")):o("tmpl",""),n},E=(l,n)=>{if(t==="punc"&&(r==="."||r==="?.")){a.push([l,n,T]);return}let h=i[i.length-1];if(h==="ie-import"||h==="ie-export"){let C=h==="ie-import";t==="id"&&r==="as"?C&&a.push([l,n,T]):g(n)==="as"?C||a.push([l,n,T]):a.push([l,n,C?`location as ${T}`:`${T} as location`]);return}if(h==="obj"&&t==="punc"&&(r==="{"||r===",")){let C=e[d(n)];if(C===":")return;if(C===","||C==="}"){a.push([l,n,`location: ${T}`]);return}}a.push([l,n,T])},c=0;if(e.startsWith("#!"))for(;c<s&&!L(e.charCodeAt(c));)c++;for(;c<s;){let l=e.charCodeAt(c);if(v(l)){c++;continue}if(l===47){let n=e.charCodeAt(c+1);if(n===47||n===42){c=d(c);continue}if(x()){let h=A(c);if(h!==-1){c=h,o("regex","");continue}}c++,o("punc","/");continue}if(l===34||l===39){let n=p(c,l),h=e.slice(c+1,n-1);if(h==="location"&&t==="punc"&&r==="["&&(f==="id"&&!F.has(u)||u===")"||u==="]")&&e[d(n)]==="]"){let C=e[c];a.push([c,n,C+T+C])}c=n,o("str",h);continue}if(l===96){c=R(c+1);continue}if(J(l)||l===92){let n=c,h=!1;for(;n<s;){let y=e.charCodeAt(n);if(y===92)if(h=!0,e.charCodeAt(n+2)===123){let U=e.indexOf("}",n);n=U===-1?s:U+1}else n+=6;else if(j(y)&&!v(y))n++;else break}let C=e.slice(c,n),ee=t==="punc"&&(r==="."||r==="?.");if(!h)if(C==="location")E(c,n);else if(C==="import"&&!ee){if($.lastIndex=c,$.test(e)){let U=$.lastIndex;a.push([c,U,`${K}(import.meta.url)`]),c=U,o("punc",")");continue}let y=e[d(n)];y!=="("&&y!=="."&&(m=!0)}else C==="from"&&m&&(m=!1);c=n,o("id",C);continue}if(l===35){let n=c+1;for(;n<s&&j(e.charCodeAt(n));)n++;o("id",e.slice(c,n)),c=n;continue}if(l>=48&&l<=57||l===46&&e.charCodeAt(c+1)>=48&&e.charCodeAt(c+1)<=57){let n=c+1;for(;n<s;){let h=e.charCodeAt(n);if(j(h)||h===46)n++;else break}c=n,o("num","");continue}switch(l){case 123:{let n="block";t==="id"&&(r==="import"||r==="export")&&u!=="."&&u!=="?."?n="ie-"+r:m&&t==="punc"&&r===","?n="ie-import":(t==="punc"&&ue.has(r)||t==="id"&&fe.has(r))&&(n="obj"),i.push(n),c++,o("punc","{");continue}case 125:{if(i.pop()==="tmpl"){c=R(c+1);continue}c++,o("punc","}");continue}case 40:{let n=t==="id"&&r==="eval"&&u!=="."&&u!=="?."&&u!=="function";b.push(n?c:null),c++,o("punc","(");continue}case 41:{let n=b.pop();n!=null&&e[d(c+1)]!=="{"&&(a.push([n+1,n+1,H+"("]),a.push([c,c,")"])),c++,o("punc",")");continue}case 46:e.charCodeAt(c+1)===46&&e.charCodeAt(c+2)===46?(c+=3,o("punc","...")):(c++,o("punc","."));continue;case 63:{let n=e.charCodeAt(c+1),h=e.charCodeAt(c+2);n===46&&!(h>=48&&h<=57)?(c+=2,o("punc","?.")):n===63?(c+=2,o("punc","??")):(c++,o("punc","?"));continue}case 43:case 45:e.charCodeAt(c+1)===l?(c+=2,o("punc",l===43?"++":"--")):(c++,o("punc",e[c-1]));continue;case 61:e.charCodeAt(c+1)===62?(c+=2,o("punc","=>")):(c++,o("punc","="));continue;case 59:m=!1,c++,o("punc",";");continue;default:c++,o("punc",e[c-1])}}if(a.length===0)return e;a.sort((l,n)=>l[0]-n[0]||l[1]-l[0]-(n[1]-n[0]));let _="",S=0;for(let[l,n,h]of a)l<S||(_+=e.slice(S,l)+h,S=n);return _+e.slice(S)}var de=new Set(["script","style","textarea","title","xmp","iframe","noembed","noframes","plaintext"]),he=/^(?:|module|(?:text|application)\/(?:x-)?(?:javascript|ecmascript)|text\/jscript|text\/livescript|text\/javascript1\.[0-5])$/i,z=new Set(["href","src","action","formaction","poster","background","cite","longdesc","manifest","codebase","icon","lowsrc","dynsrc","xlink:href"]),pe={integrity:"data-butter-integrity",sandbox:"data-butter-sandbox"},we={amp:"&",lt:"<",gt:">",quot:'"',apos:"'",nbsp:"\xA0"},me=/&(?:#(\d{1,7});?|#[xX]([0-9a-fA-F]{1,6});?|(amp|lt|gt|quot|apos|nbsp)(?:;|(?![=\w])))/g;function B(e){return e.indexOf("&")===-1?e:e.replace(me,(s,a,t,r)=>{if(r)return we[r];let f=a?parseInt(a,10):parseInt(t,16);return f>0&&f<=1114111?String.fromCodePoint(f):"\uFFFD"})}function Z(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;")}function O(e){return e===32||e===9||e===10||e===12||e===13}function G(e){return e>=97&&e<=122||e>=65&&e<=90}function N(e,s,a,t,r){let f=a.toLowerCase();if(f.length>2&&f.startsWith("on"))return e.js(t);switch(f){case"style":return e.css(t,r.base);case"srcset":case"imagesrcset":return e.url.rewriteSrcset(t,r.base);case"ping":return t.split(/(\s+)/).map(u=>u.trim()?e.rewriteUrl(u,r.base):u).join("");case"srcdoc":return s==="iframe"?e.html(t,{base:r.base,inject:r.inject}):t;case"data":return s==="object"?e.rewriteUrl(t,r.base):t}if(z.has(f)){let u=t.trim();if(/^javascript:/i.test(u)){let i=u.slice(11);return i.indexOf("%")===-1?"javascript:"+e.js(i):t}return e.rewriteUrl(t,r.base)}return t}function Ce(e,s){let a=e.length,t=s+1;for(;t<a;){let i=e.charCodeAt(t);if(O(i)||i===47||i===62)break;t++}let r=e.slice(s+1,t).toLowerCase(),f=[],u=!1;for(;t<a;){let i=e.charCodeAt(t);if(O(i)){t++;continue}if(i===47){if(e.charCodeAt(t+1)===62)return u=!0,{name:r,attrs:f,selfClosing:u,end:t+2};t++;continue}if(i===62)return{name:r,attrs:f,selfClosing:u,end:t+1};let b=t++;for(;t<a&&(i=e.charCodeAt(t),!(O(i)||i===47||i===62||i===61));)t++;let m=e.slice(b,t),o=t;for(;o<a&&O(e.charCodeAt(o));)o++;if(e.charCodeAt(o)!==61){f.push({name:m,value:null,start:b,end:t});continue}for(o++;o<a&&O(e.charCodeAt(o));)o++;let d=e.charCodeAt(o),g;if(d===34||d===39){let x=e.indexOf(d===34?'"':"'",o+1);if(x===-1)return null;g=e.slice(o+1,x),t=x+1}else{let x=o;for(;o<a&&!O(e.charCodeAt(o))&&e.charCodeAt(o)!==62;)o++;g=e.slice(x,o),t=o}f.push({name:m,value:B(g),start:b,end:t})}return null}function W(e,s){for(let a of e)if(a.name.toLowerCase()===s)return a}function xe(e,s,a,t){let r=!1,{name:f,attrs:u}=s;if(f==="meta"){let i=W(u,"http-equiv"),b=i&&i.value?i.value.trim().toLowerCase():"";if(b.startsWith("content-security-policy"))return i.newName="data-butter-http-equiv",!0;if(b==="refresh"){let m=W(u,"content");if(m&&m.value){let o=M(e,m.value,a.base);o!==m.value&&(m.newValue=o,r=!0)}}return r}if(f==="base"&&!t.baseSeen){let i=W(u,"href");if(i&&i.value!==null){t.baseSeen=!0;try{a.base=new URL(i.value.trim(),a.base).href}catch{}}}for(let i of u){if(i.value===null)continue;let b=i.name.toLowerCase();if(b==="data-butter")return!1;let m=pe[b];if(m&&(b!=="sandbox"||f==="iframe")){i.newName=m,r=!0;continue}let o=N(e,f,i.name,i.value,a);o!==i.value&&(i.newValue=o,r=!0)}return r}function M(e,s,a){let t=s.match(/^(\s*[\d.]*\s*[;,]?\s*(?:url\s*=\s*)?)(['"]?)(.*?)\2(\s*)$/i);return!t||!t[3]?s:t[1]+t[2]+e.rewriteUrl(t[3],a)+t[2]+t[4]}function ge(e,s,a){let t="",r=a;for(let f of s.attrs){if(f.newName===void 0&&f.newValue===void 0)continue;let u=f.newName??f.name,i=f.newValue!==void 0?f.newValue:f.value;t+=e.slice(r,f.start)+u+(i===null?"":`="${Z(i)}"`),r=f.end}return t+e.slice(r,s.end)}var X=new Map;function Ae(e,s,a){let t=X.get(s);t||(t=new RegExp(`</${s}(?=[\\s/>])`,"ig"),X.set(s,t)),t.lastIndex=a;let r=t.exec(e);return r?r.index:e.length}function Q(e,s,a){let t={base:a.base,inject:a.inject},r={injected:!a.inject,baseSeen:!1,foreign:0,doctypeEnd:-1},f=e.length,u="",i=0,b=()=>(r.injected=!0,t.inject||"");for(;i<f;){let m=e.indexOf("<",i);if(m===-1){u+=e.slice(i);break}u+=e.slice(i,m),i=m;let o=e.charCodeAt(i+1);if(o===33||o===63){let w;if(e.startsWith("<!--",i))if(e.startsWith("<!-->",i))w=i+5;else if(e.startsWith("<!--->",i))w=i+6;else{let A=e.indexOf("-->",i+4);w=A===-1?f:A+3}else if(r.foreign&&e.startsWith("<![CDATA[",i)){let A=e.indexOf("]]>",i+9);w=A===-1?f:A+3}else{let A=e.indexOf(">",i+2);w=A===-1?f:A+1,/^<!doctype/i.test(e.slice(i,i+9))&&(r.doctypeEnd=u.length+(w-i))}u+=e.slice(i,w),i=w;continue}if(o===47){let w=e.indexOf(">",i+2),A=w===-1?f:w+1;if(G(e.charCodeAt(i+2))){let R=e.slice(i+2,A).match(/^[^\s/>]*/)[0].toLowerCase();(R==="svg"||R==="math")&&r.foreign>0&&r.foreign--}u+=e.slice(i,A),i=A;continue}if(!G(o)){u+="<",i++;continue}let d=Ce(e,i);if(!d){u+=e.slice(i);break}if(!r.injected&&d.name!=="html"&&d.name!=="head"&&(u+=b()),u+=xe(s,d,t,r)?ge(e,d,i):e.slice(i,d.end),i=d.end,!r.injected&&d.name==="head"&&(u+=b()),(d.name==="svg"||d.name==="math")&&!d.selfClosing&&r.foreign++,!(r.foreign?(d.name==="script"||d.name==="style")&&!d.selfClosing:de.has(d.name)))continue;if(d.name==="plaintext"){u+=e.slice(i);break}let x=Ae(e,d.name,i),p=e.slice(i,x);if(d.name==="script"&&!W(d.attrs,"data-butter")){let w=W(d.attrs,"type");he.test(w&&w.value?w.value.trim():"")&&(p=s.js(p))}else d.name==="style"&&(p=s.css(p,t.base));u+=p,i=x}if(!r.injected){let m=b();r.doctypeEnd!==-1?u=u.slice(0,r.doctypeEnd)+m+u.slice(r.doctypeEnd):u=m+u}return u}function Ie(e){let s=V(e),a={config:e,url:s,rewriteUrl:(t,r,f)=>s.rewrite(t,r,f),unrewriteUrl:t=>s.unrewrite(t),css:(t,r)=>q(t,r,s.rewrite),js:t=>Y(t),html:(t,r)=>Q(t,a,r),attr:(t,r,f,u)=>N(a,t,r,f,u),refresh:(t,r)=>M(a,t,r)};return a}export{H as EVAL_WRAP,T as LOCATION,I as MODULE_WORKER_MARK,K as UNREWRITE,z as URL_ATTRS,D as codecs,Ie as createFormatter,B as decodeEntities,Z as escapeAttribute,k as getCodec,q as rewriteCss,Q as rewriteHtml,Y as rewriteJs};
2
+ //# sourceMappingURL=formatter.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/formatter/codecs.js", "../src/formatter/url.js", "../src/formatter/css.js", "../src/formatter/js.js", "../src/formatter/html.js", "../src/formatter/index.js"],
4
+ "sourcesContent": ["/**\n * URL codecs. A codec turns an absolute target URL (without its fragment)\n * into the string that follows the proxy prefix, and back again.\n *\n * Every codec must satisfy: decode(encode(url)) === url.\n */\n\n/** @typedef {{ encode(url: string): string, decode(encoded: string): string }} Codec */\n\n/** Structure preserving: /butter/go/https://example.com/a/b?c */\nconst none = {\n encode: (url) => url,\n decode: (encoded) => encoded,\n};\n\n/** encodeURIComponent of the whole URL (same idea as Scramjet's \"plain\"). */\nconst plain = {\n encode: (url) => encodeURIComponent(url),\n decode: (encoded) => decodeURIComponent(encoded),\n};\n\n/** XOR every second character with 2 (same scheme as Ultraviolet). */\nfunction xorString(str) {\n let out = \"\";\n for (let i = 0; i < str.length; i++) {\n out += i % 2 ? String.fromCharCode(str.charCodeAt(i) ^ 2) : str[i];\n }\n return out;\n}\n\nconst xor = {\n encode: (url) => encodeURIComponent(xorString(url)),\n decode: (encoded) => xorString(decodeURIComponent(encoded)),\n};\n\n/** URL-safe base64 of the UTF-8 bytes, without padding. */\nconst base64 = {\n encode(url) {\n const bytes = new TextEncoder().encode(url);\n let bin = \"\";\n for (let i = 0; i < bytes.length; i++) bin += String.fromCharCode(bytes[i]);\n return btoa(bin).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n },\n decode(encoded) {\n let b64 = encoded.replace(/-/g, \"+\").replace(/_/g, \"/\");\n while (b64.length % 4) b64 += \"=\";\n const bin = atob(b64);\n const bytes = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes);\n },\n};\n\n/** @type {Record<string, Codec>} */\nexport const codecs = { none, plain, xor, base64 };\n\n/**\n * @param {string} name\n * @returns {Codec}\n */\nexport function getCodec(name) {\n const codec = codecs[name];\n if (!codec) throw new Error(`butter: unknown codec \"${name}\"`);\n return codec;\n}\n", "import { getCodec } from \"./codecs.js\";\n\n/** Marker placed after the prefix for module workers: /butter/go/~m/<encoded> */\nexport const MODULE_WORKER_MARK = \"~m/\";\n\nconst PASSTHROUGH_SCHEMES = /^(?:data|blob|about|mailto|tel|sms|javascript|intent|chrome|chrome-extension|moz-extension|file|filesystem):/i;\nconst TARGET_SCHEME = /^(?:https?|wss?):\\/\\//i;\n\n/**\n * @typedef {object} UrlRewriterOptions\n * @property {string} origin Proxy origin, e.g. \"https://proxy.example\"\n * @property {string} prefix Path prefix for proxied URLs, e.g. \"/butter/go/\"\n * @property {string} codec Codec name, see codecs.js\n */\n\n/**\n * @param {UrlRewriterOptions} options\n */\nexport function createUrlRewriter({ origin, prefix, codec: codecName }) {\n const codec = getCodec(codecName);\n const absPrefix = origin + prefix;\n\n /**\n * Decode the part of a proxied path that follows the prefix.\n * Returns null when the tail is not a valid encoded URL (for example a\n * relative path that the browser resolved against the proxy URL).\n * @param {string} tail\n * @returns {string | null}\n */\n function decodeTail(tail) {\n if (tail.startsWith(MODULE_WORKER_MARK)) tail = tail.slice(MODULE_WORKER_MARK.length);\n let decoded;\n try {\n decoded = codec.decode(tail);\n } catch {\n return null;\n }\n if (!TARGET_SCHEME.test(decoded)) return null;\n try {\n return new URL(decoded).href;\n } catch {\n return null;\n }\n }\n\n /**\n * Is this an already rewritten URL (absolute or path-absolute)?\n * @param {string} url\n */\n function isProxied(url) {\n return url.startsWith(absPrefix) || url.startsWith(prefix);\n }\n\n /**\n * Rewrite a URL found in a page so that it points through the proxy.\n * Non-http(s) URLs and fragment-only references are returned unchanged.\n * @param {string} raw\n * @param {string | URL} base The target (unproxied) base URL\n * @param {{ moduleWorker?: boolean }} [opts]\n * @returns {string}\n */\n function rewrite(raw, base, opts) {\n if (raw == null) return raw;\n const str = String(raw);\n const trimmed = str.trim();\n if (!trimmed || trimmed.startsWith(\"#\") || PASSTHROUGH_SCHEMES.test(trimmed)) return str;\n if (isProxied(trimmed)) return trimmed;\n let abs;\n try {\n abs = new URL(trimmed, base);\n } catch {\n return str;\n }\n if (abs.protocol !== \"http:\" && abs.protocol !== \"https:\") return str;\n const hash = abs.hash;\n abs.hash = \"\";\n const mark = opts && opts.moduleWorker ? MODULE_WORKER_MARK : \"\";\n return absPrefix + mark + codec.encode(abs.href) + hash;\n }\n\n /**\n * Turn a proxied URL back into the target URL. Anything that is not a\n * proxied URL is returned unchanged.\n * @param {string} url\n * @returns {string}\n */\n function unrewrite(url) {\n if (url == null) return url;\n const str = String(url);\n let rest;\n if (str.startsWith(absPrefix)) rest = str.slice(absPrefix.length);\n else if (str.startsWith(prefix)) rest = str.slice(prefix.length);\n else return str;\n\n let hash = \"\";\n const hashAt = rest.indexOf(\"#\");\n if (hashAt !== -1) {\n hash = rest.slice(hashAt);\n rest = rest.slice(0, hashAt);\n }\n let search = \"\";\n const searchAt = rest.indexOf(\"?\");\n if (searchAt !== -1) {\n search = rest.slice(searchAt);\n rest = rest.slice(0, searchAt);\n }\n const decoded = decodeTail(rest);\n if (decoded === null) return str;\n if (!search) return decoded + hash;\n const target = new URL(decoded);\n target.search = search;\n return target.href + hash;\n }\n\n /**\n * @param {string} value A srcset attribute value\n * @param {string | URL} base\n * @param {(url: string, base: string | URL) => string} [map]\n */\n function rewriteSrcset(value, base, map = rewrite) {\n // Follows the HTML \"parse a srcset attribute\" algorithm closely enough to\n // keep data: URLs (which contain commas) intact.\n let out = \"\";\n let i = 0;\n const n = value.length;\n while (i < n) {\n const wsStart = i;\n while (i < n && (/\\s/.test(value[i]) || value[i] === \",\")) i++;\n out += value.slice(wsStart, i);\n if (i >= n) break;\n const urlStart = i;\n while (i < n && !/\\s/.test(value[i])) i++;\n let url = value.slice(urlStart, i);\n let trailing = \"\";\n const commas = url.match(/,+$/);\n if (commas) {\n trailing = commas[0];\n url = url.slice(0, -trailing.length);\n }\n out += map(url, base) + trailing;\n if (trailing) continue;\n // Descriptors run until the next comma that is not inside parentheses.\n const descStart = i;\n let depth = 0;\n while (i < n) {\n const ch = value[i];\n if (ch === \"(\") depth++;\n else if (ch === \")\") depth = Math.max(0, depth - 1);\n else if (ch === \",\" && depth === 0) break;\n i++;\n }\n out += value.slice(descStart, i);\n }\n return out;\n }\n\n return {\n origin,\n prefix,\n codec,\n decodeTail,\n isProxied,\n rewrite,\n unrewrite,\n rewriteSrcset,\n unrewriteSrcset: (value) => rewriteSrcset(value, \"\", (url) => unrewrite(url)),\n };\n}\n\n/** @typedef {ReturnType<typeof createUrlRewriter>} UrlRewriter */\n", "/**\n * CSS rewriting: url(...) references and @import strings.\n */\n\nconst URL_FUNCTION = /url\\(\\s*(?:\"((?:[^\"\\\\\\n]|\\\\.)*)\"|'((?:[^'\\\\\\n]|\\\\.)*)'|((?:[^)\\s\"'\\\\]|\\\\.)*))\\s*\\)/gi;\nconst IMPORT_STRING = /@import\\s+(?:\"((?:[^\"\\\\\\n]|\\\\.)*)\"|'((?:[^'\\\\\\n]|\\\\.)*)')/gi;\n\n/**\n * @param {string} css\n * @param {string | URL} base\n * @param {(url: string, base: string | URL) => string} rewriteUrl\n * @returns {string}\n */\nexport function rewriteCss(css, base, rewriteUrl) {\n if (!css || (css.indexOf(\"url(\") === -1 && css.indexOf(\"URL(\") === -1 && css.indexOf(\"@import\") === -1)) {\n return css;\n }\n const map = (raw) => {\n // CSS escapes inside URLs are rare; only unescape the trivial cases.\n const url = raw.replace(/\\\\([^0-9a-fA-F\\n])/g, \"$1\");\n if (!url || url.startsWith(\"#\") || /^data:/i.test(url)) return null;\n const rewritten = rewriteUrl(url, base);\n return rewritten === url ? null : rewritten;\n };\n return css\n .replace(URL_FUNCTION, (match, dq, sq, bare) => {\n const raw = dq ?? sq ?? bare ?? \"\";\n const rewritten = map(raw);\n return rewritten === null ? match : `url(\"${rewritten.replace(/[\"\\\\\\n]/g, \"\\\\$&\")}\")`;\n })\n .replace(IMPORT_STRING, (match, dq, sq) => {\n const rewritten = map(dq ?? sq ?? \"\");\n return rewritten === null ? match : `@import \"${rewritten.replace(/[\"\\\\\\n]/g, \"\\\\$&\")}\"`;\n });\n}\n", "/**\n * JavaScript rewriting.\n *\n * butter-col does not parse JavaScript into an AST. Instead a small,\n * error-tolerant tokenizer walks the source and applies a handful of targeted\n * edits. Everything else (fetches, imports, workers, ...) is handled at\n * runtime by the service worker and the client hooks, so the rewriter only\n * has to deal with what cannot be hooked:\n *\n * location / x.location / x?.location / x[\"location\"]\n * -> __butter$location (resolved by an accessor on Object.prototype)\n * eval(code)\n * -> eval(__butter$js(code)) (stays a *direct* eval)\n * import.meta.url\n * -> __butter$unrewrite(import.meta.url)\n *\n * The tokenizer never edits inside strings, template text, comments or regex\n * literals, and every edit is local, so a mis-scan can at worst miss an edit.\n */\n\nexport const LOCATION = \"__butter$location\";\nexport const EVAL_WRAP = \"__butter$js\";\nexport const UNREWRITE = \"__butter$unrewrite\";\n\nconst NEEDS_REWRITE = /location|eval|import\\s*\\.\\s*meta/;\n\n/** Identifiers after which a `/` starts a regular expression. */\nconst EXPR_KEYWORDS = new Set([\n \"return\", \"typeof\", \"instanceof\", \"in\", \"of\", \"new\", \"delete\", \"void\", \"throw\",\n \"case\", \"do\", \"else\", \"yield\", \"await\", \"extends\",\n]);\n\n/** Punctuators after which `{` opens an object literal rather than a block. */\nconst OBJECT_AFTER_PUNC = new Set([\n \"(\", \"[\", \",\", \"=\", \":\", \"?\", \"...\", \"!\", \"&\", \"|\", \"^\", \"~\", \"+\", \"-\", \"*\", \"/\", \"%\",\n \"<\", \">\", \"${\", \"??\", \"?.\",\n]);\nconst OBJECT_AFTER_KEYWORD = new Set([\n \"return\", \"yield\", \"await\", \"typeof\", \"void\", \"in\", \"of\", \"case\", \"throw\", \"delete\",\n]);\n\nconst IMPORT_META_URL = /import\\s*\\.\\s*meta\\s*\\.\\s*url(?![\\w$])/y;\n\nfunction isIdStart(c) {\n return (c >= 97 && c <= 122) || (c >= 65 && c <= 90) || c === 36 || c === 95 || c >= 128;\n}\n\nfunction isIdPart(c) {\n return isIdStart(c) || (c >= 48 && c <= 57);\n}\n\nfunction isWhitespace(c) {\n return c === 32 || c === 9 || c === 10 || c === 13 || c === 11 || c === 12 ||\n c === 0xa0 || c === 0xfeff || c === 0x2028 || c === 0x2029 || c === 0x1680 ||\n (c >= 0x2000 && c <= 0x200a) || c === 0x202f || c === 0x205f || c === 0x3000;\n}\n\nfunction isLineTerminator(c) {\n return c === 10 || c === 13 || c === 0x2028 || c === 0x2029;\n}\n\n/**\n * @param {string} src\n * @returns {string}\n */\nexport function rewriteJs(src) {\n if (typeof src !== \"string\" || !NEEDS_REWRITE.test(src)) return src;\n\n const n = src.length;\n /** @type {Array<[number, number, string]>} start, end, replacement */\n const edits = [];\n\n let prevType = \"\"; // \"id\" | \"num\" | \"str\" | \"tmpl\" | \"regex\" | \"punc\"\n let prevVal = \"\";\n let prev2Type = \"\";\n let prev2Val = \"\";\n /** Open `{` kinds: \"obj\" | \"block\" | \"ie-import\" | \"ie-export\" | \"tmpl\" */\n const braces = [];\n /** Open `(`: null, or the index of the `(` of an eval call */\n const parens = [];\n /** Inside an import statement, before `from` */\n let inImport = false;\n\n const push = (type, val) => {\n prev2Type = prevType;\n prev2Val = prevVal;\n prevType = type;\n prevVal = val;\n };\n\n /** Index of the next character that is not whitespace or a comment. */\n const skipTrivia = (pos) => {\n while (pos < n) {\n const c = src.charCodeAt(pos);\n if (isWhitespace(c)) {\n pos++;\n } else if (c === 47 && src.charCodeAt(pos + 1) === 47) {\n while (pos < n && !isLineTerminator(src.charCodeAt(pos))) pos++;\n } else if (c === 47 && src.charCodeAt(pos + 1) === 42) {\n const end = src.indexOf(\"*/\", pos + 2);\n pos = end === -1 ? n : end + 2;\n } else {\n break;\n }\n }\n return pos;\n };\n\n const peekWord = (pos) => {\n let j = skipTrivia(pos);\n const start = j;\n while (j < n && isIdPart(src.charCodeAt(j))) j++;\n return src.slice(start, j);\n };\n\n const regexAllowed = () => {\n if (!prevType) return true;\n if (prevType === \"punc\") return prevVal !== \")\" && prevVal !== \"]\" && prevVal !== \"++\" && prevVal !== \"--\";\n if (prevType === \"id\") return EXPR_KEYWORDS.has(prevVal);\n return false;\n };\n\n const scanString = (i, quote) => {\n let j = i + 1;\n while (j < n) {\n const c = src.charCodeAt(j);\n if (c === 92) j += 2;\n else if (c === quote) return j + 1;\n else if (c === 10 || c === 13) return j; // unterminated, recover\n else j++;\n }\n return n;\n };\n\n /** Scan template text starting at j. Returns [end, opensSubstitution]. */\n const scanTemplate = (j) => {\n while (j < n) {\n const c = src.charCodeAt(j);\n if (c === 92) j += 2;\n else if (c === 96) return [j + 1, false];\n else if (c === 36 && src.charCodeAt(j + 1) === 123) return [j + 2, true];\n else j++;\n }\n return [n, false];\n };\n\n /** Returns the end of the regex literal starting at i, or -1. */\n const scanRegex = (i) => {\n let j = i + 1;\n let inClass = false;\n while (j < n) {\n const c = src.charCodeAt(j);\n if (isLineTerminator(c)) return -1;\n if (c === 92) {\n if (j + 1 >= n || isLineTerminator(src.charCodeAt(j + 1))) return -1;\n j += 2;\n continue;\n }\n if (inClass) {\n if (c === 93) inClass = false;\n } else if (c === 91) {\n inClass = true;\n } else if (c === 47) {\n j++;\n while (j < n && isIdPart(src.charCodeAt(j))) j++;\n return j;\n }\n j++;\n }\n return -1;\n };\n\n const handleTemplate = (start) => {\n const [end, opens] = scanTemplate(start);\n if (opens) {\n braces.push(\"tmpl\");\n push(\"punc\", \"${\");\n } else {\n push(\"tmpl\", \"\");\n }\n return end;\n };\n\n const handleLocation = (start, end) => {\n if (prevType === \"punc\" && (prevVal === \".\" || prevVal === \"?.\")) {\n edits.push([start, end, LOCATION]);\n return;\n }\n const top = braces[braces.length - 1];\n if (top === \"ie-import\" || top === \"ie-export\") {\n const importing = top === \"ie-import\";\n if (prevType === \"id\" && prevVal === \"as\") {\n if (importing) edits.push([start, end, LOCATION]); // local binding\n } else if (peekWord(end) === \"as\") {\n if (!importing) edits.push([start, end, LOCATION]); // local binding\n } else {\n edits.push([start, end, importing ? `location as ${LOCATION}` : `${LOCATION} as location`]);\n }\n return;\n }\n if (top === \"obj\" && prevType === \"punc\" && (prevVal === \"{\" || prevVal === \",\")) {\n const next = src[skipTrivia(end)];\n if (next === \":\") return; // property key\n if (next === \",\" || next === \"}\") {\n edits.push([start, end, `location: ${LOCATION}`]); // shorthand property\n return;\n }\n }\n edits.push([start, end, LOCATION]);\n };\n\n let i = 0;\n if (src.startsWith(\"#!\")) {\n while (i < n && !isLineTerminator(src.charCodeAt(i))) i++;\n }\n\n while (i < n) {\n const c = src.charCodeAt(i);\n\n if (isWhitespace(c)) {\n i++;\n continue;\n }\n\n // Comments, regular expressions and division.\n if (c === 47) {\n const d = src.charCodeAt(i + 1);\n if (d === 47 || d === 42) {\n i = skipTrivia(i);\n continue;\n }\n if (regexAllowed()) {\n const end = scanRegex(i);\n if (end !== -1) {\n i = end;\n push(\"regex\", \"\");\n continue;\n }\n }\n i++;\n push(\"punc\", \"/\");\n continue;\n }\n\n // Strings.\n if (c === 34 || c === 39) {\n const end = scanString(i, c);\n const value = src.slice(i + 1, end - 1);\n if (\n value === \"location\" &&\n prevType === \"punc\" && prevVal === \"[\" &&\n ((prev2Type === \"id\" && !EXPR_KEYWORDS.has(prev2Val)) || prev2Val === \")\" || prev2Val === \"]\") &&\n src[skipTrivia(end)] === \"]\"\n ) {\n const quote = src[i];\n edits.push([i, end, quote + LOCATION + quote]);\n }\n i = end;\n push(\"str\", value);\n continue;\n }\n\n // Template literals.\n if (c === 96) {\n i = handleTemplate(i + 1);\n continue;\n }\n\n // Identifiers and keywords.\n if (isIdStart(c) || c === 92) {\n let j = i;\n let escaped = false;\n while (j < n) {\n const cc = src.charCodeAt(j);\n if (cc === 92) {\n // \\uXXXX or \\u{X...} escape inside an identifier\n escaped = true;\n if (src.charCodeAt(j + 2) === 123) {\n const close = src.indexOf(\"}\", j);\n j = close === -1 ? n : close + 1;\n } else {\n j += 6;\n }\n } else if (isIdPart(cc) && !isWhitespace(cc)) {\n j++;\n } else {\n break;\n }\n }\n const value = src.slice(i, j);\n const afterDot = prevType === \"punc\" && (prevVal === \".\" || prevVal === \"?.\");\n\n if (!escaped) {\n if (value === \"location\") {\n handleLocation(i, j);\n } else if (value === \"import\" && !afterDot) {\n IMPORT_META_URL.lastIndex = i;\n if (IMPORT_META_URL.test(src)) {\n const end = IMPORT_META_URL.lastIndex;\n edits.push([i, end, `${UNREWRITE}(import.meta.url)`]);\n i = end;\n push(\"punc\", \")\");\n continue;\n }\n const next = src[skipTrivia(j)];\n if (next !== \"(\" && next !== \".\") inImport = true;\n } else if (value === \"from\" && inImport) {\n inImport = false;\n }\n }\n\n i = j;\n push(\"id\", value);\n continue;\n }\n\n // Private names and numbers.\n if (c === 35) {\n let j = i + 1;\n while (j < n && isIdPart(src.charCodeAt(j))) j++;\n push(\"id\", src.slice(i, j));\n i = j;\n continue;\n }\n if ((c >= 48 && c <= 57) || (c === 46 && src.charCodeAt(i + 1) >= 48 && src.charCodeAt(i + 1) <= 57)) {\n let j = i + 1;\n while (j < n) {\n const cc = src.charCodeAt(j);\n if (isIdPart(cc) || cc === 46) j++;\n else break;\n }\n i = j;\n push(\"num\", \"\");\n continue;\n }\n\n // Punctuators.\n switch (c) {\n case 123: { // {\n let kind = \"block\";\n if (prevType === \"id\" && (prevVal === \"import\" || prevVal === \"export\") && prev2Val !== \".\" && prev2Val !== \"?.\") {\n kind = \"ie-\" + prevVal;\n } else if (inImport && prevType === \"punc\" && prevVal === \",\") {\n kind = \"ie-import\";\n } else if ((prevType === \"punc\" && OBJECT_AFTER_PUNC.has(prevVal)) || (prevType === \"id\" && OBJECT_AFTER_KEYWORD.has(prevVal))) {\n kind = \"obj\";\n }\n braces.push(kind);\n i++;\n push(\"punc\", \"{\");\n continue;\n }\n case 125: { // }\n const kind = braces.pop();\n if (kind === \"tmpl\") {\n i = handleTemplate(i + 1);\n continue;\n }\n i++;\n push(\"punc\", \"}\");\n continue;\n }\n case 40: { // (\n const isEvalCall = prevType === \"id\" && prevVal === \"eval\" &&\n prev2Val !== \".\" && prev2Val !== \"?.\" && prev2Val !== \"function\";\n parens.push(isEvalCall ? i : null);\n i++;\n push(\"punc\", \"(\");\n continue;\n }\n case 41: { // )\n const open = parens.pop();\n // `eval(x) {` is a method definition, not a call.\n if (open != null && src[skipTrivia(i + 1)] !== \"{\") {\n edits.push([open + 1, open + 1, EVAL_WRAP + \"(\"]);\n edits.push([i, i, \")\"]);\n }\n i++;\n push(\"punc\", \")\");\n continue;\n }\n case 46: // .\n if (src.charCodeAt(i + 1) === 46 && src.charCodeAt(i + 2) === 46) {\n i += 3;\n push(\"punc\", \"...\");\n } else {\n i++;\n push(\"punc\", \".\");\n }\n continue;\n case 63: { // ?\n const d = src.charCodeAt(i + 1);\n const e = src.charCodeAt(i + 2);\n if (d === 46 && !(e >= 48 && e <= 57)) {\n i += 2;\n push(\"punc\", \"?.\");\n } else if (d === 63) {\n i += 2;\n push(\"punc\", \"??\");\n } else {\n i++;\n push(\"punc\", \"?\");\n }\n continue;\n }\n case 43: // +\n case 45: // -\n if (src.charCodeAt(i + 1) === c) {\n i += 2;\n push(\"punc\", c === 43 ? \"++\" : \"--\");\n } else {\n i++;\n push(\"punc\", src[i - 1]);\n }\n continue;\n case 61: // =\n if (src.charCodeAt(i + 1) === 62) {\n i += 2;\n push(\"punc\", \"=>\");\n } else {\n i++;\n push(\"punc\", \"=\");\n }\n continue;\n case 59: // ;\n inImport = false;\n i++;\n push(\"punc\", \";\");\n continue;\n default:\n i++;\n push(\"punc\", src[i - 1]);\n }\n }\n\n if (edits.length === 0) return src;\n\n edits.sort((a, b) => a[0] - b[0] || (a[1] - a[0]) - (b[1] - b[0]));\n let out = \"\";\n let last = 0;\n for (const [start, end, text] of edits) {\n if (start < last) continue; // overlapping edit; keep the first\n out += src.slice(last, start) + text;\n last = end;\n }\n return out + src.slice(last);\n}\n", "/**\n * HTML rewriting with a small, forgiving tokenizer (service workers have no\n * DOMParser). Only start tags are modified; text, comments and end tags are\n * copied through byte for byte, and unchanged tags keep their exact source.\n */\n\nconst RAW_TEXT = new Set([\"script\", \"style\", \"textarea\", \"title\", \"xmp\", \"iframe\", \"noembed\", \"noframes\", \"plaintext\"]);\n\nconst JS_TYPE = /^(?:|module|(?:text|application)\\/(?:x-)?(?:javascript|ecmascript)|text\\/jscript|text\\/livescript|text\\/javascript1\\.[0-5])$/i;\n\n/** Attributes holding a single URL, on any element. */\nexport const URL_ATTRS = new Set([\n \"href\", \"src\", \"action\", \"formaction\", \"poster\", \"background\", \"cite\", \"longdesc\",\n \"manifest\", \"codebase\", \"icon\", \"lowsrc\", \"dynsrc\", \"xlink:href\",\n]);\n\n/** Attributes whose name is changed so the browser ignores them. */\nconst NEUTRALIZE = {\n integrity: \"data-butter-integrity\",\n sandbox: \"data-butter-sandbox\", // sandboxed frames cannot be controlled by the service worker\n};\n\nconst NAMED_ENTITIES = { amp: \"&\", lt: \"<\", gt: \">\", quot: '\"', apos: \"'\", nbsp: String.fromCharCode(0xa0) };\nconst ENTITY = /&(?:#(\\d{1,7});?|#[xX]([0-9a-fA-F]{1,6});?|(amp|lt|gt|quot|apos|nbsp)(?:;|(?![=\\w])))/g;\n\n/** @param {string} value */\nexport function decodeEntities(value) {\n if (value.indexOf(\"&\") === -1) return value;\n return value.replace(ENTITY, (match, dec, hex, named) => {\n if (named) return NAMED_ENTITIES[named];\n const code = dec ? parseInt(dec, 10) : parseInt(hex, 16);\n return code > 0 && code <= 0x10ffff ? String.fromCodePoint(code) : String.fromCharCode(0xfffd);\n });\n}\n\n/** @param {string} value */\nexport function escapeAttribute(value) {\n return value.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\");\n}\n\nfunction isWs(c) {\n return c === 32 || c === 9 || c === 10 || c === 12 || c === 13;\n}\n\nfunction isLetter(c) {\n return (c >= 97 && c <= 122) || (c >= 65 && c <= 90);\n}\n\n/**\n * @typedef {object} RewriteContext\n * @property {string} base Target base URL used to resolve relative URLs\n * @property {string} [inject] Markup inserted at the start of the document\n */\n\n/**\n * Rewrite one attribute value. Returns the new value (possibly identical).\n * Shared by the HTML rewriter and the client runtime's setAttribute hook.\n *\n * @param {import(\"./index.js\").Formatter} f\n * @param {string} tag Lower-case tag name\n * @param {string} name Attribute name\n * @param {string} value Decoded attribute value\n * @param {RewriteContext} ctx\n * @returns {string}\n */\nexport function rewriteAttribute(f, tag, name, value, ctx) {\n const attr = name.toLowerCase();\n if (attr.length > 2 && attr.startsWith(\"on\")) return f.js(value);\n switch (attr) {\n case \"style\":\n return f.css(value, ctx.base);\n case \"srcset\":\n case \"imagesrcset\":\n return f.url.rewriteSrcset(value, ctx.base);\n case \"ping\":\n return value.split(/(\\s+)/).map((part) => (part.trim() ? f.rewriteUrl(part, ctx.base) : part)).join(\"\");\n case \"srcdoc\":\n return tag === \"iframe\" ? f.html(value, { base: ctx.base, inject: ctx.inject }) : value;\n case \"data\":\n return tag === \"object\" ? f.rewriteUrl(value, ctx.base) : value;\n }\n if (URL_ATTRS.has(attr)) {\n const trimmed = value.trim();\n if (/^javascript:/i.test(trimmed)) {\n const code = trimmed.slice(11);\n return code.indexOf(\"%\") === -1 ? \"javascript:\" + f.js(code) : value;\n }\n return f.rewriteUrl(value, ctx.base);\n }\n return value;\n}\n\n/**\n * @typedef {object} Attr\n * @property {string} name\n * @property {string | null} value Decoded value, null for boolean attributes\n * @property {number} start\n * @property {number} end\n * @property {string} [newName]\n * @property {string | null} [newValue]\n */\n\n/**\n * Parse a start tag beginning at `i` (src[i] === \"<\", src[i + 1] is a letter).\n * @param {string} src\n * @param {number} i\n */\nfunction parseStartTag(src, i) {\n const n = src.length;\n let j = i + 1;\n while (j < n) {\n const c = src.charCodeAt(j);\n if (isWs(c) || c === 47 || c === 62) break;\n j++;\n }\n const name = src.slice(i + 1, j).toLowerCase();\n /** @type {Attr[]} */\n const attrs = [];\n let selfClosing = false;\n\n while (j < n) {\n let c = src.charCodeAt(j);\n if (isWs(c)) {\n j++;\n continue;\n }\n if (c === 47) {\n if (src.charCodeAt(j + 1) === 62) {\n selfClosing = true;\n return { name, attrs, selfClosing, end: j + 2 };\n }\n j++;\n continue;\n }\n if (c === 62) return { name, attrs, selfClosing, end: j + 1 };\n\n const start = j++;\n while (j < n) {\n c = src.charCodeAt(j);\n if (isWs(c) || c === 47 || c === 62 || c === 61) break;\n j++;\n }\n const attrName = src.slice(start, j);\n let k = j;\n while (k < n && isWs(src.charCodeAt(k))) k++;\n if (src.charCodeAt(k) !== 61) {\n attrs.push({ name: attrName, value: null, start, end: j });\n continue;\n }\n k++;\n while (k < n && isWs(src.charCodeAt(k))) k++;\n const q = src.charCodeAt(k);\n let raw;\n if (q === 34 || q === 39) {\n const close = src.indexOf(q === 34 ? '\"' : \"'\", k + 1);\n if (close === -1) return null;\n raw = src.slice(k + 1, close);\n j = close + 1;\n } else {\n const vs = k;\n while (k < n && !isWs(src.charCodeAt(k)) && src.charCodeAt(k) !== 62) k++;\n raw = src.slice(vs, k);\n j = k;\n }\n attrs.push({ name: attrName, value: decodeEntities(raw), start, end: j });\n }\n return null; // unterminated tag at end of input\n}\n\n/** @param {Attr[]} attrs @param {string} name */\nfunction findAttr(attrs, name) {\n for (const attr of attrs) if (attr.name.toLowerCase() === name) return attr;\n return undefined;\n}\n\n/**\n * Work out the changes for one start tag, recording them on the attrs.\n * @returns {boolean} whether anything changed\n */\nfunction transformTag(f, tag, ctx, state) {\n let changed = false;\n const { name, attrs } = tag;\n\n if (name === \"meta\") {\n const equiv = findAttr(attrs, \"http-equiv\");\n const kind = equiv && equiv.value ? equiv.value.trim().toLowerCase() : \"\";\n if (kind.startsWith(\"content-security-policy\")) {\n equiv.newName = \"data-butter-http-equiv\";\n return true;\n }\n if (kind === \"refresh\") {\n const content = findAttr(attrs, \"content\");\n if (content && content.value) {\n const value = rewriteRefresh(f, content.value, ctx.base);\n if (value !== content.value) {\n content.newValue = value;\n changed = true;\n }\n }\n }\n return changed;\n }\n\n if (name === \"base\" && !state.baseSeen) {\n const href = findAttr(attrs, \"href\");\n if (href && href.value !== null) {\n state.baseSeen = true;\n try {\n ctx.base = new URL(href.value.trim(), ctx.base).href;\n } catch {\n // keep the previous base\n }\n }\n }\n\n for (const attr of attrs) {\n if (attr.value === null) continue;\n const lower = attr.name.toLowerCase();\n if (lower === \"data-butter\") return false; // our own markup\n const rename = NEUTRALIZE[lower];\n if (rename && (lower !== \"sandbox\" || name === \"iframe\")) {\n attr.newName = rename;\n changed = true;\n continue;\n }\n const value = rewriteAttribute(f, name, attr.name, attr.value, ctx);\n if (value !== attr.value) {\n attr.newValue = value;\n changed = true;\n }\n }\n return changed;\n}\n\n/**\n * Rewrite the URL in a refresh value such as \"5; url=/next\".\n * @returns {string}\n */\nexport function rewriteRefresh(f, value, base) {\n const match = value.match(/^(\\s*[\\d.]*\\s*[;,]?\\s*(?:url\\s*=\\s*)?)(['\"]?)(.*?)\\2(\\s*)$/i);\n if (!match || !match[3]) return value;\n return match[1] + match[2] + f.rewriteUrl(match[3], base) + match[2] + match[4];\n}\n\nfunction serializeTag(src, tag, i) {\n let out = \"\";\n let last = i;\n for (const attr of tag.attrs) {\n if (attr.newName === undefined && attr.newValue === undefined) continue;\n const name = attr.newName ?? attr.name;\n const value = attr.newValue !== undefined ? attr.newValue : attr.value;\n out += src.slice(last, attr.start) + name + (value === null ? \"\" : `=\"${escapeAttribute(value)}\"`);\n last = attr.end;\n }\n return out + src.slice(last, tag.end);\n}\n\nconst closeTagCache = new Map();\nfunction findRawTextEnd(src, name, from) {\n let re = closeTagCache.get(name);\n if (!re) {\n re = new RegExp(`</${name}(?=[\\\\s/>])`, \"ig\");\n closeTagCache.set(name, re);\n }\n re.lastIndex = from;\n const match = re.exec(src);\n return match ? match.index : src.length;\n}\n\n/**\n * @param {string} html\n * @param {import(\"./index.js\").Formatter} f\n * @param {RewriteContext} options\n * @returns {string}\n */\nexport function rewriteHtml(html, f, options) {\n const ctx = { base: options.base, inject: options.inject };\n const state = { injected: !options.inject, baseSeen: false, foreign: 0, doctypeEnd: -1 };\n const n = html.length;\n let out = \"\";\n let i = 0;\n\n const inject = () => {\n state.injected = true;\n return ctx.inject || \"\";\n };\n\n while (i < n) {\n const lt = html.indexOf(\"<\", i);\n if (lt === -1) {\n out += html.slice(i);\n break;\n }\n out += html.slice(i, lt);\n i = lt;\n const next = html.charCodeAt(i + 1);\n\n // Comments, doctype, CDATA and other markup declarations.\n if (next === 33 || next === 63) {\n let end;\n if (html.startsWith(\"<!--\", i)) {\n if (html.startsWith(\"<!-->\", i)) end = i + 5;\n else if (html.startsWith(\"<!--->\", i)) end = i + 6;\n else {\n const close = html.indexOf(\"-->\", i + 4);\n end = close === -1 ? n : close + 3;\n }\n } else if (state.foreign && html.startsWith(\"<![CDATA[\", i)) {\n const close = html.indexOf(\"]]>\", i + 9);\n end = close === -1 ? n : close + 3;\n } else {\n const close = html.indexOf(\">\", i + 2);\n end = close === -1 ? n : close + 1;\n if (/^<!doctype/i.test(html.slice(i, i + 9))) state.doctypeEnd = out.length + (end - i);\n }\n out += html.slice(i, end);\n i = end;\n continue;\n }\n\n // End tags.\n if (next === 47) {\n const close = html.indexOf(\">\", i + 2);\n const end = close === -1 ? n : close + 1;\n if (isLetter(html.charCodeAt(i + 2))) {\n const name = html.slice(i + 2, end).match(/^[^\\s/>]*/)[0].toLowerCase();\n if ((name === \"svg\" || name === \"math\") && state.foreign > 0) state.foreign--;\n }\n out += html.slice(i, end);\n i = end;\n continue;\n }\n\n if (!isLetter(next)) {\n out += \"<\";\n i++;\n continue;\n }\n\n // Start tags.\n const tag = parseStartTag(html, i);\n if (!tag) {\n out += html.slice(i);\n break;\n }\n\n if (!state.injected && tag.name !== \"html\") {\n if (tag.name !== \"head\") out += inject();\n }\n\n out += transformTag(f, tag, ctx, state) ? serializeTag(html, tag, i) : html.slice(i, tag.end);\n i = tag.end;\n\n if (!state.injected && tag.name === \"head\") out += inject();\n if ((tag.name === \"svg\" || tag.name === \"math\") && !tag.selfClosing) state.foreign++;\n\n const raw = state.foreign\n ? (tag.name === \"script\" || tag.name === \"style\") && !tag.selfClosing\n : RAW_TEXT.has(tag.name);\n if (!raw) continue;\n\n if (tag.name === \"plaintext\") {\n out += html.slice(i);\n break;\n }\n const end = findRawTextEnd(html, tag.name, i);\n let content = html.slice(i, end);\n if (tag.name === \"script\" && !findAttr(tag.attrs, \"data-butter\")) {\n const type = findAttr(tag.attrs, \"type\");\n if (JS_TYPE.test(type && type.value ? type.value.trim() : \"\")) content = f.js(content);\n } else if (tag.name === \"style\") {\n content = f.css(content, ctx.base);\n }\n out += content;\n i = end;\n }\n\n if (!state.injected) {\n const markup = inject();\n if (state.doctypeEnd !== -1) out = out.slice(0, state.doctypeEnd) + markup + out.slice(state.doctypeEnd);\n else out = markup + out;\n }\n return out;\n}\n", "/**\n * butter-col formatter: everything that turns a target site's content into\n * content that keeps working when served from the proxy origin.\n *\n * It is shared by the service worker (src/sw) and the in-page runtime\n * (src/client) and has no dependencies on either environment beyond the\n * standard URL / TextEncoder APIs.\n */\n\nimport { createUrlRewriter, MODULE_WORKER_MARK } from \"./url.js\";\nimport { rewriteCss } from \"./css.js\";\nimport { rewriteJs, LOCATION, EVAL_WRAP, UNREWRITE } from \"./js.js\";\nimport { rewriteHtml, rewriteAttribute, rewriteRefresh, URL_ATTRS, decodeEntities, escapeAttribute } from \"./html.js\";\nimport { codecs, getCodec } from \"./codecs.js\";\n\n/**\n * @typedef {object} FormatterConfig\n * @property {string} origin Proxy origin\n * @property {string} prefix Prefix for proxied URLs, e.g. \"/butter/go/\"\n * @property {string} codec Codec name\n */\n\n/**\n * @param {FormatterConfig} config\n */\nexport function createFormatter(config) {\n const url = createUrlRewriter(config);\n\n const formatter = {\n config,\n url,\n /** @param {string} raw @param {string | URL} base @param {{ moduleWorker?: boolean }} [opts] */\n rewriteUrl: (raw, base, opts) => url.rewrite(raw, base, opts),\n /** @param {string} proxied */\n unrewriteUrl: (proxied) => url.unrewrite(proxied),\n /** @param {string} src @param {string | URL} base */\n css: (src, base) => rewriteCss(src, base, url.rewrite),\n /** @param {string} src */\n js: (src) => rewriteJs(src),\n /** @param {string} src @param {{ base: string, inject?: string }} options */\n html: (src, options) => rewriteHtml(src, formatter, options),\n /** @param {string} tag @param {string} name @param {string} value @param {{ base: string, inject?: string }} ctx */\n attr: (tag, name, value, ctx) => rewriteAttribute(formatter, tag, name, value, ctx),\n /** @param {string} value @param {string} base */\n refresh: (value, base) => rewriteRefresh(formatter, value, base),\n };\n return formatter;\n}\n\n/** @typedef {ReturnType<typeof createFormatter>} Formatter */\n\nexport {\n codecs,\n getCodec,\n rewriteCss,\n rewriteJs,\n rewriteHtml,\n decodeEntities,\n escapeAttribute,\n URL_ATTRS,\n MODULE_WORKER_MARK,\n LOCATION,\n EVAL_WRAP,\n UNREWRITE,\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["none", "url", "encoded", "plain", "xorString", "str", "out", "i", "xor", "base64", "bytes", "bin", "b64", "codecs", "getCodec", "name", "codec", "MODULE_WORKER_MARK", "PASSTHROUGH_SCHEMES", "TARGET_SCHEME", "createUrlRewriter", "origin", "prefix", "codecName", "codec", "getCodec", "absPrefix", "decodeTail", "tail", "decoded", "isProxied", "url", "rewrite", "raw", "base", "opts", "str", "trimmed", "abs", "hash", "mark", "unrewrite", "rest", "hashAt", "search", "searchAt", "target", "rewriteSrcset", "value", "map", "out", "i", "n", "wsStart", "urlStart", "trailing", "commas", "descStart", "depth", "ch", "URL_FUNCTION", "IMPORT_STRING", "rewriteCss", "css", "base", "rewriteUrl", "map", "raw", "url", "rewritten", "match", "dq", "sq", "bare", "LOCATION", "EVAL_WRAP", "UNREWRITE", "NEEDS_REWRITE", "EXPR_KEYWORDS", "OBJECT_AFTER_PUNC", "OBJECT_AFTER_KEYWORD", "IMPORT_META_URL", "isIdStart", "c", "isIdPart", "isWhitespace", "isLineTerminator", "rewriteJs", "src", "n", "edits", "prevType", "prevVal", "prev2Type", "prev2Val", "braces", "parens", "inImport", "push", "type", "val", "skipTrivia", "pos", "end", "peekWord", "j", "start", "regexAllowed", "scanString", "i", "quote", "scanTemplate", "scanRegex", "inClass", "handleTemplate", "opens", "handleLocation", "top", "importing", "next", "d", "value", "escaped", "cc", "close", "afterDot", "kind", "isEvalCall", "open", "e", "a", "b", "out", "last", "text", "RAW_TEXT", "JS_TYPE", "URL_ATTRS", "NEUTRALIZE", "NAMED_ENTITIES", "ENTITY", "decodeEntities", "value", "match", "dec", "hex", "named", "code", "escapeAttribute", "isWs", "c", "isLetter", "rewriteAttribute", "f", "tag", "name", "ctx", "attr", "part", "trimmed", "parseStartTag", "src", "i", "n", "j", "attrs", "selfClosing", "start", "attrName", "k", "q", "raw", "close", "vs", "findAttr", "transformTag", "state", "changed", "equiv", "kind", "content", "rewriteRefresh", "href", "lower", "rename", "base", "serializeTag", "out", "last", "closeTagCache", "findRawTextEnd", "from", "re", "rewriteHtml", "html", "options", "inject", "lt", "next", "end", "type", "markup", "createFormatter", "config", "url", "createUrlRewriter", "formatter", "raw", "base", "opts", "proxied", "src", "rewriteCss", "rewriteJs", "options", "rewriteHtml", "tag", "name", "value", "ctx", "rewriteAttribute", "rewriteRefresh"]
7
+ }
package/dist/sw.js ADDED
@@ -0,0 +1,30 @@
1
+ "use strict";(()=>{var Y={UNREACHABLE:"TRANSPORT_UNREACHABLE",BAD_RESPONSE:"BAD_TRANSPORT_RESPONSE",DNS_FAILURE:"DNS_FAILURE",UPSTREAM_UNREACHABLE:"UPSTREAM_UNREACHABLE",UPSTREAM_TIMEOUT:"UPSTREAM_TIMEOUT",BLOCKED:"BLOCKED",ERROR:"TRANSPORT_ERROR"},I=class X extends Error{code;status;constructor(t,o,r=502){super(o),this.name="TransportError",this.code=t,this.status=r}static is(t){return t instanceof X||!!t&&typeof t=="object"&&t.name==="TransportError"&&typeof t.code=="string"}};function Z(){return globalThis.__butter$transports??=new Map}function B(e){return Z().get(e)}function je(){return[...Z().keys()]}async function Q(e,t,o){let r=B(e);if(!r)throw new Error(`butter-transport: no transport named "${e}" is registered (loaded: ${je().join(", ")||"none"})`);let n=await r(t,o),s=We(n);if(s.length)throw new TypeError(`butter-transport: "${e}" is invalid: ${s.join("; ")}`);if(n.meta.name!==e)throw new TypeError(`butter-transport: "${e}" reports meta.name "${n.meta.name}"`);return await n.init?.(),n}function We(e){let t=[],o=e;if(!o||typeof o!="object")return["factory did not return an object"];let r=o.meta;return!r||typeof r!="object"?t.push("meta is missing"):(typeof r.name!="string"&&t.push("meta.name must be a string"),r.cookies!=="server"&&r.cookies!=="client"&&t.push('meta.cookies must be "server" or "client"'),typeof r.websockets!="boolean"&&t.push("meta.websockets must be a boolean"),r.websockets&&typeof o.connect!="function"&&t.push("meta.websockets is true but connect() is missing")),typeof o.request!="function"&&t.push("request() is missing"),o.init!==void 0&&typeof o.init!="function"&&t.push("init must be a function"),o.destroy!==void 0&&typeof o.destroy!="function"&&t.push("destroy must be a function"),t}var Pe={encode:e=>e,decode:e=>e},Ne={encode:e=>encodeURIComponent(e),decode:e=>decodeURIComponent(e)};function ee(e){let t="";for(let o=0;o<e.length;o++)t+=o%2?String.fromCharCode(e.charCodeAt(o)^2):e[o];return t}var Ie={encode:e=>encodeURIComponent(ee(e)),decode:e=>ee(decodeURIComponent(e))},Be={encode(e){let t=new TextEncoder().encode(e),o="";for(let r=0;r<t.length;r++)o+=String.fromCharCode(t[r]);return btoa(o).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")},decode(e){let t=e.replace(/-/g,"+").replace(/_/g,"/");for(;t.length%4;)t+="=";let o=atob(t),r=new Uint8Array(o.length);for(let n=0;n<o.length;n++)r[n]=o.charCodeAt(n);return new TextDecoder("utf-8",{fatal:!0}).decode(r)}},te={none:Pe,plain:Ne,xor:Ie,base64:Be};function H(e){let t=te[e];if(!t)throw new Error(`butter: unknown codec "${e}"`);return t}var v="~m/",Me=/^(?:data|blob|about|mailto|tel|sms|javascript|intent|chrome|chrome-extension|moz-extension|file|filesystem):/i,De=/^(?:https?|wss?):\/\//i;function re({origin:e,prefix:t,codec:o}){let r=H(o),n=e+t;function s(a){a.startsWith(v)&&(a=a.slice(v.length));let p;try{p=r.decode(a)}catch{return null}if(!De.test(p))return null;try{return new URL(p).href}catch{return null}}function c(a){return a.startsWith(n)||a.startsWith(t)}function i(a,p,b){if(a==null)return a;let m=String(a),g=m.trim();if(!g||g.startsWith("#")||Me.test(g))return m;if(c(g))return g;let w;try{w=new URL(g,p)}catch{return m}if(w.protocol!=="http:"&&w.protocol!=="https:")return m;let x=w.hash;w.hash="";let C=b&&b.moduleWorker?v:"";return n+C+r.encode(w.href)+x}function f(a){if(a==null)return a;let p=String(a),b;if(p.startsWith(n))b=p.slice(n.length);else if(p.startsWith(t))b=p.slice(t.length);else return p;let m="",g=b.indexOf("#");g!==-1&&(m=b.slice(g),b=b.slice(0,g));let w="",x=b.indexOf("?");x!==-1&&(w=b.slice(x),b=b.slice(0,x));let C=s(b);if(C===null)return p;if(!w)return C+m;let k=new URL(C);return k.search=w,k.href+m}function l(a,p,b=i){let m="",g=0,w=a.length;for(;g<w;){let x=g;for(;g<w&&(/\s/.test(a[g])||a[g]===",");)g++;if(m+=a.slice(x,g),g>=w)break;let C=g;for(;g<w&&!/\s/.test(a[g]);)g++;let k=a.slice(C,g),d="",$=k.match(/,+$/);if($&&(d=$[0],k=k.slice(0,-d.length)),m+=b(k,p)+d,d)continue;let S=g,h=0;for(;g<w;){let u=a[g];if(u==="(")h++;else if(u===")")h=Math.max(0,h-1);else if(u===","&&h===0)break;g++}m+=a.slice(S,g)}return m}return{origin:e,prefix:t,codec:r,decodeTail:s,isProxied:c,rewrite:i,unrewrite:f,rewriteSrcset:l,unrewriteSrcset:a=>l(a,"",p=>f(p))}}var Fe=/url\(\s*(?:"((?:[^"\\\n]|\\.)*)"|'((?:[^'\\\n]|\\.)*)'|((?:[^)\s"'\\]|\\.)*))\s*\)/gi,He=/@import\s+(?:"((?:[^"\\\n]|\\.)*)"|'((?:[^'\\\n]|\\.)*)')/gi;function ne(e,t,o){if(!e||e.indexOf("url(")===-1&&e.indexOf("URL(")===-1&&e.indexOf("@import")===-1)return e;let r=n=>{let s=n.replace(/\\([^0-9a-fA-F\n])/g,"$1");if(!s||s.startsWith("#")||/^data:/i.test(s))return null;let c=o(s,t);return c===s?null:c};return e.replace(Fe,(n,s,c,i)=>{let l=r(s??c??i??"");return l===null?n:`url("${l.replace(/["\\\n]/g,"\\$&")}")`}).replace(He,(n,s,c)=>{let i=r(s??c??"");return i===null?n:`@import "${i.replace(/["\\\n]/g,"\\$&")}"`})}var A="__butter$location",se="__butter$js",ie="__butter$unrewrite",Ke=/location|eval|import\s*\.\s*meta/,oe=new Set(["return","typeof","instanceof","in","of","new","delete","void","throw","case","do","else","yield","await","extends"]),Je=new Set(["(","[",",","=",":","?","...","!","&","|","^","~","+","-","*","/","%","<",">","${","??","?."]),qe=new Set(["return","yield","await","typeof","void","in","of","case","throw","delete"]),K=/import\s*\.\s*meta\s*\.\s*url(?![\w$])/y;function ae(e){return e>=97&&e<=122||e>=65&&e<=90||e===36||e===95||e>=128}function W(e){return ae(e)||e>=48&&e<=57}function J(e){return e===32||e===9||e===10||e===13||e===11||e===12||e===160||e===65279||e===8232||e===8233||e===5760||e>=8192&&e<=8202||e===8239||e===8287||e===12288}function M(e){return e===10||e===13||e===8232||e===8233}function ce(e){if(typeof e!="string"||!Ke.test(e))return e;let t=e.length,o=[],r="",n="",s="",c="",i=[],f=[],l=!1,a=(h,u)=>{s=r,c=n,r=h,n=u},p=h=>{for(;h<t;){let u=e.charCodeAt(h);if(J(u))h++;else if(u===47&&e.charCodeAt(h+1)===47)for(;h<t&&!M(e.charCodeAt(h));)h++;else if(u===47&&e.charCodeAt(h+1)===42){let y=e.indexOf("*/",h+2);h=y===-1?t:y+2}else break}return h},b=h=>{let u=p(h),y=u;for(;u<t&&W(e.charCodeAt(u));)u++;return e.slice(y,u)},m=()=>r?r==="punc"?n!==")"&&n!=="]"&&n!=="++"&&n!=="--":r==="id"?oe.has(n):!1:!0,g=(h,u)=>{let y=h+1;for(;y<t;){let R=e.charCodeAt(y);if(R===92)y+=2;else{if(R===u)return y+1;if(R===10||R===13)return y;y++}}return t},w=h=>{for(;h<t;){let u=e.charCodeAt(h);if(u===92)h+=2;else{if(u===96)return[h+1,!1];if(u===36&&e.charCodeAt(h+1)===123)return[h+2,!0];h++}}return[t,!1]},x=h=>{let u=h+1,y=!1;for(;u<t;){let R=e.charCodeAt(u);if(M(R))return-1;if(R===92){if(u+1>=t||M(e.charCodeAt(u+1)))return-1;u+=2;continue}if(y)R===93&&(y=!1);else if(R===91)y=!0;else if(R===47){for(u++;u<t&&W(e.charCodeAt(u));)u++;return u}u++}return-1},C=h=>{let[u,y]=w(h);return y?(i.push("tmpl"),a("punc","${")):a("tmpl",""),u},k=(h,u)=>{if(r==="punc"&&(n==="."||n==="?.")){o.push([h,u,A]);return}let y=i[i.length-1];if(y==="ie-import"||y==="ie-export"){let R=y==="ie-import";r==="id"&&n==="as"?R&&o.push([h,u,A]):b(u)==="as"?R||o.push([h,u,A]):o.push([h,u,R?`location as ${A}`:`${A} as location`]);return}if(y==="obj"&&r==="punc"&&(n==="{"||n===",")){let R=e[p(u)];if(R===":")return;if(R===","||R==="}"){o.push([h,u,`location: ${A}`]);return}}o.push([h,u,A])},d=0;if(e.startsWith("#!"))for(;d<t&&!M(e.charCodeAt(d));)d++;for(;d<t;){let h=e.charCodeAt(d);if(J(h)){d++;continue}if(h===47){let u=e.charCodeAt(d+1);if(u===47||u===42){d=p(d);continue}if(m()){let y=x(d);if(y!==-1){d=y,a("regex","");continue}}d++,a("punc","/");continue}if(h===34||h===39){let u=g(d,h),y=e.slice(d+1,u-1);if(y==="location"&&r==="punc"&&n==="["&&(s==="id"&&!oe.has(c)||c===")"||c==="]")&&e[p(u)]==="]"){let R=e[d];o.push([d,u,R+A+R])}d=u,a("str",y);continue}if(h===96){d=C(d+1);continue}if(ae(h)||h===92){let u=d,y=!1;for(;u<t;){let U=e.charCodeAt(u);if(U===92)if(y=!0,e.charCodeAt(u+2)===123){let j=e.indexOf("}",u);u=j===-1?t:j+1}else u+=6;else if(W(U)&&!J(U))u++;else break}let R=e.slice(d,u),$e=r==="punc"&&(n==="."||n==="?.");if(!y)if(R==="location")k(d,u);else if(R==="import"&&!$e){if(K.lastIndex=d,K.test(e)){let j=K.lastIndex;o.push([d,j,`${ie}(import.meta.url)`]),d=j,a("punc",")");continue}let U=e[p(u)];U!=="("&&U!=="."&&(l=!0)}else R==="from"&&l&&(l=!1);d=u,a("id",R);continue}if(h===35){let u=d+1;for(;u<t&&W(e.charCodeAt(u));)u++;a("id",e.slice(d,u)),d=u;continue}if(h>=48&&h<=57||h===46&&e.charCodeAt(d+1)>=48&&e.charCodeAt(d+1)<=57){let u=d+1;for(;u<t;){let y=e.charCodeAt(u);if(W(y)||y===46)u++;else break}d=u,a("num","");continue}switch(h){case 123:{let u="block";r==="id"&&(n==="import"||n==="export")&&c!=="."&&c!=="?."?u="ie-"+n:l&&r==="punc"&&n===","?u="ie-import":(r==="punc"&&Je.has(n)||r==="id"&&qe.has(n))&&(u="obj"),i.push(u),d++,a("punc","{");continue}case 125:{if(i.pop()==="tmpl"){d=C(d+1);continue}d++,a("punc","}");continue}case 40:{let u=r==="id"&&n==="eval"&&c!=="."&&c!=="?."&&c!=="function";f.push(u?d:null),d++,a("punc","(");continue}case 41:{let u=f.pop();u!=null&&e[p(d+1)]!=="{"&&(o.push([u+1,u+1,se+"("]),o.push([d,d,")"])),d++,a("punc",")");continue}case 46:e.charCodeAt(d+1)===46&&e.charCodeAt(d+2)===46?(d+=3,a("punc","...")):(d++,a("punc","."));continue;case 63:{let u=e.charCodeAt(d+1),y=e.charCodeAt(d+2);u===46&&!(y>=48&&y<=57)?(d+=2,a("punc","?.")):u===63?(d+=2,a("punc","??")):(d++,a("punc","?"));continue}case 43:case 45:e.charCodeAt(d+1)===h?(d+=2,a("punc",h===43?"++":"--")):(d++,a("punc",e[d-1]));continue;case 61:e.charCodeAt(d+1)===62?(d+=2,a("punc","=>")):(d++,a("punc","="));continue;case 59:l=!1,d++,a("punc",";");continue;default:d++,a("punc",e[d-1])}}if(o.length===0)return e;o.sort((h,u)=>h[0]-u[0]||h[1]-h[0]-(u[1]-u[0]));let $="",S=0;for(let[h,u,y]of o)h<S||($+=e.slice(S,h)+y,S=u);return $+e.slice(S)}var Ge=new Set(["script","style","textarea","title","xmp","iframe","noembed","noframes","plaintext"]),Ve=/^(?:|module|(?:text|application)\/(?:x-)?(?:javascript|ecmascript)|text\/jscript|text\/livescript|text\/javascript1\.[0-5])$/i,fe=new Set(["href","src","action","formaction","poster","background","cite","longdesc","manifest","codebase","icon","lowsrc","dynsrc","xlink:href"]),ze={integrity:"data-butter-integrity",sandbox:"data-butter-sandbox"},Ye={amp:"&",lt:"<",gt:">",quot:'"',apos:"'",nbsp:"\xA0"},Xe=/&(?:#(\d{1,7});?|#[xX]([0-9a-fA-F]{1,6});?|(amp|lt|gt|quot|apos|nbsp)(?:;|(?![=\w])))/g;function pe(e){return e.indexOf("&")===-1?e:e.replace(Xe,(t,o,r,n)=>{if(n)return Ye[n];let s=o?parseInt(o,10):parseInt(r,16);return s>0&&s<=1114111?String.fromCodePoint(s):"\uFFFD"})}function de(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;")}function L(e){return e===32||e===9||e===10||e===12||e===13}function ue(e){return e>=97&&e<=122||e>=65&&e<=90}function q(e,t,o,r,n){let s=o.toLowerCase();if(s.length>2&&s.startsWith("on"))return e.js(r);switch(s){case"style":return e.css(r,n.base);case"srcset":case"imagesrcset":return e.url.rewriteSrcset(r,n.base);case"ping":return r.split(/(\s+)/).map(c=>c.trim()?e.rewriteUrl(c,n.base):c).join("");case"srcdoc":return t==="iframe"?e.html(r,{base:n.base,inject:n.inject}):r;case"data":return t==="object"?e.rewriteUrl(r,n.base):r}if(fe.has(s)){let c=r.trim();if(/^javascript:/i.test(c)){let i=c.slice(11);return i.indexOf("%")===-1?"javascript:"+e.js(i):r}return e.rewriteUrl(r,n.base)}return r}function Ze(e,t){let o=e.length,r=t+1;for(;r<o;){let i=e.charCodeAt(r);if(L(i)||i===47||i===62)break;r++}let n=e.slice(t+1,r).toLowerCase(),s=[],c=!1;for(;r<o;){let i=e.charCodeAt(r);if(L(i)){r++;continue}if(i===47){if(e.charCodeAt(r+1)===62)return c=!0,{name:n,attrs:s,selfClosing:c,end:r+2};r++;continue}if(i===62)return{name:n,attrs:s,selfClosing:c,end:r+1};let f=r++;for(;r<o&&(i=e.charCodeAt(r),!(L(i)||i===47||i===62||i===61));)r++;let l=e.slice(f,r),a=r;for(;a<o&&L(e.charCodeAt(a));)a++;if(e.charCodeAt(a)!==61){s.push({name:l,value:null,start:f,end:r});continue}for(a++;a<o&&L(e.charCodeAt(a));)a++;let p=e.charCodeAt(a),b;if(p===34||p===39){let m=e.indexOf(p===34?'"':"'",a+1);if(m===-1)return null;b=e.slice(a+1,m),r=m+1}else{let m=a;for(;a<o&&!L(e.charCodeAt(a))&&e.charCodeAt(a)!==62;)a++;b=e.slice(m,a),r=a}s.push({name:l,value:pe(b),start:f,end:r})}return null}function P(e,t){for(let o of e)if(o.name.toLowerCase()===t)return o}function Qe(e,t,o,r){let n=!1,{name:s,attrs:c}=t;if(s==="meta"){let i=P(c,"http-equiv"),f=i&&i.value?i.value.trim().toLowerCase():"";if(f.startsWith("content-security-policy"))return i.newName="data-butter-http-equiv",!0;if(f==="refresh"){let l=P(c,"content");if(l&&l.value){let a=G(e,l.value,o.base);a!==l.value&&(l.newValue=a,n=!0)}}return n}if(s==="base"&&!r.baseSeen){let i=P(c,"href");if(i&&i.value!==null){r.baseSeen=!0;try{o.base=new URL(i.value.trim(),o.base).href}catch{}}}for(let i of c){if(i.value===null)continue;let f=i.name.toLowerCase();if(f==="data-butter")return!1;let l=ze[f];if(l&&(f!=="sandbox"||s==="iframe")){i.newName=l,n=!0;continue}let a=q(e,s,i.name,i.value,o);a!==i.value&&(i.newValue=a,n=!0)}return n}function G(e,t,o){let r=t.match(/^(\s*[\d.]*\s*[;,]?\s*(?:url\s*=\s*)?)(['"]?)(.*?)\2(\s*)$/i);return!r||!r[3]?t:r[1]+r[2]+e.rewriteUrl(r[3],o)+r[2]+r[4]}function et(e,t,o){let r="",n=o;for(let s of t.attrs){if(s.newName===void 0&&s.newValue===void 0)continue;let c=s.newName??s.name,i=s.newValue!==void 0?s.newValue:s.value;r+=e.slice(n,s.start)+c+(i===null?"":`="${de(i)}"`),n=s.end}return r+e.slice(n,t.end)}var le=new Map;function tt(e,t,o){let r=le.get(t);r||(r=new RegExp(`</${t}(?=[\\s/>])`,"ig"),le.set(t,r)),r.lastIndex=o;let n=r.exec(e);return n?n.index:e.length}function me(e,t,o){let r={base:o.base,inject:o.inject},n={injected:!o.inject,baseSeen:!1,foreign:0,doctypeEnd:-1},s=e.length,c="",i=0,f=()=>(n.injected=!0,r.inject||"");for(;i<s;){let l=e.indexOf("<",i);if(l===-1){c+=e.slice(i);break}c+=e.slice(i,l),i=l;let a=e.charCodeAt(i+1);if(a===33||a===63){let w;if(e.startsWith("<!--",i))if(e.startsWith("<!-->",i))w=i+5;else if(e.startsWith("<!--->",i))w=i+6;else{let x=e.indexOf("-->",i+4);w=x===-1?s:x+3}else if(n.foreign&&e.startsWith("<![CDATA[",i)){let x=e.indexOf("]]>",i+9);w=x===-1?s:x+3}else{let x=e.indexOf(">",i+2);w=x===-1?s:x+1,/^<!doctype/i.test(e.slice(i,i+9))&&(n.doctypeEnd=c.length+(w-i))}c+=e.slice(i,w),i=w;continue}if(a===47){let w=e.indexOf(">",i+2),x=w===-1?s:w+1;if(ue(e.charCodeAt(i+2))){let C=e.slice(i+2,x).match(/^[^\s/>]*/)[0].toLowerCase();(C==="svg"||C==="math")&&n.foreign>0&&n.foreign--}c+=e.slice(i,x),i=x;continue}if(!ue(a)){c+="<",i++;continue}let p=Ze(e,i);if(!p){c+=e.slice(i);break}if(!n.injected&&p.name!=="html"&&p.name!=="head"&&(c+=f()),c+=Qe(t,p,r,n)?et(e,p,i):e.slice(i,p.end),i=p.end,!n.injected&&p.name==="head"&&(c+=f()),(p.name==="svg"||p.name==="math")&&!p.selfClosing&&n.foreign++,!(n.foreign?(p.name==="script"||p.name==="style")&&!p.selfClosing:Ge.has(p.name)))continue;if(p.name==="plaintext"){c+=e.slice(i);break}let m=tt(e,p.name,i),g=e.slice(i,m);if(p.name==="script"&&!P(p.attrs,"data-butter")){let w=P(p.attrs,"type");Ve.test(w&&w.value?w.value.trim():"")&&(g=t.js(g))}else p.name==="style"&&(g=t.css(g,r.base));c+=g,i=m}if(!n.injected){let l=f();n.doctypeEnd!==-1?c=c.slice(0,n.doctypeEnd)+l+c.slice(n.doctypeEnd):c=l+c}return c}function he(e){let t=re(e),o={config:e,url:t,rewriteUrl:(r,n,s)=>t.rewrite(r,n,s),unrewriteUrl:r=>t.unrewrite(r),css:(r,n)=>ne(r,n,t.rewrite),js:r=>ce(r),html:(r,n)=>me(r,o,n),attr:(r,n,s,c)=>q(o,r,n,s,c),refresh:(r,n)=>G(o,r,n)};return o}function ge(e){let t=new URL("config.js",e.location.href).href;e.importScripts(t);let o=globalThis.__butter$config;if(!o)throw new Error(`butter: ${t} did not define __butter$config`);if(!Array.isArray(o.transports)||o.transports.length===0)throw new Error(`butter: ${t} lists no transports`);return o}function we(e,t,o){let r=e.location.origin;function n(f){let l=o.unrewriteUrl(f);if(l===f||!/^https?:/i.test(l))return null;try{return new URL(l)}catch{return null}}async function s(f){if(f.clientId){let a=await e.clients.get(f.clientId);if(a){let p=n(a.url);return p?{target:p,proxied:!0}:{target:null,proxied:!a.url.startsWith(r)}}}let l=f.request.referrer;if(l){let a=n(l);if(a)return{target:a,proxied:!0}}return{target:null,proxied:!1}}function c(f){let l=new URL(f.url);return l.origin!==r||l.pathname.startsWith(t.prefix)?!1:l.pathname.startsWith(t.base)?!0:f.mode==="navigate"&&(!f.referrer||n(f.referrer)===null)}async function i(f){let l=new URL(f.request.url);if(l.origin===r){if(l.pathname.startsWith(t.prefix)){let m=l.pathname.slice(t.prefix.length),g=m.startsWith(v),w=o.url.decodeTail(m);if(w){let C=new URL(w);return l.search&&(C.search=l.search),{target:C,initiator:(await s(f)).target,moduleWorker:g}}let x=await s(f);return x.target?{target:new URL(m+l.search,x.target),initiator:x.target,moduleWorker:!1}:"invalid"}if(l.pathname.startsWith(t.base))return"passthrough";let b=await s(f);return b.target?{target:new URL(l.pathname+l.search,b.target),initiator:b.target,moduleWorker:!1}:"passthrough"}let a=await s(f);if(!a.proxied)return"passthrough";let p=new URL(l.href);return p.hash="",{target:p,initiator:a.target,moduleWorker:!1}}return{route:i,canSkip:c}}var rt=new Set(["host","cookie","cookie2","origin","referer","connection","keep-alive","proxy-authorization","proxy-connection","te","trailer","transfer-encoding","upgrade","content-length","service-worker"]);function ye(e){return/^[\d.]+$/.test(e)||e.includes(":")?e:e.split(".").slice(-2).join(".")}function nt(e,t){return e?e.origin===t.origin?"same-origin":e.protocol===t.protocol&&ye(e.hostname)===ye(t.hostname)?"same-site":"cross-site":"none"}function ot(e,t,o){let r=e.referrer;if(!r||r==="about:client")return null;let n=o.unrewriteUrl(r);if(n===r)return null;let s;try{s=new URL(n)}catch{return null}return s.hash="",s.username="",s.password="",s}function st(e,t,o){let r=t.origin===o.origin,n=t.protocol==="https:"&&o.protocol!=="https:",s=t.origin+"/";switch(e){case"no-referrer":return null;case"origin":return s;case"unsafe-url":return t.href;case"same-origin":return r?t.href:null;case"strict-origin":return n?null:s;case"origin-when-cross-origin":return r?t.href:s;case"no-referrer-when-downgrade":return n?null:t.href;default:return n?null:r?t.href:s}}function be(e,t,o){let r={};e.headers.forEach((f,l)=>{!rt.has(l)&&!l.startsWith("x-butter-")&&(r[l]=f)});let n=ot(e,t.target,o);if(n){let f=st(e.referrerPolicy,n,t.target);f&&(r.referer=f)}let s=t.initiator??n,c=e.method!=="GET"&&e.method!=="HEAD",i=!!s&&s.origin!==t.target.origin;return s&&(c||e.mode==="cors"&&i)&&(r.origin=s.origin),r["sec-fetch-dest"]=e.destination||"empty",r["sec-fetch-mode"]=e.mode,r["sec-fetch-site"]=nt(s,t.target),e.mode==="navigate"&&(r["sec-fetch-user"]="?1"),r}function it(e){let t=e.match(/;\s*charset\s*=\s*"?([^";\s]+)/i);return t?t[1]:null}function at(e){let t=String.fromCharCode(...e.subarray(0,1024)),o=t.match(/<meta[^>]+charset\s*=\s*["']?\s*([\w.:-]+)/i)||t.match(/<meta[^>]+content\s*=\s*["'][^"']*charset\s*=\s*([\w.:-]+)/i);return o?o[1]:null}function ct(e){return e[0]===239&&e[1]===187&&e[2]===191?"utf-8":e[0]===254&&e[1]===255?"utf-16be":e[0]===255&&e[1]===254?"utf-16le":null}function xe(e,t,o){let r=new Uint8Array(e),n=ct(r)||it(t)||(o?at(r):null)||"utf-8",s;try{s=new TextDecoder(n)}catch{s=new TextDecoder("utf-8")}return s.decode(r)}function Re(e,t){return`${e.split(";")[0].trim()||t}; charset=utf-8`}var ut=new RegExp("[\u2028\u2029]","g"),lt=new Set(["content-security-policy","content-security-policy-report-only","x-webkit-csp","x-content-security-policy","x-frame-options","x-xss-protection","strict-transport-security","expect-ct","public-key-pins","cross-origin-opener-policy","cross-origin-opener-policy-report-only","cross-origin-embedder-policy","cross-origin-embedder-policy-report-only","cross-origin-resource-policy","origin-agent-cluster","document-policy","clear-site-data","service-worker-allowed","report-to","reporting-endpoints","nel","alt-svc","set-cookie","set-cookie2","content-encoding","content-length","transfer-encoding","connection","keep-alive","trailer"]),ft=new Set([101,103,204,205,304]),z=new Set(["document","iframe","frame","embed","object"]);function pt(e){return e.split(";")[0].trim().toLowerCase()}function dt(e){return/^(?:text|application)\/(?:x-)?(?:javascript|ecmascript)$/.test(e)||e==="text/jscript"||e==="application/x-javascript"}function mt(e,t){let o=t==="text/html"||t==="application/xhtml+xml",r=dt(t)||t===""||t==="text/plain"||t==="application/octet-stream";if(z.has(e))return o||t===""?"html":null;switch(e){case"script":case"audioworklet":case"paintworklet":return r?"js":null;case"worker":case"sharedworker":return r?"worker":null;case"style":return t==="text/css"||t===""||t==="text/plain"?"css":null;case"manifest":return"manifest";default:return null}}function ht(e,t,o){return e.replace(/<([^>]*)>/g,(r,n)=>`<${o.rewriteUrl(n,t)}>`)}function gt(e,t,o){let r=new Headers;for(let[n,s]of e){let c=n.toLowerCase();if(!lt.has(c))try{switch(c){case"location":case"content-location":r.append(n,o.rewriteUrl(s,t));break;case"refresh":r.append(n,o.refresh(s,t.href));break;case"link":r.append(n,ht(s,t,o));break;default:r.append(n,s)}}catch{}}return r}function V(e){return JSON.stringify(e).replace(/</g,"\\u003c").replace(ut,t=>"\\u"+t.charCodeAt(0).toString(16))}var Ce=e=>e.replace(/&/g,"&amp;").replace(/"/g,"&quot;");function wt(e,t){let o={url:t.href,cookies:e.documentCookies??"",transport:e.transport};return`<script data-butter>self.__butter$config=${V(e.config)};self.__butter$boot=${V(o)};<\/script>`+ke(e).map(r=>`<script src="${Ce(r)}" data-butter><\/script>`).join("")+`<script src="${Ce(e.config.client)}" data-butter><\/script>`}function ke(e){let t=e.config.transports.map(o=>o.url);return t.includes(e.transport.url)?t:[...t,e.transport.url]}function yt(e,t){let o=`self.__butter$boot=${V({transport:e.transport})};`,r=[e.config.config,...ke(e),e.config.client].map(s=>JSON.stringify(s));return t?[JSON.stringify("data:text/javascript,"+encodeURIComponent(o)),...r].map(s=>`import ${s};`).join(""):`${o}importScripts(${r.join(",")});`}function bt(e,t,o){try{let r=JSON.parse(e);for(let n of["start_url","scope","id"])typeof r[n]=="string"&&(r[n]=o.rewriteUrl(r[n],t));for(let n of["icons","screenshots","shortcuts"]){let s=r[n];if(Array.isArray(s))for(let c of s)c&&typeof c.src=="string"&&(c.src=o.rewriteUrl(c.src,t)),c&&typeof c.url=="string"&&(c.url=o.rewriteUrl(c.url,t))}return JSON.stringify(r)}catch{return e}}function xt(e,t,o,r){let{f:n}=r;switch(e){case"html":return n.html(t,{base:o.target.href,inject:wt(r,o.target)});case"js":return n.js(t);case"worker":{let s=yt(r,o.moduleWorker),c=n.js(t),i=!o.moduleWorker&&c.match(/^\s*(['"])use strict\1\s*;?/);return i?i[0]+s+c.slice(i[0].length):s+c}case"css":return n.css(t,o.target);case"manifest":return bt(t,o.target,n)}}var Rt={html:"text/html",js:"text/javascript",worker:"text/javascript",css:"text/css",manifest:"application/manifest+json"};async function Te(e,t,o,r){let n=gt(o.headers,t.target,r.f),s=ft.has(o.status)||e.method==="HEAD",c=s?null:o.body;if(!s&&o.body!=null){let f=n.get("content-type")||"",l=mt(e.destination,pt(f));if(l){let a=await new Response(o.body).arrayBuffer(),p=xe(a,f,l==="html");c=xt(l,p,t,r),n.set("content-type",Re(f,Rt[l]))}}let i=o.status>=200&&o.status<=599?o.status:502;return new Response(c,{status:i,statusText:o.statusText,headers:n})}var D=e=>e.replace(/[&<>"']/g,t=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[t]);function Ct(e){return I.is(e)?{code:e.code,message:e.message,status:e.status||502}:e instanceof Error?{code:"INTERNAL_ERROR",message:e.message,status:500}:{code:"INTERNAL_ERROR",message:String(e),status:500}}function Ae(e,t,o){let{code:r,message:n,status:s}=Ct(o),c={"X-Butter-Error-Code":r,"Cache-Control":"no-store"};if(e.mode!=="navigate"&&e.destination!=="iframe"&&e.destination!=="frame")return new Response(`butter-col: ${r}: ${n}`,{status:s,headers:{...c,"Content-Type":"text/plain; charset=utf-8"}});let i=t?D(t.href):"the requested page",f=`<!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>butter-col \xB7 ${D(r)}</title>
7
+ <style>
8
+ :root { color-scheme: light dark; --bg: #fbf8f1; --fg: #2a2418; --muted: #75694f; --accent: #e3a92b; --card: #fff; }
9
+ @media (prefers-color-scheme: dark) { :root { --bg: #17140e; --fg: #f1eadb; --muted: #a99c80; --card: #221e16; } }
10
+ body { margin: 0; min-height: 100vh; display: grid; place-items: center; background: var(--bg); color: var(--fg);
11
+ font: 16px/1.55 ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif; }
12
+ main { max-width: 34rem; margin: 1.5rem; padding: 2rem; background: var(--card); border-radius: 14px;
13
+ border-top: 5px solid var(--accent); box-shadow: 0 10px 30px rgb(0 0 0 / .08); }
14
+ h1 { margin: 0 0 .5rem; font-size: 1.35rem; }
15
+ code { font: .85em ui-monospace, SFMono-Regular, Consolas, monospace; overflow-wrap: anywhere; }
16
+ .code { color: var(--muted); font-size: .85rem; letter-spacing: .04em; }
17
+ button { margin-top: 1rem; font: inherit; padding: .5rem 1rem; border-radius: 8px; border: 0; background: var(--accent); color: #2a2418; cursor: pointer; }
18
+ </style>
19
+ </head>
20
+ <body>
21
+ <main>
22
+ <div class="code">${D(r)}</div>
23
+ <h1>butter-col couldn't load this page</h1>
24
+ <p>${D(n)}</p>
25
+ <p><code>${i}</code></p>
26
+ <button onclick="location.reload()">Try again</button>
27
+ </main>
28
+ </body>
29
+ </html>`;return new Response(f,{status:s,headers:{...c,"Content-Type":"text/html; charset=utf-8"}})}var Ee={jan:1,feb:2,mar:3,apr:4,may:5,jun:6,jul:7,aug:8,sep:9,oct:10,nov:11,dec:12};function Ue(e){return{host:e.hostname.replace(/^\[|\]$/g,"").toLowerCase(),path:e.pathname||"/",secure:e.protocol==="https:"||e.protocol==="wss:"}}function kt(e){let t,o=0,r=0,n,s,c;for(let i of e.split(/[\s,;\-/]+/)){if(!i)continue;let f=i.match(/^(\d\d?):(\d\d?):(\d\d?)/);f&&t===void 0?(t=Number(f[1]),o=Number(f[2]),r=Number(f[3])):n===void 0&&/^\d\d?$/.test(i)?n=Number(i):s===void 0&&Ee[i.slice(0,3).toLowerCase()]?s=Ee[i.slice(0,3).toLowerCase()]:c===void 0&&/^\d{2,4}$/.test(i)&&(c=Number(i))}return t===void 0||n===void 0||s===void 0||c===void 0||(c>=70&&c<=99?c+=1900:c<70&&(c+=2e3),n<1||n>31||c<1601||t>23||o>59||r>59)?null:Date.UTC(c,s-1,n,t,o,r)}function Tt(e){if(!e.startsWith("/"))return"/";let t=e.lastIndexOf("/");return t<=0?"/":e.slice(0,t)}var At=e=>/^\d+\.\d+\.\d+\.\d+$/.test(e)||e.includes(":");function ve(e,t){return e===t?!0:At(e)?!1:e.length>t.length&&e.endsWith("."+t)}function Et(e,t){return e===t?!0:e.startsWith(t)?t.endsWith("/")||e[t.length]==="/":!1}function St(e,t,o){let r=Ue(t),n=e.indexOf(";"),s=n===-1?e:e.slice(0,n),c=n===-1?"":e.slice(n),i=s.indexOf("="),f=i===-1?"":s.slice(0,i).trim(),l=i===-1?s.trim():s.slice(i+1).trim();if(!f&&!l||f.length+l.length>4096||/[\x00-\x1f\x7f]/.test(f+l))return null;let a={name:f,value:l,domain:r.host,hostOnly:!0,path:"/",secure:!1,httpOnly:!1,created:o},p,b,m,g;for(let w of c.split(";").slice(1)){let x=w.indexOf("="),C=(x===-1?w:w.slice(0,x)).trim().toLowerCase(),k=x===-1?"":w.slice(x+1).trim();C==="expires"?b=kt(k)??b:C==="max-age"&&/^-?\d+$/.test(k)?p=Number(k):C==="domain"&&k?m=k.replace(/^\./,"").toLowerCase():C==="path"&&k.startsWith("/")?g=k:C==="secure"?a.secure=!0:C==="httponly"?a.httpOnly=!0:C==="samesite"&&(a.sameSite=k.toLowerCase())}if(p!==void 0?a.expires=p<=0?0:o+p*1e3:b!==void 0&&(a.expires=b),m){if(!ve(r.host,m)||m!==r.host&&!m.includes("."))return null;a.domain=m,a.hostOnly=!1}return a.path=g??Tt(r.path),a.secure&&!r.secure||f.startsWith("__Secure-")&&!a.secure||f.startsWith("__Host-")&&!(a.secure&&a.hostOnly&&a.path==="/")?null:a}function Ut(e,t,o,r={}){if(r.fromScript&&t.httpOnly)return e;let n=[],s;for(let i of e)if(!(i.expires!==void 0&&i.expires<=o)){if(i.name===t.name&&i.domain===t.domain&&i.path===t.path){if(r.fromScript&&i.httpOnly)return e;s=i.created;continue}n.push(i)}t.created=s??o,t.expires!==void 0&&t.expires<=o||n.push(t);let c=r.max??3e3;return n.length>c&&(n.sort((i,f)=>f.created-i.created),n.length=c),n}function vt(e,t,o,r={}){let n=Ue(t);return e.filter(s=>!(s.expires!==void 0&&s.expires<=o)&&(s.hostOnly?s.domain===n.host:ve(n.host,s.domain))&&Et(n.path,s.path)&&(!s.secure||n.secure)&&!(r.forScript&&s.httpOnly)).sort((s,c)=>c.path.length-s.path.length||s.created-c.created).map(s=>s.name?`${s.name}=${s.value}`:s.value).join("; ")}var Lt="butter-col",N="kv";function Se(){return new Promise((e,t)=>{let o=indexedDB.open(Lt,1);o.onupgradeneeded=()=>o.result.createObjectStore(N),o.onsuccess=()=>e(o.result),o.onerror=()=>t(o.error)})}var O={async get(e){let t=await Se();return new Promise((o,r)=>{let n=t.transaction(N,"readonly").objectStore(N).get(e);n.onsuccess=()=>o(n.result),n.onerror=()=>r(n.error)})},async set(e,t){let o=await Se();return new Promise((r,n)=>{let s=o.transaction(N,"readwrite");s.objectStore(N).put(t,e),s.oncomplete=()=>r(),s.onerror=()=>n(s.error)})}};function Le(){let e=O.get("cookies").then(r=>r??[],()=>[]),t=Promise.resolve(),o=r=>{t=t.then(()=>O.set("cookies",r)).catch(n=>console.warn("[butter] could not save cookies",n))};return{async header(r,n){return vt(await e,r,Date.now(),n)},async store(r,n,s){e=e.then(c=>{let i=Date.now();for(let f of n){let l=St(f,r,i);l&&(c=Ut(c,l,i,s))}return o(c),c}),await e}}}function Oe(e,t){for(let m of t.transports)try{e.importScripts(new URL(m.url,e.location.href).href)}catch(g){console.error(`[butter] could not load transport "${m.name}" from ${m.url}:`,g)}let o={scope:"serviceworker",origin:e.location.origin,config:t,fetch:e.fetch.bind(e),WebSocket:e.WebSocket},r=m=>t.transports.find(g=>g.name===m),n=null,s=null;async function c(){if(n)return n;let m=await O.get("transport").catch(()=>{});return n=m&&r(m.name)?m:{name:t.defaultTransport},n}async function i(){let m=await c(),g=r(m.name)??r(t.defaultTransport)??t.transports[0];if(!g)throw new Error("butter: no transports are configured");let w=m.options!==void 0?m.options:g.options;return{transport:await Q(g.name,w,o),entry:g,options:w}}function f(){return s||(s=i(),s.catch(()=>{s=null})),s}async function l(m){if(!r(m.name))throw new Error(`Transport "${m.name}" is not offered by this deployment.`);if(!B(m.name))throw new Error(`Transport "${m.name}" failed to load.`);let g=s;n={name:m.name,options:m.options},s=null;let w=await f();return await O.set("transport",n),g?.then(x=>x.transport.destroy?.()).catch(()=>{}),p(w)}async function a(){let m=s;return n={name:t.defaultTransport},s=null,await O.set("transport",void 0),m?.then(g=>g.transport.destroy?.()).catch(()=>{}),p(await f())}let p=m=>({name:m.entry.name,url:m.entry.url,options:m.options});function b(){return t.transports.map(m=>({name:m.name,url:m.url,loaded:!!B(m.name)}))}return{active:f,select:l,reset:a,list:b,info:p}}var E=ge(self),F=he({origin:self.location.origin,prefix:E.prefix,codec:E.codec}),_e=we(self,E,F),T=Oe(self,E),_=Le();self.addEventListener("install",()=>{self.skipWaiting()});self.addEventListener("activate",e=>{e.waitUntil(self.clients.claim())});async function Ot(e){switch(e.type){case"butter:version":return{version:E.version};case"butter:get-transport":return{active:T.info(await T.active()),available:T.list()};case"butter:set-transport":return{active:await T.select({name:e.name,options:e.options})};case"butter:reset-transport":return{active:await T.reset()};case"butter:socket-cookies":{let{transport:t}=await T.active();return t.meta.cookies!=="client"?{cookie:""}:{cookie:await _.header(new URL(e.url))}}case"butter:store-cookies":{let{transport:t}=await T.active();return t.meta.cookies==="client"&&Array.isArray(e.setCookies)&&await _.store(new URL(e.url),e.setCookies.map(String)),{ok:!0}}default:throw new Error("Unknown message")}}function _t(e){if(!e||!("url"in e)||typeof e.url!="string")return!1;let t;try{t=new URL(e.url)}catch{return!1}return t.origin===self.location.origin&&!t.pathname.startsWith(E.prefix)&&F.unrewriteUrl(e.url)===e.url}self.addEventListener("message",e=>{let t=e.data;if(!t||typeof t.type!="string"||!t.type.startsWith("butter:"))return;let o=r=>(e.ports[0]??e.source)?.postMessage(r);if((t.type==="butter:set-transport"||t.type==="butter:reset-transport")&&!_t(e.source)){o({ok:!1,error:"Transports can only be changed from butter-col's own pages."});return}e.waitUntil(Ot(t).then(r=>o({ok:!0,result:r}),r=>o({ok:!1,error:String(r?.message??r)})))});self.addEventListener("fetch",e=>{let t=new URL(e.request.url);if(t.origin===self.location.origin&&t.pathname===E.transport.cookie&&e.request.method==="POST"){e.respondWith($t(e.request));return}_e.canSkip(e.request)||e.respondWith(jt(e))});async function $t(e){let{transport:t}=await T.active().catch(()=>({transport:null}));if(!t||t.meta.cookies!=="client")return fetch(e);try{let o=await e.json();return typeof o.url!="string"||typeof o.cookie!="string"||o.cookie.length>4096?new Response(null,{status:400}):(await _.store(new URL(o.url),[o.cookie],{fromScript:!0}),new Response(null,{status:204}))}catch{return new Response(null,{status:400})}}async function jt(e){let t=await _e.route(e);if(t==="passthrough")return fetch(e.request);if(t==="invalid")return new Response("butter-col: this URL could not be decoded.",{status:400,headers:{"Content-Type":"text/plain; charset=utf-8"}});try{return await Pt(e.request,t)}catch(o){return o?.name==="AbortError"?Response.error():Ae(e.request,t.target,o)}}function Wt(e,t){if(!e||!Number.isInteger(e.status)||!Array.isArray(e.headers))throw new I(Y.BAD_RESPONSE,`The "${t}" transport returned an invalid response.`);return e}async function Pt(e,t){let o=await T.active(),{transport:r}=o,n=r.meta.cookies==="client",s=z.has(e.destination),c=be(e,t,F);if(n){let a=await _.header(t.target);a&&(c.cookie=a)}let i=e.method!=="GET"&&e.method!=="HEAD",f=Wt(await r.request({url:t.target,method:e.method,headers:c,body:i?await e.arrayBuffer():null,signal:e.signal,context:{destination:e.destination,mode:e.mode,wantDocumentCookies:s&&!n}}),o.entry.name),l=null;if(n){let a=f.headers.filter(([p])=>p.toLowerCase()==="set-cookie").map(([,p])=>p);a.length&&await _.store(t.target,a),s&&(l=await _.header(t.target,{forScript:!0}))}else s&&(l=f.documentCookies??"");return Te(e,t,f,{config:E,f:F,transport:T.info(o),documentCookies:l})}})();
30
+ //# sourceMappingURL=sw.js.map