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