@bytecodealliance/preview3-shim 0.2.1 → 0.3.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/dist/browser/cli/environment.d.ts +10 -0
- package/dist/browser/cli/environment.js +15 -0
- package/dist/browser/cli/exit.d.ts +9 -0
- package/dist/browser/cli/exit.js +11 -0
- package/dist/browser/cli/run.d.ts +6 -0
- package/dist/browser/cli/run.js +7 -0
- package/dist/browser/cli/stderr.d.ts +7 -0
- package/dist/browser/cli/stderr.js +7 -0
- package/dist/browser/cli/stdin.d.ts +7 -0
- package/dist/browser/cli/stdin.js +7 -0
- package/dist/browser/cli/stdout.d.ts +7 -0
- package/dist/browser/cli/stdout.js +7 -0
- package/dist/browser/cli/terminal-input.d.ts +8 -0
- package/dist/browser/cli/terminal-input.js +5 -0
- package/dist/browser/cli/terminal-output.d.ts +8 -0
- package/dist/browser/cli/terminal-output.js +5 -0
- package/dist/browser/cli/terminal-stderr.d.ts +7 -0
- package/dist/browser/cli/terminal-stderr.js +7 -0
- package/dist/browser/cli/terminal-stdin.d.ts +7 -0
- package/dist/browser/cli/terminal-stdin.js +7 -0
- package/dist/browser/cli/terminal-stdout.d.ts +7 -0
- package/dist/browser/cli/terminal-stdout.js +7 -0
- package/dist/browser/cli.d.ts +11 -0
- package/dist/browser/cli.js +11 -0
- package/dist/browser/clocks/monotonic-clock.d.ts +13 -0
- package/dist/browser/clocks/monotonic-clock.js +19 -0
- package/dist/browser/clocks/system-clock.d.ts +9 -0
- package/dist/browser/clocks/system-clock.js +11 -0
- package/dist/browser/clocks/types.d.ts +3 -0
- package/dist/browser/clocks/types.js +1 -0
- package/dist/browser/clocks.d.ts +3 -0
- package/dist/browser/clocks.js +3 -0
- package/dist/browser/filesystem/preopens.d.ts +7 -0
- package/dist/browser/filesystem/preopens.js +7 -0
- package/dist/browser/filesystem/types.d.ts +33 -0
- package/dist/browser/filesystem/types.js +81 -0
- package/dist/browser/filesystem.d.ts +2 -0
- package/dist/browser/filesystem.js +2 -0
- package/dist/browser/http/client.d.ts +7 -0
- package/dist/browser/http/client.js +7 -0
- package/dist/browser/http/handler.d.ts +7 -0
- package/dist/browser/http/handler.js +7 -0
- package/dist/browser/http/types.d.ts +50 -0
- package/dist/browser/http/types.js +114 -0
- package/dist/browser/http.d.ts +3 -0
- package/dist/browser/http.js +3 -0
- package/dist/browser/index.d.ts +6 -0
- package/dist/browser/index.js +6 -0
- package/dist/browser/random/insecure-seed.d.ts +6 -0
- package/dist/browser/random/insecure-seed.js +7 -0
- package/dist/browser/random/insecure.d.ts +8 -0
- package/dist/browser/random/insecure.js +11 -0
- package/dist/browser/random/random.d.ts +8 -0
- package/dist/browser/random/random.js +11 -0
- package/dist/browser/random.d.ts +3 -0
- package/dist/browser/random.js +3 -0
- package/dist/browser/sockets/ip-name-lookup.d.ts +7 -0
- package/dist/browser/sockets/ip-name-lookup.js +7 -0
- package/dist/browser/sockets/types.d.ts +51 -0
- package/dist/browser/sockets/types.js +129 -0
- package/dist/browser/sockets.d.ts +2 -0
- package/dist/browser/sockets.js +2 -0
- package/dist/common/errors.d.ts +3 -0
- package/dist/common/errors.js +5 -0
- package/dist/nodejs/cli.js +2 -1
- package/dist/nodejs/filesystem/descriptor.js +2 -1
- package/dist/nodejs/http/client.js +2 -1
- package/dist/nodejs/http/server.js +2 -1
- package/dist/nodejs/sockets/tcp.js +2 -1
- package/dist/nodejs/sockets/udp.js +2 -1
- package/dist/nodejs/workers/cli-worker.bundle.js +88 -0
- package/dist/nodejs/workers/filesystem-worker.bundle.js +236 -0
- package/dist/nodejs/workers/http-worker.bundle.js +403 -0
- package/dist/nodejs/workers/resource-worker.d.ts +1 -1
- package/dist/nodejs/workers/resource-worker.js +5 -5
- package/dist/nodejs/workers/tcp-worker.bundle.js +496 -0
- package/dist/nodejs/workers/udp-worker.bundle.js +270 -0
- package/package.json +15 -6
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
declare function getInsecureRandomBytes(maxLen: bigint): Uint8Array;
|
|
2
|
+
declare function getInsecureRandomU64(): bigint;
|
|
3
|
+
declare const _default: {
|
|
4
|
+
getInsecureRandomBytes: typeof getInsecureRandomBytes;
|
|
5
|
+
getInsecureRandomU64: typeof getInsecureRandomU64;
|
|
6
|
+
};
|
|
7
|
+
export default _default;
|
|
8
|
+
export type * from "../../../types/interfaces/wasi-random-insecure.d.ts";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { insecure } from "@bytecodealliance/preview2-shim/random";
|
|
2
|
+
function getInsecureRandomBytes(maxLen) {
|
|
3
|
+
return insecure.getInsecureRandomBytes(maxLen);
|
|
4
|
+
}
|
|
5
|
+
function getInsecureRandomU64() {
|
|
6
|
+
return insecure.getInsecureRandomU64();
|
|
7
|
+
}
|
|
8
|
+
export default {
|
|
9
|
+
getInsecureRandomBytes,
|
|
10
|
+
getInsecureRandomU64,
|
|
11
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
declare function getRandomBytes(maxLen: bigint): Uint8Array;
|
|
2
|
+
declare function getRandomU64(): bigint;
|
|
3
|
+
declare const _default: {
|
|
4
|
+
getRandomBytes: typeof getRandomBytes;
|
|
5
|
+
getRandomU64: typeof getRandomU64;
|
|
6
|
+
};
|
|
7
|
+
export default _default;
|
|
8
|
+
export type * from "../../../types/interfaces/wasi-random-random.d.ts";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { random } from "@bytecodealliance/preview2-shim/random";
|
|
2
|
+
function getRandomBytes(maxLen) {
|
|
3
|
+
return random.getRandomBytes(maxLen);
|
|
4
|
+
}
|
|
5
|
+
function getRandomU64() {
|
|
6
|
+
return random.getRandomU64();
|
|
7
|
+
}
|
|
8
|
+
export default {
|
|
9
|
+
getRandomBytes,
|
|
10
|
+
getRandomU64,
|
|
11
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { IpAddress } from "../../../types/interfaces/wasi-sockets-ip-name-lookup.d.ts";
|
|
2
|
+
declare function resolveAddresses(name: string): Promise<Array<IpAddress>>;
|
|
3
|
+
declare const _default: {
|
|
4
|
+
resolveAddresses: typeof resolveAddresses;
|
|
5
|
+
};
|
|
6
|
+
export default _default;
|
|
7
|
+
export type * from "../../../types/interfaces/wasi-sockets-ip-name-lookup.d.ts";
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { Duration, ErrorCode, IpAddressFamily, IpSocketAddress, Result, TcpSocket as TcpSocketT, UdpSocket as UdpSocketT } from "../../../types/interfaces/wasi-sockets-types.d.ts";
|
|
2
|
+
export declare class TcpSocket implements TcpSocketT {
|
|
3
|
+
static create(addressFamily: IpAddressFamily): TcpSocket;
|
|
4
|
+
bind(localAddress: IpSocketAddress): void;
|
|
5
|
+
connect(remoteAddress: IpSocketAddress): Promise<void>;
|
|
6
|
+
listen(): ReadableStream<TcpSocketT>;
|
|
7
|
+
send(data: ReadableStream<number>): Promise<Result<void, ErrorCode>>;
|
|
8
|
+
receive(): [ReadableStream<number>, Promise<Result<void, ErrorCode>>];
|
|
9
|
+
getLocalAddress(): IpSocketAddress;
|
|
10
|
+
getRemoteAddress(): IpSocketAddress;
|
|
11
|
+
getIsListening(): boolean;
|
|
12
|
+
getAddressFamily(): IpAddressFamily;
|
|
13
|
+
setListenBacklogSize(value: bigint): void;
|
|
14
|
+
getKeepAliveEnabled(): boolean;
|
|
15
|
+
setKeepAliveEnabled(value: boolean): void;
|
|
16
|
+
getKeepAliveIdleTime(): Duration;
|
|
17
|
+
setKeepAliveIdleTime(value: Duration): void;
|
|
18
|
+
getKeepAliveInterval(): Duration;
|
|
19
|
+
setKeepAliveInterval(value: Duration): void;
|
|
20
|
+
getKeepAliveCount(): number;
|
|
21
|
+
setKeepAliveCount(value: number): void;
|
|
22
|
+
getHopLimit(): number;
|
|
23
|
+
setHopLimit(value: number): void;
|
|
24
|
+
getReceiveBufferSize(): bigint;
|
|
25
|
+
setReceiveBufferSize(value: bigint): void;
|
|
26
|
+
getSendBufferSize(): bigint;
|
|
27
|
+
setSendBufferSize(value: bigint): void;
|
|
28
|
+
}
|
|
29
|
+
export declare class UdpSocket implements UdpSocketT {
|
|
30
|
+
static create(addressFamily: IpAddressFamily): UdpSocket;
|
|
31
|
+
bind(localAddress: IpSocketAddress): void;
|
|
32
|
+
connect(remoteAddress: IpSocketAddress): void;
|
|
33
|
+
disconnect(): void;
|
|
34
|
+
send(data: Uint8Array, remoteAddress: IpSocketAddress | undefined): Promise<void>;
|
|
35
|
+
receive(): Promise<[Uint8Array, IpSocketAddress]>;
|
|
36
|
+
getLocalAddress(): IpSocketAddress;
|
|
37
|
+
getRemoteAddress(): IpSocketAddress;
|
|
38
|
+
getAddressFamily(): IpAddressFamily;
|
|
39
|
+
getUnicastHopLimit(): number;
|
|
40
|
+
setUnicastHopLimit(value: number): void;
|
|
41
|
+
getReceiveBufferSize(): bigint;
|
|
42
|
+
setReceiveBufferSize(value: bigint): void;
|
|
43
|
+
getSendBufferSize(): bigint;
|
|
44
|
+
setSendBufferSize(value: bigint): void;
|
|
45
|
+
}
|
|
46
|
+
declare const _default: {
|
|
47
|
+
TcpSocket: typeof TcpSocket;
|
|
48
|
+
UdpSocket: typeof UdpSocket;
|
|
49
|
+
};
|
|
50
|
+
export default _default;
|
|
51
|
+
export type * from "../../../types/interfaces/wasi-sockets-types.d.ts";
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { Todo } from "../../common/errors.js";
|
|
2
|
+
export class TcpSocket {
|
|
3
|
+
static create(addressFamily) {
|
|
4
|
+
throw new Todo();
|
|
5
|
+
}
|
|
6
|
+
bind(localAddress) {
|
|
7
|
+
throw new Todo();
|
|
8
|
+
}
|
|
9
|
+
connect(remoteAddress) {
|
|
10
|
+
throw new Todo();
|
|
11
|
+
}
|
|
12
|
+
listen() {
|
|
13
|
+
throw new Todo();
|
|
14
|
+
}
|
|
15
|
+
send(data) {
|
|
16
|
+
throw new Todo();
|
|
17
|
+
}
|
|
18
|
+
receive() {
|
|
19
|
+
throw new Todo();
|
|
20
|
+
}
|
|
21
|
+
getLocalAddress() {
|
|
22
|
+
throw new Todo();
|
|
23
|
+
}
|
|
24
|
+
getRemoteAddress() {
|
|
25
|
+
throw new Todo();
|
|
26
|
+
}
|
|
27
|
+
getIsListening() {
|
|
28
|
+
throw new Todo();
|
|
29
|
+
}
|
|
30
|
+
getAddressFamily() {
|
|
31
|
+
throw new Todo();
|
|
32
|
+
}
|
|
33
|
+
setListenBacklogSize(value) {
|
|
34
|
+
throw new Todo();
|
|
35
|
+
}
|
|
36
|
+
getKeepAliveEnabled() {
|
|
37
|
+
throw new Todo();
|
|
38
|
+
}
|
|
39
|
+
setKeepAliveEnabled(value) {
|
|
40
|
+
throw new Todo();
|
|
41
|
+
}
|
|
42
|
+
getKeepAliveIdleTime() {
|
|
43
|
+
throw new Todo();
|
|
44
|
+
}
|
|
45
|
+
setKeepAliveIdleTime(value) {
|
|
46
|
+
throw new Todo();
|
|
47
|
+
}
|
|
48
|
+
getKeepAliveInterval() {
|
|
49
|
+
throw new Todo();
|
|
50
|
+
}
|
|
51
|
+
setKeepAliveInterval(value) {
|
|
52
|
+
throw new Todo();
|
|
53
|
+
}
|
|
54
|
+
getKeepAliveCount() {
|
|
55
|
+
throw new Todo();
|
|
56
|
+
}
|
|
57
|
+
setKeepAliveCount(value) {
|
|
58
|
+
throw new Todo();
|
|
59
|
+
}
|
|
60
|
+
getHopLimit() {
|
|
61
|
+
throw new Todo();
|
|
62
|
+
}
|
|
63
|
+
setHopLimit(value) {
|
|
64
|
+
throw new Todo();
|
|
65
|
+
}
|
|
66
|
+
getReceiveBufferSize() {
|
|
67
|
+
throw new Todo();
|
|
68
|
+
}
|
|
69
|
+
setReceiveBufferSize(value) {
|
|
70
|
+
throw new Todo();
|
|
71
|
+
}
|
|
72
|
+
getSendBufferSize() {
|
|
73
|
+
throw new Todo();
|
|
74
|
+
}
|
|
75
|
+
setSendBufferSize(value) {
|
|
76
|
+
throw new Todo();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export class UdpSocket {
|
|
80
|
+
static create(addressFamily) {
|
|
81
|
+
throw new Todo();
|
|
82
|
+
}
|
|
83
|
+
bind(localAddress) {
|
|
84
|
+
throw new Todo();
|
|
85
|
+
}
|
|
86
|
+
connect(remoteAddress) {
|
|
87
|
+
throw new Todo();
|
|
88
|
+
}
|
|
89
|
+
disconnect() {
|
|
90
|
+
throw new Todo();
|
|
91
|
+
}
|
|
92
|
+
send(data, remoteAddress) {
|
|
93
|
+
throw new Todo();
|
|
94
|
+
}
|
|
95
|
+
receive() {
|
|
96
|
+
throw new Todo();
|
|
97
|
+
}
|
|
98
|
+
getLocalAddress() {
|
|
99
|
+
throw new Todo();
|
|
100
|
+
}
|
|
101
|
+
getRemoteAddress() {
|
|
102
|
+
throw new Todo();
|
|
103
|
+
}
|
|
104
|
+
getAddressFamily() {
|
|
105
|
+
throw new Todo();
|
|
106
|
+
}
|
|
107
|
+
getUnicastHopLimit() {
|
|
108
|
+
throw new Todo();
|
|
109
|
+
}
|
|
110
|
+
setUnicastHopLimit(value) {
|
|
111
|
+
throw new Todo();
|
|
112
|
+
}
|
|
113
|
+
getReceiveBufferSize() {
|
|
114
|
+
throw new Todo();
|
|
115
|
+
}
|
|
116
|
+
setReceiveBufferSize(value) {
|
|
117
|
+
throw new Todo();
|
|
118
|
+
}
|
|
119
|
+
getSendBufferSize() {
|
|
120
|
+
throw new Todo();
|
|
121
|
+
}
|
|
122
|
+
setSendBufferSize(value) {
|
|
123
|
+
throw new Todo();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
export default {
|
|
127
|
+
TcpSocket,
|
|
128
|
+
UdpSocket,
|
|
129
|
+
};
|
package/dist/nodejs/cli.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import process from "node:process";
|
|
2
2
|
import { Readable } from "node:stream";
|
|
3
|
+
import { Worker } from "node:worker_threads";
|
|
3
4
|
import { ResourceWorker } from "./workers/resource-worker.js";
|
|
4
5
|
import { StreamReader, readableByteStreamFromReader } from "./stream.js";
|
|
5
6
|
import { future } from "./future.js";
|
|
@@ -16,7 +17,7 @@ export const environment = {
|
|
|
16
17
|
};
|
|
17
18
|
let WORKER = null;
|
|
18
19
|
function worker() {
|
|
19
|
-
return (WORKER ??= new ResourceWorker(new URL("./workers/cli-worker.js", import.meta.url)));
|
|
20
|
+
return (WORKER ??= new ResourceWorker(() => new Worker(new URL("./workers/cli-worker.bundle.js", import.meta.url))));
|
|
20
21
|
}
|
|
21
22
|
/**
|
|
22
23
|
* Map a Node.js error to a WIT error-code enum value.
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import fs from "node:fs/promises";
|
|
2
2
|
import nodePath from "node:path";
|
|
3
3
|
import process from "node:process";
|
|
4
|
+
import { Worker } from "node:worker_threads";
|
|
4
5
|
import { StreamReader, readableByteStreamFromReader } from "../stream.js";
|
|
5
6
|
import { FutureReader } from "../future.js";
|
|
6
7
|
import { ResourceWorker } from "../workers/resource-worker.js";
|
|
@@ -10,7 +11,7 @@ import { wasiTypeFromDirent } from "./utils.js";
|
|
|
10
11
|
const symbolDispose = Symbol.dispose || Symbol.for("dispose");
|
|
11
12
|
let WORKER = null;
|
|
12
13
|
function worker() {
|
|
13
|
-
return (WORKER ??= new ResourceWorker(new URL("../workers/filesystem-worker.js", import.meta.url)));
|
|
14
|
+
return (WORKER ??= new ResourceWorker(() => new Worker(new URL("../workers/filesystem-worker.bundle.js", import.meta.url))));
|
|
14
15
|
}
|
|
15
16
|
class Descriptor {
|
|
16
17
|
/** Node.js file handle for file operations (FileHandle from fs.promises.open) */
|
|
@@ -8,7 +8,7 @@ import { Response } from "./response.js";
|
|
|
8
8
|
import { _fieldsFromEntriesChecked, _readTrailersForTransport, _trailerResultFromEntries, } from "./fields.js";
|
|
9
9
|
let WORKER = null;
|
|
10
10
|
function worker() {
|
|
11
|
-
return (WORKER ??= new ResourceWorker(new URL("../workers/http-worker.js", import.meta.url)));
|
|
11
|
+
return (WORKER ??= new ResourceWorker(() => new Worker(new URL("../workers/http-worker.bundle.js", import.meta.url))));
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
14
|
* HTTP client interface.
|
|
@@ -136,3 +136,4 @@ class TrailerFutureReader extends FutureReader {
|
|
|
136
136
|
super.close();
|
|
137
137
|
}
|
|
138
138
|
}
|
|
139
|
+
import { Worker } from "node:worker_threads";
|
|
@@ -9,7 +9,7 @@ import { HttpError } from "./error.js";
|
|
|
9
9
|
import { _fieldsFromEntriesChecked, _readTrailersForTransport, _trailerResultFromEntries, } from "./fields.js";
|
|
10
10
|
let WORKER = null;
|
|
11
11
|
function worker() {
|
|
12
|
-
return (WORKER ??= new ResourceWorker(new URL("../workers/http-worker.js", import.meta.url)));
|
|
12
|
+
return (WORKER ??= new ResourceWorker(() => new Worker(new URL("../workers/http-worker.bundle.js", import.meta.url))));
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
15
15
|
* HttpServer uses a background worker thread to handle raw HTTP connections,
|
|
@@ -125,3 +125,4 @@ const requestFromParts = (parts) => {
|
|
|
125
125
|
req.setPathWithQuery(url);
|
|
126
126
|
return req;
|
|
127
127
|
};
|
|
128
|
+
import { Worker } from "node:worker_threads";
|
|
@@ -6,7 +6,7 @@ import { isWildcardIpAddress, isUnicastIpAddress, isMulticastIpAddress, isIpv4Ma
|
|
|
6
6
|
let WORKER = null;
|
|
7
7
|
const symbolDispose = Symbol.dispose || Symbol.for("dispose");
|
|
8
8
|
function worker() {
|
|
9
|
-
return (WORKER ??= new ResourceWorker(new URL("../workers/tcp-worker.js", import.meta.url)));
|
|
9
|
+
return (WORKER ??= new ResourceWorker(() => new Worker(new URL("../workers/tcp-worker.bundle.js", import.meta.url))));
|
|
10
10
|
}
|
|
11
11
|
let TCP_CREATE_TOKEN = null;
|
|
12
12
|
function token() {
|
|
@@ -721,3 +721,4 @@ export class TcpSocket {
|
|
|
721
721
|
!isIpv4MappedAddress(remoteAddress));
|
|
722
722
|
}
|
|
723
723
|
}
|
|
724
|
+
import { Worker } from "node:worker_threads";
|
|
@@ -3,7 +3,7 @@ import { SocketError } from "./error.js";
|
|
|
3
3
|
import { isWildcardIpAddress, isUnicastIpAddress, isIpv4MappedAddress, isBindableIpAddress, IP_ADDRESS_FAMILY, } from "./address.js";
|
|
4
4
|
let WORKER = null;
|
|
5
5
|
function worker() {
|
|
6
|
-
return (WORKER ??= new ResourceWorker(new URL("../workers/udp-worker.js", import.meta.url)));
|
|
6
|
+
return (WORKER ??= new ResourceWorker(() => new Worker(new URL("../workers/udp-worker.bundle.js", import.meta.url))));
|
|
7
7
|
}
|
|
8
8
|
let UDP_CREATE_TOKEN = null;
|
|
9
9
|
function token() {
|
|
@@ -473,3 +473,4 @@ export class UdpSocket {
|
|
|
473
473
|
}
|
|
474
474
|
}
|
|
475
475
|
export const udpCreateSocket = {};
|
|
476
|
+
import { Worker } from "node:worker_threads";
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import process from "node:process";
|
|
2
|
+
import { Readable } from "node:stream";
|
|
3
|
+
import { pipeline } from "stream/promises";
|
|
4
|
+
import { isMainThread, parentPort } from "worker_threads";
|
|
5
|
+
//#region dist/nodejs/workers/resource-worker.js
|
|
6
|
+
function Router() {
|
|
7
|
+
const _hooks = {
|
|
8
|
+
beforeAll: null,
|
|
9
|
+
ops: /* @__PURE__ */ new Map()
|
|
10
|
+
};
|
|
11
|
+
if (isMainThread || !parentPort) throw new Error("Router can only be used in worker threads");
|
|
12
|
+
parentPort.on("message", async (msg) => {
|
|
13
|
+
const { _reply, _condvar, ...rest } = msg;
|
|
14
|
+
let result, error, transfer = [];
|
|
15
|
+
try {
|
|
16
|
+
if (_hooks.beforeAll) _hooks.beforeAll(rest);
|
|
17
|
+
const handler = _hooks.ops.get(rest.op);
|
|
18
|
+
if (!handler) throw new Error(`Unknown op ${rest.op}`);
|
|
19
|
+
const outcome = await handler(rest);
|
|
20
|
+
if (outcome && Array.isArray(outcome.transferable)) {
|
|
21
|
+
result = outcome.result;
|
|
22
|
+
transfer = outcome.transferable;
|
|
23
|
+
} else result = outcome;
|
|
24
|
+
} catch (err) {
|
|
25
|
+
error = serializeError(err);
|
|
26
|
+
}
|
|
27
|
+
_reply.postMessage({
|
|
28
|
+
result,
|
|
29
|
+
error
|
|
30
|
+
}, transfer);
|
|
31
|
+
_reply.close();
|
|
32
|
+
if (_condvar) notify(_condvar);
|
|
33
|
+
});
|
|
34
|
+
return {
|
|
35
|
+
beforeAll(fn) {
|
|
36
|
+
_hooks.beforeAll = fn;
|
|
37
|
+
return this;
|
|
38
|
+
},
|
|
39
|
+
op(name, fn) {
|
|
40
|
+
_hooks.ops.set(name, fn);
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function serializeError(err) {
|
|
46
|
+
if (!(err instanceof Error)) return err;
|
|
47
|
+
const serialized = {
|
|
48
|
+
__resourceWorkerError: true,
|
|
49
|
+
name: err.name,
|
|
50
|
+
message: err.message,
|
|
51
|
+
stack: err.stack
|
|
52
|
+
};
|
|
53
|
+
for (const key of Reflect.ownKeys(err)) serialized[key] = err[key];
|
|
54
|
+
if (err.cause !== void 0) serialized.cause = serializeError(err.cause);
|
|
55
|
+
return serialized;
|
|
56
|
+
}
|
|
57
|
+
function notify(condvar) {
|
|
58
|
+
const lock = new Int32Array(condvar);
|
|
59
|
+
Atomics.store(lock, 0, 1);
|
|
60
|
+
Atomics.notify(lock, 0, 1);
|
|
61
|
+
}
|
|
62
|
+
//#endregion
|
|
63
|
+
//#region dist/nodejs/workers/cli-worker.js
|
|
64
|
+
Router().op("stdout", handleOp).op("stderr", handleOp);
|
|
65
|
+
async function handleOp(msg) {
|
|
66
|
+
const { op, stream } = msg;
|
|
67
|
+
await pipeline(Readable.from(byteChunks(stream), { objectMode: false }), op === "stdout" ? process.stdout : process.stderr, { end: false });
|
|
68
|
+
return { ok: true };
|
|
69
|
+
}
|
|
70
|
+
async function* byteChunks(stream) {
|
|
71
|
+
for await (const value of stream) yield nodeByteChunk(value);
|
|
72
|
+
}
|
|
73
|
+
function assertByte(value) {
|
|
74
|
+
if (!Number.isInteger(value) || value < 0 || value > 255) throw new RangeError(`Invalid byte stream value: ${value}`);
|
|
75
|
+
return value;
|
|
76
|
+
}
|
|
77
|
+
function nodeByteChunk(value) {
|
|
78
|
+
if (value instanceof Uint8Array) return value;
|
|
79
|
+
if (value instanceof ArrayBuffer) return new Uint8Array(value);
|
|
80
|
+
if (Array.isArray(value)) {
|
|
81
|
+
for (const byte of value) assertByte(byte);
|
|
82
|
+
return Uint8Array.from(value);
|
|
83
|
+
}
|
|
84
|
+
if (typeof value === "number") return Uint8Array.of(assertByte(value));
|
|
85
|
+
return value;
|
|
86
|
+
}
|
|
87
|
+
//#endregion
|
|
88
|
+
export {};
|