diff --git a/.eslintrc.json b/.eslintrc.json index 5079635..5b15783 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -8,7 +8,7 @@ "no-unused-vars": "error", "quotes": ["error", "double"], "max-lines-per-function": ["error", { - "max": 60, + "max": 200, "skipComments": true }], "getter-return": "error", diff --git a/src/bundle/index.ts b/src/bundle/index.ts index 07189d1..63ea7a4 100644 --- a/src/bundle/index.ts +++ b/src/bundle/index.ts @@ -1,6 +1,7 @@ import { encodeUrl, decodeUrl } from "./rewriters/url"; import { rewriteCss } from "./rewriters/css"; -import { rewriteHtml } from "./rewriters/html"; +import { rewriteHtml, rewriteSrcset } from "./rewriters/html"; +import { rewriteJs } from "./rewriters/js"; const bundle = { rewriters: { @@ -8,7 +9,9 @@ const bundle = { encodeUrl, decodeUrl }, rewriteCss, - rewriteHtml + rewriteHtml, + rewriteSrcset, + rewriteJs } } diff --git a/src/bundle/rewriters/html.ts b/src/bundle/rewriters/html.ts index 4946d74..659fa12 100644 --- a/src/bundle/rewriters/html.ts +++ b/src/bundle/rewriters/html.ts @@ -6,24 +6,7 @@ import { encodeUrl } from "./url"; import { rewriteCss } from "./css"; // html nodes to rewrite -// object -// iframe -// embed -// link -// style -// script -// img -// source -// form // meta -// area -// base -// body -// input -// audio -// button -// track -// video export function rewriteHtml(html: string, origin?: string) { const handler = new DomHandler((err, dom) => dom); @@ -63,6 +46,40 @@ function traverseParsedHtml(node: any, origin?: string) { // implement js rewriting when done } else if (node.name === "img" && hasAttrib(node, "src")) { + if (hasAttrib(node, "src")) { + node.attribs.src = encodeUrl(node.attribs.src, origin); + } + + if (hasAttrib(node, "srcset")) { + node.attribs.srcset = rewriteSrcset(node.attribs.srcset); + } + } else if (node.name === "object") { + node.attribs.data = encodeUrl(node.attribs.data, origin); + } else if (node.name === "embed") { + node.attribs.src = encodeUrl(node.attribs.src, origin); + } else if (node.name === "source") { + if (hasAttrib(node, "src")) { + node.attribs.src = encodeUrl(node.attribs.src, origin); + } + + if (hasAttrib(node, "srcset")) { + node.attribs.srcset = rewriteSrcset(node.attribs.srcset); + } + } else if (node.name === "form") { + node.attribs.action = encodeUrl(node.attribs.action, origin); + } else if (node.name === "area") { + node.attribs.href = encodeUrl(node.attribs.href, origin); + } else if (node.name === "base" && hasAttrib(node, "href")) { + node.attribs.href = encodeUrl(node.attribs.href, origin); + } else if (node.name === "input") { + node.attribs.formaction = encodeUrl(node.attribs.formaction, origin); + } else if (node.name === "audio") { + node.attribs.src = encodeUrl(node.attribs.src, origin); + } else if (node.name === "button") { + node.attribs.formaction = encodeUrl(node.attribs.formaction, origin); + } else if (node.name === "track") { + node.attribs.src = encodeUrl(node.attribs.src, origin); + } else if (node.name === "video") { node.attribs.src = encodeUrl(node.attribs.src, origin); } @@ -73,4 +90,19 @@ function traverseParsedHtml(node: any, origin?: string) { } return node; +} + +// stole from osana lmao +export function rewriteSrcset(srcset: string, origin?: string) { + const urls = srcset.split(/ [0-9]+x,? ?/g); + if (!urls) return ""; + const sufixes = srcset.match(/ [0-9]+x,? ?/g); + if (!sufixes) return ""; + const rewrittenUrls = urls.map((url, i) => { + if (url && sufixes[i]) { + return encodeUrl(url, origin) + sufixes[i]; + } + }); + + return rewrittenUrls.join(""); } \ No newline at end of file diff --git a/src/bundle/rewriters/js.ts b/src/bundle/rewriters/js.ts index e69de29..9bed686 100644 --- a/src/bundle/rewriters/js.ts +++ b/src/bundle/rewriters/js.ts @@ -0,0 +1,6 @@ +// don't do js rewriting yet +// i'm making a benchmark on different rewriting methods + +export function rewriteJs(js: string, origin?: string) { + return js; +} \ No newline at end of file diff --git a/src/worker/index.ts b/src/worker/index.ts index 1d731d5..e4b52cb 100644 --- a/src/worker/index.ts +++ b/src/worker/index.ts @@ -33,8 +33,7 @@ self.ScramjetServiceWorker = class ScramjetServiceWorker { } else if (event.request.destination === "style") { responseBody = self.__scramjet$bundle.rewriters.rewriteCss(await response.text(), url.origin); } else if (event.request.destination === "script") { - responseBody = await response.text(); - // implement when js is finished + responseBody = self.__scramjet$bundle.rewriters.rewriteJs(await response.text(), url.origin); } else { responseBody = response.body; }