@linkdlab/funcnodes_pyodide_react_flow 0.1.11 → 2.0.1-a0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.es.js CHANGED
@@ -1,188 +1,428 @@
1
- import { FuncNodesWorker as E } from "@linkdlab/funcnodes_react_flow";
2
- const o = [];
3
- for (let e = 0; e < 256; ++e)
4
- o.push((e + 256).toString(16).slice(1));
5
- function W(e, r = 0) {
6
- return (o[e[r + 0]] + o[e[r + 1]] + o[e[r + 2]] + o[e[r + 3]] + "-" + o[e[r + 4]] + o[e[r + 5]] + "-" + o[e[r + 6]] + o[e[r + 7]] + "-" + o[e[r + 8]] + o[e[r + 9]] + "-" + o[e[r + 10]] + o[e[r + 11]] + o[e[r + 12]] + o[e[r + 13]] + o[e[r + 14]] + o[e[r + 15]]).toLowerCase();
1
+ import { FuncNodesWorker as j } from "@linkdlab/funcnodes_react_flow";
2
+ const i = [];
3
+ for (let r = 0; r < 256; ++r)
4
+ i.push((r + 256).toString(16).slice(1));
5
+ function I(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
8
  let u;
9
- const R = new Uint8Array(16);
10
- function U() {
9
+ const z = new Uint8Array(16);
10
+ function M() {
11
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 u(R);
16
+ return u(z);
17
17
  }
18
- const I = typeof crypto < "u" && crypto.randomUUID && crypto.randomUUID.bind(crypto), f = { randomUUID: I };
19
- function L(e, r, t) {
20
- var a;
21
- if (f.randomUUID && !e)
22
- return f.randomUUID();
23
- e = e || {};
24
- const i = e.random ?? ((a = e.rng) == null ? void 0 : a.call(e)) ?? U();
25
- if (i.length < 16)
18
+ const B = typeof crypto < "u" && crypto.randomUUID && crypto.randomUUID.bind(crypto), f = { randomUUID: B };
19
+ function O(r, e, t) {
20
+ r = r || {};
21
+ const o = r.random ?? r.rng?.() ?? M();
22
+ if (o.length < 16)
26
23
  throw new Error("Random bytes length must be >= 16");
27
- return i[6] = i[6] & 15 | 64, i[8] = i[8] & 63 | 128, W(i);
24
+ return o[6] = o[6] & 15 | 64, o[8] = o[8] & 63 | 128, I(o);
28
25
  }
29
- const h = '(function(){"use strict";const d="https://cdn.jsdelivr.net/pyodide/v0.27.2/full/pyodide.mjs",e=self;e.workerState={pyodide:null,pyodide_url:d,packages:[],state:{msg:"loading",loaded:!1,progress:0},micropip:null,worker:{},pyodideReady:!1,pyodideReadyPromise:null,debug:!1,interruptBuffer:null,receivepy:(r,t)=>{},receivepy_bytes:(r,t)=>{},handel_register:{},post_pyodide_ready:void 0},e.reset=async()=>{var r;for(const t in e.list_workers())try{const o=await e.get_worker(t);o.worker&&o.worker.stop(),(r=o.reject_promise)==null||r.call(o,"Worker reset")}catch{}e.workerState.pyodide&&e.interrupt(),e.workerState.pyodide=null,e.workerState.micropip=null,e.workerState.worker={},e.workerState.pyodideReady=!1;try{e.workerState.interruptBuffer=new Uint8Array(new SharedArrayBuffer(1)),e.workerState.interruptBuffer[0]=0}catch{}},e.initializePyodide=async()=>{var r,t;if(!e.workerState.pyodide){console.log("initializePyodide with: Debug:",e.workerState.debug,"Pyodide URL:",e.workerState.pyodide_url,"Packages:",e.workerState.packages),console.debug("Loading Pyodide..."),e.workerState.state.msg="Loading Pyodide...",e.workerState.state.progress=0,await e.reset(),console.debug("Loading Pyodide module..."),e.workerState.state.msg="Loading Pyodide module...",e.workerState.state.progress=.1;const o=await import(e.workerState.pyodide_url);console.debug("Loading Pyodide instance..."),e.workerState.state.msg="Loading Pyodide instance...",e.workerState.state.progress=.2;const i=o.loadPyodide,a=e.workerState.pyodide_url.split("/").slice(0,-1).join("/");console.log(a),e.workerState.pyodide=await i({packages:["micropip"],indexURL:a}),e.workerState.interruptBuffer&&e.workerState.pyodide.setInterruptBuffer(e.workerState.interruptBuffer)}e.workerState.micropip||(console.debug("Importing micropip..."),e.workerState.state.msg="Importing micropip...",e.workerState.state.progress=.3,e.workerState.micropip=e.workerState.pyodide.pyimport("micropip")),console.debug("Pyodide ready. Installing funcnodes...");for(const o of e.workerState.packages)console.log("Installing package:",o),e.workerState.state.msg=`Installing package: ${o}`,await e.workerState.micropip.install(o);return e.workerState.state.msg="Installing funcnodes",e.workerState.state.progress=.8,await e.workerState.micropip.install("funcnodes"),e.workerState.state.msg="Installing funcnodes-worker",await e.workerState.micropip.install("funcnodes-worker"),e.workerState.state.msg="Installing funcnodes-pyodide",await e.workerState.micropip.install("funcnodes-pyodide"),e.workerState.state.msg="Installing funcnodes-react-flow",await e.workerState.micropip.install("funcnodes-react-flow"),e.workerState.state.msg="Importing funcnodes",console.debug("Importing funcnodes..."),await e.workerState.pyodide.runPythonAsync("import funcnodes_pyodide"),console.debug("Running post_pyodide_ready..."),await((t=(r=e.workerState).post_pyodide_ready)==null?void 0:t.call(r,e.workerState)),console.debug("Pyodide ready"),e.workerState.state.msg="ready",e.workerState.state.progress=.1,e.workerState.pyodideReady=!0,{pyodide:e.workerState.pyodide,micropip:e.workerState.micropip}},e.interrupt=()=>{e.workerState.interruptBuffer&&(e.workerState.interruptBuffer[0]=1)},e.list_workers=()=>Object.keys(e.workerState.worker),e.get_worker=async r=>{if(!r)throw new Error("Worker id is required");if(!e.workerState.worker[r])throw new Error(`Worker with id ${r} not found`);return await e.workerState.worker[r].make_promise,e.workerState.worker[r]},e.has_worker=r=>{if(!r)throw new Error("Worker id is required");return!!e.workerState.worker[r]},e.get_or_create_worker=async r=>{if(!r)throw new Error("Worker id is required");return e.workerState.worker[r]||(console.log("Creating worker with id",r),await e.initializeFuncNodesWorker(r)),e.get_worker(r)},e.initializeFuncNodesWorker=async r=>{try{if(!e.workerState.pyodideReadyPromise)throw new Error("Pyodide newer initialized");const{pyodide:t}=await e.workerState.pyodideReadyPromise;if(!e.has_worker(r)){e.workerState.worker[r]={worker:null,make_promise:void 0};const o=new Promise(async(i,a)=>{e.workerState.worker[r].reject_promise=a,console.debug(`Creating worker (${r})...`);const s=await t.runPythonAsync(`funcnodes_pyodide.new_worker(debug=${e.workerState.debug?1:0}, uuid="${r}")`);if(console.debug("Worker created:",s),typeof s.set_receiver=="function")s.set_receiver(self);else throw new Error("Worker does not expose a \'set_receiver\' method.");e.workerState.worker[r].worker=s,console.debug("Worker ready"),i(s)});e.workerState.worker[r].make_promise=o}return e.get_worker(r)}catch(t){throw console.error("Error during worker initialization:",t),t}},e.receivepy=(r,t)=>{try{let o={};if(typeof r=="string"?o.msg=r:o=r,o.msg===void 0)return;typeof o.msg!="string"&&(o.msg=JSON.stringify(o.msg)),t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error(`Worker id not provided in receivepy(${JSON.stringify(o)})`);if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy(${JSON.stringify(o)})`);e.workerState.receivepy(r,i)}catch(o){console.error("Error during receivepy:",o);return}},e.receivepy_bytes=(r,t)=>{r=r.toJs();try{let o={};if(r instanceof Uint8Array?o.msg=r:o=r,o.msg===void 0)return;t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error("Worker id not provided in receivepy_bytes");if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy_bytes`);e.workerState.receivepy_bytes(r,i)}catch(o){console.error("Error during receivepy_bytes:",o);return}},e.startInitialization=({debug:r=!1,receivepy:t,receivepy_bytes:o,pyodide_url:i,post_pyodide_ready:a,packages:s})=>(e.workerState.debug=r,e.workerState.pyodide_url=i||d,e.workerState.packages=s,e.workerState.receivepy=t,e.workerState.receivepy_bytes=o,e.workerState.pyodideReadyPromise=null,e.workerState.post_pyodide_ready=a,e.workerState),e.register_cmd_message=(r,t)=>{if(e.workerState.handel_register[r])throw new Error(`Command ${r} already registered`);e.workerState.handel_register[r]=t},e.register_cmd_message("ping",async r=>"pong"),e.register_cmd_message("init",async r=>{if(e.workerState.pyodideReadyPromise)throw new Error("Pyodide is already initialized");r.data&&(r.data.pyodide_url&&(e.workerState.pyodide_url=r.data.pyodide_url),r.data.packages&&(e.workerState.packages=r.data.packages),r.data.debug&&(e.workerState.debug=r.data.debug)),e.workerState.pyodideReadyPromise=e.initializePyodide()}),e.register_cmd_message("_eval",async r=>{var t;try{const o=await((t=e.workerState.pyodide)==null?void 0:t.runPythonAsync(r.msg||"print(\'No code provided\')"));return console.log("Eval result:",o),o}catch(o){console.error("Error during _eval:",o)}}),e.register_cmd_message("state",async r=>({state:{...e.workerState.state,loaded:e.workerState.pyodideReady}})),e.register_cmd_message("worker:state",async r=>({state:{loaded:!!(await e.get_or_create_worker(r.worker_id)).worker}})),e.register_cmd_message("worker:stop",async r=>{var o;if(!e.has_worker(r.worker_id))return;const t=await e.get_or_create_worker(r.worker_id);return t.worker&&(t.worker.stop(),t.worker=null,(o=t.reject_promise)==null||o.call(t,"Worker stopped")),delete e.workerState.worker[r.worker_id],{state:{loaded:!1}}}),e.register_cmd_message("worker:send",async r=>{const t=await e.get_or_create_worker(r.worker_id);if(!t.worker)throw new Error("Worker is not initialized");if(typeof t.worker.receivejs!="function")throw new Error(`Worker does not support receivejs: ${typeof t.worker.receivejs}`);t.worker.receivejs(r.msg)}),e.handleMessage=async r=>{const t={original:r};r.id&&(t.id=r.id),r.toJs===void 0&&(r.toJs=!0);try{if(r.cmd){const o=r;if(e.workerState.handel_register[o.cmd])t.result=await e.workerState.handel_register[o.cmd](o);else throw new Error("Unknown command: "+o.cmd)}else throw new Error("Unknown message format: "+JSON.stringify(r))}catch(o){t.error=o.message}return t},e.read_url_params=()=>{var a,s;const r=new URLSearchParams(self.location.search),t=((a=r.get("debug"))==null?void 0:a.toLowerCase())==="true",o=r.get("pyodide_url")||void 0,i=((s=r.get("packages"))==null?void 0:s.split(","))||[];return{debug:t,pyodide_url:o,packages:i}};const n=e;n.general_initalization=r=>{const t=n.read_url_params();n.startInitialization({...r,...t})};const w=n,c=n;c.init_dedicated_worker=r=>{const t=e;t.onmessage=async i=>{const a=i.data,s=await t.handleMessage(a);t.postMessage(s)};const o={...r,receivepy:(i,a)=>{t.postMessage({cmd:"receive",msg:i,worker_id:a})},receivepy_bytes(i,a){t.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})}};t.general_initalization(o)},w.init_shared_worker=r=>{const t=e;t.connectedPorts=[],t.onconnect=i=>{const a=i.ports[0];t.connectedPorts.push(a),a.start(),console.debug("Port connected in shared worker"),a.onmessage=async s=>{const k=s.data,p=await t.handleMessage(k);a.postMessage(p)}};const o={...r,receivepy:(i,a)=>{t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive",msg:i,worker_id:a})})},receivepy_bytes(i,a){t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})})}};t.general_initalization(o)},(r=>{n.init_dedicated_worker(r)})({})})();\n', S = typeof self < "u" && self.Blob && new Blob([h], { type: "text/javascript;charset=utf-8" });
30
- function j(e) {
31
- let r;
26
+ function $(r, e, t) {
27
+ return f.randomUUID && !r ? f.randomUUID() : O(r);
28
+ }
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) {
198
+ let e;
32
199
  try {
33
- if (r = S && (self.URL || self.webkitURL).createObjectURL(S), !r) throw "";
34
- const t = new Worker(r, {
35
- name: e == null ? void 0 : e.name
200
+ if (e = b && (self.URL || self.webkitURL).createObjectURL(b), !e) throw "";
201
+ const t = new Worker(e, {
202
+ name: r?.name
36
203
  });
37
204
  return t.addEventListener("error", () => {
38
- (self.URL || self.webkitURL).revokeObjectURL(r);
205
+ (self.URL || self.webkitURL).revokeObjectURL(e);
39
206
  }), t;
40
207
  } catch {
41
208
  return new Worker(
42
- "data:text/javascript;charset=utf-8," + encodeURIComponent(h),
209
+ "data:text/javascript;charset=utf-8," + encodeURIComponent(W),
43
210
  {
44
- name: e == null ? void 0 : e.name
211
+ name: r?.name
45
212
  }
46
213
  );
47
- } finally {
48
- r && (self.URL || self.webkitURL).revokeObjectURL(r);
49
214
  }
50
215
  }
51
- const z = '(function(){"use strict";const d="https://cdn.jsdelivr.net/pyodide/v0.27.2/full/pyodide.mjs",e=self;e.workerState={pyodide:null,pyodide_url:d,packages:[],state:{msg:"loading",loaded:!1,progress:0},micropip:null,worker:{},pyodideReady:!1,pyodideReadyPromise:null,debug:!1,interruptBuffer:null,receivepy:(r,t)=>{},receivepy_bytes:(r,t)=>{},handel_register:{},post_pyodide_ready:void 0},e.reset=async()=>{var r;for(const t in e.list_workers())try{const o=await e.get_worker(t);o.worker&&o.worker.stop(),(r=o.reject_promise)==null||r.call(o,"Worker reset")}catch{}e.workerState.pyodide&&e.interrupt(),e.workerState.pyodide=null,e.workerState.micropip=null,e.workerState.worker={},e.workerState.pyodideReady=!1;try{e.workerState.interruptBuffer=new Uint8Array(new SharedArrayBuffer(1)),e.workerState.interruptBuffer[0]=0}catch{}},e.initializePyodide=async()=>{var r,t;if(!e.workerState.pyodide){console.log("initializePyodide with: Debug:",e.workerState.debug,"Pyodide URL:",e.workerState.pyodide_url,"Packages:",e.workerState.packages),console.debug("Loading Pyodide..."),e.workerState.state.msg="Loading Pyodide...",e.workerState.state.progress=0,await e.reset(),console.debug("Loading Pyodide module..."),e.workerState.state.msg="Loading Pyodide module...",e.workerState.state.progress=.1;const o=await import(e.workerState.pyodide_url);console.debug("Loading Pyodide instance..."),e.workerState.state.msg="Loading Pyodide instance...",e.workerState.state.progress=.2;const i=o.loadPyodide,a=e.workerState.pyodide_url.split("/").slice(0,-1).join("/");console.log(a),e.workerState.pyodide=await i({packages:["micropip"],indexURL:a}),e.workerState.interruptBuffer&&e.workerState.pyodide.setInterruptBuffer(e.workerState.interruptBuffer)}e.workerState.micropip||(console.debug("Importing micropip..."),e.workerState.state.msg="Importing micropip...",e.workerState.state.progress=.3,e.workerState.micropip=e.workerState.pyodide.pyimport("micropip")),console.debug("Pyodide ready. Installing funcnodes...");for(const o of e.workerState.packages)console.log("Installing package:",o),e.workerState.state.msg=`Installing package: ${o}`,await e.workerState.micropip.install(o);return e.workerState.state.msg="Installing funcnodes",e.workerState.state.progress=.8,await e.workerState.micropip.install("funcnodes"),e.workerState.state.msg="Installing funcnodes-worker",await e.workerState.micropip.install("funcnodes-worker"),e.workerState.state.msg="Installing funcnodes-pyodide",await e.workerState.micropip.install("funcnodes-pyodide"),e.workerState.state.msg="Installing funcnodes-react-flow",await e.workerState.micropip.install("funcnodes-react-flow"),e.workerState.state.msg="Importing funcnodes",console.debug("Importing funcnodes..."),await e.workerState.pyodide.runPythonAsync("import funcnodes_pyodide"),console.debug("Running post_pyodide_ready..."),await((t=(r=e.workerState).post_pyodide_ready)==null?void 0:t.call(r,e.workerState)),console.debug("Pyodide ready"),e.workerState.state.msg="ready",e.workerState.state.progress=.1,e.workerState.pyodideReady=!0,{pyodide:e.workerState.pyodide,micropip:e.workerState.micropip}},e.interrupt=()=>{e.workerState.interruptBuffer&&(e.workerState.interruptBuffer[0]=1)},e.list_workers=()=>Object.keys(e.workerState.worker),e.get_worker=async r=>{if(!r)throw new Error("Worker id is required");if(!e.workerState.worker[r])throw new Error(`Worker with id ${r} not found`);return await e.workerState.worker[r].make_promise,e.workerState.worker[r]},e.has_worker=r=>{if(!r)throw new Error("Worker id is required");return!!e.workerState.worker[r]},e.get_or_create_worker=async r=>{if(!r)throw new Error("Worker id is required");return e.workerState.worker[r]||(console.log("Creating worker with id",r),await e.initializeFuncNodesWorker(r)),e.get_worker(r)},e.initializeFuncNodesWorker=async r=>{try{if(!e.workerState.pyodideReadyPromise)throw new Error("Pyodide newer initialized");const{pyodide:t}=await e.workerState.pyodideReadyPromise;if(!e.has_worker(r)){e.workerState.worker[r]={worker:null,make_promise:void 0};const o=new Promise(async(i,a)=>{e.workerState.worker[r].reject_promise=a,console.debug(`Creating worker (${r})...`);const s=await t.runPythonAsync(`funcnodes_pyodide.new_worker(debug=${e.workerState.debug?1:0}, uuid="${r}")`);if(console.debug("Worker created:",s),typeof s.set_receiver=="function")s.set_receiver(self);else throw new Error("Worker does not expose a \'set_receiver\' method.");e.workerState.worker[r].worker=s,console.debug("Worker ready"),i(s)});e.workerState.worker[r].make_promise=o}return e.get_worker(r)}catch(t){throw console.error("Error during worker initialization:",t),t}},e.receivepy=(r,t)=>{try{let o={};if(typeof r=="string"?o.msg=r:o=r,o.msg===void 0)return;typeof o.msg!="string"&&(o.msg=JSON.stringify(o.msg)),t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error(`Worker id not provided in receivepy(${JSON.stringify(o)})`);if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy(${JSON.stringify(o)})`);e.workerState.receivepy(r,i)}catch(o){console.error("Error during receivepy:",o);return}},e.receivepy_bytes=(r,t)=>{r=r.toJs();try{let o={};if(r instanceof Uint8Array?o.msg=r:o=r,o.msg===void 0)return;t!==void 0&&(typeof t=="string"?o.worker_id||(o.worker_id=t):o={...t,...o});const i=o.worker_id;if(!i)throw new Error("Worker id not provided in receivepy_bytes");if(!e.workerState.worker[i])throw new Error(`Worker with id ${i} not found in receivepy_bytes`);e.workerState.receivepy_bytes(r,i)}catch(o){console.error("Error during receivepy_bytes:",o);return}},e.startInitialization=({debug:r=!1,receivepy:t,receivepy_bytes:o,pyodide_url:i,post_pyodide_ready:a,packages:s})=>(e.workerState.debug=r,e.workerState.pyodide_url=i||d,e.workerState.packages=s,e.workerState.receivepy=t,e.workerState.receivepy_bytes=o,e.workerState.pyodideReadyPromise=null,e.workerState.post_pyodide_ready=a,e.workerState),e.register_cmd_message=(r,t)=>{if(e.workerState.handel_register[r])throw new Error(`Command ${r} already registered`);e.workerState.handel_register[r]=t},e.register_cmd_message("ping",async r=>"pong"),e.register_cmd_message("init",async r=>{if(e.workerState.pyodideReadyPromise)throw new Error("Pyodide is already initialized");r.data&&(r.data.pyodide_url&&(e.workerState.pyodide_url=r.data.pyodide_url),r.data.packages&&(e.workerState.packages=r.data.packages),r.data.debug&&(e.workerState.debug=r.data.debug)),e.workerState.pyodideReadyPromise=e.initializePyodide()}),e.register_cmd_message("_eval",async r=>{var t;try{const o=await((t=e.workerState.pyodide)==null?void 0:t.runPythonAsync(r.msg||"print(\'No code provided\')"));return console.log("Eval result:",o),o}catch(o){console.error("Error during _eval:",o)}}),e.register_cmd_message("state",async r=>({state:{...e.workerState.state,loaded:e.workerState.pyodideReady}})),e.register_cmd_message("worker:state",async r=>({state:{loaded:!!(await e.get_or_create_worker(r.worker_id)).worker}})),e.register_cmd_message("worker:stop",async r=>{var o;if(!e.has_worker(r.worker_id))return;const t=await e.get_or_create_worker(r.worker_id);return t.worker&&(t.worker.stop(),t.worker=null,(o=t.reject_promise)==null||o.call(t,"Worker stopped")),delete e.workerState.worker[r.worker_id],{state:{loaded:!1}}}),e.register_cmd_message("worker:send",async r=>{const t=await e.get_or_create_worker(r.worker_id);if(!t.worker)throw new Error("Worker is not initialized");if(typeof t.worker.receivejs!="function")throw new Error(`Worker does not support receivejs: ${typeof t.worker.receivejs}`);t.worker.receivejs(r.msg)}),e.handleMessage=async r=>{const t={original:r};r.id&&(t.id=r.id),r.toJs===void 0&&(r.toJs=!0);try{if(r.cmd){const o=r;if(e.workerState.handel_register[o.cmd])t.result=await e.workerState.handel_register[o.cmd](o);else throw new Error("Unknown command: "+o.cmd)}else throw new Error("Unknown message format: "+JSON.stringify(r))}catch(o){t.error=o.message}return t},e.read_url_params=()=>{var a,s;const r=new URLSearchParams(self.location.search),t=((a=r.get("debug"))==null?void 0:a.toLowerCase())==="true",o=r.get("pyodide_url")||void 0,i=((s=r.get("packages"))==null?void 0:s.split(","))||[];return{debug:t,pyodide_url:o,packages:i}};const n=e;n.general_initalization=r=>{const t=n.read_url_params();n.startInitialization({...r,...t})};const w=n,c=n;c.init_dedicated_worker=r=>{const t=e;t.onmessage=async i=>{const a=i.data,s=await t.handleMessage(a);t.postMessage(s)};const o={...r,receivepy:(i,a)=>{t.postMessage({cmd:"receive",msg:i,worker_id:a})},receivepy_bytes(i,a){t.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})}};t.general_initalization(o)},w.init_shared_worker=r=>{const t=e;t.connectedPorts=[],t.onconnect=i=>{const a=i.ports[0];t.connectedPorts.push(a),a.start(),console.debug("Port connected in shared worker"),a.onmessage=async s=>{const k=s.data,p=await t.handleMessage(k);a.postMessage(p)}};const o={...r,receivepy:(i,a)=>{t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive",msg:i,worker_id:a})})},receivepy_bytes(i,a){t.connectedPorts.forEach(s=>{s.postMessage({cmd:"receive_bytes",msg:i,worker_id:a})})}};t.general_initalization(o)},(r=>{n.init_shared_worker(r)})({})})();\n';
52
- function $(e) {
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) {
53
218
  return new SharedWorker(
54
- "data:text/javascript;charset=utf-8," + encodeURIComponent(z),
219
+ "data:text/javascript;charset=utf-8," + encodeURIComponent(N),
55
220
  {
56
- name: e == null ? void 0 : e.name
221
+ name: r?.name
57
222
  }
58
223
  );
59
224
  }
60
- const M = (e) => (e.worker || (e.worker_classes || (e.worker_classes = {
61
- Shared: $,
62
- Dedicated: j
63
- }), e.shared_worker ? e.worker_url === void 0 ? e.worker = new e.worker_classes.Shared({
64
- name: e.uuid
65
- }) : e.worker = new SharedWorker(e.worker_url, {
66
- name: e.uuid,
67
- type: "module"
68
- }) : e.worker_url === void 0 ? e.worker = new e.worker_classes.Dedicated({
69
- name: e.uuid
70
- }) : e.worker = new Worker(e.worker_url, {
71
- name: e.uuid,
72
- type: "module"
73
- })), e.worker);
74
- class J extends E {
75
- constructor(r) {
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) => {
270
+ if (!r?.length) return r;
271
+ const t = e ?? (typeof window < "u" && window.location ? window.location.href : void 0);
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;
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 {
281
+ constructor(e) {
76
282
  const t = {
77
- uuid: L(),
78
- ...r
283
+ uuid: $(),
284
+ ...e
79
285
  };
80
- if (super(t), this._message_hooks = [], this._worker = M(t), this._worker instanceof SharedWorker)
81
- t.shared_worker = !0, this._port = this._worker.port, this._port.start(), this._port.addEventListener("message", this.onmessage.bind(this));
82
- else if (this._worker instanceof Worker)
83
- t.shared_worker = !1, this._worker.addEventListener("message", this.onmessage.bind(this));
84
- else
85
- throw new Error("worker must be an instance of Worker or SharedWorker");
86
- 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({
87
290
  cmd: "init",
88
291
  data: {
89
292
  debug: t.debug,
90
293
  pyodide_url: t.pyodide_url,
91
- packages: t.packages
294
+ packages: F(t.packages, t.worker_baseurl)
295
+ }
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; )
298
+ this._zustand?.set_progress({
299
+ message: this._workerstate.msg,
300
+ status: "info",
301
+ progress: this._workerstate.progress,
302
+ blocking: !0
303
+ }), await new Promise((s) => setTimeout(s, 100));
304
+ this._lifecycle.stopPolling(), this._disposed || (this.is_open = !0, this._zustand?.auto_progress()), o();
305
+ }), this.initPromise.then(async () => {
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);
92
312
  }
93
- });
94
- const i = setInterval(() => {
95
- this.postMessage({ cmd: "state" });
96
- }, 400);
97
- this._workerstate = { loaded: !1, msg: "loading", progress: 0 }, this.initPromise = new Promise(async (a) => {
98
- var c;
99
- for (; !this._workerstate.loaded; )
100
- await new Promise((k) => setTimeout(k, 100));
101
- clearInterval(i), this.is_open = !0, (c = this._zustand) == null || c.auto_progress(), a();
102
- }), this.initPromise.then(() => {
103
- this.stepwise_fullsync();
104
313
  });
105
314
  }
106
- async send(r) {
315
+ async send(e) {
107
316
  await this.initPromise, this.postMessage({
108
317
  cmd: "worker:send",
109
- msg: JSON.stringify(r),
318
+ msg: JSON.stringify(e),
110
319
  worker_id: this.uuid
111
320
  });
112
321
  }
113
- postMessage(r) {
114
- r.worker_id = this.uuid, this._port ? this._port.postMessage(r) : this._worker.postMessage(r);
322
+ postMessage(e) {
323
+ this._lifecycle.postMessage(e);
324
+ }
325
+ dispose() {
326
+ this._disposed || (this._disposed = !0, this.is_open = !1, this._lifecycle.dispose());
115
327
  }
116
- registerMessageHook(r) {
117
- return this._message_hooks.push(r), () => {
118
- this._message_hooks = this._message_hooks.filter((t) => t !== r);
328
+ registerMessageHook(e) {
329
+ return this._message_hooks.push(e), () => {
330
+ this._message_hooks = this._message_hooks.filter((t) => t !== e);
119
331
  };
120
332
  }
121
- onmessage(r) {
122
- var t;
123
- for (const i of this._message_hooks)
124
- i(r.data);
125
- if (r.data.result)
126
- r.data.result.state && (this._workerstate = {
127
- ...this._workerstate,
128
- ...r.data.result.state
129
- }, r.data.result.state.msg && r.data.result.state.msg !== "ready" && ((t = this._zustand) == null || t.set_progress({
130
- message: this._workerstate.msg,
131
- status: "info",
132
- progress: this._workerstate.progress,
133
- blocking: !0
134
- })));
135
- else if (r.data.cmd) {
136
- if (r.data.cmd === "receive") {
137
- if (r.data.worker_id === void 0)
138
- throw new Error("worker_id is undefined");
139
- r.data.worker_id === this.uuid && this.receive(JSON.parse(r.data.msg));
140
- } else if (r.data.cmd === "receive_bytes") {
141
- if (r.data.worker_id === void 0)
142
- throw new Error("worker_id is undefined");
143
- r.data.worker_id === this.uuid && this.onbytes(r.data.msg);
333
+ onmessage(e) {
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
+ }
144
357
  }
145
358
  }
146
359
  }
147
360
  async upload_file({
148
- files: r,
361
+ files: e,
149
362
  onProgressCallback: t,
150
- root: i
363
+ root: o
151
364
  }) {
152
- const a = [], c = r.length;
153
- let k = 0;
154
- if (r.length === 0)
365
+ const s = [], R = e.length;
366
+ let g = 0;
367
+ if (e.length === 0)
155
368
  return "";
156
- for (let d = 0; d < r.length; d++) {
157
- const w = r[d], n = new FileReader(), p = new Promise((l, s) => {
158
- n.onload = async (v) => {
159
- var _;
369
+ for (let d = 0; d < e.length; d++) {
370
+ const c = e[d], n = new FileReader(), p = new Promise((w, a) => {
371
+ n.onload = async (E) => {
160
372
  try {
161
- const g = (_ = v.target.result) == null ? void 0 : _.replace(/^data:.+;base64,/, ""), m = w.webkitRelativePath || w.name, b = i ? `${i}/${m}` : m, P = await this._send_cmd({
373
+ const l = E.target.result?.replace(/^data:.+;base64,/, ""), _ = c.webkitRelativePath || c.name, U = o ? `${o}/${_}` : _, L = await this._send_cmd({
162
374
  cmd: "upload",
163
- kwargs: { data: g, filename: b },
375
+ kwargs: { data: l, filename: U },
164
376
  wait_for_response: !0
165
377
  });
166
- k++, t && t(k, c), l(P);
167
- } catch (g) {
168
- s(g);
378
+ g++, t && t(g, R), w(L);
379
+ } catch (l) {
380
+ a(l);
169
381
  }
170
- }, n.readAsDataURL(w);
382
+ }, n.readAsDataURL(c);
171
383
  });
172
- a.push(p);
384
+ s.push(p);
173
385
  }
174
- const y = await Promise.all(a);
175
- return y.reduce((d, w) => {
176
- const n = w.split("/"), p = d.split("/"), l = [];
177
- for (let s = 0; s < n.length && n[s] === p[s]; s++)
178
- l.push(n[s]);
179
- return l.join("/");
386
+ const y = await Promise.all(s);
387
+ return y.reduce((d, c) => {
388
+ const n = c.split("/"), p = d.split("/"), w = [];
389
+ for (let a = 0; a < n.length && n[a] === p[a]; a++)
390
+ w.push(n[a]);
391
+ return w.join("/");
180
392
  }, y[0]);
181
393
  }
182
394
  get ready() {
183
395
  return this._workerstate.loaded;
184
396
  }
397
+ _storage_key() {
398
+ return `funcnodes_pyodide:worker_export:${this.uuid}`;
399
+ }
400
+ _has_local_storage() {
401
+ try {
402
+ return typeof globalThis < "u" && "localStorage" in globalThis;
403
+ } catch {
404
+ return !1;
405
+ }
406
+ }
407
+ async save_worker_state({ withFiles: e = !0 } = {}) {
408
+ const t = await this.export({ withFiles: e }), o = typeof t == "string" ? t : t?.data;
409
+ if (typeof o != "string")
410
+ throw new Error("export_worker did not return a string export");
411
+ return this._has_local_storage() && globalThis.localStorage.setItem(this._storage_key(), o), o;
412
+ }
413
+ async restore_worker_state(e) {
414
+ if (!this._has_local_storage()) return !1;
415
+ const t = globalThis.localStorage.getItem(
416
+ e || this._storage_key()
417
+ );
418
+ if (!t) return !1;
419
+ try {
420
+ return await this.update_from_export(t), !0;
421
+ } catch (o) {
422
+ return console.warn("Failed to restore worker state from storage", o), !1;
423
+ }
424
+ }
185
425
  }
186
426
  export {
187
- J as default
427
+ T as default
188
428
  };