@swmmrs/swmmrs 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/worker-node.js CHANGED
@@ -1,142 +1,142 @@
1
- import { parentPort, workerData, Worker as NodeWorker } from "node:worker_threads";
2
-
3
- if (!parentPort) throw new Error("worker-node.js must run in a worker thread");
4
-
5
- const data = workerData && typeof workerData === "object" ? workerData : {};
6
- const target = typeof data.target === "string"
7
- ? data.target
8
- : new URL("./lib/swmmrs/worker.js", import.meta.url).href;
9
- const workerName = typeof data.name === "string" ? data.name : "";
10
- const messageListeners = new Set();
11
- const errorListeners = new Set();
12
- const messageErrorListeners = new Set();
13
- const pendingMessages = [];
14
- let messageHandler;
15
- let messageErrorHandler;
16
-
17
- function errorEvent(error) {
18
- const value = error instanceof Error ? error : new Error(String(error));
19
- return { message: value.message, error: value, preventDefault() {} };
20
- }
21
-
22
- function dispatch(type, event) {
23
- const listeners = type === "message"
24
- ? messageListeners
25
- : type === "error" ? errorListeners : messageErrorListeners;
26
- const handler = type === "message" ? messageHandler
27
- : type === "messageerror" ? messageErrorHandler : globalThis[`on${type}`];
28
- if (type === "message" && listeners.size === 0 && typeof handler !== "function") {
29
- pendingMessages.push(event);
30
- return;
31
- }
32
- for (const listener of [...listeners]) listener(event);
33
- if (typeof handler === "function") handler(event);
34
- }
35
-
36
- function flushPendingMessages() {
37
- for (const event of pendingMessages.splice(0)) dispatch("message", event);
38
- }
39
-
40
- function setGlobal(name, value) {
41
- try {
42
- Object.defineProperty(globalThis, name, { configurable: true, writable: true, value });
43
- } catch {
44
- globalThis[name] = value;
45
- }
46
- }
47
-
48
- class NodeWebWorker {
49
- #worker;
50
- #terminated = false;
51
- #listeners = new Map();
52
- #pending = new Map();
53
- onmessage = null;
54
- onmessageerror = null;
55
- onerror = null;
56
-
57
- constructor(url, options = {}) {
58
- const childTarget = url instanceof URL ? url.href : String(url);
59
- this.#worker = new NodeWorker(new URL("./worker-node.js", import.meta.url), {
60
- type: "module",
61
- workerData: { target: childTarget, name: options.name ?? "" },
62
- });
63
- this.#worker.on("message", (value) => this.#dispatch("message", { data: value }));
64
- this.#worker.on("messageerror", (error) => this.#dispatch("messageerror", { data: error }));
65
- this.#worker.on("error", (error) => this.#dispatch("error", errorEvent(error)));
66
- this.#worker.on("exit", (code) => {
67
- if (!this.#terminated && code !== 0) this.#dispatch("error", errorEvent(new Error(`Worker exited with code ${code}`)));
68
- else if (!this.#terminated && code === 0) this.#dispatch("error", errorEvent(new Error("Worker exited unexpectedly")));
69
- });
70
- }
71
-
72
- addEventListener(type, listener) {
73
- if (typeof listener !== "function") return;
74
- const listeners = this.#listeners.get(type) ?? new Set();
75
- listeners.add(listener);
76
- this.#listeners.set(type, listeners);
77
- for (const event of this.#pending.get(type)?.splice(0) ?? []) listener(event);
78
- }
79
-
80
- removeEventListener(type, listener) {
81
- this.#listeners.get(type)?.delete(listener);
82
- }
83
-
84
- postMessage(value, transfer) {
85
- this.#worker.postMessage(value, transfer);
86
- }
87
-
88
- terminate() {
89
- this.#terminated = true;
90
- return this.#worker.terminate();
91
- }
92
-
93
- #dispatch(type, event) {
94
- const listeners = this.#listeners.get(type);
95
- const property = type === "message" ? this.onmessage
96
- : type === "messageerror" ? this.onmessageerror : this.onerror;
97
- if ((!listeners || listeners.size === 0) && typeof property !== "function") {
98
- const pending = this.#pending.get(type) ?? [];
99
- pending.push(event);
100
- this.#pending.set(type, pending);
101
- return;
102
- }
103
- for (const listener of listeners ?? []) listener(event);
104
- if (typeof property === "function") property(event);
105
- }
106
- }
107
-
108
- setGlobal("self", globalThis);
109
- setGlobal("name", workerName);
110
- setGlobal("crossOriginIsolated", true);
111
- setGlobal("Worker", NodeWebWorker);
112
- setGlobal("postMessage", (value, transfer) => parentPort.postMessage(value, transfer));
113
- setGlobal("addEventListener", (type, listener) => {
114
- if (type === "message") {
115
- messageListeners.add(listener);
116
- flushPendingMessages();
117
- } else if (type === "error") errorListeners.add(listener);
118
- else if (type === "messageerror") messageErrorListeners.add(listener);
119
- });
120
- setGlobal("removeEventListener", (type, listener) => {
121
- if (type === "message") messageListeners.delete(listener);
122
- else if (type === "error") errorListeners.delete(listener);
123
- else if (type === "messageerror") messageErrorListeners.delete(listener);
124
- });
125
- Object.defineProperty(globalThis, "onmessage", {
126
- configurable: true,
127
- get: () => messageHandler,
128
- set: (value) => {
129
- messageHandler = typeof value === "function" ? value : undefined;
130
- if (messageHandler) flushPendingMessages();
131
- },
132
- });
133
- Object.defineProperty(globalThis, "onmessageerror", {
134
- configurable: true,
135
- get: () => messageErrorHandler,
136
- set: (value) => { messageErrorHandler = typeof value === "function" ? value : undefined; },
137
- });
138
-
139
- parentPort.on("message", (value) => dispatch("message", { data: value }));
140
- parentPort.on("messageerror", (error) => dispatch("messageerror", { data: error }));
141
-
142
- await import(target);
1
+ import { parentPort, workerData, Worker as NodeWorker } from "node:worker_threads";
2
+
3
+ if (!parentPort) throw new Error("worker-node.js must run in a worker thread");
4
+
5
+ const data = workerData && typeof workerData === "object" ? workerData : {};
6
+ const target = typeof data.target === "string"
7
+ ? data.target
8
+ : new URL("./lib/swmmrs/worker.js", import.meta.url).href;
9
+ const workerName = typeof data.name === "string" ? data.name : "";
10
+ const messageListeners = new Set();
11
+ const errorListeners = new Set();
12
+ const messageErrorListeners = new Set();
13
+ const pendingMessages = [];
14
+ let messageHandler;
15
+ let messageErrorHandler;
16
+
17
+ function errorEvent(error) {
18
+ const value = error instanceof Error ? error : new Error(String(error));
19
+ return { message: value.message, error: value, preventDefault() {} };
20
+ }
21
+
22
+ function dispatch(type, event) {
23
+ const listeners = type === "message"
24
+ ? messageListeners
25
+ : type === "error" ? errorListeners : messageErrorListeners;
26
+ const handler = type === "message" ? messageHandler
27
+ : type === "messageerror" ? messageErrorHandler : globalThis[`on${type}`];
28
+ if (type === "message" && listeners.size === 0 && typeof handler !== "function") {
29
+ pendingMessages.push(event);
30
+ return;
31
+ }
32
+ for (const listener of [...listeners]) listener(event);
33
+ if (typeof handler === "function") handler(event);
34
+ }
35
+
36
+ function flushPendingMessages() {
37
+ for (const event of pendingMessages.splice(0)) dispatch("message", event);
38
+ }
39
+
40
+ function setGlobal(name, value) {
41
+ try {
42
+ Object.defineProperty(globalThis, name, { configurable: true, writable: true, value });
43
+ } catch {
44
+ globalThis[name] = value;
45
+ }
46
+ }
47
+
48
+ class NodeWebWorker {
49
+ #worker;
50
+ #terminated = false;
51
+ #listeners = new Map();
52
+ #pending = new Map();
53
+ onmessage = null;
54
+ onmessageerror = null;
55
+ onerror = null;
56
+
57
+ constructor(url, options = {}) {
58
+ const childTarget = url instanceof URL ? url.href : String(url);
59
+ this.#worker = new NodeWorker(new URL("./worker-node.js", import.meta.url), {
60
+ type: "module",
61
+ workerData: { target: childTarget, name: options.name ?? "" },
62
+ });
63
+ this.#worker.on("message", (value) => this.#dispatch("message", { data: value }));
64
+ this.#worker.on("messageerror", (error) => this.#dispatch("messageerror", { data: error }));
65
+ this.#worker.on("error", (error) => this.#dispatch("error", errorEvent(error)));
66
+ this.#worker.on("exit", (code) => {
67
+ if (!this.#terminated && code !== 0) this.#dispatch("error", errorEvent(new Error(`Worker exited with code ${code}`)));
68
+ else if (!this.#terminated && code === 0) this.#dispatch("error", errorEvent(new Error("Worker exited unexpectedly")));
69
+ });
70
+ }
71
+
72
+ addEventListener(type, listener) {
73
+ if (typeof listener !== "function") return;
74
+ const listeners = this.#listeners.get(type) ?? new Set();
75
+ listeners.add(listener);
76
+ this.#listeners.set(type, listeners);
77
+ for (const event of this.#pending.get(type)?.splice(0) ?? []) listener(event);
78
+ }
79
+
80
+ removeEventListener(type, listener) {
81
+ this.#listeners.get(type)?.delete(listener);
82
+ }
83
+
84
+ postMessage(value, transfer) {
85
+ this.#worker.postMessage(value, transfer);
86
+ }
87
+
88
+ terminate() {
89
+ this.#terminated = true;
90
+ return this.#worker.terminate();
91
+ }
92
+
93
+ #dispatch(type, event) {
94
+ const listeners = this.#listeners.get(type);
95
+ const property = type === "message" ? this.onmessage
96
+ : type === "messageerror" ? this.onmessageerror : this.onerror;
97
+ if ((!listeners || listeners.size === 0) && typeof property !== "function") {
98
+ const pending = this.#pending.get(type) ?? [];
99
+ pending.push(event);
100
+ this.#pending.set(type, pending);
101
+ return;
102
+ }
103
+ for (const listener of listeners ?? []) listener(event);
104
+ if (typeof property === "function") property(event);
105
+ }
106
+ }
107
+
108
+ setGlobal("self", globalThis);
109
+ setGlobal("name", workerName);
110
+ setGlobal("crossOriginIsolated", true);
111
+ setGlobal("Worker", NodeWebWorker);
112
+ setGlobal("postMessage", (value, transfer) => parentPort.postMessage(value, transfer));
113
+ setGlobal("addEventListener", (type, listener) => {
114
+ if (type === "message") {
115
+ messageListeners.add(listener);
116
+ flushPendingMessages();
117
+ } else if (type === "error") errorListeners.add(listener);
118
+ else if (type === "messageerror") messageErrorListeners.add(listener);
119
+ });
120
+ setGlobal("removeEventListener", (type, listener) => {
121
+ if (type === "message") messageListeners.delete(listener);
122
+ else if (type === "error") errorListeners.delete(listener);
123
+ else if (type === "messageerror") messageErrorListeners.delete(listener);
124
+ });
125
+ Object.defineProperty(globalThis, "onmessage", {
126
+ configurable: true,
127
+ get: () => messageHandler,
128
+ set: (value) => {
129
+ messageHandler = typeof value === "function" ? value : undefined;
130
+ if (messageHandler) flushPendingMessages();
131
+ },
132
+ });
133
+ Object.defineProperty(globalThis, "onmessageerror", {
134
+ configurable: true,
135
+ get: () => messageErrorHandler,
136
+ set: (value) => { messageErrorHandler = typeof value === "function" ? value : undefined; },
137
+ });
138
+
139
+ parentPort.on("message", (value) => dispatch("message", { data: value }));
140
+ parentPort.on("messageerror", (error) => dispatch("messageerror", { data: error }));
141
+
142
+ await import(target);
package/worker.js CHANGED
@@ -1 +1 @@
1
- import "./lib/swmmrs/worker.js";
1
+ import "./lib/swmmrs/worker.js";