Repository navigation
Expand file tree
/
Copy pathcontroller.api.js
More file actions
41 lines (36 loc) · 16.7 KB
/
Copy pathcontroller.api.js
File metadata and controls
41 lines (36 loc) · 16.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
var $scramjetController;(()=>{var e={286(e,t,r){r.d(t,{I:()=>o});let o=Symbol.for("controller frame handle")},355(e,t,r){r.d(t,{O:()=>s,x:()=>o});let o="0.0.14";function s(){if("undefined"==typeof $scramjet)throw Error("@mercuryworkshop/scramjet is not loaded. Load scramjet before the controller.");var e="2.0.67-alpha.2",t=$scramjet.versionInfo.version;if(e!==t)throw Error(`@mercuryworkshop/scramjet version mismatch: this build expects ${e}, but the loaded runtime is ${t}`)}},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)})}}},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,i=e?.symbols?function(e){let t=Object.keys(e),r=Object.getOwnPropertySymbols(e);for(let o=0,i=r.length;o<i;++o)s.call(e,r[o])&&t.push(r[o]);return t}:Object.keys,n="function"==typeof e?.cloneProtoObject?e.cloneProtoObject:void 0,a="function"==typeof e?.isMergeableObject?e.isMergeableObject:r(),c=e?.onlyDefinedProperties===!0,l=e&&"function"==typeof e.mergeArray?e.mergeArray({clone:d,deepmerge:h,getKeys:i,isMergeableObject:a}):function(e,t){let r=e.length,o=t.length,s=0,i=Array(r+o);for(;s<r;++s)i[s]=d(e[s]);for(s=0;s<o;++s)i[s+r]=d(t[s]);return i};function d(e){return a(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,a,c={};if(n&&Object.getPrototypeOf(e)!==t)return n(e);let l=i(e);for(r=0,s=l.length;r<s;++r)o(a=l[r])&&(c[a]=d(e[a]));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:a(e)?s&&f?l(e,r):s!==f?d(r):function(e,r){let s,l,f,p={},u=i(e),y=i(r);for(s=0,l=u.length;s<l;++s)o(f=u[s])&&-1===y.indexOf(f)&&(p[f]=d(e[f]));for(s=0,l=y.length;s<l;++s)if(o(f=y[s]))if(f in e)-1!==u.indexOf(f)&&(n&&a(r[f])&&Object.getPrototypeOf(r[f])!==t?p[f]=n(r[f]):p[f]=h(e[f],r[f]));else{if(c&&void 0===r[f])continue;p[f]=d(r[f])}return p}(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 s(o.includes(e.status)?void 0:e.body,{headers:new Headers(e.headers),status:e.status,statusText:e.statusText});return r.url=t,r.redirected=e.status>=300&&e.status<400&&void 0!==e.headers.location,r.rawHeaders=e.headers,r}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}}},423(e,t,r){r.d(t,{Cx:()=>p,Oy:()=>G,cP:()=>s,ht:()=>z,k_:()=>n,mK:()=>d,sb:()=>y,uh:()=>f});let{BareResponse:o,CookieJar:s,IncrementalHtmlRewriter:i,Plugin:n,SCRAMJETCLIENT:a,SCRAMJETCLIENTNAME:c,ScramjetClient:l,ScramjetFetchHandler:d,ScramjetFetchTrackedClient:h,ScramjetHeaders:f,Tap:p,createLocationProxy:u,defaultConfig:y,defaultConfigDev:m,flagEnabled:g,getOwnPropertyDescriptorHandler:w,getRewriter:k,getScriptBlockTypeString:b,htmlRules:j,isArchiveMimeType:S,isAudioOrVideoMimeType:v,isFontMimeType:C,isHtmlMimeType:x,isImageMimeType:$,isInlineDisplayableMimeType:P,isJavascriptMimeType:O,isJavascriptMimeTypeEssenceMatch:R,isModuleScriptType:A,isScriptType:E,isScriptableMimeType:U,isXmlMimeType:M,isZipBasedMimeType:W,isdedicated:T,isshared:D,issw:I,iswindow:L,isworker:N,parseMimeType:_,rewriteBlob:J,rewriteCss:H,rewriteHtml:q,rewriteJs:F,rewriteJsInner:B,rewriteSrcset:K,rewriteUrl:G,rewriteWorkers:V,setWasm:z,unrewriteBlob:Q,unrewriteCss:X,unrewriteHtml:Y,unrewriteUrl:Z,versionInfo:ee}=globalThis.$scramjet}},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.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:()=>S,Frame:()=>v,ManagedPlugin:()=>d,VERSION:()=>a.x,assertRuntimeScramjetVersion:()=>a.O,config:()=>c});var e=r(805),t=r(235),s=r(986),i=r(423),n=r(286),a=r(355);let c={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}},l={flags:{...i.sb.flags,allowFailedIntercepts:!0},maskedfiles:["inject.js","scramjet.wasm.js"]};class d extends i.k_{frame=null;dependencies=[];constructor(e,t){super(e),this.dependencies=t}install(e){this.frame=e}}let h="state",f="cookies",p=null;function u(e){return"object"==typeof e&&null!==e&&"number"==typeof e.updatedAt&&Number.isFinite(e.updatedAt)&&"string"==typeof e.cookies?e:null}function y(e){return new Promise((t,r)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>r(e.error??Error("IndexedDB request failed"))})}function m(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 g(){return p||(p=new Promise((e,t)=>{let r=indexedDB.open("__scramjet_controller",1);r.onupgradeneeded=()=>{let e=r.result;e.objectStoreNames.contains(h)||e.createObjectStore(h)},r.onsuccess=()=>e(r.result),r.onerror=()=>t(r.error??Error("Failed to open cookie database"))}))}async function w(){try{let e=(await g()).transaction(h,"readonly"),t=e.objectStore(h),r=await y(t.get(f));return await m(e),u(r)}catch(e){return console.error("Failed to read persisted controller cookies:",e),null}}async function k(e,t){try{let r=(await g()).transaction(h,"readwrite"),o=r.objectStore(h),s=u(await y(o.get(f))),i=Math.max(Date.now(),t+1,(s?.updatedAt??0)+1);return o.put({updatedAt:i,cookies:e},f),await m(r),i}catch(e){return console.error("Failed to persist controller cookies:",e),t}}function b(){return Math.random().toString(36).substring(2,10)}let j=(0,s.deepmerge)();class S{init;id;config;scramjetConfig;prefix;cookieJar=new i.cP;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);(0,i.ht)(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=i.uh.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 i.Cx.dispatch(r.hooks.error.request,{rawrequest:e,error:o},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,i=new Promise(e=>s=e),[n,a]=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&&a(e.code,e.reason)},[await i,[]]}},"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,(0,a.O)(),this.id=b(),this.config=j(c,t.config||{}),this.scramjetConfig=j(l,i.sb),this.scramjetConfig=j(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 w();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 k(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,t={}){if(!this.ready)throw Error("Controller is not ready! Try awaiting controller.wait()");let r=new v(this,e??=document.createElement("iframe"),t);return this.frames.push(r),r}async wait(){await this.ready}}class v{controller;element;options;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,i,n){return(a,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=`
document.querySelectorAll("script[scramjet-injected]").forEach(script => script.remove());
$scramjetController.load({
config: ${JSON.stringify(t)},
sjconfig: ${JSON.stringify(r)},
prefix: new URL("${o.href}"),
cookies: ${JSON.stringify(s.dump())},
yieldGetInjectScripts: ${e.toString()},
codecEncode: ${i.toString()},
codecDecode: ${n.toString()},
initHeaders: ${JSON.stringify(l.headers??[])},
history: ${JSON.stringify(l.history??[])},
})
`,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=`
(()=>{
const { ScramjetClient, CookieJar, setWasm } = $scramjet;
setWasm(Uint8Array.from(atob(self.WASM), (c) => c.charCodeAt(0)));
delete self.WASM;
const sjconfig = ${JSON.stringify(this.controller.scramjetConfig)};
const prefix = new URL("${this.prefix}", location.href);
const context = {
config: sjconfig,
prefix,
interface: {
codecEncode: ${this.controller.config.codec.encode.toString()},
codecDecode: ${this.controller.config.codec.decode.toString()},
},
};
const client = new ScramjetClient(globalThis, {
context,
transport: null,
});
client.hook();
})();
`,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}}}plugins=[];constructor(e,r,o={}){for(const s of(this.controller=e,this.element=r,this.options=o,this.id=b(),this.prefix=this.controller.prefix+this.id+"/",this.fetchHandler=new i.mK({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:i.Cx.create(),error:i.Cx.create()},r[n.I]=this,this.plugins=o.plugins??[],this.plugins)){for(const e of s.dependencies)if(!this.plugins.find(t=>t.name===e))throw Error(`Dependency ${e} not found for plugin ${s.name}`);s.install(this)}}getPlugin(e){let t=this.plugins.find(t=>t.name===e);if(!t)throw Error(`Plugin ${e} not found`);return t}back(){this.element.contentWindow?.history.back()}forward(){this.element.contentWindow?.history.forward()}reload(){this.element.contentWindow?.location.reload()}go(e){let t=(0,i.Oy)(e,this.context,{origin:new URL(location.href),base:new URL(location.href)});this.element.src=t}}})(),$scramjetController=o})();
//# sourceMappingURL=controller.api.js.map