@linkdlab/funcnodes_pyodide_react_flow 0.1.10 → 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 W=require("@linkdlab/funcnodes_react_flow"),o=[];for(let r=0;r<256;++r)o.push((r+256).toString(16).slice(1));function U(r,e=0){return(o[r[e+0]]+o[r[e+1]]+o[r[e+2]]+o[r[e+3]]+"-"+o[r[e+4]]+o[r[e+5]]+"-"+o[r[e+6]]+o[r[e+7]]+"-"+o[r[e+8]]+o[r[e+9]]+"-"+o[r[e+10]]+o[r[e+11]]+o[r[e+12]]+o[r[e+13]]+o[r[e+14]]+o[r[e+15]]).toLowerCase()}let u;const L=new Uint8Array(16);function j(){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(L)}const I=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),f={randomUUID:I};function z(r,e,t){var a;if(f.randomUUID&&!r)return f.randomUUID();r=r||{};const i=r.random??((a=r.rng)==null?void 0:a.call(r))??j();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,U(i)}const v='(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({})})();\n',S=typeof self<"u"&&self.Blob&&new Blob([v],{type:"text/javascript;charset=utf-8"});function $(r){let e;try{if(e=S&&(self.URL||self.webkitURL).createObjectURL(S),!e)throw"";const t=new Worker(e,{name:r==null?void 0:r.name});return t.addEventListener("error",()=>{(self.URL||self.webkitURL).revokeObjectURL(e)}),t}catch{return new Worker("data:text/javascript;charset=utf-8,"+encodeURIComponent(v),{name:r==null?void 0:r.name})}finally{e&&(self.URL||self.webkitURL).revokeObjectURL(e)}}const b='(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({})})();\n',h=typeof self<"u"&&self.Blob&&new Blob([b],{type:"text/javascript;charset=utf-8"});function M(r){let e;try{if(e=h&&(self.URL||self.webkitURL).createObjectURL(h),!e)throw"";const t=new Worker(e,{name:r==null?void 0:r.name});return t.addEventListener("error",()=>{(self.URL||self.webkitURL).revokeObjectURL(e)}),t}catch{return new Worker("data:text/javascript;charset=utf-8,"+encodeURIComponent(b),{name:r==null?void 0:r.name})}finally{e&&(self.URL||self.webkitURL).revokeObjectURL(e)}}const B=r=>(r.worker||(r.shared_worker?r.worker_url===void 0?r.worker=new M({name:r.uuid}):r.worker=new SharedWorker(r.worker_url,{name:r.uuid,type:"module"}):r.worker_url===void 0?r.worker=new $({name:r.uuid}):r.worker=new Worker(r.worker_url,{name:r.uuid,type:"module"})),r.worker);class O extends W.FuncNodesWorker{constructor(e){const t={uuid:z(),...e};if(super(t),this._message_hooks=[],this._worker=B(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(e){await this.initPromise,this.postMessage({cmd:"worker:send",msg:JSON.stringify(e),worker_id:this.uuid})}postMessage(e){e.worker_id=this.uuid,this._port?this._port.postMessage(e):this._worker.postMessage(e)}registerMessageHook(e){return this._message_hooks.push(e),()=>{this._message_hooks=this._message_hooks.filter(t=>t!==e)}}onmessage(e){var t;for(const i of this._message_hooks)i(e.data);if(e.data.result)e.data.result.state&&(this._workerstate={...this._workerstate,...e.data.result.state},e.data.result.state.msg&&e.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(e.data.cmd){if(e.data.cmd==="receive"){if(e.data.worker_id===void 0)throw new Error("worker_id is undefined");e.data.worker_id===this.uuid&&this.receive(JSON.parse(e.data.msg))}else if(e.data.cmd==="receive_bytes"){if(e.data.worker_id===void 0)throw new Error("worker_id is undefined");e.data.worker_id===this.uuid&&this.onbytes(e.data.msg)}}}async upload_file({files:e,onProgressCallback:t,root:i}){const a=[],c=e.length;let k=0;if(e.length===0)return"";for(let d=0;d<e.length;d++){const w=e[d],n=new FileReader,p=new Promise((l,s)=>{n.onload=async P=>{var _;try{const g=(_=P.target.result)==null?void 0:_.replace(/^data:.+;base64,/,""),m=w.webkitRelativePath||w.name,R=i?`${i}/${m}`:m,E=await this._send_cmd({cmd:"upload",kwargs:{data:g,filename:R},wait_for_response:!0});k++,t&&t(k,c),l(E)}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])}}module.exports=O;
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,93 +1,83 @@
1
- import { FuncNodesWorker as W } from "@linkdlab/funcnodes_react_flow";
1
+ import { FuncNodesWorker as E } from "@linkdlab/funcnodes_react_flow";
2
2
  const o = [];
3
- for (let r = 0; r < 256; ++r)
4
- o.push((r + 256).toString(16).slice(1));
5
- function U(r, e = 0) {
6
- return (o[r[e + 0]] + o[r[e + 1]] + o[r[e + 2]] + o[r[e + 3]] + "-" + o[r[e + 4]] + o[r[e + 5]] + "-" + o[r[e + 6]] + o[r[e + 7]] + "-" + o[r[e + 8]] + o[r[e + 9]] + "-" + o[r[e + 10]] + o[r[e + 11]] + o[r[e + 12]] + o[r[e + 13]] + o[r[e + 14]] + o[r[e + 15]]).toLowerCase();
3
+ for (let e = 0; e < 256; ++e)
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
8
  let u;
9
- const L = new Uint8Array(16);
10
- function j() {
9
+ const R = new Uint8Array(16);
10
+ function U() {
11
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
14
  u = crypto.getRandomValues.bind(crypto);
15
15
  }
16
- return u(L);
16
+ return u(R);
17
17
  }
18
18
  const I = typeof crypto < "u" && crypto.randomUUID && crypto.randomUUID.bind(crypto), f = { randomUUID: I };
19
- function z(r, e, t) {
19
+ function L(e, r, t) {
20
20
  var a;
21
- if (f.randomUUID && !r)
21
+ if (f.randomUUID && !e)
22
22
  return f.randomUUID();
23
- r = r || {};
24
- const i = r.random ?? ((a = r.rng) == null ? void 0 : a.call(r)) ?? j();
23
+ e = e || {};
24
+ const i = e.random ?? ((a = e.rng) == null ? void 0 : a.call(e)) ?? U();
25
25
  if (i.length < 16)
26
26
  throw new Error("Random bytes length must be >= 16");
27
- return i[6] = i[6] & 15 | 64, i[8] = i[8] & 63 | 128, U(i);
27
+ return i[6] = i[6] & 15 | 64, i[8] = i[8] & 63 | 128, W(i);
28
28
  }
29
- const v = '(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({})})();\n', S = typeof self < "u" && self.Blob && new Blob([v], { type: "text/javascript;charset=utf-8" });
30
- function $(r) {
31
- let e;
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
32
  try {
33
- if (e = S && (self.URL || self.webkitURL).createObjectURL(S), !e) throw "";
34
- const t = new Worker(e, {
35
- name: r == null ? void 0 : r.name
33
+ if (r = S && (self.URL || self.webkitURL).createObjectURL(S), !r) throw "";
34
+ const t = new Worker(r, {
35
+ name: e == null ? void 0 : e.name
36
36
  });
37
37
  return t.addEventListener("error", () => {
38
- (self.URL || self.webkitURL).revokeObjectURL(e);
38
+ (self.URL || self.webkitURL).revokeObjectURL(r);
39
39
  }), t;
40
40
  } catch {
41
41
  return new Worker(
42
- "data:text/javascript;charset=utf-8," + encodeURIComponent(v),
42
+ "data:text/javascript;charset=utf-8," + encodeURIComponent(h),
43
43
  {
44
- name: r == null ? void 0 : r.name
44
+ name: e == null ? void 0 : e.name
45
45
  }
46
46
  );
47
47
  } finally {
48
- e && (self.URL || self.webkitURL).revokeObjectURL(e);
48
+ r && (self.URL || self.webkitURL).revokeObjectURL(r);
49
49
  }
50
50
  }
51
- const b = '(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({})})();\n', h = typeof self < "u" && self.Blob && new Blob([b], { type: "text/javascript;charset=utf-8" });
52
- function M(r) {
53
- let e;
54
- try {
55
- if (e = h && (self.URL || self.webkitURL).createObjectURL(h), !e) throw "";
56
- const t = new Worker(e, {
57
- name: r == null ? void 0 : r.name
58
- });
59
- return t.addEventListener("error", () => {
60
- (self.URL || self.webkitURL).revokeObjectURL(e);
61
- }), t;
62
- } catch {
63
- return new Worker(
64
- "data:text/javascript;charset=utf-8," + encodeURIComponent(b),
65
- {
66
- name: r == null ? void 0 : r.name
67
- }
68
- );
69
- } finally {
70
- e && (self.URL || self.webkitURL).revokeObjectURL(e);
71
- }
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),
55
+ {
56
+ name: e == null ? void 0 : e.name
57
+ }
58
+ );
72
59
  }
73
- const B = (r) => (r.worker || (r.shared_worker ? r.worker_url === void 0 ? r.worker = new M({
74
- name: r.uuid
75
- }) : r.worker = new SharedWorker(r.worker_url, {
76
- name: r.uuid,
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({
64
+ name: e.uuid
65
+ }) : e.worker = new SharedWorker(e.worker_url, {
66
+ name: e.uuid,
77
67
  type: "module"
78
- }) : r.worker_url === void 0 ? r.worker = new $({
79
- name: r.uuid
80
- }) : r.worker = new Worker(r.worker_url, {
81
- name: r.uuid,
68
+ }) : e.worker_url === void 0 ? e.worker = new e.worker_classes.Dedicated({
69
+ name: e.uuid
70
+ }) : e.worker = new Worker(e.worker_url, {
71
+ name: e.uuid,
82
72
  type: "module"
83
- })), r.worker);
84
- class x extends W {
85
- constructor(e) {
73
+ })), e.worker);
74
+ class J extends E {
75
+ constructor(r) {
86
76
  const t = {
87
- uuid: z(),
88
- ...e
77
+ uuid: L(),
78
+ ...r
89
79
  };
90
- if (super(t), this._message_hooks = [], this._worker = B(t), this._worker instanceof SharedWorker)
80
+ if (super(t), this._message_hooks = [], this._worker = M(t), this._worker instanceof SharedWorker)
91
81
  t.shared_worker = !0, this._port = this._worker.port, this._port.start(), this._port.addEventListener("message", this.onmessage.bind(this));
92
82
  else if (this._worker instanceof Worker)
93
83
  t.shared_worker = !1, this._worker.addEventListener("message", this.onmessage.bind(this));
@@ -113,67 +103,67 @@ class x extends W {
113
103
  this.stepwise_fullsync();
114
104
  });
115
105
  }
116
- async send(e) {
106
+ async send(r) {
117
107
  await this.initPromise, this.postMessage({
118
108
  cmd: "worker:send",
119
- msg: JSON.stringify(e),
109
+ msg: JSON.stringify(r),
120
110
  worker_id: this.uuid
121
111
  });
122
112
  }
123
- postMessage(e) {
124
- e.worker_id = this.uuid, this._port ? this._port.postMessage(e) : this._worker.postMessage(e);
113
+ postMessage(r) {
114
+ r.worker_id = this.uuid, this._port ? this._port.postMessage(r) : this._worker.postMessage(r);
125
115
  }
126
- registerMessageHook(e) {
127
- return this._message_hooks.push(e), () => {
128
- this._message_hooks = this._message_hooks.filter((t) => t !== e);
116
+ registerMessageHook(r) {
117
+ return this._message_hooks.push(r), () => {
118
+ this._message_hooks = this._message_hooks.filter((t) => t !== r);
129
119
  };
130
120
  }
131
- onmessage(e) {
121
+ onmessage(r) {
132
122
  var t;
133
123
  for (const i of this._message_hooks)
134
- i(e.data);
135
- if (e.data.result)
136
- e.data.result.state && (this._workerstate = {
124
+ i(r.data);
125
+ if (r.data.result)
126
+ r.data.result.state && (this._workerstate = {
137
127
  ...this._workerstate,
138
- ...e.data.result.state
139
- }, e.data.result.state.msg && e.data.result.state.msg !== "ready" && ((t = this._zustand) == null || t.set_progress({
128
+ ...r.data.result.state
129
+ }, r.data.result.state.msg && r.data.result.state.msg !== "ready" && ((t = this._zustand) == null || t.set_progress({
140
130
  message: this._workerstate.msg,
141
131
  status: "info",
142
132
  progress: this._workerstate.progress,
143
133
  blocking: !0
144
134
  })));
145
- else if (e.data.cmd) {
146
- if (e.data.cmd === "receive") {
147
- if (e.data.worker_id === void 0)
135
+ else if (r.data.cmd) {
136
+ if (r.data.cmd === "receive") {
137
+ if (r.data.worker_id === void 0)
148
138
  throw new Error("worker_id is undefined");
149
- e.data.worker_id === this.uuid && this.receive(JSON.parse(e.data.msg));
150
- } else if (e.data.cmd === "receive_bytes") {
151
- if (e.data.worker_id === void 0)
139
+ r.data.worker_id === this.uuid && this.receive(JSON.parse(r.data.msg));
140
+ } else if (r.data.cmd === "receive_bytes") {
141
+ if (r.data.worker_id === void 0)
152
142
  throw new Error("worker_id is undefined");
153
- e.data.worker_id === this.uuid && this.onbytes(e.data.msg);
143
+ r.data.worker_id === this.uuid && this.onbytes(r.data.msg);
154
144
  }
155
145
  }
156
146
  }
157
147
  async upload_file({
158
- files: e,
148
+ files: r,
159
149
  onProgressCallback: t,
160
150
  root: i
161
151
  }) {
162
- const a = [], c = e.length;
152
+ const a = [], c = r.length;
163
153
  let k = 0;
164
- if (e.length === 0)
154
+ if (r.length === 0)
165
155
  return "";
166
- for (let d = 0; d < e.length; d++) {
167
- const w = e[d], n = new FileReader(), p = new Promise((l, s) => {
168
- n.onload = async (P) => {
156
+ for (let d = 0; d < r.length; d++) {
157
+ const w = r[d], n = new FileReader(), p = new Promise((l, s) => {
158
+ n.onload = async (v) => {
169
159
  var _;
170
160
  try {
171
- const g = (_ = P.target.result) == null ? void 0 : _.replace(/^data:.+;base64,/, ""), m = w.webkitRelativePath || w.name, R = i ? `${i}/${m}` : m, E = 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({
172
162
  cmd: "upload",
173
- kwargs: { data: g, filename: R },
163
+ kwargs: { data: g, filename: b },
174
164
  wait_for_response: !0
175
165
  });
176
- k++, t && t(k, c), l(E);
166
+ k++, t && t(k, c), l(P);
177
167
  } catch (g) {
178
168
  s(g);
179
169
  }
@@ -189,7 +179,10 @@ class x extends W {
189
179
  return l.join("/");
190
180
  }, y[0]);
191
181
  }
182
+ get ready() {
183
+ return this._workerstate.loaded;
184
+ }
192
185
  }
193
186
  export {
194
- x as default
187
+ J as default
195
188
  };
package/dist/index.umd.js CHANGED
@@ -1 +1 @@
1
- (function(n,o){typeof exports=="object"&&typeof module<"u"?module.exports=o(require("@linkdlab/funcnodes_react_flow")):typeof define=="function"&&define.amd?define(["@linkdlab/funcnodes_react_flow"],o):(n=typeof globalThis<"u"?globalThis:n||self,n.funcnodes_pyodide_react_flow=o(n.funcnodes_react_flow))})(this,function(n){"use strict";const o=[];for(let r=0;r<256;++r)o.push((r+256).toString(16).slice(1));function R(r,e=0){return(o[r[e+0]]+o[r[e+1]]+o[r[e+2]]+o[r[e+3]]+"-"+o[r[e+4]]+o[r[e+5]]+"-"+o[r[e+6]]+o[r[e+7]]+"-"+o[r[e+8]]+o[r[e+9]]+"-"+o[r[e+10]]+o[r[e+11]]+o[r[e+12]]+o[r[e+13]]+o[r[e+14]]+o[r[e+15]]).toLowerCase()}let g;const E=new Uint8Array(16);function U(){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(E)}const _={randomUUID:typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};function W(r,e,t){var a;if(_.randomUUID&&!r)return _.randomUUID();r=r||{};const i=r.random??((a=r.rng)==null?void 0:a.call(r))??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,R(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="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({})})();\n',f=typeof self<"u"&&self.Blob&&new Blob([m],{type:"text/javascript;charset=utf-8"});function L(r){let e;try{if(e=f&&(self.URL||self.webkitURL).createObjectURL(f),!e)throw"";const t=new Worker(e,{name:r==null?void 0:r.name});return t.addEventListener("error",()=>{(self.URL||self.webkitURL).revokeObjectURL(e)}),t}catch{return new Worker("data:text/javascript;charset=utf-8,"+encodeURIComponent(m),{name:r==null?void 0:r.name})}finally{e&&(self.URL||self.webkitURL).revokeObjectURL(e)}}const S='(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({})})();\n',h=typeof self<"u"&&self.Blob&&new Blob([S],{type:"text/javascript;charset=utf-8"});function j(r){let e;try{if(e=h&&(self.URL||self.webkitURL).createObjectURL(h),!e)throw"";const t=new Worker(e,{name:r==null?void 0:r.name});return t.addEventListener("error",()=>{(self.URL||self.webkitURL).revokeObjectURL(e)}),t}catch{return new Worker("data:text/javascript;charset=utf-8,"+encodeURIComponent(S),{name:r==null?void 0:r.name})}finally{e&&(self.URL||self.webkitURL).revokeObjectURL(e)}}const I=r=>(r.worker||(r.shared_worker?r.worker_url===void 0?r.worker=new j({name:r.uuid}):r.worker=new SharedWorker(r.worker_url,{name:r.uuid,type:"module"}):r.worker_url===void 0?r.worker=new L({name:r.uuid}):r.worker=new Worker(r.worker_url,{name:r.uuid,type:"module"})),r.worker);class z extends n.FuncNodesWorker{constructor(e){const t={uuid:W(),...e};if(super(t),this._message_hooks=[],this._worker=I(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 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(),a()}),this.initPromise.then(()=>{this.stepwise_fullsync()})}async send(e){await this.initPromise,this.postMessage({cmd:"worker:send",msg:JSON.stringify(e),worker_id:this.uuid})}postMessage(e){e.worker_id=this.uuid,this._port?this._port.postMessage(e):this._worker.postMessage(e)}registerMessageHook(e){return this._message_hooks.push(e),()=>{this._message_hooks=this._message_hooks.filter(t=>t!==e)}}onmessage(e){var t;for(const i of this._message_hooks)i(e.data);if(e.data.result)e.data.result.state&&(this._workerstate={...this._workerstate,...e.data.result.state},e.data.result.state.msg&&e.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(e.data.cmd){if(e.data.cmd==="receive"){if(e.data.worker_id===void 0)throw new Error("worker_id is undefined");e.data.worker_id===this.uuid&&this.receive(JSON.parse(e.data.msg))}else if(e.data.cmd==="receive_bytes"){if(e.data.worker_id===void 0)throw new Error("worker_id is undefined");e.data.worker_id===this.uuid&&this.onbytes(e.data.msg)}}}async upload_file({files:e,onProgressCallback:t,root:i}){const a=[],k=e.length;let l=0;if(e.length===0)return"";for(let c=0;c<e.length;c++){const w=e[c],d=new FileReader,u=new Promise((p,s)=>{d.onload=async $=>{var b;try{const y=(b=$.target.result)==null?void 0:b.replace(/^data:.+;base64,/,""),P=w.webkitRelativePath||w.name,M=i?`${i}/${P}`:P,B=await this._send_cmd({cmd:"upload",kwargs:{data:y,filename:M},wait_for_response:!0});l++,t&&t(l,k),p(B)}catch(y){s(y)}},d.readAsDataURL(w)});a.push(u)}const v=await Promise.all(a);return v.reduce((c,w)=>{const d=w.split("/"),u=c.split("/"),p=[];for(let s=0;s<d.length&&d[s]===u[s];s++)p.push(d[s]);return p.join("/")},v[0])}}return z});
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.10",
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
+ }