@vune-ui/execution 0.1.20
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/LICENSE +21 -0
- package/dist/index.d.ts +247 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +560 -0
- package/dist/index.js.map +1 -0
- package/dist/resident-wasm.d.ts +238 -0
- package/dist/resident-wasm.d.ts.map +1 -0
- package/dist/resident-wasm.js +578 -0
- package/dist/resident-wasm.js.map +1 -0
- package/dist/resident-worker.d.ts +145 -0
- package/dist/resident-worker.d.ts.map +1 -0
- package/dist/resident-worker.js +441 -0
- package/dist/resident-worker.js.map +1 -0
- package/dist/wasm/resident-kernel-scalar.wasm +0 -0
- package/dist/wasm/resident-kernel-shared-scalar.wasm +0 -0
- package/dist/wasm/resident-kernel-shared-simd.wasm +0 -0
- package/dist/wasm/resident-kernel-simd.wasm +0 -0
- package/dist/wasm/resident-worker.mjs +108 -0
- package/package.json +35 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { ExecutionTelemetry, FrameBudgetSignal, type ExecutionAggregate } from "./index.js";
|
|
2
|
+
import { type ResidentNativeDecisionReason, type ResidentWasmBinding, type ResidentWasmExecutionOptions, type ResidentWasmVariant } from "./resident-wasm.js";
|
|
3
|
+
export interface ResidentWorkerLike {
|
|
4
|
+
postMessage(message: unknown): void;
|
|
5
|
+
addEventListener?(type: "message" | "error", listener: (event: unknown) => void): void;
|
|
6
|
+
removeEventListener?(type: "message" | "error", listener: (event: unknown) => void): void;
|
|
7
|
+
on?(type: "message" | "error", listener: (value: unknown) => void): void;
|
|
8
|
+
off?(type: "message" | "error", listener: (value: unknown) => void): void;
|
|
9
|
+
terminate?(): void | Promise<number>;
|
|
10
|
+
}
|
|
11
|
+
export type ResidentWorkerFactory = (binding: ResidentWasmBinding) => ResidentWorkerLike | Promise<ResidentWorkerLike>;
|
|
12
|
+
export interface ResidentWorkerInitMessage {
|
|
13
|
+
readonly type: "init";
|
|
14
|
+
readonly memory: WebAssembly.Memory;
|
|
15
|
+
readonly variant: ResidentWasmVariant;
|
|
16
|
+
readonly programPointer: number;
|
|
17
|
+
readonly programWords: number;
|
|
18
|
+
readonly columnPointersPointer: number;
|
|
19
|
+
readonly columnCount: number;
|
|
20
|
+
readonly rangesPointer: number;
|
|
21
|
+
readonly capturesPointer: number;
|
|
22
|
+
readonly captureCount: number;
|
|
23
|
+
readonly controlPointer: number;
|
|
24
|
+
readonly directSimdModuleBytes?: Uint8Array;
|
|
25
|
+
readonly directSimdEntrypoint?: "resident_execute_direct_simd";
|
|
26
|
+
}
|
|
27
|
+
export type ResidentWorkerControlMessage = Readonly<{
|
|
28
|
+
type: "ready";
|
|
29
|
+
variant: ResidentWasmVariant;
|
|
30
|
+
}> | Readonly<{
|
|
31
|
+
type: "done";
|
|
32
|
+
sequence: number;
|
|
33
|
+
}> | Readonly<{
|
|
34
|
+
type: "error";
|
|
35
|
+
message: string;
|
|
36
|
+
sequence?: number;
|
|
37
|
+
}> | Readonly<{
|
|
38
|
+
type: "stopped";
|
|
39
|
+
}>;
|
|
40
|
+
export interface ResidentWorkerExecutionMetrics {
|
|
41
|
+
readonly backend: "shared-worker-wasm";
|
|
42
|
+
readonly computeMs: number;
|
|
43
|
+
readonly transferBytes: 0;
|
|
44
|
+
readonly transferMs: 0;
|
|
45
|
+
readonly materializationBytes: 0;
|
|
46
|
+
readonly materializationMs: 0;
|
|
47
|
+
readonly readbackBytes: 0;
|
|
48
|
+
readonly readbackMs: 0;
|
|
49
|
+
readonly synchronizationBytes: number;
|
|
50
|
+
readonly synchronizationMs: number;
|
|
51
|
+
readonly totalMs: number;
|
|
52
|
+
readonly wasmCalls: 1;
|
|
53
|
+
readonly sequence: number;
|
|
54
|
+
}
|
|
55
|
+
/** Deterministic URL of the Worker entry copied into the published package. */
|
|
56
|
+
export declare function residentWorkerAssetUrl(): string;
|
|
57
|
+
/** Reject row-bearing messages at the thread boundary. */
|
|
58
|
+
export declare function validateResidentWorkerControlMessage(value: unknown): asserts value is ResidentWorkerControlMessage;
|
|
59
|
+
/** One shared-memory worker. Requests are atomic sequence changes, not row messages. */
|
|
60
|
+
export declare class ResidentSharedWorkerExecutor {
|
|
61
|
+
#private;
|
|
62
|
+
readonly binding: ResidentWasmBinding;
|
|
63
|
+
readonly worker: ResidentWorkerLike;
|
|
64
|
+
constructor(binding: ResidentWasmBinding, worker: ResidentWorkerLike);
|
|
65
|
+
execute(options?: ResidentWasmExecutionOptions): Promise<ResidentWorkerExecutionMetrics>;
|
|
66
|
+
close(): Promise<void>;
|
|
67
|
+
}
|
|
68
|
+
export interface ResidentSharedWorkerPoolSnapshot {
|
|
69
|
+
readonly size: number;
|
|
70
|
+
readonly maxWorkers: number;
|
|
71
|
+
readonly queuedJobs: number;
|
|
72
|
+
readonly activeBindings: number;
|
|
73
|
+
readonly createdWorkers: number;
|
|
74
|
+
readonly evictedWorkers: number;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Bound the number of persistent shared-memory resident Workers. A hot binding
|
|
78
|
+
* retains its initialized Worker and authoritative memory; cold idle bindings
|
|
79
|
+
* are evicted LRU when a new region needs capacity. Jobs for the same binding
|
|
80
|
+
* are serialized while different pool entries may execute concurrently.
|
|
81
|
+
*
|
|
82
|
+
* The pool intentionally does not choose Worker execution itself. Callers must
|
|
83
|
+
* still use `ResidentSharedWorkerPromotion`, which requires measured frame
|
|
84
|
+
* pressure and an end-to-end win over packed JavaScript.
|
|
85
|
+
*/
|
|
86
|
+
export declare class ResidentSharedWorkerPool {
|
|
87
|
+
#private;
|
|
88
|
+
readonly maxWorkers: number;
|
|
89
|
+
readonly workerFactory: ResidentWorkerFactory;
|
|
90
|
+
constructor(options: Readonly<{
|
|
91
|
+
workerFactory: ResidentWorkerFactory;
|
|
92
|
+
maxWorkers?: number;
|
|
93
|
+
}>);
|
|
94
|
+
execute(binding: ResidentWasmBinding, options?: ResidentWasmExecutionOptions): Promise<ResidentWorkerExecutionMetrics>;
|
|
95
|
+
snapshot(): ResidentSharedWorkerPoolSnapshot;
|
|
96
|
+
close(): Promise<void>;
|
|
97
|
+
}
|
|
98
|
+
export interface ResidentWorkerPromotionSnapshot {
|
|
99
|
+
readonly decision: "benchmarking" | "worker" | "packed-js";
|
|
100
|
+
readonly reason: ResidentNativeDecisionReason;
|
|
101
|
+
readonly baseline: ExecutionAggregate | null;
|
|
102
|
+
readonly candidate: ExecutionAggregate | null;
|
|
103
|
+
readonly measuredRatio: number | null;
|
|
104
|
+
readonly framePressure: number;
|
|
105
|
+
readonly frameSamples: number;
|
|
106
|
+
readonly executions: number;
|
|
107
|
+
readonly transferBytes: 0;
|
|
108
|
+
readonly materializationBytes: 0;
|
|
109
|
+
readonly readbackBytes: 0;
|
|
110
|
+
readonly synchronizationBytes: number;
|
|
111
|
+
}
|
|
112
|
+
/** Worker promotion requires both a measured win and live main-thread pressure. */
|
|
113
|
+
export declare class ResidentSharedWorkerPromotion {
|
|
114
|
+
#private;
|
|
115
|
+
readonly executor: ResidentSharedWorkerExecutor;
|
|
116
|
+
readonly packedJs: () => void;
|
|
117
|
+
readonly frameBudget: FrameBudgetSignal;
|
|
118
|
+
readonly telemetry: ExecutionTelemetry;
|
|
119
|
+
readonly minimumSamples: number;
|
|
120
|
+
readonly minimumMargin: number;
|
|
121
|
+
readonly experimental: boolean;
|
|
122
|
+
constructor(options: Readonly<{
|
|
123
|
+
executor: ResidentSharedWorkerExecutor;
|
|
124
|
+
packedJs: () => void;
|
|
125
|
+
frameBudget: FrameBudgetSignal;
|
|
126
|
+
telemetry?: ExecutionTelemetry;
|
|
127
|
+
minimumSamples?: number;
|
|
128
|
+
minimumMargin?: number;
|
|
129
|
+
/** Explicit opt-in; omitted means this experimental backend is disabled. */
|
|
130
|
+
experimental?: boolean;
|
|
131
|
+
}>);
|
|
132
|
+
execute(options?: ResidentWasmExecutionOptions): Promise<"packed-js" | "shared-worker-wasm">;
|
|
133
|
+
snapshot(): ResidentWorkerPromotionSnapshot;
|
|
134
|
+
}
|
|
135
|
+
export declare const residentWorkerControlSlots: Readonly<{
|
|
136
|
+
requestSequence: 0;
|
|
137
|
+
doneSequence: 1;
|
|
138
|
+
status: 2;
|
|
139
|
+
stop: 3;
|
|
140
|
+
rangeCount: 4;
|
|
141
|
+
errorCode: 5;
|
|
142
|
+
computeMicros: 6;
|
|
143
|
+
wasmCalls: 7;
|
|
144
|
+
}>;
|
|
145
|
+
//# sourceMappingURL=resident-worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resident-worker.d.ts","sourceRoot":"","sources":["../src/resident-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
import { ExecutionTelemetry, FrameBudgetSignal, } from "./index.js";
|
|
2
|
+
import { markResidentWasmRanges, prepareResidentWasmExecution, } from "./resident-wasm.js";
|
|
3
|
+
const CONTROL_REQUEST_SEQUENCE = 0;
|
|
4
|
+
const CONTROL_DONE_SEQUENCE = 1;
|
|
5
|
+
const CONTROL_STATUS = 2;
|
|
6
|
+
const CONTROL_STOP = 3;
|
|
7
|
+
const CONTROL_RANGE_COUNT = 4;
|
|
8
|
+
const CONTROL_ERROR_CODE = 5;
|
|
9
|
+
const CONTROL_COMPUTE_MICROS = 6;
|
|
10
|
+
const CONTROL_WASM_CALLS = 7;
|
|
11
|
+
function now() {
|
|
12
|
+
const clock = globalThis.performance;
|
|
13
|
+
return clock?.now() ?? Date.now();
|
|
14
|
+
}
|
|
15
|
+
/** Deterministic URL of the Worker entry copied into the published package. */
|
|
16
|
+
export function residentWorkerAssetUrl() {
|
|
17
|
+
const URLConstructor = globalThis.URL;
|
|
18
|
+
return new URLConstructor("./wasm/resident-worker.mjs", import.meta.url).href;
|
|
19
|
+
}
|
|
20
|
+
function messageData(value) {
|
|
21
|
+
if (typeof value === "object" && value !== null && "data" in value)
|
|
22
|
+
return value.data;
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
function isRecord(value) {
|
|
26
|
+
return typeof value === "object" && value !== null;
|
|
27
|
+
}
|
|
28
|
+
/** Reject row-bearing messages at the thread boundary. */
|
|
29
|
+
export function validateResidentWorkerControlMessage(value) {
|
|
30
|
+
if (!isRecord(value) || typeof value.type !== "string")
|
|
31
|
+
throw new TypeError("worker-control-payload-invalid");
|
|
32
|
+
for (const forbidden of ["rows", "values", "buffers", "columns", "payload"]) {
|
|
33
|
+
if (forbidden in value)
|
|
34
|
+
throw new TypeError(`worker-control-payload-invalid: ${forbidden}`);
|
|
35
|
+
}
|
|
36
|
+
if (value.type === "ready") {
|
|
37
|
+
if (value.variant !== "simd" && value.variant !== "scalar")
|
|
38
|
+
throw new TypeError("worker-control-payload-invalid");
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (value.type === "done") {
|
|
42
|
+
if (!Number.isSafeInteger(value.sequence))
|
|
43
|
+
throw new TypeError("worker-control-payload-invalid");
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (value.type === "error") {
|
|
47
|
+
if (typeof value.message !== "string")
|
|
48
|
+
throw new TypeError("worker-control-payload-invalid");
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (value.type !== "stopped")
|
|
52
|
+
throw new TypeError("worker-control-payload-invalid");
|
|
53
|
+
}
|
|
54
|
+
function initMessage(binding) {
|
|
55
|
+
return Object.freeze({
|
|
56
|
+
type: "init",
|
|
57
|
+
memory: binding.runtime.memory,
|
|
58
|
+
variant: binding.runtime.variant,
|
|
59
|
+
programPointer: binding.programPointer,
|
|
60
|
+
programWords: binding.program.words.length,
|
|
61
|
+
columnPointersPointer: binding.columnPointersPointer,
|
|
62
|
+
columnCount: binding.columnPointers.length,
|
|
63
|
+
rangesPointer: binding.rangesPointer,
|
|
64
|
+
capturesPointer: binding.capturesPointer,
|
|
65
|
+
captureCount: binding.program.captureNames.length,
|
|
66
|
+
controlPointer: binding.controlPointer,
|
|
67
|
+
...(binding.program.directSharedSimdModuleBytes && binding.program.directSharedSimdEntrypoint ? {
|
|
68
|
+
directSimdModuleBytes: binding.program.directSharedSimdModuleBytes,
|
|
69
|
+
directSimdEntrypoint: binding.program.directSharedSimdEntrypoint,
|
|
70
|
+
} : {}),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
function listen(worker, handler) {
|
|
74
|
+
const browserHandler = (event) => handler(messageData(event));
|
|
75
|
+
if (worker.addEventListener) {
|
|
76
|
+
worker.addEventListener("message", browserHandler);
|
|
77
|
+
return () => worker.removeEventListener?.("message", browserHandler);
|
|
78
|
+
}
|
|
79
|
+
if (worker.on) {
|
|
80
|
+
worker.on("message", handler);
|
|
81
|
+
return () => worker.off?.("message", handler);
|
|
82
|
+
}
|
|
83
|
+
throw new TypeError("resident Worker transport cannot receive control messages");
|
|
84
|
+
}
|
|
85
|
+
/** One shared-memory worker. Requests are atomic sequence changes, not row messages. */
|
|
86
|
+
export class ResidentSharedWorkerExecutor {
|
|
87
|
+
binding;
|
|
88
|
+
worker;
|
|
89
|
+
#ready;
|
|
90
|
+
#readyResolve;
|
|
91
|
+
#readyReject;
|
|
92
|
+
#pending = new Map();
|
|
93
|
+
#removeListener;
|
|
94
|
+
#closed = false;
|
|
95
|
+
constructor(binding, worker) {
|
|
96
|
+
if (!binding.runtime.shared || binding.buffer.kind !== "shared-wasm")
|
|
97
|
+
throw new TypeError("shared-memory-unavailable");
|
|
98
|
+
this.binding = binding;
|
|
99
|
+
this.worker = worker;
|
|
100
|
+
this.#ready = new Promise((resolve, reject) => {
|
|
101
|
+
this.#readyResolve = resolve;
|
|
102
|
+
this.#readyReject = reject;
|
|
103
|
+
});
|
|
104
|
+
this.#removeListener = listen(worker, message => this.#handleMessage(message));
|
|
105
|
+
worker.postMessage(initMessage(binding));
|
|
106
|
+
}
|
|
107
|
+
#handleMessage(message) {
|
|
108
|
+
try {
|
|
109
|
+
validateResidentWorkerControlMessage(message);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
this.#readyReject(error);
|
|
113
|
+
for (const pending of this.#pending.values())
|
|
114
|
+
pending.reject(error);
|
|
115
|
+
this.#pending.clear();
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (message.type === "ready") {
|
|
119
|
+
if (message.variant !== this.binding.runtime.variant)
|
|
120
|
+
this.#readyReject(new Error("worker WASM variant differs from the authoritative runtime"));
|
|
121
|
+
else
|
|
122
|
+
this.#readyResolve();
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (message.type === "error") {
|
|
126
|
+
const error = new Error(message.message);
|
|
127
|
+
if (message.sequence !== undefined) {
|
|
128
|
+
this.#pending.get(message.sequence)?.reject(error);
|
|
129
|
+
this.#pending.delete(message.sequence);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
this.#readyReject(error);
|
|
133
|
+
for (const pending of this.#pending.values())
|
|
134
|
+
pending.reject(error);
|
|
135
|
+
this.#pending.clear();
|
|
136
|
+
}
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
if (message.type !== "done")
|
|
140
|
+
return;
|
|
141
|
+
const pending = this.#pending.get(message.sequence);
|
|
142
|
+
if (!pending)
|
|
143
|
+
return;
|
|
144
|
+
this.#pending.delete(message.sequence);
|
|
145
|
+
const result = Atomics.load(this.binding.control, CONTROL_ERROR_CODE);
|
|
146
|
+
if (result !== 0) {
|
|
147
|
+
pending.reject(new Error(`shared resident WASM execution failed (${result})`));
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
markResidentWasmRanges(this.binding, pending.ranges);
|
|
151
|
+
const totalMs = now() - pending.started;
|
|
152
|
+
const computeMs = Atomics.load(this.binding.control, CONTROL_COMPUTE_MICROS) / 1000;
|
|
153
|
+
pending.resolve(Object.freeze({
|
|
154
|
+
backend: "shared-worker-wasm",
|
|
155
|
+
computeMs,
|
|
156
|
+
transferBytes: 0,
|
|
157
|
+
transferMs: 0,
|
|
158
|
+
materializationBytes: 0,
|
|
159
|
+
materializationMs: 0,
|
|
160
|
+
readbackBytes: 0,
|
|
161
|
+
readbackMs: 0,
|
|
162
|
+
synchronizationBytes: pending.synchronizationBytes,
|
|
163
|
+
synchronizationMs: Math.max(0, totalMs - computeMs),
|
|
164
|
+
totalMs,
|
|
165
|
+
wasmCalls: 1,
|
|
166
|
+
sequence: message.sequence,
|
|
167
|
+
}));
|
|
168
|
+
}
|
|
169
|
+
async execute(options = {}) {
|
|
170
|
+
if (this.#closed)
|
|
171
|
+
throw new Error("resident shared Worker is closed");
|
|
172
|
+
await this.#ready;
|
|
173
|
+
if (this.#pending.size !== 0)
|
|
174
|
+
throw new Error("resident shared Worker execution is already in flight");
|
|
175
|
+
const metadata = prepareResidentWasmExecution(this.binding, options);
|
|
176
|
+
const sequence = Atomics.load(this.binding.control, CONTROL_REQUEST_SEQUENCE) + 1;
|
|
177
|
+
Atomics.store(this.binding.control, CONTROL_RANGE_COUNT, metadata.rangeCount);
|
|
178
|
+
Atomics.store(this.binding.control, CONTROL_STATUS, 1);
|
|
179
|
+
Atomics.store(this.binding.control, CONTROL_ERROR_CODE, 0);
|
|
180
|
+
const started = now();
|
|
181
|
+
const result = new Promise((resolve, reject) => {
|
|
182
|
+
this.#pending.set(sequence, {
|
|
183
|
+
started,
|
|
184
|
+
synchronizationBytes: metadata.synchronizationBytes + 4,
|
|
185
|
+
ranges: Object.freeze((options.ranges ?? [{ start: 0, end: this.binding.length }]).map(range => Object.freeze({ ...range }))),
|
|
186
|
+
resolve,
|
|
187
|
+
reject,
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
Atomics.store(this.binding.control, CONTROL_REQUEST_SEQUENCE, sequence);
|
|
191
|
+
Atomics.notify(this.binding.control, CONTROL_REQUEST_SEQUENCE, 1);
|
|
192
|
+
return result;
|
|
193
|
+
}
|
|
194
|
+
async close() {
|
|
195
|
+
if (this.#closed)
|
|
196
|
+
return;
|
|
197
|
+
this.#closed = true;
|
|
198
|
+
Atomics.store(this.binding.control, CONTROL_STOP, 1);
|
|
199
|
+
Atomics.notify(this.binding.control, CONTROL_REQUEST_SEQUENCE, 1);
|
|
200
|
+
this.#removeListener();
|
|
201
|
+
await this.worker.terminate?.();
|
|
202
|
+
for (const pending of this.#pending.values())
|
|
203
|
+
pending.reject(new Error("resident shared Worker closed"));
|
|
204
|
+
this.#pending.clear();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Bound the number of persistent shared-memory resident Workers. A hot binding
|
|
209
|
+
* retains its initialized Worker and authoritative memory; cold idle bindings
|
|
210
|
+
* are evicted LRU when a new region needs capacity. Jobs for the same binding
|
|
211
|
+
* are serialized while different pool entries may execute concurrently.
|
|
212
|
+
*
|
|
213
|
+
* The pool intentionally does not choose Worker execution itself. Callers must
|
|
214
|
+
* still use `ResidentSharedWorkerPromotion`, which requires measured frame
|
|
215
|
+
* pressure and an end-to-end win over packed JavaScript.
|
|
216
|
+
*/
|
|
217
|
+
export class ResidentSharedWorkerPool {
|
|
218
|
+
maxWorkers;
|
|
219
|
+
workerFactory;
|
|
220
|
+
#entries = new Map();
|
|
221
|
+
#clock = 0;
|
|
222
|
+
#closed = false;
|
|
223
|
+
#createdWorkers = 0;
|
|
224
|
+
#evictedWorkers = 0;
|
|
225
|
+
#queuedJobs = 0;
|
|
226
|
+
#activeBindings = 0;
|
|
227
|
+
constructor(options) {
|
|
228
|
+
if (typeof options.workerFactory !== "function")
|
|
229
|
+
throw new TypeError("resident Worker pool requires a workerFactory");
|
|
230
|
+
const maxWorkers = Math.floor(options.maxWorkers ?? 2);
|
|
231
|
+
if (!Number.isSafeInteger(maxWorkers) || maxWorkers < 1 || maxWorkers > 16) {
|
|
232
|
+
throw new RangeError("resident Worker pool maxWorkers must be an integer in 1...16");
|
|
233
|
+
}
|
|
234
|
+
this.workerFactory = options.workerFactory;
|
|
235
|
+
this.maxWorkers = maxWorkers;
|
|
236
|
+
}
|
|
237
|
+
async #createEntry(binding) {
|
|
238
|
+
const worker = await this.workerFactory(binding);
|
|
239
|
+
this.#createdWorkers += 1;
|
|
240
|
+
return {
|
|
241
|
+
binding,
|
|
242
|
+
executor: new ResidentSharedWorkerExecutor(binding, worker),
|
|
243
|
+
tail: Promise.resolve(),
|
|
244
|
+
pending: 0,
|
|
245
|
+
lastUsed: ++this.#clock,
|
|
246
|
+
idle: Promise.resolve(),
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
#reserve(entry) {
|
|
250
|
+
if (entry.pending === 0) {
|
|
251
|
+
entry.idle = new Promise(resolve => { entry.resolveIdle = resolve; });
|
|
252
|
+
this.#activeBindings += 1;
|
|
253
|
+
}
|
|
254
|
+
entry.pending += 1;
|
|
255
|
+
this.#queuedJobs += 1;
|
|
256
|
+
entry.lastUsed = ++this.#clock;
|
|
257
|
+
return entry;
|
|
258
|
+
}
|
|
259
|
+
#release(entry) {
|
|
260
|
+
entry.pending = Math.max(0, entry.pending - 1);
|
|
261
|
+
this.#queuedJobs = Math.max(0, this.#queuedJobs - 1);
|
|
262
|
+
entry.lastUsed = ++this.#clock;
|
|
263
|
+
if (entry.pending === 0) {
|
|
264
|
+
this.#activeBindings = Math.max(0, this.#activeBindings - 1);
|
|
265
|
+
entry.resolveIdle?.();
|
|
266
|
+
entry.resolveIdle = undefined;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
async #acquire(binding) {
|
|
270
|
+
if (this.#closed)
|
|
271
|
+
throw new Error("resident shared Worker pool is closed");
|
|
272
|
+
while (true) {
|
|
273
|
+
const existing = this.#entries.get(binding);
|
|
274
|
+
if (existing)
|
|
275
|
+
return this.#reserve(await existing);
|
|
276
|
+
if (this.#entries.size < this.maxWorkers) {
|
|
277
|
+
const pending = this.#createEntry(binding);
|
|
278
|
+
this.#entries.set(binding, pending);
|
|
279
|
+
try {
|
|
280
|
+
return this.#reserve(await pending);
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
if (this.#entries.get(binding) === pending)
|
|
284
|
+
this.#entries.delete(binding);
|
|
285
|
+
throw error;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
const entries = await Promise.all(this.#entries.values());
|
|
289
|
+
const idle = entries.filter(entry => entry.pending === 0).sort((left, right) => left.lastUsed - right.lastUsed)[0];
|
|
290
|
+
if (idle) {
|
|
291
|
+
const current = this.#entries.get(idle.binding);
|
|
292
|
+
if (current && await current === idle)
|
|
293
|
+
this.#entries.delete(idle.binding);
|
|
294
|
+
await idle.executor.close();
|
|
295
|
+
this.#evictedWorkers += 1;
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
await Promise.race(entries.map(entry => entry.idle));
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
async execute(binding, options = {}) {
|
|
302
|
+
const entry = await this.#acquire(binding);
|
|
303
|
+
const run = entry.tail.then(() => entry.executor.execute(options));
|
|
304
|
+
entry.tail = run.then(() => undefined, () => undefined);
|
|
305
|
+
try {
|
|
306
|
+
return await run;
|
|
307
|
+
}
|
|
308
|
+
finally {
|
|
309
|
+
this.#release(entry);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
snapshot() {
|
|
313
|
+
return Object.freeze({
|
|
314
|
+
size: this.#entries.size,
|
|
315
|
+
maxWorkers: this.maxWorkers,
|
|
316
|
+
queuedJobs: this.#queuedJobs,
|
|
317
|
+
activeBindings: this.#activeBindings,
|
|
318
|
+
createdWorkers: this.#createdWorkers,
|
|
319
|
+
evictedWorkers: this.#evictedWorkers,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
async close() {
|
|
323
|
+
if (this.#closed)
|
|
324
|
+
return;
|
|
325
|
+
this.#closed = true;
|
|
326
|
+
const entries = await Promise.all(this.#entries.values());
|
|
327
|
+
this.#entries.clear();
|
|
328
|
+
await Promise.all(entries.map(async (entry) => {
|
|
329
|
+
await entry.tail;
|
|
330
|
+
await entry.executor.close();
|
|
331
|
+
}));
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/** Worker promotion requires both a measured win and live main-thread pressure. */
|
|
335
|
+
export class ResidentSharedWorkerPromotion {
|
|
336
|
+
executor;
|
|
337
|
+
packedJs;
|
|
338
|
+
frameBudget;
|
|
339
|
+
telemetry;
|
|
340
|
+
minimumSamples;
|
|
341
|
+
minimumMargin;
|
|
342
|
+
experimental;
|
|
343
|
+
#decision = "benchmarking";
|
|
344
|
+
#reason = "worker-frame-pressure-required";
|
|
345
|
+
#executions = 0;
|
|
346
|
+
#synchronizationBytes = 0;
|
|
347
|
+
constructor(options) {
|
|
348
|
+
if (typeof options.packedJs !== "function")
|
|
349
|
+
throw new TypeError("packed-js-baseline-required");
|
|
350
|
+
this.executor = options.executor;
|
|
351
|
+
this.packedJs = options.packedJs;
|
|
352
|
+
this.frameBudget = options.frameBudget;
|
|
353
|
+
this.telemetry = options.telemetry ?? new ExecutionTelemetry();
|
|
354
|
+
this.minimumSamples = Math.max(1, Math.floor(options.minimumSamples ?? 5));
|
|
355
|
+
this.minimumMargin = Math.min(0.9, Math.max(0, options.minimumMargin ?? 0.10));
|
|
356
|
+
this.experimental = options.experimental === true;
|
|
357
|
+
if (!this.experimental)
|
|
358
|
+
this.#reason = "experimental-disabled";
|
|
359
|
+
}
|
|
360
|
+
async execute(options = {}) {
|
|
361
|
+
this.#executions += 1;
|
|
362
|
+
if (!this.experimental)
|
|
363
|
+
return this.#runPackedJs(options);
|
|
364
|
+
const frame = this.frameBudget.snapshot();
|
|
365
|
+
if (frame.samples === 0 || frame.pressure < 1) {
|
|
366
|
+
this.#reason = "worker-frame-pressure-required";
|
|
367
|
+
return this.#runPackedJs(options);
|
|
368
|
+
}
|
|
369
|
+
if (this.#decision === "worker")
|
|
370
|
+
return this.#runWorker(options);
|
|
371
|
+
if (this.#decision === "packed-js")
|
|
372
|
+
return this.#runPackedJs(options);
|
|
373
|
+
const baseline = this.telemetry.recentPackedJsBaseline();
|
|
374
|
+
const candidate = this.telemetry.recentAggregate("shared-worker-wasm");
|
|
375
|
+
const backend = !baseline || (candidate !== null && baseline.samples <= candidate.samples)
|
|
376
|
+
? this.#runPackedJs(options)
|
|
377
|
+
: await this.#runWorker(options);
|
|
378
|
+
this.#updateDecision();
|
|
379
|
+
return backend;
|
|
380
|
+
}
|
|
381
|
+
#runPackedJs(options) {
|
|
382
|
+
const started = now();
|
|
383
|
+
this.packedJs();
|
|
384
|
+
const elapsed = now() - started;
|
|
385
|
+
markResidentWasmRanges(this.executor.binding, options.ranges);
|
|
386
|
+
this.telemetry.record({ backend: "packed-js", computeMs: elapsed, totalMs: elapsed });
|
|
387
|
+
return "packed-js";
|
|
388
|
+
}
|
|
389
|
+
async #runWorker(options) {
|
|
390
|
+
const metrics = await this.executor.execute(options);
|
|
391
|
+
this.#synchronizationBytes += metrics.synchronizationBytes;
|
|
392
|
+
this.telemetry.record(metrics);
|
|
393
|
+
return "shared-worker-wasm";
|
|
394
|
+
}
|
|
395
|
+
#updateDecision() {
|
|
396
|
+
const baseline = this.telemetry.recentPackedJsBaseline();
|
|
397
|
+
const candidate = this.telemetry.recentAggregate("shared-worker-wasm");
|
|
398
|
+
if (!baseline || !candidate || baseline.samples < this.minimumSamples || candidate.samples < this.minimumSamples) {
|
|
399
|
+
this.#reason = "insufficient-measured-samples";
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
const comparison = this.telemetry.compareRecentWithPackedJs("shared-worker-wasm");
|
|
403
|
+
if (comparison.wins && (comparison.ratio ?? Number.POSITIVE_INFINITY) <= 1 - this.minimumMargin) {
|
|
404
|
+
this.#decision = "worker";
|
|
405
|
+
this.#reason = "measured-win";
|
|
406
|
+
}
|
|
407
|
+
else {
|
|
408
|
+
this.#decision = "packed-js";
|
|
409
|
+
this.#reason = "no-measured-win";
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
snapshot() {
|
|
413
|
+
const frame = this.frameBudget.snapshot();
|
|
414
|
+
const comparison = this.telemetry.compareRecentWithPackedJs("shared-worker-wasm");
|
|
415
|
+
return Object.freeze({
|
|
416
|
+
decision: this.#decision,
|
|
417
|
+
reason: this.#reason,
|
|
418
|
+
baseline: this.telemetry.recentPackedJsBaseline(),
|
|
419
|
+
candidate: this.telemetry.recentAggregate("shared-worker-wasm"),
|
|
420
|
+
measuredRatio: comparison.ratio,
|
|
421
|
+
framePressure: frame.pressure,
|
|
422
|
+
frameSamples: frame.samples,
|
|
423
|
+
executions: this.#executions,
|
|
424
|
+
transferBytes: 0,
|
|
425
|
+
materializationBytes: 0,
|
|
426
|
+
readbackBytes: 0,
|
|
427
|
+
synchronizationBytes: this.#synchronizationBytes,
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
export const residentWorkerControlSlots = Object.freeze({
|
|
432
|
+
requestSequence: CONTROL_REQUEST_SEQUENCE,
|
|
433
|
+
doneSequence: CONTROL_DONE_SEQUENCE,
|
|
434
|
+
status: CONTROL_STATUS,
|
|
435
|
+
stop: CONTROL_STOP,
|
|
436
|
+
rangeCount: CONTROL_RANGE_COUNT,
|
|
437
|
+
errorCode: CONTROL_ERROR_CODE,
|
|
438
|
+
computeMicros: CONTROL_COMPUTE_MICROS,
|
|
439
|
+
wasmCalls: CONTROL_WASM_CALLS,
|
|
440
|
+
});
|
|
441
|
+
//# sourceMappingURL=resident-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resident-worker.js","sourceRoot":"","sources":["../src/resident-worker.ts"],"names":[],"mappings":"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"}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|