@daneren2005/shared-memory-ecs 1.7.0 → 1.7.1

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.
@@ -0,0 +1,11 @@
1
+ import { type WorkerOptions } from 'node:worker_threads';
2
+ export { installWorkerSelf } from './worker-self';
3
+ export default class NodeWorkerAdapter {
4
+ onmessage: ((event: {
5
+ data: unknown;
6
+ }) => void) | null;
7
+ private worker;
8
+ constructor(url: string | URL, options?: WorkerOptions);
9
+ postMessage(message: unknown): void;
10
+ terminate(): void;
11
+ }
@@ -0,0 +1,19 @@
1
+ type MessageHandler = (event: {
2
+ data: unknown;
3
+ }) => void;
4
+ interface WorkerPort {
5
+ on(event: 'message', listener: (data: unknown) => void): void;
6
+ postMessage(message: unknown): void;
7
+ }
8
+ export declare class NodeWorkerSelf {
9
+ private port;
10
+ private handler;
11
+ private pending;
12
+ constructor(port: WorkerPort);
13
+ set onmessage(handler: MessageHandler | null);
14
+ get onmessage(): MessageHandler | null;
15
+ postMessage(message: unknown): void;
16
+ private deliver;
17
+ }
18
+ export declare function installWorkerSelf(): void;
19
+ export {};
@@ -0,0 +1,34 @@
1
+ import { parentPort as e } from "node:worker_threads";
2
+ //#region src/node/worker-self.ts
3
+ var t = class {
4
+ port;
5
+ handler = null;
6
+ pending = [];
7
+ constructor(e) {
8
+ this.port = e, e.on("message", (e) => this.deliver(e));
9
+ }
10
+ set onmessage(e) {
11
+ if (this.handler = e, e) {
12
+ let t = this.pending;
13
+ this.pending = [];
14
+ for (let n of t) e({ data: n });
15
+ }
16
+ }
17
+ get onmessage() {
18
+ return this.handler;
19
+ }
20
+ postMessage(e) {
21
+ this.port.postMessage(e);
22
+ }
23
+ deliver(e) {
24
+ this.handler ? this.handler({ data: e }) : this.pending.push(e);
25
+ }
26
+ };
27
+ function n() {
28
+ if (!e) throw Error("installWorkerSelf must be called inside a worker thread");
29
+ globalThis.self = new t(e);
30
+ }
31
+ //#endregion
32
+ export { t as NodeWorkerSelf, n as installWorkerSelf };
33
+
34
+ //# sourceMappingURL=node-worker-self.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-worker-self.js","names":[],"sources":["../src/node/worker-self.ts"],"sourcesContent":["import { parentPort } from 'node:worker_threads';\n\n// Node counterpart to a Web Worker's global `self`. The ECS worker runtime drives its worker through the\n// browser onmessage/postMessage contract; under Node there is no `self`, so bridge that contract onto\n// parentPort. Messages that arrive before onmessage is assigned are buffered so the initial `init` handshake\n// is never dropped.\ntype MessageHandler = (event: { data: unknown }) => void;\ninterface WorkerPort {\n\ton(event: 'message', listener: (data: unknown) => void): void\n\tpostMessage(message: unknown): void\n}\n\nexport class NodeWorkerSelf {\n\tprivate handler: MessageHandler | null = null;\n\tprivate pending: Array<unknown> = [];\n\n\tconstructor(private port: WorkerPort) {\n\t\tport.on('message', data => this.deliver(data));\n\t}\n\n\tset onmessage(handler: MessageHandler | null) {\n\t\tthis.handler = handler;\n\t\tif(handler) {\n\t\t\tconst buffered = this.pending;\n\t\t\tthis.pending = [];\n\t\t\tfor(const data of buffered) {\n\t\t\t\thandler({ data });\n\t\t\t}\n\t\t}\n\t}\n\tget onmessage(): MessageHandler | null {\n\t\treturn this.handler;\n\t}\n\n\tpostMessage(message: unknown): void {\n\t\tthis.port.postMessage(message);\n\t}\n\n\tprivate deliver(data: unknown): void {\n\t\tif(this.handler) {\n\t\t\tthis.handler({ data });\n\t\t} else {\n\t\t\tthis.pending.push(data);\n\t\t}\n\t}\n}\n\n// Defines `globalThis.self` as the parentPort bridge so a bundled worker entry that calls\n// createEntitySystemWorker(self, ...) works under Node. Call once, before importing the worker module.\nexport function installWorkerSelf(): void {\n\tif(!parentPort) {\n\t\tthrow new Error('installWorkerSelf must be called inside a worker thread');\n\t}\n\t(globalThis as { self?: unknown }).self = new NodeWorkerSelf(parentPort);\n}\n"],"mappings":";;AAYA,IAAa,IAAb,MAA4B;CAIP;CAHpB,UAAyC;CACzC,UAAkC,CAAC;CAEnC,YAAY,GAA0B;EACrC,AADmB,KAAA,OAAA,GACnB,EAAK,GAAG,YAAW,MAAQ,KAAK,QAAQ,CAAI,CAAC;CAC9C;CAEA,IAAI,UAAU,GAAgC;EAE7C,IADA,KAAK,UAAU,GACZ,GAAS;GACX,IAAM,IAAW,KAAK;GACtB,KAAK,UAAU,CAAC;GAChB,KAAI,IAAM,KAAQ,GACjB,EAAQ,EAAE,QAAK,CAAC;EAElB;CACD;CACA,IAAI,YAAmC;EACtC,OAAO,KAAK;CACb;CAEA,YAAY,GAAwB;EACnC,KAAK,KAAK,YAAY,CAAO;CAC9B;CAEA,QAAgB,GAAqB;EACpC,AAAG,KAAK,UACP,KAAK,QAAQ,EAAE,QAAK,CAAC,IAErB,KAAK,QAAQ,KAAK,CAAI;CAExB;AACD;AAIA,SAAgB,IAA0B;CACzC,IAAG,CAAC,GACH,MAAU,MAAM,yDAAyD;CAE1E,WAAmC,OAAO,IAAI,EAAe,CAAU;AACxE"}
package/dist/node.js ADDED
@@ -0,0 +1,20 @@
1
+ import { installWorkerSelf as e } from "./node-worker-self.js";
2
+ import { Worker as t } from "node:worker_threads";
3
+ //#region src/node/node-worker-adapter.ts
4
+ var n = class {
5
+ onmessage = null;
6
+ worker;
7
+ constructor(e, n) {
8
+ this.worker = new t(e, n), this.worker.on("message", (e) => this.onmessage?.({ data: e }));
9
+ }
10
+ postMessage(e) {
11
+ this.worker.postMessage(e);
12
+ }
13
+ terminate() {
14
+ this.worker.terminate();
15
+ }
16
+ };
17
+ //#endregion
18
+ export { n as default, e as installWorkerSelf };
19
+
20
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","names":[],"sources":["../src/node/node-worker-adapter.ts"],"sourcesContent":["import { Worker as NodeWorker, type WorkerOptions } from 'node:worker_threads';\n\nexport { installWorkerSelf } from './worker-self';\n\n// Web Worker-compatible wrapper over a Node worker_threads Worker. The ECS worker runtime drives its worker\n// through the browser `worker.onmessage` / `worker.postMessage` API; Node exposes messages as EventEmitter\n// events instead, so bridge the two. Lets worker systems run on real OS threads under Node (headless sim).\nexport default class NodeWorkerAdapter {\n\tonmessage: ((event: { data: unknown }) => void) | null = null;\n\tprivate worker: NodeWorker;\n\n\tconstructor(url: string | URL, options?: WorkerOptions) {\n\t\tthis.worker = new NodeWorker(url, options);\n\t\tthis.worker.on('message', data => this.onmessage?.({ data }));\n\t}\n\n\tpostMessage(message: unknown): void {\n\t\tthis.worker.postMessage(message);\n\t}\n\n\tterminate(): void {\n\t\tvoid this.worker.terminate();\n\t}\n}\n"],"mappings":";;;AAOA,IAAqB,IAArB,MAAuC;CACtC,YAAyD;CACzD;CAEA,YAAY,GAAmB,GAAyB;EAEvD,AADA,KAAK,SAAS,IAAI,EAAW,GAAK,CAAO,GACzC,KAAK,OAAO,GAAG,YAAW,MAAQ,KAAK,YAAY,EAAE,QAAK,CAAC,CAAC;CAC7D;CAEA,YAAY,GAAwB;EACnC,KAAK,OAAO,YAAY,CAAO;CAChC;CAEA,YAAkB;EACjB,KAAU,OAAO,UAAU;CAC5B;AACD"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@daneren2005/shared-memory-ecs",
3
3
  "description": "A small, reusable Entity/Component/System core backed by shared memory.",
4
4
  "author": "Scott Jackson",
5
- "version": "1.7.0",
5
+ "version": "1.7.1",
6
6
  "type": "module",
7
7
  "sideEffects": false,
8
8
  "repository": {
@@ -27,6 +27,18 @@
27
27
  "types": "./dist/worker.d.ts",
28
28
  "default": "./dist/worker.js"
29
29
  }
30
+ },
31
+ "./node": {
32
+ "import": {
33
+ "types": "./dist/node/node-worker-adapter.d.ts",
34
+ "default": "./dist/node.js"
35
+ }
36
+ },
37
+ "./node-worker-self": {
38
+ "import": {
39
+ "types": "./dist/node/worker-self.d.ts",
40
+ "default": "./dist/node-worker-self.js"
41
+ }
30
42
  }
31
43
  },
32
44
  "files": [