generated from hrbrmstr/slightly-more-than-minimal
-
Notifications
You must be signed in to change notification settings - Fork 0
/
webr.mjs
4 lines (4 loc) · 35.8 KB
/
webr.mjs
1
2
3
4
var sr=Object.create;var St=Object.defineProperty;var or=Object.getOwnPropertyDescriptor;var ar=Object.getOwnPropertyNames;var ir=Object.getPrototypeOf,lr=Object.prototype.hasOwnProperty;var M=(r=>typeof require!="undefined"?require:typeof Proxy!="undefined"?new Proxy(r,{get:(e,t)=>(typeof require!="undefined"?require:e)[t]}):r)(function(r){if(typeof require!="undefined")return require.apply(this,arguments);throw new Error('Dynamic require of "'+r+'" is not supported')});var pr=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of ar(e))!lr.call(r,s)&&s!==t&&St(r,s,{get:()=>e[s],enumerable:!(n=or(e,s))||n.enumerable});return r};var Oe=(r,e,t)=>(t=r!=null?sr(ir(r)):{},pr(e||!r||!r.__esModule?St(t,"default",{value:r,enumerable:!0}):t,r));var ut=(r,e,t)=>{if(!e.has(r))throw TypeError("Cannot "+t)};var o=(r,e,t)=>(ut(r,e,"read from private field"),t?t.call(r):e.get(r)),u=(r,e,t)=>{if(e.has(r))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(r):e.set(r,t)},c=(r,e,t,n)=>(ut(r,e,"write to private field"),n?n.call(r,t):e.set(r,t),t);var P=(r,e,t)=>(ut(r,e,"access private method"),t);var f=typeof process<"u"&&process.release&&process.release.name==="node",ct;if(globalThis.document)ct=r=>new Promise((e,t)=>{let n=document.createElement("script");n.src=r,n.onload=()=>e(),n.onerror=t,document.head.appendChild(n)});else if(globalThis.importScripts)ct=async r=>{try{globalThis.importScripts(r)}catch(e){if(e instanceof TypeError)await Promise.resolve().then(()=>Oe(M(r)));else throw e}};else if(f)ct=async r=>{let e=(await Promise.resolve().then(()=>Oe(M("path")))).default;await Promise.resolve().then(()=>Oe(M(e.resolve(r))))};else throw new Error("Cannot determine runtime environment");function J(){let r={resolve:t=>{},reject:t=>{},promise:null},e=new Promise((t,n)=>{r.resolve=t,r.reject=n});return r.promise=e,r}function Ot(r){return new Promise(e=>setTimeout(e,r))}function E(r,e,t,...n){return r===null||typeof r!="object"?r:e(r)?t(r,...n):Array.isArray(r)||ArrayBuffer.isView(r)?r.map(s=>E(s,e,t,...n)):Object.fromEntries(Object.entries(r).map(([s,a],l)=>[s,E(a,e,t,...n)]))}function De(r,e){let t=new XMLHttpRequest;t.open("get",r,!0),t.onload=()=>{let n=new Worker(URL.createObjectURL(new Blob([t.responseText])));e(n)},t.send()}function V(r){if(f)return!1;let e=new URL(location.href),t=new URL(r,location.origin);return!(e.host===t.host&&e.port===t.port&&e.protocol===t.protocol)}var ur=new WeakMap;function Dt(r,e){return ur.set(r,e),r}var Me=63;function Ae(){let r=Array.from({length:4},cr).join("-");if(r.length!==Me)throw new Error("comlink internal error: UUID has the wrong length");return r}function cr(){let r=Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16),e=15-r.length;return e>0&&(r=Array.from({length:e},()=>0).join("")+r),r}function Ce(r,e){return Mt({type:"request",data:{uuid:Ae(),msg:r}},e)}function Rt(r,e,t){return Mt({type:"response",data:{uuid:r,resp:e}},t)}function Mt(r,e){return e&&Dt(r,e),r}function At(r,e){return{type:"sync-request",data:{msg:r,reqData:e}}}var Rr=new TextEncoder,yr=new TextDecoder("utf-8");function je(r){return Rr.encode(JSON.stringify(r))}function Ie(r){return JSON.parse(yr.decode(r))}var dr=new TextEncoder;async function jt(r,e,t){try{let{taskId:n,sizeBuffer:s,dataBuffer:a,signalBuffer:l}=e,p=je(t),y=p.length<=a.length;if(Atomics.store(s,0,p.length),Atomics.store(s,1,+y),!y){let[x,ne]=hr(r);a.set(dr.encode(x)),await Ct(l,n),a=(await ne).dataBuffer}a.set(p),Atomics.store(s,1,1),await Ct(l,n)}catch(n){console.warn(n)}}function hr(r){let e=Ae();return[e,new Promise(t=>{f?r.once("message",n=>{!n.id||n.id!==e||t(n)}):r.addEventListener("message",function n(s){!s.data||!s.data.id||s.data.id!==e||(r.removeEventListener("message",n),t(s.data))}),r.start&&r.start()})]}async function Ct(r,e){let t=(e>>1)%32,n=1;for(;Atomics.compareExchange(r,t+1,0,e)!==0;)await Ot(n),n<32&&(n*=2);Atomics.or(r,0,1<<t),Atomics.notify(r,0)}var W,S,oe,yt,se=class{constructor(){u(this,oe);u(this,W,void 0);u(this,S,void 0);c(this,S,[]),c(this,W,[])}put(e){o(this,S).length||P(this,oe,yt).call(this),o(this,S).shift()(e)}async get(){return o(this,W).length||P(this,oe,yt).call(this),o(this,W).shift()}isEmpty(){return!o(this,W).length}isBlocked(){return!!o(this,S).length}get length(){return o(this,W).length-o(this,S).length}};W=new WeakMap,S=new WeakMap,oe=new WeakSet,yt=function(){o(this,W).push(new Promise(e=>{o(this,S).push(e)}))};function It(r){let e=new Error(r.obj.message);return e.name=r.obj.name,e.stack=r.obj.stack,e}function mr(r){return r&&typeof r=="object"&&"payloadType"in r&&"obj"in r}function Le(r){return mr(r)&&r.payloadType==="ptr"}var H,G=class{constructor(){this.inputQueue=new se;this.outputQueue=new se;u(this,H,new Map)}async read(){return await this.outputQueue.get()}async flush(){let e=[];for(;!this.outputQueue.isEmpty();)e.push(await this.read());return e}write(e){this.inputQueue.put(e)}async request(e,t){let n=Ce(e,t),{resolve:s,reject:a,promise:l}=J();return o(this,H).set(n.data.uuid,{resolve:s,reject:a}),this.write(n),l}resolveResponse(e){let t=e.data.uuid,n=o(this,H).get(t);if(n){let s=e.data.resp;o(this,H).delete(t),s.payloadType==="err"?n.reject(It(s)):n.resolve(s)}else console.warn("Can't find request.")}};H=new WeakMap;var br=new TextDecoder("utf-8"),$,X,ae,ie,z,Be=class{constructor(e,t,n=[]){u(this,$,!1);u(this,X,void 0);u(this,ae,void 0);u(this,ie,void 0);u(this,z,void 0);this.syncifier=new dt;this.endpoint=e,this.msg=t,this.transfers=n,c(this,X,!1)}scheduleSync(){if(!o(this,$))return c(this,$,!0),this.syncifier.scheduleTask(this),c(this,z,this.doSync()),o(this,z).next(),this}poll(){if(!o(this,$))throw new Error("Task not synchronously scheduled");let{done:e,value:t}=o(this,z).next();return e?(c(this,X,!0),c(this,ae,t),!0):!1}*doSync(){let{endpoint:e,msg:t,transfers:n}=this,s=new Int32Array(new SharedArrayBuffer(8)),a=this.signalBuffer,l=this.taskId,p=Nt(Me),y=At(t,{sizeBuffer:s,dataBuffer:p,signalBuffer:a,taskId:l});if(e.postMessage(y,n),yield,Atomics.load(s,1)===0){let ne=br.decode(p.slice(0,Me));gr(p);let nr=Atomics.load(s,0);p=Nt(nr),e.postMessage({id:ne,dataBuffer:p}),yield}let x=Atomics.load(s,0);return Ie(p.slice(0,x))}get result(){if(o(this,ie))throw o(this,ie);if(o(this,X))return o(this,ae);throw new Error("Not ready.")}syncify(){return this.scheduleSync(),this.syncifier.syncifyTask(this),this.result}};$=new WeakMap,X=new WeakMap,ae=new WeakMap,ie=new WeakMap,z=new WeakMap;var dt=class{constructor(){this.nextTaskId=new Int32Array([1]),this.signalBuffer=new Int32Array(new SharedArrayBuffer(32*4+4)),this.tasks=new Map}scheduleTask(e){e.taskId=this.nextTaskId[0],this.nextTaskId[0]+=2,e.signalBuffer=this.signalBuffer,this.tasks.set(e.taskId,e)}waitOnSignalBuffer(){for(;;)switch(Atomics.wait(this.signalBuffer,0,0,50)){case"ok":case"not-equal":return;case"timed-out":ht[0]!==0&&Ut();break;default:throw new Error("Unreachable")}}*tasksIdsToWakeup(){let e=Atomics.load(this.signalBuffer,0);for(let t=0;t<32;t++){let n=1<<t;e&n&&(Atomics.and(this.signalBuffer,0,~n),yield Atomics.exchange(this.signalBuffer,t+1,0))}}pollTasks(e){let t=!1;for(let n of this.tasksIdsToWakeup()){let s=this.tasks.get(n);if(!s)throw new Error(`Assertion error: unknown taskId ${n}.`);s.poll()&&(this.tasks.delete(n),s===e&&(t=!0))}return t}syncifyTask(e){for(;;)if(this.waitOnSignalBuffer(),this.pollTasks(e))return}},Fe=[];function Nt(r){let e=Math.ceil(Math.log2(r));Fe[e]||(Fe[e]=[]);let t=Fe[e].pop();return t?(t.fill(0),t):new Uint8Array(new SharedArrayBuffer(2**e))}function gr(r){let e=Math.ceil(Math.log2(r.byteLength));Fe[e].push(r)}var ht=new Int32Array(new ArrayBuffer(4)),Ut=()=>{throw ht[0]=0,new Error("Interrupted!")};function Lt(r){Ut=r}function Ft(r){ht=new Int32Array(r)}var i={};function Bt(r){Object.keys(r).forEach(e=>i._free(r[e]))}f&&(globalThis.Worker=M("worker_threads").Worker);var Z,qe,qt,pe,le=class extends G{constructor(t){super();u(this,qe);u(this,Z,void 0);this.close=()=>{};u(this,pe,async(t,n)=>{if(!(!n||!n.type))switch(n.type){case"resolve":c(this,Z,new Int32Array(n.data)),this.resolve();return;case"response":this.resolveResponse(n);return;default:this.outputQueue.put(n);return;case"sync-request":{let s=n,a=s.data.msg,l=s.data.reqData;switch(a.type){case"read":{let p=await this.inputQueue.get();await jt(t,l,p);break}default:throw new TypeError(`Unsupported request type '${a.type}'.`)}return}case"request":throw new TypeError("Can't send messages of type 'request' from a worker. Please Use 'sync-request' instead.")}});let n=s=>{P(this,qe,qt).call(this,s),this.close=()=>s.terminate();let a={type:"init",data:{config:t,channelType:O.SharedArrayBuffer}};s.postMessage(a)};if(V(t.baseUrl))De(`${t.baseUrl}webr-worker.js`,s=>n(s));else{let s=new Worker(`${t.baseUrl}webr-worker.js`);n(s)}({resolve:this.resolve,promise:this.initialised}=J())}interrupt(){if(!o(this,Z))throw new Error("Failed attempt to interrupt before initialising interruptBuffer");o(this,Z)[0]=1}};Z=new WeakMap,qe=new WeakSet,qt=function(t){f?t.on("message",n=>{o(this,pe).call(this,t,n)}):t.onmessage=n=>o(this,pe).call(this,t,n.data)},pe=new WeakMap;var Q,ue,N,ce,mt=class{constructor(){u(this,Q,void 0);u(this,ue,()=>0);u(this,N,new Int32Array(new SharedArrayBuffer(4)));u(this,ce,()=>{});c(this,Q,f?M("worker_threads").parentPort:globalThis),Ft(o(this,N).buffer),Lt(()=>this.handleInterrupt())}resolve(){this.write({type:"resolve",data:o(this,N).buffer})}write(e,t){o(this,Q).postMessage(e,t)}read(){let e={type:"read"};return new Be(o(this,Q),e).syncify()}inputOrDispatch(){for(;;){let e=this.read();if(e.type==="stdin")return i.allocateUTF8(e.data);o(this,ue).call(this,e)}}run(e){i.callMain(e)}setInterrupt(e){c(this,ce,e)}handleInterrupt(){o(this,N)[0]!==0&&(o(this,N)[0]=0,o(this,ce).call(this))}setDispatchHandler(e){c(this,ue,e)}};Q=new WeakMap,ue=new WeakMap,N=new WeakMap,ce=new WeakMap;f&&(globalThis.Worker=M("worker_threads").Worker);var K,U,Y,Je,Jt,Ve,Vt,He,Ht,ye,Re=class extends G{constructor(t){super();u(this,Je);u(this,Ve);u(this,He);this.close=()=>{};u(this,K,new Map);u(this,U,void 0);u(this,Y,!1);u(this,ye,async(t,n)=>{if(!(!n||!n.type))switch(n.type){case"resolve":this.resolve();return;case"response":this.resolveResponse(n);return;default:this.outputQueue.put(n);return;case"sync-request":{let s=n.data;o(this,K).set(s.data.uuid,s.data.msg);return}case"request":throw new TypeError("Can't send messages of type 'request' from a worker.Use service worker fetch request instead.")}});let n=s=>{P(this,He,Ht).call(this,s),this.close=()=>s.terminate(),P(this,Je,Jt).call(this,`${t.serviceWorkerUrl}webr-serviceworker.js`).then(a=>{let l={type:"init",data:{config:t,channelType:O.ServiceWorker,clientId:a,location:window.location.href}};s.postMessage(l)})};if(V(t.serviceWorkerUrl))De(`${t.serviceWorkerUrl}webr-worker.js`,s=>n(s));else{let s=new Worker(`${t.serviceWorkerUrl}webr-worker.js`);n(s)}({resolve:this.resolve,promise:this.initialised}=J())}activeRegistration(){var t;if(!((t=o(this,U))!=null&&t.active))throw new Error("Attempted to obtain a non-existent active registration.");return o(this,U).active}interrupt(){c(this,Y,!0)}};K=new WeakMap,U=new WeakMap,Y=new WeakMap,Je=new WeakSet,Jt=async function(t){c(this,U,await navigator.serviceWorker.register(t)),await navigator.serviceWorker.ready,window.addEventListener("beforeunload",()=>{var s;(s=o(this,U))==null||s.unregister()});let n=await new Promise(s=>{navigator.serviceWorker.addEventListener("message",function a(l){l.data.type==="registration-successful"&&(navigator.serviceWorker.removeEventListener("message",a),s(l.data.clientId))}),this.activeRegistration().postMessage({type:"register-client-main"})});return navigator.serviceWorker.addEventListener("message",s=>{P(this,Ve,Vt).call(this,s)}),n},Ve=new WeakSet,Vt=async function(t){if(t.data.type==="request"){let n=t.data.data,s=o(this,K).get(n);if(!s)throw new Error("Request not found during service worker XHR request");switch(o(this,K).delete(n),s.type){case"read":{let a=await this.inputQueue.get();this.activeRegistration().postMessage({type:"wasm-webr-fetch-response",uuid:n,response:Rt(n,a)});break}case"interrupt":{let a=o(this,Y);this.activeRegistration().postMessage({type:"wasm-webr-fetch-response",uuid:n,response:Rt(n,a)}),c(this,Y,!1);break}default:throw new TypeError(`Unsupported request type '${s.type}'.`)}return}},He=new WeakSet,Ht=function(t){f?t.on("message",n=>{o(this,ye).call(this,t,n)}):t.onmessage=n=>o(this,ye).call(this,t,n.data)},ye=new WeakMap;var de,he,me,fe,be,ft=class{constructor(e){u(this,de,void 0);u(this,he,void 0);u(this,me,void 0);u(this,fe,()=>0);u(this,be,()=>{});this.onMessageFromMainThread=()=>{};if(!e.clientId||!e.location)throw Error("Can't start service worker channel");c(this,he,e.clientId),c(this,me,e.location),c(this,de,f?M("worker_threads").parentPort:globalThis)}resolve(){this.write({type:"resolve"})}write(e,t){o(this,de).postMessage(e,t)}syncRequest(e){let t=Ce(e);this.write({type:"sync-request",data:t});let n=0;for(;;)try{let s=new URL("__wasm__/webr-fetch-request/",o(this,me)),a=new XMLHttpRequest;a.timeout=6e4,a.responseType="arraybuffer",a.open("POST",s,!1);let l={clientId:o(this,he),uuid:t.data.uuid};return a.send(je(l)),Ie(new Uint8Array(a.response))}catch(s){if(s instanceof DOMException&&n++<1e3)console.log("Service worker request failed - resending request");else throw s}}read(){return this.syncRequest({type:"read"}).data.resp}inputOrDispatch(){for(;;){let e=this.read();if(e.type==="stdin")return i.allocateUTF8(e.data);o(this,fe).call(this,e)}}run(e){i.callMain(e)}setInterrupt(e){c(this,be,e)}handleInterrupt(){this.syncRequest({type:"interrupt"}).data.resp&&o(this,be).call(this)}setDispatchHandler(e){c(this,fe,e)}};de=new WeakMap,he=new WeakMap,me=new WeakMap,fe=new WeakMap,be=new WeakMap;var O={Automatic:0,SharedArrayBuffer:1,ServiceWorker:2};function Gt(r){switch(r.channelType){case O.SharedArrayBuffer:return new le(r);case O.ServiceWorker:return new Re(r);case O.Automatic:default:if(f||crossOriginIsolated)return new le(r);if("serviceWorker"in navigator&&!V(r.serviceWorkerUrl))return new Re(r);throw new Error("Can't initialise main thread communication channel")}}var $t=f?__dirname+"/":"./",Xt="https://repo.r-wasm.org";function D(r){return r&&(typeof r=="object"||typeof r=="function")&&"payloadType"in r&&Le(r._payload)}function zt(r){var e;return Boolean(D(r)&&((e=r._payload.obj.methods)==null?void 0:e.includes("exec")))}var d={null:0,symbol:1,pairlist:2,closure:3,environment:4,promise:5,call:6,special:7,builtin:8,string:9,logical:10,integer:13,double:14,complex:15,character:16,dots:17,any:18,list:19,expression:20,bytecode:21,pointer:22,weakref:23,raw:24,s4:25,new:30,free:31,function:99};function bt(r){return r&&typeof r=="object"&&Object.keys(d).includes(r.type)}function gt(r){return r&&typeof r=="object"&&"re"in r&&"im"in r}function Ge(r){return i._Rf_protect(k(r)),r}function w(r,e){return i._Rf_protect(k(r)),++e.n,r}function Zt(r){let e=i._malloc(4);return i._R_ProtectWithIndex(k(r),e),{loc:i.getValue(e,"i32"),ptr:e}}function Qt(r){i._Rf_unprotect(1),i._free(r.ptr)}function Kt(r,e){return i._R_Reprotect(k(r),e.loc),r}function _(r){i._Rf_unprotect(r)}function wt(r,e,t){i._Rf_defineVar(k(e),k(t),k(r))}function Yt(r,e){let t={},n={n:0};try{let s=new we(e);w(s,n),t.code=i.allocateUTF8(r);let a=i._R_ParseEvalString(t.code,s.ptr);return R.wrap(a)}finally{Bt(t),_(n.n)}}function ge(r,e){return i.LDSO.loadedLibsByName["/usr/lib/R/library/webr/libs/webr.so"].module.ffi_safe_eval(k(r),k(e))}function k(r){return xr(r)?r.ptr:r}function q(r,e){if(i._TYPEOF(r.ptr)!==d[e])throw new Error(`Unexpected object type "${r.type()}" when expecting type "${e}"`)}function Pr(r){if(bt(r))return new(er(d[r.type]))(r);if(r&&typeof r=="object"&&"type"in r&&r.type==="null")return new Ze;if(r===null)return new F({type:"logical",names:null,values:[null]});if(typeof r=="boolean")return new F(r);if(typeof r=="number")return new Pe(r);if(typeof r=="string")return new A(r);if(gt(r))return new ve(r);if(Array.isArray(r))return vr(r);throw new Error("Robj construction for this JS object is not yet supported")}function vr(r){let e={n:0};try{let t=new B([new C("c"),...r]);return w(t,e),t.eval()}finally{_(e.n)}}var g=class{constructor(e){this.ptr=e}type(){let e=i._TYPEOF(this.ptr);return Object.keys(d).find(n=>d[n]===e)}},te,$e,L=class extends g{constructor(t){if(!(t instanceof g))return Pr(t);super(t.ptr);u(this,te)}static wrap(t){let n=i._TYPEOF(t);return new(er(n))(new g(t))}get[Symbol.toStringTag](){return`RObject:${this.type()}`}static getPersistentObject(t){return v[t]}getPropertyValue(t){return this[t]}inspect(){Yt(".Internal(inspect(x))",{x:this})}isNull(){return i._TYPEOF(this.ptr)===d.null}isUnbound(){return this.ptr===v.unboundValue.ptr}attrs(){return re.wrap(i._ATTRIB(this.ptr))}setNames(t){let n;if(t===null)n=v.null;else if(Array.isArray(t)&&t.every(s=>typeof s=="string"||s===null))n=new A(t);else throw new Error("Argument to setNames must be null or an Array of strings or null");return i._Rf_setAttrib(this.ptr,v.namesSymbol.ptr,n.ptr),this}names(){let t=A.wrap(i._Rf_getAttrib(this.ptr,v.namesSymbol.ptr));return t.isNull()?null:t.toArray()}includes(t){let n=this.names();return n&&n.includes(t)}toJs(t={depth:0},n=1){throw new Error("This R object cannot be converted to JS")}subset(t){return P(this,te,$e).call(this,t,v.bracketSymbol.ptr)}get(t){return P(this,te,$e).call(this,t,v.bracket2Symbol.ptr)}getDollar(t){return P(this,te,$e).call(this,t,v.dollarSymbol.ptr)}pluck(...t){let n=Zt(v.null);try{let s=(l,p)=>{let y=l.get(p);return Kt(y,n)},a=t.reduce(s,this);return a.isNull()?void 0:a}finally{Qt(n)}}set(t,n){let s={n:0};try{let a=new L(t);w(a,s);let l=new L(n);w(l,s);let p=new C("[[<-"),y=i._Rf_lang4(p.ptr,this.ptr,a.ptr,l.ptr);return w(y,s),L.wrap(ge(y,v.baseEnv))}finally{_(s.n)}}static getMethods(t){let n=new Set,s=t;do Object.getOwnPropertyNames(s).map(a=>n.add(a));while(s=Object.getPrototypeOf(s));return[...n.keys()].filter(a=>typeof t[a]=="function")}},R=L;te=new WeakSet,$e=function(t,n){let s={n:0};try{let a=new L(t);w(a,s);let l=i._Rf_lang3(n,this.ptr,a.ptr);return w(l,s),L.wrap(ge(l,v.baseEnv))}finally{_(s.n)}};var Ze=class extends R{constructor(){return super(new g(i.getValue(i._R_NilValue,"*"))),this}toJs(){return{type:"null"}}},C=class extends R{constructor(e){if(e instanceof g){q(e,"symbol"),super(e);return}let t=i.allocateUTF8(e);try{super(new g(i._Rf_install(t)))}finally{i._free(t)}}toJs(){let e=this.toObject();return{type:"symbol",printname:e.printname,symvalue:e.symvalue,internal:e.internal}}toObject(){return{printname:this.printname().isUnbound()?null:this.printname().toString(),symvalue:this.symvalue().isUnbound()?null:this.symvalue().ptr,internal:this.internal().isNull()?null:this.internal().ptr}}toString(){return this.printname().toString()}printname(){return xe.wrap(i._PRINTNAME(this.ptr))}symvalue(){return R.wrap(i._SYMVALUE(this.ptr))}internal(){return R.wrap(i._INTERNAL(this.ptr))}},re=class extends R{constructor(e){if(e instanceof g)return q(e,"pairlist"),super(e),this;let t={n:0};try{let{names:n,values:s}=_e(e),a=re.wrap(i._Rf_allocList(s.length));w(a,t);for(let[l,p]=[0,a];!p.isNull();[l,p]=[l+1,p.cdr()])p.setcar(new R(s[l]));a.setNames(n),super(a)}finally{_(t.n)}}get length(){return this.toArray().length}toArray(e={depth:1}){return this.toJs(e).values}toObject({allowDuplicateKey:e=!0,allowEmptyKey:t=!1,depth:n=1}={}){let s=this.entries({depth:n}),a=s.map(([l,p])=>l);if(!e&&new Set(a).size!==a.length)throw new Error("Duplicate key when converting pairlist without allowDuplicateKey enabled");if(!t&&a.some(l=>!l))throw new Error("Empty or null key when converting pairlist without allowEmptyKey enabled");return Object.fromEntries(s.filter((l,p)=>s.findIndex(y=>y[0]===l[0])===p))}entries(e={depth:1}){let t=this.toJs(e);return t.values.map((n,s)=>[t.names?t.names[s]:null,n])}toJs(e={depth:0},t=1){let n=[],s=!1,a=[];for(let p=this;!p.isNull();p=p.cdr()){let y=p.tag();y.isNull()?n.push(""):(s=!0,n.push(y.toString())),e.depth&&t>=e.depth?a.push(p.car()):a.push(p.car().toJs(e,t+1))}return{type:"pairlist",names:s?n:null,values:a}}includes(e){return e in this.toObject()}setcar(e){i._SETCAR(this.ptr,e.ptr)}car(){return R.wrap(i._CAR(this.ptr))}cdr(){return R.wrap(i._CDR(this.ptr))}tag(){return R.wrap(i._TAG(this.ptr))}},B=class extends R{constructor(e){if(e instanceof g)return q(e,"call"),super(e),this;let t={n:0};try{let{values:n}=_e(e),s=n.map(l=>w(new R(l),t)),a=B.wrap(i._Rf_allocVector(d.call,n.length));w(a,t);for(let[l,p]=[0,a];!p.isNull();[l,p]=[l+1,p.cdr()])p.setcar(s[l]);super(a)}finally{_(t.n)}}setcar(e){i._SETCAR(this.ptr,e.ptr)}car(){return R.wrap(i._CAR(this.ptr))}cdr(){return R.wrap(i._CDR(this.ptr))}eval(){return R.wrap(ge(this.ptr,v.baseEnv))}},Pt=class extends R{constructor(e){if(e instanceof g)return q(e,"list"),super(e),this;let t={n:0};try{let{names:n,values:s}=_e(e),a=i._Rf_allocVector(d.list,s.length);w(a,t),s.forEach((l,p)=>{i._SET_VECTOR_ELT(a,p,new R(l).ptr)}),R.wrap(a).setNames(n),super(new g(a))}finally{_(t.n)}}get length(){return i._LENGTH(this.ptr)}toArray(e={depth:1}){return this.toJs(e).values}toObject({allowDuplicateKey:e=!0,allowEmptyKey:t=!1,depth:n=1}={}){let s=this.entries({depth:n}),a=s.map(([l,p])=>l);if(!e&&new Set(a).size!==a.length)throw new Error("Duplicate key when converting list without allowDuplicateKey enabled");if(!t&&a.some(l=>!l))throw new Error("Empty or null key when converting list without allowEmptyKey enabled");return Object.fromEntries(s.filter((l,p)=>s.findIndex(y=>y[0]===l[0])===p))}entries(e={depth:1}){let t=this.toJs(e);return t.values.map((n,s)=>[t.names?t.names[s]:null,n])}toJs(e={depth:0},t=1){return{type:"list",names:this.names(),values:[...Array(this.length).keys()].map(n=>e.depth&&t>=e.depth?this.get(n+1):this.get(n+1).toJs(e,t+1))}}},ee=class extends R{exec(...e){let t={n:0};try{let n=new B([this,...e]);return w(n,t),n.eval()}finally{_(t.n)}}},xe=class extends R{constructor(e){if(e instanceof g){q(e,"string"),super(e);return}let t=i.allocateUTF8(e);try{super(new g(i._Rf_mkChar(t)))}finally{i._free(t)}}toString(){return i.UTF8ToString(i._R_CHAR(this.ptr))}toJs(){return{type:"string",value:this.toString()}}},we=class extends R{constructor(e={}){if(e instanceof g)return q(e,"environment"),super(e),this;let t=0;try{let{names:n,values:s}=_e(e),a=Ge(i._R_NewEnv(v.globalEnv.ptr,0,0));++t,s.forEach((l,p)=>{let y=n?n[p]:null;if(!y)throw new Error("Can't create object in new environment with empty symbol name");let x=new C(y),ne=Ge(new R(l));try{wt(a,x,ne)}finally{_(1)}}),super(new g(a))}finally{_(t)}}ls(e=!1,t=!0){return A.wrap(i._R_lsInternal3(this.ptr,Number(e),Number(t))).toArray()}bind(e,t){let n=new C(e),s=Ge(new R(t));try{wt(this,n,s)}finally{_(1)}}names(){return this.ls(!0,!0)}frame(){return R.wrap(i._FRAME(this.ptr))}subset(e){if(typeof e=="number")throw new Error("Object of type environment is not subsettable");return this.getDollar(e)}toObject({depth:e=0}={}){let t=this.names();return Object.fromEntries([...Array(t.length).keys()].map(n=>[t[n],this.getDollar(t[n]).toJs({depth:e})]))}toJs(e={depth:0},t=1){let n=this.names(),s=[...Array(n.length).keys()].map(a=>e.depth&&t>=e.depth?this.getDollar(n[a]):this.getDollar(n[a]).toJs(e,t+1));return{type:"environment",names:n,values:s}}},j=class extends R{constructor(e,t,n){if(e instanceof g)return q(e,t),super(e),this;let s={n:0};try{let{names:a,values:l}=_e(e),p=i._Rf_allocVector(d[t],l.length);w(p,s),l.forEach(n(p)),R.wrap(p).setNames(a),super(new g(p))}finally{_(s.n)}}get length(){return i._LENGTH(this.ptr)}get(e){return super.get(e)}subset(e){return super.subset(e)}getDollar(e){throw new Error("$ operator is invalid for atomic vectors")}detectMissing(){let e={n:0};try{let t=i._Rf_lang2(new C("is.na").ptr,this.ptr);w(t,e);let n=F.wrap(ge(t,v.baseEnv));w(n,e);let s=n.toTypedArray();return Array.from(s).map(a=>Boolean(a))}finally{_(e.n)}}toArray(){let e=this.toTypedArray();return this.detectMissing().map((t,n)=>t?null:e[n])}toObject({allowDuplicateKey:e=!0,allowEmptyKey:t=!1}={}){let n=this.entries(),s=n.map(([a,l])=>a);if(!e&&new Set(s).size!==s.length)throw new Error("Duplicate key when converting atomic vector without allowDuplicateKey enabled");if(!t&&s.some(a=>!a))throw new Error("Empty or null key when converting atomic vector without allowEmptyKey enabled");return Object.fromEntries(n.filter((a,l)=>n.findIndex(p=>p[0]===a[0])===l))}entries(){let e=this.toArray(),t=this.names();return e.map((n,s)=>[t?t[s]:null,n])}toJs(){return{type:this.type(),names:this.names(),values:this.toArray()}}},Qe,vt=class extends j{constructor(e){super(e,"logical",o(vt,Qe))}getBoolean(e){return this.get(e).toArray()[0]}toBoolean(){if(this.length!==1)throw new Error("Can't convert atomic vector of length > 1 to a scalar JS value");let e=this.getBoolean(1);if(e===null)throw new Error("Can't convert missing value `NA` to a JS boolean");return e}toTypedArray(){return new Int32Array(i.HEAP32.subarray(i._LOGICAL(this.ptr)/4,i._LOGICAL(this.ptr)/4+this.length))}toArray(){let e=this.toTypedArray();return this.detectMissing().map((t,n)=>t?null:Boolean(e[n]))}},F=vt;Qe=new WeakMap,u(F,Qe,e=>{let t=i._LOGICAL(e),n=i.getValue(i._R_NaInt,"i32");return(s,a)=>{i.setValue(t+4*a,s===null?n:Boolean(s),"i32")}});var Ke,xt=class extends j{constructor(e){super(e,"integer",o(xt,Ke))}getNumber(e){return this.get(e).toArray()[0]}toNumber(){if(this.length!==1)throw new Error("Can't convert atomic vector of length > 1 to a scalar JS value");let e=this.getNumber(1);if(e===null)throw new Error("Can't convert missing value `NA` to a JS number");return e}toTypedArray(){return new Int32Array(i.HEAP32.subarray(i._INTEGER(this.ptr)/4,i._INTEGER(this.ptr)/4+this.length))}},Xe=xt;Ke=new WeakMap,u(Xe,Ke,e=>{let t=i._INTEGER(e),n=i.getValue(i._R_NaInt,"i32");return(s,a)=>{i.setValue(t+4*a,s===null?n:Math.round(Number(s)),"i32")}});var Ye,_t=class extends j{constructor(e){super(e,"double",o(_t,Ye))}getNumber(e){return this.get(e).toArray()[0]}toNumber(){if(this.length!==1)throw new Error("Can't convert atomic vector of length > 1 to a scalar JS value");let e=this.getNumber(1);if(e===null)throw new Error("Can't convert missing value `NA` to a JS number");return e}toTypedArray(){return new Float64Array(i.HEAPF64.subarray(i._REAL(this.ptr)/8,i._REAL(this.ptr)/8+this.length))}},Pe=_t;Ye=new WeakMap,u(Pe,Ye,e=>{let t=i._REAL(e),n=i.getValue(i._R_NaReal,"double");return(s,a)=>{i.setValue(t+8*a,s===null?n:s,"double")}});var et,Tt=class extends j{constructor(e){super(e,"complex",o(Tt,et))}getComplex(e){return this.get(e).toArray()[0]}toComplex(){if(this.length!==1)throw new Error("Can't convert atomic vector of length > 1 to a scalar JS value");let e=this.getComplex(1);if(e===null)throw new Error("Can't convert missing value `NA` to a JS object");return e}toTypedArray(){return new Float64Array(i.HEAPF64.subarray(i._COMPLEX(this.ptr)/8,i._COMPLEX(this.ptr)/8+2*this.length))}toArray(){let e=this.toTypedArray();return this.detectMissing().map((t,n)=>t?null:{re:e[2*n],im:e[2*n+1]})}},ve=Tt;et=new WeakMap,u(ve,et,e=>{let t=i._COMPLEX(e),n=i.getValue(i._R_NaReal,"double");return(s,a)=>{i.setValue(t+8*(2*a),s===null?n:s.re,"double"),i.setValue(t+8*(2*a+1),s===null?n:s.im,"double")}});var tt,Et=class extends j{constructor(e){super(e,"character",o(Et,tt))}getString(e){return this.get(e).toArray()[0]}toString(){if(this.length!==1)throw new Error("Can't convert atomic vector of length > 1 to a scalar JS value");let e=this.getString(1);if(e===null)throw new Error("Can't convert missing value `NA` to a JS string");return e}toTypedArray(){return new Uint32Array(i.HEAPU32.subarray(i._STRING_PTR(this.ptr)/4,i._STRING_PTR(this.ptr)/4+this.length))}toArray(){return this.detectMissing().map((e,t)=>e?null:i.UTF8ToString(i._R_CHAR(i._STRING_ELT(this.ptr,t))))}},A=Et;tt=new WeakMap,u(A,tt,e=>(t,n)=>{t===null?i._SET_STRING_ELT(e,n,v.naString.ptr):i._SET_STRING_ELT(e,n,new xe(t).ptr)});var rt,kt=class extends j{constructor(e){super(e,"raw",o(kt,rt))}getNumber(e){return this.get(e).toArray()[0]}toNumber(){if(this.length!==1)throw new Error("Can't convert atomic vector of length > 1 to a scalar JS value");let e=this.getNumber(1);if(e===null)throw new Error("Can't convert missing value `NA` to a JS number");return e}toTypedArray(){return new Uint8Array(i.HEAPU8.subarray(i._RAW(this.ptr),i._RAW(this.ptr)+this.length))}},ze=kt;rt=new WeakMap,u(ze,rt,e=>{let t=i._RAW(e);return(n,s)=>{i.setValue(t+s,Number(n),"i8")}});function _e(r){return bt(r)?r:Array.isArray(r)?{names:null,values:r}:r&&typeof r=="object"&&!gt(r)?{names:Object.keys(r),values:Object.values(r)}:{names:null,values:[r]}}function er(r){let e={[d.null]:Ze,[d.symbol]:C,[d.pairlist]:re,[d.closure]:ee,[d.environment]:we,[d.call]:B,[d.special]:ee,[d.builtin]:ee,[d.string]:xe,[d.logical]:F,[d.integer]:Xe,[d.double]:Pe,[d.complex]:ve,[d.character]:A,[d.list]:Pt,[d.raw]:ze,[d.function]:ee};return r in e?e[r]:R}function xr(r){return r instanceof R}var v;function Tr(){}function Er(r,e){return async function*(){let t={type:"callRObjectMethod",data:{payload:e._payload,prop:"getPropertyValue",args:[{payloadType:"raw",obj:"length"}],shelter:void 0}},n=await r.request(t);if(typeof n.obj!="number")throw new Error("Cannot iterate over object, unexpected type for length property.");for(let s=1;s<=n.obj;s++)yield e.get(s)}}function tr(r,e,t){return async(...n)=>{let s=n.map(p=>D(p)?p._payload:{obj:E(p,D,y=>y._payload),payloadType:"raw"}),a={type:"callRObjectMethod",data:{payload:t,prop:e,args:s}},l=await r.request(a);switch(l.payloadType){case"ptr":return I(r,l);case"raw":return E(l,Le,(y,x)=>I(x,y),r).obj}}}async function kr(r,e,t,n){let s={type:"newRObject",data:{objType:e,obj:E(n,D,l=>l._payload),shelter:t}},a=await r.request(s);switch(a.payloadType){case"raw":throw new Error("Unexpected raw payload type returned from newRObject");case"ptr":return I(r,a)}}function I(r,e){var n;let t=new Proxy((n=e.obj.methods)!=null&&n.includes("exec")?Object.assign(Tr,{...e}):e,{get:(s,a)=>{var l;if(a==="_payload")return e;if(a===Symbol.asyncIterator)return Er(r,t);if((l=e.obj.methods)!=null&&l.includes(a.toString()))return tr(r,a.toString(),e)},apply:async(s,a,l)=>{let p=await I(r,e).exec(...l);return zt(p)?p:p.toJs()}});return t}function T(r,e,t){return new Proxy(R,{construct:(n,s)=>kr(r,t,e,...s),get:(n,s)=>tr(r,s.toString())})}var Te,Ee,ke,We,nt,st,ot,at,it,rr,Wt=class{constructor(e={},t={REnv:{R_HOME:"/usr/lib/R",R_ENABLE_JIT:"0",R_DEFAULT_DEVICE:"canvas"}}){u(this,it);u(this,Te,void 0);u(this,Ee,void 0);u(this,ke,void 0);u(this,We,void 0);u(this,nt,e=>{console.log(e)});u(this,st,e=>{console.error(e)});u(this,ot,e=>{let t=prompt(e);t&&this.stdin(`${t}
`)});u(this,at,e=>{if(f)throw new Error("Plotting with HTML canvas is not yet supported under Node");Function(`this.getContext('2d').${e}`).bind(this.canvas)()});this.webR=new lt(t),f||(this.canvas=document.createElement("canvas"),this.canvas.setAttribute("width","1008"),this.canvas.setAttribute("height","1008")),c(this,Te,e.stdout||o(this,nt)),c(this,Ee,e.stderr||o(this,st)),c(this,ke,e.prompt||o(this,ot)),c(this,We,e.canvasExec||o(this,at))}stdin(e){this.webR.writeConsole(e)}interrupt(){this.webR.interrupt()}run(){P(this,it,rr).call(this)}};Te=new WeakMap,Ee=new WeakMap,ke=new WeakMap,We=new WeakMap,nt=new WeakMap,st=new WeakMap,ot=new WeakMap,at=new WeakMap,it=new WeakSet,rr=async function(){for(;;){let e=await this.webR.read();switch(e.type){case"stdout":o(this,Te).call(this,e.data);break;case"stderr":o(this,Ee).call(this,e.data);break;case"prompt":o(this,ke).call(this,e.data);break;case"canvasExec":o(this,We).call(this,e.data);break;default:console.warn(`Unhandled output type for webR Console: ${e.type}.`)}}};var Wr={R_HOME:"/usr/lib/R",R_ENABLE_JIT:"0"},Sr={RArgs:[],REnv:Wr,baseUrl:$t,serviceWorkerUrl:"",repoUrl:Xt,homedir:"/home/web_user",interactive:!0,channelType:O.Automatic},b,lt=class{constructor(e={}){u(this,b,void 0);this.FS={lookupPath:async e=>{let t={type:"lookupPath",data:{path:e}};return(await o(this,b).request(t)).obj},mkdir:async e=>{let t={type:"mkdir",data:{path:e}};return(await o(this,b).request(t)).obj},readFile:async(e,t)=>{let n={type:"readFile",data:{path:e,flags:t}};return(await o(this,b).request(n)).obj},rmdir:async e=>{let t={type:"rmdir",data:{path:e}};await o(this,b).request(t)},writeFile:async(e,t,n)=>{let s={type:"writeFile",data:{path:e,data:t,flags:n}};await o(this,b).request(s)},unlink:async e=>{let t={type:"unlink",data:{path:e}};await o(this,b).request(t)}};let t=Object.assign(Sr,e);c(this,b,Gt(t)),this.objs={},this.Shelter=Or(o(this,b))}async init(){let e=await o(this,b).initialised;return this.globalShelter=await new this.Shelter,this.RObject=this.globalShelter.RObject,this.RLogical=this.globalShelter.RLogical,this.RInteger=this.globalShelter.RInteger,this.RDouble=this.globalShelter.RDouble,this.RComplex=this.globalShelter.RComplex,this.RCharacter=this.globalShelter.RCharacter,this.RRaw=this.globalShelter.RRaw,this.RList=this.globalShelter.RList,this.RPairlist=this.globalShelter.RPairlist,this.REnvironment=this.globalShelter.REnvironment,this.RSymbol=this.globalShelter.RSymbol,this.RString=this.globalShelter.RString,this.RCall=this.globalShelter.RCall,this.objs={baseEnv:await this.RObject.getPersistentObject("baseEnv"),globalEnv:await this.RObject.getPersistentObject("globalEnv"),null:await this.RObject.getPersistentObject("null"),true:await this.RObject.getPersistentObject("true"),false:await this.RObject.getPersistentObject("false"),na:await this.RObject.getPersistentObject("na")},e}close(){o(this,b).close()}async read(){return await o(this,b).read()}async flush(){return await o(this,b).flush()}write(e){o(this,b).write(e)}writeConsole(e){this.write({type:"stdin",data:e+`
`})}interrupt(){o(this,b).interrupt()}async installPackages(e){for(let t of e){let n={type:"installPackage",data:{name:t}};await o(this,b).request(n)}}async destroy(e){await this.globalShelter.destroy(e)}async evalR(e,t){return this.globalShelter.evalR(e,t)}async evalRVoid(e,t){return this.evalRRaw(e,"void",t)}async evalRBoolean(e,t){return this.evalRRaw(e,"boolean",t)}async evalRNumber(e,t){return this.evalRRaw(e,"number",t)}async evalRString(e,t){return this.evalRRaw(e,"string",t)}async evalRRaw(e,t,n={}){let s=E(n,D,p=>p._payload),a={type:"evalRRaw",data:{code:e,options:s,outputType:t}},l=await o(this,b).request(a);switch(l.payloadType){case"raw":return l.obj;case"ptr":throw new Error("Unexpected ptr payload type returned from evalRVoid")}}};b=new WeakMap;var m,h,Se,pt=class{constructor(e){u(this,m,"");u(this,h,void 0);u(this,Se,!1);c(this,h,e)}async init(){if(o(this,Se))return;let e={type:"newShelter"},t=await o(this,h).request(e);c(this,m,t.obj),this.RObject=T(o(this,h),o(this,m),"object"),this.RLogical=T(o(this,h),o(this,m),"logical"),this.RInteger=T(o(this,h),o(this,m),"integer"),this.RDouble=T(o(this,h),o(this,m),"double"),this.RComplex=T(o(this,h),o(this,m),"complex"),this.RCharacter=T(o(this,h),o(this,m),"character"),this.RRaw=T(o(this,h),o(this,m),"raw"),this.RList=T(o(this,h),o(this,m),"list"),this.RPairlist=T(o(this,h),o(this,m),"pairlist"),this.REnvironment=T(o(this,h),o(this,m),"environment"),this.RSymbol=T(o(this,h),o(this,m),"symbol"),this.RString=T(o(this,h),o(this,m),"string"),this.RCall=T(o(this,h),o(this,m),"call"),c(this,Se,!0)}async purge(){let e={type:"shelterPurge",data:o(this,m)};await o(this,h).request(e)}async destroy(e){let t={type:"shelterDestroy",data:{id:o(this,m),obj:e._payload}};await o(this,h).request(t)}async size(){let e={type:"shelterSize",data:o(this,m)};return(await o(this,h).request(e)).obj}async evalR(e,t={}){let n=E(t,D,l=>l._payload),s={type:"evalR",data:{code:e,options:n,shelter:o(this,m)}},a=await o(this,h).request(s);switch(a.payloadType){case"raw":throw new Error("Unexpected payload type returned from evalR");default:return I(o(this,h),a)}}async captureR(e,t={}){let n=E(t,D,l=>l._payload),s={type:"captureR",data:{code:e,options:n,shelter:o(this,m)}},a=await o(this,h).request(s);switch(a.payloadType){case"ptr":throw new Error("Unexpected payload type returned from evalR");case"raw":{let l=a.obj,p=I(o(this,h),l.result),y=l.output;for(let x=0;x<y.length;++x)y[x].type!=="stdout"&&y[x].type!=="stderr"&&(y[x].data=I(o(this,h),y[x].data));return{result:p,output:y}}}}};m=new WeakMap,h=new WeakMap,Se=new WeakMap;function Or(r){return new Proxy(pt,{construct:async()=>{let e=new pt(r);return await e.init(),e}})}export{Wt as Console,pt as Shelter,lt as WebR};
//# sourceMappingURL=webr.mjs.map