@linkdlab/funcnodes_pyodide_react_flow 0.1.8 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";const U=require("@linkdlab/funcnodes_react_flow"),s=[];for(let e=0;e<256;++e)s.push((e+256).toString(16).slice(1));function P(e,r=0){return(s[e[r+0]]+s[e[r+1]]+s[e[r+2]]+s[e[r+3]]+"-"+s[e[r+4]]+s[e[r+5]]+"-"+s[e[r+6]]+s[e[r+7]]+"-"+s[e[r+8]]+s[e[r+9]]+"-"+s[e[r+10]]+s[e[r+11]]+s[e[r+12]]+s[e[r+13]]+s[e[r+14]]+s[e[r+15]]).toLowerCase()}let k;const S=new Uint8Array(16);function x(){if(!k){if(typeof crypto>"u"||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");k=crypto.getRandomValues.bind(crypto)}return k(S)}const E=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),y={randomUUID:E};function I(e,r,t){var i;if(y.randomUUID&&!e)return y.randomUUID();e=e||{};const o=e.random??((i=e.rng)==null?void 0:i.call(e))??x();if(o.length<16)throw new Error("Random bytes length must be >= 16");return o[6]=o[6]&15|64,o[8]=o[8]&63|128,P(o)}function M(e){return new Worker("/assets/pyodideDedicatedWorker-XEcNtM2X.js",{name:e==null?void 0:e.name})}function R(e){return new Worker("/assets/pyodideSharedWorker-BIPs7KQu.js",{name:e==null?void 0:e.name})}const D=e=>(e.worker||(e.shared_worker?e.worker_url===void 0?e.worker=new R({name:e.uuid}):e.worker=new SharedWorker(e.worker_url,{name:e.uuid,type:"module"}):e.worker_url===void 0?e.worker=new M({name:e.uuid}):e.worker=new Worker(e.worker_url,{name:e.uuid,type:"module"})),e.worker);class j extends U.FuncNodesWorker{constructor(r){const t={uuid:I(),...r};if(super(t),this._message_hooks=[],this._worker=D(t),this._worker instanceof SharedWorker)t.shared_worker=!0,this._port=this._worker.port,this._port.start(),this._port.addEventListener("message",this.onmessage.bind(this));else if(this._worker instanceof Worker)t.shared_worker=!1,this._worker.addEventListener("message",this.onmessage.bind(this));else throw new Error("worker must be an instance of Worker or SharedWorker");this.postMessage({cmd:"init",data:{debug:t.debug,pyodide_url:t.pyodide_url,packages:t.packages}});const o=setInterval(()=>{this.postMessage({cmd:"state"})},400);this._workerstate={loaded:!1,msg:"loading",progress:0},this.initPromise=new Promise(async i=>{var c;for(;!this._workerstate.loaded;)await new Promise(h=>setTimeout(h,100));clearInterval(o),this.is_open=!0,(c=this._zustand)==null||c.auto_progress(),i()}),this.initPromise.then(()=>{this.stepwise_fullsync()})}async send(r){await this.initPromise,this.postMessage({cmd:"worker:send",msg:JSON.stringify(r),worker_id:this.uuid})}postMessage(r){r.worker_id=this.uuid,this._port?this._port.postMessage(r):this._worker.postMessage(r)}registerMessageHook(r){return this._message_hooks.push(r),()=>{this._message_hooks=this._message_hooks.filter(t=>t!==r)}}onmessage(r){var t;for(const o of this._message_hooks)o(r.data);if(r.data.result)r.data.result.state&&(this._workerstate={...this._workerstate,...r.data.result.state},r.data.result.state.msg&&r.data.result.state.msg!=="ready"&&((t=this._zustand)==null||t.set_progress({message:this._workerstate.msg,status:"info",progress:this._workerstate.progress,blocking:!0})));else if(r.data.cmd){if(r.data.cmd==="receive"){if(r.data.worker_id===void 0)throw new Error("worker_id is undefined");r.data.worker_id===this.uuid&&this.receive(JSON.parse(r.data.msg))}else if(r.data.cmd==="receive_bytes"){if(r.data.worker_id===void 0)throw new Error("worker_id is undefined");r.data.worker_id===this.uuid&&this.onbytes(r.data.msg)}}}async upload_file({files:r,onProgressCallback:t,root:o}){const i=[],c=r.length;let h=0;if(r.length===0)return"";for(let d=0;d<r.length;d++){const u=r[d],a=new FileReader,m=new Promise((l,n)=>{a.onload=async f=>{var g;try{const w=(g=f.target.result)==null?void 0:g.replace(/^data:.+;base64,/,""),p=u.webkitRelativePath||u.name,b=o?`${o}/${p}`:p,W=await this._send_cmd({cmd:"upload",kwargs:{data:w,filename:b},wait_for_response:!0});h++,t&&t(h,c),l(W)}catch(w){n(w)}},a.readAsDataURL(u)});i.push(m)}const _=await Promise.all(i);return _.reduce((d,u)=>{const a=u.split("/"),m=d.split("/"),l=[];for(let n=0;n<a.length&&a[n]===m[n];n++)l.push(a[n]);return l.join("/")},_[0])}}module.exports=j;
1
+ "use strict";const 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;
package/dist/index.es.js CHANGED
@@ -1,65 +1,93 @@
1
- import { FuncNodesWorker as U } from "@linkdlab/funcnodes_react_flow";
2
- const s = [];
3
- for (let e = 0; e < 256; ++e)
4
- s.push((e + 256).toString(16).slice(1));
5
- function P(e, r = 0) {
6
- return (s[e[r + 0]] + s[e[r + 1]] + s[e[r + 2]] + s[e[r + 3]] + "-" + s[e[r + 4]] + s[e[r + 5]] + "-" + s[e[r + 6]] + s[e[r + 7]] + "-" + s[e[r + 8]] + s[e[r + 9]] + "-" + s[e[r + 10]] + s[e[r + 11]] + s[e[r + 12]] + s[e[r + 13]] + s[e[r + 14]] + s[e[r + 15]]).toLowerCase();
1
+ import { FuncNodesWorker as W } from "@linkdlab/funcnodes_react_flow";
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();
7
7
  }
