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