@@ -15,12 +15,13 @@ import {
1515} from "@rewriters/url" ;
1616import { rewriteJs } from "@rewriters/js" ;
1717import { ScramjetHeaders } from "@/shared/headers" ;
18- import { flagEnabled , ScramjetContext } from "@/shared" ;
18+ import { flagEnabled , HtmlRewriterHooks , ScramjetContext } from "@/shared" ;
1919import { rewriteHtml } from "@rewriters/html" ;
2020import { rewriteCss } from "@rewriters/css" ;
2121import { rewriteWorkers } from "@rewriters/worker" ;
2222import { ScramjetConfig } from "@/types" ;
2323import DomHandler from "domhandler" ;
24+ import { Tap , TapInstance } from "@/Tap" ;
2425import { sniffEncoding } from "@/shared/sniffEncoding" ;
2526
2627export interface ScramjetFetchRequest {
@@ -67,6 +68,13 @@ export class ScramjetFetchHandler extends EventTarget {
6768 public crossOriginIsolated : boolean = false ;
6869 public context : ScramjetContext ;
6970
71+ public hooks : {
72+ rewriter : {
73+ html : TapInstance < HtmlRewriterHooks > ;
74+ } ;
75+ fetch : TapInstance < FetchHooks > ;
76+ } ;
77+
7078 public fetchDataUrl : ( dataUrl : string ) => Promise < Response > ;
7179 public fetchBlobUrl : ( blobUrl : string ) => Promise < Response > ;
7280 public sendSetCookie : ( url : URL , cookie : string ) => Promise < void > ;
@@ -79,6 +87,15 @@ export class ScramjetFetchHandler extends EventTarget {
7987 this . sendSetCookie = init . sendSetCookie ;
8088 this . fetchDataUrl = init . fetchDataUrl ;
8189 this . fetchBlobUrl = init . fetchBlobUrl ;
90+ this . hooks = {
91+ rewriter : {
92+ html : Tap . create < HtmlRewriterHooks > ( ) ,
93+ } ,
94+ fetch : Tap . create < FetchHooks > ( ) ,
95+ } ;
96+ this . context . hooks = {
97+ rewriter : this . hooks . rewriter ,
98+ } ;
8299 }
83100
84101 async handleFetch (
@@ -127,22 +144,20 @@ async function doHandleFetch(
127144 redirect : "manual" ,
128145 } as BareRequestInit ;
129146
130- const req = new ScramjetRequestEvent (
147+ let reqcontext : typeof handler . hooks . fetch . request . context = {
148+ client : handler . client ,
131149 request,
132- parsed . url ,
133150 parsed,
151+ } ;
152+ let reqprops : typeof handler . hooks . fetch . request . props = {
134153 init,
135- handler . client
136- ) ;
137- handler . dispatchEvent ( req ) ;
138-
154+ url : parsed . url ,
155+ } ;
156+ await Tap . dispatch ( handler . hooks . fetch . request , reqcontext , reqprops ) ;
139157 let response : BareResponse ;
140158
141- if ( req . _response ) {
142- let resp = req . _response ;
143- if ( "then" in resp ) {
144- resp = await resp ;
145- }
159+ if ( reqprops . earlyResponse ) {
160+ let resp = reqprops . earlyResponse ;
146161 if ( "rawHeaders" in resp ) {
147162 // it's a bare response
148163 response = resp ;
@@ -151,7 +166,7 @@ async function doHandleFetch(
151166 response = BareResponse . fromNativeResponse ( resp ) ;
152167 }
153168 } else {
154- response = await handler . client . fetch ( req . url , req . init ) ;
169+ response = await handler . client . fetch ( reqprops . url , reqprops . init ) ;
155170 }
156171
157172 let responseBody : BodyType ;
@@ -210,18 +225,22 @@ async function doHandleFetch(
210225 // await cleanTracker(parsed.url.toString());
211226 // }
212227
213- const resp = new ScramjetResponseEvent ( request , parsed , {
214- body : responseBody ,
215- headers : responseHeaders ,
216- status : response . status ,
217- statusText : response . statusText ,
218- } ) ;
219- handler . dispatchEvent ( resp ) ;
228+ let respcontext : typeof handler . hooks . fetch . response . context = {
229+ request,
230+ parsed,
231+ } ;
232+ let respprops : typeof handler . hooks . fetch . response . props = {
233+ response : {
234+ body : responseBody ,
235+ headers : responseHeaders ,
236+ status : response . status ,
237+ statusText : response . statusText ,
238+ } ,
239+ } ;
220240
221- let r = resp . response ;
222- if ( resp . _response ) r = await resp . _response ;
241+ await Tap . dispatch ( handler . hooks . fetch . response , respcontext , respprops ) ;
223242
224- return r ;
243+ return respprops . response ;
225244}
226245
227246function isRedirect ( response : BareResponse ) {
@@ -698,23 +717,7 @@ async function rewriteBody(
698717 htmlContent ,
699718 handler . context ,
700719 parsed . meta ,
701- true ,
702- ( domhandler ) => {
703- const evt = new ScramjetHTMLPreRewriteEvent (
704- domhandler ,
705- request ,
706- parsed
707- ) ;
708- handler . dispatchEvent ( evt ) ;
709- } ,
710- ( domhandler ) => {
711- const evt = new ScramjetHTMLPostRewriteEvent (
712- domhandler ,
713- request ,
714- parsed
715- ) ;
716- handler . dispatchEvent ( evt ) ;
717- }
720+ true
718721 ) ;
719722 } else {
720723 return response . body ;
@@ -745,60 +748,28 @@ async function rewriteBody(
745748 }
746749}
747750
748- type BodyType = string | ArrayBuffer | Blob | ReadableStream < any > ;
749-
750- export class ScramjetHTMLPreRewriteEvent extends Event {
751- constructor (
752- public handler : DomHandler ,
753- public context : ScramjetFetchRequest ,
754- public parsed : ScramjetFetchParsed
755- ) {
756- super ( "htmlPreRewrite" ) ;
757- }
758- }
759-
760- export class ScramjetHTMLPostRewriteEvent extends Event {
761- constructor (
762- public handler : DomHandler ,
763- public context : ScramjetFetchRequest ,
764- public parsed : ScramjetFetchParsed
765- ) {
766- super ( "htmlPostRewrite" ) ;
767- }
768- }
769-
770- export class ScramjetResponseEvent extends Event {
771- _response ?: ScramjetFetchResponse | Promise < ScramjetFetchResponse > ;
772- constructor (
773- public context : ScramjetFetchRequest ,
774- public parsed : ScramjetFetchParsed ,
775- public response : ScramjetFetchResponse
776- ) {
777- super ( "handleResponse" ) ;
778- }
779- respondWith (
780- response : ScramjetFetchResponse | Promise < ScramjetFetchResponse >
781- ) {
782- this . _response = response ;
783- }
784- }
751+ export type FetchHooks = {
752+ request : {
753+ context : {
754+ request : ScramjetFetchRequest ;
755+ parsed : ScramjetFetchParsed ;
756+ client : BareCompatibleClient ;
757+ } ;
758+ props : {
759+ init : BareRequestInit ;
760+ url : URL ;
761+ earlyResponse ?: BareResponse ;
762+ } ;
763+ } ;
764+ response : {
765+ context : {
766+ request : ScramjetFetchRequest ;
767+ parsed : ScramjetFetchParsed ;
768+ } ;
769+ props : {
770+ response : ScramjetFetchResponse ;
771+ } ;
772+ } ;
773+ } ;
785774
786- export class ScramjetRequestEvent extends Event {
787- _response ?:
788- | BareResponse
789- | Promise < BareResponse >
790- | Response
791- | Promise < Response > ;
792- constructor (
793- public context : ScramjetFetchRequest ,
794- public url : URL ,
795- public parsed : ScramjetFetchParsed ,
796- public init : BareRequestInit ,
797- public client : BareCompatibleClient
798- ) {
799- super ( "request" ) ;
800- }
801- respondWith ( response : BareResponse | Promise < BareResponse > ) {
802- this . _response = response ;
803- }
804- }
775+ type BodyType = string | ArrayBuffer | Blob | ReadableStream < any > ;
0 commit comments