8
- let k;
9
- const S = new Uint8Array(16);
10
- function x() {
11
- if (!k) {
8
+ let u;
9
+ const L = new Uint8Array(16);
10
+ function j() {
11
+ if (!u) {
12
12
  if (typeof crypto > "u" || !crypto.getRandomValues)
13
13
  throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");
14
- k = crypto.getRandomValues.bind(crypto);
14
+ u = crypto.getRandomValues.bind(crypto);
15
15
  }
16
- return k(S);
16
+ return u(L);
17
17
  }
18
- const E = typeof crypto < "u" && crypto.randomUUID && crypto.randomUUID.bind(crypto), y = { randomUUID: E };
19
- function I(e, r, t) {
20
- var i;
21
- if (y.randomUUID && !e)
22
- return y.randomUUID();
23
- e = e || {};
24
- const o = e.random ?? ((i = e.rng) == null ? void 0 : i.call(e)) ?? x();
25
- if (o.length < 16)
18
+ const I = typeof crypto < "u" && crypto.randomUUID && crypto.randomUUID.bind(crypto), f = { randomUUID: I };
19
+ function z(r, e, t) {
20
+ var a;
21
+ if (f.randomUUID && !r)
22
+ return f.randomUUID();
23
+ r = r || {};
24
+ const i = r.random ?? ((a = r.rng) == null ? void 0 : a.call(r)) ?? j();
25
+ if (i.length < 16)
26
26
  throw new Error("Random bytes length must be >= 16");
27
- return o[6] = o[6] & 15 | 64, o[8] = o[8] & 63 | 128, P(o);
27
+ return i[6] = i[6] & 15 | 64, i[8] = i[8] & 63 | 128, U(i);
28
28
  }
29
- function M(e) {
30
- return new Worker(
31
- "/assets/pyodideDedicatedWorker-XEcNtM2X.js",
32
- {
33
- name: e == null ? void 0 : e.name
34
- }
35
- );
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;
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
36
+ });
37
+ return t.addEventListener("error", () => {
38
+ (self.URL || self.webkitURL).revokeObjectURL(e);
39
+ }), t;
40
+ } catch {
41
+ return new Worker(
42
+ "data:text/javascript;charset=utf-8," + encodeURIComponent(v),
43
+ {
44
+ name: r == null ? void 0 : r.name
45
+ }
46
+ );
47
+ } finally {
48
+ e && (self.URL || self.webkitURL).revokeObjectURL(e);
49
+ }
36
50
  }
37
- function R(e) {
38
- return new Worker(
39
- "/assets/pyodideSharedWorker-BIPs7KQu.js",
40
- {
41
- name: e == null ? void 0 : e.name
42
- }
43
- );
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
+ }
44
72
  }
45
- const D = (e) => (e.worker || (e.shared_worker ? e.worker_url === void 0 ? e.worker = new R({
46
- name: e.uuid
47
- }) : e.worker = new SharedWorker(e.worker_url, {
48
- name: e.uuid,
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,
49
77
  type: "module"
50
- }) : e.worker_url === void 0 ? e.worker = new M({
51
- name: e.uuid
52
- }) : e.worker = new Worker(e.worker_url, {
53
- name: e.uuid,
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,
54
82
  type: "module"
55
- })), e.worker);
56
- class N extends U {
57
- constructor(r) {
83
+ })), r.worker);
84
+ class x extends W {
85
+ constructor(e) {
58
86
  const t = {
59
- uuid: I(),
60
- ...r
87
+ uuid: z(),
88
+ ...e
61
89
  };
62
- if (super(t), this._message_hooks = [], this._worker = D(t), this._worker instanceof SharedWorker)
90
+ if (super(t), this._message_hooks = [], this._worker = B(t), this._worker instanceof SharedWorker)
63
91
  t.shared_worker = !0, this._port = this._worker.port, this._port.start(), this._port.addEventListener("message", this.onmessage.bind(this));
64
92
  else if (this._worker instanceof Worker)
65
93
  t.shared_worker = !1, this._worker.addEventListener("message", this.onmessage.bind(this));
@@ -73,95 +101,95 @@ class N extends U {
73
101
  packages: t.packages
74
102
  }
75
103
  });
