@linkdlab/funcnodes_pyodide_react_flow 2.0.0 → 2.0.1-a0

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.umd.js CHANGED
@@ -1 +1 @@
1
- (function(n,i){typeof exports=="object"&&typeof module<"u"?module.exports=i(require("@linkdlab/funcnodes_react_flow")):typeof define=="function"&&define.amd?define(["@linkdlab/funcnodes_react_flow"],i):(n=typeof globalThis<"u"?globalThis:n||self,n.funcnodes_pyodide_react_flow=i(n.funcnodes_react_flow))})(this,(function(n){"use strict";const i=[];for(let r=0;r<256;++r)i.push((r+256).toString(16).slice(1));function b(r,e=0){return(i[r[e+0]]+i[r[e+1]]+i[r[e+2]]+i[r[e+3]]+"-"+i[r[e+4]]+i[r[e+5]]+"-"+i[r[e+6]]+i[r[e+7]]+"-"+i[r[e+8]]+i[r[e+9]]+"-"+i[r[e+10]]+i[r[e+11]]+i[r[e+12]]+i[r[e+13]]+i[r[e+14]]+i[r[e+15]]).toLowerCase()}let p;const v=new Uint8Array(16);function P(){if(!p){if(typeof crypto>"u"||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");p=crypto.getRandomValues.bind(crypto)}return p(v)}const y={randomUUID:typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};function E(r,e,t){r=r||{};const o=r.random??r.rng?.()??P();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 R(r,e,t){return y.randomUUID&&!r?y.randomUUID():E(r)}const _='(function(){"use strict";const w="https://cdn.jsdelivr.net/pyodide/v0.29.0/full/pyodide.mjs",e=self;e.workerState={pyodide:null,pyodide_url:w,packages:[],state:{msg:"loading",loaded:!1,progress:0},micropip:null,worker:{},pyodideReady:!1,pyodideReadyPromise:null,debug:!1,interruptBuffer:null,receivepy:(r,t)=>{},receivepy_bytes:(r,t)=>{},handel_register:{},post_pyodide_ready:void 0},e.reset=async()=>{for(const r in e.list_workers())try{const t=await e.get_worker(r);t.worker&&t.worker.stop(),t.reject_promise?.("Worker reset")}catch{}e.workerState.pyodide&&e.interrupt(),e.workerState.pyodide=null,e.workerState.micropip=null,e.workerState.worker={},e.workerState.pyodideReady=!1;try{e.workerState.interruptBuffer=new Uint8Array(new SharedArrayBuffer(1)),e.workerState.interruptBuffer[0]=0}catch{}},e.initializePyodide=async()=>{if(!e.workerState.pyodide){console.log("initializePyodide with: Debug:",e.workerState.debug,"Pyodide URL:",e.workerState.pyodide_url,"Packages:",e.workerState.packages),console.debug("Loading Pyodide..."),e.workerState.state.msg="Loading Pyodide...",e.workerState.state.progress=0,await e.reset(),console.debug("Loading Pyodide module..."),e.workerState.state.msg="Loading Pyodide module...",e.workerState.state.progress=.1;const t=await import(e.workerState.pyodide_url);console.debug("Loading Pyodide instance..."),e.workerState.state.msg="Loading Pyodide instance...",e.workerState.state.progress=.2;const o=t.loadPyodide,a=new URL(e.workerState.pyodide_url),i=new URL(".",a).toString();e.workerState.debug&&console.debug("Pyodide indexURL:",i),e.workerState.pyodide=await o({packages:["micropip"],indexURL:i}),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 t of e.workerState.packages)console.log("Installing package:",t),e.workerState.state.msg=`Installing package: ${t}`,await e.workerState.micropip.install(t);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.packages.some(t=>t.toLowerCase().endsWith(".whl")&&t.includes("funcnodes_pyodide"))?e.workerState.debug&&console.debug("Skipping PyPI funcnodes-pyodide install (wheel provided in packages)"):(e.workerState.state.msg="Installing funcnodes-pyodide",await e.workerState.micropip.install("funcnodes-pyodide")),e.workerState.state.msg="Installing funcnodes-react-flow",await e.workerState.micropip.install("funcnodes-react-flow"),e.workerState.state.msg="Importing funcnodes",console.debug("Importing funcnodes..."),await e.workerState.pyodide.runPythonAsync("import funcnodes_pyodide"),console.debug("Running post_pyodide_ready..."),await e.workerState.post_pyodide_ready?.(e.workerState),console.debug("Pyodide ready"),e.workerState.state.msg="ready",e.workerState.state.progress=.1,e.workerState.pyodideReady=!0,{pyodide:e.workerState.pyodide,micropip:e.workerState.micropip}},e.interrupt=()=>{e.workerState.interruptBuffer&&(e.workerState.interruptBuffer[0]=1)},e.list_workers=()=>Object.keys(e.workerState.worker),e.get_worker=async r=>{if(!r)throw new Error("Worker id is required");if(!e.workerState.worker[r])throw new Error(`Worker with id ${r} not found`);return await e.workerState.worker[r].make_promise,e.workerState.worker[r]},e.has_worker=r=>{if(!r)throw new Error("Worker id is required");return!!e.workerState.worker[r]},e.get_or_create_worker=async r=>{if(!r)throw new Error("Worker id is required");return e.workerState.worker[r]||(console.log("Creating worker with id",r),await e.initializeFuncNodesWorker(r)),e.get_worker(r)},e.initializeFuncNodesWorker=async r=>{try{if(!e.workerState.pyodideReadyPromise)throw new Error("Pyodide newer initialized");const{pyodide:t}=await e.workerState.pyodideReadyPromise;if(!e.has_worker(r)){e.workerState.worker[r]={worker:null,make_promise:void 0};const o=new Promise(async(a,i)=>{e.workerState.worker[r].reject_promise=i,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"),a(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 a=o.worker_id;if(!a)throw new Error(`Worker id not provided in receivepy(${JSON.stringify(o)})`);if(!e.workerState.worker[a])throw new Error(`Worker with id ${a} not found in receivepy(${JSON.stringify(o)})`);e.workerState.receivepy(r,a)}catch(o){console.error("Error during receivepy:",o);return}},e.receivepy_bytes=(r,t)=>{let o=r;const a=r;if(a&&typeof a.toJs=="function")try{o=a.toJs({dict_converter:Object.fromEntries})}catch{o=a.toJs()}o instanceof Map&&(o=Object.fromEntries(o.entries()));try{let i={};if(o instanceof Uint8Array?i.msg=o:i=o,i.msg===void 0)return;let s=i.msg;const d=s;if(d&&typeof d.toJs=="function")try{s=d.toJs({dict_converter:Object.fromEntries})}catch{s=d.toJs()}if(s instanceof ArrayBuffer&&(s=new Uint8Array(s)),Array.isArray(s)&&(s=Uint8Array.from(s)),!(s instanceof Uint8Array))throw new Error(`receivepy_bytes expected Uint8Array payload, got ${typeof s}`);i.msg=s,t!==void 0&&(typeof t=="string"?i.worker_id||(i.worker_id=t):i={...t,...i});const c=i.worker_id;if(!c)throw new Error("Worker id not provided in receivepy_bytes");if(!e.workerState.worker[c])throw new Error(`Worker with id ${c} not found in receivepy_bytes`);e.workerState.receivepy_bytes(i.msg,c)}catch(i){console.error("Error during receivepy_bytes:",i);return}},e.startInitialization=({debug:r=!1,receivepy:t,receivepy_bytes:o,pyodide_url:a,post_pyodide_ready:i,packages:s})=>(e.workerState.debug=r,e.workerState.pyodide_url=a||w,e.workerState.packages=s,e.workerState.receivepy=t,e.workerState.receivepy_bytes=o,e.workerState.pyodideReadyPromise=null,e.workerState.post_pyodide_ready=i,e.workerState),e.register_cmd_message=(r,t)=>{if(e.workerState.handel_register[r])throw new Error(`Command ${r} already registered`);e.workerState.handel_register[r]=t},e.register_cmd_message("ping",async r=>"pong"),e.register_cmd_message("init",async r=>{if(e.workerState.pyodideReadyPromise)throw new Error("Pyodide is already initialized");r.data&&(r.data.pyodide_url&&(e.workerState.pyodide_url=r.data.pyodide_url),r.data.packages&&(e.workerState.packages=r.data.packages),r.data.debug&&(e.workerState.debug=r.data.debug)),e.workerState.pyodideReadyPromise=e.initializePyodide()}),e.register_cmd_message("_eval",async r=>{try{const t=await e.workerState.pyodide?.runPythonAsync(r.msg||"print(\'No code provided\')");return console.log("Eval result:",t),t}catch(t){console.error("Error during _eval:",t)}}),e.register_cmd_message("state",async r=>({state:{...e.workerState.state,loaded:e.workerState.pyodideReady}})),e.register_cmd_message("worker:state",async r=>({state:{loaded:!!(await e.get_or_create_worker(r.worker_id)).worker}})),e.register_cmd_message("worker:stop",async r=>{if(!e.has_worker(r.worker_id))return;const t=await e.get_or_create_worker(r.worker_id);return t.worker&&(t.worker.stop(),t.worker=null,t.reject_promise?.("Worker stopped")),delete e.workerState.worker[r.worker_id],{state:{loaded:!1}}}),e.register_cmd_message("worker:send",async r=>{const t=await e.get_or_create_worker(r.worker_id);if(!t.worker)throw new Error("Worker is not initialized");if(typeof t.worker.receivejs!="function")throw new Error(`Worker does not support receivejs: ${typeof t.worker.receivejs}`);t.worker.receivejs(r.msg)}),e.handleMessage=async r=>{const t={original:r};r.id&&(t.id=r.id),r.toJs===void 0&&(r.toJs=!0);try{if(r.cmd){const o=r;if(e.workerState.handel_register[o.cmd])t.result=await e.workerState.handel_register[o.cmd](o);else throw new Error("Unknown command: "+o.cmd)}else throw new Error("Unknown message format: "+JSON.stringify(r))}catch(o){t.error=o.message}return t},e.read_url_params=()=>{const r=new URLSearchParams(self.location.search),t=r.get("debug")?.toLowerCase()==="true",o=r.get("pyodide_url")||void 0,a=r.get("packages")?.split(",")||[];return{debug:t,pyodide_url:o,packages:a}};const n=e;n.general_initalization=r=>{const t=n.read_url_params();n.startInitialization({...r,...t})};const k=n,p=n;p.init_dedicated_worker=r=>{const t=e;t.onmessage=async a=>{const i=a.data,s=await t.handleMessage(i);t.postMessage(s)};const o={...r,receivepy:(a,i)=>{t.postMessage({cmd:"receive",msg:a,worker_id:i})},receivepy_bytes(a,i){t.postMessage({cmd:"receive_bytes",msg:a,worker_id:i})}};t.general_initalization(o)},k.init_shared_worker=r=>{const t=e;t.connectedPorts=[],t.onconnect=a=>{const i=a.ports[0];t.connectedPorts.push(i),i.start(),console.debug("Port connected in shared worker"),i.onmessage=async s=>{const d=s.data,c=await t.handleMessage(d);i.postMessage(c)}};const o={...r,receivepy:(a,i)=>{t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive",msg:a,worker_id:i})})},receivepy_bytes(a,i){t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive_bytes",msg:a,worker_id:i})})}};t.general_initalization(o)},(r=>{n.init_dedicated_worker(r)})({})})();\n',m=typeof self<"u"&&self.Blob&&new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);",_],{type:"text/javascript;charset=utf-8"});function U(r){let e;try{if(e=m&&(self.URL||self.webkitURL).createObjectURL(m),!e)throw"";const t=new Worker(e,{name:r?.name});return t.addEventListener("error",()=>{(self.URL||self.webkitURL).revokeObjectURL(e)}),t}catch{return new Worker("data:text/javascript;charset=utf-8,"+encodeURIComponent(_),{name:r?.name})}}const W='(function(){"use strict";const w="https://cdn.jsdelivr.net/pyodide/v0.29.0/full/pyodide.mjs",e=self;e.workerState={pyodide:null,pyodide_url:w,packages:[],state:{msg:"loading",loaded:!1,progress:0},micropip:null,worker:{},pyodideReady:!1,pyodideReadyPromise:null,debug:!1,interruptBuffer:null,receivepy:(r,t)=>{},receivepy_bytes:(r,t)=>{},handel_register:{},post_pyodide_ready:void 0},e.reset=async()=>{for(const r in e.list_workers())try{const t=await e.get_worker(r);t.worker&&t.worker.stop(),t.reject_promise?.("Worker reset")}catch{}e.workerState.pyodide&&e.interrupt(),e.workerState.pyodide=null,e.workerState.micropip=null,e.workerState.worker={},e.workerState.pyodideReady=!1;try{e.workerState.interruptBuffer=new Uint8Array(new SharedArrayBuffer(1)),e.workerState.interruptBuffer[0]=0}catch{}},e.initializePyodide=async()=>{if(!e.workerState.pyodide){console.log("initializePyodide with: Debug:",e.workerState.debug,"Pyodide URL:",e.workerState.pyodide_url,"Packages:",e.workerState.packages),console.debug("Loading Pyodide..."),e.workerState.state.msg="Loading Pyodide...",e.workerState.state.progress=0,await e.reset(),console.debug("Loading Pyodide module..."),e.workerState.state.msg="Loading Pyodide module...",e.workerState.state.progress=.1;const t=await import(e.workerState.pyodide_url);console.debug("Loading Pyodide instance..."),e.workerState.state.msg="Loading Pyodide instance...",e.workerState.state.progress=.2;const o=t.loadPyodide,a=new URL(e.workerState.pyodide_url),i=new URL(".",a).toString();e.workerState.debug&&console.debug("Pyodide indexURL:",i),e.workerState.pyodide=await o({packages:["micropip"],indexURL:i}),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 t of e.workerState.packages)console.log("Installing package:",t),e.workerState.state.msg=`Installing package: ${t}`,await e.workerState.micropip.install(t);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.packages.some(t=>t.toLowerCase().endsWith(".whl")&&t.includes("funcnodes_pyodide"))?e.workerState.debug&&console.debug("Skipping PyPI funcnodes-pyodide install (wheel provided in packages)"):(e.workerState.state.msg="Installing funcnodes-pyodide",await e.workerState.micropip.install("funcnodes-pyodide")),e.workerState.state.msg="Installing funcnodes-react-flow",await e.workerState.micropip.install("funcnodes-react-flow"),e.workerState.state.msg="Importing funcnodes",console.debug("Importing funcnodes..."),await e.workerState.pyodide.runPythonAsync("import funcnodes_pyodide"),console.debug("Running post_pyodide_ready..."),await e.workerState.post_pyodide_ready?.(e.workerState),console.debug("Pyodide ready"),e.workerState.state.msg="ready",e.workerState.state.progress=.1,e.workerState.pyodideReady=!0,{pyodide:e.workerState.pyodide,micropip:e.workerState.micropip}},e.interrupt=()=>{e.workerState.interruptBuffer&&(e.workerState.interruptBuffer[0]=1)},e.list_workers=()=>Object.keys(e.workerState.worker),e.get_worker=async r=>{if(!r)throw new Error("Worker id is required");if(!e.workerState.worker[r])throw new Error(`Worker with id ${r} not found`);return await e.workerState.worker[r].make_promise,e.workerState.worker[r]},e.has_worker=r=>{if(!r)throw new Error("Worker id is required");return!!e.workerState.worker[r]},e.get_or_create_worker=async r=>{if(!r)throw new Error("Worker id is required");return e.workerState.worker[r]||(console.log("Creating worker with id",r),await e.initializeFuncNodesWorker(r)),e.get_worker(r)},e.initializeFuncNodesWorker=async r=>{try{if(!e.workerState.pyodideReadyPromise)throw new Error("Pyodide newer initialized");const{pyodide:t}=await e.workerState.pyodideReadyPromise;if(!e.has_worker(r)){e.workerState.worker[r]={worker:null,make_promise:void 0};const o=new Promise(async(a,i)=>{e.workerState.worker[r].reject_promise=i,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"),a(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 a=o.worker_id;if(!a)throw new Error(`Worker id not provided in receivepy(${JSON.stringify(o)})`);if(!e.workerState.worker[a])throw new Error(`Worker with id ${a} not found in receivepy(${JSON.stringify(o)})`);e.workerState.receivepy(r,a)}catch(o){console.error("Error during receivepy:",o);return}},e.receivepy_bytes=(r,t)=>{let o=r;const a=r;if(a&&typeof a.toJs=="function")try{o=a.toJs({dict_converter:Object.fromEntries})}catch{o=a.toJs()}o instanceof Map&&(o=Object.fromEntries(o.entries()));try{let i={};if(o instanceof Uint8Array?i.msg=o:i=o,i.msg===void 0)return;let s=i.msg;const d=s;if(d&&typeof d.toJs=="function")try{s=d.toJs({dict_converter:Object.fromEntries})}catch{s=d.toJs()}if(s instanceof ArrayBuffer&&(s=new Uint8Array(s)),Array.isArray(s)&&(s=Uint8Array.from(s)),!(s instanceof Uint8Array))throw new Error(`receivepy_bytes expected Uint8Array payload, got ${typeof s}`);i.msg=s,t!==void 0&&(typeof t=="string"?i.worker_id||(i.worker_id=t):i={...t,...i});const c=i.worker_id;if(!c)throw new Error("Worker id not provided in receivepy_bytes");if(!e.workerState.worker[c])throw new Error(`Worker with id ${c} not found in receivepy_bytes`);e.workerState.receivepy_bytes(i.msg,c)}catch(i){console.error("Error during receivepy_bytes:",i);return}},e.startInitialization=({debug:r=!1,receivepy:t,receivepy_bytes:o,pyodide_url:a,post_pyodide_ready:i,packages:s})=>(e.workerState.debug=r,e.workerState.pyodide_url=a||w,e.workerState.packages=s,e.workerState.receivepy=t,e.workerState.receivepy_bytes=o,e.workerState.pyodideReadyPromise=null,e.workerState.post_pyodide_ready=i,e.workerState),e.register_cmd_message=(r,t)=>{if(e.workerState.handel_register[r])throw new Error(`Command ${r} already registered`);e.workerState.handel_register[r]=t},e.register_cmd_message("ping",async r=>"pong"),e.register_cmd_message("init",async r=>{if(e.workerState.pyodideReadyPromise)throw new Error("Pyodide is already initialized");r.data&&(r.data.pyodide_url&&(e.workerState.pyodide_url=r.data.pyodide_url),r.data.packages&&(e.workerState.packages=r.data.packages),r.data.debug&&(e.workerState.debug=r.data.debug)),e.workerState.pyodideReadyPromise=e.initializePyodide()}),e.register_cmd_message("_eval",async r=>{try{const t=await e.workerState.pyodide?.runPythonAsync(r.msg||"print(\'No code provided\')");return console.log("Eval result:",t),t}catch(t){console.error("Error during _eval:",t)}}),e.register_cmd_message("state",async r=>({state:{...e.workerState.state,loaded:e.workerState.pyodideReady}})),e.register_cmd_message("worker:state",async r=>({state:{loaded:!!(await e.get_or_create_worker(r.worker_id)).worker}})),e.register_cmd_message("worker:stop",async r=>{if(!e.has_worker(r.worker_id))return;const t=await e.get_or_create_worker(r.worker_id);return t.worker&&(t.worker.stop(),t.worker=null,t.reject_promise?.("Worker stopped")),delete e.workerState.worker[r.worker_id],{state:{loaded:!1}}}),e.register_cmd_message("worker:send",async r=>{const t=await e.get_or_create_worker(r.worker_id);if(!t.worker)throw new Error("Worker is not initialized");if(typeof t.worker.receivejs!="function")throw new Error(`Worker does not support receivejs: ${typeof t.worker.receivejs}`);t.worker.receivejs(r.msg)}),e.handleMessage=async r=>{const t={original:r};r.id&&(t.id=r.id),r.toJs===void 0&&(r.toJs=!0);try{if(r.cmd){const o=r;if(e.workerState.handel_register[o.cmd])t.result=await e.workerState.handel_register[o.cmd](o);else throw new Error("Unknown command: "+o.cmd)}else throw new Error("Unknown message format: "+JSON.stringify(r))}catch(o){t.error=o.message}return t},e.read_url_params=()=>{const r=new URLSearchParams(self.location.search),t=r.get("debug")?.toLowerCase()==="true",o=r.get("pyodide_url")||void 0,a=r.get("packages")?.split(",")||[];return{debug:t,pyodide_url:o,packages:a}};const n=e;n.general_initalization=r=>{const t=n.read_url_params();n.startInitialization({...r,...t})};const k=n,p=n;p.init_dedicated_worker=r=>{const t=e;t.onmessage=async a=>{const i=a.data,s=await t.handleMessage(i);t.postMessage(s)};const o={...r,receivepy:(a,i)=>{t.postMessage({cmd:"receive",msg:a,worker_id:i})},receivepy_bytes(a,i){t.postMessage({cmd:"receive_bytes",msg:a,worker_id:i})}};t.general_initalization(o)},k.init_shared_worker=r=>{const t=e;t.connectedPorts=[],t.onconnect=a=>{const i=a.ports[0];t.connectedPorts.push(i),i.start(),console.debug("Port connected in shared worker"),i.onmessage=async s=>{const d=s.data,c=await t.handleMessage(d);i.postMessage(c)}};const o={...r,receivepy:(a,i)=>{t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive",msg:a,worker_id:i})})},receivepy_bytes(a,i){t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive_bytes",msg:a,worker_id:i})})}};t.general_initalization(o)},(r=>{n.init_shared_worker(r)})({})})();\n';function L(r){return new SharedWorker("data:text/javascript;charset=utf-8,"+encodeURIComponent(W),{name:r?.name})}const I=(r,e)=>{if(!r?.length)return r;const t=e??(typeof window<"u"&&window.location?window.location.href:void 0);return t?r.map(o=>/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(o)?o:o.startsWith("/")||o.startsWith("./")||o.startsWith("../")?new URL(o,t).toString():o):r},j=r=>(r.worker||(r.worker_classes||(r.worker_classes={Shared:L,Dedicated:U}),r.shared_worker?r.worker_url===void 0?r.worker=new r.worker_classes.Shared({name:r.uuid}):r.worker=new SharedWorker(r.worker_url,{name:r.uuid,type:"module"}):r.worker_url===void 0?r.worker=new r.worker_classes.Dedicated({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:R(),...e};if(super(t),this._message_hooks=[],this._worker=j(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:I(t.packages,t.worker_baseurl)}});const o=setInterval(()=>{this.postMessage({cmd:"state"})},400);this._workerstate={loaded:!1,msg:"loading",progress:0},this.initPromise=new Promise(async s=>{for(;!this._workerstate.loaded;)this._zustand?.set_progress({message:this._workerstate.msg,status:"info",progress:this._workerstate.progress,blocking:!0}),await new Promise(g=>setTimeout(g,100));clearInterval(o),this.is_open=!0,this._zustand?.auto_progress(),s()}),this.initPromise.then(async()=>{if(t.restore_worker_state_on_load){const s=typeof t.restore_worker_state_on_load=="string"?t.restore_worker_state_on_load:this._storage_key();await this.restore_worker_state(s)}await this.getSyncManager().stepwise_fullsync(),t.post_worker_initialized&&await t.post_worker_initialized(this)})}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){for(const t of this._message_hooks)t(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"&&this._zustand?.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.getCommunicationManager().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.getCommunicationManager().onbytes(e.data.msg)}}}async upload_file({files:e,onProgressCallback:t,root:o}){const s=[],g=e.length;let f=0;if(e.length===0)return"";for(let c=0;c<e.length;c++){const w=e[c],d=new FileReader,l=new Promise((k,a)=>{d.onload=async A=>{try{const u=A.target.result?.replace(/^data:.+;base64,/,""),S=w.webkitRelativePath||w.name,M=o?`${o}/${S}`:S,$=await this._send_cmd({cmd:"upload",kwargs:{data:u,filename:M},wait_for_response:!0});f++,t&&t(f,g),k($)}catch(u){a(u)}},d.readAsDataURL(w)});s.push(l)}const h=await Promise.all(s);return h.reduce((c,w)=>{const d=w.split("/"),l=c.split("/"),k=[];for(let a=0;a<d.length&&d[a]===l[a];a++)k.push(d[a]);return k.join("/")},h[0])}get ready(){return this._workerstate.loaded}_storage_key(){return`funcnodes_pyodide:worker_export:${this.uuid}`}_has_local_storage(){try{return typeof globalThis<"u"&&"localStorage"in globalThis}catch{return!1}}async save_worker_state({withFiles:e=!0}={}){const t=await this.export({withFiles:e}),o=typeof t=="string"?t:t?.data;if(typeof o!="string")throw new Error("export_worker did not return a string export");return this._has_local_storage()&&globalThis.localStorage.setItem(this._storage_key(),o),o}async restore_worker_state(e){if(!this._has_local_storage())return!1;const t=globalThis.localStorage.getItem(e||this._storage_key());if(!t)return!1;try{return await this.update_from_export(t),!0}catch(o){return console.warn("Failed to restore worker state from storage",o),!1}}}return z}));
1
+ (function(d,i){typeof exports=="object"&&typeof module<"u"?module.exports=i(require("@linkdlab/funcnodes_react_flow")):typeof define=="function"&&define.amd?define(["@linkdlab/funcnodes_react_flow"],i):(d=typeof globalThis<"u"?globalThis:d||self,d.funcnodes_pyodide_react_flow=i(d.funcnodes_react_flow))})(this,(function(d){"use strict";var i=typeof document<"u"?document.currentScript:null;const s=[];for(let r=0;r<256;++r)s.push((r+256).toString(16).slice(1));function L(r,e=0){return(s[r[e+0]]+s[r[e+1]]+s[r[e+2]]+s[r[e+3]]+"-"+s[r[e+4]]+s[r[e+5]]+"-"+s[r[e+6]]+s[r[e+7]]+"-"+s[r[e+8]]+s[r[e+9]]+"-"+s[r[e+10]]+s[r[e+11]]+s[r[e+12]]+s[r[e+13]]+s[r[e+14]]+s[r[e+15]]).toLowerCase()}let k;const E=new Uint8Array(16);function I(){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(E)}const _={randomUUID:typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};function j(r,e,t){r=r||{};const o=r.random??r.rng?.()??I();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,L(o)}function z(r,e,t){return _.randomUUID&&!r?_.randomUUID():j(r)}const f=r=>!!r&&typeof r=="object"&&"port"in r&&!!r.port,m=r=>!!r&&typeof r=="object"&&typeof r.postMessage=="function"&&typeof r.addEventListener=="function"&&!("port"in r);class M{constructor(e,t={}){if(this._disposed=!1,this._intervals=[],this._worker=e,this._worker_id=t.worker_id,t.onMessage)if(this._onmessage_bound=t.onMessage,f(e))this._port=e.port,this._port.start(),this._port.addEventListener("message",this._onmessage_bound);else if(m(e))e.addEventListener("message",this._onmessage_bound);else throw new Error("worker must be a DedicatedWorkerLike or SharedWorkerLike");else if(f(e))this._port=e.port,this._port.start();else if(!m(e))throw new Error("worker must be a DedicatedWorkerLike or SharedWorkerLike")}get disposed(){return this._disposed}get shared(){return!!this._port}_decorate(e){return this._worker_id===void 0?e:{...e,worker_id:this._worker_id}}postMessage(e){this._disposed||this._postRaw(e)}_postRaw(e){const t=this._decorate(e);this._port?this._port.postMessage(t):this._worker.postMessage(t)}startStatePolling({intervalMs:e=400}={}){if(this._disposed)return;const t=setInterval(()=>{this.postMessage({cmd:"state"})},e);this._intervals.push(t)}stopPolling(){for(const e of this._intervals)clearInterval(e);this._intervals=[]}dispose(){if(!this._disposed){if(this._port)try{this._postRaw({cmd:"disconnect"})}catch{}this._disposed=!0,this.stopPolling();try{this._port&&this._onmessage_bound?this._port.removeEventListener("message",this._onmessage_bound):this._onmessage_bound&&this._worker.removeEventListener?.("message",this._onmessage_bound)}catch{}if(this._port){try{this._port.close()}catch{}this._port=void 0}else try{this._worker.terminate?.()}catch{}}}}const x=({pageOrigin:r,scriptUrl:e})=>{if(!r||!e)return!1;try{return new URL(e).origin!==r}catch{return!1}},C=()=>typeof URL<"u"&&typeof URL.createObjectURL=="function"&&typeof URL.revokeObjectURL=="function"&&typeof Blob<"u",B=r=>{if(!C())return;const e=`await import(${JSON.stringify(r)});`,t=new Blob([e],{type:"text/javascript"});return URL.createObjectURL(t)},l=(r,e)=>{try{return r(e)}catch(t){const o=B(e);if(!o)throw t;try{return r(o)}finally{try{URL.revokeObjectURL(o)}catch{}}}},h=r=>{if(r.worker)return r.worker;const e=r.uuid;if(!!r.shared_worker){if(r.worker_url===void 0){if(r.worker_classes?.Shared)return new r.worker_classes.Shared({name:e});if(typeof SharedWorker>"u")throw new Error("SharedWorker is not available; provide worker, worker_url or worker_classes.Shared");try{return new SharedWorker(new URL("/assets/pyodideSharedWorker-B8dBCO6o.js",typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:i&&i.tagName.toUpperCase()==="SCRIPT"&&i.src||new URL("index.umd.js",document.baseURI).href),{name:e,type:"module"})}catch{return l(a=>new SharedWorker(a,{name:e,type:"module"}),new URL("data:video/mp2t;base64,aW1wb3J0IHsgaW5pdFNoYXJlZFdvcmtlciB9IGZyb20gIi4vcHlvZGlkZVdlYldvcmtlci5tanMiOwppbml0U2hhcmVkV29ya2VyKHt9KTsK",typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:i&&i.tagName.toUpperCase()==="SCRIPT"&&i.src||new URL("index.umd.js",document.baseURI).href).href)}}if(r.worker_classes?.Shared,typeof SharedWorker>"u")throw new Error("SharedWorker is not available; provide worker or set shared_worker=false");return l(o=>new SharedWorker(o,{name:e,type:"module"}),r.worker_url)}if(r.worker_url===void 0){if(r.worker_classes?.Dedicated)return new r.worker_classes.Dedicated({name:e});if(typeof Worker>"u")throw new Error("Worker is not available; provide worker, worker_url or worker_classes.Dedicated");try{return new Worker(new URL("/assets/pyodideDedicatedWorker-Bge9R9PO.js",typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:i&&i.tagName.toUpperCase()==="SCRIPT"&&i.src||new URL("index.umd.js",document.baseURI).href),{name:e,type:"module"})}catch{return l(a=>new Worker(a,{name:e,type:"module"}),new URL("data:video/mp2t;base64,aW1wb3J0IHsgaW5pdERlZGljYXRlZFdvcmtlciB9IGZyb20gIi4vcHlvZGlkZVdlYldvcmtlci5tanMiOwppbml0RGVkaWNhdGVkV29ya2VyKHt9KTsK",typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:i&&i.tagName.toUpperCase()==="SCRIPT"&&i.src||new URL("index.umd.js",document.baseURI).href).href)}}if(typeof Worker>"u")throw new Error("Worker is not available; provide worker or set shared_worker=true");return l(o=>new Worker(o,{name:e,type:"module"}),r.worker_url)},S='(function(){"use strict";const w="https://cdn.jsdelivr.net/pyodide/v0.29.0/full/pyodide.mjs",e=self;e.workerState={pyodide:null,pyodide_url:w,packages:[],state:{msg:"loading",loaded:!1,progress:0},micropip:null,worker:{},pyodideReady:!1,pyodideReadyPromise:null,debug:!1,interruptBuffer:null,receivepy:(r,t)=>{},receivepy_bytes:(r,t)=>{},handel_register:{},post_pyodide_ready:void 0},e.reset=async()=>{for(const r in e.list_workers())try{const t=await e.get_worker(r);t.worker&&t.worker.stop(),t.reject_promise?.("Worker reset")}catch{}e.workerState.pyodide&&e.interrupt(),e.workerState.pyodide=null,e.workerState.micropip=null,e.workerState.worker={},e.workerState.pyodideReady=!1;try{e.workerState.interruptBuffer=new Uint8Array(new SharedArrayBuffer(1)),e.workerState.interruptBuffer[0]=0}catch{}},e.initializePyodide=async()=>{if(!e.workerState.pyodide){console.log("initializePyodide with: Debug:",e.workerState.debug,"Pyodide URL:",e.workerState.pyodide_url,"Packages:",e.workerState.packages),console.debug("Loading Pyodide..."),e.workerState.state.msg="Loading Pyodide...",e.workerState.state.progress=0,await e.reset(),console.debug("Loading Pyodide module..."),e.workerState.state.msg="Loading Pyodide module...",e.workerState.state.progress=.1;const t=await import(e.workerState.pyodide_url);console.debug("Loading Pyodide instance..."),e.workerState.state.msg="Loading Pyodide instance...",e.workerState.state.progress=.2;const o=t.loadPyodide,s=new URL(e.workerState.pyodide_url),a=new URL(".",s).toString();e.workerState.debug&&console.debug("Pyodide indexURL:",a),e.workerState.pyodide=await o({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 t of e.workerState.packages)console.log("Installing package:",t),e.workerState.state.msg=`Installing package: ${t}`,await e.workerState.micropip.install(t);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.packages.some(t=>t.toLowerCase().endsWith(".whl")&&t.includes("funcnodes_pyodide"))?e.workerState.debug&&console.debug("Skipping PyPI funcnodes-pyodide install (wheel provided in packages)"):(e.workerState.state.msg="Installing funcnodes-pyodide",await e.workerState.micropip.install("funcnodes-pyodide")),e.workerState.state.msg="Installing funcnodes-react-flow",await e.workerState.micropip.install("funcnodes-react-flow"),e.workerState.state.msg="Importing funcnodes",console.debug("Importing funcnodes..."),await e.workerState.pyodide.runPythonAsync("import funcnodes_pyodide"),console.debug("Running post_pyodide_ready..."),await e.workerState.post_pyodide_ready?.(e.workerState),console.debug("Pyodide ready"),e.workerState.state.msg="ready",e.workerState.state.progress=.1,e.workerState.pyodideReady=!0,{pyodide:e.workerState.pyodide,micropip:e.workerState.micropip}},e.interrupt=()=>{e.workerState.interruptBuffer&&(e.workerState.interruptBuffer[0]=1)},e.list_workers=()=>Object.keys(e.workerState.worker),e.get_worker=async r=>{if(!r)throw new Error("Worker id is required");if(!e.workerState.worker[r])throw new Error(`Worker with id ${r} not found`);return await e.workerState.worker[r].make_promise,e.workerState.worker[r]},e.has_worker=r=>{if(!r)throw new Error("Worker id is required");return!!e.workerState.worker[r]},e.get_or_create_worker=async r=>{if(!r)throw new Error("Worker id is required");return e.workerState.worker[r]||(console.log("Creating worker with id",r),await e.initializeFuncNodesWorker(r)),e.get_worker(r)},e.initializeFuncNodesWorker=async r=>{try{if(!e.workerState.pyodideReadyPromise)throw new Error("Pyodide newer initialized");const{pyodide:t}=await e.workerState.pyodideReadyPromise;if(!e.has_worker(r)){e.workerState.worker[r]={worker:null,make_promise:void 0};const o=new Promise(async(s,a)=>{e.workerState.worker[r].reject_promise=a,console.debug(`Creating worker (${r})...`);const i=await t.runPythonAsync(`funcnodes_pyodide.new_worker(debug=${e.workerState.debug?1:0}, uuid="${r}")`);if(console.debug("Worker created:",i),typeof i.set_receiver=="function")i.set_receiver(self);else throw new Error("Worker does not expose a \'set_receiver\' method.");e.workerState.worker[r].worker=i,console.debug("Worker ready"),s(i)});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 s=o.worker_id;if(!s)throw new Error(`Worker id not provided in receivepy(${JSON.stringify(o)})`);if(!e.workerState.worker[s])throw new Error(`Worker with id ${s} not found in receivepy(${JSON.stringify(o)})`);e.workerState.receivepy(r,s)}catch(o){console.error("Error during receivepy:",o);return}},e.receivepy_bytes=(r,t)=>{let o=r;const s=r;if(s&&typeof s.toJs=="function")try{o=s.toJs({dict_converter:Object.fromEntries})}catch{o=s.toJs()}o instanceof Map&&(o=Object.fromEntries(o.entries()));try{let a={};if(o instanceof Uint8Array?a.msg=o:a=o,a.msg===void 0)return;let i=a.msg;const n=i;if(n&&typeof n.toJs=="function")try{i=n.toJs({dict_converter:Object.fromEntries})}catch{i=n.toJs()}if(i instanceof ArrayBuffer&&(i=new Uint8Array(i)),Array.isArray(i)&&(i=Uint8Array.from(i)),!(i instanceof Uint8Array))throw new Error(`receivepy_bytes expected Uint8Array payload, got ${typeof i}`);a.msg=i,t!==void 0&&(typeof t=="string"?a.worker_id||(a.worker_id=t):a={...t,...a});const d=a.worker_id;if(!d)throw new Error("Worker id not provided in receivepy_bytes");if(!e.workerState.worker[d])throw new Error(`Worker with id ${d} not found in receivepy_bytes`);e.workerState.receivepy_bytes(a.msg,d)}catch(a){console.error("Error during receivepy_bytes:",a);return}},e.startInitialization=({debug:r=!1,receivepy:t,receivepy_bytes:o,pyodide_url:s,post_pyodide_ready:a,packages:i})=>(e.workerState.debug=r,e.workerState.pyodide_url=s||w,e.workerState.packages=i,e.workerState.receivepy=t,e.workerState.receivepy_bytes=o,e.workerState.pyodideReadyPromise=null,e.workerState.post_pyodide_ready=a,e.workerState),e.register_cmd_message=(r,t)=>{if(e.workerState.handel_register[r])throw new Error(`Command ${r} already registered`);e.workerState.handel_register[r]=t},e.register_cmd_message("ping",async r=>"pong"),e.register_cmd_message("init",async r=>{if(e.workerState.pyodideReadyPromise)throw new Error("Pyodide is already initialized");r.data&&(r.data.pyodide_url&&(e.workerState.pyodide_url=r.data.pyodide_url),r.data.packages&&(e.workerState.packages=r.data.packages),r.data.debug&&(e.workerState.debug=r.data.debug)),e.workerState.pyodideReadyPromise=e.initializePyodide()}),e.register_cmd_message("_eval",async r=>{try{const t=await e.workerState.pyodide?.runPythonAsync(r.msg||"print(\'No code provided\')");return console.log("Eval result:",t),t}catch(t){console.error("Error during _eval:",t)}}),e.register_cmd_message("state",async r=>({state:{...e.workerState.state,loaded:e.workerState.pyodideReady}})),e.register_cmd_message("worker:state",async r=>({state:{loaded:!!(await e.get_or_create_worker(r.worker_id)).worker}})),e.register_cmd_message("worker:stop",async r=>{if(!e.has_worker(r.worker_id))return;const t=await e.get_or_create_worker(r.worker_id);return t.worker&&(t.worker.stop(),t.worker=null,t.reject_promise?.("Worker stopped")),delete e.workerState.worker[r.worker_id],{state:{loaded:!1}}}),e.register_cmd_message("worker:send",async r=>{const t=await e.get_or_create_worker(r.worker_id);if(!t.worker)throw new Error("Worker is not initialized");if(typeof t.worker.receivejs!="function")throw new Error(`Worker does not support receivejs: ${typeof t.worker.receivejs}`);t.worker.receivejs(r.msg)}),e.handleMessage=async r=>{const t={original:r};r.id&&(t.id=r.id),r.toJs===void 0&&(r.toJs=!0);try{if(r.cmd){const o=r;if(e.workerState.handel_register[o.cmd])t.result=await e.workerState.handel_register[o.cmd](o);else throw new Error("Unknown command: "+o.cmd)}else throw new Error("Unknown message format: "+JSON.stringify(r))}catch(o){t.error=o.message}return t},e.read_url_params=()=>{const r=new URLSearchParams(self.location.search),t=r.get("debug")?.toLowerCase()==="true",o=r.get("pyodide_url")||void 0,s=r.get("packages")?.split(",")||[];return{debug:t,pyodide_url:o,packages:s}};const k=r=>{const t=new Set;return{add:o=>{t.add(o)},disconnect:o=>{t.delete(o)&&t.size===0&&r()},forEach:o=>{t.forEach(o)},size:()=>t.size}},c=e;c.general_initalization=r=>{const t=c.read_url_params();c.startInitialization({...r,...t})};const l=c,p=c;p.init_dedicated_worker=r=>{const t=e;t.onmessage=async s=>{const a=s.data,i=await t.handleMessage(a);t.postMessage(i)};const o={...r,receivepy:(s,a)=>{t.postMessage({cmd:"receive",msg:s,worker_id:a})},receivepy_bytes(s,a){t.postMessage({cmd:"receive_bytes",msg:s,worker_id:a})}};t.general_initalization(o)},l.init_shared_worker=r=>{const t=e,o=k(()=>{try{t.close()}catch{}});t.connectedPorts=[],t.onconnect=a=>{const i=a.ports[0];t.connectedPorts.push(i),o.add(i),i.start(),console.debug("Port connected in shared worker"),i.onmessage=async n=>{const d=n.data;if(d?.cmd==="disconnect"){o.disconnect(i),t.connectedPorts=t.connectedPorts.filter(g=>g!==i);try{i.onmessage=null}catch{}try{i.close()}catch{}return}const y=await t.handleMessage(d);i.postMessage(y)}};const s={...r,receivepy:(a,i)=>{o.forEach(n=>{n.postMessage({cmd:"receive",msg:a,worker_id:i})})},receivepy_bytes(a,i){o.forEach(n=>{n.postMessage({cmd:"receive_bytes",msg:a,worker_id:i})})}};t.general_initalization(s)},(r=>{c.init_dedicated_worker(r)})({})})();\n',b=typeof self<"u"&&self.Blob&&new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);",S],{type:"text/javascript;charset=utf-8"});function v(r){let e;try{if(e=b&&(self.URL||self.webkitURL).createObjectURL(b),!e)throw"";const t=new Worker(e,{name: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?.name})}}const O='(function(){"use strict";const w="https://cdn.jsdelivr.net/pyodide/v0.29.0/full/pyodide.mjs",e=self;e.workerState={pyodide:null,pyodide_url:w,packages:[],state:{msg:"loading",loaded:!1,progress:0},micropip:null,worker:{},pyodideReady:!1,pyodideReadyPromise:null,debug:!1,interruptBuffer:null,receivepy:(r,t)=>{},receivepy_bytes:(r,t)=>{},handel_register:{},post_pyodide_ready:void 0},e.reset=async()=>{for(const r in e.list_workers())try{const t=await e.get_worker(r);t.worker&&t.worker.stop(),t.reject_promise?.("Worker reset")}catch{}e.workerState.pyodide&&e.interrupt(),e.workerState.pyodide=null,e.workerState.micropip=null,e.workerState.worker={},e.workerState.pyodideReady=!1;try{e.workerState.interruptBuffer=new Uint8Array(new SharedArrayBuffer(1)),e.workerState.interruptBuffer[0]=0}catch{}},e.initializePyodide=async()=>{if(!e.workerState.pyodide){console.log("initializePyodide with: Debug:",e.workerState.debug,"Pyodide URL:",e.workerState.pyodide_url,"Packages:",e.workerState.packages),console.debug("Loading Pyodide..."),e.workerState.state.msg="Loading Pyodide...",e.workerState.state.progress=0,await e.reset(),console.debug("Loading Pyodide module..."),e.workerState.state.msg="Loading Pyodide module...",e.workerState.state.progress=.1;const t=await import(e.workerState.pyodide_url);console.debug("Loading Pyodide instance..."),e.workerState.state.msg="Loading Pyodide instance...",e.workerState.state.progress=.2;const o=t.loadPyodide,s=new URL(e.workerState.pyodide_url),a=new URL(".",s).toString();e.workerState.debug&&console.debug("Pyodide indexURL:",a),e.workerState.pyodide=await o({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 t of e.workerState.packages)console.log("Installing package:",t),e.workerState.state.msg=`Installing package: ${t}`,await e.workerState.micropip.install(t);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.packages.some(t=>t.toLowerCase().endsWith(".whl")&&t.includes("funcnodes_pyodide"))?e.workerState.debug&&console.debug("Skipping PyPI funcnodes-pyodide install (wheel provided in packages)"):(e.workerState.state.msg="Installing funcnodes-pyodide",await e.workerState.micropip.install("funcnodes-pyodide")),e.workerState.state.msg="Installing funcnodes-react-flow",await e.workerState.micropip.install("funcnodes-react-flow"),e.workerState.state.msg="Importing funcnodes",console.debug("Importing funcnodes..."),await e.workerState.pyodide.runPythonAsync("import funcnodes_pyodide"),console.debug("Running post_pyodide_ready..."),await e.workerState.post_pyodide_ready?.(e.workerState),console.debug("Pyodide ready"),e.workerState.state.msg="ready",e.workerState.state.progress=.1,e.workerState.pyodideReady=!0,{pyodide:e.workerState.pyodide,micropip:e.workerState.micropip}},e.interrupt=()=>{e.workerState.interruptBuffer&&(e.workerState.interruptBuffer[0]=1)},e.list_workers=()=>Object.keys(e.workerState.worker),e.get_worker=async r=>{if(!r)throw new Error("Worker id is required");if(!e.workerState.worker[r])throw new Error(`Worker with id ${r} not found`);return await e.workerState.worker[r].make_promise,e.workerState.worker[r]},e.has_worker=r=>{if(!r)throw new Error("Worker id is required");return!!e.workerState.worker[r]},e.get_or_create_worker=async r=>{if(!r)throw new Error("Worker id is required");return e.workerState.worker[r]||(console.log("Creating worker with id",r),await e.initializeFuncNodesWorker(r)),e.get_worker(r)},e.initializeFuncNodesWorker=async r=>{try{if(!e.workerState.pyodideReadyPromise)throw new Error("Pyodide newer initialized");const{pyodide:t}=await e.workerState.pyodideReadyPromise;if(!e.has_worker(r)){e.workerState.worker[r]={worker:null,make_promise:void 0};const o=new Promise(async(s,a)=>{e.workerState.worker[r].reject_promise=a,console.debug(`Creating worker (${r})...`);const i=await t.runPythonAsync(`funcnodes_pyodide.new_worker(debug=${e.workerState.debug?1:0}, uuid="${r}")`);if(console.debug("Worker created:",i),typeof i.set_receiver=="function")i.set_receiver(self);else throw new Error("Worker does not expose a \'set_receiver\' method.");e.workerState.worker[r].worker=i,console.debug("Worker ready"),s(i)});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 s=o.worker_id;if(!s)throw new Error(`Worker id not provided in receivepy(${JSON.stringify(o)})`);if(!e.workerState.worker[s])throw new Error(`Worker with id ${s} not found in receivepy(${JSON.stringify(o)})`);e.workerState.receivepy(r,s)}catch(o){console.error("Error during receivepy:",o);return}},e.receivepy_bytes=(r,t)=>{let o=r;const s=r;if(s&&typeof s.toJs=="function")try{o=s.toJs({dict_converter:Object.fromEntries})}catch{o=s.toJs()}o instanceof Map&&(o=Object.fromEntries(o.entries()));try{let a={};if(o instanceof Uint8Array?a.msg=o:a=o,a.msg===void 0)return;let i=a.msg;const n=i;if(n&&typeof n.toJs=="function")try{i=n.toJs({dict_converter:Object.fromEntries})}catch{i=n.toJs()}if(i instanceof ArrayBuffer&&(i=new Uint8Array(i)),Array.isArray(i)&&(i=Uint8Array.from(i)),!(i instanceof Uint8Array))throw new Error(`receivepy_bytes expected Uint8Array payload, got ${typeof i}`);a.msg=i,t!==void 0&&(typeof t=="string"?a.worker_id||(a.worker_id=t):a={...t,...a});const d=a.worker_id;if(!d)throw new Error("Worker id not provided in receivepy_bytes");if(!e.workerState.worker[d])throw new Error(`Worker with id ${d} not found in receivepy_bytes`);e.workerState.receivepy_bytes(a.msg,d)}catch(a){console.error("Error during receivepy_bytes:",a);return}},e.startInitialization=({debug:r=!1,receivepy:t,receivepy_bytes:o,pyodide_url:s,post_pyodide_ready:a,packages:i})=>(e.workerState.debug=r,e.workerState.pyodide_url=s||w,e.workerState.packages=i,e.workerState.receivepy=t,e.workerState.receivepy_bytes=o,e.workerState.pyodideReadyPromise=null,e.workerState.post_pyodide_ready=a,e.workerState),e.register_cmd_message=(r,t)=>{if(e.workerState.handel_register[r])throw new Error(`Command ${r} already registered`);e.workerState.handel_register[r]=t},e.register_cmd_message("ping",async r=>"pong"),e.register_cmd_message("init",async r=>{if(e.workerState.pyodideReadyPromise)throw new Error("Pyodide is already initialized");r.data&&(r.data.pyodide_url&&(e.workerState.pyodide_url=r.data.pyodide_url),r.data.packages&&(e.workerState.packages=r.data.packages),r.data.debug&&(e.workerState.debug=r.data.debug)),e.workerState.pyodideReadyPromise=e.initializePyodide()}),e.register_cmd_message("_eval",async r=>{try{const t=await e.workerState.pyodide?.runPythonAsync(r.msg||"print(\'No code provided\')");return console.log("Eval result:",t),t}catch(t){console.error("Error during _eval:",t)}}),e.register_cmd_message("state",async r=>({state:{...e.workerState.state,loaded:e.workerState.pyodideReady}})),e.register_cmd_message("worker:state",async r=>({state:{loaded:!!(await e.get_or_create_worker(r.worker_id)).worker}})),e.register_cmd_message("worker:stop",async r=>{if(!e.has_worker(r.worker_id))return;const t=await e.get_or_create_worker(r.worker_id);return t.worker&&(t.worker.stop(),t.worker=null,t.reject_promise?.("Worker stopped")),delete e.workerState.worker[r.worker_id],{state:{loaded:!1}}}),e.register_cmd_message("worker:send",async r=>{const t=await e.get_or_create_worker(r.worker_id);if(!t.worker)throw new Error("Worker is not initialized");if(typeof t.worker.receivejs!="function")throw new Error(`Worker does not support receivejs: ${typeof t.worker.receivejs}`);t.worker.receivejs(r.msg)}),e.handleMessage=async r=>{const t={original:r};r.id&&(t.id=r.id),r.toJs===void 0&&(r.toJs=!0);try{if(r.cmd){const o=r;if(e.workerState.handel_register[o.cmd])t.result=await e.workerState.handel_register[o.cmd](o);else throw new Error("Unknown command: "+o.cmd)}else throw new Error("Unknown message format: "+JSON.stringify(r))}catch(o){t.error=o.message}return t},e.read_url_params=()=>{const r=new URLSearchParams(self.location.search),t=r.get("debug")?.toLowerCase()==="true",o=r.get("pyodide_url")||void 0,s=r.get("packages")?.split(",")||[];return{debug:t,pyodide_url:o,packages:s}};const k=r=>{const t=new Set;return{add:o=>{t.add(o)},disconnect:o=>{t.delete(o)&&t.size===0&&r()},forEach:o=>{t.forEach(o)},size:()=>t.size}},c=e;c.general_initalization=r=>{const t=c.read_url_params();c.startInitialization({...r,...t})};const l=c,p=c;p.init_dedicated_worker=r=>{const t=e;t.onmessage=async s=>{const a=s.data,i=await t.handleMessage(a);t.postMessage(i)};const o={...r,receivepy:(s,a)=>{t.postMessage({cmd:"receive",msg:s,worker_id:a})},receivepy_bytes(s,a){t.postMessage({cmd:"receive_bytes",msg:s,worker_id:a})}};t.general_initalization(o)},l.init_shared_worker=r=>{const t=e,o=k(()=>{try{t.close()}catch{}});t.connectedPorts=[],t.onconnect=a=>{const i=a.ports[0];t.connectedPorts.push(i),o.add(i),i.start(),console.debug("Port connected in shared worker"),i.onmessage=async n=>{const d=n.data;if(d?.cmd==="disconnect"){o.disconnect(i),t.connectedPorts=t.connectedPorts.filter(g=>g!==i);try{i.onmessage=null}catch{}try{i.close()}catch{}return}const y=await t.handleMessage(d);i.postMessage(y)}};const s={...r,receivepy:(a,i)=>{o.forEach(n=>{n.postMessage({cmd:"receive",msg:a,worker_id:i})})},receivepy_bytes(a,i){o.forEach(n=>{n.postMessage({cmd:"receive_bytes",msg:a,worker_id:i})})}};t.general_initalization(s)},(r=>{c.init_shared_worker(r)})({})})();\n';function R(r){return new SharedWorker("data:text/javascript;charset=utf-8,"+encodeURIComponent(O),{name:r?.name})}const $=r=>{if(r.worker)return r.worker;if(r.worker_url!==void 0||r.worker_classes?.Dedicated||r.worker_classes?.Shared)return h(r);const e=r.uuid,t=!!r.shared_worker,o=x({pageOrigin:typeof window<"u"&&window.location?window.location.origin:void 0,scriptUrl:typeof{url:typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:i&&i.tagName.toUpperCase()==="SCRIPT"&&i.src||new URL("index.umd.js",document.baseURI).href}<"u"?typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:i&&i.tagName.toUpperCase()==="SCRIPT"&&i.src||new URL("index.umd.js",document.baseURI).href:void 0});if(t){if(typeof SharedWorker>"u")throw new Error("SharedWorker is not available; provide worker, worker_url or worker_classes.Shared");if(o)return new R({name:e});try{return new SharedWorker(new URL("/assets/pyodideSharedWorker-B8dBCO6o.js",typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:i&&i.tagName.toUpperCase()==="SCRIPT"&&i.src||new URL("index.umd.js",document.baseURI).href),{name:e,type:"module"})}catch{return new R({name:e})}}if(typeof Worker>"u")throw new Error("Worker is not available; provide worker, worker_url or worker_classes.Dedicated");if(o)return new v({name:e});try{return new Worker(new URL("/assets/pyodideDedicatedWorker-Bge9R9PO.js",typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:i&&i.tagName.toUpperCase()==="SCRIPT"&&i.src||new URL("index.umd.js",document.baseURI).href),{name:e,type:"module"})}catch{return new v({name:e})}},A=(r,e)=>{if(!r?.length)return r;const t=e??(typeof window<"u"&&window.location?window.location.href:void 0);return t?r.map(o=>/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(o)?o:o.startsWith("/")||o.startsWith("./")||o.startsWith("../")?new URL(o,t).toString():o):r},J=r=>(r.worker=$({uuid:r.uuid,shared_worker:r.shared_worker,worker_url:r.worker_url,worker:r.worker,worker_classes:r.worker_classes}),r.worker);class N extends d.FuncNodesWorker{constructor(e){const t={uuid:z(),...e};super(t),this._message_hooks=[],this._disposed=!1,this._worker=J(t),this._lifecycle=new M(this._worker,{worker_id:this.uuid,onMessage:this.onmessage.bind(this)}),this.postMessage({cmd:"init",data:{debug:t.debug,pyodide_url:t.pyodide_url,packages:A(t.packages,t.worker_baseurl)}}),this._lifecycle.startStatePolling(),this._workerstate={loaded:!1,msg:"loading",progress:0},this.initPromise=new Promise(async o=>{for(;!this._workerstate.loaded&&!this._disposed;)this._zustand?.set_progress({message:this._workerstate.msg,status:"info",progress:this._workerstate.progress,blocking:!0}),await new Promise(a=>setTimeout(a,100));this._lifecycle.stopPolling(),this._disposed||(this.is_open=!0,this._zustand?.auto_progress()),o()}),this.initPromise.then(async()=>{if(!this._disposed){if(t.restore_worker_state_on_load){const o=typeof t.restore_worker_state_on_load=="string"?t.restore_worker_state_on_load:this._storage_key();await this.restore_worker_state(o)}await this.getSyncManager().stepwise_fullsync(),t.post_worker_initialized&&await t.post_worker_initialized(this)}})}async send(e){await this.initPromise,this.postMessage({cmd:"worker:send",msg:JSON.stringify(e),worker_id:this.uuid})}postMessage(e){this._lifecycle.postMessage(e)}dispose(){this._disposed||(this._disposed=!0,this.is_open=!1,this._lifecycle.dispose())}registerMessageHook(e){return this._message_hooks.push(e),()=>{this._message_hooks=this._message_hooks.filter(t=>t!==e)}}onmessage(e){if(!this._disposed){for(const t of this._message_hooks)t(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"&&this._zustand?.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.getCommunicationManager().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.getCommunicationManager().onbytes(e.data.msg)}}}}async upload_file({files:e,onProgressCallback:t,root:o}){const a=[],T=e.length;let U=0;if(e.length===0)return"";for(let w=0;w<e.length;w++){const p=e[w],c=new FileReader,y=new Promise((u,n)=>{c.onload=async F=>{try{const g=F.target.result?.replace(/^data:.+;base64,/,""),W=p.webkitRelativePath||p.name,D=o?`${o}/${W}`:W,q=await this._send_cmd({cmd:"upload",kwargs:{data:g,filename:D},wait_for_response:!0});U++,t&&t(U,T),u(q)}catch(g){n(g)}},c.readAsDataURL(p)});a.push(y)}const P=await Promise.all(a);return P.reduce((w,p)=>{const c=p.split("/"),y=w.split("/"),u=[];for(let n=0;n<c.length&&c[n]===y[n];n++)u.push(c[n]);return u.join("/")},P[0])}get ready(){return this._workerstate.loaded}_storage_key(){return`funcnodes_pyodide:worker_export:${this.uuid}`}_has_local_storage(){try{return typeof globalThis<"u"&&"localStorage"in globalThis}catch{return!1}}async save_worker_state({withFiles:e=!0}={}){const t=await this.export({withFiles:e}),o=typeof t=="string"?t:t?.data;if(typeof o!="string")throw new Error("export_worker did not return a string export");return this._has_local_storage()&&globalThis.localStorage.setItem(this._storage_key(),o),o}async restore_worker_state(e){if(!this._has_local_storage())return!1;const t=globalThis.localStorage.getItem(e||this._storage_key());if(!t)return!1;try{return await this.update_from_export(t),!0}catch(o){return console.warn("Failed to restore worker state from storage",o),!1}}}return N}));
@@ -0,0 +1,9 @@
1
+ export type DisposableHandle = {
2
+ dispose: () => void;
3
+ };
4
+ export type MountRegistry<K = any, H extends DisposableHandle = DisposableHandle> = {
5
+ register: (key: K, handle: H) => () => void;
6
+ get: (key: K) => H | undefined;
7
+ delete: (key: K) => void;
8
+ };
9
+ export declare const createMountRegistry: <K = any, H extends DisposableHandle = DisposableHandle>() => MountRegistry<K, H>;
@@ -0,0 +1,6 @@
1
+ export type DisconnectObserverStop = () => void;
2
+ export declare const observeDisconnectByPolling: (element: {
3
+ isConnected: boolean;
4
+ }, onDisconnect: () => void, { intervalMs }?: {
5
+ intervalMs?: number;
6
+ }) => DisconnectObserverStop;
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const w="https://cdn.jsdelivr.net/pyodide/v0.29.0/full/pyodide.mjs",e=self;e.workerState={pyodide:null,pyodide_url:w,packages:[],state:{msg:"loading",loaded:!1,progress:0},micropip:null,worker:{},pyodideReady:!1,pyodideReadyPromise:null,debug:!1,interruptBuffer:null,receivepy:(r,t)=>{},receivepy_bytes:(r,t)=>{},handel_register:{},post_pyodide_ready:void 0};e.reset=async()=>{for(const r in e.list_workers())try{const t=await e.get_worker(r);t.worker&&t.worker.stop(),t.reject_promise?.("Worker reset")}catch{}e.workerState.pyodide&&e.interrupt(),e.workerState.pyodide=null,e.workerState.micropip=null,e.workerState.worker={},e.workerState.pyodideReady=!1;try{e.workerState.interruptBuffer=new Uint8Array(new SharedArrayBuffer(1)),e.workerState.interruptBuffer[0]=0}catch{}};e.initializePyodide=async()=>{if(!e.workerState.pyodide){console.log("initializePyodide with: Debug:",e.workerState.debug,"Pyodide URL:",e.workerState.pyodide_url,"Packages:",e.workerState.packages),console.debug("Loading Pyodide..."),e.workerState.state.msg="Loading Pyodide...",e.workerState.state.progress=0,await e.reset(),console.debug("Loading Pyodide module..."),e.workerState.state.msg="Loading Pyodide module...",e.workerState.state.progress=.1;const t=await import(e.workerState.pyodide_url);console.debug("Loading Pyodide instance..."),e.workerState.state.msg="Loading Pyodide instance...",e.workerState.state.progress=.2;const o=t.loadPyodide,a=new URL(e.workerState.pyodide_url),i=new URL(".",a).toString();e.workerState.debug&&console.debug("Pyodide indexURL:",i),e.workerState.pyodide=await o({packages:["micropip"],indexURL:i}),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 t of e.workerState.packages)console.log("Installing package:",t),e.workerState.state.msg=`Installing package: ${t}`,await e.workerState.micropip.install(t);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.packages.some(t=>t.toLowerCase().endsWith(".whl")&&t.includes("funcnodes_pyodide"))?e.workerState.debug&&console.debug("Skipping PyPI funcnodes-pyodide install (wheel provided in packages)"):(e.workerState.state.msg="Installing funcnodes-pyodide",await e.workerState.micropip.install("funcnodes-pyodide")),e.workerState.state.msg="Installing funcnodes-react-flow",await e.workerState.micropip.install("funcnodes-react-flow"),e.workerState.state.msg="Importing funcnodes",console.debug("Importing funcnodes..."),await e.workerState.pyodide.runPythonAsync("import funcnodes_pyodide"),console.debug("Running post_pyodide_ready..."),await e.workerState.post_pyodide_ready?.(e.workerState),console.debug("Pyodide ready"),e.workerState.state.msg="ready",e.workerState.state.progress=.1,e.workerState.pyodideReady=!0,{pyodide:e.workerState.pyodide,micropip:e.workerState.micropip}};e.interrupt=()=>{e.workerState.interruptBuffer&&(e.workerState.interruptBuffer[0]=1)};e.list_workers=()=>Object.keys(e.workerState.worker);e.get_worker=async r=>{if(!r)throw new Error("Worker id is required");if(!e.workerState.worker[r])throw new Error(`Worker with id ${r} not found`);return await e.workerState.worker[r].make_promise,e.workerState.worker[r]};e.has_worker=r=>{if(!r)throw new Error("Worker id is required");return!!e.workerState.worker[r]};e.get_or_create_worker=async r=>{if(!r)throw new Error("Worker id is required");return e.workerState.worker[r]||(console.log("Creating worker with id",r),await e.initializeFuncNodesWorker(r)),e.get_worker(r)};e.initializeFuncNodesWorker=async r=>{try{if(!e.workerState.pyodideReadyPromise)throw new Error("Pyodide newer initialized");const{pyodide:t}=await e.workerState.pyodideReadyPromise;if(!e.has_worker(r)){e.workerState.worker[r]={worker:null,make_promise:void 0};const o=new Promise(async(a,i)=>{e.workerState.worker[r].reject_promise=i,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"),a(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 a=o.worker_id;if(!a)throw new Error(`Worker id not provided in receivepy(${JSON.stringify(o)})`);if(!e.workerState.worker[a])throw new Error(`Worker with id ${a} not found in receivepy(${JSON.stringify(o)})`);e.workerState.receivepy(r,a)}catch(o){console.error("Error during receivepy:",o);return}};e.receivepy_bytes=(r,t)=>{let o=r;const a=r;if(a&&typeof a.toJs=="function")try{o=a.toJs({dict_converter:Object.fromEntries})}catch{o=a.toJs()}o instanceof Map&&(o=Object.fromEntries(o.entries()));try{let i={};if(o instanceof Uint8Array?i.msg=o:i=o,i.msg===void 0)return;let s=i.msg;const d=s;if(d&&typeof d.toJs=="function")try{s=d.toJs({dict_converter:Object.fromEntries})}catch{s=d.toJs()}if(s instanceof ArrayBuffer&&(s=new Uint8Array(s)),Array.isArray(s)&&(s=Uint8Array.from(s)),!(s instanceof Uint8Array))throw new Error(`receivepy_bytes expected Uint8Array payload, got ${typeof s}`);i.msg=s,t!==void 0&&(typeof t=="string"?i.worker_id||(i.worker_id=t):i={...t,...i});const c=i.worker_id;if(!c)throw new Error("Worker id not provided in receivepy_bytes");if(!e.workerState.worker[c])throw new Error(`Worker with id ${c} not found in receivepy_bytes`);e.workerState.receivepy_bytes(i.msg,c)}catch(i){console.error("Error during receivepy_bytes:",i);return}};e.startInitialization=({debug:r=!1,receivepy:t,receivepy_bytes:o,pyodide_url:a,post_pyodide_ready:i,packages:s})=>(e.workerState.debug=r,e.workerState.pyodide_url=a||w,e.workerState.packages=s,e.workerState.receivepy=t,e.workerState.receivepy_bytes=o,e.workerState.pyodideReadyPromise=null,e.workerState.post_pyodide_ready=i,e.workerState);e.register_cmd_message=(r,t)=>{if(e.workerState.handel_register[r])throw new Error(`Command ${r} already registered`);e.workerState.handel_register[r]=t};e.register_cmd_message("ping",async r=>"pong");e.register_cmd_message("init",async r=>{if(e.workerState.pyodideReadyPromise)throw new Error("Pyodide is already initialized");r.data&&(r.data.pyodide_url&&(e.workerState.pyodide_url=r.data.pyodide_url),r.data.packages&&(e.workerState.packages=r.data.packages),r.data.debug&&(e.workerState.debug=r.data.debug)),e.workerState.pyodideReadyPromise=e.initializePyodide()});e.register_cmd_message("_eval",async r=>{try{const t=await e.workerState.pyodide?.runPythonAsync(r.msg||"print('No code provided')");return console.log("Eval result:",t),t}catch(t){console.error("Error during _eval:",t)}});e.register_cmd_message("state",async r=>({state:{...e.workerState.state,loaded:e.workerState.pyodideReady}}));e.register_cmd_message("worker:state",async r=>({state:{loaded:!!(await e.get_or_create_worker(r.worker_id)).worker}}));e.register_cmd_message("worker:stop",async r=>{if(!e.has_worker(r.worker_id))return;const t=await e.get_or_create_worker(r.worker_id);return t.worker&&(t.worker.stop(),t.worker=null,t.reject_promise?.("Worker stopped")),delete e.workerState.worker[r.worker_id],{state:{loaded:!1}}});e.register_cmd_message("worker:send",async r=>{const t=await e.get_or_create_worker(r.worker_id);if(!t.worker)throw new Error("Worker is not initialized");if(typeof t.worker.receivejs!="function")throw new Error(`Worker does not support receivejs: ${typeof t.worker.receivejs}`);t.worker.receivejs(r.msg)});e.handleMessage=async r=>{const t={original:r};r.id&&(t.id=r.id),r.toJs===void 0&&(r.toJs=!0);try{if(r.cmd){const o=r;if(e.workerState.handel_register[o.cmd])t.result=await e.workerState.handel_register[o.cmd](o);else throw new Error("Unknown command: "+o.cmd)}else throw new Error("Unknown message format: "+JSON.stringify(r))}catch(o){t.error=o.message}return t};e.read_url_params=()=>{const r=new URLSearchParams(self.location.search),t=r.get("debug")?.toLowerCase()==="true",o=r.get("pyodide_url")||void 0,a=r.get("packages")?.split(",")||[];return{debug:t,pyodide_url:o,packages:a}};const n=e;n.general_initalization=r=>{const t=n.read_url_params();n.startInitialization({...r,...t})};const k=n,l=n;l.init_dedicated_worker=r=>{const t=e;t.onmessage=async a=>{const i=a.data,s=await t.handleMessage(i);t.postMessage(s)};const o={...r,receivepy:(a,i)=>{t.postMessage({cmd:"receive",msg:a,worker_id:i})},receivepy_bytes(a,i){t.postMessage({cmd:"receive_bytes",msg:a,worker_id:i})}};t.general_initalization(o)};k.init_shared_worker=r=>{const t=e;t.connectedPorts=[],t.onconnect=a=>{const i=a.ports[0];t.connectedPorts.push(i),i.start(),console.debug("Port connected in shared worker"),i.onmessage=async s=>{const d=s.data,c=await t.handleMessage(d);i.postMessage(c)}};const o={...r,receivepy:(a,i)=>{t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive",msg:a,worker_id:i})})},receivepy_bytes(a,i){t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive_bytes",msg:a,worker_id:i})})}};t.general_initalization(o)};const p=r=>{n.init_dedicated_worker(r)},y=r=>{n.init_shared_worker(r)};exports.gself=n;exports.initDedicatedWorker=p;exports.initSharedWorker=y;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const w="https://cdn.jsdelivr.net/pyodide/v0.29.0/full/pyodide.mjs",e=self;e.workerState={pyodide:null,pyodide_url:w,packages:[],state:{msg:"loading",loaded:!1,progress:0},micropip:null,worker:{},pyodideReady:!1,pyodideReadyPromise:null,debug:!1,interruptBuffer:null,receivepy:(r,t)=>{},receivepy_bytes:(r,t)=>{},handel_register:{},post_pyodide_ready:void 0};e.reset=async()=>{for(const r in e.list_workers())try{const t=await e.get_worker(r);t.worker&&t.worker.stop(),t.reject_promise?.("Worker reset")}catch{}e.workerState.pyodide&&e.interrupt(),e.workerState.pyodide=null,e.workerState.micropip=null,e.workerState.worker={},e.workerState.pyodideReady=!1;try{e.workerState.interruptBuffer=new Uint8Array(new SharedArrayBuffer(1)),e.workerState.interruptBuffer[0]=0}catch{}};e.initializePyodide=async()=>{if(!e.workerState.pyodide){console.log("initializePyodide with: Debug:",e.workerState.debug,"Pyodide URL:",e.workerState.pyodide_url,"Packages:",e.workerState.packages),console.debug("Loading Pyodide..."),e.workerState.state.msg="Loading Pyodide...",e.workerState.state.progress=0,await e.reset(),console.debug("Loading Pyodide module..."),e.workerState.state.msg="Loading Pyodide module...",e.workerState.state.progress=.1;const t=await import(e.workerState.pyodide_url);console.debug("Loading Pyodide instance..."),e.workerState.state.msg="Loading Pyodide instance...",e.workerState.state.progress=.2;const o=t.loadPyodide,s=new URL(e.workerState.pyodide_url),a=new URL(".",s).toString();e.workerState.debug&&console.debug("Pyodide indexURL:",a),e.workerState.pyodide=await o({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 t of e.workerState.packages)console.log("Installing package:",t),e.workerState.state.msg=`Installing package: ${t}`,await e.workerState.micropip.install(t);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.packages.some(t=>t.toLowerCase().endsWith(".whl")&&t.includes("funcnodes_pyodide"))?e.workerState.debug&&console.debug("Skipping PyPI funcnodes-pyodide install (wheel provided in packages)"):(e.workerState.state.msg="Installing funcnodes-pyodide",await e.workerState.micropip.install("funcnodes-pyodide")),e.workerState.state.msg="Installing funcnodes-react-flow",await e.workerState.micropip.install("funcnodes-react-flow"),e.workerState.state.msg="Importing funcnodes",console.debug("Importing funcnodes..."),await e.workerState.pyodide.runPythonAsync("import funcnodes_pyodide"),console.debug("Running post_pyodide_ready..."),await e.workerState.post_pyodide_ready?.(e.workerState),console.debug("Pyodide ready"),e.workerState.state.msg="ready",e.workerState.state.progress=.1,e.workerState.pyodideReady=!0,{pyodide:e.workerState.pyodide,micropip:e.workerState.micropip}};e.interrupt=()=>{e.workerState.interruptBuffer&&(e.workerState.interruptBuffer[0]=1)};e.list_workers=()=>Object.keys(e.workerState.worker);e.get_worker=async r=>{if(!r)throw new Error("Worker id is required");if(!e.workerState.worker[r])throw new Error(`Worker with id ${r} not found`);return await e.workerState.worker[r].make_promise,e.workerState.worker[r]};e.has_worker=r=>{if(!r)throw new Error("Worker id is required");return!!e.workerState.worker[r]};e.get_or_create_worker=async r=>{if(!r)throw new Error("Worker id is required");return e.workerState.worker[r]||(console.log("Creating worker with id",r),await e.initializeFuncNodesWorker(r)),e.get_worker(r)};e.initializeFuncNodesWorker=async r=>{try{if(!e.workerState.pyodideReadyPromise)throw new Error("Pyodide newer initialized");const{pyodide:t}=await e.workerState.pyodideReadyPromise;if(!e.has_worker(r)){e.workerState.worker[r]={worker:null,make_promise:void 0};const o=new Promise(async(s,a)=>{e.workerState.worker[r].reject_promise=a,console.debug(`Creating worker (${r})...`);const i=await t.runPythonAsync(`funcnodes_pyodide.new_worker(debug=${e.workerState.debug?1:0}, uuid="${r}")`);if(console.debug("Worker created:",i),typeof i.set_receiver=="function")i.set_receiver(self);else throw new Error("Worker does not expose a 'set_receiver' method.");e.workerState.worker[r].worker=i,console.debug("Worker ready"),s(i)});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 s=o.worker_id;if(!s)throw new Error(`Worker id not provided in receivepy(${JSON.stringify(o)})`);if(!e.workerState.worker[s])throw new Error(`Worker with id ${s} not found in receivepy(${JSON.stringify(o)})`);e.workerState.receivepy(r,s)}catch(o){console.error("Error during receivepy:",o);return}};e.receivepy_bytes=(r,t)=>{let o=r;const s=r;if(s&&typeof s.toJs=="function")try{o=s.toJs({dict_converter:Object.fromEntries})}catch{o=s.toJs()}o instanceof Map&&(o=Object.fromEntries(o.entries()));try{let a={};if(o instanceof Uint8Array?a.msg=o:a=o,a.msg===void 0)return;let i=a.msg;const n=i;if(n&&typeof n.toJs=="function")try{i=n.toJs({dict_converter:Object.fromEntries})}catch{i=n.toJs()}if(i instanceof ArrayBuffer&&(i=new Uint8Array(i)),Array.isArray(i)&&(i=Uint8Array.from(i)),!(i instanceof Uint8Array))throw new Error(`receivepy_bytes expected Uint8Array payload, got ${typeof i}`);a.msg=i,t!==void 0&&(typeof t=="string"?a.worker_id||(a.worker_id=t):a={...t,...a});const c=a.worker_id;if(!c)throw new Error("Worker id not provided in receivepy_bytes");if(!e.workerState.worker[c])throw new Error(`Worker with id ${c} not found in receivepy_bytes`);e.workerState.receivepy_bytes(a.msg,c)}catch(a){console.error("Error during receivepy_bytes:",a);return}};e.startInitialization=({debug:r=!1,receivepy:t,receivepy_bytes:o,pyodide_url:s,post_pyodide_ready:a,packages:i})=>(e.workerState.debug=r,e.workerState.pyodide_url=s||w,e.workerState.packages=i,e.workerState.receivepy=t,e.workerState.receivepy_bytes=o,e.workerState.pyodideReadyPromise=null,e.workerState.post_pyodide_ready=a,e.workerState);e.register_cmd_message=(r,t)=>{if(e.workerState.handel_register[r])throw new Error(`Command ${r} already registered`);e.workerState.handel_register[r]=t};e.register_cmd_message("ping",async r=>"pong");e.register_cmd_message("init",async r=>{if(e.workerState.pyodideReadyPromise)throw new Error("Pyodide is already initialized");r.data&&(r.data.pyodide_url&&(e.workerState.pyodide_url=r.data.pyodide_url),r.data.packages&&(e.workerState.packages=r.data.packages),r.data.debug&&(e.workerState.debug=r.data.debug)),e.workerState.pyodideReadyPromise=e.initializePyodide()});e.register_cmd_message("_eval",async r=>{try{const t=await e.workerState.pyodide?.runPythonAsync(r.msg||"print('No code provided')");return console.log("Eval result:",t),t}catch(t){console.error("Error during _eval:",t)}});e.register_cmd_message("state",async r=>({state:{...e.workerState.state,loaded:e.workerState.pyodideReady}}));e.register_cmd_message("worker:state",async r=>({state:{loaded:!!(await e.get_or_create_worker(r.worker_id)).worker}}));e.register_cmd_message("worker:stop",async r=>{if(!e.has_worker(r.worker_id))return;const t=await e.get_or_create_worker(r.worker_id);return t.worker&&(t.worker.stop(),t.worker=null,t.reject_promise?.("Worker stopped")),delete e.workerState.worker[r.worker_id],{state:{loaded:!1}}});e.register_cmd_message("worker:send",async r=>{const t=await e.get_or_create_worker(r.worker_id);if(!t.worker)throw new Error("Worker is not initialized");if(typeof t.worker.receivejs!="function")throw new Error(`Worker does not support receivejs: ${typeof t.worker.receivejs}`);t.worker.receivejs(r.msg)});e.handleMessage=async r=>{const t={original:r};r.id&&(t.id=r.id),r.toJs===void 0&&(r.toJs=!0);try{if(r.cmd){const o=r;if(e.workerState.handel_register[o.cmd])t.result=await e.workerState.handel_register[o.cmd](o);else throw new Error("Unknown command: "+o.cmd)}else throw new Error("Unknown message format: "+JSON.stringify(r))}catch(o){t.error=o.message}return t};e.read_url_params=()=>{const r=new URLSearchParams(self.location.search),t=r.get("debug")?.toLowerCase()==="true",o=r.get("pyodide_url")||void 0,s=r.get("packages")?.split(",")||[];return{debug:t,pyodide_url:o,packages:s}};const p=r=>{const t=new Set;return{add:o=>{t.add(o)},disconnect:o=>{t.delete(o)&&t.size===0&&r()},forEach:o=>{t.forEach(o)},size:()=>t.size}},d=e;d.general_initalization=r=>{const t=d.read_url_params();d.startInitialization({...r,...t})};const y=d,g=d;g.init_dedicated_worker=r=>{const t=e;t.onmessage=async s=>{const a=s.data,i=await t.handleMessage(a);t.postMessage(i)};const o={...r,receivepy:(s,a)=>{t.postMessage({cmd:"receive",msg:s,worker_id:a})},receivepy_bytes(s,a){t.postMessage({cmd:"receive_bytes",msg:s,worker_id:a})}};t.general_initalization(o)};y.init_shared_worker=r=>{const t=e,o=p(()=>{try{t.close()}catch{}});t.connectedPorts=[],t.onconnect=a=>{const i=a.ports[0];t.connectedPorts.push(i),o.add(i),i.start(),console.debug("Port connected in shared worker"),i.onmessage=async n=>{const c=n.data;if(c?.cmd==="disconnect"){o.disconnect(i),t.connectedPorts=t.connectedPorts.filter(k=>k!==i);try{i.onmessage=null}catch{}try{i.close()}catch{}return}const l=await t.handleMessage(c);i.postMessage(l)}};const s={...r,receivepy:(a,i)=>{o.forEach(n=>{n.postMessage({cmd:"receive",msg:a,worker_id:i})})},receivepy_bytes(a,i){o.forEach(n=>{n.postMessage({cmd:"receive_bytes",msg:a,worker_id:i})})}};t.general_initalization(s)};const f=r=>{d.init_dedicated_worker(r)},u=r=>{d.init_shared_worker(r)};exports.gself=d;exports.initDedicatedWorker=f;exports.initSharedWorker=u;
@@ -47,10 +47,10 @@ e.initializePyodide = async () => {
47
47
  e.workerState.pyodide_url
48
48
  );
49
49
  console.debug("Loading Pyodide instance..."), e.workerState.state.msg = "Loading Pyodide instance...", e.workerState.state.progress = 0.2;
50
- const o = t.loadPyodide, a = new URL(e.workerState.pyodide_url), i = new URL(".", a).toString();
51
- e.workerState.debug && console.debug("Pyodide indexURL:", i), e.workerState.pyodide = await o({
50
+ const o = t.loadPyodide, s = new URL(e.workerState.pyodide_url), a = new URL(".", s).toString();
51
+ e.workerState.debug && console.debug("Pyodide indexURL:", a), e.workerState.pyodide = await o({
52
52
  packages: ["micropip"],
53
- indexURL: i
53
+ indexURL: a
54
54
  }), e.workerState.interruptBuffer && e.workerState.pyodide.setInterruptBuffer(
55
55
  e.workerState.interruptBuffer
56
56
  );
@@ -98,16 +98,16 @@ e.initializeFuncNodesWorker = async (r) => {
98
98
  //@ts-ignore
99
99
  make_promise: void 0
100
100
  };
101
- const o = new Promise(async (a, i) => {
102
- e.workerState.worker[r].reject_promise = i, console.debug(`Creating worker (${r})...`);
103
- const s = await t.runPythonAsync(
101
+ const o = new Promise(async (s, a) => {
102
+ e.workerState.worker[r].reject_promise = a, console.debug(`Creating worker (${r})...`);
103
+ const i = await t.runPythonAsync(
104
104
  `funcnodes_pyodide.new_worker(debug=${e.workerState.debug ? 1 : 0}, uuid="${r}")`
105
105
  );
106
- if (console.debug("Worker created:", s), typeof s.set_receiver == "function")
107
- s.set_receiver(self);
106
+ if (console.debug("Worker created:", i), typeof i.set_receiver == "function")
107
+ i.set_receiver(self);
108
108
  else
109
109
  throw new Error("Worker does not expose a 'set_receiver' method.");
110
- e.workerState.worker[r].worker = s, console.debug("Worker ready"), a(s);
110
+ e.workerState.worker[r].worker = i, console.debug("Worker ready"), s(i);
111
111
  });
112
112
  e.workerState.worker[r].make_promise = o;
113
113
  }
@@ -121,18 +121,18 @@ e.receivepy = (r, t) => {
121
121
  let o = {};
122
122
  if (typeof r == "string" ? o.msg = r : o = r, o.msg === void 0) return;
123
123
  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 });
124
- const a = o.worker_id;
125
- if (!a)
124
+ const s = o.worker_id;
125
+ if (!s)
126
126
  throw new Error(
127
127
  `Worker id not provided in receivepy(${JSON.stringify(o)})`
128
128
  );
129
- if (!e.workerState.worker[a])
129
+ if (!e.workerState.worker[s])
130
130
  throw new Error(
131
- `Worker with id ${a} not found in receivepy(${JSON.stringify(
131
+ `Worker with id ${s} not found in receivepy(${JSON.stringify(
132
132
  o
133
133
  )})`
134
134
  );
135
- e.workerState.receivepy(r, a);
135
+ e.workerState.receivepy(r, s);
136
136
  } catch (o) {
137
137
  console.error("Error during receivepy:", o);
138
138
  return;
@@ -140,40 +140,40 @@ e.receivepy = (r, t) => {
140
140
  };
141
141
  e.receivepy_bytes = (r, t) => {
142
142
  let o = r;
143
- const a = r;
144
- if (a && typeof a.toJs == "function")
143
+ const s = r;
144
+ if (s && typeof s.toJs == "function")
145
145
  try {
146
- o = a.toJs({ dict_converter: Object.fromEntries });
146
+ o = s.toJs({ dict_converter: Object.fromEntries });
147
147
  } catch {
148
- o = a.toJs();
148
+ o = s.toJs();
149
149
  }
150
150
  o instanceof Map && (o = Object.fromEntries(o.entries()));
151
151
  try {
152
- let i = {};
153
- if (o instanceof Uint8Array ? i.msg = o : i = o, i.msg === void 0) return;
154
- let s = i.msg;
155
- const d = s;
156
- if (d && typeof d.toJs == "function")
152
+ let a = {};
153
+ if (o instanceof Uint8Array ? a.msg = o : a = o, a.msg === void 0) return;
154
+ let i = a.msg;
155
+ const n = i;
156
+ if (n && typeof n.toJs == "function")
157
157
  try {
158
- s = d.toJs({ dict_converter: Object.fromEntries });
158
+ i = n.toJs({ dict_converter: Object.fromEntries });
159
159
  } catch {
160
- s = d.toJs();
160
+ i = n.toJs();
161
161
  }
162
- if (s instanceof ArrayBuffer && (s = new Uint8Array(s)), Array.isArray(s) && (s = Uint8Array.from(s)), !(s instanceof Uint8Array))
162
+ if (i instanceof ArrayBuffer && (i = new Uint8Array(i)), Array.isArray(i) && (i = Uint8Array.from(i)), !(i instanceof Uint8Array))
163
163
  throw new Error(
164
- `receivepy_bytes expected Uint8Array payload, got ${typeof s}`
164
+ `receivepy_bytes expected Uint8Array payload, got ${typeof i}`
165
165
  );
166
- i.msg = s, t !== void 0 && (typeof t == "string" ? i.worker_id || (i.worker_id = t) : i = { ...t, ...i });
167
- const c = i.worker_id;
168
- if (!c)
166
+ a.msg = i, t !== void 0 && (typeof t == "string" ? a.worker_id || (a.worker_id = t) : a = { ...t, ...a });
167
+ const d = a.worker_id;
168
+ if (!d)
169
169
  throw new Error("Worker id not provided in receivepy_bytes");
170
- if (!e.workerState.worker[c])
170
+ if (!e.workerState.worker[d])
171
171
  throw new Error(
172
- `Worker with id ${c} not found in receivepy_bytes`
172
+ `Worker with id ${d} not found in receivepy_bytes`
173
173
  );
174
- e.workerState.receivepy_bytes(i.msg, c);
175
- } catch (i) {
176
- console.error("Error during receivepy_bytes:", i);
174
+ e.workerState.receivepy_bytes(a.msg, d);
175
+ } catch (a) {
176
+ console.error("Error during receivepy_bytes:", a);
177
177
  return;
178
178
  }
179
179
  };
@@ -181,10 +181,10 @@ e.startInitialization = ({
181
181
  debug: r = !1,
182
182
  receivepy: t,
183
183
  receivepy_bytes: o,
184
- pyodide_url: a,
185
- post_pyodide_ready: i,
186
- packages: s
187
- }) => (e.workerState.debug = r, e.workerState.pyodide_url = a || w, e.workerState.packages = s, e.workerState.receivepy = t, e.workerState.receivepy_bytes = o, e.workerState.pyodideReadyPromise = null, e.workerState.post_pyodide_ready = i, e.workerState);
184
+ pyodide_url: s,
185
+ post_pyodide_ready: a,
186
+ packages: i
187
+ }) => (e.workerState.debug = r, e.workerState.pyodide_url = s || w, e.workerState.packages = i, e.workerState.receivepy = t, e.workerState.receivepy_bytes = o, e.workerState.pyodideReadyPromise = null, e.workerState.post_pyodide_ready = a, e.workerState);
188
188
  e.register_cmd_message = (r, t) => {
189
189
  if (e.workerState.handel_register[r])
190
190
  throw new Error(`Command ${r} already registered`);
@@ -250,58 +250,92 @@ e.handleMessage = async (r) => {
250
250
  return t;
251
251
  };
252
252
  e.read_url_params = () => {
253
- const r = new URLSearchParams(self.location.search), t = r.get("debug")?.toLowerCase() === "true", o = r.get("pyodide_url") || void 0, a = r.get("packages")?.split(",") || [];
254
- return { debug: t, pyodide_url: o, packages: a };
253
+ const r = new URLSearchParams(self.location.search), t = r.get("debug")?.toLowerCase() === "true", o = r.get("pyodide_url") || void 0, s = r.get("packages")?.split(",") || [];
254
+ return { debug: t, pyodide_url: o, packages: s };
255
255
  };
256
- const n = e;
257
- n.general_initalization = (r) => {
258
- const t = n.read_url_params();
259
- n.startInitialization({
256
+ const p = (r) => {
257
+ const t = /* @__PURE__ */ new Set();
258
+ return {
259
+ add: (o) => {
260
+ t.add(o);
261
+ },
262
+ disconnect: (o) => {
263
+ t.delete(o) && t.size === 0 && r();
264
+ },
265
+ forEach: (o) => {
266
+ t.forEach(o);
267
+ },
268
+ size: () => t.size
269
+ };
270
+ }, c = e;
271
+ c.general_initalization = (r) => {
272
+ const t = c.read_url_params();
273
+ c.startInitialization({
260
274
  ...r,
261
275
  ...t
262
276
  });
263
277
  };
264
- const k = n, l = n;
265
- l.init_dedicated_worker = (r) => {
278
+ const y = c, g = c;
279
+ g.init_dedicated_worker = (r) => {
266
280
  const t = e;
267
- t.onmessage = async (a) => {
268
- const i = a.data, s = await t.handleMessage(i);
269
- t.postMessage(s);
281
+ t.onmessage = async (s) => {
282
+ const a = s.data, i = await t.handleMessage(a);
283
+ t.postMessage(i);
270
284
  };
271
285
  const o = {
272
286
  ...r,
273
- receivepy: (a, i) => {
274
- t.postMessage({ cmd: "receive", msg: a, worker_id: i });
287
+ receivepy: (s, a) => {
288
+ t.postMessage({ cmd: "receive", msg: s, worker_id: a });
275
289
  },
276
- receivepy_bytes(a, i) {
290
+ receivepy_bytes(s, a) {
277
291
  t.postMessage({
278
292
  cmd: "receive_bytes",
279
- msg: a,
280
- worker_id: i
293
+ msg: s,
294
+ worker_id: a
281
295
  });
282
296
  }
283
297
  };
284
298
  t.general_initalization(o);
285
299
  };
286
- k.init_shared_worker = (r) => {
287
- const t = e;
300
+ y.init_shared_worker = (r) => {
301
+ const t = e, o = p(() => {
302
+ try {
303
+ t.close();
304
+ } catch {
305
+ }
306
+ });
288
307
  t.connectedPorts = [], t.onconnect = (a) => {
289
308
  const i = a.ports[0];
290
- t.connectedPorts.push(i), i.start(), console.debug("Port connected in shared worker"), i.onmessage = async (s) => {
291
- const d = s.data, c = await t.handleMessage(d);
292
- i.postMessage(c);
309
+ t.connectedPorts.push(i), o.add(i), i.start(), console.debug("Port connected in shared worker"), i.onmessage = async (n) => {
310
+ const d = n.data;
311
+ if (d?.cmd === "disconnect") {
312
+ o.disconnect(i), t.connectedPorts = t.connectedPorts.filter(
313
+ (l) => l !== i
314
+ );
315
+ try {
316
+ i.onmessage = null;
317
+ } catch {
318
+ }
319
+ try {
320
+ i.close();
321
+ } catch {
322
+ }
323
+ return;
324
+ }
325
+ const k = await t.handleMessage(d);
326
+ i.postMessage(k);
293
327
  };
294
328
  };
295
- const o = {
329
+ const s = {
296
330
  ...r,
297
331
  receivepy: (a, i) => {
298
- t.connectedPorts.forEach((s) => {
299
- s.postMessage({ cmd: "receive", msg: a, worker_id: i });
332
+ o.forEach((n) => {
333
+ n.postMessage({ cmd: "receive", msg: a, worker_id: i });
300
334
  });
301
335
  },
302
336
  receivepy_bytes(a, i) {
303
- t.connectedPorts.forEach((s) => {
304
- s.postMessage({
337
+ o.forEach((n) => {
338
+ n.postMessage({
305
339
  cmd: "receive_bytes",
306
340
  msg: a,
307
341
  worker_id: i
@@ -309,15 +343,15 @@ k.init_shared_worker = (r) => {
309
343
  });
310
344
  }
311
345
  };
312
- t.general_initalization(o);
346
+ t.general_initalization(s);
313
347
  };
314
- const p = (r) => {
315
- n.init_dedicated_worker(r);
316
- }, y = (r) => {
317
- n.init_shared_worker(r);
348
+ const f = (r) => {
349
+ c.init_dedicated_worker(r);
350
+ }, _ = (r) => {
351
+ c.init_shared_worker(r);
318
352
  };
319
353
  export {
320
- n as gself,
321
- p as initDedicatedWorker,
322
- y as initSharedWorker
354
+ c as gself,
355
+ f as initDedicatedWorker,
356
+ _ as initSharedWorker
323
357
  };
@@ -27,11 +27,13 @@ declare class FuncnodesPyodideWorker extends FuncNodesWorker {
27
27
  msg: string;
28
28
  progress: number;
29
29
  };
30
- _port: MessagePort | undefined;
31
30
  _message_hooks: ((data: any) => Promise<void>)[];
31
+ private _disposed;
32
+ private _lifecycle;
32
33
  constructor(_data: FuncnodesPyodideWorkerProps);
33
34
  send(data: any): Promise<void>;
34
35
  postMessage(data: any): void;
36
+ dispose(): void;
35
37
  registerMessageHook(hook: (data: any) => Promise<void>): () => void;
36
38
  onmessage(event: MessageEvent): void;
37
39
  upload_file({ files: files, onProgressCallback: _onProgressCallback, root: root, }: {
@@ -0,0 +1,7 @@
1
+ export type SharedWorkerPortRegistry = {
2
+ add: (port: any) => void;
3
+ disconnect: (port: any) => void;
4
+ forEach: (fn: (port: any) => void) => void;
5
+ size: () => number;
6
+ };
7
+ export declare const createSharedWorkerPortRegistry: (onLastPortDisconnected: () => void) => SharedWorkerPortRegistry;
@@ -0,0 +1,2 @@
1
+ import { WorkerFactoryProps } from './workerFactory';
2
+ export declare const createWorkerFromData: (data: WorkerFactoryProps) => any;
@@ -0,0 +1,19 @@
1
+ export type WorkerFactoryProps = {
2
+ uuid?: string;
3
+ shared_worker?: boolean;
4
+ worker_url?: string;
5
+ worker?: any;
6
+ worker_classes?: {
7
+ Shared?: new (options?: {
8
+ name?: string;
9
+ }) => any;
10
+ Dedicated?: new (options?: {
11
+ name?: string;
12
+ }) => any;
13
+ };
14
+ };
15
+ export declare const shouldPreferInlineWorkers: ({ pageOrigin, scriptUrl, }: {
16
+ pageOrigin: string | undefined;
17
+ scriptUrl: string | undefined;
18
+ }) => boolean;
19
+ export declare const createWorkerFromData: (data: WorkerFactoryProps) => any;
@@ -0,0 +1,34 @@
1
+ type DedicatedWorkerLike = {
2
+ postMessage: (data: any) => void;
3
+ addEventListener: (type: "message", listener: (ev: MessageEvent) => void) => void;
4
+ removeEventListener?: (type: "message", listener: (ev: MessageEvent) => void) => void;
5
+ terminate?: () => void;
6
+ };
7
+ type SharedWorkerLike = {
8
+ port: MessagePort;
9
+ };
10
+ export type AnyWorkerLike = DedicatedWorkerLike | SharedWorkerLike;
11
+ export type WorkerLifecycleOptions = {
12
+ worker_id?: string;
13
+ onMessage?: (event: MessageEvent) => void;
14
+ };
15
+ export declare class WorkerLifecycle {
16
+ private _worker;
17
+ private _port;
18
+ private _onmessage_bound;
19
+ private _disposed;
20
+ private _intervals;
21
+ private _worker_id;
22
+ constructor(worker: AnyWorkerLike, options?: WorkerLifecycleOptions);
23
+ get disposed(): boolean;
24
+ get shared(): boolean;
25
+ private _decorate;
26
+ postMessage(message: any): void;
27
+ private _postRaw;
28
+ startStatePolling({ intervalMs }?: {
29
+ intervalMs?: number | undefined;
30
+ }): void;
31
+ stopPolling(): void;
32
+ dispose(): void;
33
+ }
34
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@linkdlab/funcnodes_pyodide_react_flow",
3
- "version": "2.0.0",
3
+ "version": "2.0.1a0",
4
4
  "description": "Frontend with React Flow for FuncNodes",
5
5
  "repository": {
6
6
  "type": "git",
@@ -43,7 +43,7 @@
43
43
  },
44
44
  "scripts": {
45
45
  "typecheck": "tsc --noEmit",
46
- "test": "node --test",
46
+ "test": "node --test --experimental-strip-types",
47
47
  "build": "vite build --config vite.browser.config.js && vite build && vite build --config vite.worker.config.js",
48
48
  "watch": "vite --config vite.browser.config.js",
49
49
  "preview": "vite build --config vite.browser.config.js && vite preview --config vite.browser.config.js"