@gjsify/worker_threads 0.4.13 → 0.4.14
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/lib/esm/message-port.js +1 -1
- package/lib/types/message-port.d.ts +22 -11
- package/package.json +7 -6
package/lib/esm/message-port.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./_virtual/_rolldown/runtime.js";import{isSharedBuffer as e}from"./sab-transfer.js";import{EventEmitter as t}from"node:events";function isTransferredPortPlaceholder(e){return typeof e==`object`&&!!e&&e.__gjsifyTransferredPort===!0}var
|
|
1
|
+
import"./_virtual/_rolldown/runtime.js";import{isSharedBuffer as e}from"./sab-transfer.js";import{EventEmitter as t}from"node:events";import{MessagePort as n}from"@gjsify/message-channel";function isTransferredPortPlaceholder(e){return typeof e==`object`&&!!e&&e.__gjsifyTransferredPort===!0}var r=class MessagePort extends t{_closed=!1;_detached=!1;_otherPort=null;_inner=new n;start(){if(this._closed||this._inner._started)return;let e=this._inner._queue.slice();this._inner.start();for(let t of e)this._dispatchEmit(t)}close(){if(this._closed)return;this._closed=!0;let e=this._otherPort;this._otherPort=null,e&&(e._otherPort=null),this._inner.close(),this.emit(`close`),this.removeAllListeners()}postMessage(t,n){if(this._closed)return;let r=this._otherPort;if(!r)return;let i=[],a=[];if(n&&n.length>0){let t=new Set;for(let r of n){if(t.has(r))throw createDataCloneError(`Transfer list contains duplicate entries`);if(t.add(r),r instanceof MessagePort){if(r===this)throw createDataCloneError(`Cannot transfer source port`);if(r._closed||r._detached)throw createDataCloneError(`MessagePort in transfer list is already detached`);a.push(r);continue}let o=Object.prototype.toString.call(r).slice(8,-1);if(o===`ArrayBuffer`){let e=r;if(e.detached===!0)throw createDataCloneError(`ArrayBuffer in transfer list is detached`);i.push(e);continue}if(o===`SharedArrayBuffer`)throw createDataCloneError(`SharedArrayBuffer cannot appear in transfer list (it is shared, not transferred)`);if(!e(r))throw createDataCloneError(`Value at index ${n.indexOf(r)} of transfer list is not transferable`)}}let o=a.slice(),s=t;a.length>0&&(s=substitutePortsWithPlaceholders(t,a));let c;try{c=structuredClone(s,{transfer:i.length>0?i:void 0})}catch(e){this.emit(`messageerror`,e instanceof Error?e:Error(`Could not clone message`));return}let l=c;if(o.length>0){let e=o.map(e=>{let t=e._otherPort;e._otherPort=null,e._detached=!0,e._closed=!0;let n=new MessagePort;return n._otherPort=t,t&&(t._otherPort=n),n});l=replacePlaceholdersWithPorts(c,e)}r._receiveMessage(l)}ref(){return this}unref(){return this}_receiveMessage(e){this._closed||(this._inner._receive(e),this._inner._started&&this._dispatchEmit(e))}get _hasQueuedMessages(){return this._inner._queue.length>0}_dequeueMessage(){return this._inner._queue.shift()}get _wasTransferred(){return this._detached}_dispatchEmit(e){Promise.resolve().then(()=>{this._closed||this.emit(`message`,e)})}addEventListener(e,t,n){if(t){if(e===`message`||e===`messageerror`){Object.getPrototypeOf(Object.getPrototypeOf(this._inner)).addEventListener.call(this._inner,e,t,n);return}super.on(e,t)}}removeEventListener(e,t,n){if(t){if(e===`message`||e===`messageerror`){Object.getPrototypeOf(Object.getPrototypeOf(this._inner)).removeEventListener.call(this._inner,e,t,n);return}super.off(e,t)}}get onmessage(){return this._inner.onmessage}set onmessage(e){if(e!==null&&!this._inner._started){let t=this._inner._queue.slice();this._inner.onmessage=e;for(let e of t)this._dispatchEmit(e)}else this._inner.onmessage=e}get onmessageerror(){return this._inner.onmessageerror}set onmessageerror(e){this._inner.onmessageerror=e}on(e,t){return super.on(e,t),e===`message`&&this.start(),this}addListener(e,t){return this.on(e,t)}once(e,t){return super.once(e,t),e===`message`&&this.start(),this}};function createDataCloneError(e){let t=globalThis.DOMException;if(typeof t==`function`){let n=new t(e,`DataCloneError`);if(n.code===void 0)try{Object.defineProperty(n,`code`,{value:25,configurable:!0})}catch{}return n}let n=Error(e);return n.name=`DataCloneError`,n.code=25,n}function substitutePortsWithPlaceholders(e,t){let n=new Map;for(let e=0;e<t.length;e++)n.set(t[e],e);function walk(e,t){if(typeof e!=`object`||!e)return e;if(e instanceof r){let t=n.get(e);return t===void 0?e:{__gjsifyTransferredPort:!0,index:t}}if(t.has(e))return t.get(e);if(Array.isArray(e)){let n=[];t.set(e,n);for(let r=0;r<e.length;r++)r in e&&(n[r]=walk(e[r],t));return n}if(Object.prototype.toString.call(e).slice(8,-1)===`Object`){let n={};t.set(e,n);for(let r of Object.keys(e))n[r]=walk(e[r],t);return n}return e}return walk(e,new Map)}function replacePlaceholdersWithPorts(e,t){function walk(e,n){if(typeof e!=`object`||!e)return e;if(isTransferredPortPlaceholder(e))return t[e.index];if(n.has(e))return n.get(e);if(Array.isArray(e)){n.set(e,e);for(let t=0;t<e.length;t++)t in e&&(e[t]=walk(e[t],n));return e}if(Object.prototype.toString.call(e).slice(8,-1)===`Object`){n.set(e,e);for(let t of Object.keys(e))e[t]=walk(e[t],n);return e}return e}return walk(e,new Map)}export{r as MessagePort};
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { EventEmitter } from 'node:events';
|
|
2
|
+
import { MessagePort as SharedMessagePort } from '@gjsify/message-channel';
|
|
2
3
|
export declare class MessagePort extends EventEmitter {
|
|
3
|
-
private _started;
|
|
4
4
|
private _closed;
|
|
5
5
|
private _detached;
|
|
6
|
-
private _messageQueue;
|
|
7
6
|
/** @internal Linked port for in-process communication */
|
|
8
7
|
_otherPort: MessagePort | null;
|
|
9
|
-
/** @internal
|
|
10
|
-
|
|
8
|
+
/** @internal W3C-surface delegate from `@gjsify/message-channel`. Owns the
|
|
9
|
+
* canonical started/queue/closed state — the wrapper mirrors lifecycle
|
|
10
|
+
* events to the EventEmitter side. */
|
|
11
|
+
_inner: SharedMessagePort;
|
|
11
12
|
start(): void;
|
|
12
13
|
close(): void;
|
|
13
14
|
postMessage(value: unknown, transferList?: unknown[]): void;
|
|
@@ -18,15 +19,25 @@ export declare class MessagePort extends EventEmitter {
|
|
|
18
19
|
_dequeueMessage(): unknown | undefined;
|
|
19
20
|
/** @internal Has this port been transferred elsewhere? */
|
|
20
21
|
get _wasTransferred(): boolean;
|
|
21
|
-
private
|
|
22
|
-
private _dispatchMessage;
|
|
22
|
+
private _dispatchEmit;
|
|
23
23
|
/**
|
|
24
|
-
* Web-compatible addEventListener.
|
|
25
|
-
*
|
|
26
|
-
*
|
|
24
|
+
* Web-compatible addEventListener. For `'message'` (and `'messageerror'`),
|
|
25
|
+
* routes through the inner shared MessagePort which dispatches a
|
|
26
|
+
* MessageEvent. For Node-only signals like `'close'`, routes to the
|
|
27
|
+
* EventEmitter side so `port.emit('close')` reaches the listener.
|
|
28
|
+
*
|
|
29
|
+
* Does NOT auto-start the port — matches Node + W3C HTML §9.4.4. Use
|
|
30
|
+
* `port.start()` explicitly, or attach via `port.on('message')` /
|
|
31
|
+
* `port.onmessage = fn` (both auto-start).
|
|
27
32
|
*/
|
|
28
|
-
addEventListener(type: string, listener:
|
|
29
|
-
removeEventListener(type: string, listener:
|
|
33
|
+
addEventListener(type: string, listener: any, options?: any): void;
|
|
34
|
+
removeEventListener(type: string, listener: any, options?: any): void;
|
|
35
|
+
/** W3C `onmessage` IDL attribute — delegated to the inner. Assigning a
|
|
36
|
+
* non-null handler auto-starts both surfaces (matches W3C HTML spec). */
|
|
37
|
+
get onmessage(): any;
|
|
38
|
+
set onmessage(fn: any);
|
|
39
|
+
get onmessageerror(): any;
|
|
40
|
+
set onmessageerror(fn: any);
|
|
30
41
|
on(event: string | symbol, listener: (...args: unknown[]) => void): this;
|
|
31
42
|
addListener(event: string | symbol, listener: (...args: unknown[]) => void): this;
|
|
32
43
|
once(event: string | symbol, listener: (...args: unknown[]) => void): this;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gjsify/worker_threads",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.14",
|
|
4
4
|
"description": "Node.js worker_threads module for Gjs",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"module": "lib/esm/index.js",
|
|
@@ -33,16 +33,17 @@
|
|
|
33
33
|
"worker_threads"
|
|
34
34
|
],
|
|
35
35
|
"devDependencies": {
|
|
36
|
-
"@gjsify/cli": "^0.4.
|
|
37
|
-
"@gjsify/node-globals": "^0.4.
|
|
38
|
-
"@gjsify/unit": "^0.4.
|
|
36
|
+
"@gjsify/cli": "^0.4.14",
|
|
37
|
+
"@gjsify/node-globals": "^0.4.14",
|
|
38
|
+
"@gjsify/unit": "^0.4.14",
|
|
39
39
|
"@types/node": "^25.6.2",
|
|
40
40
|
"typescript": "^6.0.3"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"@girs/gio-2.0": "2.88.0-4.0.0-rc.15",
|
|
44
44
|
"@girs/glib-2.0": "2.88.0-4.0.0-rc.15",
|
|
45
|
-
"@gjsify/events": "^0.4.
|
|
46
|
-
"@gjsify/
|
|
45
|
+
"@gjsify/events": "^0.4.14",
|
|
46
|
+
"@gjsify/message-channel": "^0.4.14",
|
|
47
|
+
"@gjsify/sab-native": "^0.4.14"
|
|
47
48
|
}
|
|
48
49
|
}
|