76
- const o = setInterval(() => {
104
+ const i = setInterval(() => {
77
105
  this.postMessage({ cmd: "state" });
78
106
  }, 400);
79
- this._workerstate = { loaded: !1, msg: "loading", progress: 0 }, this.initPromise = new Promise(async (i) => {
107
+ this._workerstate = { loaded: !1, msg: "loading", progress: 0 }, this.initPromise = new Promise(async (a) => {
80
108
  var c;
81
109
  for (; !this._workerstate.loaded; )
82
- await new Promise((h) => setTimeout(h, 100));
83
- clearInterval(o), this.is_open = !0, (c = this._zustand) == null || c.auto_progress(), i();
110
+ await new Promise((k) => setTimeout(k, 100));
111
+ clearInterval(i), this.is_open = !0, (c = this._zustand) == null || c.auto_progress(), a();
84
112
  }), this.initPromise.then(() => {
85
113
  this.stepwise_fullsync();
86
114
  });
87
115
  }
88
- async send(r) {
116
+ async send(e) {
89
117
  await this.initPromise, this.postMessage({
90
118
  cmd: "worker:send",
91
- msg: JSON.stringify(r),
119
+ msg: JSON.stringify(e),
92
120
  worker_id: this.uuid
93
121
  });
94
122
  }
95
- postMessage(r) {
96
- r.worker_id = this.uuid, this._port ? this._port.postMessage(r) : this._worker.postMessage(r);
123
+ postMessage(e) {
124
+ e.worker_id = this.uuid, this._port ? this._port.postMessage(e) : this._worker.postMessage(e);
97
125
  }
98
- registerMessageHook(r) {
99
- return this._message_hooks.push(r), () => {
100
- this._message_hooks = this._message_hooks.filter((t) => t !== r);
126
+ registerMessageHook(e) {
127
+ return this._message_hooks.push(e), () => {
128
+ this._message_hooks = this._message_hooks.filter((t) => t !== e);
101
129
  };
102
130
  }
103
- onmessage(r) {
131
+ onmessage(e) {
104
132
  var t;
105
- for (const o of this._message_hooks)
106
- o(r.data);
107
- if (r.data.result)
108
- r.data.result.state && (this._workerstate = {
133
+ for (const i of this._message_hooks)
134
+ i(e.data);
135
+ if (e.data.result)
136
+ e.data.result.state && (this._workerstate = {
109
137
  ...this._workerstate,
110
- ...r.data.result.state
111
- }, r.data.result.state.msg && r.data.result.state.msg !== "ready" && ((t = this._zustand) == null || t.set_progress({
138
+ ...e.data.result.state
139
+ }, e.data.result.state.msg && e.data.result.state.msg !== "ready" && ((t = this._zustand) == null || t.set_progress({
112
140
  message: this._workerstate.msg,
113
141
  status: "info",
114
142
  progress: this._workerstate.progress,
115
143
  blocking: !0
116
144
  })));
117
- else if (r.data.cmd) {
118
- if (r.data.cmd === "receive") {
119
- if (r.data.worker_id === void 0)
145
+ else if (e.data.cmd) {
146
+ if (e.data.cmd === "receive") {
147
+ if (e.data.worker_id === void 0)
120
148
  throw new Error("worker_id is undefined");
121
- r.data.worker_id === this.uuid && this.receive(JSON.parse(r.data.msg));
122
- } else if (r.data.cmd === "receive_bytes") {
123
- if (r.data.worker_id === void 0)
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)
124
152
  throw new Error("worker_id is undefined");
125
- r.data.worker_id === this.uuid && this.onbytes(r.data.msg);
153
+ e.data.worker_id === this.uuid && this.onbytes(e.data.msg);
126
154
  }
127
155
  }
128
156
  }
129
157
  async upload_file({
130
- files: r,
158
+ files: e,
131
159
  onProgressCallback: t,
132
- root: o
160
+ root: i
133
161
  }) {
134
- const i = [], c = r.length;
135
- let h = 0;
136
- if (r.length === 0)
162
+ const a = [], c = e.length;
163
+ let k = 0;
164
+ if (e.length === 0)
137
165
  return "";
138
- for (let d = 0; d < r.length; d++) {
139
- const u = r[d], a = new FileReader(), m = new Promise((l, n) => {
140
- a.onload = async (f) => {
141
- var g;
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) => {
169
+ var _;
142
170
  try {
143
- const w = (g = f.target.result) == null ? void 0 : g.replace(/^data:.+;base64,/, ""), p = u.webkitRelativePath || u.name, b = o ? `${o}/${p}` : p, W = await this._send_cmd({
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({
144
172
  cmd: "upload",
145
- kwargs: { data: w, filename: b },
173
+ kwargs: { data: g, filename: R },
146
174
  wait_for_response: !0
147
175
  });
148
- h++, t && t(h, c), l(W);
149
- } catch (w) {
150
- n(w);
176
+ k++, t && t(k, c), l(E);
177
+ } catch (g) {
178
+ s(g);
151
179
  }
152
- }, a.readAsDataURL(u);
180
+ }, n.readAsDataURL(w);
153
181
  });
154
- i.push(m);
182
+ a.push(p);
155
183
  }
156
- const _ = await Promise.all(i);
157
- return _.reduce((d, u) => {
158
- const a = u.split("/"), m = d.split("/"), l = [];
159
- for (let n = 0; n < a.length && a[n] === m[n]; n++)
160
- l.push(a[n]);
184
+ const y = await Promise.all(a);
185
+ return y.reduce((d, w) => {
186
+ const n = w.split("/"), p = d.split("/"), l = [];
187
+ for (let s = 0; s < n.length && n[s] === p[s]; s++)
188
+ l.push(n[s]);
161
189
  return l.join("/");
162
- }, _[0]);
190
+ }, y[0]);
163
191
  }
164
192
  }
165
193
  export {
166
- N as default
194
+ x as default
167
195
  };
package/dist/index.umd.js CHANGED
@@ -1 +1 @@
1
- (function(a,s){typeof exports=="object"&&typeof module<"u"?module.exports=s(require("@linkdlab/funcnodes_react_flow")):typeof define=="function"&&define.amd?define(["@linkdlab/funcnodes_react_flow"],s):(a=typeof globalThis<"u"?globalThis:a||self,a.funcnodes_pyodide_react_flow=s(a.funcnodes_react_flow))})(this,function(a){"use strict";const s=[];for(let e=0;e<256;++e)s.push((e+256).toString(16).slice(1));function b(e,r=0){return(s[e[r+0]]+s[e[r+1]]+s[e[r+2]]+s[e[r+3]]+"-"+s[e[r+4]]+s[e[r+5]]+"-"+s[e[r+6]]+s[e[r+7]]+"-"+s[e[r+8]]+s[e[r+9]]+"-"+s[e[r+10]]+s[e[r+11]]+s[e[r+12]]+s[e[r+13]]+s[e[r+14]]+s[e[r+15]]).toLowerCase()}let w;const W=new Uint8Array(16);function U(){if(!w){if(typeof crypto>"u"||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");w=crypto.getRandomValues.bind(crypto)}return w(W)}const g={randomUUID:typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};function P(e,r,t){var i;if(g.randomUUID&&!e)return g.randomUUID();e=e||{};const o=e.random??((i=e.rng)==null?void 0:i.call(e))??U();if(o.length<16)throw new Error("Random bytes length must be >= 16");return o[6]=o[6]&15|64,o[8]=o[8]&63|128,b(o)}function x(e){return new Worker("/assets/pyodideDedicatedWorker-XEcNtM2X.js",{name:e==null?void 0:e.name})}function I(e){return new Worker("/assets/pyodideSharedWorker-BIPs7KQu.js",{name:e==null?void 0:e.name})}const S=e=>(e.worker||(e.shared_worker?e.worker_url===void 0?e.worker=new I({name:e.uuid}):e.worker=new SharedWorker(e.worker_url,{name:e.uuid,type:"module"}):e.worker_url===void 0?e.worker=new x({name:e.uuid}):e.worker=new Worker(e.worker_url,{name:e.uuid,type:"module"})),e.worker);class D extends a.FuncNodesWorker{constructor(r){const t={uuid:P(),...r};if(super(t),this._message_hooks=[],this._worker=S(t),this._worker instanceof SharedWorker)t.shared_worker=!0,this._port=this._worker.port,this._port.start(),this._port.addEventListener("message",this.onmessage.bind(this));else if(this._worker instanceof Worker)t.shared_worker=!1,this._worker.addEventListener("message",this.onmessage.bind(this));else throw new Error("worker must be an instance of Worker or SharedWorker");this.postMessage({cmd:"init",data:{debug:t.debug,pyodide_url:t.pyodide_url,packages:t.packages}});const o=setInterval(()=>{this.postMessage({cmd:"state"})},400);this._workerstate={loaded:!1,msg:"loading",progress:0},this.initPromise=new Promise(async i=>{var l;for(;!this._workerstate.loaded;)await new Promise(h=>setTimeout(h,100));clearInterval(o),this.is_open=!0,(l=this._zustand)==null||l.auto_progress(),i()}),this.initPromise.then(()=>{this.stepwise_fullsync()})}async send(r){await this.initPromise,this.postMessage({cmd:"worker:send",msg:JSON.stringify(r),worker_id:this.uuid})}postMessage(r){r.worker_id=this.uuid,this._port?this._port.postMessage(r):this._worker.postMessage(r)}registerMessageHook(r){return this._message_hooks.push(r),()=>{this._message_hooks=this._message_hooks.filter(t=>t!==r)}}onmessage(r){var t;for(const o of this._message_hooks)o(r.data);if(r.data.result)r.data.result.state&&(this._workerstate={...this._workerstate,...r.data.result.state},r.data.result.state.msg&&r.data.result.state.msg!=="ready"&&((t=this._zustand)==null||t.set_progress({message:this._workerstate.msg,status:"info",progress:this._workerstate.progress,blocking:!0})));else if(r.data.cmd){if(r.data.cmd==="receive"){if(r.data.worker_id===void 0)throw new Error("worker_id is undefined");r.data.worker_id===this.uuid&&this.receive(JSON.parse(r.data.msg))}else if(r.data.cmd==="receive_bytes"){if(r.data.worker_id===void 0)throw new Error("worker_id is undefined");r.data.worker_id===this.uuid&&this.onbytes(r.data.msg)}}}async upload_file({files:r,onProgressCallback:t,root:o}){const i=[],l=r.length;let h=0;if(r.length===0)return"";for(let u=0;u<r.length;u++){const c=r[u],d=new FileReader,_=new Promise((m,n)=>{d.onload=async E=>{var f;try{const k=(f=E.target.result)==null?void 0:f.replace(/^data:.+;base64,/,""),y=c.webkitRelativePath||c.name,M=o?`${o}/${y}`:y,R=await this._send_cmd({cmd:"upload",kwargs:{data:k,filename:M},wait_for_response:!0});h++,t&&t(h,l),m(R)}catch(k){n(k)}},d.readAsDataURL(c)});i.push(_)}const p=await Promise.all(i);return p.reduce((u,c)=>{const d=c.split("/"),_=u.split("/"),m=[];for(let n=0;n<d.length&&d[n]===_[n];n++)m.push(d[n]);return m.join("/")},p[0])}}return D});
1
+ (function(n,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});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@linkdlab/funcnodes_pyodide_react_flow",
3
- "version": "0.1.8",
3
+ "version": "0.1.10",
4
4
  "private": false,
5
5
  "description": "Frontend with React Flow for FuncNodes",
6
6
  "repository": {
@@ -24,12 +24,12 @@
24
24
  ],
25
25
  "scripts": {
26
26
  "typecheck": "tsc --noEmit --watch",
27
- "build": " vite build && vite build --config vite.browser.config.js",
27
+ "build": "vite build --config vite.browser.config.js && vite build ",
28
28
  "watch": "vite --config vite.browser.config.js",
29
29
  "preview": "vite build --config vite.browser.config.js && vite preview --config vite.browser.config.js"
30
30
  },
31
31
  "devDependencies": {
32
- "@linkdlab/funcnodes_react_flow": "^0.4.5",
32
+ "@linkdlab/funcnodes_react_flow": "^0.4.6",
33
33
  "@types/react": "^19.1.0",
34
34
  "@types/react-dom": "^19.1.2",
35
35
  "@types/uuid": "^10.0.0",
@@ -43,7 +43,7 @@
43
43
  "vite-plugin-dts": "^4.5.3"
44
44
  },
45
45
  "peerDependencies": {
46
- "@linkdlab/funcnodes_react_flow": "^0.4.5",
46
+ "@linkdlab/funcnodes_react_flow": "^0.4.6",
47
47
  "pyodide": "^0.27.2",
48
48
  "react": "^19.0.0",
49
49
  "react-dom": "^19.0.0"
@@ -1 +0,0 @@
1
- (function(){"use strict";const d="https://cdn.jsdelivr.net/pyodide/v0.27.2/full/pyodide.mjs",e=self;e.workerState={pyodide:null,pyodide_url:d,packages:[],state:{msg:"loading",loaded:!1,progress:0},micropip:null,worker:{},pyodideReady:!1,pyodideReadyPromise:null,debug:!1,interruptBuffer:null,receivepy:(r,t)=>{},receivepy_bytes:(r,t)=>{},handel_register:{},post_pyodide_ready:void 0},e.reset=async()=>{var r;for(const t in e.list_workers())try{const o=await e.get_worker(t);o.worker&&o.worker.stop(),(r=o.reject_promise)==null||r.call(o,"Worker reset")}catch{}e.workerState.pyodide&&e.interrupt(),e.workerState.pyodide=null,e.workerState.micropip=null,e.workerState.worker={},e.workerState.pyodideReady=!1;try{e.workerState.interruptBuffer=new Uint8Array(new SharedArrayBuffer(1)),e.workerState.interruptBuffer[0]=0}catch{}},e.initializePyodide=async()=>{var r,t;if(!e.workerState.pyodide){console.log("initializePyodide with: Debug:",e.workerState.debug,"Pyodide URL:",e.workerState.pyodide_url,"Packages:",e.workerState.packages),console.debug("Loading Pyodide..."),e.workerState.state.msg="Loading Pyodide...",e.workerState.state.progress=0,await e.reset(),console.debug("Loading Pyodide module..."),e.workerState.state.msg="Loading Pyodide module...",e.workerState.state.progress=.1;const o=await import(e.workerState.pyodide_url);console.debug("Loading Pyodide instance..."),e.workerState.state.msg="Loading Pyodide instance...",e.workerState.state.progress=.2;const i=o.loadPyodide,a=e.workerState.pyodide_url.split("/").slice(0,-1).join("/");console.log(a),e.workerState.pyodide=await i({packages:["micropip"],indexURL:a}),e.workerState.interruptBuffer&&e.workerState.pyodide.setInterruptBuffer(e.workerState.interruptBuffer)}e.workerState.micropip||(console.debug("Importing micropip..."),e.workerState.state.msg="Importing micropip...",e.workerState.state.progress=.3,e.workerState.micropip=e.workerState.pyodide.pyimport("micropip")),console.debug("Pyodide ready. Installing funcnodes...");for(const o of e.workerState.packages)console.log("Installing package:",o),e.workerState.state.msg=`Installing package: ${o}`,await e.workerState.micropip.install(o);return e.workerState.state.msg="Installing funcnodes",e.workerState.state.progress=.8,await e.workerState.micropip.install("funcnodes"),e.workerState.state.msg="Installing funcnodes-worker",await e.workerState.micropip.install("funcnodes-worker"),e.workerState.state.msg="Installing funcnodes-pyodide",await e.workerState.micropip.install("funcnodes-pyodide"),e.workerState.state.msg="Importing funcnodes",console.debug("Importing funcnodes..."),await e.workerState.pyodide.runPythonAsync("import funcnodes_pyodide"),console.debug("Running post_pyodide_ready..."),await((t=(r=e.workerState).post_pyodide_ready)==null?void 0:t.call(r,e.workerState)),console.debug("Pyodide ready"),e.workerState.state.msg="ready",e.workerState.state.progress=.1,e.workerState.pyodideReady=!0,{pyodide:e.workerState.pyodide,micropip:e.workerState.micropip}},e.interrupt=()=>{e.workerState.interruptBuffer&&(e.workerState.interruptBuffer[0]=1)},e.list_workers=()=>Object.keys(e.workerState.worker),e.get_worker=async r=>{if(!r)throw new Error("Worker id is required");if(!e.workerState.worker[r])throw new Error(`Worker with id ${r} not found`);return await e.workerState.worker[r].make_promise,e.workerState.worker[r]},e.has_worker=r=>{if(!r)throw new Error("Worker id is required");return!!e.workerState.worker[r]},e.get_or_create_worker=async r=>{if(!r)throw new Error("Worker id is required");return e.workerState.worker[r]||(console.log("Creating worker with id",r),await e.initializeFuncNodesWorker(r)),e.get_worker(r)},e.initializeFuncNodesWorker=async r=>{try{if(!e.workerState.pyodideReadyPromise)throw new Error("Pyodide newer initialized");const{pyodide:t}=await e.workerState.pyodideReadyPromise;if(!e.has_worker(r)){e.workerState.worker[r]={worker:null,make_promise:void 0};const o=new Promise(async(i,a)=>{e.workerState.worker[r].reject_promise=a,console.debug(`Creating worker (${r})...`);const s=await t.runPythonAsync(`funcnodes_pyodide.new_worker(debug=${e.workerState.debug?1:0}, uuid="${r}")`);if(console.debug("Worker created:",s),typeof s.set_receiver=="function")s.set_receiver(self);else throw new Error("Worker does not expose a 'set_receiver' method.");e.workerState.worker[r].worker=s,console.debug("Worker ready"),i(s)});e.workerState.worker[r].make_promise=o}return e.get_worker(r)}catch(t){throw console.error("Error during worker initialization:",t),t}},e.receivepy=(r,t)=>{try{let o={};if(typeof r=="string"?o.msg=r:o=r,o.msg===void 0)return;typeof o.msg!="string"&&(o.msg=JSON.stringify(o.msg)),t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error(`Worker id not provided in receivepy(${JSON.stringify(o)})`);if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy(${JSON.stringify(o)})`);e.workerState.receivepy(r,i)}catch(o){console.error("Error during receivepy:",o);return}},e.receivepy_bytes=(r,t)=>{r=r.toJs();try{let o={};if(r instanceof Uint8Array?o.msg=r:o=r,o.msg===void 0)return;t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error("Worker id not provided in receivepy_bytes");if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy_bytes`);e.workerState.receivepy_bytes(r,i)}catch(o){console.error("Error during receivepy_bytes:",o);return}},e.startInitialization=({debug:r=!1,receivepy:t,receivepy_bytes:o,pyodide_url:i,post_pyodide_ready:a,packages:s})=>(e.workerState.debug=r,e.workerState.pyodide_url=i||d,e.workerState.packages=s,e.workerState.receivepy=t,e.workerState.receivepy_bytes=o,e.workerState.pyodideReadyPromise=null,e.workerState.post_pyodide_ready=a,e.workerState),e.register_cmd_message=(r,t)=>{if(e.workerState.handel_register[r])throw new Error(`Command ${r} already registered`);e.workerState.handel_register[r]=t},e.register_cmd_message("ping",async r=>"pong"),e.register_cmd_message("init",async r=>{if(e.workerState.pyodideReadyPromise)throw new Error("Pyodide is already initialized");r.data&&(r.data.pyodide_url&&(e.workerState.pyodide_url=r.data.pyodide_url),r.data.packages&&(e.workerState.packages=r.data.packages),r.data.debug&&(e.workerState.debug=r.data.debug)),e.workerState.pyodideReadyPromise=e.initializePyodide()}),e.register_cmd_message("_eval",async r=>{var t;try{const o=await((t=e.workerState.pyodide)==null?void 0:t.runPythonAsync(r.msg||"print('No code provided')"));return console.log("Eval result:",o),o}catch(o){console.error("Error during _eval:",o)}}),e.register_cmd_message("state",async r=>({state:{...e.workerState.state,loaded:e.workerState.pyodideReady}})),e.register_cmd_message("worker:state",async r=>({state:{loaded:!!(await e.get_or_create_worker(r.worker_id)).worker}})),e.register_cmd_message("worker:stop",async r=>{var o;if(!e.has_worker(r.worker_id))return;const t=await e.get_or_create_worker(r.worker_id);return t.worker&&(t.worker.stop(),t.worker=null,(o=t.reject_promise)==null||o.call(t,"Worker stopped")),delete e.workerState.worker[r.worker_id],{state:{loaded:!1}}}),e.register_cmd_message("worker:send",async r=>{const t=await e.get_or_create_worker(r.worker_id);if(!t.worker)throw new Error("Worker is not initialized");if(typeof t.worker.receivejs!="function")throw new Error(`Worker does not support receivejs: ${typeof t.worker.receivejs}`);t.worker.receivejs(r.msg)}),e.handleMessage=async r=>{const t={original:r};r.id&&(t.id=r.id),r.toJs===void 0&&(r.toJs=!0);try{if(r.cmd){const o=r;if(e.workerState.handel_register[o.cmd])t.result=await e.workerState.handel_register[o.cmd](o);else throw new Error("Unknown command: "+o.cmd)}else throw new Error("Unknown message format: "+JSON.stringify(r))}catch(o){t.error=o.message}return t},e.read_url_params=()=>{var a,s;const r=new URLSearchParams(self.location.search),t=((a=r.get("debug"))==null?void 0:a.toLowerCase())==="true",o=r.get("pyodide_url")||void 0,i=((s=r.get("packages"))==null?void 0:s.split(","))||[];return{debug:t,pyodide_url:o,packages:i}};const n=e;n.general_initalization=r=>{const t=n.read_url_params();n.startInitialization({...r,...t})};const w=n,c=n;c.init_dedicated_worker=r=>{const t=e;t.onmessage=async i=>{const a=i.data,s=await t.handleMessage(a);t.postMessage(s)};const o={...r,receivepy:(i,a)=>{t.postMessage({cmd:"receive",msg:i,worker_id:a})},receivepy_bytes(i,a){t.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})}};t.general_initalization(o)},w.init_shared_worker=r=>{const t=e;t.connectedPorts=[],t.onconnect=i=>{const a=i.ports[0];t.connectedPorts.push(a),a.start(),console.debug("Port connected in shared worker"),a.onmessage=async s=>{const k=s.data,p=await t.handleMessage(k);a.postMessage(p)}};const o={...r,receivepy:(i,a)=>{t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive",msg:i,worker_id:a})})},receivepy_bytes(i,a){t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})})}};t.general_initalization(o)},n.init_dedicated_worker({})})();
@@ -1 +0,0 @@
1
- (function(){"use strict";const d="https://cdn.jsdelivr.net/pyodide/v0.27.2/full/pyodide.mjs",e=self;e.workerState={pyodide:null,pyodide_url:d,packages:[],state:{msg:"loading",loaded:!1,progress:0},micropip:null,worker:{},pyodideReady:!1,pyodideReadyPromise:null,debug:!1,interruptBuffer:null,receivepy:(r,t)=>{},receivepy_bytes:(r,t)=>{},handel_register:{},post_pyodide_ready:void 0},e.reset=async()=>{var r;for(const t in e.list_workers())try{const o=await e.get_worker(t);o.worker&&o.worker.stop(),(r=o.reject_promise)==null||r.call(o,"Worker reset")}catch{}e.workerState.pyodide&&e.interrupt(),e.workerState.pyodide=null,e.workerState.micropip=null,e.workerState.worker={},e.workerState.pyodideReady=!1;try{e.workerState.interruptBuffer=new Uint8Array(new SharedArrayBuffer(1)),e.workerState.interruptBuffer[0]=0}catch{}},e.initializePyodide=async()=>{var r,t;if(!e.workerState.pyodide){console.log("initializePyodide with: Debug:",e.workerState.debug,"Pyodide URL:",e.workerState.pyodide_url,"Packages:",e.workerState.packages),console.debug("Loading Pyodide..."),e.workerState.state.msg="Loading Pyodide...",e.workerState.state.progress=0,await e.reset(),console.debug("Loading Pyodide module..."),e.workerState.state.msg="Loading Pyodide module...",e.workerState.state.progress=.1;const o=await import(e.workerState.pyodide_url);console.debug("Loading Pyodide instance..."),e.workerState.state.msg="Loading Pyodide instance...",e.workerState.state.progress=.2;const i=o.loadPyodide,a=e.workerState.pyodide_url.split("/").slice(0,-1).join("/");console.log(a),e.workerState.pyodide=await i({packages:["micropip"],indexURL:a}),e.workerState.interruptBuffer&&e.workerState.pyodide.setInterruptBuffer(e.workerState.interruptBuffer)}e.workerState.micropip||(console.debug("Importing micropip..."),e.workerState.state.msg="Importing micropip...",e.workerState.state.progress=.3,e.workerState.micropip=e.workerState.pyodide.pyimport("micropip")),console.debug("Pyodide ready. Installing funcnodes...");for(const o of e.workerState.packages)console.log("Installing package:",o),e.workerState.state.msg=`Installing package: ${o}`,await e.workerState.micropip.install(o);return e.workerState.state.msg="Installing funcnodes",e.workerState.state.progress=.8,await e.workerState.micropip.install("funcnodes"),e.workerState.state.msg="Installing funcnodes-worker",await e.workerState.micropip.install("funcnodes-worker"),e.workerState.state.msg="Installing funcnodes-pyodide",await e.workerState.micropip.install("funcnodes-pyodide"),e.workerState.state.msg="Importing funcnodes",console.debug("Importing funcnodes..."),await e.workerState.pyodide.runPythonAsync("import funcnodes_pyodide"),console.debug("Running post_pyodide_ready..."),await((t=(r=e.workerState).post_pyodide_ready)==null?void 0:t.call(r,e.workerState)),console.debug("Pyodide ready"),e.workerState.state.msg="ready",e.workerState.state.progress=.1,e.workerState.pyodideReady=!0,{pyodide:e.workerState.pyodide,micropip:e.workerState.micropip}},e.interrupt=()=>{e.workerState.interruptBuffer&&(e.workerState.interruptBuffer[0]=1)},e.list_workers=()=>Object.keys(e.workerState.worker),e.get_worker=async r=>{if(!r)throw new Error("Worker id is required");if(!e.workerState.worker[r])throw new Error(`Worker with id ${r} not found`);return await e.workerState.worker[r].make_promise,e.workerState.worker[r]},e.has_worker=r=>{if(!r)throw new Error("Worker id is required");return!!e.workerState.worker[r]},e.get_or_create_worker=async r=>{if(!r)throw new Error("Worker id is required");return e.workerState.worker[r]||(console.log("Creating worker with id",r),await e.initializeFuncNodesWorker(r)),e.get_worker(r)},e.initializeFuncNodesWorker=async r=>{try{if(!e.workerState.pyodideReadyPromise)throw new Error("Pyodide newer initialized");const{pyodide:t}=await e.workerState.pyodideReadyPromise;if(!e.has_worker(r)){e.workerState.worker[r]={worker:null,make_promise:void 0};const o=new Promise(async(i,a)=>{e.workerState.worker[r].reject_promise=a,console.debug(`Creating worker (${r})...`);const s=await t.runPythonAsync(`funcnodes_pyodide.new_worker(debug=${e.workerState.debug?1:0}, uuid="${r}")`);if(console.debug("Worker created:",s),typeof s.set_receiver=="function")s.set_receiver(self);else throw new Error("Worker does not expose a 'set_receiver' method.");e.workerState.worker[r].worker=s,console.debug("Worker ready"),i(s)});e.workerState.worker[r].make_promise=o}return e.get_worker(r)}catch(t){throw console.error("Error during worker initialization:",t),t}},e.receivepy=(r,t)=>{try{let o={};if(typeof r=="string"?o.msg=r:o=r,o.msg===void 0)return;typeof o.msg!="string"&&(o.msg=JSON.stringify(o.msg)),t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error(`Worker id not provided in receivepy(${JSON.stringify(o)})`);if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy(${JSON.stringify(o)})`);e.workerState.receivepy(r,i)}catch(o){console.error("Error during receivepy:",o);return}},e.receivepy_bytes=(r,t)=>{r=r.toJs();try{let o={};if(r instanceof Uint8Array?o.msg=r:o=r,o.msg===void 0)return;t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error("Worker id not provided in receivepy_bytes");if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy_bytes`);e.workerState.receivepy_bytes(r,i)}catch(o){console.error("Error during receivepy_bytes:",o);return}},e.startInitialization=({debug:r=!1,receivepy:t,receivepy_bytes:o,pyodide_url:i,post_pyodide_ready:a,packages:s})=>(e.workerState.debug=r,e.workerState.pyodide_url=i||d,e.workerState.packages=s,e.workerState.receivepy=t,e.workerState.receivepy_bytes=o,e.workerState.pyodideReadyPromise=null,e.workerState.post_pyodide_ready=a,e.workerState),e.register_cmd_message=(r,t)=>{if(e.workerState.handel_register[r])throw new Error(`Command ${r} already registered`);e.workerState.handel_register[r]=t},e.register_cmd_message("ping",async r=>"pong"),e.register_cmd_message("init",async r=>{if(e.workerState.pyodideReadyPromise)throw new Error("Pyodide is already initialized");r.data&&(r.data.pyodide_url&&(e.workerState.pyodide_url=r.data.pyodide_url),r.data.packages&&(e.workerState.packages=r.data.packages),r.data.debug&&(e.workerState.debug=r.data.debug)),e.workerState.pyodideReadyPromise=e.initializePyodide()}),e.register_cmd_message("_eval",async r=>{var t;try{const o=await((t=e.workerState.pyodide)==null?void 0:t.runPythonAsync(r.msg||"print('No code provided')"));return console.log("Eval result:",o),o}catch(o){console.error("Error during _eval:",o)}}),e.register_cmd_message("state",async r=>({state:{...e.workerState.state,loaded:e.workerState.pyodideReady}})),e.register_cmd_message("worker:state",async r=>({state:{loaded:!!(await e.get_or_create_worker(r.worker_id)).worker}})),e.register_cmd_message("worker:stop",async r=>{var o;if(!e.has_worker(r.worker_id))return;const t=await e.get_or_create_worker(r.worker_id);return t.worker&&(t.worker.stop(),t.worker=null,(o=t.reject_promise)==null||o.call(t,"Worker stopped")),delete e.workerState.worker[r.worker_id],{state:{loaded:!1}}}),e.register_cmd_message("worker:send",async r=>{const t=await e.get_or_create_worker(r.worker_id);if(!t.worker)throw new Error("Worker is not initialized");if(typeof t.worker.receivejs!="function")throw new Error(`Worker does not support receivejs: ${typeof t.worker.receivejs}`);t.worker.receivejs(r.msg)}),e.handleMessage=async r=>{const t={original:r};r.id&&(t.id=r.id),r.toJs===void 0&&(r.toJs=!0);try{if(r.cmd){const o=r;if(e.workerState.handel_register[o.cmd])t.result=await e.workerState.handel_register[o.cmd](o);else throw new Error("Unknown command: "+o.cmd)}else throw new Error("Unknown message format: "+JSON.stringify(r))}catch(o){t.error=o.message}return t},e.read_url_params=()=>{var a,s;const r=new URLSearchParams(self.location.search),t=((a=r.get("debug"))==null?void 0:a.toLowerCase())==="true",o=r.get("pyodide_url")||void 0,i=((s=r.get("packages"))==null?void 0:s.split(","))||[];return{debug:t,pyodide_url:o,packages:i}};const n=e;n.general_initalization=r=>{const t=n.read_url_params();n.startInitialization({...r,...t})};const w=n,c=n;c.init_dedicated_worker=r=>{const t=e;t.onmessage=async i=>{const a=i.data,s=await t.handleMessage(a);t.postMessage(s)};const o={...r,receivepy:(i,a)=>{t.postMessage({cmd:"receive",msg:i,worker_id:a})},receivepy_bytes(i,a){t.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})}};t.general_initalization(o)},w.init_shared_worker=r=>{const t=e;t.connectedPorts=[],t.onconnect=i=>{const a=i.ports[0];t.connectedPorts.push(a),a.start(),console.debug("Port connected in shared worker"),a.onmessage=async s=>{const k=s.data,p=await t.handleMessage(k);a.postMessage(p)}};const o={...r,receivepy:(i,a)=>{t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive",msg:i,worker_id:a})})},receivepy_bytes(i,a){t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})})}};t.general_initalization(o)},n.init_shared_worker({})})();