@linkdlab/funcnodes_pyodide_react_flow 2.0.0 → 2.0.1-a0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/pyodideDedicatedWorker-Bge9R9PO.js +1 -0
- package/dist/assets/pyodideSharedWorker-B8dBCO6o.js +1 -0
- package/dist/browser_index.d.ts +6 -2
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +296 -92
- package/dist/index.umd.js +1 -1
- package/dist/mountRegistry.d.ts +9 -0
- package/dist/observeDisconnect.d.ts +6 -0
- package/dist/pyodideWebWorker.cjs.js +1 -1
- package/dist/pyodideWebWorker.es.js +107 -73
- package/dist/pyodineworker.d.ts +3 -1
- package/dist/sharedWorkerPorts.d.ts +7 -0
- package/dist/workerFactory.browser.d.ts +2 -0
- package/dist/workerFactory.d.ts +19 -0
- package/dist/workerLifecycle.d.ts +34 -0
- package/package.json +2 -2
package/dist/index.es.js
CHANGED
|
@@ -1,36 +1,203 @@
|
|
|
1
|
-
import { FuncNodesWorker as
|
|
1
|
+
import { FuncNodesWorker as j } from "@linkdlab/funcnodes_react_flow";
|
|
2
2
|
const i = [];
|
|
3
3
|
for (let r = 0; r < 256; ++r)
|
|
4
4
|
i.push((r + 256).toString(16).slice(1));
|
|
5
|
-
function
|
|
5
|
+
function I(r, e = 0) {
|
|
6
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 u;
|
|
9
|
+
const z = new Uint8Array(16);
|
|
10
|
+
function M() {
|
|
11
|
+
if (!u) {
|
|
12
12
|
if (typeof crypto > "u" || !crypto.getRandomValues)
|
|
13
13
|
throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");
|
|
14
|
-
|
|
14
|
+
u = crypto.getRandomValues.bind(crypto);
|
|
15
15
|
}
|
|
16
|
-
return
|
|
16
|
+
return u(z);
|
|
17
17
|
}
|
|
18
|
-
const
|
|
19
|
-
function
|
|
18
|
+
const B = typeof crypto < "u" && crypto.randomUUID && crypto.randomUUID.bind(crypto), f = { randomUUID: B };
|
|
19
|
+
function O(r, e, t) {
|
|
20
20
|
r = r || {};
|
|
21
|
-
const o = r.random ?? r.rng?.() ??
|
|
21
|
+
const o = r.random ?? r.rng?.() ?? M();
|
|
22
22
|
if (o.length < 16)
|
|
23
23
|
throw new Error("Random bytes length must be >= 16");
|
|
24
|
-
return o[6] = o[6] & 15 | 64, o[8] = o[8] & 63 | 128,
|
|
24
|
+
return o[6] = o[6] & 15 | 64, o[8] = o[8] & 63 | 128, I(o);
|
|
25
25
|
}
|
|
26
|
-
function
|
|
27
|
-
return
|
|
26
|
+
function $(r, e, t) {
|
|
27
|
+
return f.randomUUID && !r ? f.randomUUID() : O(r);
|
|
28
28
|
}
|
|
29
|
-
const h = '(function(){"use strict";const w="https://cdn.jsdelivr.net/pyodide/v0.29.0/full/pyodide.mjs",e=self;e.workerState={pyodide:null,pyodide_url:w,packages:[],state:{msg:"loading",loaded:!1,progress:0},micropip:null,worker:{},pyodideReady:!1,pyodideReadyPromise:null,debug:!1,interruptBuffer:null,receivepy:(r,t)=>{},receivepy_bytes:(r,t)=>{},handel_register:{},post_pyodide_ready:void 0},e.reset=async()=>{for(const r in e.list_workers())try{const t=await e.get_worker(r);t.worker&&t.worker.stop(),t.reject_promise?.("Worker reset")}catch{}e.workerState.pyodide&&e.interrupt(),e.workerState.pyodide=null,e.workerState.micropip=null,e.workerState.worker={},e.workerState.pyodideReady=!1;try{e.workerState.interruptBuffer=new Uint8Array(new SharedArrayBuffer(1)),e.workerState.interruptBuffer[0]=0}catch{}},e.initializePyodide=async()=>{if(!e.workerState.pyodide){console.log("initializePyodide with: Debug:",e.workerState.debug,"Pyodide URL:",e.workerState.pyodide_url,"Packages:",e.workerState.packages),console.debug("Loading Pyodide..."),e.workerState.state.msg="Loading Pyodide...",e.workerState.state.progress=0,await e.reset(),console.debug("Loading Pyodide module..."),e.workerState.state.msg="Loading Pyodide module...",e.workerState.state.progress=.1;const t=await import(e.workerState.pyodide_url);console.debug("Loading Pyodide instance..."),e.workerState.state.msg="Loading Pyodide instance...",e.workerState.state.progress=.2;const o=t.loadPyodide,a=new URL(e.workerState.pyodide_url),i=new URL(".",a).toString();e.workerState.debug&&console.debug("Pyodide indexURL:",i),e.workerState.pyodide=await o({packages:["micropip"],indexURL:i}),e.workerState.interruptBuffer&&e.workerState.pyodide.setInterruptBuffer(e.workerState.interruptBuffer)}e.workerState.micropip||(console.debug("Importing micropip..."),e.workerState.state.msg="Importing micropip...",e.workerState.state.progress=.3,e.workerState.micropip=e.workerState.pyodide.pyimport("micropip")),console.debug("Pyodide ready. Installing funcnodes...");for(const t of e.workerState.packages)console.log("Installing package:",t),e.workerState.state.msg=`Installing package: ${t}`,await e.workerState.micropip.install(t);return e.workerState.state.msg="Installing funcnodes",e.workerState.state.progress=.8,await e.workerState.micropip.install("funcnodes"),e.workerState.state.msg="Installing funcnodes-worker",await e.workerState.micropip.install("funcnodes-worker"),e.workerState.packages.some(t=>t.toLowerCase().endsWith(".whl")&&t.includes("funcnodes_pyodide"))?e.workerState.debug&&console.debug("Skipping PyPI funcnodes-pyodide install (wheel provided in packages)"):(e.workerState.state.msg="Installing funcnodes-pyodide",await e.workerState.micropip.install("funcnodes-pyodide")),e.workerState.state.msg="Installing funcnodes-react-flow",await e.workerState.micropip.install("funcnodes-react-flow"),e.workerState.state.msg="Importing funcnodes",console.debug("Importing funcnodes..."),await e.workerState.pyodide.runPythonAsync("import funcnodes_pyodide"),console.debug("Running post_pyodide_ready..."),await e.workerState.post_pyodide_ready?.(e.workerState),console.debug("Pyodide ready"),e.workerState.state.msg="ready",e.workerState.state.progress=.1,e.workerState.pyodideReady=!0,{pyodide:e.workerState.pyodide,micropip:e.workerState.micropip}},e.interrupt=()=>{e.workerState.interruptBuffer&&(e.workerState.interruptBuffer[0]=1)},e.list_workers=()=>Object.keys(e.workerState.worker),e.get_worker=async r=>{if(!r)throw new Error("Worker id is required");if(!e.workerState.worker[r])throw new Error(`Worker with id ${r} not found`);return await e.workerState.worker[r].make_promise,e.workerState.worker[r]},e.has_worker=r=>{if(!r)throw new Error("Worker id is required");return!!e.workerState.worker[r]},e.get_or_create_worker=async r=>{if(!r)throw new Error("Worker id is required");return e.workerState.worker[r]||(console.log("Creating worker with id",r),await e.initializeFuncNodesWorker(r)),e.get_worker(r)},e.initializeFuncNodesWorker=async r=>{try{if(!e.workerState.pyodideReadyPromise)throw new Error("Pyodide newer initialized");const{pyodide:t}=await e.workerState.pyodideReadyPromise;if(!e.has_worker(r)){e.workerState.worker[r]={worker:null,make_promise:void 0};const o=new Promise(async(a,i)=>{e.workerState.worker[r].reject_promise=i,console.debug(`Creating worker (${r})...`);const s=await t.runPythonAsync(`funcnodes_pyodide.new_worker(debug=${e.workerState.debug?1:0}, uuid="${r}")`);if(console.debug("Worker created:",s),typeof s.set_receiver=="function")s.set_receiver(self);else throw new Error("Worker does not expose a \'set_receiver\' method.");e.workerState.worker[r].worker=s,console.debug("Worker ready"),a(s)});e.workerState.worker[r].make_promise=o}return e.get_worker(r)}catch(t){throw console.error("Error during worker initialization:",t),t}},e.receivepy=(r,t)=>{try{let o={};if(typeof r=="string"?o.msg=r:o=r,o.msg===void 0)return;typeof o.msg!="string"&&(o.msg=JSON.stringify(o.msg)),t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const a=o.worker_id;if(!a)throw new Error(`Worker id not provided in receivepy(${JSON.stringify(o)})`);if(!e.workerState.worker[a])throw new Error(`Worker with id ${a} not found in receivepy(${JSON.stringify(o)})`);e.workerState.receivepy(r,a)}catch(o){console.error("Error during receivepy:",o);return}},e.receivepy_bytes=(r,t)=>{let o=r;const a=r;if(a&&typeof a.toJs=="function")try{o=a.toJs({dict_converter:Object.fromEntries})}catch{o=a.toJs()}o instanceof Map&&(o=Object.fromEntries(o.entries()));try{let i={};if(o instanceof Uint8Array?i.msg=o:i=o,i.msg===void 0)return;let s=i.msg;const d=s;if(d&&typeof d.toJs=="function")try{s=d.toJs({dict_converter:Object.fromEntries})}catch{s=d.toJs()}if(s instanceof ArrayBuffer&&(s=new Uint8Array(s)),Array.isArray(s)&&(s=Uint8Array.from(s)),!(s instanceof Uint8Array))throw new Error(`receivepy_bytes expected Uint8Array payload, got ${typeof s}`);i.msg=s,t!==void 0&&(typeof t=="string"?i.worker_id||(i.worker_id=t):i={...t,...i});const c=i.worker_id;if(!c)throw new Error("Worker id not provided in receivepy_bytes");if(!e.workerState.worker[c])throw new Error(`Worker with id ${c} not found in receivepy_bytes`);e.workerState.receivepy_bytes(i.msg,c)}catch(i){console.error("Error during receivepy_bytes:",i);return}},e.startInitialization=({debug:r=!1,receivepy:t,receivepy_bytes:o,pyodide_url:a,post_pyodide_ready:i,packages:s})=>(e.workerState.debug=r,e.workerState.pyodide_url=a||w,e.workerState.packages=s,e.workerState.receivepy=t,e.workerState.receivepy_bytes=o,e.workerState.pyodideReadyPromise=null,e.workerState.post_pyodide_ready=i,e.workerState),e.register_cmd_message=(r,t)=>{if(e.workerState.handel_register[r])throw new Error(`Command ${r} already registered`);e.workerState.handel_register[r]=t},e.register_cmd_message("ping",async r=>"pong"),e.register_cmd_message("init",async r=>{if(e.workerState.pyodideReadyPromise)throw new Error("Pyodide is already initialized");r.data&&(r.data.pyodide_url&&(e.workerState.pyodide_url=r.data.pyodide_url),r.data.packages&&(e.workerState.packages=r.data.packages),r.data.debug&&(e.workerState.debug=r.data.debug)),e.workerState.pyodideReadyPromise=e.initializePyodide()}),e.register_cmd_message("_eval",async r=>{try{const t=await e.workerState.pyodide?.runPythonAsync(r.msg||"print(\'No code provided\')");return console.log("Eval result:",t),t}catch(t){console.error("Error during _eval:",t)}}),e.register_cmd_message("state",async r=>({state:{...e.workerState.state,loaded:e.workerState.pyodideReady}})),e.register_cmd_message("worker:state",async r=>({state:{loaded:!!(await e.get_or_create_worker(r.worker_id)).worker}})),e.register_cmd_message("worker:stop",async r=>{if(!e.has_worker(r.worker_id))return;const t=await e.get_or_create_worker(r.worker_id);return t.worker&&(t.worker.stop(),t.worker=null,t.reject_promise?.("Worker stopped")),delete e.workerState.worker[r.worker_id],{state:{loaded:!1}}}),e.register_cmd_message("worker:send",async r=>{const t=await e.get_or_create_worker(r.worker_id);if(!t.worker)throw new Error("Worker is not initialized");if(typeof t.worker.receivejs!="function")throw new Error(`Worker does not support receivejs: ${typeof t.worker.receivejs}`);t.worker.receivejs(r.msg)}),e.handleMessage=async r=>{const t={original:r};r.id&&(t.id=r.id),r.toJs===void 0&&(r.toJs=!0);try{if(r.cmd){const o=r;if(e.workerState.handel_register[o.cmd])t.result=await e.workerState.handel_register[o.cmd](o);else throw new Error("Unknown command: "+o.cmd)}else throw new Error("Unknown message format: "+JSON.stringify(r))}catch(o){t.error=o.message}return t},e.read_url_params=()=>{const r=new URLSearchParams(self.location.search),t=r.get("debug")?.toLowerCase()==="true",o=r.get("pyodide_url")||void 0,a=r.get("packages")?.split(",")||[];return{debug:t,pyodide_url:o,packages:a}};const n=e;n.general_initalization=r=>{const t=n.read_url_params();n.startInitialization({...r,...t})};const k=n,p=n;p.init_dedicated_worker=r=>{const t=e;t.onmessage=async a=>{const i=a.data,s=await t.handleMessage(i);t.postMessage(s)};const o={...r,receivepy:(a,i)=>{t.postMessage({cmd:"receive",msg:a,worker_id:i})},receivepy_bytes(a,i){t.postMessage({cmd:"receive_bytes",msg:a,worker_id:i})}};t.general_initalization(o)},k.init_shared_worker=r=>{const t=e;t.connectedPorts=[],t.onconnect=a=>{const i=a.ports[0];t.connectedPorts.push(i),i.start(),console.debug("Port connected in shared worker"),i.onmessage=async s=>{const d=s.data,c=await t.handleMessage(d);i.postMessage(c)}};const o={...r,receivepy:(a,i)=>{t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive",msg:a,worker_id:i})})},receivepy_bytes(a,i){t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive_bytes",msg:a,worker_id:i})})}};t.general_initalization(o)},(r=>{n.init_dedicated_worker(r)})({})})();\n', f = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", h], { type: "text/javascript;charset=utf-8" });
|
|
30
|
-
|
|
29
|
+
const m = (r) => !!r && typeof r == "object" && "port" in r && !!r.port, h = (r) => !!r && typeof r == "object" && typeof r.postMessage == "function" && typeof r.addEventListener == "function" && !("port" in r);
|
|
30
|
+
class A {
|
|
31
|
+
constructor(e, t = {}) {
|
|
32
|
+
if (this._disposed = !1, this._intervals = [], this._worker = e, this._worker_id = t.worker_id, t.onMessage)
|
|
33
|
+
if (this._onmessage_bound = t.onMessage, m(e))
|
|
34
|
+
this._port = e.port, this._port.start(), this._port.addEventListener("message", this._onmessage_bound);
|
|
35
|
+
else if (h(e))
|
|
36
|
+
e.addEventListener("message", this._onmessage_bound);
|
|
37
|
+
else
|
|
38
|
+
throw new Error("worker must be a DedicatedWorkerLike or SharedWorkerLike");
|
|
39
|
+
else if (m(e))
|
|
40
|
+
this._port = e.port, this._port.start();
|
|
41
|
+
else if (!h(e))
|
|
42
|
+
throw new Error("worker must be a DedicatedWorkerLike or SharedWorkerLike");
|
|
43
|
+
}
|
|
44
|
+
get disposed() {
|
|
45
|
+
return this._disposed;
|
|
46
|
+
}
|
|
47
|
+
get shared() {
|
|
48
|
+
return !!this._port;
|
|
49
|
+
}
|
|
50
|
+
_decorate(e) {
|
|
51
|
+
return this._worker_id === void 0 ? e : { ...e, worker_id: this._worker_id };
|
|
52
|
+
}
|
|
53
|
+
postMessage(e) {
|
|
54
|
+
this._disposed || this._postRaw(e);
|
|
55
|
+
}
|
|
56
|
+
_postRaw(e) {
|
|
57
|
+
const t = this._decorate(e);
|
|
58
|
+
this._port ? this._port.postMessage(t) : this._worker.postMessage(t);
|
|
59
|
+
}
|
|
60
|
+
startStatePolling({ intervalMs: e = 400 } = {}) {
|
|
61
|
+
if (this._disposed) return;
|
|
62
|
+
const t = setInterval(() => {
|
|
63
|
+
this.postMessage({ cmd: "state" });
|
|
64
|
+
}, e);
|
|
65
|
+
this._intervals.push(t);
|
|
66
|
+
}
|
|
67
|
+
stopPolling() {
|
|
68
|
+
for (const e of this._intervals) clearInterval(e);
|
|
69
|
+
this._intervals = [];
|
|
70
|
+
}
|
|
71
|
+
dispose() {
|
|
72
|
+
if (!this._disposed) {
|
|
73
|
+
if (this._port)
|
|
74
|
+
try {
|
|
75
|
+
this._postRaw({ cmd: "disconnect" });
|
|
76
|
+
} catch {
|
|
77
|
+
}
|
|
78
|
+
this._disposed = !0, this.stopPolling();
|
|
79
|
+
try {
|
|
80
|
+
this._port && this._onmessage_bound ? this._port.removeEventListener("message", this._onmessage_bound) : this._onmessage_bound && this._worker.removeEventListener?.(
|
|
81
|
+
"message",
|
|
82
|
+
this._onmessage_bound
|
|
83
|
+
);
|
|
84
|
+
} catch {
|
|
85
|
+
}
|
|
86
|
+
if (this._port) {
|
|
87
|
+
try {
|
|
88
|
+
this._port.close();
|
|
89
|
+
} catch {
|
|
90
|
+
}
|
|
91
|
+
this._port = void 0;
|
|
92
|
+
} else
|
|
93
|
+
try {
|
|
94
|
+
this._worker.terminate?.();
|
|
95
|
+
} catch {
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const J = ({
|
|
101
|
+
pageOrigin: r,
|
|
102
|
+
scriptUrl: e
|
|
103
|
+
}) => {
|
|
104
|
+
if (!r || !e) return !1;
|
|
105
|
+
try {
|
|
106
|
+
return new URL(e).origin !== r;
|
|
107
|
+
} catch {
|
|
108
|
+
return !1;
|
|
109
|
+
}
|
|
110
|
+
}, x = () => typeof URL < "u" && typeof URL.createObjectURL == "function" && typeof URL.revokeObjectURL == "function" && typeof Blob < "u", D = (r) => {
|
|
111
|
+
if (!x()) return;
|
|
112
|
+
const e = `await import(${JSON.stringify(r)});`, t = new Blob([e], { type: "text/javascript" });
|
|
113
|
+
return URL.createObjectURL(t);
|
|
114
|
+
}, k = (r, e) => {
|
|
115
|
+
try {
|
|
116
|
+
return r(e);
|
|
117
|
+
} catch (t) {
|
|
118
|
+
const o = D(e);
|
|
119
|
+
if (!o) throw t;
|
|
120
|
+
try {
|
|
121
|
+
return r(o);
|
|
122
|
+
} finally {
|
|
123
|
+
try {
|
|
124
|
+
URL.revokeObjectURL(o);
|
|
125
|
+
} catch {
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}, S = (r) => {
|
|
130
|
+
if (r.worker) return r.worker;
|
|
131
|
+
const e = r.uuid;
|
|
132
|
+
if (!!r.shared_worker) {
|
|
133
|
+
if (r.worker_url === void 0) {
|
|
134
|
+
if (r.worker_classes?.Shared)
|
|
135
|
+
return new r.worker_classes.Shared({ name: e });
|
|
136
|
+
if (typeof SharedWorker > "u")
|
|
137
|
+
throw new Error(
|
|
138
|
+
"SharedWorker is not available; provide worker, worker_url or worker_classes.Shared"
|
|
139
|
+
);
|
|
140
|
+
try {
|
|
141
|
+
return new SharedWorker(new URL(
|
|
142
|
+
/* @vite-ignore */
|
|
143
|
+
"/assets/pyodideSharedWorker-B8dBCO6o.js",
|
|
144
|
+
import.meta.url
|
|
145
|
+
), {
|
|
146
|
+
name: e,
|
|
147
|
+
type: "module"
|
|
148
|
+
});
|
|
149
|
+
} catch {
|
|
150
|
+
return k(
|
|
151
|
+
(s) => new SharedWorker(s, { name: e, type: "module" }),
|
|
152
|
+
new URL("data:video/mp2t;base64,aW1wb3J0IHsgaW5pdFNoYXJlZFdvcmtlciB9IGZyb20gIi4vcHlvZGlkZVdlYldvcmtlci5tanMiOwppbml0U2hhcmVkV29ya2VyKHt9KTsK", import.meta.url).href
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (r.worker_classes?.Shared, typeof SharedWorker > "u")
|
|
157
|
+
throw new Error(
|
|
158
|
+
"SharedWorker is not available; provide worker or set shared_worker=false"
|
|
159
|
+
);
|
|
160
|
+
return k(
|
|
161
|
+
(o) => new SharedWorker(o, { name: e, type: "module" }),
|
|
162
|
+
r.worker_url
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
if (r.worker_url === void 0) {
|
|
166
|
+
if (r.worker_classes?.Dedicated)
|
|
167
|
+
return new r.worker_classes.Dedicated({ name: e });
|
|
168
|
+
if (typeof Worker > "u")
|
|
169
|
+
throw new Error(
|
|
170
|
+
"Worker is not available; provide worker, worker_url or worker_classes.Dedicated"
|
|
171
|
+
);
|
|
172
|
+
try {
|
|
173
|
+
return new Worker(new URL(
|
|
174
|
+
/* @vite-ignore */
|
|
175
|
+
"/assets/pyodideDedicatedWorker-Bge9R9PO.js",
|
|
176
|
+
import.meta.url
|
|
177
|
+
), {
|
|
178
|
+
name: e,
|
|
179
|
+
type: "module"
|
|
180
|
+
});
|
|
181
|
+
} catch {
|
|
182
|
+
return k(
|
|
183
|
+
(s) => new Worker(s, { name: e, type: "module" }),
|
|
184
|
+
new URL("data:video/mp2t;base64,aW1wb3J0IHsgaW5pdERlZGljYXRlZFdvcmtlciB9IGZyb20gIi4vcHlvZGlkZVdlYldvcmtlci5tanMiOwppbml0RGVkaWNhdGVkV29ya2VyKHt9KTsK", import.meta.url).href
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
if (typeof Worker > "u")
|
|
189
|
+
throw new Error(
|
|
190
|
+
"Worker is not available; provide worker or set shared_worker=true"
|
|
191
|
+
);
|
|
192
|
+
return k(
|
|
193
|
+
(o) => new Worker(o, { name: e, type: "module" }),
|
|
194
|
+
r.worker_url
|
|
195
|
+
);
|
|
196
|
+
}, 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,s=new URL(e.workerState.pyodide_url),a=new URL(".",s).toString();e.workerState.debug&&console.debug("Pyodide indexURL:",a),e.workerState.pyodide=await o({packages:["micropip"],indexURL:a}),e.workerState.interruptBuffer&&e.workerState.pyodide.setInterruptBuffer(e.workerState.interruptBuffer)}e.workerState.micropip||(console.debug("Importing micropip..."),e.workerState.state.msg="Importing micropip...",e.workerState.state.progress=.3,e.workerState.micropip=e.workerState.pyodide.pyimport("micropip")),console.debug("Pyodide ready. Installing funcnodes...");for(const t of e.workerState.packages)console.log("Installing package:",t),e.workerState.state.msg=`Installing package: ${t}`,await e.workerState.micropip.install(t);return e.workerState.state.msg="Installing funcnodes",e.workerState.state.progress=.8,await e.workerState.micropip.install("funcnodes"),e.workerState.state.msg="Installing funcnodes-worker",await e.workerState.micropip.install("funcnodes-worker"),e.workerState.packages.some(t=>t.toLowerCase().endsWith(".whl")&&t.includes("funcnodes_pyodide"))?e.workerState.debug&&console.debug("Skipping PyPI funcnodes-pyodide install (wheel provided in packages)"):(e.workerState.state.msg="Installing funcnodes-pyodide",await e.workerState.micropip.install("funcnodes-pyodide")),e.workerState.state.msg="Installing funcnodes-react-flow",await e.workerState.micropip.install("funcnodes-react-flow"),e.workerState.state.msg="Importing funcnodes",console.debug("Importing funcnodes..."),await e.workerState.pyodide.runPythonAsync("import funcnodes_pyodide"),console.debug("Running post_pyodide_ready..."),await e.workerState.post_pyodide_ready?.(e.workerState),console.debug("Pyodide ready"),e.workerState.state.msg="ready",e.workerState.state.progress=.1,e.workerState.pyodideReady=!0,{pyodide:e.workerState.pyodide,micropip:e.workerState.micropip}},e.interrupt=()=>{e.workerState.interruptBuffer&&(e.workerState.interruptBuffer[0]=1)},e.list_workers=()=>Object.keys(e.workerState.worker),e.get_worker=async r=>{if(!r)throw new Error("Worker id is required");if(!e.workerState.worker[r])throw new Error(`Worker with id ${r} not found`);return await e.workerState.worker[r].make_promise,e.workerState.worker[r]},e.has_worker=r=>{if(!r)throw new Error("Worker id is required");return!!e.workerState.worker[r]},e.get_or_create_worker=async r=>{if(!r)throw new Error("Worker id is required");return e.workerState.worker[r]||(console.log("Creating worker with id",r),await e.initializeFuncNodesWorker(r)),e.get_worker(r)},e.initializeFuncNodesWorker=async r=>{try{if(!e.workerState.pyodideReadyPromise)throw new Error("Pyodide newer initialized");const{pyodide:t}=await e.workerState.pyodideReadyPromise;if(!e.has_worker(r)){e.workerState.worker[r]={worker:null,make_promise:void 0};const o=new Promise(async(s,a)=>{e.workerState.worker[r].reject_promise=a,console.debug(`Creating worker (${r})...`);const i=await t.runPythonAsync(`funcnodes_pyodide.new_worker(debug=${e.workerState.debug?1:0}, uuid="${r}")`);if(console.debug("Worker created:",i),typeof i.set_receiver=="function")i.set_receiver(self);else throw new Error("Worker does not expose a \'set_receiver\' method.");e.workerState.worker[r].worker=i,console.debug("Worker ready"),s(i)});e.workerState.worker[r].make_promise=o}return e.get_worker(r)}catch(t){throw console.error("Error during worker initialization:",t),t}},e.receivepy=(r,t)=>{try{let o={};if(typeof r=="string"?o.msg=r:o=r,o.msg===void 0)return;typeof o.msg!="string"&&(o.msg=JSON.stringify(o.msg)),t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const s=o.worker_id;if(!s)throw new Error(`Worker id not provided in receivepy(${JSON.stringify(o)})`);if(!e.workerState.worker[s])throw new Error(`Worker with id ${s} not found in receivepy(${JSON.stringify(o)})`);e.workerState.receivepy(r,s)}catch(o){console.error("Error during receivepy:",o);return}},e.receivepy_bytes=(r,t)=>{let o=r;const s=r;if(s&&typeof s.toJs=="function")try{o=s.toJs({dict_converter:Object.fromEntries})}catch{o=s.toJs()}o instanceof Map&&(o=Object.fromEntries(o.entries()));try{let a={};if(o instanceof Uint8Array?a.msg=o:a=o,a.msg===void 0)return;let i=a.msg;const n=i;if(n&&typeof n.toJs=="function")try{i=n.toJs({dict_converter:Object.fromEntries})}catch{i=n.toJs()}if(i instanceof ArrayBuffer&&(i=new Uint8Array(i)),Array.isArray(i)&&(i=Uint8Array.from(i)),!(i instanceof Uint8Array))throw new Error(`receivepy_bytes expected Uint8Array payload, got ${typeof i}`);a.msg=i,t!==void 0&&(typeof t=="string"?a.worker_id||(a.worker_id=t):a={...t,...a});const d=a.worker_id;if(!d)throw new Error("Worker id not provided in receivepy_bytes");if(!e.workerState.worker[d])throw new Error(`Worker with id ${d} not found in receivepy_bytes`);e.workerState.receivepy_bytes(a.msg,d)}catch(a){console.error("Error during receivepy_bytes:",a);return}},e.startInitialization=({debug:r=!1,receivepy:t,receivepy_bytes:o,pyodide_url:s,post_pyodide_ready:a,packages:i})=>(e.workerState.debug=r,e.workerState.pyodide_url=s||w,e.workerState.packages=i,e.workerState.receivepy=t,e.workerState.receivepy_bytes=o,e.workerState.pyodideReadyPromise=null,e.workerState.post_pyodide_ready=a,e.workerState),e.register_cmd_message=(r,t)=>{if(e.workerState.handel_register[r])throw new Error(`Command ${r} already registered`);e.workerState.handel_register[r]=t},e.register_cmd_message("ping",async r=>"pong"),e.register_cmd_message("init",async r=>{if(e.workerState.pyodideReadyPromise)throw new Error("Pyodide is already initialized");r.data&&(r.data.pyodide_url&&(e.workerState.pyodide_url=r.data.pyodide_url),r.data.packages&&(e.workerState.packages=r.data.packages),r.data.debug&&(e.workerState.debug=r.data.debug)),e.workerState.pyodideReadyPromise=e.initializePyodide()}),e.register_cmd_message("_eval",async r=>{try{const t=await e.workerState.pyodide?.runPythonAsync(r.msg||"print(\'No code provided\')");return console.log("Eval result:",t),t}catch(t){console.error("Error during _eval:",t)}}),e.register_cmd_message("state",async r=>({state:{...e.workerState.state,loaded:e.workerState.pyodideReady}})),e.register_cmd_message("worker:state",async r=>({state:{loaded:!!(await e.get_or_create_worker(r.worker_id)).worker}})),e.register_cmd_message("worker:stop",async r=>{if(!e.has_worker(r.worker_id))return;const t=await e.get_or_create_worker(r.worker_id);return t.worker&&(t.worker.stop(),t.worker=null,t.reject_promise?.("Worker stopped")),delete e.workerState.worker[r.worker_id],{state:{loaded:!1}}}),e.register_cmd_message("worker:send",async r=>{const t=await e.get_or_create_worker(r.worker_id);if(!t.worker)throw new Error("Worker is not initialized");if(typeof t.worker.receivejs!="function")throw new Error(`Worker does not support receivejs: ${typeof t.worker.receivejs}`);t.worker.receivejs(r.msg)}),e.handleMessage=async r=>{const t={original:r};r.id&&(t.id=r.id),r.toJs===void 0&&(r.toJs=!0);try{if(r.cmd){const o=r;if(e.workerState.handel_register[o.cmd])t.result=await e.workerState.handel_register[o.cmd](o);else throw new Error("Unknown command: "+o.cmd)}else throw new Error("Unknown message format: "+JSON.stringify(r))}catch(o){t.error=o.message}return t},e.read_url_params=()=>{const r=new URLSearchParams(self.location.search),t=r.get("debug")?.toLowerCase()==="true",o=r.get("pyodide_url")||void 0,s=r.get("packages")?.split(",")||[];return{debug:t,pyodide_url:o,packages:s}};const k=r=>{const t=new Set;return{add:o=>{t.add(o)},disconnect:o=>{t.delete(o)&&t.size===0&&r()},forEach:o=>{t.forEach(o)},size:()=>t.size}},c=e;c.general_initalization=r=>{const t=c.read_url_params();c.startInitialization({...r,...t})};const l=c,p=c;p.init_dedicated_worker=r=>{const t=e;t.onmessage=async s=>{const a=s.data,i=await t.handleMessage(a);t.postMessage(i)};const o={...r,receivepy:(s,a)=>{t.postMessage({cmd:"receive",msg:s,worker_id:a})},receivepy_bytes(s,a){t.postMessage({cmd:"receive_bytes",msg:s,worker_id:a})}};t.general_initalization(o)},l.init_shared_worker=r=>{const t=e,o=k(()=>{try{t.close()}catch{}});t.connectedPorts=[],t.onconnect=a=>{const i=a.ports[0];t.connectedPorts.push(i),o.add(i),i.start(),console.debug("Port connected in shared worker"),i.onmessage=async n=>{const d=n.data;if(d?.cmd==="disconnect"){o.disconnect(i),t.connectedPorts=t.connectedPorts.filter(g=>g!==i);try{i.onmessage=null}catch{}try{i.close()}catch{}return}const y=await t.handleMessage(d);i.postMessage(y)}};const s={...r,receivepy:(a,i)=>{o.forEach(n=>{n.postMessage({cmd:"receive",msg:a,worker_id:i})})},receivepy_bytes(a,i){o.forEach(n=>{n.postMessage({cmd:"receive_bytes",msg:a,worker_id:i})})}};t.general_initalization(s)},(r=>{c.init_dedicated_worker(r)})({})})();\n', b = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", W], { type: "text/javascript;charset=utf-8" });
|
|
197
|
+
function v(r) {
|
|
31
198
|
let e;
|
|
32
199
|
try {
|
|
33
|
-
if (e =
|
|
200
|
+
if (e = b && (self.URL || self.webkitURL).createObjectURL(b), !e) throw "";
|
|
34
201
|
const t = new Worker(e, {
|
|
35
202
|
name: r?.name
|
|
36
203
|
});
|
|
@@ -39,78 +206,110 @@ function j(r) {
|
|
|
39
206
|
}), t;
|
|
40
207
|
} catch {
|
|
41
208
|
return new Worker(
|
|
42
|
-
"data:text/javascript;charset=utf-8," + encodeURIComponent(
|
|
209
|
+
"data:text/javascript;charset=utf-8," + encodeURIComponent(W),
|
|
43
210
|
{
|
|
44
211
|
name: r?.name
|
|
45
212
|
}
|
|
46
213
|
);
|
|
47
214
|
}
|
|
48
215
|
}
|
|
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
|
|
216
|
+
const N = '(function(){"use strict";const w="https://cdn.jsdelivr.net/pyodide/v0.29.0/full/pyodide.mjs",e=self;e.workerState={pyodide:null,pyodide_url:w,packages:[],state:{msg:"loading",loaded:!1,progress:0},micropip:null,worker:{},pyodideReady:!1,pyodideReadyPromise:null,debug:!1,interruptBuffer:null,receivepy:(r,t)=>{},receivepy_bytes:(r,t)=>{},handel_register:{},post_pyodide_ready:void 0},e.reset=async()=>{for(const r in e.list_workers())try{const t=await e.get_worker(r);t.worker&&t.worker.stop(),t.reject_promise?.("Worker reset")}catch{}e.workerState.pyodide&&e.interrupt(),e.workerState.pyodide=null,e.workerState.micropip=null,e.workerState.worker={},e.workerState.pyodideReady=!1;try{e.workerState.interruptBuffer=new Uint8Array(new SharedArrayBuffer(1)),e.workerState.interruptBuffer[0]=0}catch{}},e.initializePyodide=async()=>{if(!e.workerState.pyodide){console.log("initializePyodide with: Debug:",e.workerState.debug,"Pyodide URL:",e.workerState.pyodide_url,"Packages:",e.workerState.packages),console.debug("Loading Pyodide..."),e.workerState.state.msg="Loading Pyodide...",e.workerState.state.progress=0,await e.reset(),console.debug("Loading Pyodide module..."),e.workerState.state.msg="Loading Pyodide module...",e.workerState.state.progress=.1;const t=await import(e.workerState.pyodide_url);console.debug("Loading Pyodide instance..."),e.workerState.state.msg="Loading Pyodide instance...",e.workerState.state.progress=.2;const o=t.loadPyodide,s=new URL(e.workerState.pyodide_url),a=new URL(".",s).toString();e.workerState.debug&&console.debug("Pyodide indexURL:",a),e.workerState.pyodide=await o({packages:["micropip"],indexURL:a}),e.workerState.interruptBuffer&&e.workerState.pyodide.setInterruptBuffer(e.workerState.interruptBuffer)}e.workerState.micropip||(console.debug("Importing micropip..."),e.workerState.state.msg="Importing micropip...",e.workerState.state.progress=.3,e.workerState.micropip=e.workerState.pyodide.pyimport("micropip")),console.debug("Pyodide ready. Installing funcnodes...");for(const t of e.workerState.packages)console.log("Installing package:",t),e.workerState.state.msg=`Installing package: ${t}`,await e.workerState.micropip.install(t);return e.workerState.state.msg="Installing funcnodes",e.workerState.state.progress=.8,await e.workerState.micropip.install("funcnodes"),e.workerState.state.msg="Installing funcnodes-worker",await e.workerState.micropip.install("funcnodes-worker"),e.workerState.packages.some(t=>t.toLowerCase().endsWith(".whl")&&t.includes("funcnodes_pyodide"))?e.workerState.debug&&console.debug("Skipping PyPI funcnodes-pyodide install (wheel provided in packages)"):(e.workerState.state.msg="Installing funcnodes-pyodide",await e.workerState.micropip.install("funcnodes-pyodide")),e.workerState.state.msg="Installing funcnodes-react-flow",await e.workerState.micropip.install("funcnodes-react-flow"),e.workerState.state.msg="Importing funcnodes",console.debug("Importing funcnodes..."),await e.workerState.pyodide.runPythonAsync("import funcnodes_pyodide"),console.debug("Running post_pyodide_ready..."),await e.workerState.post_pyodide_ready?.(e.workerState),console.debug("Pyodide ready"),e.workerState.state.msg="ready",e.workerState.state.progress=.1,e.workerState.pyodideReady=!0,{pyodide:e.workerState.pyodide,micropip:e.workerState.micropip}},e.interrupt=()=>{e.workerState.interruptBuffer&&(e.workerState.interruptBuffer[0]=1)},e.list_workers=()=>Object.keys(e.workerState.worker),e.get_worker=async r=>{if(!r)throw new Error("Worker id is required");if(!e.workerState.worker[r])throw new Error(`Worker with id ${r} not found`);return await e.workerState.worker[r].make_promise,e.workerState.worker[r]},e.has_worker=r=>{if(!r)throw new Error("Worker id is required");return!!e.workerState.worker[r]},e.get_or_create_worker=async r=>{if(!r)throw new Error("Worker id is required");return e.workerState.worker[r]||(console.log("Creating worker with id",r),await e.initializeFuncNodesWorker(r)),e.get_worker(r)},e.initializeFuncNodesWorker=async r=>{try{if(!e.workerState.pyodideReadyPromise)throw new Error("Pyodide newer initialized");const{pyodide:t}=await e.workerState.pyodideReadyPromise;if(!e.has_worker(r)){e.workerState.worker[r]={worker:null,make_promise:void 0};const o=new Promise(async(s,a)=>{e.workerState.worker[r].reject_promise=a,console.debug(`Creating worker (${r})...`);const i=await t.runPythonAsync(`funcnodes_pyodide.new_worker(debug=${e.workerState.debug?1:0}, uuid="${r}")`);if(console.debug("Worker created:",i),typeof i.set_receiver=="function")i.set_receiver(self);else throw new Error("Worker does not expose a \'set_receiver\' method.");e.workerState.worker[r].worker=i,console.debug("Worker ready"),s(i)});e.workerState.worker[r].make_promise=o}return e.get_worker(r)}catch(t){throw console.error("Error during worker initialization:",t),t}},e.receivepy=(r,t)=>{try{let o={};if(typeof r=="string"?o.msg=r:o=r,o.msg===void 0)return;typeof o.msg!="string"&&(o.msg=JSON.stringify(o.msg)),t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const s=o.worker_id;if(!s)throw new Error(`Worker id not provided in receivepy(${JSON.stringify(o)})`);if(!e.workerState.worker[s])throw new Error(`Worker with id ${s} not found in receivepy(${JSON.stringify(o)})`);e.workerState.receivepy(r,s)}catch(o){console.error("Error during receivepy:",o);return}},e.receivepy_bytes=(r,t)=>{let o=r;const s=r;if(s&&typeof s.toJs=="function")try{o=s.toJs({dict_converter:Object.fromEntries})}catch{o=s.toJs()}o instanceof Map&&(o=Object.fromEntries(o.entries()));try{let a={};if(o instanceof Uint8Array?a.msg=o:a=o,a.msg===void 0)return;let i=a.msg;const n=i;if(n&&typeof n.toJs=="function")try{i=n.toJs({dict_converter:Object.fromEntries})}catch{i=n.toJs()}if(i instanceof ArrayBuffer&&(i=new Uint8Array(i)),Array.isArray(i)&&(i=Uint8Array.from(i)),!(i instanceof Uint8Array))throw new Error(`receivepy_bytes expected Uint8Array payload, got ${typeof i}`);a.msg=i,t!==void 0&&(typeof t=="string"?a.worker_id||(a.worker_id=t):a={...t,...a});const d=a.worker_id;if(!d)throw new Error("Worker id not provided in receivepy_bytes");if(!e.workerState.worker[d])throw new Error(`Worker with id ${d} not found in receivepy_bytes`);e.workerState.receivepy_bytes(a.msg,d)}catch(a){console.error("Error during receivepy_bytes:",a);return}},e.startInitialization=({debug:r=!1,receivepy:t,receivepy_bytes:o,pyodide_url:s,post_pyodide_ready:a,packages:i})=>(e.workerState.debug=r,e.workerState.pyodide_url=s||w,e.workerState.packages=i,e.workerState.receivepy=t,e.workerState.receivepy_bytes=o,e.workerState.pyodideReadyPromise=null,e.workerState.post_pyodide_ready=a,e.workerState),e.register_cmd_message=(r,t)=>{if(e.workerState.handel_register[r])throw new Error(`Command ${r} already registered`);e.workerState.handel_register[r]=t},e.register_cmd_message("ping",async r=>"pong"),e.register_cmd_message("init",async r=>{if(e.workerState.pyodideReadyPromise)throw new Error("Pyodide is already initialized");r.data&&(r.data.pyodide_url&&(e.workerState.pyodide_url=r.data.pyodide_url),r.data.packages&&(e.workerState.packages=r.data.packages),r.data.debug&&(e.workerState.debug=r.data.debug)),e.workerState.pyodideReadyPromise=e.initializePyodide()}),e.register_cmd_message("_eval",async r=>{try{const t=await e.workerState.pyodide?.runPythonAsync(r.msg||"print(\'No code provided\')");return console.log("Eval result:",t),t}catch(t){console.error("Error during _eval:",t)}}),e.register_cmd_message("state",async r=>({state:{...e.workerState.state,loaded:e.workerState.pyodideReady}})),e.register_cmd_message("worker:state",async r=>({state:{loaded:!!(await e.get_or_create_worker(r.worker_id)).worker}})),e.register_cmd_message("worker:stop",async r=>{if(!e.has_worker(r.worker_id))return;const t=await e.get_or_create_worker(r.worker_id);return t.worker&&(t.worker.stop(),t.worker=null,t.reject_promise?.("Worker stopped")),delete e.workerState.worker[r.worker_id],{state:{loaded:!1}}}),e.register_cmd_message("worker:send",async r=>{const t=await e.get_or_create_worker(r.worker_id);if(!t.worker)throw new Error("Worker is not initialized");if(typeof t.worker.receivejs!="function")throw new Error(`Worker does not support receivejs: ${typeof t.worker.receivejs}`);t.worker.receivejs(r.msg)}),e.handleMessage=async r=>{const t={original:r};r.id&&(t.id=r.id),r.toJs===void 0&&(r.toJs=!0);try{if(r.cmd){const o=r;if(e.workerState.handel_register[o.cmd])t.result=await e.workerState.handel_register[o.cmd](o);else throw new Error("Unknown command: "+o.cmd)}else throw new Error("Unknown message format: "+JSON.stringify(r))}catch(o){t.error=o.message}return t},e.read_url_params=()=>{const r=new URLSearchParams(self.location.search),t=r.get("debug")?.toLowerCase()==="true",o=r.get("pyodide_url")||void 0,s=r.get("packages")?.split(",")||[];return{debug:t,pyodide_url:o,packages:s}};const k=r=>{const t=new Set;return{add:o=>{t.add(o)},disconnect:o=>{t.delete(o)&&t.size===0&&r()},forEach:o=>{t.forEach(o)},size:()=>t.size}},c=e;c.general_initalization=r=>{const t=c.read_url_params();c.startInitialization({...r,...t})};const l=c,p=c;p.init_dedicated_worker=r=>{const t=e;t.onmessage=async s=>{const a=s.data,i=await t.handleMessage(a);t.postMessage(i)};const o={...r,receivepy:(s,a)=>{t.postMessage({cmd:"receive",msg:s,worker_id:a})},receivepy_bytes(s,a){t.postMessage({cmd:"receive_bytes",msg:s,worker_id:a})}};t.general_initalization(o)},l.init_shared_worker=r=>{const t=e,o=k(()=>{try{t.close()}catch{}});t.connectedPorts=[],t.onconnect=a=>{const i=a.ports[0];t.connectedPorts.push(i),o.add(i),i.start(),console.debug("Port connected in shared worker"),i.onmessage=async n=>{const d=n.data;if(d?.cmd==="disconnect"){o.disconnect(i),t.connectedPorts=t.connectedPorts.filter(g=>g!==i);try{i.onmessage=null}catch{}try{i.close()}catch{}return}const y=await t.handleMessage(d);i.postMessage(y)}};const s={...r,receivepy:(a,i)=>{o.forEach(n=>{n.postMessage({cmd:"receive",msg:a,worker_id:i})})},receivepy_bytes(a,i){o.forEach(n=>{n.postMessage({cmd:"receive_bytes",msg:a,worker_id:i})})}};t.general_initalization(s)},(r=>{c.init_shared_worker(r)})({})})();\n';
|
|
217
|
+
function P(r) {
|
|
51
218
|
return new SharedWorker(
|
|
52
|
-
"data:text/javascript;charset=utf-8," + encodeURIComponent(
|
|
219
|
+
"data:text/javascript;charset=utf-8," + encodeURIComponent(N),
|
|
53
220
|
{
|
|
54
221
|
name: r?.name
|
|
55
222
|
}
|
|
56
223
|
);
|
|
57
224
|
}
|
|
58
|
-
const
|
|
225
|
+
const C = (r) => {
|
|
226
|
+
if (r.worker) return r.worker;
|
|
227
|
+
if (r.worker_url !== void 0 || r.worker_classes?.Dedicated || r.worker_classes?.Shared)
|
|
228
|
+
return S(r);
|
|
229
|
+
const e = r.uuid, t = !!r.shared_worker, o = J({
|
|
230
|
+
pageOrigin: typeof window < "u" && window.location ? window.location.origin : void 0,
|
|
231
|
+
scriptUrl: typeof import.meta < "u" ? import.meta.url : void 0
|
|
232
|
+
});
|
|
233
|
+
if (t) {
|
|
234
|
+
if (typeof SharedWorker > "u")
|
|
235
|
+
throw new Error(
|
|
236
|
+
"SharedWorker is not available; provide worker, worker_url or worker_classes.Shared"
|
|
237
|
+
);
|
|
238
|
+
if (o) return new P({ name: e });
|
|
239
|
+
try {
|
|
240
|
+
return new SharedWorker(
|
|
241
|
+
new URL(
|
|
242
|
+
/* @vite-ignore */
|
|
243
|
+
"/assets/pyodideSharedWorker-B8dBCO6o.js",
|
|
244
|
+
import.meta.url
|
|
245
|
+
),
|
|
246
|
+
{ name: e, type: "module" }
|
|
247
|
+
);
|
|
248
|
+
} catch {
|
|
249
|
+
return new P({ name: e });
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
if (typeof Worker > "u")
|
|
253
|
+
throw new Error(
|
|
254
|
+
"Worker is not available; provide worker, worker_url or worker_classes.Dedicated"
|
|
255
|
+
);
|
|
256
|
+
if (o) return new v({ name: e });
|
|
257
|
+
try {
|
|
258
|
+
return new Worker(new URL(
|
|
259
|
+
/* @vite-ignore */
|
|
260
|
+
"/assets/pyodideDedicatedWorker-Bge9R9PO.js",
|
|
261
|
+
import.meta.url
|
|
262
|
+
), {
|
|
263
|
+
name: e,
|
|
264
|
+
type: "module"
|
|
265
|
+
});
|
|
266
|
+
} catch {
|
|
267
|
+
return new v({ name: e });
|
|
268
|
+
}
|
|
269
|
+
}, F = (r, e) => {
|
|
59
270
|
if (!r?.length) return r;
|
|
60
271
|
const t = e ?? (typeof window < "u" && window.location ? window.location.href : void 0);
|
|
61
272
|
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
|
-
},
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}) : r.worker_url === void 0 ? r.worker = new r.worker_classes.Dedicated({
|
|
71
|
-
name: r.uuid
|
|
72
|
-
}) : r.worker = new Worker(r.worker_url, {
|
|
73
|
-
name: r.uuid,
|
|
74
|
-
type: "module"
|
|
75
|
-
})), r.worker);
|
|
76
|
-
class B extends P {
|
|
273
|
+
}, V = (r) => (r.worker = C({
|
|
274
|
+
uuid: r.uuid,
|
|
275
|
+
shared_worker: r.shared_worker,
|
|
276
|
+
worker_url: r.worker_url,
|
|
277
|
+
worker: r.worker,
|
|
278
|
+
worker_classes: r.worker_classes
|
|
279
|
+
}), r.worker);
|
|
280
|
+
class T extends j {
|
|
77
281
|
constructor(e) {
|
|
78
282
|
const t = {
|
|
79
|
-
uuid:
|
|
283
|
+
uuid: $(),
|
|
80
284
|
...e
|
|
81
285
|
};
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
else
|
|
87
|
-
throw new Error("worker must be an instance of Worker or SharedWorker");
|
|
88
|
-
this.postMessage({
|
|
286
|
+
super(t), this._message_hooks = [], this._disposed = !1, this._worker = V(t), this._lifecycle = new A(this._worker, {
|
|
287
|
+
worker_id: this.uuid,
|
|
288
|
+
onMessage: this.onmessage.bind(this)
|
|
289
|
+
}), this.postMessage({
|
|
89
290
|
cmd: "init",
|
|
90
291
|
data: {
|
|
91
292
|
debug: t.debug,
|
|
92
293
|
pyodide_url: t.pyodide_url,
|
|
93
|
-
packages:
|
|
294
|
+
packages: F(t.packages, t.worker_baseurl)
|
|
94
295
|
}
|
|
95
|
-
})
|
|
96
|
-
|
|
97
|
-
this.postMessage({ cmd: "state" });
|
|
98
|
-
}, 400);
|
|
99
|
-
this._workerstate = { loaded: !1, msg: "loading", progress: 0 }, this.initPromise = new Promise(async (s) => {
|
|
100
|
-
for (; !this._workerstate.loaded; )
|
|
296
|
+
}), this._lifecycle.startStatePolling(), this._workerstate = { loaded: !1, msg: "loading", progress: 0 }, this.initPromise = new Promise(async (o) => {
|
|
297
|
+
for (; !this._workerstate.loaded && !this._disposed; )
|
|
101
298
|
this._zustand?.set_progress({
|
|
102
299
|
message: this._workerstate.msg,
|
|
103
300
|
status: "info",
|
|
104
301
|
progress: this._workerstate.progress,
|
|
105
302
|
blocking: !0
|
|
106
|
-
}), await new Promise((
|
|
107
|
-
|
|
303
|
+
}), await new Promise((s) => setTimeout(s, 100));
|
|
304
|
+
this._lifecycle.stopPolling(), this._disposed || (this.is_open = !0, this._zustand?.auto_progress()), o();
|
|
108
305
|
}), this.initPromise.then(async () => {
|
|
109
|
-
if (
|
|
110
|
-
|
|
111
|
-
|
|
306
|
+
if (!this._disposed) {
|
|
307
|
+
if (t.restore_worker_state_on_load) {
|
|
308
|
+
const o = typeof t.restore_worker_state_on_load == "string" ? t.restore_worker_state_on_load : this._storage_key();
|
|
309
|
+
await this.restore_worker_state(o);
|
|
310
|
+
}
|
|
311
|
+
await this.getSyncManager().stepwise_fullsync(), t.post_worker_initialized && await t.post_worker_initialized(this);
|
|
112
312
|
}
|
|
113
|
-
await this.getSyncManager().stepwise_fullsync(), t.post_worker_initialized && await t.post_worker_initialized(this);
|
|
114
313
|
});
|
|
115
314
|
}
|
|
116
315
|
async send(e) {
|
|
@@ -121,7 +320,10 @@ class B extends P {
|
|
|
121
320
|
});
|
|
122
321
|
}
|
|
123
322
|
postMessage(e) {
|
|
124
|
-
|
|
323
|
+
this._lifecycle.postMessage(e);
|
|
324
|
+
}
|
|
325
|
+
dispose() {
|
|
326
|
+
this._disposed || (this._disposed = !0, this.is_open = !1, this._lifecycle.dispose());
|
|
125
327
|
}
|
|
126
328
|
registerMessageHook(e) {
|
|
127
329
|
return this._message_hooks.push(e), () => {
|
|
@@ -129,27 +331,29 @@ class B extends P {
|
|
|
129
331
|
};
|
|
130
332
|
}
|
|
131
333
|
onmessage(e) {
|
|
132
|
-
|
|
133
|
-
t
|
|
134
|
-
|
|
135
|
-
e.data.result
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
if (e.data.cmd
|
|
146
|
-
if (e.data.
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
if (e.data.
|
|
151
|
-
|
|
152
|
-
|
|
334
|
+
if (!this._disposed) {
|
|
335
|
+
for (const t of this._message_hooks)
|
|
336
|
+
t(e.data);
|
|
337
|
+
if (e.data.result)
|
|
338
|
+
e.data.result.state && (this._workerstate = {
|
|
339
|
+
...this._workerstate,
|
|
340
|
+
...e.data.result.state
|
|
341
|
+
}, e.data.result.state.msg && e.data.result.state.msg !== "ready" && this._zustand?.set_progress({
|
|
342
|
+
message: this._workerstate.msg,
|
|
343
|
+
status: "info",
|
|
344
|
+
progress: this._workerstate.progress,
|
|
345
|
+
blocking: !0
|
|
346
|
+
}));
|
|
347
|
+
else if (e.data.cmd) {
|
|
348
|
+
if (e.data.cmd === "receive") {
|
|
349
|
+
if (e.data.worker_id === void 0)
|
|
350
|
+
throw new Error("worker_id is undefined");
|
|
351
|
+
e.data.worker_id === this.uuid && this.getCommunicationManager().receive(JSON.parse(e.data.msg));
|
|
352
|
+
} else if (e.data.cmd === "receive_bytes") {
|
|
353
|
+
if (e.data.worker_id === void 0)
|
|
354
|
+
throw new Error("worker_id is undefined");
|
|
355
|
+
e.data.worker_id === this.uuid && this.getCommunicationManager().onbytes(e.data.msg);
|
|
356
|
+
}
|
|
153
357
|
}
|
|
154
358
|
}
|
|
155
359
|
}
|
|
@@ -158,34 +362,34 @@ class B extends P {
|
|
|
158
362
|
onProgressCallback: t,
|
|
159
363
|
root: o
|
|
160
364
|
}) {
|
|
161
|
-
const s = [],
|
|
162
|
-
let
|
|
365
|
+
const s = [], R = e.length;
|
|
366
|
+
let g = 0;
|
|
163
367
|
if (e.length === 0)
|
|
164
368
|
return "";
|
|
165
369
|
for (let d = 0; d < e.length; d++) {
|
|
166
370
|
const c = e[d], n = new FileReader(), p = new Promise((w, a) => {
|
|
167
|
-
n.onload = async (
|
|
371
|
+
n.onload = async (E) => {
|
|
168
372
|
try {
|
|
169
|
-
const
|
|
373
|
+
const l = E.target.result?.replace(/^data:.+;base64,/, ""), _ = c.webkitRelativePath || c.name, U = o ? `${o}/${_}` : _, L = await this._send_cmd({
|
|
170
374
|
cmd: "upload",
|
|
171
|
-
kwargs: { data:
|
|
375
|
+
kwargs: { data: l, filename: U },
|
|
172
376
|
wait_for_response: !0
|
|
173
377
|
});
|
|
174
|
-
|
|
175
|
-
} catch (
|
|
176
|
-
a(
|
|
378
|
+
g++, t && t(g, R), w(L);
|
|
379
|
+
} catch (l) {
|
|
380
|
+
a(l);
|
|
177
381
|
}
|
|
178
382
|
}, n.readAsDataURL(c);
|
|
179
383
|
});
|
|
180
384
|
s.push(p);
|
|
181
385
|
}
|
|
182
|
-
const
|
|
183
|
-
return
|
|
386
|
+
const y = await Promise.all(s);
|
|
387
|
+
return y.reduce((d, c) => {
|
|
184
388
|
const n = c.split("/"), p = d.split("/"), w = [];
|
|
185
389
|
for (let a = 0; a < n.length && n[a] === p[a]; a++)
|
|
186
390
|
w.push(n[a]);
|
|
187
391
|
return w.join("/");
|
|
188
|
-
},
|
|
392
|
+
}, y[0]);
|
|
189
393
|
}
|
|
190
394
|
get ready() {
|
|
191
395
|
return this._workerstate.loaded;
|
|
@@ -220,5 +424,5 @@ class B extends P {
|
|
|
220
424
|
}
|
|
221
425
|
}
|
|
222
426
|
export {
|
|
223
|
-
|
|
427
|
+
T as default
|
|
224
428
|
};
|