@mercuryworkshop/proxy-bootstrap 0.0.1
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.
- package/dist/.downloads/controller/package/dist/controller.api.js +44 -0
- package/dist/.downloads/controller/package/dist/controller.api.js.map +1 -0
- package/dist/.downloads/controller/package/dist/controller.inject.js +2 -0
- package/dist/.downloads/controller/package/dist/controller.inject.js.map +1 -0
- package/dist/.downloads/controller/package/dist/controller.sw.js +2 -0
- package/dist/.downloads/controller/package/dist/controller.sw.js.map +1 -0
- package/dist/.downloads/controller/package/dist/types/cache.d.ts +39 -0
- package/dist/.downloads/controller/package/dist/types/index.d.ts +74 -0
- package/dist/.downloads/controller/package/dist/types/inject.d.ts +16 -0
- package/dist/.downloads/controller/package/dist/types/sw.d.ts +2 -0
- package/dist/.downloads/controller/package/dist/types/symbols.d.ts +1 -0
- package/dist/.downloads/controller/package/dist/types/typesEntry.d.ts +5 -0
- package/dist/.downloads/controller/package/package.json +16 -0
- package/dist/.downloads/controller/package/src/cache.ts +473 -0
- package/dist/.downloads/controller/package/src/index.ts +809 -0
- package/dist/.downloads/controller/package/src/inject.ts +370 -0
- package/dist/.downloads/controller/package/src/sw.ts +231 -0
- package/dist/.downloads/controller/package/src/symbols.ts +1 -0
- package/dist/.downloads/controller/package/src/types.d.ts +139 -0
- package/dist/.downloads/controller/package/src/typesEntry.ts +6 -0
- package/dist/.downloads/controller/package/tsconfig.json +24 -0
- package/dist/.downloads/controller/package/tsconfig.types.json +16 -0
- package/dist/.downloads/libcurl-transport/package/LICENSE +661 -0
- package/dist/.downloads/libcurl-transport/package/README.md +52 -0
- package/dist/.downloads/libcurl-transport/package/dist/index.d.ts +25 -0
- package/dist/.downloads/libcurl-transport/package/dist/index.js +6500 -0
- package/dist/.downloads/libcurl-transport/package/dist/index.mjs +6481 -0
- package/dist/.downloads/libcurl-transport/package/package.json +37 -0
- package/dist/.downloads/scramjet/package/dist/167400cb144aab22.wasm +0 -0
- package/dist/.downloads/scramjet/package/dist/2919e49b986edf8c.wasm +0 -0
- package/dist/.downloads/scramjet/package/dist/5aed1d5e48aab205.wasm +0 -0
- package/dist/.downloads/scramjet/package/dist/882d77912a3c8e3a.wasm +0 -0
- package/dist/.downloads/scramjet/package/dist/ac6aa30297a80464.wasm +0 -0
- package/dist/.downloads/scramjet/package/dist/c10a57758af882c8.wasm +0 -0
- package/dist/.downloads/scramjet/package/dist/cfd04aaae6955b67.wasm +0 -0
- package/dist/.downloads/scramjet/package/dist/d06a90fd413b36cf.wasm +0 -0
- package/dist/.downloads/scramjet/package/dist/dda06914899a6c28.wasm +0 -0
- package/dist/.downloads/scramjet/package/dist/scramjet.js +34 -0
- package/dist/.downloads/scramjet/package/dist/scramjet.js.map +1 -0
- package/dist/.downloads/scramjet/package/dist/scramjet.mjs +34 -0
- package/dist/.downloads/scramjet/package/dist/scramjet.mjs.map +1 -0
- package/dist/.downloads/scramjet/package/dist/scramjet.wasm +0 -0
- package/dist/.downloads/scramjet/package/dist/scramjet_bundled.js +34 -0
- package/dist/.downloads/scramjet/package/dist/scramjet_bundled.js.map +1 -0
- package/dist/.downloads/scramjet/package/dist/scramjet_bundled.mjs +34 -0
- package/dist/.downloads/scramjet/package/dist/scramjet_bundled.mjs.map +1 -0
- package/dist/.downloads/scramjet/package/dist/types/Tap.d.ts +32 -0
- package/dist/.downloads/scramjet/package/dist/types/client/client.d.ts +115 -0
- package/dist/.downloads/scramjet/package/dist/types/client/entry.d.ts +5 -0
- package/dist/.downloads/scramjet/package/dist/types/client/events.d.ts +10 -0
- package/dist/.downloads/scramjet/package/dist/types/client/global.d.ts +4 -0
- package/dist/.downloads/scramjet/package/dist/types/client/helpers.d.ts +1 -0
- package/dist/.downloads/scramjet/package/dist/types/client/index.d.ts +7 -0
- package/dist/.downloads/scramjet/package/dist/types/client/location.d.ts +2 -0
- package/dist/.downloads/scramjet/package/dist/types/client/shared/eval.d.ts +3 -0
- package/dist/.downloads/scramjet/package/dist/types/client/shared/sourcemaps.d.ts +19 -0
- package/dist/.downloads/scramjet/package/dist/types/client/shared/unproxy.d.ts +19 -0
- package/dist/.downloads/scramjet/package/dist/types/client/shared/wrap.d.ts +4 -0
- package/dist/.downloads/scramjet/package/dist/types/client/singletonbox.d.ts +16 -0
- package/dist/.downloads/scramjet/package/dist/types/client/unproxy.generated.d.ts +50 -0
- package/dist/.downloads/scramjet/package/dist/types/fetch/body.d.ts +3 -0
- package/dist/.downloads/scramjet/package/dist/types/fetch/fetch.d.ts +7 -0
- package/dist/.downloads/scramjet/package/dist/types/fetch/headers.d.ts +19 -0
- package/dist/.downloads/scramjet/package/dist/types/fetch/index.d.ts +128 -0
- package/dist/.downloads/scramjet/package/dist/types/fetch/parse.d.ts +22 -0
- package/dist/.downloads/scramjet/package/dist/types/fetch/util.d.ts +7 -0
- package/dist/.downloads/scramjet/package/dist/types/index.d.ts +11 -0
- package/dist/.downloads/scramjet/package/dist/types/shared/cookie.d.ts +26 -0
- package/dist/.downloads/scramjet/package/dist/types/shared/headers.d.ts +13 -0
- package/dist/.downloads/scramjet/package/dist/types/shared/htmlRules.d.ts +6 -0
- package/dist/.downloads/scramjet/package/dist/types/shared/index.d.ts +51 -0
- package/dist/.downloads/scramjet/package/dist/types/shared/mime.d.ts +39 -0
- package/dist/.downloads/scramjet/package/dist/types/shared/refresh.d.ts +7 -0
- package/dist/.downloads/scramjet/package/dist/types/shared/rewriters/css.d.ts +4 -0
- package/dist/.downloads/scramjet/package/dist/types/shared/rewriters/html.d.ts +33 -0
- package/dist/.downloads/scramjet/package/dist/types/shared/rewriters/index.d.ts +6 -0
- package/dist/.downloads/scramjet/package/dist/types/shared/rewriters/js.d.ts +11 -0
- package/dist/.downloads/scramjet/package/dist/types/shared/rewriters/url.d.ts +25 -0
- package/dist/.downloads/scramjet/package/dist/types/shared/rewriters/wasm.d.ts +7 -0
- package/dist/.downloads/scramjet/package/dist/types/shared/rewriters/worker.d.ts +3 -0
- package/dist/.downloads/scramjet/package/dist/types/shared/set-cookie-parser.d.ts +20 -0
- package/dist/.downloads/scramjet/package/dist/types/shared/snapshot.d.ts +236 -0
- package/dist/.downloads/scramjet/package/dist/types/shared/sniffEncoding.d.ts +65 -0
- package/dist/.downloads/scramjet/package/dist/types/shared/util.d.ts +2 -0
- package/dist/.downloads/scramjet/package/dist/types/symbols.d.ts +6 -0
- package/dist/.downloads/scramjet/package/dist/types/types.d.ts +68 -0
- package/dist/.downloads/scramjet/package/lib/index.cjs +7 -0
- package/dist/.downloads/scramjet/package/lib/index.d.ts +8 -0
- package/dist/.downloads/scramjet/package/lib/types.d.ts +20 -0
- package/dist/.downloads/scramjet/package/package.json +93 -0
- package/dist/bootstrap-client.js +169 -0
- package/dist/bootstrap-client.js.map +1 -0
- package/dist/bootstrap-server.js +406 -0
- package/dist/bootstrap-server.js.map +1 -0
- package/dist/bootstrap-static.js +476 -0
- package/dist/bootstrap-static.js.map +1 -0
- package/dist/types/client.d.ts +4 -0
- package/dist/types/clientcommon.d.ts +2 -0
- package/dist/types/common.d.ts +30 -0
- package/dist/types/server.d.ts +24 -0
- package/dist/types/static.d.ts +1 -0
- package/package.json +30 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
var $scramjetController;(()=>{var e={565(e,t,r){r.d(t,{m:()=>f});var o=r(235);let s="x-sj-cached-at",a=new Set([200,203,204,206,300,301,308,404,405,410,414,501]),n=new Set([101,103,204,205,304]);function i(e){let t={};if(!e)return t;for(let r of e.split(",")){let e=r.trim();if(!e)continue;let o=e.indexOf("="),s=(-1===o?e:e.slice(0,o)).trim().toLowerCase();if(-1===o){t[s]=!0;continue}let a=e.slice(o+1).trim();if(a.startsWith('"')&&a.endsWith('"')&&(a=a.slice(1,-1)),"max-age"===s||"s-maxage"===s||"stale-while-revalidate"===s||"stale-if-error"===s){let e=parseInt(a,10);Number.isFinite(e)&&e>=0&&(t[s]=e)}else t[s]=!0}return t}function c(e){return"GET"===e||"HEAD"===e}function l(e,t){let r=new Headers;for(let[e,o]of t.toRawHeaders())try{r.append(e,o)}catch{}return new Request("https://sj-cache.invalid/"+encodeURIComponent(e),{method:"GET",headers:r})}function d(e){let t=new Headers;for(let[r,o]of e)try{t.append(r,o)}catch{}return t}async function h(e){let t=e.status,r=n.has(t),s=d(e.rawHeaders);if(r)return{replacement:o.Sr.fromNativeResponse(new Response(null,{status:t,statusText:e.statusText,headers:s})),bodyBuffer:null};let a=await e.arrayBuffer();return{replacement:o.Sr.fromNativeResponse(new Response(a,{status:t,statusText:e.statusText,headers:s})),bodyBuffer:a}}class f extends $scramjet.Plugin{cacheName;cachePromise=null;cameFromCache=new WeakMap;constructor(e={}){super("scramjet-http-cache"),this.cacheName=e.cacheName??"scramjet-http-cache-v2"}openCache(){return this.cachePromise||(this.cachePromise=caches.open(this.cacheName)),this.cachePromise}install(e){let t=e.fetchHandler.hooks.fetch;this.tap(t.request,async(e,t)=>{var r;let a,d=e.request;if(!c(d.method))return;let h=d.cache;if("no-store"===h||"reload"===h||t.earlyResponse)return;let f=await this.openCache(),u=await f.match(l(e.parsed.url.href,d.initialHeaders));if(!u)return;let p=parseInt(u.headers.get(s)??"0",10),m=i(u.headers.get("cache-control")),y=(u.headers.get("pragma")??"").toLowerCase().includes("no-cache"),g=!0===m["no-cache"]||y||"no-cache"===h,w=(()=>{let e=u.headers.get("date");if(e){let t=Date.parse(e);if(Number.isFinite(t))return t}return p||Date.now()})(),k=function(e,t,r){if(void 0!==t["s-maxage"])return t["s-maxage"];if(void 0!==t["max-age"])return t["max-age"];let o=e.get("expires");if(o){let e=Date.parse(o);if(Number.isFinite(e))return Math.max(0,(e-r)/1e3)}let s=e.get("last-modified");if(s){let e=Date.parse(s);if(Number.isFinite(e)&&e<=r)return(r-e)*.1/1e3}return null}(u.headers,m,w),j=(r=u.headers,((a=r.get("age"))&&parseInt(a,10)||0)+(Date.now()-p)/1e3),b=!0===m.immutable&&"no-cache"!==h&&"reload"!==h;if(!(!g&&null!==k&&j<k)&&!b)return;let C=function(e){let t=new Headers;for(let[r,o]of e.headers.entries())if(r.toLowerCase()!==s)try{t.append(r,o)}catch{}return t}(u);p&&C.set("age",String(Math.floor((Date.now()-p)/1e3)));let v=n.has(u.status)?null:await u.arrayBuffer(),S=o.Sr.fromNativeResponse(new Response(v,{status:u.status,statusText:u.statusText,headers:C}));this.cameFromCache.set(d,!0),t.earlyResponse=S}),this.tap(t.preresponse,async(e,t)=>{var r,o;let f,u=e.request;if(this.cameFromCache.has(u))return void this.cameFromCache.delete(u);if("no-store"===u.cache||!c(u.method))return;let p=d(t.response.rawHeaders);if(!function(e,t,r){if(!c(r)||!a.has(e)||i(t.get("cache-control"))["no-store"])return!1;let o=t.get("vary");return!(o&&o.split(",").some(e=>"*"===e.trim()))}(t.response.status,p,u.method))return;let{replacement:m,bodyBuffer:y}=await h(t.response);t.response=m;let g=l(e.parsed.url.href,u.initialHeaders),w=(r=t.response.status,o=t.response.statusText,(f=d(t.response.rawHeaders)).set(s,String(Date.now())),new Response(n.has(r)?null:y,{status:r,statusText:o,headers:f}));try{let e=await this.openCache();await e.put(g,w)}catch(e){console.warn("[scramjet-http-cache] cache.put failed:",e)}})}async bust(){try{return this.cachePromise=null,await caches.delete(this.cacheName)}catch(e){return console.error("[scramjet-http-cache] bust failed:",e),!1}}}},286(e,t,r){r.d(t,{I:()=>o});let o=Symbol.for("controller frame handle")},805(e,t,r){r.d(t,{C:()=>o});class o{methods;id;sendRaw;counter=0;promiseCallbacks=new Map;constructor(e,t,r){this.methods=e,this.id=t,this.sendRaw=r}recieve(e){if(null==e||"object"!=typeof e)return;let t=e[this.id];if(null==t||"object"!=typeof t)return;let r=t.$type;if("response"===r){let e=t.$token,r=t.$data,o=t.$error,s=this.promiseCallbacks.get(e);if(!s)return;this.promiseCallbacks.delete(e),void 0!==o?s.reject(Error(o)):s.resolve(r)}else if("request"===r){let e=t.$method,r=t.$args;this.methods[e](r).then(e=>{this.sendRaw({[this.id]:{$type:"response",$token:t.$token,$data:e?.[0]}},e?.[1])}).catch(e=>{console.error(e),this.sendRaw({[this.id]:{$type:"response",$token:t.$token,$error:e?.toString()||"Unknown error"}},[])})}}call(e,t,r=[]){let o=this.counter++;return new Promise((s,a)=>{this.promiseCallbacks.set(o,{resolve:s,reject:a}),this.sendRaw({[this.id]:{$type:"request",$method:e,$args:t,$token:o}},r)})}}},986(e){let t=Object.getPrototypeOf({});function r(){return function(e){return"object"==typeof e&&null!==e&&!(e instanceof RegExp)&&!(e instanceof Date)}}function o(e){function o(e){return"constructor"!==e&&"prototype"!==e&&"__proto__"!==e}let s=Object.prototype.propertyIsEnumerable,a=e?.symbols?function(e){let t=Object.keys(e),r=Object.getOwnPropertySymbols(e);for(let o=0,a=r.length;o<a;++o)s.call(e,r[o])&&t.push(r[o]);return t}:Object.keys,n="function"==typeof e?.cloneProtoObject?e.cloneProtoObject:void 0,i="function"==typeof e?.isMergeableObject?e.isMergeableObject:r(),c=e?.onlyDefinedProperties===!0,l=e&&"function"==typeof e.mergeArray?e.mergeArray({clone:d,deepmerge:h,getKeys:a,isMergeableObject:i}):function(e,t){let r=e.length,o=t.length,s=0,a=Array(r+o);for(;s<r;++s)a[s]=d(e[s]);for(s=0;s<o;++s)a[s+r]=d(t[s]);return a};function d(e){return i(e)?Array.isArray(e)?function(e){let t=0,r=e.length,o=Array(r);for(;t<r;++t)o[t]=d(e[t]);return o}(e):function(e){let r,s,i,c={};if(n&&Object.getPrototypeOf(e)!==t)return n(e);let l=a(e);for(r=0,s=l.length;r<s;++r)o(i=l[r])&&(c[i]=d(e[i]));return c}(e):e}function h(e,r){if(c&&void 0===r)return d(e);let s=Array.isArray(r),f=Array.isArray(e);return"object"!=typeof r||null===r?r:i(e)?s&&f?l(e,r):s!==f?d(r):function(e,r){let s,l,f,u={},p=a(e),m=a(r);for(s=0,l=p.length;s<l;++s)o(f=p[s])&&-1===m.indexOf(f)&&(u[f]=d(e[f]));for(s=0,l=m.length;s<l;++s)if(o(f=m[s]))if(f in e)-1!==p.indexOf(f)&&(n&&i(r[f])&&Object.getPrototypeOf(r[f])!==t?u[f]=n(r[f]):u[f]=h(e[f],r[f]));else{if(c&&void 0===r[f])continue;u[f]=d(r[f])}return u}(e,r):d(r)}return e?.all?function(){let e;switch(arguments.length){case 0:return{};case 1:return d(arguments[0]);case 2:return h(arguments[0],arguments[1])}for(let t=0,r=arguments.length;t<r;++t)e=h(e,arguments[t]);return e}:h}e.exports=o,e.exports.default=o,e.exports.deepmerge=o,Object.defineProperty(e.exports,"isMergeableObject",{get:r})},235(e,t,r){r.d(t,{Sr:()=>s}),WebSocket.CLOSED,WebSocket.CONNECTING,WebSocket.OPEN,EventTarget;let o=[101,204,205,304];class s extends Response{url;rawHeaders;redirected=!1;static fromTransferrableResponse(e,t){let r=new Headers;for(let[t,o]of e.headers)try{r.append(t,o)}catch{}let a=new s(o.includes(e.status)?void 0:e.body,{status:e.status,statusText:e.statusText});for(let[e,t]of r.entries())a.headers.append(e,t);return a.url=t,a.redirected=e.status>=300&&e.status<400&&void 0!==e.headers.location,a.rawHeaders=e.headers,a}static fromNativeResponse(e){let t=new s(o.includes(e.status)?void 0:e.body,{headers:e.headers,status:e.status,statusText:e.statusText});return t.url=e.url,t.rawHeaders=[...e.headers],t.redirected=e.redirected,t}}}},t={};function r(o){var s=t[o];if(void 0!==s)return s.exports;var a=t[o]={exports:{}};return e[o](a,a.exports,r),a.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var o={};(()=>{r.r(o),r.d(o,{Controller:()=>j,Frame:()=>b,HttpCachePlugin:()=>n.m,config:()=>i});var e=r(805),t=r(235),s=r(986),a=r(286),n=r(565);let i={prefix:"/~/sj/",scramjetPath:"/scramjet/scramjet.js",injectPath:"/controller/controller.inject.js",wasmPath:"/scramjet/scramjet.wasm",virtualWasmPath:"scramjet.wasm.js",codec:{encode:e=>e?encodeURIComponent(e):e,decode:e=>e?decodeURIComponent(e):e}},c={flags:{...$scramjet.defaultConfig.flags,allowFailedIntercepts:!0},maskedfiles:["inject.js","scramjet.wasm.js"]},l="state",d="cookies",h=null;function f(e){return"object"==typeof e&&null!==e&&"number"==typeof e.updatedAt&&Number.isFinite(e.updatedAt)&&"string"==typeof e.cookies?e:null}function u(e){return new Promise((t,r)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>r(e.error??Error("IndexedDB request failed"))})}function p(e){return new Promise((t,r)=>{e.oncomplete=()=>t(),e.onabort=()=>r(e.error??Error("IndexedDB transaction aborted")),e.onerror=()=>r(e.error??Error("IndexedDB transaction failed"))})}function m(){return h||(h=new Promise((e,t)=>{let r=indexedDB.open("__scramjet_controller",1);r.onupgradeneeded=()=>{let e=r.result;e.objectStoreNames.contains(l)||e.createObjectStore(l)},r.onsuccess=()=>e(r.result),r.onerror=()=>t(r.error??Error("Failed to open cookie database"))}))}async function y(){try{let e=(await m()).transaction(l,"readonly"),t=e.objectStore(l),r=await u(t.get(d));return await p(e),f(r)}catch(e){return console.error("Failed to read persisted controller cookies:",e),null}}async function g(e,t){try{let r=(await m()).transaction(l,"readwrite"),o=r.objectStore(l),s=f(await u(o.get(d))),a=Math.max(Date.now(),t+1,(s?.updatedAt??0)+1);return o.put({updatedAt:a,cookies:e},d),await p(r),a}catch(e){return console.error("Failed to persist controller cookies:",e),t}}function w(){return Math.random().toString(36).substring(2,10)}let k=(0,s.deepmerge)();class j{init;id;config;scramjetConfig;prefix;cookieJar=new $scramjet.CookieJar;frames=[];serviceWorkerController;guardServiceWorkerRevive=!0;ready;readyResolve;isReady=!1;rpc;port=null;transport;cookieUpdatedAt=0;cookieSyncPromise=null;cookieSyncDirty=!0;cookieSyncChannel=new BroadcastChannel("__scramjet_controller_channel");wasmAlreadyFetched=!1;wasmPayload=null;onTabChannelMessage=e=>{this.rpc.recieve(e.data)};onCookieSyncMessage=e=>{let t="object"==typeof e.data&&null!==e.data?e.data.updatedAt:void 0;"number"!=typeof t||t<=this.cookieUpdatedAt||(this.cookieSyncDirty=!0,this.loadSavedCookies())};async loadScramjetWasm(){if(this.wasmAlreadyFetched)return;let e=await fetch(this.config.wasmPath);$scramjet.setWasm(await e.arrayBuffer()),this.wasmAlreadyFetched=!0}methods={ready:async()=>{this.readyResolve(),setTimeout(()=>{this.guardServiceWorkerRevive=!1},5e3)},request:async e=>{let t=new URL(e.rawUrl).pathname,r=this.frames.find(e=>t.startsWith(e.prefix));if(!r)throw Error("No frame found for request");try{if(await this.loadSavedCookies(),t===r.prefix+this.config.virtualWasmPath){if(!this.wasmPayload){let e=await fetch(this.config.wasmPath),t=await e.arrayBuffer(),r=btoa(new Uint8Array(t).reduce((e,t)=>(e.push(String.fromCharCode(t)),e),[]).join(""));this.wasmPayload=`self.WASM = '${r}';`}return[{body:this.wasmPayload,status:200,statusText:"OK",headers:[["Content-Type","application/javascript"]]},[]]}let o=$scramjet.ScramjetHeaders.fromRawHeaders(e.initialHeaders),s=await r.fetchHandler.handleFetch({initialHeaders:o,rawClientUrl:e.rawClientUrl?new URL(e.rawClientUrl):void 0,rawUrl:new URL(e.rawUrl),rawReferrer:e.rawReferrer,rawDestination:e.destination,method:e.method,mode:e.mode,referrer:e.referrer,body:e.body,cache:e.cache,clientId:e.clientId});return[{body:s.body,status:s.status,statusText:s.statusText,headers:s.headers.toRawHeaders()},s.body instanceof ReadableStream||s.body instanceof ArrayBuffer?[s.body]:[]]}catch(o){let t={setResponse:void 0,suppressError:!1};if(await $scramjet.Tap.dispatch(r.hooks.error.request,{rawrequest:e},t),t.suppressError||console.error("Error in controller request handler:",o),t.setResponse)return[t.setResponse,[]];throw o}},initRemoteTransport:async t=>{let r=new e.C({request:async({remote:e,method:t,body:r,headers:o})=>{let s=await this.transport.request(new URL(e),t,r,o,void 0);return[s,[s.body]]},sendSetCookie:async({cookies:e,options:t})=>{await this.loadSavedCookies(!0),t?.clear&&this.cookieJar.clear(),this.applyCookieSyncEntries(e),await this.persistCookies(),await this.propagateCookieSync(e,t)},connect:async({url:e,protocols:t,requestHeaders:r,port:o})=>{let s,a=new Promise(e=>s=e),[n,i]=this.transport.connect(new URL(e),t,r,(e,t)=>{s({result:"success",protocol:e,extensions:t})},e=>{o.postMessage({type:"data",data:e},e instanceof ArrayBuffer?[e]:[])},(e,t)=>{o.postMessage({type:"close",code:e,reason:t})},e=>{s({result:"failure",error:e})});return o.onmessageerror=e=>{console.error("Transport port messageerror (this should never happen!)",e)},o.onmessage=({data:e})=>{"data"===e.type?n(e.data):"close"===e.type&&i(e.code,e.reason)},[await a,[]]}},"transport",(e,r)=>t.postMessage(e,r));t.onmessageerror=e=>{console.error("Transport port messageerror (this should never happen!)",e)},t.onmessage=e=>{r.recieve(e.data)},r.call("ready",void 0,[])}};constructor(t){this.init=t,this.id=w(),this.config=k(i,t.config||{}),this.scramjetConfig=k(c,$scramjet.defaultConfig),this.scramjetConfig=k(this.scramjetConfig,t.scramjetConfig||{}),this.prefix=this.config.prefix+this.id+"/",this.serviceWorkerController=t.serviceworker,this.ready=Promise.all([new Promise(e=>{this.readyResolve=e}),this.loadScramjetWasm(),this.loadSavedCookies(!0)]).then(()=>void 0),this.rpc=new e.C(this.methods,"tabchannel-"+this.id,(e,t)=>{if(!this.port)throw Error("Port not found");this.port.postMessage(e,t)}),this.transport=t.transport,this.cookieSyncChannel.addEventListener("message",this.onCookieSyncMessage),this.setupMessagePort(),navigator.serviceWorker.addEventListener("message",e=>{if(e.data?.$controller$setCookie&&"object"==typeof e.data.$controller$setCookie){let t=e.data.$controller$setCookie;t.options?.clear&&this.cookieJar.clear(),this.applyCookieSyncEntries(t.cookies),"string"==typeof t.id&&this.serviceWorkerController.postMessage({$sw$setCookieDone:{id:t.id}});return}if(e.data.$controller$swrevive){if(this.guardServiceWorkerRevive)return;this.setupMessagePort()}})}setupMessagePort(){if(this.port){this.port.removeEventListener("message",this.onTabChannelMessage);try{this.port.close()}catch{}this.port=null}let e=new MessageChannel;this.port=e.port1,this.port.addEventListener("message",this.onTabChannelMessage),this.port.start(),this.serviceWorkerController.postMessage({$controller$init:{prefix:this.prefix,id:this.id}},[e.port2])}applyCookieSyncEntries(e){if(Array.isArray(e))for(let t of e)"string"==typeof t?.url&&"string"==typeof t.cookie&&this.cookieJar.setCookies(t.cookie,new URL(t.url))}async propagateCookieSync(e,t={}){this.port&&await this.rpc.call("sendSetCookie",{cookies:e,options:t})}async loadSavedCookies(e=!1){if(e||this.cookieSyncDirty)return this.cookieSyncPromise||(this.cookieSyncPromise=(async()=>{let e=await y();e&&e.updatedAt>this.cookieUpdatedAt&&(this.cookieJar.load(e.cookies),this.cookieUpdatedAt=e.updatedAt),this.cookieSyncDirty=!1})().finally(()=>{this.cookieSyncPromise=null})),this.cookieSyncPromise}async persistCookies(){let e=await g(this.cookieJar.dump(),this.cookieUpdatedAt);e<=this.cookieUpdatedAt||(this.cookieUpdatedAt=e,this.cookieSyncDirty=!1,this.cookieSyncChannel.postMessage({updatedAt:e}))}setTransport(e){for(let t of(this.transport=e,this.frames))t.controller.transport=e,t.fetchHandler.client.transport=e}createFrame(e){if(!this.ready)throw Error("Controller is not ready! Try awaiting controller.wait()");let t=new b(this,e??=document.createElement("iframe"));return this.frames.push(t),t}async wait(){await this.ready}}class b{controller;element;id;prefix;fetchHandler;hooks;get context(){return{config:this.controller.scramjetConfig,prefix:new URL(this.prefix,location.href),cookieJar:this.controller.cookieJar,interface:{getInjectScripts:function e(t,r,o,s,a,n){return(i,c,l,d)=>{var h;return[d(t.scramjetPath),d(o.href+t.virtualWasmPath),d(t.injectPath),d("data:text/javascript;charset=utf-8;base64,"+(h=`
|
|
2
|
+
document.querySelectorAll("script[scramjet-injected]").forEach(script => script.remove());
|
|
3
|
+
$scramjetController.load({
|
|
4
|
+
config: ${JSON.stringify(t)},
|
|
5
|
+
sjconfig: ${JSON.stringify(r)},
|
|
6
|
+
prefix: new URL("${o.href}"),
|
|
7
|
+
cookies: ${JSON.stringify(s.dump())},
|
|
8
|
+
yieldGetInjectScripts: ${e.toString()},
|
|
9
|
+
codecEncode: ${a.toString()},
|
|
10
|
+
codecDecode: ${n.toString()},
|
|
11
|
+
initHeaders: ${JSON.stringify(l.headers??[])},
|
|
12
|
+
history: ${JSON.stringify(l.history??[])},
|
|
13
|
+
})
|
|
14
|
+
`,btoa(new TextEncoder().encode(h).reduce((e,t)=>(e.push(String.fromCharCode(t)),e),[]).join(""))))]}}(this.controller.config,this.controller.scramjetConfig,new URL(this.prefix,location.href),this.controller.cookieJar,this.controller.config.codec.encode,this.controller.config.codec.decode),getWorkerInjectScripts:(e,t,r)=>{var o;let s="";return s+=r(this.controller.config.scramjetPath),s+=r(this.prefix+this.controller.config.virtualWasmPath),s+=r("data:text/javascript;charset=utf-8;base64,"+(o=`
|
|
15
|
+
(()=>{
|
|
16
|
+
const { ScramjetClient, CookieJar, setWasm } = $scramjet;
|
|
17
|
+
|
|
18
|
+
setWasm(Uint8Array.from(atob(self.WASM), (c) => c.charCodeAt(0)));
|
|
19
|
+
delete self.WASM;
|
|
20
|
+
|
|
21
|
+
const sjconfig = ${JSON.stringify(this.controller.scramjetConfig)};
|
|
22
|
+
const prefix = new URL("${this.prefix}", location.href);
|
|
23
|
+
|
|
24
|
+
const context = {
|
|
25
|
+
config: sjconfig,
|
|
26
|
+
prefix,
|
|
27
|
+
interface: {
|
|
28
|
+
codecEncode: ${this.controller.config.codec.encode.toString()},
|
|
29
|
+
codecDecode: ${this.controller.config.codec.decode.toString()},
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const client = new ScramjetClient(globalThis, {
|
|
34
|
+
context,
|
|
35
|
+
transport: null,
|
|
36
|
+
shouldPassthroughWebsocket: (url) => {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
client.hook();
|
|
42
|
+
})();
|
|
43
|
+
`,btoa(new TextEncoder().encode(o).reduce((e,t)=>(e.push(String.fromCharCode(t)),e),[]).join(""))))},codecEncode:this.controller.config.codec.encode,codecDecode:this.controller.config.codec.decode}}}constructor(e,r){this.controller=e,this.element=r,this.id=w(),this.prefix=this.controller.prefix+this.id+"/",this.fetchHandler=new $scramjet.ScramjetFetchHandler({crossOriginIsolated:self.crossOriginIsolated,context:this.context,transport:e.transport,async sendSetCookie(t,r){await e.persistCookies(),await e.propagateCookieSync(t.map(({url:e,cookie:t})=>({url:e.href,cookie:t})),r)},fetchBlobUrl:async e=>t.Sr.fromNativeResponse(await fetch(e)),fetchDataUrl:async e=>t.Sr.fromNativeResponse(await fetch(e))}),this.hooks={fetch:this.fetchHandler.hooks.fetch,init:$scramjet.Tap.create(),error:$scramjet.Tap.create()},r[a.I]=this}back(){this.element.contentWindow?.history.back()}forward(){this.element.contentWindow?.history.forward()}reload(){this.element.contentWindow?.location.reload()}go(e){let t=$scramjet.rewriteUrl(e,this.context,{origin:new URL(location.href),base:new URL(location.href)});this.element.src=t}}})(),$scramjetController=o})();
|
|
44
|
+
//# sourceMappingURL=controller.api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.api.js","sources":["webpack://$scramjetController/./packages/controller/src/cache.ts","webpack://$scramjetController/./packages/controller/src/symbols.ts","webpack://$scramjetController/./packages/rpc/index.ts","webpack://$scramjetController/./node_modules/.pnpm/@fastify+deepmerge@3.2.1/node_modules/@fastify/deepmerge/index.js","webpack://$scramjetController/./node_modules/.pnpm/@mercuryworkshop+proxy-transports@1.0.2/node_modules/@mercuryworkshop/proxy-transports/dist/index.mjs","webpack://$scramjetController/webpack/runtime/compat_get_default_export","webpack://$scramjetController/webpack/runtime/define_property_getters","webpack://$scramjetController/webpack/runtime/has_own_property","webpack://$scramjetController/webpack/runtime/make_namespace_object","webpack://$scramjetController/./packages/controller/src/index.ts"],"sourcesContent":["// HTTP cache plugin for ScramjetFetchHandler.\n//\n// Service-worker `fetch` ignores the browser's HTTP cache, so without this\n// every navigation re-runs the full network fetch even for unchanged\n// resources. This plugin caches the **upstream** response (the BareResponse\n// as received from the network, BEFORE rewriteResponseHeaders / rewriteBody\n// run). On a hit we hand that same untouched response to the pipeline, which\n// then re-rewrites with the current Frame's prefix.\n//\n// Storing pre-rewrite means:\n// - The cache is shared across Frames, Controllers, and page reloads --\n// one Frame's hit serves another Frame's request because the stored\n// bytes contain only the upstream's URLs, not any frame-bound prefix.\n// - Redirect Location / Content-Location and Link headers come out of\n// `rewriteResponseHeaders` correctly on each hit, because that runs\n// on the cache-derived response just like a fresh one.\n// - We don't skip the rewriter on hit; we only skip the network. That's\n// where the win actually is for service-worker proxying.\n//\n// Implementation aims for RFC 9111 (HTTP caching) compliance for a\n// PRIVATE cache (browser-local, single-user):\n//\n// - Only GET / HEAD are cached.\n// - Cacheable status codes per RFC 9110 §15.1: 200 203 204 206 300 301 308\n// 404 405 410 414 501. Other statuses pass through.\n// - `Cache-Control: no-store` and `Vary: *` opt out.\n// - Freshness:\n// 1. `Cache-Control: s-maxage` (private cache treats this same as\n// max-age),\n// 2. `Cache-Control: max-age`,\n// 3. `Expires`,\n// 4. heuristic 10% × (Date - Last-Modified) per RFC 9111 §4.2.2.\n// - `Cache-Control: no-cache` / `Pragma: no-cache` / `Cache-Control:\n// immutable` are honoured.\n// - `Vary` is honoured by storing one entry per (URL × selected-headers)\n// pair via the underlying Cache API's built-in matching.\n//\n// 304 revalidation isn't handled here yet -- stale entries fall through to\n// a full refetch. Adding it cleanly requires a hook position that lets us\n// substitute the cached body AFTER the network 304 arrives but BEFORE\n// `rewriteBody` runs, without going through `rewriteBody` again. That can\n// come later.\n\nimport type * as ScramjetGlobal from \"@mercuryworkshop/scramjet\";\nimport { BareResponse } from \"@mercuryworkshop/proxy-transports\";\ndeclare const $scramjet: typeof ScramjetGlobal;\n\nexport const CACHE_NAME = \"scramjet-http-cache-v2\";\n\n/** Header recording when this entry entered the cache (ms since epoch). */\nconst STORED_AT_HEADER = \"x-sj-cached-at\";\n\n/** Status codes RFC 9110 §15.1 marks as \"cacheable by default\". */\nconst DEFAULT_CACHEABLE_STATUSES = new Set([\n\t200, 203, 204, 206, 300, 301, 308, 404, 405, 410, 414, 501,\n]);\n\n/**\n * Statuses for which the Fetch spec forbids a body. The Response constructor\n * throws TypeError if you pair any of these with a body -- even an empty\n * string or 0-byte buffer.\n */\nconst NULL_BODY_STATUSES = new Set([101, 103, 204, 205, 304]);\n\ninterface CacheControlDirectives {\n\t\"no-store\"?: boolean;\n\t\"no-cache\"?: boolean;\n\t\"must-revalidate\"?: boolean;\n\t\"proxy-revalidate\"?: boolean;\n\tprivate?: boolean;\n\tpublic?: boolean;\n\t\"max-age\"?: number;\n\t\"s-maxage\"?: number;\n\t\"stale-while-revalidate\"?: number;\n\t\"stale-if-error\"?: number;\n\timmutable?: boolean;\n}\n\nfunction parseCacheControl(value: string | null): CacheControlDirectives {\n\tconst out: CacheControlDirectives = {};\n\tif (!value) return out;\n\tfor (const raw of value.split(\",\")) {\n\t\tconst part = raw.trim();\n\t\tif (!part) continue;\n\t\tconst eq = part.indexOf(\"=\");\n\t\tconst name = (eq === -1 ? part : part.slice(0, eq))\n\t\t\t.trim()\n\t\t\t.toLowerCase() as keyof CacheControlDirectives;\n\t\tif (eq === -1) {\n\t\t\t(out as any)[name] = true;\n\t\t\tcontinue;\n\t\t}\n\t\tlet v = part.slice(eq + 1).trim();\n\t\tif (v.startsWith('\"') && v.endsWith('\"')) v = v.slice(1, -1);\n\t\tif (\n\t\t\tname === \"max-age\" ||\n\t\t\tname === \"s-maxage\" ||\n\t\t\tname === \"stale-while-revalidate\" ||\n\t\t\tname === \"stale-if-error\"\n\t\t) {\n\t\t\tconst n = parseInt(v, 10);\n\t\t\tif (Number.isFinite(n) && n >= 0) (out as any)[name] = n;\n\t\t} else {\n\t\t\t(out as any)[name] = true;\n\t\t}\n\t}\n\treturn out;\n}\n\n/**\n * RFC 9111 §4.2.1 freshness lifetime calculation, simplified for a private\n * cache (so s-maxage is treated identically to max-age).\n */\nfunction freshnessLifetimeSeconds(\n\theaders: Headers,\n\tcc: CacheControlDirectives,\n\tdateMs: number\n): number | null {\n\tif (cc[\"s-maxage\"] !== undefined) return cc[\"s-maxage\"];\n\tif (cc[\"max-age\"] !== undefined) return cc[\"max-age\"];\n\n\tconst expires = headers.get(\"expires\");\n\tif (expires) {\n\t\tconst expMs = Date.parse(expires);\n\t\tif (Number.isFinite(expMs)) {\n\t\t\treturn Math.max(0, (expMs - dateMs) / 1000);\n\t\t}\n\t}\n\n\tconst lastModified = headers.get(\"last-modified\");\n\tif (lastModified) {\n\t\tconst lmMs = Date.parse(lastModified);\n\t\tif (Number.isFinite(lmMs) && lmMs <= dateMs) {\n\t\t\t// RFC 9111 §4.2.2 heuristic: 10% of the time since Last-Modified.\n\t\t\treturn ((dateMs - lmMs) * 0.1) / 1000;\n\t\t}\n\t}\n\n\treturn null;\n}\n\n/** Current age (seconds) of a stored response per RFC 9111 §4.2.3. */\nfunction currentAgeSeconds(headers: Headers, storedAtMs: number): number {\n\tconst ageHeader = headers.get(\"age\");\n\tconst initialAge = ageHeader ? parseInt(ageHeader, 10) || 0 : 0;\n\tconst residentTime = (Date.now() - storedAtMs) / 1000;\n\treturn initialAge + residentTime;\n}\n\nfunction isCacheableMethod(method: string): boolean {\n\treturn method === \"GET\" || method === \"HEAD\";\n}\n\n/**\n * Whether a response (status + Cache-Control + Vary) is allowed to be stored.\n * RFC 9110 §15.1 + RFC 9111 §3. `headers` is the upstream's raw response\n * headers, not yet through scramjet's response-header rewriter.\n */\nfunction responseIsStorable(\n\tstatus: number,\n\theaders: Headers,\n\tmethod: string\n): boolean {\n\tif (!isCacheableMethod(method)) return false;\n\tif (!DEFAULT_CACHEABLE_STATUSES.has(status)) return false;\n\n\tconst cc = parseCacheControl(headers.get(\"cache-control\"));\n\tif (cc[\"no-store\"]) return false;\n\n\t// \"Vary: *\" means \"never reusable\".\n\tconst vary = headers.get(\"vary\");\n\tif (vary && vary.split(\",\").some((v) => v.trim() === \"*\")) return false;\n\n\treturn true;\n}\n\n/** Build a synthetic cache-key Request keyed by the *underlying* URL. */\nfunction buildCacheKeyRequest(\n\tparsedUrl: string,\n\theaders: ScramjetGlobal.ScramjetHeaders\n): Request {\n\tconst native = new Headers();\n\tfor (const [k, v] of headers.toRawHeaders()) {\n\t\ttry {\n\t\t\tnative.append(k, v);\n\t\t} catch {}\n\t}\n\tconst cacheKeyUrl =\n\t\t\"https://sj-cache.invalid/\" + encodeURIComponent(parsedUrl);\n\treturn new Request(cacheKeyUrl, { method: \"GET\", headers: native });\n}\n\n/** Rebuild a Headers object from the BareResponse's rawHeaders array. */\nfunction nativeHeadersFromRaw(\n\traw: ReadonlyArray<readonly [string, string]>\n): Headers {\n\tconst h = new Headers();\n\tfor (const [k, v] of raw) {\n\t\ttry {\n\t\t\th.append(k, v);\n\t\t} catch {\n\t\t\t// some upstream headers (e.g. malformed Set-Cookie) are rejected\n\t\t\t// by the native Headers; just drop them.\n\t\t}\n\t}\n\treturn h;\n}\n\n/** Strip our internal bookkeeping from a stored Response's headers. */\nfunction strippedHeadersFromStored(stored: Response): Headers {\n\tconst out = new Headers();\n\tfor (const [k, v] of stored.headers.entries()) {\n\t\tif (k.toLowerCase() === STORED_AT_HEADER) continue;\n\t\ttry {\n\t\t\tout.append(k, v);\n\t\t} catch {}\n\t}\n\treturn out;\n}\n\n/**\n * Turn an upstream BareResponse into a BareResponse that:\n * - has the same headers/status/statusText\n * - has its body replaced with a buffered ArrayBuffer (so the pipeline can\n * read it again after we've consumed the original stream for the cache)\n * Returns the buffered bytes too so the caller can hand them off elsewhere.\n */\nasync function rebuildBareResponseWithBuffer(\n\tbare: BareResponse\n): Promise<{ replacement: BareResponse; bodyBuffer: ArrayBuffer | null }> {\n\tconst status = bare.status;\n\tconst isNullBody = NULL_BODY_STATUSES.has(status);\n\n\tconst headers = nativeHeadersFromRaw(bare.rawHeaders);\n\n\tif (isNullBody) {\n\t\treturn {\n\t\t\treplacement: BareResponse.fromNativeResponse(\n\t\t\t\tnew Response(null, {\n\t\t\t\t\tstatus,\n\t\t\t\t\tstatusText: bare.statusText,\n\t\t\t\t\theaders,\n\t\t\t\t})\n\t\t\t),\n\t\t\tbodyBuffer: null,\n\t\t};\n\t}\n\n\tconst buf = await bare.arrayBuffer();\n\treturn {\n\t\treplacement: BareResponse.fromNativeResponse(\n\t\t\tnew Response(buf, {\n\t\t\t\tstatus,\n\t\t\t\tstatusText: bare.statusText,\n\t\t\t\theaders,\n\t\t\t})\n\t\t),\n\t\tbodyBuffer: buf,\n\t};\n}\n\n/**\n * Build a `Response` to put in the Cache API. Tags it with our internal\n * STORED_AT_HEADER so freshness can be computed on later lookups.\n */\nfunction buildStorableResponse(\n\tbody: ArrayBuffer | null,\n\tstatus: number,\n\tstatusText: string,\n\trawHeaders: ReadonlyArray<readonly [string, string]>\n): Response {\n\tconst native = nativeHeadersFromRaw(rawHeaders);\n\tnative.set(STORED_AT_HEADER, String(Date.now()));\n\treturn new Response(NULL_BODY_STATUSES.has(status) ? null : body, {\n\t\tstatus,\n\t\tstatusText,\n\t\theaders: native,\n\t});\n}\n\nexport interface HttpCachePluginOptions {\n\t/** Name of the underlying Cache API entry. Defaults to CACHE_NAME. */\n\tcacheName?: string;\n}\n\n/**\n * RFC-9111-ish HTTP cache for ScramjetFetchHandler. Subclasses\n * `$scramjet.Plugin` so it composes with the same hook plumbing every other\n * scramjet plugin uses; `install(target)` wires it onto a Frame (or any\n * object exposing a `fetchHandler`), and `bust()` drops the underlying\n * `caches` entry.\n *\n * One instance can be installed onto multiple Frames -- the WeakMap of\n * \"did this request come from cache?\" book-keeping is per-instance, not\n * per-Frame, so nothing leaks across installs.\n */\nexport class HttpCachePlugin extends $scramjet.Plugin {\n\treadonly cacheName: string;\n\n\tprivate cachePromise: Promise<Cache> | null = null;\n\t// Marks requests whose `earlyResponse` we sourced from the cache, so the\n\t// preresponse hook below knows not to re-store them. WeakMap keys are\n\t// the request objects so entries clean themselves up automatically.\n\tprivate cameFromCache = new WeakMap<\n\t\tScramjetGlobal.ScramjetFetchRequest,\n\t\ttrue\n\t>();\n\n\tconstructor(options: HttpCachePluginOptions = {}) {\n\t\tsuper(\"scramjet-http-cache\");\n\t\tthis.cacheName = options.cacheName ?? CACHE_NAME;\n\t}\n\n\t/** Lazy-open the underlying Cache. Memoized for the plugin's lifetime. */\n\tprivate openCache(): Promise<Cache> {\n\t\tif (!this.cachePromise) {\n\t\t\tthis.cachePromise = caches.open(this.cacheName);\n\t\t}\n\t\treturn this.cachePromise;\n\t}\n\n\t/**\n\t * Wire the cache up to a Frame (or anything exposing `fetchHandler`).\n\t * Safe to call multiple times across different Frames.\n\t */\n\tinstall(target: { fetchHandler: ScramjetGlobal.ScramjetFetchHandler }): void {\n\t\tconst hooks = target.fetchHandler.hooks.fetch;\n\n\t\t// ----- request: cache lookup --------------------------------------\n\t\tthis.tap(hooks.request, async (ctx, props) => {\n\t\t\tconst req = ctx.request;\n\t\t\tif (!isCacheableMethod(req.method)) return;\n\t\t\tconst reqCache = req.cache as string;\n\t\t\t// Honour the request's own cache mode where it asks for fresh data.\n\t\t\tif (reqCache === \"no-store\" || reqCache === \"reload\") return;\n\t\t\t// Don't undo an earlyResponse another plugin already set.\n\t\t\tif (props.earlyResponse) return;\n\n\t\t\tconst cache = await this.openCache();\n\t\t\tconst stored = await cache.match(\n\t\t\t\tbuildCacheKeyRequest(ctx.parsed.url.href, req.initialHeaders)\n\t\t\t);\n\t\t\tif (!stored) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst storedAt = parseInt(\n\t\t\t\tstored.headers.get(STORED_AT_HEADER) ?? \"0\",\n\t\t\t\t10\n\t\t\t);\n\t\t\tconst cc = parseCacheControl(stored.headers.get(\"cache-control\"));\n\n\t\t\tconst pragmaNoCache = (stored.headers.get(\"pragma\") ?? \"\")\n\t\t\t\t.toLowerCase()\n\t\t\t\t.includes(\"no-cache\");\n\t\t\tconst mustRevalidateBeforeUse =\n\t\t\t\tcc[\"no-cache\"] === true || pragmaNoCache || reqCache === \"no-cache\";\n\n\t\t\tconst dateMs = (() => {\n\t\t\t\tconst d = stored.headers.get(\"date\");\n\t\t\t\tif (d) {\n\t\t\t\t\tconst v = Date.parse(d);\n\t\t\t\t\tif (Number.isFinite(v)) return v;\n\t\t\t\t}\n\t\t\t\treturn storedAt || Date.now();\n\t\t\t})();\n\n\t\t\tconst lifetime = freshnessLifetimeSeconds(stored.headers, cc, dateMs);\n\t\t\tconst age = currentAgeSeconds(stored.headers, storedAt);\n\t\t\tconst fresh =\n\t\t\t\t!mustRevalidateBeforeUse && lifetime !== null && age < lifetime;\n\n\t\t\t// `immutable` short-circuits the freshness check (RFC 8246)\n\t\t\t// provided the client hasn't asked for a forced revalidation.\n\t\t\tconst immutable =\n\t\t\t\tcc.immutable === true &&\n\t\t\t\treqCache !== \"no-cache\" &&\n\t\t\t\treqCache !== \"reload\";\n\n\t\t\tif (!fresh && !immutable) {\n\t\t\t\t// Stale; fall through to the network. (TODO: 304 revalidation.)\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Build a BareResponse around the stored bytes/headers and hand\n\t\t\t// it to doNetworkFetch via earlyResponse. The pipeline will then\n\t\t\t// run rewriteResponseHeaders/rewriteBody/etc. as if we'd just\n\t\t\t// fetched it.\n\t\t\tconst headers = strippedHeadersFromStored(stored);\n\t\t\t// Recompute Age the consumer sees so it isn't stuck at storage\n\t\t\t// time.\n\t\t\tif (storedAt) {\n\t\t\t\theaders.set(\"age\", String(Math.floor((Date.now() - storedAt) / 1000)));\n\t\t\t}\n\n\t\t\tconst isNullBody = NULL_BODY_STATUSES.has(stored.status);\n\t\t\tconst earlyBody = isNullBody ? null : await stored.arrayBuffer();\n\n\t\t\tconst earlyResponse = BareResponse.fromNativeResponse(\n\t\t\t\tnew Response(earlyBody, {\n\t\t\t\t\tstatus: stored.status,\n\t\t\t\t\tstatusText: stored.statusText,\n\t\t\t\t\theaders,\n\t\t\t\t})\n\t\t\t);\n\n\t\t\tthis.cameFromCache.set(req, true);\n\t\t\tprops.earlyResponse = earlyResponse;\n\t\t});\n\n\t\t// ----- preresponse: cache store -----------------------------------\n\t\tthis.tap(hooks.preresponse, async (ctx, props) => {\n\t\t\tconst req = ctx.request;\n\t\t\t// Skip if this body came back via cache.match -- restoring it\n\t\t\t// would just rewrite the same bytes with a fresh STORED_AT_HEADER\n\t\t\t// (resetting the freshness clock).\n\t\t\tif (this.cameFromCache.has(req)) {\n\t\t\t\tthis.cameFromCache.delete(req);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ((req.cache as string) === \"no-store\") return;\n\t\t\tif (!isCacheableMethod(req.method)) return;\n\n\t\t\tconst headers = nativeHeadersFromRaw(props.response.rawHeaders);\n\t\t\tif (!responseIsStorable(props.response.status, headers, req.method))\n\t\t\t\treturn;\n\n\t\t\t// Drain the stream once and rebuild the BareResponse around the\n\t\t\t// buffered copy so the rest of doHandleFetch can still read it.\n\t\t\tconst { replacement, bodyBuffer } = await rebuildBareResponseWithBuffer(\n\t\t\t\tprops.response\n\t\t\t);\n\t\t\tprops.response = replacement;\n\n\t\t\tconst cacheKey = buildCacheKeyRequest(\n\t\t\t\tctx.parsed.url.href,\n\t\t\t\treq.initialHeaders\n\t\t\t);\n\t\t\tconst toStore = buildStorableResponse(\n\t\t\t\tbodyBuffer,\n\t\t\t\tprops.response.status,\n\t\t\t\tprops.response.statusText,\n\t\t\t\tprops.response.rawHeaders\n\t\t\t);\n\n\t\t\ttry {\n\t\t\t\tconst cache = await this.openCache();\n\t\t\t\tawait cache.put(cacheKey, toStore);\n\t\t\t} catch (err) {\n\t\t\t\t// Cache.put can fail on opaque or oddly-headered responses;\n\t\t\t\t// don't let a cache write failure break the actual fetch.\n\t\t\t\tconsole.warn(\"[scramjet-http-cache] cache.put failed:\", err);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Drop every entry in the HTTP cache. Returns whether the underlying\n\t * Cache existed and was deleted.\n\t */\n\tasync bust(): Promise<boolean> {\n\t\ttry {\n\t\t\t// Drop the memoized handle too; the next install will re-open\n\t\t\t// against a fresh empty cache.\n\t\t\tthis.cachePromise = null;\n\t\t\treturn await caches.delete(this.cacheName);\n\t\t} catch (err) {\n\t\t\tconsole.error(\"[scramjet-http-cache] bust failed:\", err);\n\t\t\treturn false;\n\t\t}\n\t}\n}\n","export const CONTROLLERFRAME = Symbol.for(\"controller frame handle\");\n","type Serverbound = {\n\tmethod1: [{ paramA: string; paramB: number }, boolean];\n\tmethod2: [string, number];\n};\n\ntype Clientbound = {\n\tmethod1: [number];\n\tmethod2: [boolean, string];\n};\n\nexport type RpcDescription = {\n\t[method: string]: [args: any, returnType: any] | [args: any] | [];\n};\n\nexport type MethodsDefinition<Description extends RpcDescription> = {\n\t[Method in keyof Description]: (\n\t\t...args: Description[Method] extends [infer A, ...any[]] ? [A] : []\n\t) => Description[Method] extends [any, infer R]\n\t\t? Promise<[R, Transferable[]]>\n\t\t: Promise<void>;\n};\n\nexport class RpcHelper<\n\tLocal extends RpcDescription,\n\tRemote extends RpcDescription,\n> {\n\tcounter: number = 0;\n\tpromiseCallbacks: Map<\n\t\tnumber,\n\t\t{ resolve: (value: any) => void; reject: (reason?: any) => void }\n\t> = new Map();\n\tconstructor(\n\t\tprivate methods: MethodsDefinition<Local>,\n\t\tprivate id: string,\n\t\tprivate sendRaw: (data: any, transfer: Transferable[]) => void\n\t) {}\n\n\trecieve(data: any) {\n\t\tif (data === undefined || data === null || typeof data !== \"object\") return;\n\t\tconst dt = data[this.id];\n\t\tif (dt === undefined || dt === null || typeof dt !== \"object\") return;\n\n\t\tconst type = dt.$type;\n\n\t\tif (type === \"response\") {\n\t\t\tconst token = dt.$token;\n\t\t\tconst data = dt.$data;\n\t\t\tconst error = dt.$error;\n\t\t\tconst cb = this.promiseCallbacks.get(token);\n\t\t\tif (!cb) return;\n\t\t\tthis.promiseCallbacks.delete(token);\n\t\t\tif (error !== undefined) {\n\t\t\t\tcb.reject(new Error(error));\n\t\t\t} else {\n\t\t\t\tcb.resolve(data);\n\t\t\t}\n\t\t} else if (type === \"request\") {\n\t\t\tconst method = dt.$method as keyof Local;\n\t\t\tconst args = dt.$args as Local[typeof method][0];\n\t\t\t(this.methods[method] as any)(args)\n\t\t\t\t.then((r: any) => {\n\t\t\t\t\tthis.sendRaw(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t[this.id]: {\n\t\t\t\t\t\t\t\t$type: \"response\",\n\t\t\t\t\t\t\t\t$token: dt.$token,\n\t\t\t\t\t\t\t\t$data: r?.[0],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tr?.[1]\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t\t.catch((err: any) => {\n\t\t\t\t\tconsole.error(err);\n\t\t\t\t\tthis.sendRaw(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t[this.id]: {\n\t\t\t\t\t\t\t\t$type: \"response\",\n\t\t\t\t\t\t\t\t$token: dt.$token,\n\t\t\t\t\t\t\t\t$error: err?.toString() || \"Unknown error\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[]\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t}\n\t}\n\n\tcall<Method extends keyof Remote>(\n\t\tmethod: Method,\n\t\targs: Remote[Method][0],\n\t\ttransfer: Transferable[] = []\n\t): Promise<Remote[Method][1]> {\n\t\tconst token = this.counter++;\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.promiseCallbacks.set(token, { resolve, reject });\n\t\t\tthis.sendRaw(\n\t\t\t\t{\n\t\t\t\t\t[this.id]: {\n\t\t\t\t\t\t$type: \"request\",\n\t\t\t\t\t\t$method: method,\n\t\t\t\t\t\t$args: args,\n\t\t\t\t\t\t$token: token,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\ttransfer\n\t\t\t);\n\t\t});\n\t}\n}\n","'use strict'\n\n// based on https://github.com/TehShrike/deepmerge\n// MIT License\n// Copyright (c) 2012 - 2022 James Halliday, Josh Duff, and other contributors of deepmerge\n\nconst JSON_PROTO = Object.getPrototypeOf({})\n\nfunction defaultIsMergeableObjectFactory () {\n return function defaultIsMergeableObject (value) {\n return typeof value === 'object' && value !== null && !(value instanceof RegExp) && !(value instanceof Date)\n }\n}\n\nfunction deepmergeConstructor (options) {\n function isNotPrototypeKey (value) {\n return (\n value !== 'constructor' &&\n value !== 'prototype' &&\n value !== '__proto__'\n )\n }\n\n function cloneArray (value) {\n let i = 0\n const il = value.length\n const result = new Array(il)\n for (i; i < il; ++i) {\n result[i] = clone(value[i])\n }\n return result\n }\n\n function cloneObject (target) {\n const result = {}\n\n if (cloneProtoObject && Object.getPrototypeOf(target) !== JSON_PROTO) {\n return cloneProtoObject(target)\n }\n\n const targetKeys = getKeys(target)\n let i, il, key\n for (i = 0, il = targetKeys.length; i < il; ++i) {\n isNotPrototypeKey(key = targetKeys[i]) &&\n (result[key] = clone(target[key]))\n }\n return result\n }\n\n function concatArrays (target, source) {\n const tl = target.length\n const sl = source.length\n let i = 0\n const result = new Array(tl + sl)\n for (i; i < tl; ++i) {\n result[i] = clone(target[i])\n }\n for (i = 0; i < sl; ++i) {\n result[i + tl] = clone(source[i])\n }\n return result\n }\n\n const propertyIsEnumerable = Object.prototype.propertyIsEnumerable\n function getSymbolsAndKeys (value) {\n const result = Object.keys(value)\n const keys = Object.getOwnPropertySymbols(value)\n for (let i = 0, il = keys.length; i < il; ++i) {\n propertyIsEnumerable.call(value, keys[i]) && result.push(keys[i])\n }\n return result\n }\n\n const getKeys = options?.symbols\n ? getSymbolsAndKeys\n : Object.keys\n\n const cloneProtoObject = typeof options?.cloneProtoObject === 'function'\n ? options.cloneProtoObject\n : undefined\n\n const isMergeableObject = typeof options?.isMergeableObject === 'function'\n ? options.isMergeableObject\n : defaultIsMergeableObjectFactory()\n\n const onlyDefinedProperties = options?.onlyDefinedProperties === true\n\n function isPrimitive (value) {\n return typeof value !== 'object' || value === null\n }\n\n const mergeArray = options && typeof options.mergeArray === 'function'\n ? options.mergeArray({ clone, deepmerge: _deepmerge, getKeys, isMergeableObject })\n : concatArrays\n\n function clone (entry) {\n return isMergeableObject(entry)\n ? Array.isArray(entry)\n ? cloneArray(entry)\n : cloneObject(entry)\n : entry\n }\n\n function mergeObject (target, source) {\n const result = {}\n const targetKeys = getKeys(target)\n const sourceKeys = getKeys(source)\n let i, il, key\n for (i = 0, il = targetKeys.length; i < il; ++i) {\n isNotPrototypeKey(key = targetKeys[i]) &&\n (sourceKeys.indexOf(key) === -1) &&\n (result[key] = clone(target[key]))\n }\n\n for (i = 0, il = sourceKeys.length; i < il; ++i) {\n if (!isNotPrototypeKey(key = sourceKeys[i])) {\n continue\n }\n\n if (key in target) {\n if (targetKeys.indexOf(key) !== -1) {\n if (cloneProtoObject && isMergeableObject(source[key]) && Object.getPrototypeOf(source[key]) !== JSON_PROTO) {\n result[key] = cloneProtoObject(source[key])\n } else {\n result[key] = _deepmerge(target[key], source[key])\n }\n }\n } else {\n if (onlyDefinedProperties && typeof source[key] === 'undefined') {\n continue\n }\n result[key] = clone(source[key])\n }\n }\n return result\n }\n\n function _deepmerge (target, source) {\n if (onlyDefinedProperties && typeof source === 'undefined') {\n return clone(target)\n }\n\n const sourceIsArray = Array.isArray(source)\n const targetIsArray = Array.isArray(target)\n\n if (isPrimitive(source)) {\n return source\n } else if (!isMergeableObject(target)) {\n return clone(source)\n } else if (sourceIsArray && targetIsArray) {\n return mergeArray(target, source)\n } else if (sourceIsArray !== targetIsArray) {\n return clone(source)\n } else {\n return mergeObject(target, source)\n }\n }\n\n function _deepmergeAll () {\n switch (arguments.length) {\n case 0:\n return {}\n case 1:\n return clone(arguments[0])\n case 2:\n return _deepmerge(arguments[0], arguments[1])\n }\n let result\n for (let i = 0, il = arguments.length; i < il; ++i) {\n result = _deepmerge(result, arguments[i])\n }\n return result\n }\n\n return options?.all\n ? _deepmergeAll\n : _deepmerge\n}\n\nmodule.exports = deepmergeConstructor\nmodule.exports.default = deepmergeConstructor\nmodule.exports.deepmerge = deepmergeConstructor\n\nObject.defineProperty(module.exports, 'isMergeableObject', {\n get: defaultIsMergeableObjectFactory\n})\n","const WebSocketFields = {\n CLOSED: WebSocket.CLOSED,\n CONNECTING: WebSocket.CONNECTING,\n OPEN: WebSocket.OPEN,\n};\nclass BareCompatibleWebSocket extends EventTarget {\n transport;\n url;\n readyState = WebSocketFields.CONNECTING;\n extensions = \"\";\n protocol = \"\";\n _data;\n _close;\n constructor(remote, protocols, transport, requestHeaders) {\n super();\n this.transport = transport;\n this.url = remote.toString();\n if (!requestHeaders) {\n requestHeaders = [];\n }\n if (!protocols) {\n protocols = [];\n }\n if (typeof protocols === \"string\") {\n protocols = [protocols];\n }\n const onopen = (protocol, extensions) => {\n this.protocol = protocol;\n this.extensions = extensions;\n this.readyState = WebSocketFields.OPEN;\n const event = new Event(\"open\");\n this.dispatchEvent(event);\n };\n const onmessage = async (payload) => {\n const event = new MessageEvent(\"message\", { data: payload });\n this.dispatchEvent(event);\n };\n const onclose = (code, reason) => {\n this.readyState = WebSocketFields.CLOSED;\n const event = new CloseEvent(\"close\", { code, reason });\n this.dispatchEvent(event);\n };\n const onerror = () => {\n this.readyState = WebSocketFields.CLOSED;\n const event = new Event(\"error\");\n this.dispatchEvent(event);\n };\n (async () => {\n if (!transport.ready) {\n await transport.init();\n }\n const [_data, _close] = transport.connect(new URL(remote), protocols, requestHeaders, onopen, onmessage, onclose, onerror);\n this._data = _data;\n this._close = _close;\n })();\n }\n async send(data) {\n if (!this.transport.ready) {\n await this.transport.init();\n }\n if (this.readyState === WebSocketFields.CONNECTING) {\n throw new DOMException(\"Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.\");\n }\n // we can't check typeof Uint8Array here directly as it may come from another realm\n if (typeof data === \"object\" && \"buffer\" in data && data.buffer) {\n let _data = data;\n // this is neccesary in case the buffer is a slice of a larger array\n // in which case you risk edge cases such as sending an entire wasm memory buffer over the websocket\n data = _data.buffer.slice(_data.byteOffset, _data.byteOffset + _data.byteLength);\n }\n this._data(data);\n }\n close(code, reason) {\n this._close(code, reason);\n }\n}\n\nconst validChars = \"!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz|~\";\nfunction validProtocol(protocol) {\n for (let i = 0; i < protocol.length; i++) {\n const char = protocol[i];\n if (!validChars.includes(char)) {\n return false;\n }\n }\n return true;\n}\nconst wsProtocols = [\"ws:\", \"wss:\"];\nconst statusEmpty = [101, 204, 205, 304];\nconst statusRedirect = [301, 302, 303, 307, 308];\nconst nativeFetch = fetch;\nfunction headersObjectToEntries(headers) {\n return [...headers];\n}\n/**\n * A Response with additional properties.\n */\nclass BareResponse extends Response {\n url;\n rawHeaders;\n redirected = false;\n static fromTransferrableResponse(resp, url) {\n const nativeHeaders = new Headers();\n for (const [key, value] of resp.headers) {\n try {\n nativeHeaders.append(key, value);\n }\n catch {\n }\n }\n const response = new BareResponse(statusEmpty.includes(resp.status) ? undefined : resp.body, {\n status: resp.status,\n statusText: resp.statusText,\n });\n for (const [key, value] of nativeHeaders.entries()) {\n response.headers.append(key, value);\n }\n response.url = url;\n response.redirected =\n resp.status >= 300 &&\n resp.status < 400 &&\n resp.headers[\"location\"] !== undefined;\n response.rawHeaders = resp.headers;\n return response;\n }\n static fromNativeResponse(resp) {\n let body = statusEmpty.includes(resp.status) ? undefined : resp.body;\n const response = new BareResponse(body, {\n headers: resp.headers,\n status: resp.status,\n statusText: resp.statusText,\n });\n response.url = resp.url;\n response.rawHeaders = headersObjectToEntries(resp.headers);\n response.redirected = resp.redirected;\n return response;\n }\n}\nconst defaultMaxRedirects = 20;\nclass BareCompatibleClient {\n transport;\n /**\n * Create a BareCompatibleClient using the provided transport. Calls to fetch and connect will wait for an implementation to be ready.\n */\n constructor(transport) {\n this.transport = transport;\n }\n createWebSocket(remote, protocols = [], requestHeaders) {\n try {\n remote = new URL(remote);\n }\n catch (err) {\n throw new DOMException(`Faiiled to construct 'WebSocket': The URL '${remote}' is invalid.`);\n }\n if (!wsProtocols.includes(remote.protocol))\n throw new DOMException(`Failed to construct 'WebSocket': The URL's scheme must be either 'ws' or 'wss'. '${remote.protocol}' is not allowed.`);\n if (!Array.isArray(protocols))\n protocols = [protocols];\n protocols = protocols.map(String);\n for (const proto of protocols)\n if (!validProtocol(proto))\n throw new DOMException(`Failed to construct 'WebSocket': The subprotocol '${proto}' is invalid.`);\n requestHeaders = requestHeaders || [];\n const socket = new BareCompatibleWebSocket(remote, protocols, this.transport, requestHeaders);\n return socket;\n }\n async fetch(url, init) {\n if (!this.transport.ready) {\n await this.transport.init();\n }\n let maxRedirects = init?.maxRedirects || defaultMaxRedirects;\n const body = init?.body;\n const headers = init?.headers || [];\n const method = init?.method || \"GET\";\n const redirect = init?.redirect || \"follow\";\n let urlO = new URL(url);\n if (urlO.protocol.startsWith(\"blob:\")) {\n const response = await nativeFetch(urlO);\n return BareResponse.fromNativeResponse(response);\n }\n for (let i = 0;; i++) {\n const resp = await this.transport.request(urlO, method, body, headers, undefined);\n const bareresponse = BareResponse.fromTransferrableResponse(resp, urlO.toString());\n if (statusRedirect.includes(bareresponse.status)) {\n switch (redirect) {\n case \"follow\": {\n const location = bareresponse.headers.get(\"location\");\n if (maxRedirects > i && location !== null) {\n urlO = new URL(location, urlO);\n continue;\n }\n else\n throw new TypeError(\"Failed to fetch\");\n }\n case \"error\":\n throw new TypeError(\"Failed to fetch\");\n case \"manual\":\n return bareresponse;\n }\n }\n else {\n return bareresponse;\n }\n }\n }\n}\n\nexport { BareCompatibleClient, BareCompatibleWebSocket, BareResponse };\n//# sourceMappingURL=index.mjs.map\n","// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { type MethodsDefinition, RpcHelper } from \"@mercuryworkshop/rpc\";\nimport {\n\tBareResponse,\n\ttype ProxyTransport,\n} from \"@mercuryworkshop/proxy-transports\";\nimport type * as ScramjetGlobal from \"@mercuryworkshop/scramjet\";\ndeclare const $scramjet: typeof ScramjetGlobal;\nimport { deepmerge } from \"@fastify/deepmerge\";\nimport { CONTROLLERFRAME } from \"./symbols\";\nimport type {\n\tFrameInitHooks,\n\tSerializedCookieSyncEntry,\n\tTransportToController,\n\tControllerbound,\n\tControllerToTransport,\n\tSWbound,\n\tWebSocketMessage,\n\tFrameErrorHooks,\n} from \"./types\";\n\nexport { HttpCachePlugin, type HttpCachePluginOptions } from \"./cache\";\n\nexport type Config = {\n\tprefix: string;\n\tscramjetPath: string;\n\tinjectPath: string;\n\twasmPath: string;\n\tvirtualWasmPath: string;\n\tcodec: Record<\"encode\" | \"decode\", (input: string) => string>;\n};\n\nexport const config: Config = {\n\tprefix: \"/~/sj/\",\n\tscramjetPath: \"/scramjet/scramjet.js\",\n\tinjectPath: \"/controller/controller.inject.js\",\n\twasmPath: \"/scramjet/scramjet.wasm\",\n\tvirtualWasmPath: \"scramjet.wasm.js\",\n\tcodec: {\n\t\tencode: (url: string) => {\n\t\t\tif (!url) return url;\n\n\t\t\treturn encodeURIComponent(url);\n\t\t},\n\t\tdecode: (url: string) => {\n\t\t\tif (!url) return url;\n\n\t\t\treturn decodeURIComponent(url);\n\t\t},\n\t},\n};\n\nconst scramjetConfig: Partial<ScramjetGlobal.ScramjetConfig> = {\n\tflags: {\n\t\t...$scramjet.defaultConfig.flags,\n\t\tallowFailedIntercepts: true,\n\t},\n\tmaskedfiles: [\"inject.js\", \"scramjet.wasm.js\"],\n};\n\ntype PersistedCookieState = {\n\tupdatedAt: number;\n\tcookies: string;\n};\n\nconst COOKIE_DB_NAME = \"__scramjet_controller\";\nconst COOKIE_STORE_NAME = \"state\";\nconst COOKIE_STATE_KEY = \"cookies\";\nconst BROADCASTCHANNEL_NAME = \"__scramjet_controller_channel\";\n\nlet cookieDbPromise: Promise<IDBDatabase> | null = null;\n\nfunction parsePersistedCookieState(\n\tvalue: unknown\n): PersistedCookieState | null {\n\tif (\n\t\ttypeof value !== \"object\" ||\n\t\tvalue === null ||\n\t\ttypeof (value as PersistedCookieState).updatedAt !== \"number\" ||\n\t\t!Number.isFinite((value as PersistedCookieState).updatedAt) ||\n\t\ttypeof (value as PersistedCookieState).cookies !== \"string\"\n\t) {\n\t\treturn null;\n\t}\n\n\treturn value as PersistedCookieState;\n}\n\nfunction requestToPromise<T>(request: IDBRequest<T>): Promise<T> {\n\treturn new Promise<T>((resolve, reject) => {\n\t\trequest.onsuccess = () => resolve(request.result);\n\t\trequest.onerror = () =>\n\t\t\treject(request.error ?? new Error(\"IndexedDB request failed\"));\n\t});\n}\n\nfunction transactionToPromise(transaction: IDBTransaction): Promise<void> {\n\treturn new Promise<void>((resolve, reject) => {\n\t\ttransaction.oncomplete = () => resolve();\n\t\ttransaction.onabort = () =>\n\t\t\treject(transaction.error ?? new Error(\"IndexedDB transaction aborted\"));\n\t\ttransaction.onerror = () =>\n\t\t\treject(transaction.error ?? new Error(\"IndexedDB transaction failed\"));\n\t});\n}\n\nfunction openCookieDatabase(): Promise<IDBDatabase> {\n\tif (cookieDbPromise) {\n\t\treturn cookieDbPromise;\n\t}\n\n\tcookieDbPromise = new Promise<IDBDatabase>((resolve, reject) => {\n\t\tconst request = indexedDB.open(COOKIE_DB_NAME, 1);\n\t\trequest.onupgradeneeded = () => {\n\t\t\tconst db = request.result;\n\t\t\tif (!db.objectStoreNames.contains(COOKIE_STORE_NAME)) {\n\t\t\t\tdb.createObjectStore(COOKIE_STORE_NAME);\n\t\t\t}\n\t\t};\n\t\trequest.onsuccess = () => resolve(request.result);\n\t\trequest.onerror = () =>\n\t\t\treject(request.error ?? new Error(\"Failed to open cookie database\"));\n\t});\n\n\treturn cookieDbPromise;\n}\n\nasync function readCookieState(): Promise<PersistedCookieState | null> {\n\ttry {\n\t\tconst db = await openCookieDatabase();\n\t\tconst transaction = db.transaction(COOKIE_STORE_NAME, \"readonly\");\n\t\tconst store = transaction.objectStore(COOKIE_STORE_NAME);\n\t\tconst value = await requestToPromise(store.get(COOKIE_STATE_KEY));\n\t\tawait transactionToPromise(transaction);\n\t\treturn parsePersistedCookieState(value);\n\t} catch (error) {\n\t\tconsole.error(\"Failed to read persisted controller cookies:\", error);\n\t\treturn null;\n\t}\n}\n\nasync function writeCookieState(\n\tcookies: string,\n\tcurrentUpdatedAt: number\n): Promise<number> {\n\ttry {\n\t\tconst db = await openCookieDatabase();\n\t\tconst transaction = db.transaction(COOKIE_STORE_NAME, \"readwrite\");\n\t\tconst store = transaction.objectStore(COOKIE_STORE_NAME);\n\t\tconst existing = parsePersistedCookieState(\n\t\t\tawait requestToPromise(store.get(COOKIE_STATE_KEY))\n\t\t);\n\t\tconst updatedAt = Math.max(\n\t\t\tDate.now(),\n\t\t\tcurrentUpdatedAt + 1,\n\t\t\t(existing?.updatedAt ?? 0) + 1\n\t\t);\n\t\tconst state: PersistedCookieState = {\n\t\t\tupdatedAt,\n\t\t\tcookies,\n\t\t};\n\t\tstore.put(state, COOKIE_STATE_KEY);\n\t\tawait transactionToPromise(transaction);\n\t\treturn updatedAt;\n\t} catch (error) {\n\t\tconsole.error(\"Failed to persist controller cookies:\", error);\n\t\treturn currentUpdatedAt;\n\t}\n}\n\nfunction makeId(): string {\n\treturn Math.random().toString(36).substring(2, 10);\n}\n\nconst deepMerge = deepmerge();\n\ntype ControllerInit = {\n\tserviceworker: ServiceWorker;\n\ttransport: ProxyTransport;\n\tconfig?: Partial<Config>;\n\tscramjetConfig?: Partial<ScramjetGlobal.ScramjetConfig>;\n};\n\nexport class Controller {\n\tid: string;\n\tconfig: Config;\n\tscramjetConfig: ScramjetGlobal.ScramjetConfig;\n\tprefix: string;\n\tcookieJar = new $scramjet.CookieJar();\n\tframes: Frame[] = [];\n\tserviceWorkerController: ServiceWorker;\n\tguardServiceWorkerRevive = true;\n\n\tprivate ready: Promise<void>;\n\tprivate readyResolve!: () => void;\n\tpublic isReady: boolean = false;\n\trpc: RpcHelper<Controllerbound, SWbound>;\n\tprivate port: MessagePort | null = null;\n\n\ttransport: ProxyTransport;\n\tprivate cookieUpdatedAt = 0;\n\tprivate cookieSyncPromise: Promise<void> | null = null;\n\tprivate cookieSyncDirty = true;\n\tprivate cookieSyncChannel = new BroadcastChannel(BROADCASTCHANNEL_NAME);\n\n\tprivate wasmAlreadyFetched = false;\n\tprivate wasmPayload: string | null = null;\n\tprivate onTabChannelMessage: (e: MessageEvent) => void = (e) => {\n\t\tthis.rpc.recieve(e.data);\n\t};\n\tprivate onCookieSyncMessage = (event: MessageEvent) => {\n\t\tconst updatedAt =\n\t\t\ttypeof event.data === \"object\" && event.data !== null\n\t\t\t\t? (event.data as { updatedAt?: unknown }).updatedAt\n\t\t\t\t: undefined;\n\t\tif (typeof updatedAt !== \"number\" || updatedAt <= this.cookieUpdatedAt) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.cookieSyncDirty = true;\n\t\tvoid this.loadSavedCookies();\n\t};\n\n\tprivate async loadScramjetWasm() {\n\t\tif (this.wasmAlreadyFetched) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst resp = await fetch(this.config.wasmPath);\n\t\t$scramjet.setWasm(await resp.arrayBuffer());\n\t\tthis.wasmAlreadyFetched = true;\n\t}\n\n\tprivate methods: MethodsDefinition<Controllerbound> = {\n\t\tready: async () => {\n\t\t\tthis.readyResolve();\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.guardServiceWorkerRevive = false;\n\t\t\t}, 5000);\n\t\t},\n\t\trequest: async (data) => {\n\t\t\tconst path = new URL(data.rawUrl).pathname;\n\t\t\tconst frame = this.frames.find((f) => path.startsWith(f.prefix));\n\t\t\tif (!frame) throw new Error(\"No frame found for request\");\n\t\t\ttry {\n\t\t\t\t// doesn't actually *load* every request, but hold up requests until the promise finishes\n\t\t\t\tawait this.loadSavedCookies();\n\n\t\t\t\tif (path === frame.prefix + this.config.virtualWasmPath) {\n\t\t\t\t\tif (!this.wasmPayload) {\n\t\t\t\t\t\tconst resp = await fetch(this.config.wasmPath);\n\t\t\t\t\t\tconst buf = await resp.arrayBuffer();\n\t\t\t\t\t\tconst b64 = btoa(\n\t\t\t\t\t\t\tnew Uint8Array(buf)\n\t\t\t\t\t\t\t\t.reduce(\n\t\t\t\t\t\t\t\t\t(data, byte) => (data.push(String.fromCharCode(byte)), data),\n\t\t\t\t\t\t\t\t\t[] as any\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.join(\"\")\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tthis.wasmPayload = `self.WASM = '${b64}';`;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbody: this.wasmPayload,\n\t\t\t\t\t\t\tstatus: 200,\n\t\t\t\t\t\t\tstatusText: \"OK\",\n\t\t\t\t\t\t\theaders: [[\"Content-Type\", \"application/javascript\"]],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[],\n\t\t\t\t\t];\n\t\t\t\t}\n\n\t\t\t\tconst sjheaders = $scramjet.ScramjetHeaders.fromRawHeaders(\n\t\t\t\t\tdata.initialHeaders\n\t\t\t\t);\n\n\t\t\t\tconst fetchresponse = await frame.fetchHandler.handleFetch({\n\t\t\t\t\tinitialHeaders: sjheaders,\n\t\t\t\t\trawClientUrl: data.rawClientUrl\n\t\t\t\t\t\t? new URL(data.rawClientUrl)\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\trawUrl: new URL(data.rawUrl),\n\t\t\t\t\trawReferrer: data.rawReferrer,\n\t\t\t\t\trawDestination: data.destination,\n\t\t\t\t\tmethod: data.method,\n\t\t\t\t\tmode: data.mode,\n\t\t\t\t\treferrer: data.referrer,\n\t\t\t\t\tbody: data.body,\n\t\t\t\t\tcache: data.cache,\n\t\t\t\t\tclientId: data.clientId,\n\t\t\t\t});\n\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\tbody: fetchresponse.body,\n\t\t\t\t\t\tstatus: fetchresponse.status,\n\t\t\t\t\t\tstatusText: fetchresponse.statusText,\n\t\t\t\t\t\theaders: fetchresponse.headers.toRawHeaders(),\n\t\t\t\t\t},\n\t\t\t\t\tfetchresponse.body instanceof ReadableStream ||\n\t\t\t\t\tfetchresponse.body instanceof ArrayBuffer\n\t\t\t\t\t\t? [fetchresponse.body]\n\t\t\t\t\t\t: [],\n\t\t\t\t];\n\t\t\t} catch (e) {\n\t\t\t\tconst reqcontext: typeof frame.hooks.error.request.context = {\n\t\t\t\t\trawrequest: data,\n\t\t\t\t};\n\t\t\t\tconst reqprops: typeof frame.hooks.error.request.props = {\n\t\t\t\t\tsetResponse: undefined,\n\t\t\t\t\tsuppressError: false,\n\t\t\t\t};\n\t\t\t\tawait $scramjet.Tap.dispatch(\n\t\t\t\t\tframe.hooks.error.request,\n\t\t\t\t\treqcontext,\n\t\t\t\t\treqprops\n\t\t\t\t);\n\t\t\t\tif (!reqprops.suppressError) {\n\t\t\t\t\tconsole.error(\"Error in controller request handler:\", e);\n\t\t\t\t}\n\t\t\t\tif (reqprops.setResponse) {\n\t\t\t\t\treturn [reqprops.setResponse, []];\n\t\t\t\t}\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t},\n\t\tinitRemoteTransport: async (port) => {\n\t\t\tconst rpc = new RpcHelper<TransportToController, ControllerToTransport>(\n\t\t\t\t{\n\t\t\t\t\trequest: async ({ remote, method, body, headers }) => {\n\t\t\t\t\t\tconst response = await this.transport.request(\n\t\t\t\t\t\t\tnew URL(remote),\n\t\t\t\t\t\t\tmethod,\n\t\t\t\t\t\t\tbody,\n\t\t\t\t\t\t\theaders,\n\t\t\t\t\t\t\tundefined\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn [response, [response.body]];\n\t\t\t\t\t},\n\t\t\t\t\tsendSetCookie: async ({ cookies, options }) => {\n\t\t\t\t\t\tawait this.loadSavedCookies(true);\n\t\t\t\t\t\tif (options?.clear) {\n\t\t\t\t\t\t\tthis.cookieJar.clear();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.applyCookieSyncEntries(cookies);\n\t\t\t\t\t\tawait this.persistCookies();\n\t\t\t\t\t\tawait this.propagateCookieSync(cookies, options);\n\t\t\t\t\t},\n\t\t\t\t\tconnect: async ({ url, protocols, requestHeaders, port }) => {\n\t\t\t\t\t\tlet resolve: (arg: TransportToController[\"connect\"][1]) => void;\n\t\t\t\t\t\tconst promise = new Promise<TransportToController[\"connect\"][1]>(\n\t\t\t\t\t\t\t(res) => (resolve = res)\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst [send, close] = this.transport.connect(\n\t\t\t\t\t\t\tnew URL(url),\n\t\t\t\t\t\t\tprotocols,\n\t\t\t\t\t\t\trequestHeaders,\n\t\t\t\t\t\t\t(protocol, extensions) => {\n\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\tresult: \"success\",\n\t\t\t\t\t\t\t\t\tprotocol: protocol,\n\t\t\t\t\t\t\t\t\textensions: extensions,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t(data) => {\n\t\t\t\t\t\t\t\tport.postMessage(\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"data\",\n\t\t\t\t\t\t\t\t\t\tdata: data,\n\t\t\t\t\t\t\t\t\t} as WebSocketMessage,\n\t\t\t\t\t\t\t\t\tdata instanceof ArrayBuffer ? [data] : []\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t(close, reason) => {\n\t\t\t\t\t\t\t\tport.postMessage({\n\t\t\t\t\t\t\t\t\ttype: \"close\",\n\t\t\t\t\t\t\t\t\tcode: close,\n\t\t\t\t\t\t\t\t\treason: reason,\n\t\t\t\t\t\t\t\t} as WebSocketMessage);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t(error) => {\n\t\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\t\tresult: \"failure\",\n\t\t\t\t\t\t\t\t\terror: error,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t\tport.onmessageerror = (ev) => {\n\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t\"Transport port messageerror (this should never happen!)\",\n\t\t\t\t\t\t\t\tev\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t};\n\t\t\t\t\t\tport.onmessage = ({ data }: { data: WebSocketMessage }) => {\n\t\t\t\t\t\t\tif (data.type === \"data\") {\n\t\t\t\t\t\t\t\tsend(data.data);\n\t\t\t\t\t\t\t} else if (data.type === \"close\") {\n\t\t\t\t\t\t\t\tclose(data.code, data.reason);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\treturn [await promise, []];\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"transport\",\n\t\t\t\t(data, transfer) => port.postMessage(data, transfer)\n\t\t\t);\n\t\t\tport.onmessageerror = (ev) => {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Transport port messageerror (this should never happen!)\",\n\t\t\t\t\tev\n\t\t\t\t);\n\t\t\t};\n\t\t\tport.onmessage = (e) => {\n\t\t\t\trpc.recieve(e.data);\n\t\t\t};\n\t\t\trpc.call(\"ready\", undefined, []);\n\t\t},\n\t};\n\n\tconstructor(public init: ControllerInit) {\n\t\tthis.id = makeId();\n\t\tthis.config = deepMerge(config, init.config || {}) as Config;\n\t\tthis.scramjetConfig = deepMerge(scramjetConfig, $scramjet.defaultConfig);\n\t\tthis.scramjetConfig = deepMerge(\n\t\t\tthis.scramjetConfig,\n\t\t\tinit.scramjetConfig || {}\n\t\t) as ScramjetGlobal.ScramjetConfig;\n\t\tthis.prefix = this.config.prefix + this.id + \"/\";\n\t\tthis.serviceWorkerController = init.serviceworker;\n\n\t\tthis.ready = Promise.all([\n\t\t\tnew Promise<void>((resolve) => {\n\t\t\t\tthis.readyResolve = resolve;\n\t\t\t}),\n\t\t\tthis.loadScramjetWasm(),\n\t\t\tthis.loadSavedCookies(true),\n\t\t]).then(() => undefined);\n\n\t\tthis.rpc = new RpcHelper<Controllerbound, SWbound>(\n\t\t\tthis.methods,\n\t\t\t\"tabchannel-\" + this.id,\n\t\t\t(data, transfer) => {\n\t\t\t\tif (!this.port) {\n\t\t\t\t\tthrow new Error(\"Port not found\");\n\t\t\t\t}\n\t\t\t\tthis.port.postMessage(data, transfer);\n\t\t\t}\n\t\t);\n\t\tthis.transport = init.transport;\n\n\t\tthis.cookieSyncChannel.addEventListener(\n\t\t\t\"message\",\n\t\t\tthis.onCookieSyncMessage\n\t\t);\n\t\tthis.setupMessagePort();\n\n\t\tnavigator.serviceWorker.addEventListener(\"message\", (e) => {\n\t\t\tif (\n\t\t\t\te.data?.$controller$setCookie &&\n\t\t\t\ttypeof e.data.$controller$setCookie === \"object\"\n\t\t\t) {\n\t\t\t\tconst payload = e.data.$controller$setCookie as {\n\t\t\t\t\tcookies?: SerializedCookieSyncEntry[];\n\t\t\t\t\toptions?: ScramjetGlobal.CookieSyncOptions;\n\t\t\t\t\tid?: string;\n\t\t\t\t};\n\n\t\t\t\tif (payload.options?.clear) {\n\t\t\t\t\tthis.cookieJar.clear();\n\t\t\t\t}\n\t\t\t\tthis.applyCookieSyncEntries(payload.cookies);\n\n\t\t\t\tif (typeof payload.id === \"string\") {\n\t\t\t\t\tthis.serviceWorkerController.postMessage({\n\t\t\t\t\t\t$sw$setCookieDone: {\n\t\t\t\t\t\t\tid: payload.id,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (e.data.$controller$swrevive) {\n\t\t\t\t// if we just spawned the service worker, it will send this even though it's not actually dead\n\t\t\t\t// TODO: pretty jank, fix at some point\n\t\t\t\tif (this.guardServiceWorkerRevive) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.setupMessagePort();\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate setupMessagePort() {\n\t\tif (this.port) {\n\t\t\tthis.port.removeEventListener(\"message\", this.onTabChannelMessage);\n\t\t\ttry {\n\t\t\t\tthis.port.close();\n\t\t\t} catch {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t\tthis.port = null;\n\t\t}\n\n\t\tconst channel = new MessageChannel();\n\t\tthis.port = channel.port1;\n\t\tthis.port.addEventListener(\"message\", this.onTabChannelMessage);\n\t\tthis.port.start();\n\n\t\tthis.serviceWorkerController.postMessage(\n\t\t\t{\n\t\t\t\t$controller$init: {\n\t\t\t\t\tprefix: this.prefix,\n\t\t\t\t\tid: this.id,\n\t\t\t\t},\n\t\t\t},\n\t\t\t[channel.port2]\n\t\t);\n\t}\n\n\t// TODO: should this be a method on the cookie jar?\n\tprivate applyCookieSyncEntries(\n\t\tcookies: SerializedCookieSyncEntry[] | undefined\n\t) {\n\t\tif (!Array.isArray(cookies)) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const entry of cookies) {\n\t\t\tif (typeof entry?.url !== \"string\" || typeof entry.cookie !== \"string\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.cookieJar.setCookies(entry.cookie, new URL(entry.url));\n\t\t}\n\t}\n\n\tasync propagateCookieSync(\n\t\tcookies: SerializedCookieSyncEntry[],\n\t\toptions: ScramjetGlobal.CookieSyncOptions = {}\n\t): Promise<void> {\n\t\tif (!this.port) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.rpc.call(\"sendSetCookie\", {\n\t\t\tcookies,\n\t\t\toptions,\n\t\t});\n\t}\n\n\tprivate async loadSavedCookies(force = false): Promise<void> {\n\t\tif (!force && !this.cookieSyncDirty) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.cookieSyncPromise) {\n\t\t\treturn this.cookieSyncPromise;\n\t\t}\n\n\t\tthis.cookieSyncPromise = (async () => {\n\t\t\tconst persisted = await readCookieState();\n\t\t\tif (persisted && persisted.updatedAt > this.cookieUpdatedAt) {\n\t\t\t\tthis.cookieJar.load(persisted.cookies);\n\t\t\t\tthis.cookieUpdatedAt = persisted.updatedAt;\n\t\t\t}\n\t\t\tthis.cookieSyncDirty = false;\n\t\t})().finally(() => {\n\t\t\tthis.cookieSyncPromise = null;\n\t\t});\n\n\t\treturn this.cookieSyncPromise;\n\t}\n\n\tasync persistCookies(): Promise<void> {\n\t\tconst updatedAt = await writeCookieState(\n\t\t\tthis.cookieJar.dump(),\n\t\t\tthis.cookieUpdatedAt\n\t\t);\n\t\tif (updatedAt <= this.cookieUpdatedAt) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.cookieUpdatedAt = updatedAt;\n\t\tthis.cookieSyncDirty = false;\n\t\tthis.cookieSyncChannel.postMessage({\n\t\t\tupdatedAt,\n\t\t});\n\t}\n\n\tsetTransport(transport: ProxyTransport) {\n\t\tthis.transport = transport;\n\t\tfor (const frame of this.frames) {\n\t\t\tframe.controller.transport = transport;\n\t\t\tframe.fetchHandler.client.transport = transport;\n\t\t}\n\t}\n\n\tcreateFrame(element?: HTMLIFrameElement): Frame {\n\t\tif (!this.ready) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Controller is not ready! Try awaiting controller.wait()\"\n\t\t\t);\n\t\t}\n\t\telement ??= document.createElement(\"iframe\");\n\t\tconst frame = new Frame(this, element);\n\t\tthis.frames.push(frame);\n\t\treturn frame;\n\t}\n\n\tasync wait(): Promise<void> {\n\t\tawait this.ready;\n\t}\n}\n\nfunction base64Encode(text: string) {\n\treturn btoa(\n\t\tnew TextEncoder()\n\t\t\t.encode(text)\n\t\t\t.reduce(\n\t\t\t\t(data, byte) => (data.push(String.fromCharCode(byte)), data),\n\t\t\t\t[] as any\n\t\t\t)\n\t\t\t.join(\"\")\n\t);\n}\n\nfunction yieldGetInjectScripts(\n\tconfig: Config,\n\tsjconfig: ScramjetGlobal.ScramjetConfig,\n\tprefix: URL,\n\tcookieJar: ScramjetGlobal.CookieJar,\n\tcodecEncode: (input: string) => string,\n\tcodecDecode: (input: string) => string\n) {\n\tconst getInjectScripts: ScramjetGlobal.ScramjetInterface[\"getInjectScripts\"] =\n\t\t(meta, handler, htmlcontext, script) => {\n\t\t\tfunction base64Encode(text: string) {\n\t\t\t\treturn btoa(\n\t\t\t\t\tnew TextEncoder()\n\t\t\t\t\t\t.encode(text)\n\t\t\t\t\t\t.reduce(\n\t\t\t\t\t\t\t(data, byte) => (data.push(String.fromCharCode(byte)), data),\n\t\t\t\t\t\t\t[] as any\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join(\"\")\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn [\n\t\t\t\tscript(config.scramjetPath),\n\t\t\t\tscript(prefix.href + config.virtualWasmPath),\n\t\t\t\tscript(config.injectPath),\n\t\t\t\tscript(\n\t\t\t\t\t\"data:text/javascript;charset=utf-8;base64,\" +\n\t\t\t\t\t\tbase64Encode(`\n\t\t\t\t\tdocument.querySelectorAll(\"script[scramjet-injected]\").forEach(script => script.remove());\n\t\t\t\t\t$scramjetController.load({\n\t\t\t\t\t\tconfig: ${JSON.stringify(config)},\n\t\t\t\t\t\tsjconfig: ${JSON.stringify(sjconfig)},\n\t\t\t\t\t\tprefix: new URL(\"${prefix.href}\"),\n\t\t\t\t\t\tcookies: ${JSON.stringify(cookieJar.dump())},\n\t\t\t\t\t\tyieldGetInjectScripts: ${yieldGetInjectScripts.toString()},\n\t\t\t\t\t\tcodecEncode: ${codecEncode.toString()},\n\t\t\t\t\t\tcodecDecode: ${codecDecode.toString()},\n\t\t\t\t\t\tinitHeaders: ${JSON.stringify(htmlcontext.headers ?? [])},\n\t\t\t\t\t\thistory: ${JSON.stringify(htmlcontext.history ?? [])},\n\t\t\t\t\t})\n\t\t\t\t`)\n\t\t\t\t),\n\t\t\t];\n\t\t};\n\treturn getInjectScripts;\n}\n\nexport class Frame {\n\tid: string;\n\tprefix: string;\n\tfetchHandler: ScramjetGlobal.ScramjetFetchHandler;\n\thooks: {\n\t\tfetch: ScramjetGlobal.FetchHooks;\n\t\tinit: FrameInitHooks;\n\t\terror: FrameErrorHooks;\n\t};\n\n\tget context(): ScramjetGlobal.ScramjetContext {\n\t\treturn {\n\t\t\tconfig: this.controller.scramjetConfig,\n\t\t\tprefix: new URL(this.prefix, location.href),\n\t\t\tcookieJar: this.controller.cookieJar,\n\t\t\tinterface: {\n\t\t\t\tgetInjectScripts: yieldGetInjectScripts(\n\t\t\t\t\tthis.controller.config,\n\t\t\t\t\tthis.controller.scramjetConfig,\n\t\t\t\t\tnew URL(this.prefix, location.href),\n\t\t\t\t\tthis.controller.cookieJar,\n\t\t\t\t\tthis.controller.config.codec.encode,\n\t\t\t\t\tthis.controller.config.codec.decode\n\t\t\t\t),\n\t\t\t\tgetWorkerInjectScripts: (meta, type, script) => {\n\t\t\t\t\tlet str = \"\";\n\n\t\t\t\t\tstr += script(this.controller.config.scramjetPath);\n\t\t\t\t\tstr += script(this.prefix + this.controller.config.virtualWasmPath);\n\t\t\t\t\tstr += script(\n\t\t\t\t\t\t\"data:text/javascript;charset=utf-8;base64,\" +\n\t\t\t\t\t\t\tbase64Encode(`\n\t\t\t\t\t(()=>{\n\t\t\t\t\t\tconst { ScramjetClient, CookieJar, setWasm } = $scramjet;\n\n\t\t\t\t\t\tsetWasm(Uint8Array.from(atob(self.WASM), (c) => c.charCodeAt(0)));\n\t\t\t\t\t\tdelete self.WASM;\n\n\t\t\t\t\t\tconst sjconfig = ${JSON.stringify(this.controller.scramjetConfig)};\n\t\t\t\t\t\tconst prefix = new URL(\"${this.prefix}\", location.href);\n\n\t\t\t\t\t\tconst context = {\n\t\t\t\t\t\t\tconfig: sjconfig,\n\t\t\t\t\t\t\tprefix,\n\t\t\t\t\t\t\tinterface: {\n\t\t\t\t\t\t\t\tcodecEncode: ${this.controller.config.codec.encode.toString()},\n\t\t\t\t\t\t\t\tcodecDecode: ${this.controller.config.codec.decode.toString()},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tconst client = new ScramjetClient(globalThis, {\n\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\ttransport: null,\n\t\t\t\t\t\t\tshouldPassthroughWebsocket: (url) => {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tclient.hook();\n\t\t\t\t\t})();\n\t\t\t\t\t`)\n\t\t\t\t\t);\n\n\t\t\t\t\treturn str;\n\t\t\t\t},\n\t\t\t\tcodecEncode: this.controller.config.codec.encode,\n\t\t\t\tcodecDecode: this.controller.config.codec.decode,\n\t\t\t},\n\t\t};\n\t}\n\n\tconstructor(\n\t\tpublic controller: Controller,\n\t\tpublic element: HTMLIFrameElement\n\t) {\n\t\tthis.id = makeId();\n\t\tthis.prefix = this.controller.prefix + this.id + \"/\";\n\n\t\tthis.fetchHandler = new $scramjet.ScramjetFetchHandler({\n\t\t\tcrossOriginIsolated: self.crossOriginIsolated,\n\t\t\tcontext: this.context,\n\t\t\ttransport: controller.transport,\n\t\t\tasync sendSetCookie(cookies, options) {\n\t\t\t\tawait controller.persistCookies();\n\t\t\t\tawait controller.propagateCookieSync(\n\t\t\t\t\tcookies.map(({ url, cookie }) => ({\n\t\t\t\t\t\turl: url.href,\n\t\t\t\t\t\tcookie,\n\t\t\t\t\t})),\n\t\t\t\t\toptions\n\t\t\t\t);\n\t\t\t},\n\t\t\tasync fetchBlobUrl(url) {\n\t\t\t\treturn BareResponse.fromNativeResponse(await fetch(url));\n\t\t\t},\n\t\t\tasync fetchDataUrl(url) {\n\t\t\t\treturn BareResponse.fromNativeResponse(await fetch(url));\n\t\t\t},\n\t\t});\n\n\t\tthis.hooks = {\n\t\t\tfetch: this.fetchHandler.hooks.fetch,\n\t\t\tinit: $scramjet.Tap.create<FrameInitHooks>(),\n\t\t\terror: $scramjet.Tap.create<FrameErrorHooks>(),\n\t\t};\n\n\t\telement[CONTROLLERFRAME] = this;\n\t}\n\n\tback() {\n\t\tthis.element.contentWindow?.history.back();\n\t}\n\n\tforward() {\n\t\tthis.element.contentWindow?.history.forward();\n\t}\n\n\treload() {\n\t\tthis.element.contentWindow?.location.reload();\n\t}\n\n\tgo(url: string) {\n\t\tconst encoded = $scramjet.rewriteUrl(url, this.context, {\n\t\t\t//@ts-expect-error\n\t\t\torigin: new URL(location.href),\n\t\t\t//@ts-expect-error\n\t\t\tbase: new URL(location.href),\n\t\t});\n\t\tthis.element.src = encoded;\n\t}\n}\n"],"names":["STORED_AT_HEADER","DEFAULT_CACHEABLE_STATUSES","Set","NULL_BODY_STATUSES","parseCacheControl","value","out","raw","part","eq","name","v","n","parseInt","Number","isCacheableMethod","method","buildCacheKeyRequest","parsedUrl","headers","native","Headers","k","Request","encodeURIComponent","nativeHeadersFromRaw","h","rebuildBareResponseWithBuffer","bare","status","isNullBody","BareResponse","Response","buf","HttpCachePlugin","$scramjet","WeakMap","options","caches","target","hooks","ctx","props","ageHeader","req","reqCache","cache","stored","storedAt","cc","pragmaNoCache","mustRevalidateBeforeUse","dateMs","d","Date","lifetime","freshnessLifetimeSeconds","undefined","expires","expMs","Math","lastModified","lmMs","age","initialAge","immutable","strippedHeadersFromStored","String","earlyBody","earlyResponse","statusText","responseIsStorable","vary","replacement","bodyBuffer","cacheKey","toStore","err","console","CONTROLLERFRAME","Symbol","RpcHelper","Map","methods","id","sendRaw","data","dt","type","token","error","cb","Error","args","r","transfer","Promise","resolve","reject","Object","RegExp","i","Array","e","s","arguments","WebSocket","EventTarget","config","url","decodeURIComponent","scramjetConfig","COOKIE_STORE_NAME","COOKIE_STATE_KEY","cookieDbPromise","parsePersistedCookieState","requestToPromise","request","transactionToPromise","transaction","openCookieDatabase","indexedDB","db","readCookieState","store","writeCookieState","cookies","currentUpdatedAt","existing","updatedAt","makeId","deepMerge","deepmerge","Controller","BroadcastChannel","event","resp","fetch","setTimeout","path","URL","frame","f","b64","btoa","Uint8Array","byte","sjheaders","fetchresponse","ReadableStream","ArrayBuffer","reqprops","port","rpc","remote","body","response","protocols","requestHeaders","promise","res","send","close","protocol","extensions","reason","ev","init","navigator","payload","channel","MessageChannel","entry","force","persisted","transport","element","Frame","document","location","yieldGetInjectScripts","sjconfig","prefix","cookieJar","codecEncode","codecDecode","meta","handler","htmlcontext","script","text","JSON","TextEncoder","str","controller","self","cookie","encoded"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var $scramjetController;(()=>{var e={286(e,t,o){o.d(t,{I:()=>r});let r=Symbol.for("controller frame handle")},805(e,t,o){o.d(t,{C:()=>r});class r{methods;id;sendRaw;counter=0;promiseCallbacks=new Map;constructor(e,t,o){this.methods=e,this.id=t,this.sendRaw=o}recieve(e){if(null==e||"object"!=typeof e)return;let t=e[this.id];if(null==t||"object"!=typeof t)return;let o=t.$type;if("response"===o){let e=t.$token,o=t.$data,r=t.$error,i=this.promiseCallbacks.get(e);if(!i)return;this.promiseCallbacks.delete(e),void 0!==r?i.reject(Error(r)):i.resolve(o)}else if("request"===o){let e=t.$method,o=t.$args;this.methods[e](o).then(e=>{this.sendRaw({[this.id]:{$type:"response",$token:t.$token,$data:e?.[0]}},e?.[1])}).catch(e=>{console.error(e),this.sendRaw({[this.id]:{$type:"response",$token:t.$token,$error:e?.toString()||"Unknown error"}},[])})}}call(e,t,o=[]){let r=this.counter++;return new Promise((i,s)=>{this.promiseCallbacks.set(r,{resolve:i,reject:s}),this.sendRaw({[this.id]:{$type:"request",$method:e,$args:t,$token:r}},o)})}}}},t={};function o(r){var i=t[r];if(void 0!==i)return i.exports;var s=t[r]={exports:{}};return e[r](s,s.exports,o),s.exports}o.d=(e,t)=>{for(var r in t)o.o(t,r)&&!o.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var r={};(()=>{o.r(r),o.d(r,{load:()=>p});var e=o(805),t=o(286);let i=MessagePort.prototype.postMessage,s=(e,t,o)=>{i.call(e,t,o)};class n{port;readyResolve;readyPromise=new Promise(e=>{this.readyResolve=e});ready=!1;async init(){await this.readyPromise,this.ready=!0}rpc;constructor(t){this.port=t,this.rpc=new e.C({ready:async()=>{this.readyResolve()}},"transport",(e,o)=>{s(t,e,o)}),t.onmessageerror=e=>{console.error("onmessageerror (this should never happen!)",e)},t.onmessage=e=>{this.rpc.recieve(e.data)},t.start()}connect(e,t,o,r,i,n,a){let c=new MessageChannel,l=c.port1;return console.warn("connecting"),this.rpc.call("connect",{url:e.href,protocols:t,requestHeaders:o,port:c.port2},[c.port2]).then(e=>{console.log(e),"success"===e.result?r(e.protocol,e.extensions):a(e.error)}),l.onmessage=e=>{let t=e.data;"data"===t.type?i(t.data):"close"===t.type&&n(t.code,t.reason)},l.onmessageerror=e=>{console.error("onmessageerror (this should never happen!)",e),a("Message error in transport port")},[e=>{s(l,{type:"data",data:e},e instanceof ArrayBuffer?[e]:[])},e=>{s(l,{type:"close",code:e})}]}async request(e,t,o,r,i){return await this.rpc.call("request",{remote:e.href,method:t,body:o,headers:r})}async sendSetCookie(e,t={}){await this.rpc.call("sendSetCookie",{cookies:e.map(({url:e,cookie:t})=>({url:e.href,cookie:t})),options:t})}}let a=navigator.serviceWorker.controller,{SCRAMJETCLIENT:c,ScramjetClient:l,CookieJar:h,setWasm:d}=$scramjet;function p(e){if(c in globalThis)return void globalThis[c].syncDocumentInit({initHeaders:e.initHeaders,history:e.history,cookies:e.cookies});if(!("WASM"in self))throw Error("WASM not found in global scope!");let t=Uint8Array.from(atob(self.WASM),e=>e.charCodeAt(0));delete self.WASM,d(t),new f(globalThis,e)}class f{global;init;client;cookieJar;transport;handleServiceWorkerCookieMessage;constructor(e,t){this.global=e,this.init=t;const o=new MessageChannel;this.transport=new n(o.port1),a?.postMessage({$sw$initRemoteTransport:{port:o.port2,prefix:this.init.prefix.href}},[o.port2]),this.cookieJar=new h,this.cookieJar.load(this.init.cookies),this.handleServiceWorkerCookieMessage=e=>{if(!e.data?.$controller$setCookie||"object"!=typeof e.data.$controller$setCookie)return;let t=e.data.$controller$setCookie;if(t.options?.clear&&this.cookieJar.clear(),Array.isArray(t.cookies)){for(let e of t.cookies)if("string"==typeof e?.url&&"string"==typeof e.cookie)try{this.cookieJar.setCookies(e.cookie,new URL(e.url))}catch{console.error("Failed to set cookie",e)}}if("string"==typeof t.id){let e=navigator.serviceWorker?.controller??a;e?.postMessage({$sw$setCookieDone:{id:t.id}})}},navigator.serviceWorker?.addEventListener("message",this.handleServiceWorkerCookieMessage),this.injectScramjet()}injectScramjet(){let e=this.global.frameElement;e&&!e.name&&(window.name=e.name=`${Array(8).fill(0).map(()=>Math.floor(36*Math.random()).toString(36)).join("")}`);let o=e?.[t.I],r=!0;if(!o){r=!1;let e=this.global.window;for(;e.parent!==e;){let r=e[$scramjet.SCRAMJETCLIENT];if(!r){e=e.parent.window;continue}let i=r.descriptors.get("window.frameElement",e);if(i&&i[t.I]){o=i[t.I];break}e=e.parent.window}}let i={config:this.init.sjconfig,prefix:this.init.prefix,cookieJar:this.cookieJar,interface:{getInjectScripts:this.init.yieldGetInjectScripts(this.init.config,this.init.sjconfig,this.init.prefix,this.cookieJar,this.init.codecEncode,this.init.codecDecode),codecEncode:this.init.codecEncode,codecDecode:this.init.codecDecode}};this.client=new l(this.global,{context:i,transport:this.transport,sendSetCookie:async(e,t)=>{await this.transport.sendSetCookie(e,t)},shouldPassthroughWebsocket:()=>!1,shouldBlockMessageEvent:()=>!1,hookSubcontext:e=>new f(e,{...this.init,cookies:this.cookieJar.dump()}).client,initHeaders:this.init.initHeaders,history:this.init.history});let s={window:this.global.window,client:this.client,isTopLevel:r};o&&$scramjet.Tap.dispatch(o.hooks.init.pre,s,{}),this.client.hook(),o&&$scramjet.Tap.dispatch(o.hooks.init.post,s,{})}}})(),$scramjetController=r})();
|
|
2
|
+
//# sourceMappingURL=controller.inject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.inject.js","sources":["webpack://$scramjetController/./packages/controller/src/symbols.ts","webpack://$scramjetController/./packages/rpc/index.ts","webpack://$scramjetController/webpack/runtime/define_property_getters","webpack://$scramjetController/webpack/runtime/has_own_property","webpack://$scramjetController/webpack/runtime/make_namespace_object","webpack://$scramjetController/./packages/controller/src/inject.ts"],"sourcesContent":["export const CONTROLLERFRAME = Symbol.for(\"controller frame handle\");\n","type Serverbound = {\n\tmethod1: [{ paramA: string; paramB: number }, boolean];\n\tmethod2: [string, number];\n};\n\ntype Clientbound = {\n\tmethod1: [number];\n\tmethod2: [boolean, string];\n};\n\nexport type RpcDescription = {\n\t[method: string]: [args: any, returnType: any] | [args: any] | [];\n};\n\nexport type MethodsDefinition<Description extends RpcDescription> = {\n\t[Method in keyof Description]: (\n\t\t...args: Description[Method] extends [infer A, ...any[]] ? [A] : []\n\t) => Description[Method] extends [any, infer R]\n\t\t? Promise<[R, Transferable[]]>\n\t\t: Promise<void>;\n};\n\nexport class RpcHelper<\n\tLocal extends RpcDescription,\n\tRemote extends RpcDescription,\n> {\n\tcounter: number = 0;\n\tpromiseCallbacks: Map<\n\t\tnumber,\n\t\t{ resolve: (value: any) => void; reject: (reason?: any) => void }\n\t> = new Map();\n\tconstructor(\n\t\tprivate methods: MethodsDefinition<Local>,\n\t\tprivate id: string,\n\t\tprivate sendRaw: (data: any, transfer: Transferable[]) => void\n\t) {}\n\n\trecieve(data: any) {\n\t\tif (data === undefined || data === null || typeof data !== \"object\") return;\n\t\tconst dt = data[this.id];\n\t\tif (dt === undefined || dt === null || typeof dt !== \"object\") return;\n\n\t\tconst type = dt.$type;\n\n\t\tif (type === \"response\") {\n\t\t\tconst token = dt.$token;\n\t\t\tconst data = dt.$data;\n\t\t\tconst error = dt.$error;\n\t\t\tconst cb = this.promiseCallbacks.get(token);\n\t\t\tif (!cb) return;\n\t\t\tthis.promiseCallbacks.delete(token);\n\t\t\tif (error !== undefined) {\n\t\t\t\tcb.reject(new Error(error));\n\t\t\t} else {\n\t\t\t\tcb.resolve(data);\n\t\t\t}\n\t\t} else if (type === \"request\") {\n\t\t\tconst method = dt.$method as keyof Local;\n\t\t\tconst args = dt.$args as Local[typeof method][0];\n\t\t\t(this.methods[method] as any)(args)\n\t\t\t\t.then((r: any) => {\n\t\t\t\t\tthis.sendRaw(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t[this.id]: {\n\t\t\t\t\t\t\t\t$type: \"response\",\n\t\t\t\t\t\t\t\t$token: dt.$token,\n\t\t\t\t\t\t\t\t$data: r?.[0],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tr?.[1]\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t\t.catch((err: any) => {\n\t\t\t\t\tconsole.error(err);\n\t\t\t\t\tthis.sendRaw(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t[this.id]: {\n\t\t\t\t\t\t\t\t$type: \"response\",\n\t\t\t\t\t\t\t\t$token: dt.$token,\n\t\t\t\t\t\t\t\t$error: err?.toString() || \"Unknown error\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[]\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t}\n\t}\n\n\tcall<Method extends keyof Remote>(\n\t\tmethod: Method,\n\t\targs: Remote[Method][0],\n\t\ttransfer: Transferable[] = []\n\t): Promise<Remote[Method][1]> {\n\t\tconst token = this.counter++;\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.promiseCallbacks.set(token, { resolve, reject });\n\t\t\tthis.sendRaw(\n\t\t\t\t{\n\t\t\t\t\t[this.id]: {\n\t\t\t\t\t\t$type: \"request\",\n\t\t\t\t\t\t$method: method,\n\t\t\t\t\t\t$args: args,\n\t\t\t\t\t\t$token: token,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\ttransfer\n\t\t\t);\n\t\t});\n\t}\n}\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type * as ScramjetGlobal from \"@mercuryworkshop/scramjet\";\ndeclare const $scramjet: typeof ScramjetGlobal;\nimport type {\n\tRawHeaders,\n\tProxyTransport,\n\tTransferrableResponse,\n} from \"@mercuryworkshop/proxy-transports\";\n\nimport { RpcHelper } from \"@mercuryworkshop/rpc\";\nimport type { Config } from \".\";\nimport { CONTROLLERFRAME } from \"./symbols\";\nimport type {\n\tSerializedCookieSyncEntry,\n\tControllerToTransport,\n\tTransportToController,\n\tWebSocketMessage,\n} from \"./types\";\n\nconst MessagePort_postMessage = MessagePort.prototype.postMessage;\nconst postMessage = (\n\tport: MessagePort,\n\tdata: any,\n\ttransfer?: Transferable[]\n) => {\n\tMessagePort_postMessage.call(port, data, transfer as any);\n};\n\nclass RemoteTransport implements ProxyTransport {\n\tprivate readyResolve!: () => void;\n\tprivate readyPromise: Promise<void> = new Promise((resolve) => {\n\t\tthis.readyResolve = resolve;\n\t});\n\n\tpublic ready = false;\n\tasync init() {\n\t\tawait this.readyPromise;\n\t\tthis.ready = true;\n\t}\n\n\tprivate rpc: RpcHelper<ControllerToTransport, TransportToController>;\n\tconstructor(public port: MessagePort) {\n\t\tthis.rpc = new RpcHelper<ControllerToTransport, TransportToController>(\n\t\t\t{\n\t\t\t\tready: async () => {\n\t\t\t\t\tthis.readyResolve();\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"transport\",\n\t\t\t(data, transfer) => {\n\t\t\t\tpostMessage(port, data, transfer);\n\t\t\t}\n\t\t);\n\t\tport.onmessageerror = (ev) => {\n\t\t\tconsole.error(\"onmessageerror (this should never happen!)\", ev);\n\t\t};\n\t\tport.onmessage = (ev) => {\n\t\t\tthis.rpc.recieve(ev.data);\n\t\t};\n\t\tport.start();\n\t}\n\tconnect(\n\t\turl: URL,\n\t\tprotocols: string[],\n\t\trequestHeaders: RawHeaders,\n\t\tonopen: (protocol: string, extensions: string) => void,\n\t\tonmessage: (data: Blob | ArrayBuffer | string) => void,\n\t\tonclose: (code: number, reason: string) => void,\n\t\tonerror: (error: string) => void\n\t): [\n\t\t(data: Blob | ArrayBuffer | string) => void,\n\t\t(code: number, reason: string) => void,\n\t] {\n\t\tconst channel = new MessageChannel();\n\t\tconst port = channel.port1;\n\t\tconsole.warn(\"connecting\");\n\t\tthis.rpc\n\t\t\t.call(\n\t\t\t\t\"connect\",\n\t\t\t\t{\n\t\t\t\t\turl: url.href,\n\t\t\t\t\tprotocols,\n\t\t\t\t\trequestHeaders,\n\t\t\t\t\tport: channel.port2,\n\t\t\t\t},\n\t\t\t\t[channel.port2]\n\t\t\t)\n\t\t\t.then((response) => {\n\t\t\t\tconsole.log(response);\n\t\t\t\tif (response.result === \"success\") {\n\t\t\t\t\tonopen(response.protocol, response.extensions);\n\t\t\t\t} else {\n\t\t\t\t\tonerror(response.error);\n\t\t\t\t}\n\t\t\t});\n\t\tport.onmessage = (ev) => {\n\t\t\tconst message = ev.data as WebSocketMessage;\n\t\t\tif (message.type === \"data\") {\n\t\t\t\tonmessage(message.data);\n\t\t\t} else if (message.type === \"close\") {\n\t\t\t\tonclose(message.code, message.reason);\n\t\t\t}\n\t\t};\n\t\tport.onmessageerror = (ev) => {\n\t\t\tconsole.error(\"onmessageerror (this should never happen!)\", ev);\n\t\t\tonerror(\"Message error in transport port\");\n\t\t};\n\n\t\treturn [\n\t\t\t(data) => {\n\t\t\t\tpostMessage(\n\t\t\t\t\tport,\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"data\",\n\t\t\t\t\t\tdata: data,\n\t\t\t\t\t},\n\t\t\t\t\tdata instanceof ArrayBuffer ? [data] : []\n\t\t\t\t);\n\t\t\t},\n\t\t\t(code) => {\n\t\t\t\tpostMessage(port, {\n\t\t\t\t\ttype: \"close\",\n\t\t\t\t\tcode: code,\n\t\t\t\t});\n\t\t\t},\n\t\t];\n\t}\n\n\tasync request(\n\t\tremote: URL,\n\t\tmethod: string,\n\t\tbody: BodyInit | null,\n\t\theaders: RawHeaders,\n\t\t_signal: AbortSignal | undefined\n\t): Promise<TransferrableResponse> {\n\t\treturn await this.rpc.call(\"request\", {\n\t\t\tremote: remote.href,\n\t\t\tmethod,\n\t\t\tbody,\n\t\t\theaders,\n\t\t});\n\t}\n\n\tasync sendSetCookie(\n\t\tcookies: Array<{ url: URL; cookie: string }>,\n\t\toptions: ScramjetGlobal.CookieSyncOptions = {}\n\t): Promise<void> {\n\t\tawait this.rpc.call(\"sendSetCookie\", {\n\t\t\tcookies: cookies.map(({ url, cookie }) => ({\n\t\t\t\turl: url.href,\n\t\t\t\tcookie,\n\t\t\t})),\n\t\t\toptions,\n\t\t});\n\t}\n}\n\nconst sw = navigator.serviceWorker.controller;\nconst { SCRAMJETCLIENT, ScramjetClient, CookieJar, setWasm } = $scramjet;\n\ntype Init = {\n\tconfig: Config;\n\tsjconfig: ScramjetGlobal.ScramjetConfig;\n\tprefix: URL;\n\tcookies: string;\n\tyieldGetInjectScripts: (\n\t\tconfig: Config,\n\t\tsjconfig: ScramjetGlobal.ScramjetConfig,\n\t\tprefix: URL,\n\t\tcookieJar: ScramjetGlobal.CookieJar,\n\t\tcodecEncode: (input: string) => string,\n\t\tcodecDecode: (input: string) => string\n\t) => any;\n\tcodecEncode: (input: string) => string;\n\tcodecDecode: (input: string) => string;\n\tinitHeaders: RawHeaders;\n\thistory: ScramjetGlobal.TrackedHistoryState[];\n};\n\nexport function load(init: Init) {\n\tif (SCRAMJETCLIENT in globalThis) {\n\t\t(\n\t\t\t(globalThis as any)[SCRAMJETCLIENT] as ScramjetGlobal.ScramjetClient\n\t\t).syncDocumentInit({\n\t\t\tinitHeaders: init.initHeaders,\n\t\t\thistory: init.history,\n\t\t\tcookies: init.cookies,\n\t\t});\n\t\treturn;\n\t}\n\tif (!(\"WASM\" in self)) {\n\t\tthrow new Error(\"WASM not found in global scope!\");\n\t}\n\tconst wasm = Uint8Array.from(atob(self.WASM), (c) => c.charCodeAt(0));\n\tdelete (self as any).WASM;\n\tsetWasm(wasm);\n\n\tnew ExecutionContextWrapper(globalThis, init);\n}\n\nfunction createFrameId() {\n\treturn `${Array(8)\n\t\t.fill(0)\n\t\t.map(() => Math.floor(Math.random() * 36).toString(36))\n\t\t.join(\"\")}`;\n}\n\nclass ExecutionContextWrapper {\n\tclient!: ScramjetGlobal.ScramjetClient;\n\tcookieJar: ScramjetGlobal.CookieJar;\n\ttransport: RemoteTransport;\n\tprivate handleServiceWorkerCookieMessage: (event: MessageEvent) => void;\n\n\tconstructor(\n\t\tpublic global: typeof globalThis,\n\t\tpublic init: Init\n\t) {\n\t\tconst channel = new MessageChannel();\n\t\tthis.transport = new RemoteTransport(channel.port1);\n\t\tsw?.postMessage(\n\t\t\t{\n\t\t\t\t$sw$initRemoteTransport: {\n\t\t\t\t\tport: channel.port2,\n\t\t\t\t\tprefix: this.init.prefix.href,\n\t\t\t\t},\n\t\t\t},\n\t\t\t[channel.port2]\n\t\t);\n\n\t\tthis.cookieJar = new CookieJar();\n\t\tthis.cookieJar.load(this.init.cookies);\n\n\t\tthis.handleServiceWorkerCookieMessage = (event: MessageEvent) => {\n\t\t\tif (\n\t\t\t\t!event.data?.$controller$setCookie ||\n\t\t\t\ttypeof event.data.$controller$setCookie !== \"object\"\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst payload = event.data.$controller$setCookie as {\n\t\t\t\tcookies?: SerializedCookieSyncEntry[];\n\t\t\t\toptions?: ScramjetGlobal.CookieSyncOptions;\n\t\t\t\tid?: string;\n\t\t\t};\n\n\t\t\tif (payload.options?.clear) {\n\t\t\t\tthis.cookieJar.clear();\n\t\t\t}\n\n\t\t\tif (Array.isArray(payload.cookies)) {\n\t\t\t\tfor (const cookie of payload.cookies) {\n\t\t\t\t\tif (\n\t\t\t\t\t\ttypeof cookie?.url !== \"string\" ||\n\t\t\t\t\t\ttypeof cookie.cookie !== \"string\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.cookieJar.setCookies(cookie.cookie, new URL(cookie.url));\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tconsole.error(\"Failed to set cookie\", cookie);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (typeof payload.id === \"string\") {\n\t\t\t\tconst targetSw = navigator.serviceWorker?.controller ?? sw;\n\t\t\t\ttargetSw?.postMessage({\n\t\t\t\t\t$sw$setCookieDone: {\n\t\t\t\t\t\tid: payload.id,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tnavigator.serviceWorker?.addEventListener(\n\t\t\t\"message\",\n\t\t\tthis.handleServiceWorkerCookieMessage\n\t\t);\n\n\t\tthis.injectScramjet();\n\t}\n\n\tinjectScramjet() {\n\t\tconst frame = this.global.frameElement as HTMLIFrameElement | null;\n\t\tif (frame && !frame.name) {\n\t\t\twindow.name = frame.name = createFrameId();\n\t\t}\n\t\tlet controllerFrame = frame?.[CONTROLLERFRAME];\n\t\tlet isTopLevel = true;\n\t\tif (!controllerFrame) {\n\t\t\tisTopLevel = false;\n\t\t\tlet currentwin = this.global.window;\n\t\t\twhile (currentwin.parent !== currentwin) {\n\t\t\t\tconst currentclient = currentwin[$scramjet.SCRAMJETCLIENT];\n\t\t\t\tif (!currentclient) {\n\t\t\t\t\tcurrentwin = currentwin.parent.window;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst currentFrame = currentclient.descriptors.get(\n\t\t\t\t\t\"window.frameElement\",\n\t\t\t\t\tcurrentwin\n\t\t\t\t);\n\t\t\t\tif (currentFrame && currentFrame[CONTROLLERFRAME]) {\n\t\t\t\t\tcontrollerFrame = currentFrame[CONTROLLERFRAME];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcurrentwin = currentwin.parent.window;\n\t\t\t}\n\t\t}\n\t\tconst context: ScramjetGlobal.ScramjetContext = {\n\t\t\tconfig: this.init.sjconfig,\n\t\t\tprefix: this.init.prefix,\n\t\t\tcookieJar: this.cookieJar,\n\t\t\tinterface: {\n\t\t\t\tgetInjectScripts: this.init.yieldGetInjectScripts(\n\t\t\t\t\tthis.init.config,\n\t\t\t\t\tthis.init.sjconfig,\n\t\t\t\t\tthis.init.prefix,\n\t\t\t\t\tthis.cookieJar,\n\t\t\t\t\tthis.init.codecEncode,\n\t\t\t\t\tthis.init.codecDecode\n\t\t\t\t),\n\t\t\t\tcodecEncode: this.init.codecEncode,\n\t\t\t\tcodecDecode: this.init.codecDecode,\n\t\t\t},\n\t\t};\n\t\tthis.client = new ScramjetClient(this.global, {\n\t\t\tcontext,\n\t\t\ttransport: this.transport,\n\t\t\tsendSetCookie: async (cookies, options) => {\n\t\t\t\tawait this.transport.sendSetCookie(cookies, options);\n\t\t\t},\n\t\t\tshouldPassthroughWebsocket: () => {\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tshouldBlockMessageEvent: () => {\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\thookSubcontext: (frameself) => {\n\t\t\t\tconst context = new ExecutionContextWrapper(frameself, {\n\t\t\t\t\t...this.init,\n\t\t\t\t\tcookies: this.cookieJar.dump(),\n\t\t\t\t});\n\t\t\t\treturn context.client;\n\t\t\t},\n\t\t\tinitHeaders: this.init.initHeaders,\n\t\t\thistory: this.init.history,\n\t\t});\n\t\tconst frameInitContext = {\n\t\t\twindow: this.global.window,\n\t\t\tclient: this.client,\n\t\t\tisTopLevel,\n\t\t};\n\t\tif (controllerFrame)\n\t\t\t$scramjet.Tap.dispatch(\n\t\t\t\tcontrollerFrame.hooks.init.pre,\n\t\t\t\tframeInitContext,\n\t\t\t\t{}\n\t\t\t);\n\t\tthis.client.hook();\n\t\tif (controllerFrame)\n\t\t\t$scramjet.Tap.dispatch(\n\t\t\t\tcontrollerFrame.hooks.init.post,\n\t\t\t\tframeInitContext,\n\t\t\t\t{}\n\t\t\t);\n\t}\n}\n"],"names":["CONTROLLERFRAME","Symbol","RpcHelper","Map","methods","id","sendRaw","data","dt","type","token","error","cb","undefined","Error","method","args","r","err","console","transfer","Promise","resolve","reject","e","Object","MessagePort_postMessage","MessagePort","postMessage","port","RemoteTransport","ev","url","protocols","requestHeaders","onopen","onmessage","onclose","onerror","channel","MessageChannel","response","message","ArrayBuffer","code","remote","body","headers","_signal","cookies","options","cookie","sw","navigator","SCRAMJETCLIENT","ScramjetClient","CookieJar","setWasm","$scramjet","load","init","globalThis","self","wasm","Uint8Array","atob","c","ExecutionContextWrapper","global","event","payload","Array","URL","targetSw","frame","window","Math","controllerFrame","isTopLevel","currentwin","currentclient","currentFrame","context","frameself","frameInitContext"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var $scramjetController;(()=>{var e={805(e,t,r){r.d(t,{C:()=>o});class o{methods;id;sendRaw;counter=0;promiseCallbacks=new Map;constructor(e,t,r){this.methods=e,this.id=t,this.sendRaw=r}recieve(e){if(null==e||"object"!=typeof e)return;let t=e[this.id];if(null==t||"object"!=typeof t)return;let r=t.$type;if("response"===r){let e=t.$token,r=t.$data,o=t.$error,s=this.promiseCallbacks.get(e);if(!s)return;this.promiseCallbacks.delete(e),void 0!==o?s.reject(Error(o)):s.resolve(r)}else if("request"===r){let e=t.$method,r=t.$args;this.methods[e](r).then(e=>{this.sendRaw({[this.id]:{$type:"response",$token:t.$token,$data:e?.[0]}},e?.[1])}).catch(e=>{console.error(e),this.sendRaw({[this.id]:{$type:"response",$token:t.$token,$error:e?.toString()||"Unknown error"}},[])})}}call(e,t,r=[]){let o=this.counter++;return new Promise((s,i)=>{this.promiseCallbacks.set(o,{resolve:s,reject:i}),this.sendRaw({[this.id]:{$type:"request",$method:e,$args:t,$token:o}},r)})}}}},t={};function r(o){var s=t[o];if(void 0!==s)return s.exports;var i=t[o]={exports:{}};return e[o](i,i.exports,r),i.exports}r.d=(e,t)=>{for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var o={};(()=>{r.r(o),r.d(o,{route:()=>a,shouldRoute:()=>n});var e=r(805);let t={};addEventListener("message",e=>{if(e.data&&"object"==typeof e.data){if(e.data.$sw$setCookieDone&&"object"==typeof e.data.$sw$setCookieDone){let r=e.data.$sw$setCookieDone,o=t[r.id];o&&(o(),delete t[r.id])}if(e.data.$sw$initRemoteTransport&&"object"==typeof e.data.$sw$initRemoteTransport){let{port:t,prefix:r}=e.data.$sw$initRemoteTransport,o=i.find(e=>new URL(r).pathname.startsWith(e.prefix));if(!o)return void console.error("No relevant controller found for transport init");o.rpc.call("initRemoteTransport",t,[t])}}});class s{prefix;id;rpc;constructor(r,o,s){this.prefix=r,this.id=o,this.rpc=new e.C({sendSetCookie:async({cookies:e,options:r})=>{let o=await self.clients.matchAll(),s=[],i=[],n=r?.destination==="document"||r?.destination==="iframe";for(let a of o){let o=Math.random().toString(36).substring(2,10);s.push(o),a.postMessage({$controller$setCookie:{cookies:e,options:r,id:o}}),n||i.push(new Promise(e=>{t[o]=()=>e(o)}))}if(i.length>0){let r,n=!1,a=new Promise(i=>{r=setTimeout(()=>{if(!n){let r=s.filter(e=>void 0!==t[e]);console.error(`timed out waiting for set cookie response (deadlock?): cookies=${e.length} clients=${o.length} pending=${r.length}/${s.length} clientUrls=${o.map(e=>e.url).join(",")}`)}i()},1e3)});try{await Promise.race([a,Promise.any(i).then(()=>{n=!0}).catch(()=>{})])}finally{for(let e of(void 0!==r&&clearTimeout(r),s))delete t[e]}}}},"tabchannel-"+o,(e,t)=>{s.postMessage(e,t)}),s.onmessage=e=>{this.rpc.recieve(e.data)},s.onmessageerror=console.error,this.rpc.call("ready",void 0)}}let i=[];function n(e){let t=new URL(e.request.url);return void 0!==i.find(e=>t.pathname.startsWith(e.prefix))}async function a(e){try{let t=new URL(e.request.url),r=i.find(e=>t.pathname.startsWith(e.prefix)),o=await clients.get(e.clientId),s=[...e.request.headers],n=await r.rpc.call("request",{rawUrl:e.request.url,rawReferrer:e.request.referrer,destination:e.request.destination,mode:e.request.mode,referrer:e.request.referrer,method:e.request.method,body:e.request.body,cache:e.request.cache,forceCrossOriginIsolated:!1,initialHeaders:s,rawClientUrl:o?o.url:void 0,clientId:e.clientId||e.resultingClientId},e.request.body instanceof ReadableStream||e.request.body instanceof ArrayBuffer?[e.request.body]:void 0);return new Response(n.body,{status:n.status,statusText:n.statusText,headers:n.headers})}catch(e){return console.error("Service Worker error:",e),new Response("Internal Service Worker Error: "+e.message,{status:500})}}addEventListener("message",e=>{if(!e.data||"object"!=typeof e.data||!e.data.$controller$init||"object"!=typeof e.data.$controller$init)return;let t=e.data.$controller$init,r=i.findIndex(e=>e.id===t.id);-1!==r&&i.splice(r,1),i.push(new s(t.prefix,t.id,e.ports[0]))}),addEventListener("install",()=>{self.skipWaiting()}),addEventListener("activate",e=>{e.waitUntil(clients.claim())}),setTimeout(async()=>{for(let e of(console.log("service worker activated, notifying clients to revive"),await clients.matchAll()))e.postMessage({$controller$swrevive:{}})},100)})(),$scramjetController=o})();
|
|
2
|
+
//# sourceMappingURL=controller.sw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.sw.js","sources":["webpack://$scramjetController/./packages/rpc/index.ts","webpack://$scramjetController/webpack/runtime/define_property_getters","webpack://$scramjetController/webpack/runtime/has_own_property","webpack://$scramjetController/webpack/runtime/make_namespace_object","webpack://$scramjetController/./packages/controller/src/sw.ts"],"sourcesContent":["type Serverbound = {\n\tmethod1: [{ paramA: string; paramB: number }, boolean];\n\tmethod2: [string, number];\n};\n\ntype Clientbound = {\n\tmethod1: [number];\n\tmethod2: [boolean, string];\n};\n\nexport type RpcDescription = {\n\t[method: string]: [args: any, returnType: any] | [args: any] | [];\n};\n\nexport type MethodsDefinition<Description extends RpcDescription> = {\n\t[Method in keyof Description]: (\n\t\t...args: Description[Method] extends [infer A, ...any[]] ? [A] : []\n\t) => Description[Method] extends [any, infer R]\n\t\t? Promise<[R, Transferable[]]>\n\t\t: Promise<void>;\n};\n\nexport class RpcHelper<\n\tLocal extends RpcDescription,\n\tRemote extends RpcDescription,\n> {\n\tcounter: number = 0;\n\tpromiseCallbacks: Map<\n\t\tnumber,\n\t\t{ resolve: (value: any) => void; reject: (reason?: any) => void }\n\t> = new Map();\n\tconstructor(\n\t\tprivate methods: MethodsDefinition<Local>,\n\t\tprivate id: string,\n\t\tprivate sendRaw: (data: any, transfer: Transferable[]) => void\n\t) {}\n\n\trecieve(data: any) {\n\t\tif (data === undefined || data === null || typeof data !== \"object\") return;\n\t\tconst dt = data[this.id];\n\t\tif (dt === undefined || dt === null || typeof dt !== \"object\") return;\n\n\t\tconst type = dt.$type;\n\n\t\tif (type === \"response\") {\n\t\t\tconst token = dt.$token;\n\t\t\tconst data = dt.$data;\n\t\t\tconst error = dt.$error;\n\t\t\tconst cb = this.promiseCallbacks.get(token);\n\t\t\tif (!cb) return;\n\t\t\tthis.promiseCallbacks.delete(token);\n\t\t\tif (error !== undefined) {\n\t\t\t\tcb.reject(new Error(error));\n\t\t\t} else {\n\t\t\t\tcb.resolve(data);\n\t\t\t}\n\t\t} else if (type === \"request\") {\n\t\t\tconst method = dt.$method as keyof Local;\n\t\t\tconst args = dt.$args as Local[typeof method][0];\n\t\t\t(this.methods[method] as any)(args)\n\t\t\t\t.then((r: any) => {\n\t\t\t\t\tthis.sendRaw(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t[this.id]: {\n\t\t\t\t\t\t\t\t$type: \"response\",\n\t\t\t\t\t\t\t\t$token: dt.$token,\n\t\t\t\t\t\t\t\t$data: r?.[0],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tr?.[1]\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t\t.catch((err: any) => {\n\t\t\t\t\tconsole.error(err);\n\t\t\t\t\tthis.sendRaw(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t[this.id]: {\n\t\t\t\t\t\t\t\t$type: \"response\",\n\t\t\t\t\t\t\t\t$token: dt.$token,\n\t\t\t\t\t\t\t\t$error: err?.toString() || \"Unknown error\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[]\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t}\n\t}\n\n\tcall<Method extends keyof Remote>(\n\t\tmethod: Method,\n\t\targs: Remote[Method][0],\n\t\ttransfer: Transferable[] = []\n\t): Promise<Remote[Method][1]> {\n\t\tconst token = this.counter++;\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.promiseCallbacks.set(token, { resolve, reject });\n\t\t\tthis.sendRaw(\n\t\t\t\t{\n\t\t\t\t\t[this.id]: {\n\t\t\t\t\t\t$type: \"request\",\n\t\t\t\t\t\t$method: method,\n\t\t\t\t\t\t$args: args,\n\t\t\t\t\t\t$token: token,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\ttransfer\n\t\t\t);\n\t\t});\n\t}\n}\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/// <reference lib=\"WebWorker\" />\n/// <reference types=\"@types/serviceworker\" />\nimport { RpcHelper } from \"@mercuryworkshop/rpc\";\nimport type { Controllerbound, SWbound } from \"./types\";\nimport type { RawHeaders } from \"@mercuryworkshop/proxy-transports\";\n\nfunction makeId(): string {\n\treturn Math.random().toString(36).substring(2, 10);\n}\n\nconst cookieResolvers: Record<string, (value: void) => void> = {};\naddEventListener(\"message\", (e) => {\n\tif (!e.data) return;\n\tif (typeof e.data != \"object\") return;\n\tif (e.data.$sw$setCookieDone && typeof e.data.$sw$setCookieDone == \"object\") {\n\t\tconst done = e.data.$sw$setCookieDone;\n\n\t\tconst resolver = cookieResolvers[done.id];\n\t\tif (resolver) {\n\t\t\tresolver();\n\t\t\tdelete cookieResolvers[done.id];\n\t\t}\n\t}\n\n\tif (\n\t\te.data.$sw$initRemoteTransport &&\n\t\ttypeof e.data.$sw$initRemoteTransport == \"object\"\n\t) {\n\t\tconst { port, prefix } = e.data.$sw$initRemoteTransport;\n\n\t\tconst relevantcontroller = tabs.find((tab) =>\n\t\t\tnew URL(prefix).pathname.startsWith(tab.prefix)\n\t\t);\n\t\tif (!relevantcontroller) {\n\t\t\tconsole.error(\"No relevant controller found for transport init\");\n\t\t\treturn;\n\t\t}\n\t\trelevantcontroller.rpc.call(\"initRemoteTransport\", port, [port]);\n\t}\n});\n\nclass ControllerReference {\n\trpc: RpcHelper<SWbound, Controllerbound>;\n\n\tconstructor(\n\t\tpublic prefix: string,\n\t\tpublic id: string,\n\t\tport: MessagePort\n\t) {\n\t\tthis.rpc = new RpcHelper(\n\t\t\t{\n\t\t\t\tsendSetCookie: async ({ cookies, options }) => {\n\t\t\t\t\tconst clients = await self.clients.matchAll();\n\t\t\t\t\tconst ids: string[] = [];\n\t\t\t\t\tconst promises: Promise<string>[] = [];\n\n\t\t\t\t\t// Navigation fetches (document/iframe) deliver cookies via the inject\n\t\t\t\t\t// script's embedded cookieJar dump — the destination page doesn't have\n\t\t\t\t\t// inject.ts loaded yet to ack, so awaiting would deadlock. Broadcast\n\t\t\t\t\t// so any already-loaded clients can update their jars, but don't wait.\n\t\t\t\t\tconst isNavigation =\n\t\t\t\t\t\toptions?.destination === \"document\" ||\n\t\t\t\t\t\toptions?.destination === \"iframe\";\n\n\t\t\t\t\tfor (const client of clients) {\n\t\t\t\t\t\tconst id = makeId();\n\t\t\t\t\t\tids.push(id);\n\t\t\t\t\t\tclient.postMessage({\n\t\t\t\t\t\t\t$controller$setCookie: {\n\t\t\t\t\t\t\t\tcookies,\n\t\t\t\t\t\t\t\toptions,\n\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (!isNavigation) {\n\t\t\t\t\t\t\tpromises.push(\n\t\t\t\t\t\t\t\tnew Promise<string>((resolve) => {\n\t\t\t\t\t\t\t\t\t// Resolve with the id so we know which client replied.\n\t\t\t\t\t\t\t\t\tcookieResolvers[id] = () => resolve(id);\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Wait for the first client to acknowledge the cookie sync.\n\t\t\t\t\t// Using Promise.any (not Promise.all) so that extra SW clients created by\n\t\t\t\t\t// window.open (e.g. test popup windows) don't cause timeouts — only the\n\t\t\t\t\t// main controller client needs to respond.\n\t\t\t\t\tif (promises.length > 0) {\n\t\t\t\t\t\tlet timeoutId: ReturnType<typeof setTimeout> | undefined;\n\t\t\t\t\t\tlet responded = false;\n\t\t\t\t\t\tconst timeoutPromise = new Promise<void>((resolve) => {\n\t\t\t\t\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\t\t\t\t\tif (!responded) {\n\t\t\t\t\t\t\t\t\tconst pending = ids.filter(\n\t\t\t\t\t\t\t\t\t\t(id) => cookieResolvers[id] !== undefined\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t\t\t\"timed out waiting for set cookie response (deadlock?): \" +\n\t\t\t\t\t\t\t\t\t\t\t`cookies=${cookies.length} clients=${clients.length} ` +\n\t\t\t\t\t\t\t\t\t\t\t`pending=${pending.length}/${ids.length} ` +\n\t\t\t\t\t\t\t\t\t\t\t`clientUrls=${clients.map((c) => c.url).join(\",\")}`\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t}, 1000);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait Promise.race([\n\t\t\t\t\t\t\t\ttimeoutPromise,\n\t\t\t\t\t\t\t\tPromise.any(promises)\n\t\t\t\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t\t\t\tresponded = true;\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t.catch(() => {}),\n\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t// Clear the timeout so it doesn't fire spuriously after the\n\t\t\t\t\t\t\t// race has already been won by Promise.any.\n\t\t\t\t\t\t\tif (timeoutId !== undefined) clearTimeout(timeoutId);\n\t\t\t\t\t\t\t// Clean up any pending resolvers so clients that never\n\t\t\t\t\t\t\t// responded don't leak entries in cookieResolvers.\n\t\t\t\t\t\t\tfor (const id of ids) {\n\t\t\t\t\t\t\t\tdelete cookieResolvers[id];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"tabchannel-\" + id,\n\t\t\t(data, transfer) => {\n\t\t\t\tport.postMessage(data, transfer);\n\t\t\t}\n\t\t);\n\t\tport.onmessage = (e: MessageEvent) => {\n\t\t\tthis.rpc.recieve(e.data);\n\t\t};\n\t\tport.onmessageerror = console.error;\n\n\t\tthis.rpc.call(\"ready\", undefined);\n\t}\n}\n\nconst tabs: ControllerReference[] = [];\n\naddEventListener(\"message\", (e) => {\n\tif (!e.data) return;\n\tif (typeof e.data != \"object\") return;\n\tif (!e.data.$controller$init) return;\n\tif (typeof e.data.$controller$init != \"object\") return;\n\tconst init = e.data.$controller$init;\n\n\tconst existing = tabs.findIndex((t) => t.id === init.id);\n\tif (existing !== -1) {\n\t\ttabs.splice(existing, 1);\n\t}\n\ttabs.push(new ControllerReference(init.prefix, init.id, e.ports[0]));\n});\n\nexport function shouldRoute(event: FetchEvent): boolean {\n\tconst url = new URL(event.request.url);\n\tconst tab = tabs.find((tab) => url.pathname.startsWith(tab.prefix));\n\treturn tab !== undefined;\n}\n\nexport async function route(event: FetchEvent): Promise<Response> {\n\ttry {\n\t\tconst url = new URL(event.request.url);\n\t\tconst tab = tabs.find((tab) => url.pathname.startsWith(tab.prefix))!;\n\t\tconst client = await clients.get(event.clientId);\n\n\t\tconst rawheaders: RawHeaders = [...event.request.headers];\n\n\t\tconst response = await tab.rpc.call(\n\t\t\t\"request\",\n\t\t\t{\n\t\t\t\trawUrl: event.request.url,\n\t\t\t\trawReferrer: event.request.referrer,\n\t\t\t\tdestination: event.request.destination,\n\t\t\t\tmode: event.request.mode,\n\t\t\t\treferrer: event.request.referrer,\n\t\t\t\tmethod: event.request.method,\n\t\t\t\tbody: event.request.body,\n\t\t\t\tcache: event.request.cache,\n\t\t\t\tforceCrossOriginIsolated: false,\n\t\t\t\tinitialHeaders: rawheaders,\n\t\t\t\trawClientUrl: client ? client.url : undefined,\n\t\t\t\tclientId: event.clientId || event.resultingClientId,\n\t\t\t},\n\t\t\tevent.request.body instanceof ReadableStream ||\n\t\t\t\t// @ts-expect-error the types for fetchevent are messed up\n\t\t\t\tevent.request.body instanceof ArrayBuffer\n\t\t\t\t? [event.request.body]\n\t\t\t\t: undefined\n\t\t);\n\n\t\treturn new Response(response.body, {\n\t\t\tstatus: response.status,\n\t\t\tstatusText: response.statusText,\n\t\t\theaders: response.headers,\n\t\t});\n\t} catch (e) {\n\t\tconsole.error(\"Service Worker error:\", e);\n\t\treturn new Response(\n\t\t\t\"Internal Service Worker Error: \" + (e as Error).message,\n\t\t\t{\n\t\t\t\tstatus: 500,\n\t\t\t}\n\t\t);\n\t}\n}\n\naddEventListener(\"install\", () => {\n\tself.skipWaiting();\n});\n\naddEventListener(\"activate\", (event: ExtendableEvent) => {\n\tevent.waitUntil(clients.claim());\n});\n\n// the only way to know if a service worker has suddenly died is if this code runs again\n// notify all clients to send over their messageports again\nsetTimeout(async () => {\n\tconsole.log(\"service worker activated, notifying clients to revive\");\n\tfor (const client of await clients.matchAll()) {\n\t\tclient.postMessage({\n\t\t\t$controller$swrevive: {},\n\t\t});\n\t}\n\t// short delay is apparently needed\n}, 100);\n"],"names":["RpcHelper","Map","methods","id","sendRaw","data","dt","type","token","error","cb","undefined","Error","method","args","r","err","console","transfer","Promise","resolve","reject","e","Object","Symbol","cookieResolvers","addEventListener","done","resolver","port","prefix","relevantcontroller","tabs","tab","URL","ControllerReference","cookies","options","clients1","self","ids","promises","isNavigation","client","Math","timeoutId","responded","timeoutPromise","setTimeout","pending","c","clearTimeout","shouldRoute","event","url","route","clients","rawheaders","response","ReadableStream","ArrayBuffer","Response","init","existing","t"],"mappings":"gEAsBO,OAAMA,E,kBAIZ,SAAkB,CAAE,AACpB,kBAGI,IAAIC,GAAM,AACd,aACSC,CAAiC,CACjCC,CAAU,CACVC,CAAsD,CAC7D,C,KAHOF,OAAO,CAAPA,E,KACAC,EAAE,CAAFA,E,KACAC,OAAO,CAAPA,CACN,CAEH,QAAQC,CAAS,CAAE,CAClB,GAAIA,MAAAA,GAAuC,AAAgB,UAAhB,OAAOA,EAAmB,OACrE,IAAMC,EAAKD,CAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CACxB,GAAIC,MAAAA,GAAmC,AAAc,UAAd,OAAOA,EAAiB,OAE/D,IAAMC,EAAOD,EAAG,KAAK,CAErB,GAAIC,AAAS,aAATA,EAAqB,CACxB,IAAMC,EAAQF,EAAG,MAAM,CACjBD,EAAOC,EAAG,KAAK,CACfG,EAAQH,EAAG,MAAM,CACjBI,EAAK,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAACF,GACrC,GAAI,CAACE,EAAI,OACT,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAACF,GACzBC,AAAUE,SAAVF,EACHC,EAAG,MAAM,CAAC,AAAIE,MAAMH,IAEpBC,EAAG,OAAO,CAACL,EAEb,MAAO,GAAIE,AAAS,YAATA,EAAoB,CAC9B,IAAMM,EAASP,EAAG,OAAO,CACnBQ,EAAOR,EAAG,KAAK,CACpB,IAAI,CAAC,OAAO,CAACO,EAAO,CAASC,GAC5B,IAAI,CAAC,AAACC,IACN,IAAI,CAAC,OAAO,CACX,CACC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAE,CACV,MAAO,WACP,OAAQT,EAAG,MAAM,CACjB,MAAOS,GAAG,CAAC,EAAE,AACd,CACD,EACAA,GAAG,CAAC,EAAE,CAER,GACC,KAAK,CAAC,AAACC,IACPC,QAAQ,KAAK,CAACD,GACd,IAAI,CAAC,OAAO,CACX,CACC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAE,CACV,MAAO,WACP,OAAQV,EAAG,MAAM,CACjB,OAAQU,GAAK,YAAc,eAC5B,CACD,EACA,EAAE,CAEJ,EACF,CACD,CAEA,KACCH,CAAc,CACdC,CAAuB,CACvBI,EAA2B,EAAE,CACA,CAC7B,IAAMV,EAAQ,IAAI,CAAC,OAAO,GAC1B,OAAO,IAAIW,QAAQ,CAACC,EAASC,KAC5B,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAACb,EAAO,CAAEY,QAAAA,EAASC,OAAAA,CAAO,GACnD,IAAI,CAAC,OAAO,CACX,CACC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAE,CACV,MAAO,UACP,QAASR,EACT,MAAOC,EACP,OAAQN,CACT,CACD,EACAU,EAEF,EACD,CACD,C,6HC7GA,EAAoB,CAAC,CAAG,CAACI,EAAS,KACjC,IAAI,IAAI,KAAO,EACL,EAAoB,CAAC,CAAC,EAAY,IAAQ,CAAC,EAAoB,CAAC,CAACA,EAAS,IACzEC,OAAO,cAAc,CAACD,EAAS,EAAK,CAAE,WAAY,GAAM,IAAK,CAAU,CAAC,EAAI,AAAC,EAGzF,ECNA,EAAoB,CAAC,CAAG,CAAC,EAAK,IAAUC,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,EAAK,GCClF,EAAoB,CAAC,CAAG,AAACD,IACrB,AAAkB,aAAlB,OAAOE,QAA0BA,OAAO,WAAW,EACrDD,OAAO,cAAc,CAACD,EAASE,OAAO,WAAW,CAAE,CAAE,MAAO,QAAS,GAEtED,OAAO,cAAc,CAACD,EAAS,aAAc,CAAE,MAAO,EAAK,EAC5D,E,0ECIA,IAAMG,EAAyD,CAAC,EAChEC,iBAAiB,UAAW,AAACJ,IAC5B,GAAKA,EAAE,IAAI,EACP,AAAiB,UAAjB,OAAOA,EAAE,IAAI,EACjB,GAAIA,EAAE,IAAI,CAAC,iBAAiB,EAAI,AAAmC,UAAnC,OAAOA,EAAE,IAAI,CAAC,iBAAiB,CAAc,CAC5E,IAAMK,EAAOL,EAAE,IAAI,CAAC,iBAAiB,CAE/BM,EAAWH,CAAe,CAACE,EAAK,EAAE,CAAC,CACrCC,IACHA,IACA,OAAOH,CAAe,CAACE,EAAK,EAAE,CAAC,CAEjC,CAEA,GACCL,EAAE,IAAI,CAAC,uBAAuB,EAC9B,AAAyC,UAAzC,OAAOA,EAAE,IAAI,CAAC,uBAAuB,CACpC,CACD,GAAM,CAAEO,KAAAA,CAAI,CAAEC,OAAAA,CAAM,CAAE,CAAGR,EAAE,IAAI,CAAC,uBAAuB,CAEjDS,EAAqBC,EAAK,IAAI,CAAC,AAACC,GACrC,IAAIC,IAAIJ,GAAQ,QAAQ,CAAC,UAAU,CAACG,EAAI,MAAM,GAE/C,GAAI,CAACF,EAAoB,YACxBd,QAAQ,KAAK,CAAC,mDAGfc,EAAmB,GAAG,CAAC,IAAI,CAAC,sBAAuBF,EAAM,CAACA,EAAK,CAChE,EACD,EAEA,OAAMM,E,SACL,IAAyC,AAEzC,aACQL,CAAc,CACd3B,CAAU,CACjB0B,CAAiB,CAChB,C,KAHMC,MAAM,CAANA,E,KACA3B,EAAE,CAAFA,EAGP,IAAI,CAAC,GAAG,CAAG,IAAIH,EAAAA,CAASA,CACvB,CACC,cAAe,MAAO,CAAEoC,QAAAA,CAAO,CAAEC,QAAAA,CAAO,CAAE,IACzC,IAAMC,EAAU,MAAMC,KAAK,OAAO,CAAC,QAAQ,GACrCC,EAAgB,EAAE,CAClBC,EAA8B,EAAE,CAMhCC,EACLL,GAAS,cAAgB,YACzBA,GAAS,cAAgB,SAE1B,IAAK,IAAMM,KAAUL,EAAS,CAC7B,IAAMnC,EA1DJyC,KAAK,MAAM,GAAG,QAAQ,CAAC,IAAI,SAAS,CAAC,EAAG,IA2D1CJ,EAAI,IAAI,CAACrC,GACTwC,EAAO,WAAW,CAAC,CAClB,sBAAuB,CACtBP,QAAAA,EACAC,QAAAA,EACAlC,GAAAA,CACD,CACD,GACI,AAACuC,GACJD,EAAS,IAAI,CACZ,IAAItB,QAAgB,AAACC,IAEpBK,CAAe,CAACtB,EAAG,CAAG,IAAMiB,EAAQjB,EACrC,GAGH,CAKA,GAAIsC,EAAS,MAAM,CAAG,EAAG,CAExB,IADII,EACAC,EAAY,GACVC,EAAiB,IAAI5B,QAAc,AAACC,IACzCyB,EAAYG,WAAW,KACtB,GAAI,CAACF,EAAW,CACf,IAAMG,EAAUT,EAAI,MAAM,CACzB,AAACrC,GAAOsB,AAAwBd,SAAxBc,CAAe,CAACtB,EAAG,EAE5Bc,QAAQ,KAAK,CAEX,CAAC,+DAAQ,EAAEmB,EAAQ,MAAM,CAAC,SAAS,EAAEE,EAAQ,MAAM,CAClD,SAAQ,EAAEW,EAAQ,MAAM,CAAC,CAAC,EAAET,EAAI,MAAM,CACtC,YAAW,EAAEF,EAAQ,GAAG,CAAC,AAACY,GAAMA,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAFI,CAIzD,CACA9B,GACD,EAAG,IACJ,GAEA,GAAI,CACH,MAAMD,QAAQ,IAAI,CAAC,CAClB4B,EACA5B,QAAQ,GAAG,CAACsB,GACV,IAAI,CAAC,KACLK,EAAY,EACb,GACC,KAAK,CAAC,KAAO,GACf,CACF,QAAU,CAMT,IAAK,IAAM3C,KAHP0C,AAAclC,SAAdkC,GAAyBM,aAAaN,GAGzBL,GAChB,OAAOf,CAAe,CAACtB,EAAG,AAE5B,CACD,CACD,CACD,EACA,cAAgBA,EAChB,CAACE,EAAMa,KACNW,EAAK,WAAW,CAACxB,EAAMa,EACxB,GAEDW,EAAK,SAAS,CAAG,AAACP,IACjB,IAAI,CAAC,GAAG,CAAC,OAAO,CAACA,EAAE,IAAI,CACxB,EACAO,EAAK,cAAc,CAAGZ,QAAQ,KAAK,CAEnC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAASN,OACxB,CACD,CAEA,IAAMqB,EAA8B,EAAE,CAgB/B,SAASoB,EAAYC,CAAiB,EAC5C,IAAMC,EAAM,IAAIpB,IAAImB,EAAM,OAAO,CAAC,GAAG,EAErC,OAAOpB,AAAQtB,SADHqB,EAAK,IAAI,CAAC,AAACC,GAAQqB,EAAI,QAAQ,CAAC,UAAU,CAACrB,EAAI,MAAM,EAElE,CAEO,eAAesB,EAAMF,CAAiB,EAC5C,GAAI,CACH,IAAMC,EAAM,IAAIpB,IAAImB,EAAM,OAAO,CAAC,GAAG,EAC/BpB,EAAMD,EAAK,IAAI,CAAC,AAACC,GAAQqB,EAAI,QAAQ,CAAC,UAAU,CAACrB,EAAI,MAAM,GAC3DU,EAAS,MAAMa,QAAQ,GAAG,CAACH,EAAM,QAAQ,EAEzCI,EAAyB,IAAIJ,EAAM,OAAO,CAAC,OAAO,CAAC,CAEnDK,EAAW,MAAMzB,EAAI,GAAG,CAAC,IAAI,CAClC,UACA,CACC,OAAQoB,EAAM,OAAO,CAAC,GAAG,CACzB,YAAaA,EAAM,OAAO,CAAC,QAAQ,CACnC,YAAaA,EAAM,OAAO,CAAC,WAAW,CACtC,KAAMA,EAAM,OAAO,CAAC,IAAI,CACxB,SAAUA,EAAM,OAAO,CAAC,QAAQ,CAChC,OAAQA,EAAM,OAAO,CAAC,MAAM,CAC5B,KAAMA,EAAM,OAAO,CAAC,IAAI,CACxB,MAAOA,EAAM,OAAO,CAAC,KAAK,CAC1B,yBAA0B,GAC1B,eAAgBI,EAChB,aAAcd,EAASA,EAAO,GAAG,CAAGhC,OACpC,SAAU0C,EAAM,QAAQ,EAAIA,EAAM,iBAAiB,AACpD,EACAA,EAAM,OAAO,CAAC,IAAI,YAAYM,gBAE7BN,EAAM,OAAO,CAAC,IAAI,YAAYO,YAC5B,CAACP,EAAM,OAAO,CAAC,IAAI,CAAC,CACpB1C,QAGJ,OAAO,IAAIkD,SAASH,EAAS,IAAI,CAAE,CAClC,OAAQA,EAAS,MAAM,CACvB,WAAYA,EAAS,UAAU,CAC/B,QAASA,EAAS,OAAO,AAC1B,EACD,CAAE,MAAOpC,EAAG,CAEX,OADAL,QAAQ,KAAK,CAAC,wBAAyBK,GAChC,IAAIuC,SACV,kCAAqCvC,EAAY,OAAO,CACxD,CACC,OAAQ,GACT,EAEF,CACD,CAjEAI,iBAAiB,UAAW,AAACJ,IAC5B,GAAI,CAACA,EAAE,IAAI,EACP,AAAiB,UAAjB,OAAOA,EAAE,IAAI,EACb,CAACA,EAAE,IAAI,CAAC,gBAAgB,EACxB,AAAkC,UAAlC,OAAOA,EAAE,IAAI,CAAC,gBAAgB,CAHrB,OAIb,IAAMwC,EAAOxC,EAAE,IAAI,CAAC,gBAAgB,CAE9ByC,EAAW/B,EAAK,SAAS,CAAC,AAACgC,GAAMA,EAAE,EAAE,GAAKF,EAAK,EAAE,CACnDC,AAAa,MAAbA,GACH/B,EAAK,MAAM,CAAC+B,EAAU,GAEvB/B,EAAK,IAAI,CAAC,IAAIG,EAAoB2B,EAAK,MAAM,CAAEA,EAAK,EAAE,CAAExC,EAAE,KAAK,CAAC,EAAE,EACnE,GAuDAI,iBAAiB,UAAW,KAC3Ba,KAAK,WAAW,EACjB,GAEAb,iBAAiB,WAAY,AAAC2B,IAC7BA,EAAM,SAAS,CAACG,QAAQ,KAAK,GAC9B,GAIAR,WAAW,UAEV,IAAK,IAAML,KADX1B,QAAQ,GAAG,CAAC,yDACS,MAAMuC,QAAQ,QAAQ,IAC1Cb,EAAO,WAAW,CAAC,CAClB,qBAAsB,CAAC,CACxB,EAGF,EAAG,I"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type * as ScramjetGlobal from "@mercuryworkshop/scramjet";
|
|
2
|
+
declare const $scramjet: typeof ScramjetGlobal;
|
|
3
|
+
export declare const CACHE_NAME = "scramjet-http-cache-v2";
|
|
4
|
+
export interface HttpCachePluginOptions {
|
|
5
|
+
/** Name of the underlying Cache API entry. Defaults to CACHE_NAME. */
|
|
6
|
+
cacheName?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* RFC-9111-ish HTTP cache for ScramjetFetchHandler. Subclasses
|
|
10
|
+
* `$scramjet.Plugin` so it composes with the same hook plumbing every other
|
|
11
|
+
* scramjet plugin uses; `install(target)` wires it onto a Frame (or any
|
|
12
|
+
* object exposing a `fetchHandler`), and `bust()` drops the underlying
|
|
13
|
+
* `caches` entry.
|
|
14
|
+
*
|
|
15
|
+
* One instance can be installed onto multiple Frames -- the WeakMap of
|
|
16
|
+
* "did this request come from cache?" book-keeping is per-instance, not
|
|
17
|
+
* per-Frame, so nothing leaks across installs.
|
|
18
|
+
*/
|
|
19
|
+
export declare class HttpCachePlugin extends $scramjet.Plugin {
|
|
20
|
+
readonly cacheName: string;
|
|
21
|
+
private cachePromise;
|
|
22
|
+
private cameFromCache;
|
|
23
|
+
constructor(options?: HttpCachePluginOptions);
|
|
24
|
+
/** Lazy-open the underlying Cache. Memoized for the plugin's lifetime. */
|
|
25
|
+
private openCache;
|
|
26
|
+
/**
|
|
27
|
+
* Wire the cache up to a Frame (or anything exposing `fetchHandler`).
|
|
28
|
+
* Safe to call multiple times across different Frames.
|
|
29
|
+
*/
|
|
30
|
+
install(target: {
|
|
31
|
+
fetchHandler: ScramjetGlobal.ScramjetFetchHandler;
|
|
32
|
+
}): void;
|
|
33
|
+
/**
|
|
34
|
+
* Drop every entry in the HTTP cache. Returns whether the underlying
|
|
35
|
+
* Cache existed and was deleted.
|
|
36
|
+
*/
|
|
37
|
+
bust(): Promise<boolean>;
|
|
38
|
+
}
|
|
39
|
+
export {};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { RpcHelper } from "@mercuryworkshop/rpc";
|
|
2
|
+
import { type ProxyTransport } from "@mercuryworkshop/proxy-transports";
|
|
3
|
+
import type * as ScramjetGlobal from "@mercuryworkshop/scramjet";
|
|
4
|
+
import type { FrameInitHooks, SerializedCookieSyncEntry, Controllerbound, SWbound, FrameErrorHooks } from "./types";
|
|
5
|
+
export { HttpCachePlugin, type HttpCachePluginOptions } from "./cache";
|
|
6
|
+
export type Config = {
|
|
7
|
+
prefix: string;
|
|
8
|
+
scramjetPath: string;
|
|
9
|
+
injectPath: string;
|
|
10
|
+
wasmPath: string;
|
|
11
|
+
virtualWasmPath: string;
|
|
12
|
+
codec: Record<"encode" | "decode", (input: string) => string>;
|
|
13
|
+
};
|
|
14
|
+
export declare const config: Config;
|
|
15
|
+
type ControllerInit = {
|
|
16
|
+
serviceworker: ServiceWorker;
|
|
17
|
+
transport: ProxyTransport;
|
|
18
|
+
config?: Partial<Config>;
|
|
19
|
+
scramjetConfig?: Partial<ScramjetGlobal.ScramjetConfig>;
|
|
20
|
+
};
|
|
21
|
+
export declare class Controller {
|
|
22
|
+
init: ControllerInit;
|
|
23
|
+
id: string;
|
|
24
|
+
config: Config;
|
|
25
|
+
scramjetConfig: ScramjetGlobal.ScramjetConfig;
|
|
26
|
+
prefix: string;
|
|
27
|
+
cookieJar: ScramjetGlobal.CookieJar;
|
|
28
|
+
frames: Frame[];
|
|
29
|
+
serviceWorkerController: ServiceWorker;
|
|
30
|
+
guardServiceWorkerRevive: boolean;
|
|
31
|
+
private ready;
|
|
32
|
+
private readyResolve;
|
|
33
|
+
isReady: boolean;
|
|
34
|
+
rpc: RpcHelper<Controllerbound, SWbound>;
|
|
35
|
+
private port;
|
|
36
|
+
transport: ProxyTransport;
|
|
37
|
+
private cookieUpdatedAt;
|
|
38
|
+
private cookieSyncPromise;
|
|
39
|
+
private cookieSyncDirty;
|
|
40
|
+
private cookieSyncChannel;
|
|
41
|
+
private wasmAlreadyFetched;
|
|
42
|
+
private wasmPayload;
|
|
43
|
+
private onTabChannelMessage;
|
|
44
|
+
private onCookieSyncMessage;
|
|
45
|
+
private loadScramjetWasm;
|
|
46
|
+
private methods;
|
|
47
|
+
constructor(init: ControllerInit);
|
|
48
|
+
private setupMessagePort;
|
|
49
|
+
private applyCookieSyncEntries;
|
|
50
|
+
propagateCookieSync(cookies: SerializedCookieSyncEntry[], options?: ScramjetGlobal.CookieSyncOptions): Promise<void>;
|
|
51
|
+
private loadSavedCookies;
|
|
52
|
+
persistCookies(): Promise<void>;
|
|
53
|
+
setTransport(transport: ProxyTransport): void;
|
|
54
|
+
createFrame(element?: HTMLIFrameElement): Frame;
|
|
55
|
+
wait(): Promise<void>;
|
|
56
|
+
}
|
|
57
|
+
export declare class Frame {
|
|
58
|
+
controller: Controller;
|
|
59
|
+
element: HTMLIFrameElement;
|
|
60
|
+
id: string;
|
|
61
|
+
prefix: string;
|
|
62
|
+
fetchHandler: ScramjetGlobal.ScramjetFetchHandler;
|
|
63
|
+
hooks: {
|
|
64
|
+
fetch: ScramjetGlobal.FetchHooks;
|
|
65
|
+
init: FrameInitHooks;
|
|
66
|
+
error: FrameErrorHooks;
|
|
67
|
+
};
|
|
68
|
+
get context(): ScramjetGlobal.ScramjetContext;
|
|
69
|
+
constructor(controller: Controller, element: HTMLIFrameElement);
|
|
70
|
+
back(): void;
|
|
71
|
+
forward(): void;
|
|
72
|
+
reload(): void;
|
|
73
|
+
go(url: string): void;
|
|
74
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type * as ScramjetGlobal from "@mercuryworkshop/scramjet";
|
|
2
|
+
import type { RawHeaders } from "@mercuryworkshop/proxy-transports";
|
|
3
|
+
import type { Config } from ".";
|
|
4
|
+
type Init = {
|
|
5
|
+
config: Config;
|
|
6
|
+
sjconfig: ScramjetGlobal.ScramjetConfig;
|
|
7
|
+
prefix: URL;
|
|
8
|
+
cookies: string;
|
|
9
|
+
yieldGetInjectScripts: (config: Config, sjconfig: ScramjetGlobal.ScramjetConfig, prefix: URL, cookieJar: ScramjetGlobal.CookieJar, codecEncode: (input: string) => string, codecDecode: (input: string) => string) => any;
|
|
10
|
+
codecEncode: (input: string) => string;
|
|
11
|
+
codecDecode: (input: string) => string;
|
|
12
|
+
initHeaders: RawHeaders;
|
|
13
|
+
history: ScramjetGlobal.TrackedHistoryState[];
|
|
14
|
+
};
|
|
15
|
+
export declare function load(init: Init): void;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const CONTROLLERFRAME: unique symbol;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mercuryworkshop/scramjet-controller",
|
|
3
|
+
"version": "0.0.11",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "index.ts",
|
|
6
|
+
"types": "./dist/types/typesEntry.d.ts",
|
|
7
|
+
"dependencies": {
|
|
8
|
+
"@fastify/deepmerge": "^3.2.1",
|
|
9
|
+
"@mercuryworkshop/proxy-transports": "1.0.2",
|
|
10
|
+
"@mercuryworkshop/scramjet": "2.0.5-alpha"
|
|
11
|
+
},
|
|
12
|
+
"devDependencies": {
|
|
13
|
+
"@types/serviceworker": "^0.0.197",
|
|
14
|
+
"@mercuryworkshop/rpc": "0.0.1"
|
|
15
|
+
}
|
|
16
|
+
}
|