Skip to content

Commit 8c3d04a

Browse files
committed
[core] add ScramjetHTMLPreRewrite/ScramjetHTMLPostRewrite events exposing domhandler
1 parent 68c1988 commit 8c3d04a

File tree

2 files changed

+57
-6
lines changed

2 files changed

+57
-6
lines changed

src/shared/rewriters/html.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ElementType, Parser } from "htmlparser2";
1+
import { ElementType, Handler, Parser } from "htmlparser2";
22
import { ChildNode, DomHandler, Element, Comment } from "domhandler";
33
import render from "dom-serializer";
44
import { URLMeta, rewriteUrl } from "@rewriters/url";
@@ -36,13 +36,16 @@ function rewriteHtmlInner(
3636
html: string,
3737
cookieStore: CookieStore,
3838
meta: URLMeta,
39-
fromTop: boolean = false
39+
fromTop: boolean = false,
40+
preRewrite?: (handler: DomHandler) => void,
41+
postRewrite?: (handler: DomHandler) => void
4042
) {
4143
const handler = new DomHandler((err, dom) => dom);
4244
const parser = new Parser(handler);
4345

4446
parser.write(html);
4547
parser.end();
48+
if (preRewrite) preRewrite(handler);
4649
traverseParsedHtml(handler.root, cookieStore, meta);
4750

4851
function findhead(node) {
@@ -69,6 +72,8 @@ function rewriteHtmlInner(
6972
head.children.unshift(...getInjectScripts(cookieStore, script));
7073
}
7174

75+
if (postRewrite) postRewrite(handler);
76+
7277
return render(handler.root, {
7378
encodeEntities: "utf8",
7479
decodeEntities: false,
@@ -79,10 +84,19 @@ export function rewriteHtml(
7984
html: string,
8085
cookieStore: CookieStore,
8186
meta: URLMeta,
82-
fromTop: boolean = false
87+
fromTop: boolean = false,
88+
preRewrite?: (handler: DomHandler) => void,
89+
postRewrite?: (handler: DomHandler) => void
8390
) {
8491
const before = performance.now();
85-
const ret = rewriteHtmlInner(html, cookieStore, meta, fromTop);
92+
const ret = rewriteHtmlInner(
93+
html,
94+
cookieStore,
95+
meta,
96+
fromTop,
97+
preRewrite,
98+
postRewrite
99+
);
86100
dbg.time(meta, before, "html rewrite");
87101

88102
return ret;

src/worker/fetch.ts

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import { rewriteCss } from "@rewriters/css";
2929
import { rewriteWorkers } from "@rewriters/worker";
3030
import { ScramjetDownload } from "@client/events";
3131
import { ScramjetConfig } from "@/types";
32+
import DomHandler from "domhandler";
3233

3334
export interface ScramjetFetchContext {
3435
rawUrl: URL;
@@ -150,7 +151,7 @@ export async function handleFetch(
150151
// }
151152

152153
if (response.body && !isRedirect(response)) {
153-
responseBody = await rewriteBody(context, parsed, response);
154+
responseBody = await rewriteBody.call(this, context, parsed, response);
154155
}
155156

156157
// Clean up tracker if not a redirect
@@ -729,7 +730,23 @@ async function rewriteBody(
729730
await response.text(),
730731
context.cookieStore,
731732
parsed.meta,
732-
true
733+
true,
734+
(handler) => {
735+
const evt = new ScramjetHTMLPreRewriteEvent(
736+
handler,
737+
context,
738+
parsed
739+
);
740+
this.dispatchEvent(evt);
741+
},
742+
(handler) => {
743+
const evt = new ScramjetHTMLPostRewriteEvent(
744+
handler,
745+
context,
746+
parsed
747+
);
748+
this.dispatchEvent(evt);
749+
}
733750
);
734751
} else {
735752
return response.body;
@@ -760,6 +777,26 @@ async function rewriteBody(
760777

761778
type BodyType = string | ArrayBuffer | Blob | ReadableStream<any>;
762779

780+
export class ScramjetHTMLPreRewriteEvent extends Event {
781+
constructor(
782+
public handler: DomHandler,
783+
public context: ScramjetFetchContext,
784+
public parsed: ScramjetFetchParsed
785+
) {
786+
super("htmlPreRewrite");
787+
}
788+
}
789+
790+
export class ScramjetHTMLPostRewriteEvent extends Event {
791+
constructor(
792+
public handler: DomHandler,
793+
public context: ScramjetFetchContext,
794+
public parsed: ScramjetFetchParsed
795+
) {
796+
super("htmlPostRewrite");
797+
}
798+
}
799+
763800
export class ScramjetResponseEvent extends Event {
764801
_response?: ScramjetFetchResponse | Promise<ScramjetFetchResponse>;
765802
constructor(

0 commit comments

Comments
 (0)