@linkdlab/funcnodes_pyodide_react_flow 0.1.9 → 0.1.11

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/index.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";const U=require("@linkdlab/funcnodes_react_flow"),s=[];for(let e=0;e<256;++e)s.push((e+256).toString(16).slice(1));function P(e,r=0){return(s[e[r+0]]+s[e[r+1]]+s[e[r+2]]+s[e[r+3]]+"-"+s[e[r+4]]+s[e[r+5]]+"-"+s[e[r+6]]+s[e[r+7]]+"-"+s[e[r+8]]+s[e[r+9]]+"-"+s[e[r+10]]+s[e[r+11]]+s[e[r+12]]+s[e[r+13]]+s[e[r+14]]+s[e[r+15]]).toLowerCase()}let k;const S=new Uint8Array(16);function x(){if(!k){if(typeof crypto>"u"||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");k=crypto.getRandomValues.bind(crypto)}return k(S)}const E=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),y={randomUUID:E};function I(e,r,t){var i;if(y.randomUUID&&!e)return y.randomUUID();e=e||{};const o=e.random??((i=e.rng)==null?void 0:i.call(e))??x();if(o.length<16)throw new Error("Random bytes length must be >= 16");return o[6]=o[6]&15|64,o[8]=o[8]&63|128,P(o)}function M(e){return new Worker("/assets/pyodideDedicatedWorker-XEcNtM2X.js",{name:e==null?void 0:e.name})}function R(e){return new Worker("/assets/pyodideSharedWorker-BIPs7KQu.js",{name:e==null?void 0:e.name})}const D=e=>(e.worker||(e.shared_worker?e.worker_url===void 0?e.worker=new R({name:e.uuid}):e.worker=new SharedWorker(e.worker_url,{name:e.uuid,type:"module"}):e.worker_url===void 0?e.worker=new M({name:e.uuid}):e.worker=new Worker(e.worker_url,{name:e.uuid,type:"module"})),e.worker);class j extends U.FuncNodesWorker{constructor(r){const t={uuid:I(),...r};if(super(t),this._message_hooks=[],this._worker=D(t),this._worker instanceof SharedWorker)t.shared_worker=!0,this._port=this._worker.port,this._port.start(),this._port.addEventListener("message",this.onmessage.bind(this));else if(this._worker instanceof Worker)t.shared_worker=!1,this._worker.addEventListener("message",this.onmessage.bind(this));else throw new Error("worker must be an instance of Worker or SharedWorker");this.postMessage({cmd:"init",data:{debug:t.debug,pyodide_url:t.pyodide_url,packages:t.packages}});const o=setInterval(()=>{this.postMessage({cmd:"state"})},400);this._workerstate={loaded:!1,msg:"loading",progress:0},this.initPromise=new Promise(async i=>{var c;for(;!this._workerstate.loaded;)await new Promise(h=>setTimeout(h,100));clearInterval(o),this.is_open=!0,(c=this._zustand)==null||c.auto_progress(),i()}),this.initPromise.then(()=>{this.stepwise_fullsync()})}async send(r){await this.initPromise,this.postMessage({cmd:"worker:send",msg:JSON.stringify(r),worker_id:this.uuid})}postMessage(r){r.worker_id=this.uuid,this._port?this._port.postMessage(r):this._worker.postMessage(r)}registerMessageHook(r){return this._message_hooks.push(r),()=>{this._message_hooks=this._message_hooks.filter(t=>t!==r)}}onmessage(r){var t;for(const o of this._message_hooks)o(r.data);if(r.data.result)r.data.result.state&&(this._workerstate={...this._workerstate,...r.data.result.state},r.data.result.state.msg&&r.data.result.state.msg!=="ready"&&((t=this._zustand)==null||t.set_progress({message:this._workerstate.msg,status:"info",progress:this._workerstate.progress,blocking:!0})));else if(r.data.cmd){if(r.data.cmd==="receive"){if(r.data.worker_id===void 0)throw new Error("worker_id is undefined");r.data.worker_id===this.uuid&&this.receive(JSON.parse(r.data.msg))}else if(r.data.cmd==="receive_bytes"){if(r.data.worker_id===void 0)throw new Error("worker_id is undefined");r.data.worker_id===this.uuid&&this.onbytes(r.data.msg)}}}async upload_file({files:r,onProgressCallback:t,root:o}){const i=[],c=r.length;let h=0;if(r.length===0)return"";for(let d=0;d<r.length;d++){const u=r[d],a=new FileReader,m=new Promise((l,n)=>{a.onload=async f=>{var g;try{const w=(g=f.target.result)==null?void 0:g.replace(/^data:.+;base64,/,""),p=u.webkitRelativePath||u.name,b=o?`${o}/${p}`:p,W=await this._send_cmd({cmd:"upload",kwargs:{data:w,filename:b},wait_for_response:!0});h++,t&&t(h,c),l(W)}catch(w){n(w)}},a.readAsDataURL(u)});i.push(m)}const _=await Promise.all(i);return _.reduce((d,u)=>{const a=u.split("/"),m=d.split("/"),l=[];for(let n=0;n<a.length&&a[n]===m[n];n++)l.push(a[n]);return l.join("/")},_[0])}}module.exports=j;
1
+ "use strict";const E=require("@linkdlab/funcnodes_react_flow"),o=[];for(let e=0;e<256;++e)o.push((e+256).toString(16).slice(1));function W(e,r=0){return(o[e[r+0]]+o[e[r+1]]+o[e[r+2]]+o[e[r+3]]+"-"+o[e[r+4]]+o[e[r+5]]+"-"+o[e[r+6]]+o[e[r+7]]+"-"+o[e[r+8]]+o[e[r+9]]+"-"+o[e[r+10]]+o[e[r+11]]+o[e[r+12]]+o[e[r+13]]+o[e[r+14]]+o[e[r+15]]).toLowerCase()}let u;const R=new Uint8Array(16);function U(){if(!u){if(typeof crypto>"u"||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");u=crypto.getRandomValues.bind(crypto)}return u(R)}const I=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),f={randomUUID:I};function L(e,r,t){var a;if(f.randomUUID&&!e)return f.randomUUID();e=e||{};const i=e.random??((a=e.rng)==null?void 0:a.call(e))??U();if(i.length<16)throw new Error("Random bytes length must be >= 16");return i[6]=i[6]&15|64,i[8]=i[8]&63|128,W(i)}const h='(function(){"use strict";const d="https://cdn.jsdelivr.net/pyodide/v0.27.2/full/pyodide.mjs",e=self;e.workerState={pyodide:null,pyodide_url:d,packages:[],state:{msg:"loading",loaded:!1,progress:0},micropip:null,worker:{},pyodideReady:!1,pyodideReadyPromise:null,debug:!1,interruptBuffer:null,receivepy:(r,t)=>{},receivepy_bytes:(r,t)=>{},handel_register:{},post_pyodide_ready:void 0},e.reset=async()=>{var r;for(const t in e.list_workers())try{const o=await e.get_worker(t);o.worker&&o.worker.stop(),(r=o.reject_promise)==null||r.call(o,"Worker reset")}catch{}e.workerState.pyodide&&e.interrupt(),e.workerState.pyodide=null,e.workerState.micropip=null,e.workerState.worker={},e.workerState.pyodideReady=!1;try{e.workerState.interruptBuffer=new Uint8Array(new SharedArrayBuffer(1)),e.workerState.interruptBuffer[0]=0}catch{}},e.initializePyodide=async()=>{var r,t;if(!e.workerState.pyodide){console.log("initializePyodide with: Debug:",e.workerState.debug,"Pyodide URL:",e.workerState.pyodide_url,"Packages:",e.workerState.packages),console.debug("Loading Pyodide..."),e.workerState.state.msg="Loading Pyodide...",e.workerState.state.progress=0,await e.reset(),console.debug("Loading Pyodide module..."),e.workerState.state.msg="Loading Pyodide module...",e.workerState.state.progress=.1;const o=await import(e.workerState.pyodide_url);console.debug("Loading Pyodide instance..."),e.workerState.state.msg="Loading Pyodide instance...",e.workerState.state.progress=.2;const i=o.loadPyodide,a=e.workerState.pyodide_url.split("/").slice(0,-1).join("/");console.log(a),e.workerState.pyodide=await i({packages:["micropip"],indexURL:a}),e.workerState.interruptBuffer&&e.workerState.pyodide.setInterruptBuffer(e.workerState.interruptBuffer)}e.workerState.micropip||(console.debug("Importing micropip..."),e.workerState.state.msg="Importing micropip...",e.workerState.state.progress=.3,e.workerState.micropip=e.workerState.pyodide.pyimport("micropip")),console.debug("Pyodide ready. Installing funcnodes...");for(const o of e.workerState.packages)console.log("Installing package:",o),e.workerState.state.msg=`Installing package: ${o}`,await e.workerState.micropip.install(o);return e.workerState.state.msg="Installing funcnodes",e.workerState.state.progress=.8,await e.workerState.micropip.install("funcnodes"),e.workerState.state.msg="Installing funcnodes-worker",await e.workerState.micropip.install("funcnodes-worker"),e.workerState.state.msg="Installing funcnodes-pyodide",await e.workerState.micropip.install("funcnodes-pyodide"),e.workerState.state.msg="Installing funcnodes-react-flow",await e.workerState.micropip.install("funcnodes-react-flow"),e.workerState.state.msg="Importing funcnodes",console.debug("Importing funcnodes..."),await e.workerState.pyodide.runPythonAsync("import funcnodes_pyodide"),console.debug("Running post_pyodide_ready..."),await((t=(r=e.workerState).post_pyodide_ready)==null?void 0:t.call(r,e.workerState)),console.debug("Pyodide ready"),e.workerState.state.msg="ready",e.workerState.state.progress=.1,e.workerState.pyodideReady=!0,{pyodide:e.workerState.pyodide,micropip:e.workerState.micropip}},e.interrupt=()=>{e.workerState.interruptBuffer&&(e.workerState.interruptBuffer[0]=1)},e.list_workers=()=>Object.keys(e.workerState.worker),e.get_worker=async r=>{if(!r)throw new Error("Worker id is required");if(!e.workerState.worker[r])throw new Error(`Worker with id ${r} not found`);return await e.workerState.worker[r].make_promise,e.workerState.worker[r]},e.has_worker=r=>{if(!r)throw new Error("Worker id is required");return!!e.workerState.worker[r]},e.get_or_create_worker=async r=>{if(!r)throw new Error("Worker id is required");return e.workerState.worker[r]||(console.log("Creating worker with id",r),await e.initializeFuncNodesWorker(r)),e.get_worker(r)},e.initializeFuncNodesWorker=async r=>{try{if(!e.workerState.pyodideReadyPromise)throw new Error("Pyodide newer initialized");const{pyodide:t}=await e.workerState.pyodideReadyPromise;if(!e.has_worker(r)){e.workerState.worker[r]={worker:null,make_promise:void 0};const o=new Promise(async(i,a)=>{e.workerState.worker[r].reject_promise=a,console.debug(`Creating worker (${r})...`);const s=await t.runPythonAsync(`funcnodes_pyodide.new_worker(debug=${e.workerState.debug?1:0}, uuid="${r}")`);if(console.debug("Worker created:",s),typeof s.set_receiver=="function")s.set_receiver(self);else throw new Error("Worker does not expose a \'set_receiver\' method.");e.workerState.worker[r].worker=s,console.debug("Worker ready"),i(s)});e.workerState.worker[r].make_promise=o}return e.get_worker(r)}catch(t){throw console.error("Error during worker initialization:",t),t}},e.receivepy=(r,t)=>{try{let o={};if(typeof r=="string"?o.msg=r:o=r,o.msg===void 0)return;typeof o.msg!="string"&&(o.msg=JSON.stringify(o.msg)),t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error(`Worker id not provided in receivepy(${JSON.stringify(o)})`);if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy(${JSON.stringify(o)})`);e.workerState.receivepy(r,i)}catch(o){console.error("Error during receivepy:",o);return}},e.receivepy_bytes=(r,t)=>{r=r.toJs();try{let o={};if(r instanceof Uint8Array?o.msg=r:o=r,o.msg===void 0)return;t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error("Worker id not provided in receivepy_bytes");if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy_bytes`);e.workerState.receivepy_bytes(r,i)}catch(o){console.error("Error during receivepy_bytes:",o);return}},e.startInitialization=({debug:r=!1,receivepy:t,receivepy_bytes:o,pyodide_url:i,post_pyodide_ready:a,packages:s})=>(e.workerState.debug=r,e.workerState.pyodide_url=i||d,e.workerState.packages=s,e.workerState.receivepy=t,e.workerState.receivepy_bytes=o,e.workerState.pyodideReadyPromise=null,e.workerState.post_pyodide_ready=a,e.workerState),e.register_cmd_message=(r,t)=>{if(e.workerState.handel_register[r])throw new Error(`Command ${r} already registered`);e.workerState.handel_register[r]=t},e.register_cmd_message("ping",async r=>"pong"),e.register_cmd_message("init",async r=>{if(e.workerState.pyodideReadyPromise)throw new Error("Pyodide is already initialized");r.data&&(r.data.pyodide_url&&(e.workerState.pyodide_url=r.data.pyodide_url),r.data.packages&&(e.workerState.packages=r.data.packages),r.data.debug&&(e.workerState.debug=r.data.debug)),e.workerState.pyodideReadyPromise=e.initializePyodide()}),e.register_cmd_message("_eval",async r=>{var t;try{const o=await((t=e.workerState.pyodide)==null?void 0:t.runPythonAsync(r.msg||"print(\'No code provided\')"));return console.log("Eval result:",o),o}catch(o){console.error("Error during _eval:",o)}}),e.register_cmd_message("state",async r=>({state:{...e.workerState.state,loaded:e.workerState.pyodideReady}})),e.register_cmd_message("worker:state",async r=>({state:{loaded:!!(await e.get_or_create_worker(r.worker_id)).worker}})),e.register_cmd_message("worker:stop",async r=>{var o;if(!e.has_worker(r.worker_id))return;const t=await e.get_or_create_worker(r.worker_id);return t.worker&&(t.worker.stop(),t.worker=null,(o=t.reject_promise)==null||o.call(t,"Worker stopped")),delete e.workerState.worker[r.worker_id],{state:{loaded:!1}}}),e.register_cmd_message("worker:send",async r=>{const t=await e.get_or_create_worker(r.worker_id);if(!t.worker)throw new Error("Worker is not initialized");if(typeof t.worker.receivejs!="function")throw new Error(`Worker does not support receivejs: ${typeof t.worker.receivejs}`);t.worker.receivejs(r.msg)}),e.handleMessage=async r=>{const t={original:r};r.id&&(t.id=r.id),r.toJs===void 0&&(r.toJs=!0);try{if(r.cmd){const o=r;if(e.workerState.handel_register[o.cmd])t.result=await e.workerState.handel_register[o.cmd](o);else throw new Error("Unknown command: "+o.cmd)}else throw new Error("Unknown message format: "+JSON.stringify(r))}catch(o){t.error=o.message}return t},e.read_url_params=()=>{var a,s;const r=new URLSearchParams(self.location.search),t=((a=r.get("debug"))==null?void 0:a.toLowerCase())==="true",o=r.get("pyodide_url")||void 0,i=((s=r.get("packages"))==null?void 0:s.split(","))||[];return{debug:t,pyodide_url:o,packages:i}};const n=e;n.general_initalization=r=>{const t=n.read_url_params();n.startInitialization({...r,...t})};const w=n,c=n;c.init_dedicated_worker=r=>{const t=e;t.onmessage=async i=>{const a=i.data,s=await t.handleMessage(a);t.postMessage(s)};const o={...r,receivepy:(i,a)=>{t.postMessage({cmd:"receive",msg:i,worker_id:a})},receivepy_bytes(i,a){t.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})}};t.general_initalization(o)},w.init_shared_worker=r=>{const t=e;t.connectedPorts=[],t.onconnect=i=>{const a=i.ports[0];t.connectedPorts.push(a),a.start(),console.debug("Port connected in shared worker"),a.onmessage=async s=>{const k=s.data,p=await t.handleMessage(k);a.postMessage(p)}};const o={...r,receivepy:(i,a)=>{t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive",msg:i,worker_id:a})})},receivepy_bytes(i,a){t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})})}};t.general_initalization(o)},(r=>{n.init_dedicated_worker(r)})({})})();\n',S=typeof self<"u"&&self.Blob&&new Blob([h],{type:"text/javascript;charset=utf-8"});function j(e){let r;try{if(r=S&&(self.URL||self.webkitURL).createObjectURL(S),!r)throw"";const t=new Worker(r,{name:e==null?void 0:e.name});return t.addEventListener("error",()=>{(self.URL||self.webkitURL).revokeObjectURL(r)}),t}catch{return new Worker("data:text/javascript;charset=utf-8,"+encodeURIComponent(h),{name:e==null?void 0:e.name})}finally{r&&(self.URL||self.webkitURL).revokeObjectURL(r)}}const z='(function(){"use strict";const d="https://cdn.jsdelivr.net/pyodide/v0.27.2/full/pyodide.mjs",e=self;e.workerState={pyodide:null,pyodide_url:d,packages:[],state:{msg:"loading",loaded:!1,progress:0},micropip:null,worker:{},pyodideReady:!1,pyodideReadyPromise:null,debug:!1,interruptBuffer:null,receivepy:(r,t)=>{},receivepy_bytes:(r,t)=>{},handel_register:{},post_pyodide_ready:void 0},e.reset=async()=>{var r;for(const t in e.list_workers())try{const o=await e.get_worker(t);o.worker&&o.worker.stop(),(r=o.reject_promise)==null||r.call(o,"Worker reset")}catch{}e.workerState.pyodide&&e.interrupt(),e.workerState.pyodide=null,e.workerState.micropip=null,e.workerState.worker={},e.workerState.pyodideReady=!1;try{e.workerState.interruptBuffer=new Uint8Array(new SharedArrayBuffer(1)),e.workerState.interruptBuffer[0]=0}catch{}},e.initializePyodide=async()=>{var r,t;if(!e.workerState.pyodide){console.log("initializePyodide with: Debug:",e.workerState.debug,"Pyodide URL:",e.workerState.pyodide_url,"Packages:",e.workerState.packages),console.debug("Loading Pyodide..."),e.workerState.state.msg="Loading Pyodide...",e.workerState.state.progress=0,await e.reset(),console.debug("Loading Pyodide module..."),e.workerState.state.msg="Loading Pyodide module...",e.workerState.state.progress=.1;const o=await import(e.workerState.pyodide_url);console.debug("Loading Pyodide instance..."),e.workerState.state.msg="Loading Pyodide instance...",e.workerState.state.progress=.2;const i=o.loadPyodide,a=e.workerState.pyodide_url.split("/").slice(0,-1).join("/");console.log(a),e.workerState.pyodide=await i({packages:["micropip"],indexURL:a}),e.workerState.interruptBuffer&&e.workerState.pyodide.setInterruptBuffer(e.workerState.interruptBuffer)}e.workerState.micropip||(console.debug("Importing micropip..."),e.workerState.state.msg="Importing micropip...",e.workerState.state.progress=.3,e.workerState.micropip=e.workerState.pyodide.pyimport("micropip")),console.debug("Pyodide ready. Installing funcnodes...");for(const o of e.workerState.packages)console.log("Installing package:",o),e.workerState.state.msg=`Installing package: ${o}`,await e.workerState.micropip.install(o);return e.workerState.state.msg="Installing funcnodes",e.workerState.state.progress=.8,await e.workerState.micropip.install("funcnodes"),e.workerState.state.msg="Installing funcnodes-worker",await e.workerState.micropip.install("funcnodes-worker"),e.workerState.state.msg="Installing funcnodes-pyodide",await e.workerState.micropip.install("funcnodes-pyodide"),e.workerState.state.msg="Installing funcnodes-react-flow",await e.workerState.micropip.install("funcnodes-react-flow"),e.workerState.state.msg="Importing funcnodes",console.debug("Importing funcnodes..."),await e.workerState.pyodide.runPythonAsync("import funcnodes_pyodide"),console.debug("Running post_pyodide_ready..."),await((t=(r=e.workerState).post_pyodide_ready)==null?void 0:t.call(r,e.workerState)),console.debug("Pyodide ready"),e.workerState.state.msg="ready",e.workerState.state.progress=.1,e.workerState.pyodideReady=!0,{pyodide:e.workerState.pyodide,micropip:e.workerState.micropip}},e.interrupt=()=>{e.workerState.interruptBuffer&&(e.workerState.interruptBuffer[0]=1)},e.list_workers=()=>Object.keys(e.workerState.worker),e.get_worker=async r=>{if(!r)throw new Error("Worker id is required");if(!e.workerState.worker[r])throw new Error(`Worker with id ${r} not found`);return await e.workerState.worker[r].make_promise,e.workerState.worker[r]},e.has_worker=r=>{if(!r)throw new Error("Worker id is required");return!!e.workerState.worker[r]},e.get_or_create_worker=async r=>{if(!r)throw new Error("Worker id is required");return e.workerState.worker[r]||(console.log("Creating worker with id",r),await e.initializeFuncNodesWorker(r)),e.get_worker(r)},e.initializeFuncNodesWorker=async r=>{try{if(!e.workerState.pyodideReadyPromise)throw new Error("Pyodide newer initialized");const{pyodide:t}=await e.workerState.pyodideReadyPromise;if(!e.has_worker(r)){e.workerState.worker[r]={worker:null,make_promise:void 0};const o=new Promise(async(i,a)=>{e.workerState.worker[r].reject_promise=a,console.debug(`Creating worker (${r})...`);const s=await t.runPythonAsync(`funcnodes_pyodide.new_worker(debug=${e.workerState.debug?1:0}, uuid="${r}")`);if(console.debug("Worker created:",s),typeof s.set_receiver=="function")s.set_receiver(self);else throw new Error("Worker does not expose a \'set_receiver\' method.");e.workerState.worker[r].worker=s,console.debug("Worker ready"),i(s)});e.workerState.worker[r].make_promise=o}return e.get_worker(r)}catch(t){throw console.error("Error during worker initialization:",t),t}},e.receivepy=(r,t)=>{try{let o={};if(typeof r=="string"?o.msg=r:o=r,o.msg===void 0)return;typeof o.msg!="string"&&(o.msg=JSON.stringify(o.msg)),t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error(`Worker id not provided in receivepy(${JSON.stringify(o)})`);if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy(${JSON.stringify(o)})`);e.workerState.receivepy(r,i)}catch(o){console.error("Error during receivepy:",o);return}},e.receivepy_bytes=(r,t)=>{r=r.toJs();try{let o={};if(r instanceof Uint8Array?o.msg=r:o=r,o.msg===void 0)return;t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error("Worker id not provided in receivepy_bytes");if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy_bytes`);e.workerState.receivepy_bytes(r,i)}catch(o){console.error("Error during receivepy_bytes:",o);return}},e.startInitialization=({debug:r=!1,receivepy:t,receivepy_bytes:o,pyodide_url:i,post_pyodide_ready:a,packages:s})=>(e.workerState.debug=r,e.workerState.pyodide_url=i||d,e.workerState.packages=s,e.workerState.receivepy=t,e.workerState.receivepy_bytes=o,e.workerState.pyodideReadyPromise=null,e.workerState.post_pyodide_ready=a,e.workerState),e.register_cmd_message=(r,t)=>{if(e.workerState.handel_register[r])throw new Error(`Command ${r} already registered`);e.workerState.handel_register[r]=t},e.register_cmd_message("ping",async r=>"pong"),e.register_cmd_message("init",async r=>{if(e.workerState.pyodideReadyPromise)throw new Error("Pyodide is already initialized");r.data&&(r.data.pyodide_url&&(e.workerState.pyodide_url=r.data.pyodide_url),r.data.packages&&(e.workerState.packages=r.data.packages),r.data.debug&&(e.workerState.debug=r.data.debug)),e.workerState.pyodideReadyPromise=e.initializePyodide()}),e.register_cmd_message("_eval",async r=>{var t;try{const o=await((t=e.workerState.pyodide)==null?void 0:t.runPythonAsync(r.msg||"print(\'No code provided\')"));return console.log("Eval result:",o),o}catch(o){console.error("Error during _eval:",o)}}),e.register_cmd_message("state",async r=>({state:{...e.workerState.state,loaded:e.workerState.pyodideReady}})),e.register_cmd_message("worker:state",async r=>({state:{loaded:!!(await e.get_or_create_worker(r.worker_id)).worker}})),e.register_cmd_message("worker:stop",async r=>{var o;if(!e.has_worker(r.worker_id))return;const t=await e.get_or_create_worker(r.worker_id);return t.worker&&(t.worker.stop(),t.worker=null,(o=t.reject_promise)==null||o.call(t,"Worker stopped")),delete e.workerState.worker[r.worker_id],{state:{loaded:!1}}}),e.register_cmd_message("worker:send",async r=>{const t=await e.get_or_create_worker(r.worker_id);if(!t.worker)throw new Error("Worker is not initialized");if(typeof t.worker.receivejs!="function")throw new Error(`Worker does not support receivejs: ${typeof t.worker.receivejs}`);t.worker.receivejs(r.msg)}),e.handleMessage=async r=>{const t={original:r};r.id&&(t.id=r.id),r.toJs===void 0&&(r.toJs=!0);try{if(r.cmd){const o=r;if(e.workerState.handel_register[o.cmd])t.result=await e.workerState.handel_register[o.cmd](o);else throw new Error("Unknown command: "+o.cmd)}else throw new Error("Unknown message format: "+JSON.stringify(r))}catch(o){t.error=o.message}return t},e.read_url_params=()=>{var a,s;const r=new URLSearchParams(self.location.search),t=((a=r.get("debug"))==null?void 0:a.toLowerCase())==="true",o=r.get("pyodide_url")||void 0,i=((s=r.get("packages"))==null?void 0:s.split(","))||[];return{debug:t,pyodide_url:o,packages:i}};const n=e;n.general_initalization=r=>{const t=n.read_url_params();n.startInitialization({...r,...t})};const w=n,c=n;c.init_dedicated_worker=r=>{const t=e;t.onmessage=async i=>{const a=i.data,s=await t.handleMessage(a);t.postMessage(s)};const o={...r,receivepy:(i,a)=>{t.postMessage({cmd:"receive",msg:i,worker_id:a})},receivepy_bytes(i,a){t.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})}};t.general_initalization(o)},w.init_shared_worker=r=>{const t=e;t.connectedPorts=[],t.onconnect=i=>{const a=i.ports[0];t.connectedPorts.push(a),a.start(),console.debug("Port connected in shared worker"),a.onmessage=async s=>{const k=s.data,p=await t.handleMessage(k);a.postMessage(p)}};const o={...r,receivepy:(i,a)=>{t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive",msg:i,worker_id:a})})},receivepy_bytes(i,a){t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})})}};t.general_initalization(o)},(r=>{n.init_shared_worker(r)})({})})();\n';function $(e){return new SharedWorker("data:text/javascript;charset=utf-8,"+encodeURIComponent(z),{name:e==null?void 0:e.name})}const M=e=>(e.worker||(e.worker_classes||(e.worker_classes={Shared:$,Dedicated:j}),e.shared_worker?e.worker_url===void 0?e.worker=new e.worker_classes.Shared({name:e.uuid}):e.worker=new SharedWorker(e.worker_url,{name:e.uuid,type:"module"}):e.worker_url===void 0?e.worker=new e.worker_classes.Dedicated({name:e.uuid}):e.worker=new Worker(e.worker_url,{name:e.uuid,type:"module"})),e.worker);class B extends E.FuncNodesWorker{constructor(r){const t={uuid:L(),...r};if(super(t),this._message_hooks=[],this._worker=M(t),this._worker instanceof SharedWorker)t.shared_worker=!0,this._port=this._worker.port,this._port.start(),this._port.addEventListener("message",this.onmessage.bind(this));else if(this._worker instanceof Worker)t.shared_worker=!1,this._worker.addEventListener("message",this.onmessage.bind(this));else throw new Error("worker must be an instance of Worker or SharedWorker");this.postMessage({cmd:"init",data:{debug:t.debug,pyodide_url:t.pyodide_url,packages:t.packages}});const i=setInterval(()=>{this.postMessage({cmd:"state"})},400);this._workerstate={loaded:!1,msg:"loading",progress:0},this.initPromise=new Promise(async a=>{var c;for(;!this._workerstate.loaded;)await new Promise(k=>setTimeout(k,100));clearInterval(i),this.is_open=!0,(c=this._zustand)==null||c.auto_progress(),a()}),this.initPromise.then(()=>{this.stepwise_fullsync()})}async send(r){await this.initPromise,this.postMessage({cmd:"worker:send",msg:JSON.stringify(r),worker_id:this.uuid})}postMessage(r){r.worker_id=this.uuid,this._port?this._port.postMessage(r):this._worker.postMessage(r)}registerMessageHook(r){return this._message_hooks.push(r),()=>{this._message_hooks=this._message_hooks.filter(t=>t!==r)}}onmessage(r){var t;for(const i of this._message_hooks)i(r.data);if(r.data.result)r.data.result.state&&(this._workerstate={...this._workerstate,...r.data.result.state},r.data.result.state.msg&&r.data.result.state.msg!=="ready"&&((t=this._zustand)==null||t.set_progress({message:this._workerstate.msg,status:"info",progress:this._workerstate.progress,blocking:!0})));else if(r.data.cmd){if(r.data.cmd==="receive"){if(r.data.worker_id===void 0)throw new Error("worker_id is undefined");r.data.worker_id===this.uuid&&this.receive(JSON.parse(r.data.msg))}else if(r.data.cmd==="receive_bytes"){if(r.data.worker_id===void 0)throw new Error("worker_id is undefined");r.data.worker_id===this.uuid&&this.onbytes(r.data.msg)}}}async upload_file({files:r,onProgressCallback:t,root:i}){const a=[],c=r.length;let k=0;if(r.length===0)return"";for(let d=0;d<r.length;d++){const w=r[d],n=new FileReader,p=new Promise((l,s)=>{n.onload=async v=>{var _;try{const g=(_=v.target.result)==null?void 0:_.replace(/^data:.+;base64,/,""),m=w.webkitRelativePath||w.name,b=i?`${i}/${m}`:m,P=await this._send_cmd({cmd:"upload",kwargs:{data:g,filename:b},wait_for_response:!0});k++,t&&t(k,c),l(P)}catch(g){s(g)}},n.readAsDataURL(w)});a.push(p)}const y=await Promise.all(a);return y.reduce((d,w)=>{const n=w.split("/"),p=d.split("/"),l=[];for(let s=0;s<n.length&&n[s]===p[s];s++)l.push(n[s]);return l.join("/")},y[0])}get ready(){return this._workerstate.loaded}}module.exports=B;
package/dist/index.es.js CHANGED
@@ -1,65 +1,83 @@
1
- import { FuncNodesWorker as U } from "@linkdlab/funcnodes_react_flow";
2
- const s = [];
1
+ import { FuncNodesWorker as E } from "@linkdlab/funcnodes_react_flow";
2
+ const o = [];
3
3
  for (let e = 0; e < 256; ++e)
4
- s.push((e + 256).toString(16).slice(1));
5
- function P(e, r = 0) {
6
- return (s[e[r + 0]] + s[e[r + 1]] + s[e[r + 2]] + s[e[r + 3]] + "-" + s[e[r + 4]] + s[e[r + 5]] + "-" + s[e[r + 6]] + s[e[r + 7]] + "-" + s[e[r + 8]] + s[e[r + 9]] + "-" + s[e[r + 10]] + s[e[r + 11]] + s[e[r + 12]] + s[e[r + 13]] + s[e[r + 14]] + s[e[r + 15]]).toLowerCase();
4
+ o.push((e + 256).toString(16).slice(1));
5
+ function W(e, r = 0) {
6
+ return (o[e[r + 0]] + o[e[r + 1]] + o[e[r + 2]] + o[e[r + 3]] + "-" + o[e[r + 4]] + o[e[r + 5]] + "-" + o[e[r + 6]] + o[e[r + 7]] + "-" + o[e[r + 8]] + o[e[r + 9]] + "-" + o[e[r + 10]] + o[e[r + 11]] + o[e[r + 12]] + o[e[r + 13]] + o[e[r + 14]] + o[e[r + 15]]).toLowerCase();
7
7
  }
8
- let k;
9
- const S = new Uint8Array(16);
10
- function x() {
11
- if (!k) {
8
+ let u;
9
+ const R = new Uint8Array(16);
10
+ function U() {
11
+ if (!u) {
12
12
  if (typeof crypto > "u" || !crypto.getRandomValues)
13
13
  throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");
14
- k = crypto.getRandomValues.bind(crypto);
14
+ u = crypto.getRandomValues.bind(crypto);
15
15
  }
16
- return k(S);
16
+ return u(R);
17
17
  }
18
- const E = typeof crypto < "u" && crypto.randomUUID && crypto.randomUUID.bind(crypto), y = { randomUUID: E };
19
- function I(e, r, t) {
20
- var i;
21
- if (y.randomUUID && !e)
22
- return y.randomUUID();
18
+ const I = typeof crypto < "u" && crypto.randomUUID && crypto.randomUUID.bind(crypto), f = { randomUUID: I };
19
+ function L(e, r, t) {
20
+ var a;
21
+ if (f.randomUUID && !e)
22
+ return f.randomUUID();
23
23
  e = e || {};
24
- const o = e.random ?? ((i = e.rng) == null ? void 0 : i.call(e)) ?? x();
25
- if (o.length < 16)
24
+ const i = e.random ?? ((a = e.rng) == null ? void 0 : a.call(e)) ?? U();
25
+ if (i.length < 16)
26
26
  throw new Error("Random bytes length must be >= 16");
27
- return o[6] = o[6] & 15 | 64, o[8] = o[8] & 63 | 128, P(o);
27
+ return i[6] = i[6] & 15 | 64, i[8] = i[8] & 63 | 128, W(i);
28
28
  }
29
- function M(e) {
30
- return new Worker(
31
- "/assets/pyodideDedicatedWorker-XEcNtM2X.js",
32
- {
29
+ const h = '(function(){"use strict";const d="https://cdn.jsdelivr.net/pyodide/v0.27.2/full/pyodide.mjs",e=self;e.workerState={pyodide:null,pyodide_url:d,packages:[],state:{msg:"loading",loaded:!1,progress:0},micropip:null,worker:{},pyodideReady:!1,pyodideReadyPromise:null,debug:!1,interruptBuffer:null,receivepy:(r,t)=>{},receivepy_bytes:(r,t)=>{},handel_register:{},post_pyodide_ready:void 0},e.reset=async()=>{var r;for(const t in e.list_workers())try{const o=await e.get_worker(t);o.worker&&o.worker.stop(),(r=o.reject_promise)==null||r.call(o,"Worker reset")}catch{}e.workerState.pyodide&&e.interrupt(),e.workerState.pyodide=null,e.workerState.micropip=null,e.workerState.worker={},e.workerState.pyodideReady=!1;try{e.workerState.interruptBuffer=new Uint8Array(new SharedArrayBuffer(1)),e.workerState.interruptBuffer[0]=0}catch{}},e.initializePyodide=async()=>{var r,t;if(!e.workerState.pyodide){console.log("initializePyodide with: Debug:",e.workerState.debug,"Pyodide URL:",e.workerState.pyodide_url,"Packages:",e.workerState.packages),console.debug("Loading Pyodide..."),e.workerState.state.msg="Loading Pyodide...",e.workerState.state.progress=0,await e.reset(),console.debug("Loading Pyodide module..."),e.workerState.state.msg="Loading Pyodide module...",e.workerState.state.progress=.1;const o=await import(e.workerState.pyodide_url);console.debug("Loading Pyodide instance..."),e.workerState.state.msg="Loading Pyodide instance...",e.workerState.state.progress=.2;const i=o.loadPyodide,a=e.workerState.pyodide_url.split("/").slice(0,-1).join("/");console.log(a),e.workerState.pyodide=await i({packages:["micropip"],indexURL:a}),e.workerState.interruptBuffer&&e.workerState.pyodide.setInterruptBuffer(e.workerState.interruptBuffer)}e.workerState.micropip||(console.debug("Importing micropip..."),e.workerState.state.msg="Importing micropip...",e.workerState.state.progress=.3,e.workerState.micropip=e.workerState.pyodide.pyimport("micropip")),console.debug("Pyodide ready. Installing funcnodes...");for(const o of e.workerState.packages)console.log("Installing package:",o),e.workerState.state.msg=`Installing package: ${o}`,await e.workerState.micropip.install(o);return e.workerState.state.msg="Installing funcnodes",e.workerState.state.progress=.8,await e.workerState.micropip.install("funcnodes"),e.workerState.state.msg="Installing funcnodes-worker",await e.workerState.micropip.install("funcnodes-worker"),e.workerState.state.msg="Installing funcnodes-pyodide",await e.workerState.micropip.install("funcnodes-pyodide"),e.workerState.state.msg="Installing funcnodes-react-flow",await e.workerState.micropip.install("funcnodes-react-flow"),e.workerState.state.msg="Importing funcnodes",console.debug("Importing funcnodes..."),await e.workerState.pyodide.runPythonAsync("import funcnodes_pyodide"),console.debug("Running post_pyodide_ready..."),await((t=(r=e.workerState).post_pyodide_ready)==null?void 0:t.call(r,e.workerState)),console.debug("Pyodide ready"),e.workerState.state.msg="ready",e.workerState.state.progress=.1,e.workerState.pyodideReady=!0,{pyodide:e.workerState.pyodide,micropip:e.workerState.micropip}},e.interrupt=()=>{e.workerState.interruptBuffer&&(e.workerState.interruptBuffer[0]=1)},e.list_workers=()=>Object.keys(e.workerState.worker),e.get_worker=async r=>{if(!r)throw new Error("Worker id is required");if(!e.workerState.worker[r])throw new Error(`Worker with id ${r} not found`);return await e.workerState.worker[r].make_promise,e.workerState.worker[r]},e.has_worker=r=>{if(!r)throw new Error("Worker id is required");return!!e.workerState.worker[r]},e.get_or_create_worker=async r=>{if(!r)throw new Error("Worker id is required");return e.workerState.worker[r]||(console.log("Creating worker with id",r),await e.initializeFuncNodesWorker(r)),e.get_worker(r)},e.initializeFuncNodesWorker=async r=>{try{if(!e.workerState.pyodideReadyPromise)throw new Error("Pyodide newer initialized");const{pyodide:t}=await e.workerState.pyodideReadyPromise;if(!e.has_worker(r)){e.workerState.worker[r]={worker:null,make_promise:void 0};const o=new Promise(async(i,a)=>{e.workerState.worker[r].reject_promise=a,console.debug(`Creating worker (${r})...`);const s=await t.runPythonAsync(`funcnodes_pyodide.new_worker(debug=${e.workerState.debug?1:0}, uuid="${r}")`);if(console.debug("Worker created:",s),typeof s.set_receiver=="function")s.set_receiver(self);else throw new Error("Worker does not expose a \'set_receiver\' method.");e.workerState.worker[r].worker=s,console.debug("Worker ready"),i(s)});e.workerState.worker[r].make_promise=o}return e.get_worker(r)}catch(t){throw console.error("Error during worker initialization:",t),t}},e.receivepy=(r,t)=>{try{let o={};if(typeof r=="string"?o.msg=r:o=r,o.msg===void 0)return;typeof o.msg!="string"&&(o.msg=JSON.stringify(o.msg)),t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error(`Worker id not provided in receivepy(${JSON.stringify(o)})`);if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy(${JSON.stringify(o)})`);e.workerState.receivepy(r,i)}catch(o){console.error("Error during receivepy:",o);return}},e.receivepy_bytes=(r,t)=>{r=r.toJs();try{let o={};if(r instanceof Uint8Array?o.msg=r:o=r,o.msg===void 0)return;t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error("Worker id not provided in receivepy_bytes");if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy_bytes`);e.workerState.receivepy_bytes(r,i)}catch(o){console.error("Error during receivepy_bytes:",o);return}},e.startInitialization=({debug:r=!1,receivepy:t,receivepy_bytes:o,pyodide_url:i,post_pyodide_ready:a,packages:s})=>(e.workerState.debug=r,e.workerState.pyodide_url=i||d,e.workerState.packages=s,e.workerState.receivepy=t,e.workerState.receivepy_bytes=o,e.workerState.pyodideReadyPromise=null,e.workerState.post_pyodide_ready=a,e.workerState),e.register_cmd_message=(r,t)=>{if(e.workerState.handel_register[r])throw new Error(`Command ${r} already registered`);e.workerState.handel_register[r]=t},e.register_cmd_message("ping",async r=>"pong"),e.register_cmd_message("init",async r=>{if(e.workerState.pyodideReadyPromise)throw new Error("Pyodide is already initialized");r.data&&(r.data.pyodide_url&&(e.workerState.pyodide_url=r.data.pyodide_url),r.data.packages&&(e.workerState.packages=r.data.packages),r.data.debug&&(e.workerState.debug=r.data.debug)),e.workerState.pyodideReadyPromise=e.initializePyodide()}),e.register_cmd_message("_eval",async r=>{var t;try{const o=await((t=e.workerState.pyodide)==null?void 0:t.runPythonAsync(r.msg||"print(\'No code provided\')"));return console.log("Eval result:",o),o}catch(o){console.error("Error during _eval:",o)}}),e.register_cmd_message("state",async r=>({state:{...e.workerState.state,loaded:e.workerState.pyodideReady}})),e.register_cmd_message("worker:state",async r=>({state:{loaded:!!(await e.get_or_create_worker(r.worker_id)).worker}})),e.register_cmd_message("worker:stop",async r=>{var o;if(!e.has_worker(r.worker_id))return;const t=await e.get_or_create_worker(r.worker_id);return t.worker&&(t.worker.stop(),t.worker=null,(o=t.reject_promise)==null||o.call(t,"Worker stopped")),delete e.workerState.worker[r.worker_id],{state:{loaded:!1}}}),e.register_cmd_message("worker:send",async r=>{const t=await e.get_or_create_worker(r.worker_id);if(!t.worker)throw new Error("Worker is not initialized");if(typeof t.worker.receivejs!="function")throw new Error(`Worker does not support receivejs: ${typeof t.worker.receivejs}`);t.worker.receivejs(r.msg)}),e.handleMessage=async r=>{const t={original:r};r.id&&(t.id=r.id),r.toJs===void 0&&(r.toJs=!0);try{if(r.cmd){const o=r;if(e.workerState.handel_register[o.cmd])t.result=await e.workerState.handel_register[o.cmd](o);else throw new Error("Unknown command: "+o.cmd)}else throw new Error("Unknown message format: "+JSON.stringify(r))}catch(o){t.error=o.message}return t},e.read_url_params=()=>{var a,s;const r=new URLSearchParams(self.location.search),t=((a=r.get("debug"))==null?void 0:a.toLowerCase())==="true",o=r.get("pyodide_url")||void 0,i=((s=r.get("packages"))==null?void 0:s.split(","))||[];return{debug:t,pyodide_url:o,packages:i}};const n=e;n.general_initalization=r=>{const t=n.read_url_params();n.startInitialization({...r,...t})};const w=n,c=n;c.init_dedicated_worker=r=>{const t=e;t.onmessage=async i=>{const a=i.data,s=await t.handleMessage(a);t.postMessage(s)};const o={...r,receivepy:(i,a)=>{t.postMessage({cmd:"receive",msg:i,worker_id:a})},receivepy_bytes(i,a){t.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})}};t.general_initalization(o)},w.init_shared_worker=r=>{const t=e;t.connectedPorts=[],t.onconnect=i=>{const a=i.ports[0];t.connectedPorts.push(a),a.start(),console.debug("Port connected in shared worker"),a.onmessage=async s=>{const k=s.data,p=await t.handleMessage(k);a.postMessage(p)}};const o={...r,receivepy:(i,a)=>{t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive",msg:i,worker_id:a})})},receivepy_bytes(i,a){t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})})}};t.general_initalization(o)},(r=>{n.init_dedicated_worker(r)})({})})();\n', S = typeof self < "u" && self.Blob && new Blob([h], { type: "text/javascript;charset=utf-8" });
30
+ function j(e) {
31
+ let r;
32
+ try {
33
+ if (r = S && (self.URL || self.webkitURL).createObjectURL(S), !r) throw "";
34
+ const t = new Worker(r, {
33
35
  name: e == null ? void 0 : e.name
34
- }
35
- );
36
+ });
37
+ return t.addEventListener("error", () => {
38
+ (self.URL || self.webkitURL).revokeObjectURL(r);
39
+ }), t;
40
+ } catch {
41
+ return new Worker(
42
+ "data:text/javascript;charset=utf-8," + encodeURIComponent(h),
43
+ {
44
+ name: e == null ? void 0 : e.name
45
+ }
46
+ );
47
+ } finally {
48
+ r && (self.URL || self.webkitURL).revokeObjectURL(r);
49
+ }
36
50
  }
37
- function R(e) {
38
- return new Worker(
39
- "/assets/pyodideSharedWorker-BIPs7KQu.js",
51
+ const z = '(function(){"use strict";const d="https://cdn.jsdelivr.net/pyodide/v0.27.2/full/pyodide.mjs",e=self;e.workerState={pyodide:null,pyodide_url:d,packages:[],state:{msg:"loading",loaded:!1,progress:0},micropip:null,worker:{},pyodideReady:!1,pyodideReadyPromise:null,debug:!1,interruptBuffer:null,receivepy:(r,t)=>{},receivepy_bytes:(r,t)=>{},handel_register:{},post_pyodide_ready:void 0},e.reset=async()=>{var r;for(const t in e.list_workers())try{const o=await e.get_worker(t);o.worker&&o.worker.stop(),(r=o.reject_promise)==null||r.call(o,"Worker reset")}catch{}e.workerState.pyodide&&e.interrupt(),e.workerState.pyodide=null,e.workerState.micropip=null,e.workerState.worker={},e.workerState.pyodideReady=!1;try{e.workerState.interruptBuffer=new Uint8Array(new SharedArrayBuffer(1)),e.workerState.interruptBuffer[0]=0}catch{}},e.initializePyodide=async()=>{var r,t;if(!e.workerState.pyodide){console.log("initializePyodide with: Debug:",e.workerState.debug,"Pyodide URL:",e.workerState.pyodide_url,"Packages:",e.workerState.packages),console.debug("Loading Pyodide..."),e.workerState.state.msg="Loading Pyodide...",e.workerState.state.progress=0,await e.reset(),console.debug("Loading Pyodide module..."),e.workerState.state.msg="Loading Pyodide module...",e.workerState.state.progress=.1;const o=await import(e.workerState.pyodide_url);console.debug("Loading Pyodide instance..."),e.workerState.state.msg="Loading Pyodide instance...",e.workerState.state.progress=.2;const i=o.loadPyodide,a=e.workerState.pyodide_url.split("/").slice(0,-1).join("/");console.log(a),e.workerState.pyodide=await i({packages:["micropip"],indexURL:a}),e.workerState.interruptBuffer&&e.workerState.pyodide.setInterruptBuffer(e.workerState.interruptBuffer)}e.workerState.micropip||(console.debug("Importing micropip..."),e.workerState.state.msg="Importing micropip...",e.workerState.state.progress=.3,e.workerState.micropip=e.workerState.pyodide.pyimport("micropip")),console.debug("Pyodide ready. Installing funcnodes...");for(const o of e.workerState.packages)console.log("Installing package:",o),e.workerState.state.msg=`Installing package: ${o}`,await e.workerState.micropip.install(o);return e.workerState.state.msg="Installing funcnodes",e.workerState.state.progress=.8,await e.workerState.micropip.install("funcnodes"),e.workerState.state.msg="Installing funcnodes-worker",await e.workerState.micropip.install("funcnodes-worker"),e.workerState.state.msg="Installing funcnodes-pyodide",await e.workerState.micropip.install("funcnodes-pyodide"),e.workerState.state.msg="Installing funcnodes-react-flow",await e.workerState.micropip.install("funcnodes-react-flow"),e.workerState.state.msg="Importing funcnodes",console.debug("Importing funcnodes..."),await e.workerState.pyodide.runPythonAsync("import funcnodes_pyodide"),console.debug("Running post_pyodide_ready..."),await((t=(r=e.workerState).post_pyodide_ready)==null?void 0:t.call(r,e.workerState)),console.debug("Pyodide ready"),e.workerState.state.msg="ready",e.workerState.state.progress=.1,e.workerState.pyodideReady=!0,{pyodide:e.workerState.pyodide,micropip:e.workerState.micropip}},e.interrupt=()=>{e.workerState.interruptBuffer&&(e.workerState.interruptBuffer[0]=1)},e.list_workers=()=>Object.keys(e.workerState.worker),e.get_worker=async r=>{if(!r)throw new Error("Worker id is required");if(!e.workerState.worker[r])throw new Error(`Worker with id ${r} not found`);return await e.workerState.worker[r].make_promise,e.workerState.worker[r]},e.has_worker=r=>{if(!r)throw new Error("Worker id is required");return!!e.workerState.worker[r]},e.get_or_create_worker=async r=>{if(!r)throw new Error("Worker id is required");return e.workerState.worker[r]||(console.log("Creating worker with id",r),await e.initializeFuncNodesWorker(r)),e.get_worker(r)},e.initializeFuncNodesWorker=async r=>{try{if(!e.workerState.pyodideReadyPromise)throw new Error("Pyodide newer initialized");const{pyodide:t}=await e.workerState.pyodideReadyPromise;if(!e.has_worker(r)){e.workerState.worker[r]={worker:null,make_promise:void 0};const o=new Promise(async(i,a)=>{e.workerState.worker[r].reject_promise=a,console.debug(`Creating worker (${r})...`);const s=await t.runPythonAsync(`funcnodes_pyodide.new_worker(debug=${e.workerState.debug?1:0}, uuid="${r}")`);if(console.debug("Worker created:",s),typeof s.set_receiver=="function")s.set_receiver(self);else throw new Error("Worker does not expose a \'set_receiver\' method.");e.workerState.worker[r].worker=s,console.debug("Worker ready"),i(s)});e.workerState.worker[r].make_promise=o}return e.get_worker(r)}catch(t){throw console.error("Error during worker initialization:",t),t}},e.receivepy=(r,t)=>{try{let o={};if(typeof r=="string"?o.msg=r:o=r,o.msg===void 0)return;typeof o.msg!="string"&&(o.msg=JSON.stringify(o.msg)),t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error(`Worker id not provided in receivepy(${JSON.stringify(o)})`);if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy(${JSON.stringify(o)})`);e.workerState.receivepy(r,i)}catch(o){console.error("Error during receivepy:",o);return}},e.receivepy_bytes=(r,t)=>{r=r.toJs();try{let o={};if(r instanceof Uint8Array?o.msg=r:o=r,o.msg===void 0)return;t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error("Worker id not provided in receivepy_bytes");if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy_bytes`);e.workerState.receivepy_bytes(r,i)}catch(o){console.error("Error during receivepy_bytes:",o);return}},e.startInitialization=({debug:r=!1,receivepy:t,receivepy_bytes:o,pyodide_url:i,post_pyodide_ready:a,packages:s})=>(e.workerState.debug=r,e.workerState.pyodide_url=i||d,e.workerState.packages=s,e.workerState.receivepy=t,e.workerState.receivepy_bytes=o,e.workerState.pyodideReadyPromise=null,e.workerState.post_pyodide_ready=a,e.workerState),e.register_cmd_message=(r,t)=>{if(e.workerState.handel_register[r])throw new Error(`Command ${r} already registered`);e.workerState.handel_register[r]=t},e.register_cmd_message("ping",async r=>"pong"),e.register_cmd_message("init",async r=>{if(e.workerState.pyodideReadyPromise)throw new Error("Pyodide is already initialized");r.data&&(r.data.pyodide_url&&(e.workerState.pyodide_url=r.data.pyodide_url),r.data.packages&&(e.workerState.packages=r.data.packages),r.data.debug&&(e.workerState.debug=r.data.debug)),e.workerState.pyodideReadyPromise=e.initializePyodide()}),e.register_cmd_message("_eval",async r=>{var t;try{const o=await((t=e.workerState.pyodide)==null?void 0:t.runPythonAsync(r.msg||"print(\'No code provided\')"));return console.log("Eval result:",o),o}catch(o){console.error("Error during _eval:",o)}}),e.register_cmd_message("state",async r=>({state:{...e.workerState.state,loaded:e.workerState.pyodideReady}})),e.register_cmd_message("worker:state",async r=>({state:{loaded:!!(await e.get_or_create_worker(r.worker_id)).worker}})),e.register_cmd_message("worker:stop",async r=>{var o;if(!e.has_worker(r.worker_id))return;const t=await e.get_or_create_worker(r.worker_id);return t.worker&&(t.worker.stop(),t.worker=null,(o=t.reject_promise)==null||o.call(t,"Worker stopped")),delete e.workerState.worker[r.worker_id],{state:{loaded:!1}}}),e.register_cmd_message("worker:send",async r=>{const t=await e.get_or_create_worker(r.worker_id);if(!t.worker)throw new Error("Worker is not initialized");if(typeof t.worker.receivejs!="function")throw new Error(`Worker does not support receivejs: ${typeof t.worker.receivejs}`);t.worker.receivejs(r.msg)}),e.handleMessage=async r=>{const t={original:r};r.id&&(t.id=r.id),r.toJs===void 0&&(r.toJs=!0);try{if(r.cmd){const o=r;if(e.workerState.handel_register[o.cmd])t.result=await e.workerState.handel_register[o.cmd](o);else throw new Error("Unknown command: "+o.cmd)}else throw new Error("Unknown message format: "+JSON.stringify(r))}catch(o){t.error=o.message}return t},e.read_url_params=()=>{var a,s;const r=new URLSearchParams(self.location.search),t=((a=r.get("debug"))==null?void 0:a.toLowerCase())==="true",o=r.get("pyodide_url")||void 0,i=((s=r.get("packages"))==null?void 0:s.split(","))||[];return{debug:t,pyodide_url:o,packages:i}};const n=e;n.general_initalization=r=>{const t=n.read_url_params();n.startInitialization({...r,...t})};const w=n,c=n;c.init_dedicated_worker=r=>{const t=e;t.onmessage=async i=>{const a=i.data,s=await t.handleMessage(a);t.postMessage(s)};const o={...r,receivepy:(i,a)=>{t.postMessage({cmd:"receive",msg:i,worker_id:a})},receivepy_bytes(i,a){t.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})}};t.general_initalization(o)},w.init_shared_worker=r=>{const t=e;t.connectedPorts=[],t.onconnect=i=>{const a=i.ports[0];t.connectedPorts.push(a),a.start(),console.debug("Port connected in shared worker"),a.onmessage=async s=>{const k=s.data,p=await t.handleMessage(k);a.postMessage(p)}};const o={...r,receivepy:(i,a)=>{t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive",msg:i,worker_id:a})})},receivepy_bytes(i,a){t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})})}};t.general_initalization(o)},(r=>{n.init_shared_worker(r)})({})})();\n';
52
+ function $(e) {
53
+ return new SharedWorker(
54
+ "data:text/javascript;charset=utf-8," + encodeURIComponent(z),
40
55
  {
41
56
  name: e == null ? void 0 : e.name
42
57
  }
43
58
  );
44
59
  }
45
- const D = (e) => (e.worker || (e.shared_worker ? e.worker_url === void 0 ? e.worker = new R({
60
+ const M = (e) => (e.worker || (e.worker_classes || (e.worker_classes = {
61
+ Shared: $,
62
+ Dedicated: j
63
+ }), e.shared_worker ? e.worker_url === void 0 ? e.worker = new e.worker_classes.Shared({
46
64
  name: e.uuid
47
65
  }) : e.worker = new SharedWorker(e.worker_url, {
48
66
  name: e.uuid,
49
67
  type: "module"
50
- }) : e.worker_url === void 0 ? e.worker = new M({
68
+ }) : e.worker_url === void 0 ? e.worker = new e.worker_classes.Dedicated({
51
69
  name: e.uuid
52
70
  }) : e.worker = new Worker(e.worker_url, {
53
71
  name: e.uuid,
54
72
  type: "module"
55
73
  })), e.worker);
56
- class N extends U {
74
+ class J extends E {
57
75
  constructor(r) {
58
76
  const t = {
59
- uuid: I(),
77
+ uuid: L(),
60
78
  ...r
61
79
  };
62
- if (super(t), this._message_hooks = [], this._worker = D(t), this._worker instanceof SharedWorker)
80
+ if (super(t), this._message_hooks = [], this._worker = M(t), this._worker instanceof SharedWorker)
63
81
  t.shared_worker = !0, this._port = this._worker.port, this._port.start(), this._port.addEventListener("message", this.onmessage.bind(this));
64
82
  else if (this._worker instanceof Worker)
65
83
  t.shared_worker = !1, this._worker.addEventListener("message", this.onmessage.bind(this));
@@ -73,14 +91,14 @@ class N extends U {
73
91
  packages: t.packages
74
92
  }
75
93
  });
76
- const o = setInterval(() => {
94
+ const i = setInterval(() => {
77
95
  this.postMessage({ cmd: "state" });
78
96
  }, 400);
79
- this._workerstate = { loaded: !1, msg: "loading", progress: 0 }, this.initPromise = new Promise(async (i) => {
97
+ this._workerstate = { loaded: !1, msg: "loading", progress: 0 }, this.initPromise = new Promise(async (a) => {
80
98
  var c;
81
99
  for (; !this._workerstate.loaded; )
82
- await new Promise((h) => setTimeout(h, 100));
83
- clearInterval(o), this.is_open = !0, (c = this._zustand) == null || c.auto_progress(), i();
100
+ await new Promise((k) => setTimeout(k, 100));
101
+ clearInterval(i), this.is_open = !0, (c = this._zustand) == null || c.auto_progress(), a();
84
102
  }), this.initPromise.then(() => {
85
103
  this.stepwise_fullsync();
86
104
  });
@@ -102,8 +120,8 @@ class N extends U {
102
120
  }
103
121
  onmessage(r) {
104
122
  var t;
105
- for (const o of this._message_hooks)
106
- o(r.data);
123
+ for (const i of this._message_hooks)
124
+ i(r.data);
107
125
  if (r.data.result)
108
126
  r.data.result.state && (this._workerstate = {
109
127
  ...this._workerstate,
@@ -129,39 +147,42 @@ class N extends U {
129
147
  async upload_file({
130
148
  files: r,
131
149
  onProgressCallback: t,
132
- root: o
150
+ root: i
133
151
  }) {
134
- const i = [], c = r.length;
135
- let h = 0;
152
+ const a = [], c = r.length;
153
+ let k = 0;
136
154
  if (r.length === 0)
137
155
  return "";
138
156
  for (let d = 0; d < r.length; d++) {
139
- const u = r[d], a = new FileReader(), m = new Promise((l, n) => {
140
- a.onload = async (f) => {
141
- var g;
157
+ const w = r[d], n = new FileReader(), p = new Promise((l, s) => {
158
+ n.onload = async (v) => {
159
+ var _;
142
160
  try {
143
- const w = (g = f.target.result) == null ? void 0 : g.replace(/^data:.+;base64,/, ""), p = u.webkitRelativePath || u.name, b = o ? `${o}/${p}` : p, W = await this._send_cmd({
161
+ const g = (_ = v.target.result) == null ? void 0 : _.replace(/^data:.+;base64,/, ""), m = w.webkitRelativePath || w.name, b = i ? `${i}/${m}` : m, P = await this._send_cmd({
144
162
  cmd: "upload",
145
- kwargs: { data: w, filename: b },
163
+ kwargs: { data: g, filename: b },
146
164
  wait_for_response: !0
147
165
  });
148
- h++, t && t(h, c), l(W);
149
- } catch (w) {
150
- n(w);
166
+ k++, t && t(k, c), l(P);
167
+ } catch (g) {
168
+ s(g);
151
169
  }
152
- }, a.readAsDataURL(u);
170
+ }, n.readAsDataURL(w);
153
171
  });
154
- i.push(m);
172
+ a.push(p);
155
173
  }
156
- const _ = await Promise.all(i);
157
- return _.reduce((d, u) => {
158
- const a = u.split("/"), m = d.split("/"), l = [];
159
- for (let n = 0; n < a.length && a[n] === m[n]; n++)
160
- l.push(a[n]);
174
+ const y = await Promise.all(a);
175
+ return y.reduce((d, w) => {
176
+ const n = w.split("/"), p = d.split("/"), l = [];
177
+ for (let s = 0; s < n.length && n[s] === p[s]; s++)
178
+ l.push(n[s]);
161
179
  return l.join("/");
162
- }, _[0]);
180
+ }, y[0]);
181
+ }
182
+ get ready() {
183
+ return this._workerstate.loaded;
163
184
  }
164
185
  }
165
186
  export {
166
- N as default
187
+ J as default
167
188
  };
package/dist/index.umd.js CHANGED
@@ -1 +1 @@
1
- (function(a,s){typeof exports=="object"&&typeof module<"u"?module.exports=s(require("@linkdlab/funcnodes_react_flow")):typeof define=="function"&&define.amd?define(["@linkdlab/funcnodes_react_flow"],s):(a=typeof globalThis<"u"?globalThis:a||self,a.funcnodes_pyodide_react_flow=s(a.funcnodes_react_flow))})(this,function(a){"use strict";const s=[];for(let e=0;e<256;++e)s.push((e+256).toString(16).slice(1));function b(e,r=0){return(s[e[r+0]]+s[e[r+1]]+s[e[r+2]]+s[e[r+3]]+"-"+s[e[r+4]]+s[e[r+5]]+"-"+s[e[r+6]]+s[e[r+7]]+"-"+s[e[r+8]]+s[e[r+9]]+"-"+s[e[r+10]]+s[e[r+11]]+s[e[r+12]]+s[e[r+13]]+s[e[r+14]]+s[e[r+15]]).toLowerCase()}let w;const W=new Uint8Array(16);function U(){if(!w){if(typeof crypto>"u"||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");w=crypto.getRandomValues.bind(crypto)}return w(W)}const g={randomUUID:typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};function P(e,r,t){var i;if(g.randomUUID&&!e)return g.randomUUID();e=e||{};const o=e.random??((i=e.rng)==null?void 0:i.call(e))??U();if(o.length<16)throw new Error("Random bytes length must be >= 16");return o[6]=o[6]&15|64,o[8]=o[8]&63|128,b(o)}function x(e){return new Worker("/assets/pyodideDedicatedWorker-XEcNtM2X.js",{name:e==null?void 0:e.name})}function I(e){return new Worker("/assets/pyodideSharedWorker-BIPs7KQu.js",{name:e==null?void 0:e.name})}const S=e=>(e.worker||(e.shared_worker?e.worker_url===void 0?e.worker=new I({name:e.uuid}):e.worker=new SharedWorker(e.worker_url,{name:e.uuid,type:"module"}):e.worker_url===void 0?e.worker=new x({name:e.uuid}):e.worker=new Worker(e.worker_url,{name:e.uuid,type:"module"})),e.worker);class D extends a.FuncNodesWorker{constructor(r){const t={uuid:P(),...r};if(super(t),this._message_hooks=[],this._worker=S(t),this._worker instanceof SharedWorker)t.shared_worker=!0,this._port=this._worker.port,this._port.start(),this._port.addEventListener("message",this.onmessage.bind(this));else if(this._worker instanceof Worker)t.shared_worker=!1,this._worker.addEventListener("message",this.onmessage.bind(this));else throw new Error("worker must be an instance of Worker or SharedWorker");this.postMessage({cmd:"init",data:{debug:t.debug,pyodide_url:t.pyodide_url,packages:t.packages}});const o=setInterval(()=>{this.postMessage({cmd:"state"})},400);this._workerstate={loaded:!1,msg:"loading",progress:0},this.initPromise=new Promise(async i=>{var l;for(;!this._workerstate.loaded;)await new Promise(h=>setTimeout(h,100));clearInterval(o),this.is_open=!0,(l=this._zustand)==null||l.auto_progress(),i()}),this.initPromise.then(()=>{this.stepwise_fullsync()})}async send(r){await this.initPromise,this.postMessage({cmd:"worker:send",msg:JSON.stringify(r),worker_id:this.uuid})}postMessage(r){r.worker_id=this.uuid,this._port?this._port.postMessage(r):this._worker.postMessage(r)}registerMessageHook(r){return this._message_hooks.push(r),()=>{this._message_hooks=this._message_hooks.filter(t=>t!==r)}}onmessage(r){var t;for(const o of this._message_hooks)o(r.data);if(r.data.result)r.data.result.state&&(this._workerstate={...this._workerstate,...r.data.result.state},r.data.result.state.msg&&r.data.result.state.msg!=="ready"&&((t=this._zustand)==null||t.set_progress({message:this._workerstate.msg,status:"info",progress:this._workerstate.progress,blocking:!0})));else if(r.data.cmd){if(r.data.cmd==="receive"){if(r.data.worker_id===void 0)throw new Error("worker_id is undefined");r.data.worker_id===this.uuid&&this.receive(JSON.parse(r.data.msg))}else if(r.data.cmd==="receive_bytes"){if(r.data.worker_id===void 0)throw new Error("worker_id is undefined");r.data.worker_id===this.uuid&&this.onbytes(r.data.msg)}}}async upload_file({files:r,onProgressCallback:t,root:o}){const i=[],l=r.length;let h=0;if(r.length===0)return"";for(let u=0;u<r.length;u++){const c=r[u],d=new FileReader,_=new Promise((m,n)=>{d.onload=async E=>{var f;try{const k=(f=E.target.result)==null?void 0:f.replace(/^data:.+;base64,/,""),y=c.webkitRelativePath||c.name,M=o?`${o}/${y}`:y,R=await this._send_cmd({cmd:"upload",kwargs:{data:k,filename:M},wait_for_response:!0});h++,t&&t(h,l),m(R)}catch(k){n(k)}},d.readAsDataURL(c)});i.push(_)}const p=await Promise.all(i);return p.reduce((u,c)=>{const d=c.split("/"),_=u.split("/"),m=[];for(let n=0;n<d.length&&d[n]===_[n];n++)m.push(d[n]);return m.join("/")},p[0])}}return D});
1
+ (function(n,t){typeof exports=="object"&&typeof module<"u"?module.exports=t(require("@linkdlab/funcnodes_react_flow")):typeof define=="function"&&define.amd?define(["@linkdlab/funcnodes_react_flow"],t):(n=typeof globalThis<"u"?globalThis:n||self,n.funcnodes_pyodide_react_flow=t(n.funcnodes_react_flow))})(this,function(n){"use strict";const t=[];for(let e=0;e<256;++e)t.push((e+256).toString(16).slice(1));function b(e,r=0){return(t[e[r+0]]+t[e[r+1]]+t[e[r+2]]+t[e[r+3]]+"-"+t[e[r+4]]+t[e[r+5]]+"-"+t[e[r+6]]+t[e[r+7]]+"-"+t[e[r+8]]+t[e[r+9]]+"-"+t[e[r+10]]+t[e[r+11]]+t[e[r+12]]+t[e[r+13]]+t[e[r+14]]+t[e[r+15]]).toLowerCase()}let g;const P=new Uint8Array(16);function E(){if(!g){if(typeof crypto>"u"||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");g=crypto.getRandomValues.bind(crypto)}return g(P)}const _={randomUUID:typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};function W(e,r,o){var s;if(_.randomUUID&&!e)return _.randomUUID();e=e||{};const i=e.random??((s=e.rng)==null?void 0:s.call(e))??E();if(i.length<16)throw new Error("Random bytes length must be >= 16");return i[6]=i[6]&15|64,i[8]=i[8]&63|128,b(i)}const m='(function(){"use strict";const d="https://cdn.jsdelivr.net/pyodide/v0.27.2/full/pyodide.mjs",e=self;e.workerState={pyodide:null,pyodide_url:d,packages:[],state:{msg:"loading",loaded:!1,progress:0},micropip:null,worker:{},pyodideReady:!1,pyodideReadyPromise:null,debug:!1,interruptBuffer:null,receivepy:(r,t)=>{},receivepy_bytes:(r,t)=>{},handel_register:{},post_pyodide_ready:void 0},e.reset=async()=>{var r;for(const t in e.list_workers())try{const o=await e.get_worker(t);o.worker&&o.worker.stop(),(r=o.reject_promise)==null||r.call(o,"Worker reset")}catch{}e.workerState.pyodide&&e.interrupt(),e.workerState.pyodide=null,e.workerState.micropip=null,e.workerState.worker={},e.workerState.pyodideReady=!1;try{e.workerState.interruptBuffer=new Uint8Array(new SharedArrayBuffer(1)),e.workerState.interruptBuffer[0]=0}catch{}},e.initializePyodide=async()=>{var r,t;if(!e.workerState.pyodide){console.log("initializePyodide with: Debug:",e.workerState.debug,"Pyodide URL:",e.workerState.pyodide_url,"Packages:",e.workerState.packages),console.debug("Loading Pyodide..."),e.workerState.state.msg="Loading Pyodide...",e.workerState.state.progress=0,await e.reset(),console.debug("Loading Pyodide module..."),e.workerState.state.msg="Loading Pyodide module...",e.workerState.state.progress=.1;const o=await import(e.workerState.pyodide_url);console.debug("Loading Pyodide instance..."),e.workerState.state.msg="Loading Pyodide instance...",e.workerState.state.progress=.2;const i=o.loadPyodide,a=e.workerState.pyodide_url.split("/").slice(0,-1).join("/");console.log(a),e.workerState.pyodide=await i({packages:["micropip"],indexURL:a}),e.workerState.interruptBuffer&&e.workerState.pyodide.setInterruptBuffer(e.workerState.interruptBuffer)}e.workerState.micropip||(console.debug("Importing micropip..."),e.workerState.state.msg="Importing micropip...",e.workerState.state.progress=.3,e.workerState.micropip=e.workerState.pyodide.pyimport("micropip")),console.debug("Pyodide ready. Installing funcnodes...");for(const o of e.workerState.packages)console.log("Installing package:",o),e.workerState.state.msg=`Installing package: ${o}`,await e.workerState.micropip.install(o);return e.workerState.state.msg="Installing funcnodes",e.workerState.state.progress=.8,await e.workerState.micropip.install("funcnodes"),e.workerState.state.msg="Installing funcnodes-worker",await e.workerState.micropip.install("funcnodes-worker"),e.workerState.state.msg="Installing funcnodes-pyodide",await e.workerState.micropip.install("funcnodes-pyodide"),e.workerState.state.msg="Installing funcnodes-react-flow",await e.workerState.micropip.install("funcnodes-react-flow"),e.workerState.state.msg="Importing funcnodes",console.debug("Importing funcnodes..."),await e.workerState.pyodide.runPythonAsync("import funcnodes_pyodide"),console.debug("Running post_pyodide_ready..."),await((t=(r=e.workerState).post_pyodide_ready)==null?void 0:t.call(r,e.workerState)),console.debug("Pyodide ready"),e.workerState.state.msg="ready",e.workerState.state.progress=.1,e.workerState.pyodideReady=!0,{pyodide:e.workerState.pyodide,micropip:e.workerState.micropip}},e.interrupt=()=>{e.workerState.interruptBuffer&&(e.workerState.interruptBuffer[0]=1)},e.list_workers=()=>Object.keys(e.workerState.worker),e.get_worker=async r=>{if(!r)throw new Error("Worker id is required");if(!e.workerState.worker[r])throw new Error(`Worker with id ${r} not found`);return await e.workerState.worker[r].make_promise,e.workerState.worker[r]},e.has_worker=r=>{if(!r)throw new Error("Worker id is required");return!!e.workerState.worker[r]},e.get_or_create_worker=async r=>{if(!r)throw new Error("Worker id is required");return e.workerState.worker[r]||(console.log("Creating worker with id",r),await e.initializeFuncNodesWorker(r)),e.get_worker(r)},e.initializeFuncNodesWorker=async r=>{try{if(!e.workerState.pyodideReadyPromise)throw new Error("Pyodide newer initialized");const{pyodide:t}=await e.workerState.pyodideReadyPromise;if(!e.has_worker(r)){e.workerState.worker[r]={worker:null,make_promise:void 0};const o=new Promise(async(i,a)=>{e.workerState.worker[r].reject_promise=a,console.debug(`Creating worker (${r})...`);const s=await t.runPythonAsync(`funcnodes_pyodide.new_worker(debug=${e.workerState.debug?1:0}, uuid="${r}")`);if(console.debug("Worker created:",s),typeof s.set_receiver=="function")s.set_receiver(self);else throw new Error("Worker does not expose a \'set_receiver\' method.");e.workerState.worker[r].worker=s,console.debug("Worker ready"),i(s)});e.workerState.worker[r].make_promise=o}return e.get_worker(r)}catch(t){throw console.error("Error during worker initialization:",t),t}},e.receivepy=(r,t)=>{try{let o={};if(typeof r=="string"?o.msg=r:o=r,o.msg===void 0)return;typeof o.msg!="string"&&(o.msg=JSON.stringify(o.msg)),t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error(`Worker id not provided in receivepy(${JSON.stringify(o)})`);if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy(${JSON.stringify(o)})`);e.workerState.receivepy(r,i)}catch(o){console.error("Error during receivepy:",o);return}},e.receivepy_bytes=(r,t)=>{r=r.toJs();try{let o={};if(r instanceof Uint8Array?o.msg=r:o=r,o.msg===void 0)return;t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error("Worker id not provided in receivepy_bytes");if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy_bytes`);e.workerState.receivepy_bytes(r,i)}catch(o){console.error("Error during receivepy_bytes:",o);return}},e.startInitialization=({debug:r=!1,receivepy:t,receivepy_bytes:o,pyodide_url:i,post_pyodide_ready:a,packages:s})=>(e.workerState.debug=r,e.workerState.pyodide_url=i||d,e.workerState.packages=s,e.workerState.receivepy=t,e.workerState.receivepy_bytes=o,e.workerState.pyodideReadyPromise=null,e.workerState.post_pyodide_ready=a,e.workerState),e.register_cmd_message=(r,t)=>{if(e.workerState.handel_register[r])throw new Error(`Command ${r} already registered`);e.workerState.handel_register[r]=t},e.register_cmd_message("ping",async r=>"pong"),e.register_cmd_message("init",async r=>{if(e.workerState.pyodideReadyPromise)throw new Error("Pyodide is already initialized");r.data&&(r.data.pyodide_url&&(e.workerState.pyodide_url=r.data.pyodide_url),r.data.packages&&(e.workerState.packages=r.data.packages),r.data.debug&&(e.workerState.debug=r.data.debug)),e.workerState.pyodideReadyPromise=e.initializePyodide()}),e.register_cmd_message("_eval",async r=>{var t;try{const o=await((t=e.workerState.pyodide)==null?void 0:t.runPythonAsync(r.msg||"print(\'No code provided\')"));return console.log("Eval result:",o),o}catch(o){console.error("Error during _eval:",o)}}),e.register_cmd_message("state",async r=>({state:{...e.workerState.state,loaded:e.workerState.pyodideReady}})),e.register_cmd_message("worker:state",async r=>({state:{loaded:!!(await e.get_or_create_worker(r.worker_id)).worker}})),e.register_cmd_message("worker:stop",async r=>{var o;if(!e.has_worker(r.worker_id))return;const t=await e.get_or_create_worker(r.worker_id);return t.worker&&(t.worker.stop(),t.worker=null,(o=t.reject_promise)==null||o.call(t,"Worker stopped")),delete e.workerState.worker[r.worker_id],{state:{loaded:!1}}}),e.register_cmd_message("worker:send",async r=>{const t=await e.get_or_create_worker(r.worker_id);if(!t.worker)throw new Error("Worker is not initialized");if(typeof t.worker.receivejs!="function")throw new Error(`Worker does not support receivejs: ${typeof t.worker.receivejs}`);t.worker.receivejs(r.msg)}),e.handleMessage=async r=>{const t={original:r};r.id&&(t.id=r.id),r.toJs===void 0&&(r.toJs=!0);try{if(r.cmd){const o=r;if(e.workerState.handel_register[o.cmd])t.result=await e.workerState.handel_register[o.cmd](o);else throw new Error("Unknown command: "+o.cmd)}else throw new Error("Unknown message format: "+JSON.stringify(r))}catch(o){t.error=o.message}return t},e.read_url_params=()=>{var a,s;const r=new URLSearchParams(self.location.search),t=((a=r.get("debug"))==null?void 0:a.toLowerCase())==="true",o=r.get("pyodide_url")||void 0,i=((s=r.get("packages"))==null?void 0:s.split(","))||[];return{debug:t,pyodide_url:o,packages:i}};const n=e;n.general_initalization=r=>{const t=n.read_url_params();n.startInitialization({...r,...t})};const w=n,c=n;c.init_dedicated_worker=r=>{const t=e;t.onmessage=async i=>{const a=i.data,s=await t.handleMessage(a);t.postMessage(s)};const o={...r,receivepy:(i,a)=>{t.postMessage({cmd:"receive",msg:i,worker_id:a})},receivepy_bytes(i,a){t.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})}};t.general_initalization(o)},w.init_shared_worker=r=>{const t=e;t.connectedPorts=[],t.onconnect=i=>{const a=i.ports[0];t.connectedPorts.push(a),a.start(),console.debug("Port connected in shared worker"),a.onmessage=async s=>{const k=s.data,p=await t.handleMessage(k);a.postMessage(p)}};const o={...r,receivepy:(i,a)=>{t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive",msg:i,worker_id:a})})},receivepy_bytes(i,a){t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})})}};t.general_initalization(o)},(r=>{n.init_dedicated_worker(r)})({})})();\n',f=typeof self<"u"&&self.Blob&&new Blob([m],{type:"text/javascript;charset=utf-8"});function R(e){let r;try{if(r=f&&(self.URL||self.webkitURL).createObjectURL(f),!r)throw"";const o=new Worker(r,{name:e==null?void 0:e.name});return o.addEventListener("error",()=>{(self.URL||self.webkitURL).revokeObjectURL(r)}),o}catch{return new Worker("data:text/javascript;charset=utf-8,"+encodeURIComponent(m),{name:e==null?void 0:e.name})}finally{r&&(self.URL||self.webkitURL).revokeObjectURL(r)}}const U='(function(){"use strict";const d="https://cdn.jsdelivr.net/pyodide/v0.27.2/full/pyodide.mjs",e=self;e.workerState={pyodide:null,pyodide_url:d,packages:[],state:{msg:"loading",loaded:!1,progress:0},micropip:null,worker:{},pyodideReady:!1,pyodideReadyPromise:null,debug:!1,interruptBuffer:null,receivepy:(r,t)=>{},receivepy_bytes:(r,t)=>{},handel_register:{},post_pyodide_ready:void 0},e.reset=async()=>{var r;for(const t in e.list_workers())try{const o=await e.get_worker(t);o.worker&&o.worker.stop(),(r=o.reject_promise)==null||r.call(o,"Worker reset")}catch{}e.workerState.pyodide&&e.interrupt(),e.workerState.pyodide=null,e.workerState.micropip=null,e.workerState.worker={},e.workerState.pyodideReady=!1;try{e.workerState.interruptBuffer=new Uint8Array(new SharedArrayBuffer(1)),e.workerState.interruptBuffer[0]=0}catch{}},e.initializePyodide=async()=>{var r,t;if(!e.workerState.pyodide){console.log("initializePyodide with: Debug:",e.workerState.debug,"Pyodide URL:",e.workerState.pyodide_url,"Packages:",e.workerState.packages),console.debug("Loading Pyodide..."),e.workerState.state.msg="Loading Pyodide...",e.workerState.state.progress=0,await e.reset(),console.debug("Loading Pyodide module..."),e.workerState.state.msg="Loading Pyodide module...",e.workerState.state.progress=.1;const o=await import(e.workerState.pyodide_url);console.debug("Loading Pyodide instance..."),e.workerState.state.msg="Loading Pyodide instance...",e.workerState.state.progress=.2;const i=o.loadPyodide,a=e.workerState.pyodide_url.split("/").slice(0,-1).join("/");console.log(a),e.workerState.pyodide=await i({packages:["micropip"],indexURL:a}),e.workerState.interruptBuffer&&e.workerState.pyodide.setInterruptBuffer(e.workerState.interruptBuffer)}e.workerState.micropip||(console.debug("Importing micropip..."),e.workerState.state.msg="Importing micropip...",e.workerState.state.progress=.3,e.workerState.micropip=e.workerState.pyodide.pyimport("micropip")),console.debug("Pyodide ready. Installing funcnodes...");for(const o of e.workerState.packages)console.log("Installing package:",o),e.workerState.state.msg=`Installing package: ${o}`,await e.workerState.micropip.install(o);return e.workerState.state.msg="Installing funcnodes",e.workerState.state.progress=.8,await e.workerState.micropip.install("funcnodes"),e.workerState.state.msg="Installing funcnodes-worker",await e.workerState.micropip.install("funcnodes-worker"),e.workerState.state.msg="Installing funcnodes-pyodide",await e.workerState.micropip.install("funcnodes-pyodide"),e.workerState.state.msg="Installing funcnodes-react-flow",await e.workerState.micropip.install("funcnodes-react-flow"),e.workerState.state.msg="Importing funcnodes",console.debug("Importing funcnodes..."),await e.workerState.pyodide.runPythonAsync("import funcnodes_pyodide"),console.debug("Running post_pyodide_ready..."),await((t=(r=e.workerState).post_pyodide_ready)==null?void 0:t.call(r,e.workerState)),console.debug("Pyodide ready"),e.workerState.state.msg="ready",e.workerState.state.progress=.1,e.workerState.pyodideReady=!0,{pyodide:e.workerState.pyodide,micropip:e.workerState.micropip}},e.interrupt=()=>{e.workerState.interruptBuffer&&(e.workerState.interruptBuffer[0]=1)},e.list_workers=()=>Object.keys(e.workerState.worker),e.get_worker=async r=>{if(!r)throw new Error("Worker id is required");if(!e.workerState.worker[r])throw new Error(`Worker with id ${r} not found`);return await e.workerState.worker[r].make_promise,e.workerState.worker[r]},e.has_worker=r=>{if(!r)throw new Error("Worker id is required");return!!e.workerState.worker[r]},e.get_or_create_worker=async r=>{if(!r)throw new Error("Worker id is required");return e.workerState.worker[r]||(console.log("Creating worker with id",r),await e.initializeFuncNodesWorker(r)),e.get_worker(r)},e.initializeFuncNodesWorker=async r=>{try{if(!e.workerState.pyodideReadyPromise)throw new Error("Pyodide newer initialized");const{pyodide:t}=await e.workerState.pyodideReadyPromise;if(!e.has_worker(r)){e.workerState.worker[r]={worker:null,make_promise:void 0};const o=new Promise(async(i,a)=>{e.workerState.worker[r].reject_promise=a,console.debug(`Creating worker (${r})...`);const s=await t.runPythonAsync(`funcnodes_pyodide.new_worker(debug=${e.workerState.debug?1:0}, uuid="${r}")`);if(console.debug("Worker created:",s),typeof s.set_receiver=="function")s.set_receiver(self);else throw new Error("Worker does not expose a \'set_receiver\' method.");e.workerState.worker[r].worker=s,console.debug("Worker ready"),i(s)});e.workerState.worker[r].make_promise=o}return e.get_worker(r)}catch(t){throw console.error("Error during worker initialization:",t),t}},e.receivepy=(r,t)=>{try{let o={};if(typeof r=="string"?o.msg=r:o=r,o.msg===void 0)return;typeof o.msg!="string"&&(o.msg=JSON.stringify(o.msg)),t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error(`Worker id not provided in receivepy(${JSON.stringify(o)})`);if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy(${JSON.stringify(o)})`);e.workerState.receivepy(r,i)}catch(o){console.error("Error during receivepy:",o);return}},e.receivepy_bytes=(r,t)=>{r=r.toJs();try{let o={};if(r instanceof Uint8Array?o.msg=r:o=r,o.msg===void 0)return;t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error("Worker id not provided in receivepy_bytes");if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy_bytes`);e.workerState.receivepy_bytes(r,i)}catch(o){console.error("Error during receivepy_bytes:",o);return}},e.startInitialization=({debug:r=!1,receivepy:t,receivepy_bytes:o,pyodide_url:i,post_pyodide_ready:a,packages:s})=>(e.workerState.debug=r,e.workerState.pyodide_url=i||d,e.workerState.packages=s,e.workerState.receivepy=t,e.workerState.receivepy_bytes=o,e.workerState.pyodideReadyPromise=null,e.workerState.post_pyodide_ready=a,e.workerState),e.register_cmd_message=(r,t)=>{if(e.workerState.handel_register[r])throw new Error(`Command ${r} already registered`);e.workerState.handel_register[r]=t},e.register_cmd_message("ping",async r=>"pong"),e.register_cmd_message("init",async r=>{if(e.workerState.pyodideReadyPromise)throw new Error("Pyodide is already initialized");r.data&&(r.data.pyodide_url&&(e.workerState.pyodide_url=r.data.pyodide_url),r.data.packages&&(e.workerState.packages=r.data.packages),r.data.debug&&(e.workerState.debug=r.data.debug)),e.workerState.pyodideReadyPromise=e.initializePyodide()}),e.register_cmd_message("_eval",async r=>{var t;try{const o=await((t=e.workerState.pyodide)==null?void 0:t.runPythonAsync(r.msg||"print(\'No code provided\')"));return console.log("Eval result:",o),o}catch(o){console.error("Error during _eval:",o)}}),e.register_cmd_message("state",async r=>({state:{...e.workerState.state,loaded:e.workerState.pyodideReady}})),e.register_cmd_message("worker:state",async r=>({state:{loaded:!!(await e.get_or_create_worker(r.worker_id)).worker}})),e.register_cmd_message("worker:stop",async r=>{var o;if(!e.has_worker(r.worker_id))return;const t=await e.get_or_create_worker(r.worker_id);return t.worker&&(t.worker.stop(),t.worker=null,(o=t.reject_promise)==null||o.call(t,"Worker stopped")),delete e.workerState.worker[r.worker_id],{state:{loaded:!1}}}),e.register_cmd_message("worker:send",async r=>{const t=await e.get_or_create_worker(r.worker_id);if(!t.worker)throw new Error("Worker is not initialized");if(typeof t.worker.receivejs!="function")throw new Error(`Worker does not support receivejs: ${typeof t.worker.receivejs}`);t.worker.receivejs(r.msg)}),e.handleMessage=async r=>{const t={original:r};r.id&&(t.id=r.id),r.toJs===void 0&&(r.toJs=!0);try{if(r.cmd){const o=r;if(e.workerState.handel_register[o.cmd])t.result=await e.workerState.handel_register[o.cmd](o);else throw new Error("Unknown command: "+o.cmd)}else throw new Error("Unknown message format: "+JSON.stringify(r))}catch(o){t.error=o.message}return t},e.read_url_params=()=>{var a,s;const r=new URLSearchParams(self.location.search),t=((a=r.get("debug"))==null?void 0:a.toLowerCase())==="true",o=r.get("pyodide_url")||void 0,i=((s=r.get("packages"))==null?void 0:s.split(","))||[];return{debug:t,pyodide_url:o,packages:i}};const n=e;n.general_initalization=r=>{const t=n.read_url_params();n.startInitialization({...r,...t})};const w=n,c=n;c.init_dedicated_worker=r=>{const t=e;t.onmessage=async i=>{const a=i.data,s=await t.handleMessage(a);t.postMessage(s)};const o={...r,receivepy:(i,a)=>{t.postMessage({cmd:"receive",msg:i,worker_id:a})},receivepy_bytes(i,a){t.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})}};t.general_initalization(o)},w.init_shared_worker=r=>{const t=e;t.connectedPorts=[],t.onconnect=i=>{const a=i.ports[0];t.connectedPorts.push(a),a.start(),console.debug("Port connected in shared worker"),a.onmessage=async s=>{const k=s.data,p=await t.handleMessage(k);a.postMessage(p)}};const o={...r,receivepy:(i,a)=>{t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive",msg:i,worker_id:a})})},receivepy_bytes(i,a){t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})})}};t.general_initalization(o)},(r=>{n.init_shared_worker(r)})({})})();\n';function I(e){return new SharedWorker("data:text/javascript;charset=utf-8,"+encodeURIComponent(U),{name:e==null?void 0:e.name})}const L=e=>(e.worker||(e.worker_classes||(e.worker_classes={Shared:I,Dedicated:R}),e.shared_worker?e.worker_url===void 0?e.worker=new e.worker_classes.Shared({name:e.uuid}):e.worker=new SharedWorker(e.worker_url,{name:e.uuid,type:"module"}):e.worker_url===void 0?e.worker=new e.worker_classes.Dedicated({name:e.uuid}):e.worker=new Worker(e.worker_url,{name:e.uuid,type:"module"})),e.worker);class j extends n.FuncNodesWorker{constructor(r){const o={uuid:W(),...r};if(super(o),this._message_hooks=[],this._worker=L(o),this._worker instanceof SharedWorker)o.shared_worker=!0,this._port=this._worker.port,this._port.start(),this._port.addEventListener("message",this.onmessage.bind(this));else if(this._worker instanceof Worker)o.shared_worker=!1,this._worker.addEventListener("message",this.onmessage.bind(this));else throw new Error("worker must be an instance of Worker or SharedWorker");this.postMessage({cmd:"init",data:{debug:o.debug,pyodide_url:o.pyodide_url,packages:o.packages}});const i=setInterval(()=>{this.postMessage({cmd:"state"})},400);this._workerstate={loaded:!1,msg:"loading",progress:0},this.initPromise=new Promise(async s=>{var k;for(;!this._workerstate.loaded;)await new Promise(l=>setTimeout(l,100));clearInterval(i),this.is_open=!0,(k=this._zustand)==null||k.auto_progress(),s()}),this.initPromise.then(()=>{this.stepwise_fullsync()})}async send(r){await this.initPromise,this.postMessage({cmd:"worker:send",msg:JSON.stringify(r),worker_id:this.uuid})}postMessage(r){r.worker_id=this.uuid,this._port?this._port.postMessage(r):this._worker.postMessage(r)}registerMessageHook(r){return this._message_hooks.push(r),()=>{this._message_hooks=this._message_hooks.filter(o=>o!==r)}}onmessage(r){var o;for(const i of this._message_hooks)i(r.data);if(r.data.result)r.data.result.state&&(this._workerstate={...this._workerstate,...r.data.result.state},r.data.result.state.msg&&r.data.result.state.msg!=="ready"&&((o=this._zustand)==null||o.set_progress({message:this._workerstate.msg,status:"info",progress:this._workerstate.progress,blocking:!0})));else if(r.data.cmd){if(r.data.cmd==="receive"){if(r.data.worker_id===void 0)throw new Error("worker_id is undefined");r.data.worker_id===this.uuid&&this.receive(JSON.parse(r.data.msg))}else if(r.data.cmd==="receive_bytes"){if(r.data.worker_id===void 0)throw new Error("worker_id is undefined");r.data.worker_id===this.uuid&&this.onbytes(r.data.msg)}}}async upload_file({files:r,onProgressCallback:o,root:i}){const s=[],k=r.length;let l=0;if(r.length===0)return"";for(let c=0;c<r.length;c++){const w=r[c],d=new FileReader,u=new Promise((p,a)=>{d.onload=async z=>{var h;try{const y=(h=z.target.result)==null?void 0:h.replace(/^data:.+;base64,/,""),v=w.webkitRelativePath||w.name,$=i?`${i}/${v}`:v,M=await this._send_cmd({cmd:"upload",kwargs:{data:y,filename:$},wait_for_response:!0});l++,o&&o(l,k),p(M)}catch(y){a(y)}},d.readAsDataURL(w)});s.push(u)}const S=await Promise.all(s);return S.reduce((c,w)=>{const d=w.split("/"),u=c.split("/"),p=[];for(let a=0;a<d.length&&d[a]===u[a];a++)p.push(d[a]);return p.join("/")},S[0])}get ready(){return this._workerstate.loaded}}return j});
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d="https://cdn.jsdelivr.net/pyodide/v0.27.2/full/pyodide.mjs",e=self;e.workerState={pyodide:null,pyodide_url:d,packages:[],state:{msg:"loading",loaded:!1,progress:0},micropip:null,worker:{},pyodideReady:!1,pyodideReadyPromise:null,debug:!1,interruptBuffer:null,receivepy:(r,t)=>{},receivepy_bytes:(r,t)=>{},handel_register:{},post_pyodide_ready:void 0};e.reset=async()=>{for(const r in e.list_workers())try{const t=await e.get_worker(r);t.worker&&t.worker.stop(),t.reject_promise?.("Worker reset")}catch{}e.workerState.pyodide&&e.interrupt(),e.workerState.pyodide=null,e.workerState.micropip=null,e.workerState.worker={},e.workerState.pyodideReady=!1;try{e.workerState.interruptBuffer=new Uint8Array(new SharedArrayBuffer(1)),e.workerState.interruptBuffer[0]=0}catch{}};e.initializePyodide=async()=>{if(!e.workerState.pyodide){console.log("initializePyodide with: Debug:",e.workerState.debug,"Pyodide URL:",e.workerState.pyodide_url,"Packages:",e.workerState.packages),console.debug("Loading Pyodide..."),e.workerState.state.msg="Loading Pyodide...",e.workerState.state.progress=0,await e.reset(),console.debug("Loading Pyodide module..."),e.workerState.state.msg="Loading Pyodide module...",e.workerState.state.progress=.1;const r=await import(e.workerState.pyodide_url);console.debug("Loading Pyodide instance..."),e.workerState.state.msg="Loading Pyodide instance...",e.workerState.state.progress=.2;const t=r.loadPyodide,o=e.workerState.pyodide_url.split("/").slice(0,-1).join("/");console.log(o),e.workerState.pyodide=await t({packages:["micropip"],indexURL:o}),e.workerState.interruptBuffer&&e.workerState.pyodide.setInterruptBuffer(e.workerState.interruptBuffer)}e.workerState.micropip||(console.debug("Importing micropip..."),e.workerState.state.msg="Importing micropip...",e.workerState.state.progress=.3,e.workerState.micropip=e.workerState.pyodide.pyimport("micropip")),console.debug("Pyodide ready. Installing funcnodes...");for(const r of e.workerState.packages)console.log("Installing package:",r),e.workerState.state.msg=`Installing package: ${r}`,await e.workerState.micropip.install(r);return e.workerState.state.msg="Installing funcnodes",e.workerState.state.progress=.8,await e.workerState.micropip.install("funcnodes"),e.workerState.state.msg="Installing funcnodes-worker",await e.workerState.micropip.install("funcnodes-worker"),e.workerState.state.msg="Installing funcnodes-pyodide",await e.workerState.micropip.install("funcnodes-pyodide"),e.workerState.state.msg="Installing funcnodes-react-flow",await e.workerState.micropip.install("funcnodes-react-flow"),e.workerState.state.msg="Importing funcnodes",console.debug("Importing funcnodes..."),await e.workerState.pyodide.runPythonAsync("import funcnodes_pyodide"),console.debug("Running post_pyodide_ready..."),await e.workerState.post_pyodide_ready?.(e.workerState),console.debug("Pyodide ready"),e.workerState.state.msg="ready",e.workerState.state.progress=.1,e.workerState.pyodideReady=!0,{pyodide:e.workerState.pyodide,micropip:e.workerState.micropip}};e.interrupt=()=>{e.workerState.interruptBuffer&&(e.workerState.interruptBuffer[0]=1)};e.list_workers=()=>Object.keys(e.workerState.worker);e.get_worker=async r=>{if(!r)throw new Error("Worker id is required");if(!e.workerState.worker[r])throw new Error(`Worker with id ${r} not found`);return await e.workerState.worker[r].make_promise,e.workerState.worker[r]};e.has_worker=r=>{if(!r)throw new Error("Worker id is required");return!!e.workerState.worker[r]};e.get_or_create_worker=async r=>{if(!r)throw new Error("Worker id is required");return e.workerState.worker[r]||(console.log("Creating worker with id",r),await e.initializeFuncNodesWorker(r)),e.get_worker(r)};e.initializeFuncNodesWorker=async r=>{try{if(!e.workerState.pyodideReadyPromise)throw new Error("Pyodide newer initialized");const{pyodide:t}=await e.workerState.pyodideReadyPromise;if(!e.has_worker(r)){e.workerState.worker[r]={worker:null,make_promise:void 0};const o=new Promise(async(i,a)=>{e.workerState.worker[r].reject_promise=a,console.debug(`Creating worker (${r})...`);const s=await t.runPythonAsync(`funcnodes_pyodide.new_worker(debug=${e.workerState.debug?1:0}, uuid="${r}")`);if(console.debug("Worker created:",s),typeof s.set_receiver=="function")s.set_receiver(self);else throw new Error("Worker does not expose a 'set_receiver' method.");e.workerState.worker[r].worker=s,console.debug("Worker ready"),i(s)});e.workerState.worker[r].make_promise=o}return e.get_worker(r)}catch(t){throw console.error("Error during worker initialization:",t),t}};e.receivepy=(r,t)=>{try{let o={};if(typeof r=="string"?o.msg=r:o=r,o.msg===void 0)return;typeof o.msg!="string"&&(o.msg=JSON.stringify(o.msg)),t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error(`Worker id not provided in receivepy(${JSON.stringify(o)})`);if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy(${JSON.stringify(o)})`);e.workerState.receivepy(r,i)}catch(o){console.error("Error during receivepy:",o);return}};e.receivepy_bytes=(r,t)=>{r=r.toJs();try{let o={};if(r instanceof Uint8Array?o.msg=r:o=r,o.msg===void 0)return;t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error("Worker id not provided in receivepy_bytes");if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy_bytes`);e.workerState.receivepy_bytes(r,i)}catch(o){console.error("Error during receivepy_bytes:",o);return}};e.startInitialization=({debug:r=!1,receivepy:t,receivepy_bytes:o,pyodide_url:i,post_pyodide_ready:a,packages:s})=>(e.workerState.debug=r,e.workerState.pyodide_url=i||d,e.workerState.packages=s,e.workerState.receivepy=t,e.workerState.receivepy_bytes=o,e.workerState.pyodideReadyPromise=null,e.workerState.post_pyodide_ready=a,e.workerState);e.register_cmd_message=(r,t)=>{if(e.workerState.handel_register[r])throw new Error(`Command ${r} already registered`);e.workerState.handel_register[r]=t};e.register_cmd_message("ping",async r=>"pong");e.register_cmd_message("init",async r=>{if(e.workerState.pyodideReadyPromise)throw new Error("Pyodide is already initialized");r.data&&(r.data.pyodide_url&&(e.workerState.pyodide_url=r.data.pyodide_url),r.data.packages&&(e.workerState.packages=r.data.packages),r.data.debug&&(e.workerState.debug=r.data.debug)),e.workerState.pyodideReadyPromise=e.initializePyodide()});e.register_cmd_message("_eval",async r=>{try{const t=await e.workerState.pyodide?.runPythonAsync(r.msg||"print('No code provided')");return console.log("Eval result:",t),t}catch(t){console.error("Error during _eval:",t)}});e.register_cmd_message("state",async r=>({state:{...e.workerState.state,loaded:e.workerState.pyodideReady}}));e.register_cmd_message("worker:state",async r=>({state:{loaded:!!(await e.get_or_create_worker(r.worker_id)).worker}}));e.register_cmd_message("worker:stop",async r=>{if(!e.has_worker(r.worker_id))return;const t=await e.get_or_create_worker(r.worker_id);return t.worker&&(t.worker.stop(),t.worker=null,t.reject_promise?.("Worker stopped")),delete e.workerState.worker[r.worker_id],{state:{loaded:!1}}});e.register_cmd_message("worker:send",async r=>{const t=await e.get_or_create_worker(r.worker_id);if(!t.worker)throw new Error("Worker is not initialized");if(typeof t.worker.receivejs!="function")throw new Error(`Worker does not support receivejs: ${typeof t.worker.receivejs}`);t.worker.receivejs(r.msg)});e.handleMessage=async r=>{const t={original:r};r.id&&(t.id=r.id),r.toJs===void 0&&(r.toJs=!0);try{if(r.cmd){const o=r;if(e.workerState.handel_register[o.cmd])t.result=await e.workerState.handel_register[o.cmd](o);else throw new Error("Unknown command: "+o.cmd)}else throw new Error("Unknown message format: "+JSON.stringify(r))}catch(o){t.error=o.message}return t};e.read_url_params=()=>{const r=new URLSearchParams(self.location.search),t=r.get("debug")?.toLowerCase()==="true",o=r.get("pyodide_url")||void 0,i=r.get("packages")?.split(",")||[];return{debug:t,pyodide_url:o,packages:i}};const n=e;n.general_initalization=r=>{const t=n.read_url_params();n.startInitialization({...r,...t})};const k=n,l=n;l.init_dedicated_worker=r=>{const t=e;t.onmessage=async i=>{const a=i.data,s=await t.handleMessage(a);t.postMessage(s)};const o={...r,receivepy:(i,a)=>{t.postMessage({cmd:"receive",msg:i,worker_id:a})},receivepy_bytes(i,a){t.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})}};t.general_initalization(o)};k.init_shared_worker=r=>{const t=e;t.connectedPorts=[],t.onconnect=i=>{const a=i.ports[0];t.connectedPorts.push(a),a.start(),console.debug("Port connected in shared worker"),a.onmessage=async s=>{const w=s.data,c=await t.handleMessage(w);a.postMessage(c)}};const o={...r,receivepy:(i,a)=>{t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive",msg:i,worker_id:a})})},receivepy_bytes(i,a){t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})})}};t.general_initalization(o)};const p=r=>{n.init_dedicated_worker(r)},y=r=>{n.init_shared_worker(r)};exports.gself=n;exports.initDedicatedWorker=p;exports.initSharedWorker=y;
@@ -0,0 +1,6 @@
1
+ import { default as gself, DedicatedWorkerInitParams, SharedWorkerInitParams } from './pyodideWorkerLayout.mjs';
2
+ export * from './pyodideWorkerLayout.mjs';
3
+ export * from './pyodideWorkerLogic.mjs';
4
+ declare const initDedicatedWorker: (params: DedicatedWorkerInitParams) => void;
5
+ declare const initSharedWorker: (params: SharedWorkerInitParams) => void;
6
+ export { gself, initDedicatedWorker, initSharedWorker };
@@ -0,0 +1,299 @@
1
+ const d = "https://cdn.jsdelivr.net/pyodide/v0.27.2/full/pyodide.mjs", e = self;
2
+ e.workerState = {
3
+ pyodide: null,
4
+ pyodide_url: d,
5
+ packages: [],
6
+ state: { msg: "loading", loaded: !1, progress: 0 },
7
+ micropip: null,
8
+ worker: {},
9
+ pyodideReady: !1,
10
+ pyodideReadyPromise: null,
11
+ debug: !1,
12
+ interruptBuffer: null,
13
+ receivepy: (r, t) => {
14
+ },
15
+ receivepy_bytes: (r, t) => {
16
+ },
17
+ handel_register: {},
18
+ post_pyodide_ready: void 0
19
+ };
20
+ e.reset = async () => {
21
+ for (const r in e.list_workers())
22
+ try {
23
+ const t = await e.get_worker(r);
24
+ t.worker && t.worker.stop(), t.reject_promise?.("Worker reset");
25
+ } catch {
26
+ }
27
+ e.workerState.pyodide && e.interrupt(), e.workerState.pyodide = null, e.workerState.micropip = null, e.workerState.worker = {}, e.workerState.pyodideReady = !1;
28
+ try {
29
+ e.workerState.interruptBuffer = new Uint8Array(
30
+ new SharedArrayBuffer(1)
31
+ ), e.workerState.interruptBuffer[0] = 0;
32
+ } catch {
33
+ }
34
+ };
35
+ e.initializePyodide = async () => {
36
+ if (!e.workerState.pyodide) {
37
+ console.log(
38
+ "initializePyodide with: Debug:",
39
+ e.workerState.debug,
40
+ "Pyodide URL:",
41
+ e.workerState.pyodide_url,
42
+ "Packages:",
43
+ e.workerState.packages
44
+ ), console.debug("Loading Pyodide..."), e.workerState.state.msg = "Loading Pyodide...", e.workerState.state.progress = 0, await e.reset(), console.debug("Loading Pyodide module..."), e.workerState.state.msg = "Loading Pyodide module...", e.workerState.state.progress = 0.1;
45
+ const r = await import(
46
+ /* @vite-ignore */
47
+ e.workerState.pyodide_url
48
+ );
49
+ console.debug("Loading Pyodide instance..."), e.workerState.state.msg = "Loading Pyodide instance...", e.workerState.state.progress = 0.2;
50
+ const t = r.loadPyodide, o = e.workerState.pyodide_url.split("/").slice(0, -1).join("/");
51
+ console.log(o), e.workerState.pyodide = await t({
52
+ packages: ["micropip"],
53
+ indexURL: o
54
+ }), e.workerState.interruptBuffer && e.workerState.pyodide.setInterruptBuffer(
55
+ e.workerState.interruptBuffer
56
+ );
57
+ }
58
+ e.workerState.micropip || (console.debug("Importing micropip..."), e.workerState.state.msg = "Importing micropip...", e.workerState.state.progress = 0.3, e.workerState.micropip = e.workerState.pyodide.pyimport("micropip")), console.debug("Pyodide ready. Installing funcnodes...");
59
+ for (const r of e.workerState.packages)
60
+ console.log("Installing package:", r), e.workerState.state.msg = `Installing package: ${r}`, await e.workerState.micropip.install(r);
61
+ return e.workerState.state.msg = "Installing funcnodes", e.workerState.state.progress = 0.8, await e.workerState.micropip.install("funcnodes"), e.workerState.state.msg = "Installing funcnodes-worker", await e.workerState.micropip.install("funcnodes-worker"), e.workerState.state.msg = "Installing funcnodes-pyodide", await e.workerState.micropip.install("funcnodes-pyodide"), e.workerState.state.msg = "Installing funcnodes-react-flow", await e.workerState.micropip.install("funcnodes-react-flow"), e.workerState.state.msg = "Importing funcnodes", console.debug("Importing funcnodes..."), await e.workerState.pyodide.runPythonAsync(
62
+ "import funcnodes_pyodide"
63
+ ), console.debug("Running post_pyodide_ready..."), await e.workerState.post_pyodide_ready?.(e.workerState), console.debug("Pyodide ready"), e.workerState.state.msg = "ready", e.workerState.state.progress = 0.1, e.workerState.pyodideReady = !0, {
64
+ pyodide: e.workerState.pyodide,
65
+ micropip: e.workerState.micropip
66
+ };
67
+ };
68
+ e.interrupt = () => {
69
+ e.workerState.interruptBuffer && (e.workerState.interruptBuffer[0] = 1);
70
+ };
71
+ e.list_workers = () => Object.keys(e.workerState.worker);
72
+ e.get_worker = async (r) => {
73
+ if (!r) throw new Error("Worker id is required");
74
+ if (!e.workerState.worker[r])
75
+ throw new Error(`Worker with id ${r} not found`);
76
+ return await e.workerState.worker[r].make_promise, e.workerState.worker[r];
77
+ };
78
+ e.has_worker = (r) => {
79
+ if (!r) throw new Error("Worker id is required");
80
+ return !!e.workerState.worker[r];
81
+ };
82
+ e.get_or_create_worker = async (r) => {
83
+ if (!r) throw new Error("Worker id is required");
84
+ return e.workerState.worker[r] || (console.log("Creating worker with id", r), await e.initializeFuncNodesWorker(r)), e.get_worker(r);
85
+ };
86
+ e.initializeFuncNodesWorker = async (r) => {
87
+ try {
88
+ if (!e.workerState.pyodideReadyPromise)
89
+ throw new Error("Pyodide newer initialized");
90
+ const { pyodide: t } = await e.workerState.pyodideReadyPromise;
91
+ if (!e.has_worker(r)) {
92
+ e.workerState.worker[r] = {
93
+ worker: null,
94
+ //@ts-ignore
95
+ make_promise: void 0
96
+ };
97
+ const o = new Promise(async (i, a) => {
98
+ e.workerState.worker[r].reject_promise = a, console.debug(`Creating worker (${r})...`);
99
+ const s = await t.runPythonAsync(
100
+ `funcnodes_pyodide.new_worker(debug=${e.workerState.debug ? 1 : 0}, uuid="${r}")`
101
+ );
102
+ if (console.debug("Worker created:", s), typeof s.set_receiver == "function")
103
+ s.set_receiver(self);
104
+ else
105
+ throw new Error("Worker does not expose a 'set_receiver' method.");
106
+ e.workerState.worker[r].worker = s, console.debug("Worker ready"), i(s);
107
+ });
108
+ e.workerState.worker[r].make_promise = o;
109
+ }
110
+ return e.get_worker(r);
111
+ } catch (t) {
112
+ throw console.error("Error during worker initialization:", t), t;
113
+ }
114
+ };
115
+ e.receivepy = (r, t) => {
116
+ try {
117
+ let o = {};
118
+ if (typeof r == "string" ? o.msg = r : o = r, o.msg === void 0) return;
119
+ typeof o.msg != "string" && (o.msg = JSON.stringify(o.msg)), t !== void 0 && (typeof t == "string" ? o.worker_id || (o.worker_id = t) : o = { ...t, ...o });
120
+ const i = o.worker_id;
121
+ if (!i)
122
+ throw new Error(
123
+ `Worker id not provided in receivepy(${JSON.stringify(o)})`
124
+ );
125
+ if (!e.workerState.worker[i])
126
+ throw new Error(
127
+ `Worker with id ${i} not found in receivepy(${JSON.stringify(
128
+ o
129
+ )})`
130
+ );
131
+ e.workerState.receivepy(r, i);
132
+ } catch (o) {
133
+ console.error("Error during receivepy:", o);
134
+ return;
135
+ }
136
+ };
137
+ e.receivepy_bytes = (r, t) => {
138
+ r = r.toJs();
139
+ try {
140
+ let o = {};
141
+ if (r instanceof Uint8Array ? o.msg = r : o = r, o.msg === void 0) return;
142
+ t !== void 0 && (typeof t == "string" ? o.worker_id || (o.worker_id = t) : o = { ...t, ...o });
143
+ const i = o.worker_id;
144
+ if (!i)
145
+ throw new Error("Worker id not provided in receivepy_bytes");
146
+ if (!e.workerState.worker[i])
147
+ throw new Error(
148
+ `Worker with id ${i} not found in receivepy_bytes`
149
+ );
150
+ e.workerState.receivepy_bytes(r, i);
151
+ } catch (o) {
152
+ console.error("Error during receivepy_bytes:", o);
153
+ return;
154
+ }
155
+ };
156
+ e.startInitialization = ({
157
+ debug: r = !1,
158
+ receivepy: t,
159
+ receivepy_bytes: o,
160
+ pyodide_url: i,
161
+ post_pyodide_ready: a,
162
+ packages: s
163
+ }) => (e.workerState.debug = r, e.workerState.pyodide_url = i || d, e.workerState.packages = s, e.workerState.receivepy = t, e.workerState.receivepy_bytes = o, e.workerState.pyodideReadyPromise = null, e.workerState.post_pyodide_ready = a, e.workerState);
164
+ e.register_cmd_message = (r, t) => {
165
+ if (e.workerState.handel_register[r])
166
+ throw new Error(`Command ${r} already registered`);
167
+ e.workerState.handel_register[r] = t;
168
+ };
169
+ e.register_cmd_message("ping", async (r) => "pong");
170
+ e.register_cmd_message("init", async (r) => {
171
+ if (e.workerState.pyodideReadyPromise)
172
+ throw new Error("Pyodide is already initialized");
173
+ r.data && (r.data.pyodide_url && (e.workerState.pyodide_url = r.data.pyodide_url), r.data.packages && (e.workerState.packages = r.data.packages), r.data.debug && (e.workerState.debug = r.data.debug)), e.workerState.pyodideReadyPromise = e.initializePyodide();
174
+ });
175
+ e.register_cmd_message("_eval", async (r) => {
176
+ try {
177
+ const t = await e.workerState.pyodide?.runPythonAsync(
178
+ r.msg || "print('No code provided')"
179
+ );
180
+ return console.log("Eval result:", t), t;
181
+ } catch (t) {
182
+ console.error("Error during _eval:", t);
183
+ }
184
+ });
185
+ e.register_cmd_message("state", async (r) => ({
186
+ state: {
187
+ ...e.workerState.state,
188
+ loaded: e.workerState.pyodideReady
189
+ }
190
+ }));
191
+ e.register_cmd_message("worker:state", async (r) => ({ state: { loaded: !!(await e.get_or_create_worker(r.worker_id)).worker } }));
192
+ e.register_cmd_message("worker:stop", async (r) => {
193
+ if (!e.has_worker(r.worker_id)) return;
194
+ const t = await e.get_or_create_worker(r.worker_id);
195
+ return t.worker && (t.worker.stop(), t.worker = null, t.reject_promise?.("Worker stopped")), delete e.workerState.worker[r.worker_id], { state: { loaded: !1 } };
196
+ });
197
+ e.register_cmd_message(
198
+ "worker:send",
199
+ async (r) => {
200
+ const t = await e.get_or_create_worker(r.worker_id);
201
+ if (!t.worker) throw new Error("Worker is not initialized");
202
+ if (typeof t.worker.receivejs != "function")
203
+ throw new Error(
204
+ `Worker does not support receivejs: ${typeof t.worker.receivejs}`
205
+ );
206
+ t.worker.receivejs(r.msg);
207
+ }
208
+ );
209
+ e.handleMessage = async (r) => {
210
+ const t = {
211
+ original: r
212
+ };
213
+ r.id && (t.id = r.id), r.toJs === void 0 && (r.toJs = !0);
214
+ try {
215
+ if (r.cmd) {
216
+ const o = r;
217
+ if (e.workerState.handel_register[o.cmd])
218
+ t.result = await e.workerState.handel_register[o.cmd](o);
219
+ else
220
+ throw new Error("Unknown command: " + o.cmd);
221
+ } else
222
+ throw new Error("Unknown message format: " + JSON.stringify(r));
223
+ } catch (o) {
224
+ t.error = o.message;
225
+ }
226
+ return t;
227
+ };
228
+ e.read_url_params = () => {
229
+ const r = new URLSearchParams(self.location.search), t = r.get("debug")?.toLowerCase() === "true", o = r.get("pyodide_url") || void 0, i = r.get("packages")?.split(",") || [];
230
+ return { debug: t, pyodide_url: o, packages: i };
231
+ };
232
+ const n = e;
233
+ n.general_initalization = (r) => {
234
+ const t = n.read_url_params();
235
+ n.startInitialization({
236
+ ...r,
237
+ ...t
238
+ });
239
+ };
240
+ const k = n, l = n;
241
+ l.init_dedicated_worker = (r) => {
242
+ const t = e;
243
+ t.onmessage = async (i) => {
244
+ const a = i.data, s = await t.handleMessage(a);
245
+ t.postMessage(s);
246
+ };
247
+ const o = {
248
+ ...r,
249
+ receivepy: (i, a) => {
250
+ t.postMessage({ cmd: "receive", msg: i, worker_id: a });
251
+ },
252
+ receivepy_bytes(i, a) {
253
+ t.postMessage({
254
+ cmd: "receive_bytes",
255
+ msg: i,
256
+ worker_id: a
257
+ });
258
+ }
259
+ };
260
+ t.general_initalization(o);
261
+ };
262
+ k.init_shared_worker = (r) => {
263
+ const t = e;
264
+ t.connectedPorts = [], t.onconnect = (i) => {
265
+ const a = i.ports[0];
266
+ t.connectedPorts.push(a), a.start(), console.debug("Port connected in shared worker"), a.onmessage = async (s) => {
267
+ const w = s.data, c = await t.handleMessage(w);
268
+ a.postMessage(c);
269
+ };
270
+ };
271
+ const o = {
272
+ ...r,
273
+ receivepy: (i, a) => {
274
+ t.connectedPorts.forEach((s) => {
275
+ s.postMessage({ cmd: "receive", msg: i, worker_id: a });
276
+ });
277
+ },
278
+ receivepy_bytes(i, a) {
279
+ t.connectedPorts.forEach((s) => {
280
+ s.postMessage({
281
+ cmd: "receive_bytes",
282
+ msg: i,
283
+ worker_id: a
284
+ });
285
+ });
286
+ }
287
+ };
288
+ t.general_initalization(o);
289
+ };
290
+ const p = (r) => {
291
+ n.init_dedicated_worker(r);
292
+ }, y = (r) => {
293
+ n.init_shared_worker(r);
294
+ };
295
+ export {
296
+ n as gself,
297
+ p as initDedicatedWorker,
298
+ y as initSharedWorker
299
+ };
@@ -7,6 +7,14 @@ export interface FuncnodesPyodideWorkerProps extends Partial<WorkerProps> {
7
7
  worker?: Worker | SharedWorker;
8
8
  pyodide_url?: string;
9
9
  packages?: string[];
10
+ worker_classes?: {
11
+ Shared: new (options?: {
12
+ name?: string;
13
+ }) => SharedWorker;
14
+ Dedicated: new (options?: {
15
+ name?: string;
16
+ }) => Worker;
17
+ };
10
18
  }
11
19
  export declare const worker_from_data: (data: FuncnodesPyodideWorkerProps) => Worker | SharedWorker;
12
20
  declare class FuncnodesPyodideWorker extends FuncNodesWorker {
@@ -29,5 +37,6 @@ declare class FuncnodesPyodideWorker extends FuncNodesWorker {
29
37
  onProgressCallback?: (loaded: number, total?: number) => void;
30
38
  root?: string;
31
39
  }): Promise<string>;
40
+ get ready(): boolean;
32
41
  }
33
42
  export default FuncnodesPyodideWorker;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@linkdlab/funcnodes_pyodide_react_flow",
3
- "version": "0.1.9",
3
+ "version": "0.1.11",
4
4
  "private": false,
5
5
  "description": "Frontend with React Flow for FuncNodes",
6
6
  "repository": {
@@ -15,21 +15,41 @@
15
15
  "homepage": "https://github.com/Linkdlab/funcnodes_pyodide#readme",
16
16
  "type": "module",
17
17
  "source": "src/index.tsx",
18
- "main": "dist/umd/index.umd.js",
19
- "module": "dist/esm/index.esm.js",
18
+ "main": "dist/index.umd.js",
19
+ "module": "dist/index.es.js",
20
20
  "types": "dist/index.d.ts",
21
21
  "style": "dist/style.css",
22
+ "worker:module": "dist/pyodideWebWorker.es.js",
23
+ "worker:main": "dist/pyodideWebWorker.umd.js",
24
+ "worker:types": "dist/pyodideWebWorker.d.ts",
22
25
  "files": [
23
26
  "dist"
24
27
  ],
28
+ "exports": {
29
+ ".": {
30
+ "types": "./dist/index.d.ts",
31
+ "import": "./dist/index.es.js",
32
+ "require": "./dist/index.umd.js"
33
+ },
34
+ "./package.json": "./package.json",
35
+ "./style.css": {
36
+ "import": "./dist/style.css",
37
+ "require": "./dist/style.css"
38
+ },
39
+ "./pyodideWebWorker": {
40
+ "types": "./dist/pyodideWebWorker.d.mts",
41
+ "import": "./dist/pyodideWebWorker.es.js",
42
+ "require": "./dist/pyodideWebWorker.umd.js"
43
+ }
44
+ },
25
45
  "scripts": {
26
46
  "typecheck": "tsc --noEmit --watch",
27
- "build": "vite build --config vite.browser.config.js && vite build ",
47
+ "build": "vite build --config vite.browser.config.js && vite build && vite build --config vite.worker.config.js",
28
48
  "watch": "vite --config vite.browser.config.js",
29
49
  "preview": "vite build --config vite.browser.config.js && vite preview --config vite.browser.config.js"
30
50
  },
31
51
  "devDependencies": {
32
- "@linkdlab/funcnodes_react_flow": "^0.4.6",
52
+ "@linkdlab/funcnodes_react_flow": "^0.4.7",
33
53
  "@types/react": "^19.1.0",
34
54
  "@types/react-dom": "^19.1.2",
35
55
  "@types/uuid": "^10.0.0",
@@ -43,10 +63,10 @@
43
63
  "vite-plugin-dts": "^4.5.3"
44
64
  },
45
65
  "peerDependencies": {
46
- "@linkdlab/funcnodes_react_flow": "^0.4.6",
66
+ "@linkdlab/funcnodes_react_flow": "^0.4.7",
47
67
  "pyodide": "^0.27.2",
48
68
  "react": "^19.0.0",
49
69
  "react-dom": "^19.0.0"
50
70
  },
51
71
  "packageManager": "yarn@1.22.19+sha1.4ba7fc5c6e704fce2066ecbfb0b0d8976fe62447"
52
- }
72
+ }
@@ -1 +0,0 @@
1
- (function(){"use strict";const d="https://cdn.jsdelivr.net/pyodide/v0.27.2/full/pyodide.mjs",e=self;e.workerState={pyodide:null,pyodide_url:d,packages:[],state:{msg:"loading",loaded:!1,progress:0},micropip:null,worker:{},pyodideReady:!1,pyodideReadyPromise:null,debug:!1,interruptBuffer:null,receivepy:(r,t)=>{},receivepy_bytes:(r,t)=>{},handel_register:{},post_pyodide_ready:void 0},e.reset=async()=>{var r;for(const t in e.list_workers())try{const o=await e.get_worker(t);o.worker&&o.worker.stop(),(r=o.reject_promise)==null||r.call(o,"Worker reset")}catch{}e.workerState.pyodide&&e.interrupt(),e.workerState.pyodide=null,e.workerState.micropip=null,e.workerState.worker={},e.workerState.pyodideReady=!1;try{e.workerState.interruptBuffer=new Uint8Array(new SharedArrayBuffer(1)),e.workerState.interruptBuffer[0]=0}catch{}},e.initializePyodide=async()=>{var r,t;if(!e.workerState.pyodide){console.log("initializePyodide with: Debug:",e.workerState.debug,"Pyodide URL:",e.workerState.pyodide_url,"Packages:",e.workerState.packages),console.debug("Loading Pyodide..."),e.workerState.state.msg="Loading Pyodide...",e.workerState.state.progress=0,await e.reset(),console.debug("Loading Pyodide module..."),e.workerState.state.msg="Loading Pyodide module...",e.workerState.state.progress=.1;const o=await import(e.workerState.pyodide_url);console.debug("Loading Pyodide instance..."),e.workerState.state.msg="Loading Pyodide instance...",e.workerState.state.progress=.2;const i=o.loadPyodide,a=e.workerState.pyodide_url.split("/").slice(0,-1).join("/");console.log(a),e.workerState.pyodide=await i({packages:["micropip"],indexURL:a}),e.workerState.interruptBuffer&&e.workerState.pyodide.setInterruptBuffer(e.workerState.interruptBuffer)}e.workerState.micropip||(console.debug("Importing micropip..."),e.workerState.state.msg="Importing micropip...",e.workerState.state.progress=.3,e.workerState.micropip=e.workerState.pyodide.pyimport("micropip")),console.debug("Pyodide ready. Installing funcnodes...");for(const o of e.workerState.packages)console.log("Installing package:",o),e.workerState.state.msg=`Installing package: ${o}`,await e.workerState.micropip.install(o);return e.workerState.state.msg="Installing funcnodes",e.workerState.state.progress=.8,await e.workerState.micropip.install("funcnodes"),e.workerState.state.msg="Installing funcnodes-worker",await e.workerState.micropip.install("funcnodes-worker"),e.workerState.state.msg="Installing funcnodes-pyodide",await e.workerState.micropip.install("funcnodes-pyodide"),e.workerState.state.msg="Importing funcnodes",console.debug("Importing funcnodes..."),await e.workerState.pyodide.runPythonAsync("import funcnodes_pyodide"),console.debug("Running post_pyodide_ready..."),await((t=(r=e.workerState).post_pyodide_ready)==null?void 0:t.call(r,e.workerState)),console.debug("Pyodide ready"),e.workerState.state.msg="ready",e.workerState.state.progress=.1,e.workerState.pyodideReady=!0,{pyodide:e.workerState.pyodide,micropip:e.workerState.micropip}},e.interrupt=()=>{e.workerState.interruptBuffer&&(e.workerState.interruptBuffer[0]=1)},e.list_workers=()=>Object.keys(e.workerState.worker),e.get_worker=async r=>{if(!r)throw new Error("Worker id is required");if(!e.workerState.worker[r])throw new Error(`Worker with id ${r} not found`);return await e.workerState.worker[r].make_promise,e.workerState.worker[r]},e.has_worker=r=>{if(!r)throw new Error("Worker id is required");return!!e.workerState.worker[r]},e.get_or_create_worker=async r=>{if(!r)throw new Error("Worker id is required");return e.workerState.worker[r]||(console.log("Creating worker with id",r),await e.initializeFuncNodesWorker(r)),e.get_worker(r)},e.initializeFuncNodesWorker=async r=>{try{if(!e.workerState.pyodideReadyPromise)throw new Error("Pyodide newer initialized");const{pyodide:t}=await e.workerState.pyodideReadyPromise;if(!e.has_worker(r)){e.workerState.worker[r]={worker:null,make_promise:void 0};const o=new Promise(async(i,a)=>{e.workerState.worker[r].reject_promise=a,console.debug(`Creating worker (${r})...`);const s=await t.runPythonAsync(`funcnodes_pyodide.new_worker(debug=${e.workerState.debug?1:0}, uuid="${r}")`);if(console.debug("Worker created:",s),typeof s.set_receiver=="function")s.set_receiver(self);else throw new Error("Worker does not expose a 'set_receiver' method.");e.workerState.worker[r].worker=s,console.debug("Worker ready"),i(s)});e.workerState.worker[r].make_promise=o}return e.get_worker(r)}catch(t){throw console.error("Error during worker initialization:",t),t}},e.receivepy=(r,t)=>{try{let o={};if(typeof r=="string"?o.msg=r:o=r,o.msg===void 0)return;typeof o.msg!="string"&&(o.msg=JSON.stringify(o.msg)),t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error(`Worker id not provided in receivepy(${JSON.stringify(o)})`);if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy(${JSON.stringify(o)})`);e.workerState.receivepy(r,i)}catch(o){console.error("Error during receivepy:",o);return}},e.receivepy_bytes=(r,t)=>{r=r.toJs();try{let o={};if(r instanceof Uint8Array?o.msg=r:o=r,o.msg===void 0)return;t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error("Worker id not provided in receivepy_bytes");if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy_bytes`);e.workerState.receivepy_bytes(r,i)}catch(o){console.error("Error during receivepy_bytes:",o);return}},e.startInitialization=({debug:r=!1,receivepy:t,receivepy_bytes:o,pyodide_url:i,post_pyodide_ready:a,packages:s})=>(e.workerState.debug=r,e.workerState.pyodide_url=i||d,e.workerState.packages=s,e.workerState.receivepy=t,e.workerState.receivepy_bytes=o,e.workerState.pyodideReadyPromise=null,e.workerState.post_pyodide_ready=a,e.workerState),e.register_cmd_message=(r,t)=>{if(e.workerState.handel_register[r])throw new Error(`Command ${r} already registered`);e.workerState.handel_register[r]=t},e.register_cmd_message("ping",async r=>"pong"),e.register_cmd_message("init",async r=>{if(e.workerState.pyodideReadyPromise)throw new Error("Pyodide is already initialized");r.data&&(r.data.pyodide_url&&(e.workerState.pyodide_url=r.data.pyodide_url),r.data.packages&&(e.workerState.packages=r.data.packages),r.data.debug&&(e.workerState.debug=r.data.debug)),e.workerState.pyodideReadyPromise=e.initializePyodide()}),e.register_cmd_message("_eval",async r=>{var t;try{const o=await((t=e.workerState.pyodide)==null?void 0:t.runPythonAsync(r.msg||"print('No code provided')"));return console.log("Eval result:",o),o}catch(o){console.error("Error during _eval:",o)}}),e.register_cmd_message("state",async r=>({state:{...e.workerState.state,loaded:e.workerState.pyodideReady}})),e.register_cmd_message("worker:state",async r=>({state:{loaded:!!(await e.get_or_create_worker(r.worker_id)).worker}})),e.register_cmd_message("worker:stop",async r=>{var o;if(!e.has_worker(r.worker_id))return;const t=await e.get_or_create_worker(r.worker_id);return t.worker&&(t.worker.stop(),t.worker=null,(o=t.reject_promise)==null||o.call(t,"Worker stopped")),delete e.workerState.worker[r.worker_id],{state:{loaded:!1}}}),e.register_cmd_message("worker:send",async r=>{const t=await e.get_or_create_worker(r.worker_id);if(!t.worker)throw new Error("Worker is not initialized");if(typeof t.worker.receivejs!="function")throw new Error(`Worker does not support receivejs: ${typeof t.worker.receivejs}`);t.worker.receivejs(r.msg)}),e.handleMessage=async r=>{const t={original:r};r.id&&(t.id=r.id),r.toJs===void 0&&(r.toJs=!0);try{if(r.cmd){const o=r;if(e.workerState.handel_register[o.cmd])t.result=await e.workerState.handel_register[o.cmd](o);else throw new Error("Unknown command: "+o.cmd)}else throw new Error("Unknown message format: "+JSON.stringify(r))}catch(o){t.error=o.message}return t},e.read_url_params=()=>{var a,s;const r=new URLSearchParams(self.location.search),t=((a=r.get("debug"))==null?void 0:a.toLowerCase())==="true",o=r.get("pyodide_url")||void 0,i=((s=r.get("packages"))==null?void 0:s.split(","))||[];return{debug:t,pyodide_url:o,packages:i}};const n=e;n.general_initalization=r=>{const t=n.read_url_params();n.startInitialization({...r,...t})};const w=n,c=n;c.init_dedicated_worker=r=>{const t=e;t.onmessage=async i=>{const a=i.data,s=await t.handleMessage(a);t.postMessage(s)};const o={...r,receivepy:(i,a)=>{t.postMessage({cmd:"receive",msg:i,worker_id:a})},receivepy_bytes(i,a){t.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})}};t.general_initalization(o)},w.init_shared_worker=r=>{const t=e;t.connectedPorts=[],t.onconnect=i=>{const a=i.ports[0];t.connectedPorts.push(a),a.start(),console.debug("Port connected in shared worker"),a.onmessage=async s=>{const k=s.data,p=await t.handleMessage(k);a.postMessage(p)}};const o={...r,receivepy:(i,a)=>{t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive",msg:i,worker_id:a})})},receivepy_bytes(i,a){t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})})}};t.general_initalization(o)},n.init_dedicated_worker({})})();
@@ -1 +0,0 @@
1
- (function(){"use strict";const d="https://cdn.jsdelivr.net/pyodide/v0.27.2/full/pyodide.mjs",e=self;e.workerState={pyodide:null,pyodide_url:d,packages:[],state:{msg:"loading",loaded:!1,progress:0},micropip:null,worker:{},pyodideReady:!1,pyodideReadyPromise:null,debug:!1,interruptBuffer:null,receivepy:(r,t)=>{},receivepy_bytes:(r,t)=>{},handel_register:{},post_pyodide_ready:void 0},e.reset=async()=>{var r;for(const t in e.list_workers())try{const o=await e.get_worker(t);o.worker&&o.worker.stop(),(r=o.reject_promise)==null||r.call(o,"Worker reset")}catch{}e.workerState.pyodide&&e.interrupt(),e.workerState.pyodide=null,e.workerState.micropip=null,e.workerState.worker={},e.workerState.pyodideReady=!1;try{e.workerState.interruptBuffer=new Uint8Array(new SharedArrayBuffer(1)),e.workerState.interruptBuffer[0]=0}catch{}},e.initializePyodide=async()=>{var r,t;if(!e.workerState.pyodide){console.log("initializePyodide with: Debug:",e.workerState.debug,"Pyodide URL:",e.workerState.pyodide_url,"Packages:",e.workerState.packages),console.debug("Loading Pyodide..."),e.workerState.state.msg="Loading Pyodide...",e.workerState.state.progress=0,await e.reset(),console.debug("Loading Pyodide module..."),e.workerState.state.msg="Loading Pyodide module...",e.workerState.state.progress=.1;const o=await import(e.workerState.pyodide_url);console.debug("Loading Pyodide instance..."),e.workerState.state.msg="Loading Pyodide instance...",e.workerState.state.progress=.2;const i=o.loadPyodide,a=e.workerState.pyodide_url.split("/").slice(0,-1).join("/");console.log(a),e.workerState.pyodide=await i({packages:["micropip"],indexURL:a}),e.workerState.interruptBuffer&&e.workerState.pyodide.setInterruptBuffer(e.workerState.interruptBuffer)}e.workerState.micropip||(console.debug("Importing micropip..."),e.workerState.state.msg="Importing micropip...",e.workerState.state.progress=.3,e.workerState.micropip=e.workerState.pyodide.pyimport("micropip")),console.debug("Pyodide ready. Installing funcnodes...");for(const o of e.workerState.packages)console.log("Installing package:",o),e.workerState.state.msg=`Installing package: ${o}`,await e.workerState.micropip.install(o);return e.workerState.state.msg="Installing funcnodes",e.workerState.state.progress=.8,await e.workerState.micropip.install("funcnodes"),e.workerState.state.msg="Installing funcnodes-worker",await e.workerState.micropip.install("funcnodes-worker"),e.workerState.state.msg="Installing funcnodes-pyodide",await e.workerState.micropip.install("funcnodes-pyodide"),e.workerState.state.msg="Importing funcnodes",console.debug("Importing funcnodes..."),await e.workerState.pyodide.runPythonAsync("import funcnodes_pyodide"),console.debug("Running post_pyodide_ready..."),await((t=(r=e.workerState).post_pyodide_ready)==null?void 0:t.call(r,e.workerState)),console.debug("Pyodide ready"),e.workerState.state.msg="ready",e.workerState.state.progress=.1,e.workerState.pyodideReady=!0,{pyodide:e.workerState.pyodide,micropip:e.workerState.micropip}},e.interrupt=()=>{e.workerState.interruptBuffer&&(e.workerState.interruptBuffer[0]=1)},e.list_workers=()=>Object.keys(e.workerState.worker),e.get_worker=async r=>{if(!r)throw new Error("Worker id is required");if(!e.workerState.worker[r])throw new Error(`Worker with id ${r} not found`);return await e.workerState.worker[r].make_promise,e.workerState.worker[r]},e.has_worker=r=>{if(!r)throw new Error("Worker id is required");return!!e.workerState.worker[r]},e.get_or_create_worker=async r=>{if(!r)throw new Error("Worker id is required");return e.workerState.worker[r]||(console.log("Creating worker with id",r),await e.initializeFuncNodesWorker(r)),e.get_worker(r)},e.initializeFuncNodesWorker=async r=>{try{if(!e.workerState.pyodideReadyPromise)throw new Error("Pyodide newer initialized");const{pyodide:t}=await e.workerState.pyodideReadyPromise;if(!e.has_worker(r)){e.workerState.worker[r]={worker:null,make_promise:void 0};const o=new Promise(async(i,a)=>{e.workerState.worker[r].reject_promise=a,console.debug(`Creating worker (${r})...`);const s=await t.runPythonAsync(`funcnodes_pyodide.new_worker(debug=${e.workerState.debug?1:0}, uuid="${r}")`);if(console.debug("Worker created:",s),typeof s.set_receiver=="function")s.set_receiver(self);else throw new Error("Worker does not expose a 'set_receiver' method.");e.workerState.worker[r].worker=s,console.debug("Worker ready"),i(s)});e.workerState.worker[r].make_promise=o}return e.get_worker(r)}catch(t){throw console.error("Error during worker initialization:",t),t}},e.receivepy=(r,t)=>{try{let o={};if(typeof r=="string"?o.msg=r:o=r,o.msg===void 0)return;typeof o.msg!="string"&&(o.msg=JSON.stringify(o.msg)),t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error(`Worker id not provided in receivepy(${JSON.stringify(o)})`);if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy(${JSON.stringify(o)})`);e.workerState.receivepy(r,i)}catch(o){console.error("Error during receivepy:",o);return}},e.receivepy_bytes=(r,t)=>{r=r.toJs();try{let o={};if(r instanceof Uint8Array?o.msg=r:o=r,o.msg===void 0)return;t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error("Worker id not provided in receivepy_bytes");if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy_bytes`);e.workerState.receivepy_bytes(r,i)}catch(o){console.error("Error during receivepy_bytes:",o);return}},e.startInitialization=({debug:r=!1,receivepy:t,receivepy_bytes:o,pyodide_url:i,post_pyodide_ready:a,packages:s})=>(e.workerState.debug=r,e.workerState.pyodide_url=i||d,e.workerState.packages=s,e.workerState.receivepy=t,e.workerState.receivepy_bytes=o,e.workerState.pyodideReadyPromise=null,e.workerState.post_pyodide_ready=a,e.workerState),e.register_cmd_message=(r,t)=>{if(e.workerState.handel_register[r])throw new Error(`Command ${r} already registered`);e.workerState.handel_register[r]=t},e.register_cmd_message("ping",async r=>"pong"),e.register_cmd_message("init",async r=>{if(e.workerState.pyodideReadyPromise)throw new Error("Pyodide is already initialized");r.data&&(r.data.pyodide_url&&(e.workerState.pyodide_url=r.data.pyodide_url),r.data.packages&&(e.workerState.packages=r.data.packages),r.data.debug&&(e.workerState.debug=r.data.debug)),e.workerState.pyodideReadyPromise=e.initializePyodide()}),e.register_cmd_message("_eval",async r=>{var t;try{const o=await((t=e.workerState.pyodide)==null?void 0:t.runPythonAsync(r.msg||"print('No code provided')"));return console.log("Eval result:",o),o}catch(o){console.error("Error during _eval:",o)}}),e.register_cmd_message("state",async r=>({state:{...e.workerState.state,loaded:e.workerState.pyodideReady}})),e.register_cmd_message("worker:state",async r=>({state:{loaded:!!(await e.get_or_create_worker(r.worker_id)).worker}})),e.register_cmd_message("worker:stop",async r=>{var o;if(!e.has_worker(r.worker_id))return;const t=await e.get_or_create_worker(r.worker_id);return t.worker&&(t.worker.stop(),t.worker=null,(o=t.reject_promise)==null||o.call(t,"Worker stopped")),delete e.workerState.worker[r.worker_id],{state:{loaded:!1}}}),e.register_cmd_message("worker:send",async r=>{const t=await e.get_or_create_worker(r.worker_id);if(!t.worker)throw new Error("Worker is not initialized");if(typeof t.worker.receivejs!="function")throw new Error(`Worker does not support receivejs: ${typeof t.worker.receivejs}`);t.worker.receivejs(r.msg)}),e.handleMessage=async r=>{const t={original:r};r.id&&(t.id=r.id),r.toJs===void 0&&(r.toJs=!0);try{if(r.cmd){const o=r;if(e.workerState.handel_register[o.cmd])t.result=await e.workerState.handel_register[o.cmd](o);else throw new Error("Unknown command: "+o.cmd)}else throw new Error("Unknown message format: "+JSON.stringify(r))}catch(o){t.error=o.message}return t},e.read_url_params=()=>{var a,s;const r=new URLSearchParams(self.location.search),t=((a=r.get("debug"))==null?void 0:a.toLowerCase())==="true",o=r.get("pyodide_url")||void 0,i=((s=r.get("packages"))==null?void 0:s.split(","))||[];return{debug:t,pyodide_url:o,packages:i}};const n=e;n.general_initalization=r=>{const t=n.read_url_params();n.startInitialization({...r,...t})};const w=n,c=n;c.init_dedicated_worker=r=>{const t=e;t.onmessage=async i=>{const a=i.data,s=await t.handleMessage(a);t.postMessage(s)};const o={...r,receivepy:(i,a)=>{t.postMessage({cmd:"receive",msg:i,worker_id:a})},receivepy_bytes(i,a){t.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})}};t.general_initalization(o)},w.init_shared_worker=r=>{const t=e;t.connectedPorts=[],t.onconnect=i=>{const a=i.ports[0];t.connectedPorts.push(a),a.start(),console.debug("Port connected in shared worker"),a.onmessage=async s=>{const k=s.data,p=await t.handleMessage(k);a.postMessage(p)}};const o={...r,receivepy:(i,a)=>{t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive",msg:i,worker_id:a})})},receivepy_bytes(i,a){t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})})}};t.general_initalization(o)},n.init_shared_worker({})})();