reg-cli 0.19.0-rc0 → 0.19.0-rc2
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/cli.cjs +1 -2
- package/dist/cli.mjs +1 -1
- package/dist/index.cjs +59 -58
- package/dist/index.mjs +58 -56
- package/dist/reg.wasm +0 -0
- package/dist/runner.cjs +235 -0
- package/dist/runner.mjs +235 -0
- package/dist/shared/report-worker.js +697 -1078
- package/dist/{tracing-7HO8hac9.mjs → tracing-Bo38b9aR.mjs} +45 -1
- package/dist/{tracing-DlLL541f.cjs → tracing-Cf9TNPXQ.cjs} +100 -2
- package/dist/{ximgdiff-wmW1BH1H.cjs → ximgdiff-B16oe7EL.cjs} +2 -2
- package/package.json +27 -10
- package/dist/entry.cjs +0 -119
- package/dist/entry.d.cts +0 -15
- package/dist/entry.d.mts +0 -15
- package/dist/entry.mjs +0 -118
- package/dist/progress-BB7D-xke.mjs +0 -28
- package/dist/progress-UOiKHaTY.cjs +0 -33
- package/dist/rolldown-runtime-D_mwlA32.cjs +0 -43
- package/dist/worker.cjs +0 -143
- package/dist/worker.mjs +0 -142
- /package/dist/{worker.d.cts → runner.d.cts} +0 -0
- /package/dist/{worker.d.mts → runner.d.mts} +0 -0
- /package/dist/{ximgdiff-DzkRRnkW.mjs → ximgdiff-D8GAJaxA.mjs} +0 -0
package/dist/cli.cjs
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
require("./rolldown-runtime-D_mwlA32.cjs");
|
|
3
2
|
const require_index = require("./index.cjs");
|
|
4
|
-
const require_ximgdiff = require("./ximgdiff-
|
|
3
|
+
const require_ximgdiff = require("./ximgdiff-B16oe7EL.cjs");
|
|
5
4
|
let node_fs_promises = require("node:fs/promises");
|
|
6
5
|
let node_path = require("node:path");
|
|
7
6
|
let node_module = require("node:module");
|
package/dist/cli.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { t as writeXimgdiffAssets } from "./ximgdiff-
|
|
2
|
+
import { t as writeXimgdiffAssets } from "./ximgdiff-D8GAJaxA.mjs";
|
|
3
3
|
import { dir, run } from "./index.mjs";
|
|
4
4
|
import { createRequire } from "node:module";
|
|
5
5
|
import { copyFile, mkdir } from "node:fs/promises";
|
package/dist/index.cjs
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const
|
|
3
|
-
const require_tracing = require("./tracing-DlLL541f.cjs");
|
|
2
|
+
const require_tracing = require("./tracing-Cf9TNPXQ.cjs");
|
|
4
3
|
let node_events = require("node:events");
|
|
5
|
-
node_events =
|
|
4
|
+
node_events = require_tracing.__toESM(node_events, 1);
|
|
6
5
|
let node_worker_threads = require("node:worker_threads");
|
|
7
6
|
let url = require("url");
|
|
8
7
|
let node_path = require("node:path");
|
|
@@ -36,79 +35,81 @@ const runInternal = async (argv, emitter) => {
|
|
|
36
35
|
}
|
|
37
36
|
const traceContext = require_tracing.isTracingEnabled() ? require_tracing.startRootSpan("reg-cli") : null;
|
|
38
37
|
const t_new_entry = Date.now();
|
|
39
|
-
const worker = new node_worker_threads.Worker((0, node_path.join)(dir(), `./
|
|
38
|
+
const worker = new node_worker_threads.Worker((0, node_path.join)(dir(), `./runner.${require_tracing.resolveExtention()}`), { workerData: {
|
|
39
|
+
argv,
|
|
40
|
+
mode: "entry"
|
|
41
|
+
} });
|
|
40
42
|
recordMainSpan("main.new_entry_worker", t_new_entry);
|
|
41
43
|
let nextTid = 1;
|
|
42
44
|
const workers = [worker];
|
|
43
45
|
const threadWorkerSpans = [];
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
46
|
+
const attachCommonHandlers = (w) => {
|
|
47
|
+
w.on("message", (msg) => {
|
|
48
|
+
switch (msg.cmd) {
|
|
49
|
+
case "compare-event":
|
|
50
|
+
if (msg.event) emitter.emit("compare", msg.event);
|
|
51
|
+
return;
|
|
52
|
+
case "thread-spawn":
|
|
53
|
+
spawn(msg.startArg, msg.threadId, msg.memory, msg.wasmModule);
|
|
54
|
+
return;
|
|
55
|
+
case "worker-spans":
|
|
56
|
+
if (Array.isArray(msg.workerSpans)) threadWorkerSpans.push(...msg.workerSpans);
|
|
57
|
+
return;
|
|
58
|
+
case "loaded":
|
|
59
|
+
if (typeof w.unref === "function") w.unref();
|
|
60
|
+
return;
|
|
59
61
|
}
|
|
60
62
|
});
|
|
61
|
-
|
|
62
|
-
|
|
63
|
+
w.on("error", (e) => {
|
|
64
|
+
if (traceContext) require_tracing.endRootSpan(false);
|
|
65
|
+
workers.forEach((x) => x.terminate());
|
|
63
66
|
emitter.emit("error", e);
|
|
64
67
|
});
|
|
68
|
+
};
|
|
69
|
+
const spawn = (startArg, threadId, memory, wasmModule) => {
|
|
70
|
+
const t_new_worker = Date.now();
|
|
71
|
+
const w = new node_worker_threads.Worker((0, node_path.join)(dir(), `./runner.${require_tracing.resolveExtention()}`), { workerData: {
|
|
72
|
+
argv,
|
|
73
|
+
mode: "thread"
|
|
74
|
+
} });
|
|
75
|
+
const tid = nextTid++;
|
|
76
|
+
recordMainSpan("main.new_thread_worker", t_new_worker, { tid });
|
|
77
|
+
workers.push(w);
|
|
78
|
+
attachCommonHandlers(w);
|
|
65
79
|
if (threadId) {
|
|
66
80
|
Atomics.store(threadId, 0, tid);
|
|
67
81
|
Atomics.notify(threadId, 0);
|
|
68
82
|
}
|
|
69
|
-
|
|
83
|
+
w.postMessage({
|
|
70
84
|
startArg,
|
|
71
85
|
tid,
|
|
72
|
-
memory
|
|
86
|
+
memory,
|
|
87
|
+
wasmModule
|
|
73
88
|
});
|
|
74
89
|
return tid;
|
|
75
90
|
};
|
|
76
|
-
worker
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
91
|
+
attachCommonHandlers(worker);
|
|
92
|
+
worker.on("message", async (msg) => {
|
|
93
|
+
if (msg.cmd !== "complete") return;
|
|
94
|
+
const { data, traceData, workerSpans } = msg;
|
|
95
|
+
const t_post_complete = Date.now();
|
|
96
|
+
if (require_tracing.isTracingEnabled()) {
|
|
97
|
+
if (Array.isArray(workerSpans)) require_tracing.processWorkerSpans(workerSpans, "entry");
|
|
98
|
+
if (threadWorkerSpans.length) require_tracing.processWorkerSpans(threadWorkerSpans, "thread");
|
|
99
|
+
if (traceData) require_tracing.processRustTraceData(traceData);
|
|
100
|
+
recordMainSpan("main.process_trace_and_spans", t_post_complete);
|
|
101
|
+
mainSpans.push({
|
|
102
|
+
name: "main.run_total",
|
|
103
|
+
start_ms: run_start_ms,
|
|
104
|
+
end_ms: Date.now(),
|
|
105
|
+
worker_label: "main"
|
|
106
|
+
});
|
|
107
|
+
require_tracing.processWorkerSpans(mainSpans, "main");
|
|
108
|
+
require_tracing.endRootSpan(true);
|
|
109
|
+
await require_tracing.shutdownTracing();
|
|
80
110
|
}
|
|
81
|
-
if (cmd === "complete") {
|
|
82
|
-
const t_post_complete = Date.now();
|
|
83
|
-
if (require_tracing.isTracingEnabled()) {
|
|
84
|
-
if (Array.isArray(workerSpans)) require_tracing.processWorkerSpans(workerSpans, "entry");
|
|
85
|
-
if (threadWorkerSpans.length) require_tracing.processWorkerSpans(threadWorkerSpans, "thread");
|
|
86
|
-
if (traceData) require_tracing.processRustTraceData(traceData);
|
|
87
|
-
recordMainSpan("main.process_trace_and_spans", t_post_complete);
|
|
88
|
-
mainSpans.push({
|
|
89
|
-
name: "main.run_total",
|
|
90
|
-
start_ms: run_start_ms,
|
|
91
|
-
end_ms: Date.now(),
|
|
92
|
-
worker_label: "main"
|
|
93
|
-
});
|
|
94
|
-
require_tracing.processWorkerSpans(mainSpans, "main");
|
|
95
|
-
require_tracing.endRootSpan(true);
|
|
96
|
-
await require_tracing.shutdownTracing();
|
|
97
|
-
}
|
|
98
|
-
workers.forEach((w) => w.terminate());
|
|
99
|
-
emitter.emit("complete", data);
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
if (cmd === "loaded") {
|
|
103
|
-
if (typeof worker.unref === "function") worker.unref();
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
if (cmd === "thread-spawn") spawn(startArg, threadId, memory);
|
|
107
|
-
});
|
|
108
|
-
worker.on("error", (err) => {
|
|
109
|
-
if (traceContext) require_tracing.endRootSpan(false);
|
|
110
111
|
workers.forEach((w) => w.terminate());
|
|
111
|
-
emitter.emit("
|
|
112
|
+
emitter.emit("complete", data);
|
|
112
113
|
});
|
|
113
114
|
};
|
|
114
115
|
/** Flags that `compare()` handles itself in JS; they are NOT forwarded to
|
|
@@ -163,7 +164,7 @@ const compare = (input) => {
|
|
|
163
164
|
inner.on("complete", async (data) => {
|
|
164
165
|
try {
|
|
165
166
|
if (restAny.additionalDetection === "client" && typeof input.report === "string") {
|
|
166
|
-
const { writeXimgdiffAssets } = await Promise.resolve().then(() => require("./ximgdiff-
|
|
167
|
+
const { writeXimgdiffAssets } = await Promise.resolve().then(() => require("./ximgdiff-B16oe7EL.cjs")).then((n) => n.ximgdiff_exports);
|
|
167
168
|
await writeXimgdiffAssets({
|
|
168
169
|
reportPath: input.report,
|
|
169
170
|
urlPrefix: typeof input.urlPrefix === "string" ? input.urlPrefix : "",
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as processWorkerSpans,
|
|
1
|
+
import { a as processWorkerSpans, i as processRustTraceData, n as initTracing, o as shutdownTracing, p as resolveExtention, r as isTracingEnabled, s as startRootSpan, t as endRootSpan, u as isCJS } from "./tracing-Bo38b9aR.mjs";
|
|
2
2
|
import EventEmitter from "node:events";
|
|
3
3
|
import { Worker } from "node:worker_threads";
|
|
4
4
|
import { fileURLToPath } from "url";
|
|
@@ -33,79 +33,81 @@ const runInternal = async (argv, emitter) => {
|
|
|
33
33
|
}
|
|
34
34
|
const traceContext = isTracingEnabled() ? startRootSpan("reg-cli") : null;
|
|
35
35
|
const t_new_entry = Date.now();
|
|
36
|
-
const worker = new Worker(join(dir(), `./
|
|
36
|
+
const worker = new Worker(join(dir(), `./runner.${resolveExtention()}`), { workerData: {
|
|
37
|
+
argv,
|
|
38
|
+
mode: "entry"
|
|
39
|
+
} });
|
|
37
40
|
recordMainSpan("main.new_entry_worker", t_new_entry);
|
|
38
41
|
let nextTid = 1;
|
|
39
42
|
const workers = [worker];
|
|
40
43
|
const threadWorkerSpans = [];
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
44
|
+
const attachCommonHandlers = (w) => {
|
|
45
|
+
w.on("message", (msg) => {
|
|
46
|
+
switch (msg.cmd) {
|
|
47
|
+
case "compare-event":
|
|
48
|
+
if (msg.event) emitter.emit("compare", msg.event);
|
|
49
|
+
return;
|
|
50
|
+
case "thread-spawn":
|
|
51
|
+
spawn(msg.startArg, msg.threadId, msg.memory, msg.wasmModule);
|
|
52
|
+
return;
|
|
53
|
+
case "worker-spans":
|
|
54
|
+
if (Array.isArray(msg.workerSpans)) threadWorkerSpans.push(...msg.workerSpans);
|
|
55
|
+
return;
|
|
56
|
+
case "loaded":
|
|
57
|
+
if (typeof w.unref === "function") w.unref();
|
|
58
|
+
return;
|
|
56
59
|
}
|
|
57
60
|
});
|
|
58
|
-
|
|
59
|
-
|
|
61
|
+
w.on("error", (e) => {
|
|
62
|
+
if (traceContext) endRootSpan(false);
|
|
63
|
+
workers.forEach((x) => x.terminate());
|
|
60
64
|
emitter.emit("error", e);
|
|
61
65
|
});
|
|
66
|
+
};
|
|
67
|
+
const spawn = (startArg, threadId, memory, wasmModule) => {
|
|
68
|
+
const t_new_worker = Date.now();
|
|
69
|
+
const w = new Worker(join(dir(), `./runner.${resolveExtention()}`), { workerData: {
|
|
70
|
+
argv,
|
|
71
|
+
mode: "thread"
|
|
72
|
+
} });
|
|
73
|
+
const tid = nextTid++;
|
|
74
|
+
recordMainSpan("main.new_thread_worker", t_new_worker, { tid });
|
|
75
|
+
workers.push(w);
|
|
76
|
+
attachCommonHandlers(w);
|
|
62
77
|
if (threadId) {
|
|
63
78
|
Atomics.store(threadId, 0, tid);
|
|
64
79
|
Atomics.notify(threadId, 0);
|
|
65
80
|
}
|
|
66
|
-
|
|
81
|
+
w.postMessage({
|
|
67
82
|
startArg,
|
|
68
83
|
tid,
|
|
69
|
-
memory
|
|
84
|
+
memory,
|
|
85
|
+
wasmModule
|
|
70
86
|
});
|
|
71
87
|
return tid;
|
|
72
88
|
};
|
|
73
|
-
worker
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
89
|
+
attachCommonHandlers(worker);
|
|
90
|
+
worker.on("message", async (msg) => {
|
|
91
|
+
if (msg.cmd !== "complete") return;
|
|
92
|
+
const { data, traceData, workerSpans } = msg;
|
|
93
|
+
const t_post_complete = Date.now();
|
|
94
|
+
if (isTracingEnabled()) {
|
|
95
|
+
if (Array.isArray(workerSpans)) processWorkerSpans(workerSpans, "entry");
|
|
96
|
+
if (threadWorkerSpans.length) processWorkerSpans(threadWorkerSpans, "thread");
|
|
97
|
+
if (traceData) processRustTraceData(traceData);
|
|
98
|
+
recordMainSpan("main.process_trace_and_spans", t_post_complete);
|
|
99
|
+
mainSpans.push({
|
|
100
|
+
name: "main.run_total",
|
|
101
|
+
start_ms: run_start_ms,
|
|
102
|
+
end_ms: Date.now(),
|
|
103
|
+
worker_label: "main"
|
|
104
|
+
});
|
|
105
|
+
processWorkerSpans(mainSpans, "main");
|
|
106
|
+
endRootSpan(true);
|
|
107
|
+
await shutdownTracing();
|
|
77
108
|
}
|
|
78
|
-
if (cmd === "complete") {
|
|
79
|
-
const t_post_complete = Date.now();
|
|
80
|
-
if (isTracingEnabled()) {
|
|
81
|
-
if (Array.isArray(workerSpans)) processWorkerSpans(workerSpans, "entry");
|
|
82
|
-
if (threadWorkerSpans.length) processWorkerSpans(threadWorkerSpans, "thread");
|
|
83
|
-
if (traceData) processRustTraceData(traceData);
|
|
84
|
-
recordMainSpan("main.process_trace_and_spans", t_post_complete);
|
|
85
|
-
mainSpans.push({
|
|
86
|
-
name: "main.run_total",
|
|
87
|
-
start_ms: run_start_ms,
|
|
88
|
-
end_ms: Date.now(),
|
|
89
|
-
worker_label: "main"
|
|
90
|
-
});
|
|
91
|
-
processWorkerSpans(mainSpans, "main");
|
|
92
|
-
endRootSpan(true);
|
|
93
|
-
await shutdownTracing();
|
|
94
|
-
}
|
|
95
|
-
workers.forEach((w) => w.terminate());
|
|
96
|
-
emitter.emit("complete", data);
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
if (cmd === "loaded") {
|
|
100
|
-
if (typeof worker.unref === "function") worker.unref();
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
if (cmd === "thread-spawn") spawn(startArg, threadId, memory);
|
|
104
|
-
});
|
|
105
|
-
worker.on("error", (err) => {
|
|
106
|
-
if (traceContext) endRootSpan(false);
|
|
107
109
|
workers.forEach((w) => w.terminate());
|
|
108
|
-
emitter.emit("
|
|
110
|
+
emitter.emit("complete", data);
|
|
109
111
|
});
|
|
110
112
|
};
|
|
111
113
|
/** Flags that `compare()` handles itself in JS; they are NOT forwarded to
|
|
@@ -160,7 +162,7 @@ const compare = (input) => {
|
|
|
160
162
|
inner.on("complete", async (data) => {
|
|
161
163
|
try {
|
|
162
164
|
if (restAny.additionalDetection === "client" && typeof input.report === "string") {
|
|
163
|
-
const { writeXimgdiffAssets } = await import("./ximgdiff-
|
|
165
|
+
const { writeXimgdiffAssets } = await import("./ximgdiff-D8GAJaxA.mjs").then((n) => n.n);
|
|
164
166
|
await writeXimgdiffAssets({
|
|
165
167
|
reportPath: input.report,
|
|
166
168
|
urlPrefix: typeof input.urlPrefix === "string" ? input.urlPrefix : "",
|
package/dist/reg.wasm
CHANGED
|
Binary file
|
package/dist/runner.cjs
ADDED
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
const require_tracing = require("./tracing-Cf9TNPXQ.cjs");
|
|
2
|
+
let node_worker_threads = require("node:worker_threads");
|
|
3
|
+
let node_process = require("node:process");
|
|
4
|
+
let node_fs = require("node:fs");
|
|
5
|
+
node_fs = require_tracing.__toESM(node_fs, 1);
|
|
6
|
+
let _tybys_wasm_util = require("@tybys/wasm-util");
|
|
7
|
+
//#region src/proxy.ts
|
|
8
|
+
const kIsProxy = Symbol("kIsProxy");
|
|
9
|
+
const createInstanceProxy = (instance, memory) => {
|
|
10
|
+
if (instance[kIsProxy]) return instance;
|
|
11
|
+
const originalExports = instance.exports;
|
|
12
|
+
const createHandler = function(target) {
|
|
13
|
+
const handlers = [
|
|
14
|
+
"apply",
|
|
15
|
+
"construct",
|
|
16
|
+
"defineProperty",
|
|
17
|
+
"deleteProperty",
|
|
18
|
+
"get",
|
|
19
|
+
"getOwnPropertyDescriptor",
|
|
20
|
+
"getPrototypeOf",
|
|
21
|
+
"has",
|
|
22
|
+
"isExtensible",
|
|
23
|
+
"ownKeys",
|
|
24
|
+
"preventExtensions",
|
|
25
|
+
"set",
|
|
26
|
+
"setPrototypeOf"
|
|
27
|
+
];
|
|
28
|
+
const handler = {};
|
|
29
|
+
for (let i = 0; i < handlers.length; i++) {
|
|
30
|
+
const name = handlers[i];
|
|
31
|
+
handler[name] = function() {
|
|
32
|
+
const args = Array.prototype.slice.call(arguments, 1);
|
|
33
|
+
args.unshift(target);
|
|
34
|
+
return Reflect[name].apply(Reflect, args);
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
return handler;
|
|
38
|
+
};
|
|
39
|
+
const handler = createHandler(originalExports);
|
|
40
|
+
const _initialize = () => {};
|
|
41
|
+
const _start = () => 0;
|
|
42
|
+
handler.get = function(_target, p, receiver) {
|
|
43
|
+
if (p === "memory") return (typeof memory === "function" ? memory() : memory) ?? Reflect.get(originalExports, p, receiver);
|
|
44
|
+
if (p === "_initialize") return p in originalExports ? _initialize : void 0;
|
|
45
|
+
if (p === "_start") return p in originalExports ? _start : void 0;
|
|
46
|
+
return Reflect.get(originalExports, p, receiver);
|
|
47
|
+
};
|
|
48
|
+
handler.has = function(_target, p) {
|
|
49
|
+
if (p === "memory") return true;
|
|
50
|
+
return Reflect.has(originalExports, p);
|
|
51
|
+
};
|
|
52
|
+
const exportsProxy = new Proxy(Object.create(null), handler);
|
|
53
|
+
return new Proxy(instance, { get(target, p, receiver) {
|
|
54
|
+
if (p === "exports") return exportsProxy;
|
|
55
|
+
if (p === kIsProxy) return true;
|
|
56
|
+
return Reflect.get(target, p, receiver);
|
|
57
|
+
} });
|
|
58
|
+
};
|
|
59
|
+
//#endregion
|
|
60
|
+
//#region src/progress.ts
|
|
61
|
+
const MARKER = "__REG_CLI_EVT__ ";
|
|
62
|
+
/**
|
|
63
|
+
* Build a WASI `printErr` hook that forwards progress events to `onEvent`
|
|
64
|
+
* and everything else to `fallback` (defaults to `console.error`).
|
|
65
|
+
*
|
|
66
|
+
* `@tybys/wasm-util`'s `StandardOutput.write` already buffers until a
|
|
67
|
+
* newline and invokes the callback with one stripped line per call
|
|
68
|
+
* (see the `StandardOutput` class in
|
|
69
|
+
* `node_modules/@tybys/wasm-util/dist/wasm-util.esm-bundler.js`). So
|
|
70
|
+
* we can treat each invocation as a single complete line.
|
|
71
|
+
*/
|
|
72
|
+
const createPrintErrHook = (onEvent, fallback = (s) => console.error(s)) => {
|
|
73
|
+
return (line) => {
|
|
74
|
+
if (line.startsWith(MARKER)) {
|
|
75
|
+
const json = line.slice(16);
|
|
76
|
+
try {
|
|
77
|
+
const ev = JSON.parse(json);
|
|
78
|
+
if (ev && typeof ev.type === "string" && typeof ev.path === "string") {
|
|
79
|
+
onEvent(ev);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
} catch {}
|
|
83
|
+
}
|
|
84
|
+
fallback(line);
|
|
85
|
+
};
|
|
86
|
+
};
|
|
87
|
+
//#endregion
|
|
88
|
+
//#region src/runner.ts
|
|
89
|
+
const mode = node_worker_threads.workerData.mode;
|
|
90
|
+
const isTracingEnabled = () => node_process.env.OTEL_ENABLED === "true" || node_process.env.JAEGER_ENABLED === "true";
|
|
91
|
+
const argv = require_tracing.normalizeWasiArgv(node_worker_threads.workerData.argv);
|
|
92
|
+
const sandbox = require_tracing.computeWasiSandbox(argv);
|
|
93
|
+
const printErr = createPrintErrHook((ev) => {
|
|
94
|
+
node_worker_threads.parentPort?.postMessage({
|
|
95
|
+
cmd: "compare-event",
|
|
96
|
+
event: ev
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
const wasi = new _tybys_wasm_util.WASI({
|
|
100
|
+
version: "preview1",
|
|
101
|
+
args: argv,
|
|
102
|
+
env: sandbox.env,
|
|
103
|
+
returnOnExit: true,
|
|
104
|
+
preopens: sandbox.preopens,
|
|
105
|
+
fs: node_fs.default,
|
|
106
|
+
printErr
|
|
107
|
+
});
|
|
108
|
+
const wasmFile = mode === "entry" ? require_tracing.readWasm() : null;
|
|
109
|
+
const readWasmString = (exports, memory, outputPtr) => {
|
|
110
|
+
const view = new DataView(memory.buffer, outputPtr);
|
|
111
|
+
const len = view.getUint32(0, true);
|
|
112
|
+
const bufPtr = view.getUint32(4, true);
|
|
113
|
+
const bytes = new Uint8Array(memory.buffer, bufPtr, len);
|
|
114
|
+
const s = new TextDecoder("utf-8").decode(bytes);
|
|
115
|
+
exports.free_wasm_output(outputPtr);
|
|
116
|
+
return s;
|
|
117
|
+
};
|
|
118
|
+
const makeSpanRecorder = (workerLabel) => {
|
|
119
|
+
const workerSpans = [];
|
|
120
|
+
const tSpan = async (name, fn, attributes) => {
|
|
121
|
+
if (!isTracingEnabled()) return fn();
|
|
122
|
+
const start_ms = Date.now();
|
|
123
|
+
const r = await fn();
|
|
124
|
+
workerSpans.push({
|
|
125
|
+
name,
|
|
126
|
+
start_ms,
|
|
127
|
+
end_ms: Date.now(),
|
|
128
|
+
attributes,
|
|
129
|
+
worker_label: workerLabel
|
|
130
|
+
});
|
|
131
|
+
return r;
|
|
132
|
+
};
|
|
133
|
+
return {
|
|
134
|
+
workerSpans,
|
|
135
|
+
tSpan
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
const makeThreadSpawnImport = (memory, wasmModule) => (startArg) => {
|
|
139
|
+
const buf = new SharedArrayBuffer(4);
|
|
140
|
+
const id = new Int32Array(buf);
|
|
141
|
+
Atomics.store(id, 0, -1);
|
|
142
|
+
node_worker_threads.parentPort?.postMessage({
|
|
143
|
+
cmd: "thread-spawn",
|
|
144
|
+
startArg,
|
|
145
|
+
threadId: id,
|
|
146
|
+
memory,
|
|
147
|
+
wasmModule
|
|
148
|
+
});
|
|
149
|
+
Atomics.wait(id, 0, -1);
|
|
150
|
+
return Atomics.load(id, 0);
|
|
151
|
+
};
|
|
152
|
+
const compileAndInstantiate = async (memory, tSpan, prefix, compiledModule) => {
|
|
153
|
+
const wasm = compiledModule ?? await tSpan(`${prefix}.wasm_compile`, async () => {
|
|
154
|
+
if (!wasmFile) throw new Error("Wasm bytes are unavailable in a thread worker");
|
|
155
|
+
return WebAssembly.compile(await wasmFile);
|
|
156
|
+
});
|
|
157
|
+
const wasi_snapshot_preview1 = require_tracing.filterWasiImports(wasm, wasi.getImportObject().wasi_snapshot_preview1);
|
|
158
|
+
return {
|
|
159
|
+
instance: await tSpan(`${prefix}.wasm_instantiate`, async () => WebAssembly.instantiate(wasm, {
|
|
160
|
+
wasi_snapshot_preview1,
|
|
161
|
+
wasi: { "thread-spawn": makeThreadSpawnImport(memory, wasm) },
|
|
162
|
+
env: { memory }
|
|
163
|
+
})),
|
|
164
|
+
module: wasm
|
|
165
|
+
};
|
|
166
|
+
};
|
|
167
|
+
if (mode === "entry") (async () => {
|
|
168
|
+
const entry_start_ms = Date.now();
|
|
169
|
+
const { workerSpans, tSpan } = makeSpanRecorder("entry");
|
|
170
|
+
const memory = new WebAssembly.Memory({
|
|
171
|
+
initial: 256,
|
|
172
|
+
maximum: 16384,
|
|
173
|
+
shared: true
|
|
174
|
+
});
|
|
175
|
+
const { instance } = await compileAndInstantiate(memory, tSpan, "entry");
|
|
176
|
+
const exports = instance.exports;
|
|
177
|
+
await tSpan("entry.wasi_start", async () => {
|
|
178
|
+
wasi.start(instance);
|
|
179
|
+
});
|
|
180
|
+
if (isTracingEnabled() && typeof exports.init_tracing === "function") await tSpan("entry.init_tracing_rust", async () => {
|
|
181
|
+
exports.init_tracing();
|
|
182
|
+
});
|
|
183
|
+
const m = await tSpan("entry.wasm_main", async () => exports.wasm_main());
|
|
184
|
+
const reportString = await tSpan("entry.read_report_string", async () => readWasmString(exports, memory, m));
|
|
185
|
+
const report = JSON.parse(reportString);
|
|
186
|
+
let traceData = null;
|
|
187
|
+
if (isTracingEnabled() && typeof exports.get_trace_data === "function") await tSpan("entry.collect_rust_traces", async () => {
|
|
188
|
+
const traceJson = readWasmString(exports, memory, exports.get_trace_data());
|
|
189
|
+
try {
|
|
190
|
+
traceData = JSON.parse(traceJson);
|
|
191
|
+
} catch (e) {
|
|
192
|
+
console.error("[Tracing] Failed to parse trace data:", e);
|
|
193
|
+
}
|
|
194
|
+
if (typeof exports.clear_trace_data === "function") exports.clear_trace_data();
|
|
195
|
+
});
|
|
196
|
+
if (isTracingEnabled()) workerSpans.push({
|
|
197
|
+
name: "entry.worker_total",
|
|
198
|
+
start_ms: entry_start_ms,
|
|
199
|
+
end_ms: Date.now(),
|
|
200
|
+
worker_label: "entry"
|
|
201
|
+
});
|
|
202
|
+
node_worker_threads.parentPort?.postMessage({
|
|
203
|
+
cmd: "complete",
|
|
204
|
+
data: report,
|
|
205
|
+
traceData,
|
|
206
|
+
workerSpans
|
|
207
|
+
});
|
|
208
|
+
})();
|
|
209
|
+
else node_worker_threads.parentPort?.addListener("message", async ({ startArg, tid, memory, wasmModule }) => {
|
|
210
|
+
const workerLabel = `thread-${tid}`;
|
|
211
|
+
const handler_start_ms = Date.now();
|
|
212
|
+
const { workerSpans, tSpan } = makeSpanRecorder(workerLabel);
|
|
213
|
+
let { instance } = await compileAndInstantiate(memory, tSpan, "worker", wasmModule);
|
|
214
|
+
instance = createInstanceProxy(instance, memory);
|
|
215
|
+
await tSpan("worker.wasi_start", async () => {
|
|
216
|
+
wasi.start(instance);
|
|
217
|
+
});
|
|
218
|
+
await tSpan("worker.wasi_thread_start", async () => {
|
|
219
|
+
instance.exports.wasi_thread_start(tid, startArg);
|
|
220
|
+
}, { tid });
|
|
221
|
+
if (isTracingEnabled()) {
|
|
222
|
+
workerSpans.push({
|
|
223
|
+
name: "worker.thread_total",
|
|
224
|
+
start_ms: handler_start_ms,
|
|
225
|
+
end_ms: Date.now(),
|
|
226
|
+
worker_label: workerLabel,
|
|
227
|
+
attributes: { tid }
|
|
228
|
+
});
|
|
229
|
+
node_worker_threads.parentPort?.postMessage({
|
|
230
|
+
cmd: "worker-spans",
|
|
231
|
+
workerSpans
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
//#endregion
|