1- class SandboxThing {
2- counter = 0 ;
3- promises = new Map ( ) ;
1+ importScripts ( "./controller.sw.js" ) ;
42
5- async find ( ) {
6- let swclients = await clients . matchAll ( { includeUncontrolled : true } ) ;
7- for ( const client of swclients ) {
8- if ( new URL ( client . url ) . pathname . startsWith ( "/controller" ) ) {
9- return client ;
10- }
11- }
12- return null ;
3+ addEventListener ( "fetch" , ( event ) => {
4+ if ( shouldRoute ( event ) ) {
5+ event . respondWith ( route ( event ) ) ;
136 }
14-
15- async request ( domain , message , transfer ) {
16- let controller = await this . find ( ) ;
17- if ( ! controller ) throw new Error ( "couldn't find controller" ) ;
18- return new Promise ( ( resolve , reject ) => {
19- this . promises . set ( this . counter , { resolve, reject } ) ;
20- controller . postMessage (
21- {
22- $sandboxsw$type : "request" ,
23- $sandboxsw$token : this . counter ++ ,
24- $sandboxsw$domain : domain ,
25- $sandboxsw$message : message ,
26- } ,
27- transfer
28- ) ;
29- } ) ;
30- }
31-
32- handleMessage ( token , message , error ) {
33- if ( this . promises . has ( token ) ) {
34- let { resolve, reject } = this . promises . get ( token ) ;
35- this . promises . delete ( token ) ;
36- if ( error ) {
37- reject ( error ) ;
38- } else {
39- resolve ( message ) ;
40- }
41- }
42- }
43- }
44-
45- let sb = new SandboxThing ( ) ;
46-
47- async function handleFetch ( event ) {
48- const client = await self . clients . get ( event . clientId ) ;
49-
50- let resp = await sb . request (
51- "fetch" ,
52- {
53- rawUrl : event . request . url ,
54- destination : event . request . destination ,
55- mode : event . request . mode ,
56- referrer : event . request . referrer ,
57- method : event . request . method ,
58- body : event . request . body ,
59- cache : event . request . cache ,
60- forceCrossOriginIsolated : false ,
61- initialHeaders : Object . fromEntries ( [ ...event . request . headers . entries ( ) ] ) ,
62- rawClientUrl : client ? client . url : undefined ,
63- } ,
64- event . request . body instanceof ReadableStream ||
65- event . request . body instanceof ArrayBuffer
66- ? [ event . request . body ]
67- : undefined
68- ) ;
69-
70- return new Response ( resp . body , {
71- status : resp . status ,
72- statusText : resp . statusText ,
73- headers : resp . headers ,
74- } ) ;
75- }
76-
77- self . addEventListener ( "fetch" , ( event ) => {
78- let url = new URL ( event . request . url ) ;
79- if ( url . origin == location . origin && url . pathname . startsWith ( "/controller" ) ) {
80- return ;
81- }
82- event . respondWith (
83- ( async ( ) => {
84- try {
85- return await handleFetch ( event ) ;
86- } catch ( e ) {
87- console . error ( e ) ;
88- return new Response ( "SandboxSW Error: " + e + e . stack , {
89- status : 500 ,
90- } ) ;
91- }
92- } ) ( )
93- ) ;
947} ) ;
958
969self . addEventListener ( "install" , ( ) => {
@@ -102,18 +15,3 @@ self.addEventListener("activate", (e) => {
10215} ) ;
10316
10417console . log ( "sw initialized" ) ;
105- self . addEventListener ( "message" , ( e ) => {
106- let data = e . data ;
107- if ( ! ( "$sandboxsw$type" in data ) ) return ;
108- if ( data . $sandboxsw$type === "wake" ) {
109- e . source . postMessage ( {
110- $sandboxsw$type : "confirm" ,
111- } ) ;
112- } else if ( data . $sandboxsw$type === "response" ) {
113- sb . handleMessage (
114- data . $sandboxsw$token ,
115- data . $sandboxsw$message ,
116- data . $sandboxsw$error
117- ) ;
118- }
119- } ) ;
0 commit comments