@uptimizr/sdk-core 0.1.2 → 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/aggregation/aggregator.d.ts +62 -0
- package/dist/aggregation/aggregator.d.ts.map +1 -0
- package/dist/aggregation/aggregator.js +194 -0
- package/dist/aggregation/aggregator.js.map +1 -0
- package/dist/aggregation/index.d.ts +14 -0
- package/dist/aggregation/index.d.ts.map +1 -0
- package/dist/aggregation/index.js +11 -0
- package/dist/aggregation/index.js.map +1 -0
- package/dist/aggregation/math.d.ts +63 -0
- package/dist/aggregation/math.d.ts.map +1 -0
- package/dist/aggregation/math.js +118 -0
- package/dist/aggregation/math.js.map +1 -0
- package/dist/aggregation/snapshot.d.ts +123 -0
- package/dist/aggregation/snapshot.d.ts.map +1 -0
- package/dist/aggregation/snapshot.js +16 -0
- package/dist/aggregation/snapshot.js.map +1 -0
- package/dist/aggregationSink.d.ts +67 -0
- package/dist/aggregationSink.d.ts.map +1 -0
- package/dist/aggregationSink.js +110 -0
- package/dist/aggregationSink.js.map +1 -0
- package/dist/client.d.ts +22 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +71 -3
- package/dist/client.js.map +1 -1
- package/dist/graphicsDiagnostics.d.ts +301 -0
- package/dist/graphicsDiagnostics.d.ts.map +1 -0
- package/dist/graphicsDiagnostics.js +409 -0
- package/dist/graphicsDiagnostics.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/offloadProtocol.d.ts +52 -8
- package/dist/offloadProtocol.d.ts.map +1 -1
- package/dist/offloadWorker.js +38 -7
- package/dist/offloadWorker.js.map +1 -1
- package/dist/processor.d.ts +2 -0
- package/dist/processor.d.ts.map +1 -1
- package/dist/processor.js +1 -1
- package/dist/processor.js.map +1 -1
- package/dist/types.d.ts +39 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
import { LIMITS } from "@uptimizr/schema";
|
|
2
|
+
const DEFAULT_MAX_ATTEMPTS = 20;
|
|
3
|
+
const DEFAULT_INTERVAL_MS = 250;
|
|
4
|
+
/**
|
|
5
|
+
* Wire a WebGPU `GPUDevice.lost` into a `graphics_diagnostic` (ADR 0021 part 2,
|
|
6
|
+
* `category: "device-lost"`). Engine-agnostic: every connector that can have a
|
|
7
|
+
* WebGPU device hands a device *getter* here, so the gating, severity mapping,
|
|
8
|
+
* length-cap, and event shape live in exactly one place.
|
|
9
|
+
*
|
|
10
|
+
* Behavior:
|
|
11
|
+
* - **Opt-in gate.** No-ops (nothing scheduled, nothing emitted) unless
|
|
12
|
+
* `ctx.config.captureGraphicsDiagnostics` is on. (Unlike `context_lost`, which is
|
|
13
|
+
* always-on; device loss is the richer opt-in diagnostic.)
|
|
14
|
+
* - **Async device init.** A WebGPU backend builds its device asynchronously
|
|
15
|
+
* (three's `renderer.init()` / first `renderAsync`, Babylon's `initAsync`), so
|
|
16
|
+
* the device is frequently `undefined` at collector `start()` time. We therefore
|
|
17
|
+
* take a *getter* and **poll** it (bounded by {@link WireGpuDeviceLostOptions})
|
|
18
|
+
* until the device appears, rather than reading once and silently giving up.
|
|
19
|
+
* - **Severity.** `info` when `reason === "destroyed"` (an expected, app-requested
|
|
20
|
+
* loss via `device.destroy()`); `fatal` otherwise (an unrequested loss —
|
|
21
|
+
* rendering cannot continue).
|
|
22
|
+
* - **Marker.** Emits a single discrete incident (no `count`): device loss is rare
|
|
23
|
+
* and decisive, so the high-fidelity marker is the right default here.
|
|
24
|
+
* - **Privacy.** The optional `message` is locally truncated to
|
|
25
|
+
* {@link LIMITS.maxGraphicsDiagnosticMessageLength} and rides through `ctx.emit`,
|
|
26
|
+
* which applies the client's `beforeSend` for deployer-owned redaction.
|
|
27
|
+
*
|
|
28
|
+
* Teardown is cooperative: pass an `isActive` predicate (typically `() => !stopped`).
|
|
29
|
+
* It is checked before each poll and again when `device.lost` resolves, so neither a
|
|
30
|
+
* pending poll nor a late device loss emits after the collector has stopped.
|
|
31
|
+
*
|
|
32
|
+
* @param ctx Collector context (config + `emit`).
|
|
33
|
+
* @param getDevice Returns the WebGPU device, or `undefined`/`null` while it is
|
|
34
|
+
* still initializing or on WebGL (where it never appears — a clean no-op). Must
|
|
35
|
+
* not throw; read the field defensively (optional chaining).
|
|
36
|
+
* @param isActive Returns `false` once the collector has been torn down.
|
|
37
|
+
* @param options Polling bounds (mainly for tests).
|
|
38
|
+
*/
|
|
39
|
+
export function wireGpuDeviceLost(ctx, getDevice, isActive, options) {
|
|
40
|
+
if (!ctx.config.captureGraphicsDiagnostics)
|
|
41
|
+
return;
|
|
42
|
+
const maxAttempts = options?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
|
|
43
|
+
const intervalMs = options?.intervalMs ?? DEFAULT_INTERVAL_MS;
|
|
44
|
+
let attempts = 0;
|
|
45
|
+
const attach = (device) => {
|
|
46
|
+
const lost = device.lost;
|
|
47
|
+
if (!lost || typeof lost.then !== "function")
|
|
48
|
+
return;
|
|
49
|
+
void lost.then((info) => {
|
|
50
|
+
if (!isActive())
|
|
51
|
+
return;
|
|
52
|
+
const reason = typeof info?.reason === "string" ? info.reason : undefined;
|
|
53
|
+
const severity = reason === "destroyed" ? "info" : "fatal";
|
|
54
|
+
const rawMessage = typeof info?.message === "string" ? info.message : undefined;
|
|
55
|
+
const message = rawMessage
|
|
56
|
+
? rawMessage.slice(0, LIMITS.maxGraphicsDiagnosticMessageLength)
|
|
57
|
+
: undefined;
|
|
58
|
+
ctx.emit({
|
|
59
|
+
type: "graphics_diagnostic",
|
|
60
|
+
severity,
|
|
61
|
+
category: "device-lost",
|
|
62
|
+
backend: "webgpu",
|
|
63
|
+
...(message ? { message } : {}),
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
const poll = () => {
|
|
68
|
+
if (!isActive())
|
|
69
|
+
return;
|
|
70
|
+
const device = getDevice();
|
|
71
|
+
if (device) {
|
|
72
|
+
attach(device);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
// Device not ready yet (async backend init). Retry on a bounded schedule; the
|
|
76
|
+
// WebGL path never produces a device, so this simply exhausts and stops.
|
|
77
|
+
attempts += 1;
|
|
78
|
+
if (attempts >= maxAttempts)
|
|
79
|
+
return;
|
|
80
|
+
setTimeout(poll, intervalMs);
|
|
81
|
+
};
|
|
82
|
+
poll();
|
|
83
|
+
}
|
|
84
|
+
export function createDiagnosticRollup(emit) {
|
|
85
|
+
let count = 0;
|
|
86
|
+
let first;
|
|
87
|
+
let timer;
|
|
88
|
+
const flush = () => {
|
|
89
|
+
if (count === 0)
|
|
90
|
+
return;
|
|
91
|
+
emit(count, first);
|
|
92
|
+
count = 0;
|
|
93
|
+
first = undefined;
|
|
94
|
+
};
|
|
95
|
+
return {
|
|
96
|
+
record(value) {
|
|
97
|
+
if (count === 0)
|
|
98
|
+
first = value;
|
|
99
|
+
count += 1;
|
|
100
|
+
},
|
|
101
|
+
get count() {
|
|
102
|
+
return count;
|
|
103
|
+
},
|
|
104
|
+
flush,
|
|
105
|
+
start(intervalMs) {
|
|
106
|
+
timer = setInterval(flush, intervalMs);
|
|
107
|
+
},
|
|
108
|
+
stop() {
|
|
109
|
+
if (timer)
|
|
110
|
+
clearInterval(timer);
|
|
111
|
+
timer = undefined;
|
|
112
|
+
flush();
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
const DEFAULT_FLUSH_INTERVAL_MS = 30_000;
|
|
117
|
+
/**
|
|
118
|
+
* Wire WebGPU `uncapturederror` into a **rate-limited per-session rollup**
|
|
119
|
+
* (ADR 0021 part 2, decision 4 / ADR 0012). This is the highest-volume diagnostic,
|
|
120
|
+
* so the default — and only — emission is aggregated: a burst of errors becomes a
|
|
121
|
+
* single `graphics_diagnostic` carrying `count: N` plus the first message, never N
|
|
122
|
+
* discrete events. Shared and engine-agnostic so every connector (Babylon, three,
|
|
123
|
+
* …) hands a device *getter* here and the gating, subtype mapping, length-cap,
|
|
124
|
+
* aggregation, and flush cadence live in exactly one place.
|
|
125
|
+
*
|
|
126
|
+
* Behavior:
|
|
127
|
+
* - **Opt-in gate.** No-ops unless `ctx.config.captureGraphicsDiagnostics` is on.
|
|
128
|
+
* - **Async device init.** Polls the getter (bounded, same as {@link wireGpuDeviceLost})
|
|
129
|
+
* until the WebGPU device appears, so a backend that builds its device async
|
|
130
|
+
* (three `renderer.init()`/`renderAsync`, Babylon `initAsync`) isn't missed.
|
|
131
|
+
* - **Subtype.** `GPUOutOfMemoryError` → `out-of-memory` (`severity: error`);
|
|
132
|
+
* anything else → `validation` (`severity: warning`). The most severe category
|
|
133
|
+
* seen wins for the rollup; the first message is kept.
|
|
134
|
+
* - **Rollup.** Accumulates `count` + first `message` and flushes one event on a
|
|
135
|
+
* bounded interval and again at teardown; emits nothing if no error occurred.
|
|
136
|
+
* - **Privacy.** `message` is truncated to {@link LIMITS.maxGraphicsDiagnosticMessageLength}
|
|
137
|
+
* and rides through `ctx.emit` (so `beforeSend` applies); raw shader source is excluded.
|
|
138
|
+
*
|
|
139
|
+
* @returns A teardown function that removes the listener, clears the timer, and
|
|
140
|
+
* flushes any pending rollup. Connectors call it from `stop()`/dispose.
|
|
141
|
+
* @param getDevice Returns the WebGPU device, or `undefined`/`null` while it is
|
|
142
|
+
* still initializing or on WebGL (a clean no-op). Must not throw.
|
|
143
|
+
* @param isActive Returns `false` once the collector is torn down — nothing emits after.
|
|
144
|
+
*/
|
|
145
|
+
export function wireGpuUncapturedError(ctx, getDevice, isActive, options) {
|
|
146
|
+
if (!ctx.config.captureGraphicsDiagnostics)
|
|
147
|
+
return () => { };
|
|
148
|
+
const maxAttempts = options?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
|
|
149
|
+
const intervalMs = options?.intervalMs ?? DEFAULT_INTERVAL_MS;
|
|
150
|
+
const flushIntervalMs = options?.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS;
|
|
151
|
+
let attempts = 0;
|
|
152
|
+
let firstMessage;
|
|
153
|
+
let category = "validation";
|
|
154
|
+
let device;
|
|
155
|
+
let listener;
|
|
156
|
+
const rollup = createDiagnosticRollup((n, first) => {
|
|
157
|
+
const severity = category === "out-of-memory" ? "error" : "warning";
|
|
158
|
+
ctx.emit({
|
|
159
|
+
type: "graphics_diagnostic",
|
|
160
|
+
severity,
|
|
161
|
+
category,
|
|
162
|
+
backend: "webgpu",
|
|
163
|
+
count: n,
|
|
164
|
+
...(first ? { message: first } : {}),
|
|
165
|
+
});
|
|
166
|
+
category = "validation";
|
|
167
|
+
});
|
|
168
|
+
const attach = (target) => {
|
|
169
|
+
if (typeof target.addEventListener !== "function")
|
|
170
|
+
return;
|
|
171
|
+
device = target;
|
|
172
|
+
listener = (e) => {
|
|
173
|
+
if (!isActive())
|
|
174
|
+
return;
|
|
175
|
+
const error = e?.error;
|
|
176
|
+
if (rollup.count === 0) {
|
|
177
|
+
const raw = typeof error?.message === "string" ? error.message : undefined;
|
|
178
|
+
firstMessage = raw ? raw.slice(0, LIMITS.maxGraphicsDiagnosticMessageLength) : undefined;
|
|
179
|
+
}
|
|
180
|
+
rollup.record(firstMessage);
|
|
181
|
+
if (error?.constructor?.name === "GPUOutOfMemoryError")
|
|
182
|
+
category = "out-of-memory";
|
|
183
|
+
};
|
|
184
|
+
target.addEventListener("uncapturederror", listener);
|
|
185
|
+
rollup.start(flushIntervalMs);
|
|
186
|
+
};
|
|
187
|
+
const poll = () => {
|
|
188
|
+
if (!isActive())
|
|
189
|
+
return;
|
|
190
|
+
const target = getDevice();
|
|
191
|
+
if (target) {
|
|
192
|
+
attach(target);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
attempts += 1;
|
|
196
|
+
if (attempts >= maxAttempts)
|
|
197
|
+
return;
|
|
198
|
+
setTimeout(poll, intervalMs);
|
|
199
|
+
};
|
|
200
|
+
poll();
|
|
201
|
+
return () => {
|
|
202
|
+
if (device && listener && typeof device.removeEventListener === "function") {
|
|
203
|
+
device.removeEventListener("uncapturederror", listener);
|
|
204
|
+
}
|
|
205
|
+
rollup.stop();
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
const DEFAULT_MAX_SHADER_INCIDENTS = 25;
|
|
209
|
+
/**
|
|
210
|
+
* Build a `graphics_diagnostic` for a shader compile/link **failure**. Pure and
|
|
211
|
+
* redaction-aware: the engine info log is the message (length-capped); raw shader
|
|
212
|
+
* `source` is appended **only** when the deployer opted in via `captureShaderSource`
|
|
213
|
+
* (ADR 0021 part 2 — source is application IP). Either way the result is capped to
|
|
214
|
+
* the schema limit and still rides through `beforeSend`.
|
|
215
|
+
*/
|
|
216
|
+
export function buildShaderCompileDiagnostic(input) {
|
|
217
|
+
const log = input.infoLog?.trim() ?? "";
|
|
218
|
+
const includeSource = input.captureShaderSource && input.source ? input.source : "";
|
|
219
|
+
const raw = includeSource ? `${log}\n${includeSource}`.trim() : log;
|
|
220
|
+
const message = raw ? raw.slice(0, LIMITS.maxGraphicsDiagnosticMessageLength) : undefined;
|
|
221
|
+
return {
|
|
222
|
+
type: "graphics_diagnostic",
|
|
223
|
+
severity: "error",
|
|
224
|
+
category: "shader-compile",
|
|
225
|
+
...(input.backend ? { backend: input.backend } : {}),
|
|
226
|
+
...(message ? { message } : {}),
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Capture WebGL shader compile and program link **failures** as
|
|
231
|
+
* `graphics_diagnostic` (`category: shader-compile`). Wraps the context's
|
|
232
|
+
* `compileShader`/`linkProgram`; on a failed status it reads the matching info log
|
|
233
|
+
* (and, when `captureShaderSource` is on, the shader source) and emits one capped,
|
|
234
|
+
* redactable diagnostic. Bounded per session so a build loop cannot flood ingestion.
|
|
235
|
+
*
|
|
236
|
+
* Opt-in: no-ops unless `ctx.config.captureGraphicsDiagnostics`. Returns a detach
|
|
237
|
+
* fn that restores the original methods.
|
|
238
|
+
*/
|
|
239
|
+
export function wireGlShaderDiagnostics(ctx, gl, isActive, options) {
|
|
240
|
+
if (!ctx.config.captureGraphicsDiagnostics)
|
|
241
|
+
return () => { };
|
|
242
|
+
const max = options?.maxIncidents ?? DEFAULT_MAX_SHADER_INCIDENTS;
|
|
243
|
+
const backend = gl.LINK_STATUS != null ? "webgl2" : "webgl";
|
|
244
|
+
const wantSource = ctx.config.captureShaderSource;
|
|
245
|
+
let count = 0;
|
|
246
|
+
if (typeof gl.compileShader !== "function" || typeof gl.linkProgram !== "function")
|
|
247
|
+
return () => { };
|
|
248
|
+
const origCompile = gl.compileShader.bind(gl);
|
|
249
|
+
const origLink = gl.linkProgram.bind(gl);
|
|
250
|
+
const emit = (infoLog, source) => {
|
|
251
|
+
if (!isActive() || count >= max)
|
|
252
|
+
return;
|
|
253
|
+
count += 1;
|
|
254
|
+
ctx.emit(buildShaderCompileDiagnostic({
|
|
255
|
+
backend,
|
|
256
|
+
captureShaderSource: wantSource,
|
|
257
|
+
...(infoLog ? { infoLog } : {}),
|
|
258
|
+
...(source ? { source } : {}),
|
|
259
|
+
}));
|
|
260
|
+
};
|
|
261
|
+
gl.compileShader = function (shader) {
|
|
262
|
+
origCompile(shader);
|
|
263
|
+
if (!isActive())
|
|
264
|
+
return;
|
|
265
|
+
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
266
|
+
const source = wantSource && gl.getShaderSource ? gl.getShaderSource(shader) : undefined;
|
|
267
|
+
emit(gl.getShaderInfoLog(shader), source ?? undefined);
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
gl.linkProgram = function (program) {
|
|
271
|
+
origLink(program);
|
|
272
|
+
if (!isActive())
|
|
273
|
+
return;
|
|
274
|
+
if (!gl.getProgramParameter(program, gl.LINK_STATUS))
|
|
275
|
+
emit(gl.getProgramInfoLog(program));
|
|
276
|
+
};
|
|
277
|
+
return () => {
|
|
278
|
+
gl.compileShader = origCompile;
|
|
279
|
+
gl.linkProgram = origLink;
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Capture WebGPU shader-module compile errors as `graphics_diagnostic`
|
|
284
|
+
* (`category: shader-compile`). Wraps `device.createShaderModule` and inspects the
|
|
285
|
+
* module's async `compilationInfo()` for `error` messages. Source (`descriptor.code`)
|
|
286
|
+
* is included only when `captureShaderSource` is on. Opt-in + bounded; returns detach.
|
|
287
|
+
*/
|
|
288
|
+
export function wireGpuShaderDiagnostics(ctx, device, isActive, options) {
|
|
289
|
+
if (!ctx.config.captureGraphicsDiagnostics)
|
|
290
|
+
return () => { };
|
|
291
|
+
const max = options?.maxIncidents ?? DEFAULT_MAX_SHADER_INCIDENTS;
|
|
292
|
+
const wantSource = ctx.config.captureShaderSource;
|
|
293
|
+
let count = 0;
|
|
294
|
+
if (typeof device.createShaderModule !== "function")
|
|
295
|
+
return () => { };
|
|
296
|
+
const orig = device.createShaderModule.bind(device);
|
|
297
|
+
device.createShaderModule = function (descriptor) {
|
|
298
|
+
const module = orig(descriptor);
|
|
299
|
+
const info = module.getCompilationInfo ?? module.compilationInfo;
|
|
300
|
+
if (typeof info === "function") {
|
|
301
|
+
void info.call(module).then((result) => {
|
|
302
|
+
if (!isActive() || count >= max)
|
|
303
|
+
return;
|
|
304
|
+
const errors = (result?.messages ?? []).filter((m) => m?.type === "error");
|
|
305
|
+
if (errors.length === 0)
|
|
306
|
+
return;
|
|
307
|
+
count += 1;
|
|
308
|
+
ctx.emit(buildShaderCompileDiagnostic({
|
|
309
|
+
backend: "webgpu",
|
|
310
|
+
captureShaderSource: wantSource,
|
|
311
|
+
infoLog: errors.map((m) => m.message ?? "").join("\n"),
|
|
312
|
+
...(descriptor?.code ? { source: descriptor.code } : {}),
|
|
313
|
+
}));
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
return module;
|
|
317
|
+
};
|
|
318
|
+
return () => {
|
|
319
|
+
device.createShaderModule = orig;
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
const DEFAULT_GL_ERROR_INTERVAL_MS = 5000;
|
|
323
|
+
const GL_NO_ERROR = 0;
|
|
324
|
+
/**
|
|
325
|
+
* Opportunistically **sample** `gl.getError()` and emit a rate-limited rollup
|
|
326
|
+
* `graphics_diagnostic` (`category: validation`, ADR 0021 part 2). Runs on a low-rate
|
|
327
|
+
* timer — never per-frame, since `getError()` forces a sync GPU stall (ADR forbids it).
|
|
328
|
+
* Non-`NO_ERROR` results are aggregated into a single `count`ed event flushed on the
|
|
329
|
+
* next tick (and on teardown), so a storm cannot flood ingestion. WebGPU has no
|
|
330
|
+
* `getError`, so passing nothing makes this a clean no-op.
|
|
331
|
+
*
|
|
332
|
+
* Opt-in: no-ops unless `captureGraphicsDiagnostics`. Returns a detach fn that flushes
|
|
333
|
+
* any pending rollup and clears the timer.
|
|
334
|
+
*/
|
|
335
|
+
export function wireGlErrorSampling(ctx, gl, isActive, options) {
|
|
336
|
+
if (!ctx.config.captureGraphicsDiagnostics)
|
|
337
|
+
return () => { };
|
|
338
|
+
const intervalMs = options?.intervalMs ?? DEFAULT_GL_ERROR_INTERVAL_MS;
|
|
339
|
+
const rollup = createDiagnosticRollup((n, first) => {
|
|
340
|
+
ctx.emit({
|
|
341
|
+
type: "graphics_diagnostic",
|
|
342
|
+
severity: "warning",
|
|
343
|
+
category: "validation",
|
|
344
|
+
...(first != null ? { code: `0x${first.toString(16)}` } : {}),
|
|
345
|
+
count: n,
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
const sample = () => {
|
|
349
|
+
if (!isActive())
|
|
350
|
+
return;
|
|
351
|
+
// Drain every pending GL error in one go: `getError()` reports one flag at a
|
|
352
|
+
// time, so we loop until NO_ERROR to fold a tick's full backlog into the rollup.
|
|
353
|
+
let code = gl.getError();
|
|
354
|
+
while (code !== GL_NO_ERROR) {
|
|
355
|
+
rollup.record(code);
|
|
356
|
+
code = gl.getError();
|
|
357
|
+
}
|
|
358
|
+
rollup.flush();
|
|
359
|
+
};
|
|
360
|
+
const timer = setInterval(sample, intervalMs);
|
|
361
|
+
return () => {
|
|
362
|
+
clearInterval(timer);
|
|
363
|
+
rollup.stop();
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Emit a one-shot context-creation failure as a `graphics_diagnostic`
|
|
368
|
+
* (ADR 0021 part 2, `category: "context-loss"`, `severity: "fatal"`) when a
|
|
369
|
+
* connector cannot obtain a rendering context/adapter at init. Engine-agnostic:
|
|
370
|
+
* every connector reduces its backend-specific check to a {@link ContextCreationProbe}
|
|
371
|
+
* so the gating, length-cap, and event shape live in exactly one place.
|
|
372
|
+
*
|
|
373
|
+
* Behavior:
|
|
374
|
+
* - **Opt-in gate.** No-ops unless `ctx.config.captureGraphicsDiagnostics` is on
|
|
375
|
+
* (mirroring {@link wireGpuDeviceLost}; `context_lost` runtime loss stays
|
|
376
|
+
* always-on, this *creation* case is the richer opt-in diagnostic).
|
|
377
|
+
* - **Discrete marker.** Emits a single incident with no `count`: a creation
|
|
378
|
+
* failure is rare and decisive, so the high-fidelity marker is the right default.
|
|
379
|
+
* - **Backend.** `unknown` when the connector can't determine which API failed
|
|
380
|
+
* (no context means little to introspect).
|
|
381
|
+
* - **Ordering.** Connectors call this at `start()`. The client sets `started`
|
|
382
|
+
* before running collectors, so the marker queues right after `session_start`
|
|
383
|
+
* and is flushed by the normal cadence even though no transport round-trip has
|
|
384
|
+
* happened yet.
|
|
385
|
+
* - **Privacy.** Any `message` is truncated to
|
|
386
|
+
* {@link LIMITS.maxGraphicsDiagnosticMessageLength} and rides `ctx.emit`, which
|
|
387
|
+
* applies the client's `beforeSend` for deployer-owned redaction.
|
|
388
|
+
*
|
|
389
|
+
* @param ctx Collector context (config + `emit`).
|
|
390
|
+
* @param probe The connector's context-creation result. Must not throw; read the
|
|
391
|
+
* engine defensively (optional chaining) and pass `{ failed: false }` on doubt.
|
|
392
|
+
*/
|
|
393
|
+
export function wireContextCreationFailure(ctx, probe) {
|
|
394
|
+
if (!ctx.config.captureGraphicsDiagnostics)
|
|
395
|
+
return;
|
|
396
|
+
if (!probe.failed)
|
|
397
|
+
return;
|
|
398
|
+
const message = probe.message
|
|
399
|
+
? probe.message.slice(0, LIMITS.maxGraphicsDiagnosticMessageLength)
|
|
400
|
+
: undefined;
|
|
401
|
+
ctx.emit({
|
|
402
|
+
type: "graphics_diagnostic",
|
|
403
|
+
severity: "fatal",
|
|
404
|
+
category: "context-loss",
|
|
405
|
+
backend: probe.backend ?? "unknown",
|
|
406
|
+
...(message ? { message } : {}),
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
//# sourceMappingURL=graphicsDiagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphicsDiagnostics.js","sourceRoot":"","sources":["../src/graphicsDiagnostics.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -15,9 +15,15 @@ export { classifyCameraGesture, DEFAULT_GESTURE_THRESHOLDS } from "./gesture.js"
|
|
|
15
15
|
export { CANONICAL_FRAME, toCanonicalAabb, toCanonicalDirection, toCanonicalPosition, toCanonicalQuat, fromCanonicalAabb, fromCanonicalDirection, fromCanonicalPosition, fromCanonicalQuat, } from "./coordinates.js";
|
|
16
16
|
export { decomposeWorldMatrix } from "./matrix.js";
|
|
17
17
|
export type { DecomposedTransform } from "./matrix.js";
|
|
18
|
+
export { createAggregator, collectSnapshotTransferables, percentileAsc, visibilityContribution, aabbClose, roundAabb, vec3Close, poseUnchanged, nodeSampleUnchanged, clamp01, } from "./aggregation/index.js";
|
|
19
|
+
export type { Aggregator, AggregatorConfig, AggregatorOptions, Snapshot, SnapshotChannel, CameraSnapshot, PerfSnapshot, NodeSnapshot, VisibilityMeshObservation, VisibilityTickSnapshot, VisibilityFlushSnapshot, GestureSnapshot, HoverSnapshot, VisibilityContribution, CameraPose, NodeSample, } from "./aggregation/index.js";
|
|
18
20
|
export { xrSource, xrHandedness } from "./xrInput.js";
|
|
21
|
+
export { wireGpuDeviceLost, wireGpuUncapturedError, wireContextCreationFailure, wireGlShaderDiagnostics, wireGpuShaderDiagnostics, wireGlErrorSampling, buildShaderCompileDiagnostic, createDiagnosticRollup, } from "./graphicsDiagnostics.js";
|
|
22
|
+
export type { GpuDeviceLostLike, GpuDeviceLostInfoLike, WireGpuDeviceLostOptions, GpuErrorLike, GpuDeviceErrorTargetLike, WireGpuUncapturedErrorOptions, ContextCreationProbe, DiagnosticRollup, ShaderDiagnosticsOptions, GlErrorSamplingOptions, WebGlShaderContextLike, WebGpuShaderDeviceLike, WebGlErrorContextLike, } from "./graphicsDiagnostics.js";
|
|
19
23
|
export type { Collector, CollectorContext, CollectorHandle, BeforeSendHook, EventInput, ResolvedConfig, StartMeta, TrackInputOptions, CapabilityChangeReport, Transport, UptimizrConfig, } from "./types.js";
|
|
20
24
|
export type { Processor, WorkerLike, WorkerFactory, WorkerProcessorOptions } from "./processor.js";
|
|
25
|
+
export { createMainSink, createWorkerAggregationSink } from "./aggregationSink.js";
|
|
26
|
+
export type { AggregationSink, WorkerAggregationSinkOptions } from "./aggregationSink.js";
|
|
21
27
|
export type { SampleRate, SamplingProfile, BoneSamplingConfig, NodeSamplingConfig, ResolvedCadence, } from "./sampling.js";
|
|
22
28
|
export type { CameraGestureSample, ClassifiedGesture, GestureThresholds, GestureClassifyOptions, } from "./gesture.js";
|
|
23
29
|
export type { XrInputSourceLike, XrCaptureOptions, XrRayHit, XrRayProbe } from "./xrInput.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAClG,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AACjF,OAAO,EACL,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAClG,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AACjF,OAAO,EACL,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EACL,gBAAgB,EAChB,4BAA4B,EAC5B,aAAa,EACb,sBAAsB,EACtB,SAAS,EACT,SAAS,EACT,SAAS,EACT,aAAa,EACb,mBAAmB,EACnB,OAAO,GACR,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,QAAQ,EACR,eAAe,EACf,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACvB,eAAe,EACf,aAAa,EACb,sBAAsB,EACtB,UAAU,EACV,UAAU,GACX,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,0BAA0B,EAC1B,uBAAuB,EACvB,wBAAwB,EACxB,mBAAmB,EACnB,4BAA4B,EAC5B,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,EACxB,YAAY,EACZ,wBAAwB,EACxB,6BAA6B,EAC7B,oBAAoB,EACpB,gBAAgB,EAChB,wBAAwB,EACxB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,0BAA0B,CAAC;AAElC,YAAY,EACV,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,UAAU,EACV,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,sBAAsB,EACtB,SAAS,EACT,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnF,YAAY,EAAE,eAAe,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAE1F,YAAY,EACV,UAAU,EACV,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -14,5 +14,8 @@ export { resolveCadence } from "./sampling.js";
|
|
|
14
14
|
export { classifyCameraGesture, DEFAULT_GESTURE_THRESHOLDS } from "./gesture.js";
|
|
15
15
|
export { CANONICAL_FRAME, toCanonicalAabb, toCanonicalDirection, toCanonicalPosition, toCanonicalQuat, fromCanonicalAabb, fromCanonicalDirection, fromCanonicalPosition, fromCanonicalQuat, } from "./coordinates.js";
|
|
16
16
|
export { decomposeWorldMatrix } from "./matrix.js";
|
|
17
|
+
export { createAggregator, collectSnapshotTransferables, percentileAsc, visibilityContribution, aabbClose, roundAabb, vec3Close, poseUnchanged, nodeSampleUnchanged, clamp01, } from "./aggregation/index.js";
|
|
17
18
|
export { xrSource, xrHandedness } from "./xrInput.js";
|
|
19
|
+
export { wireGpuDeviceLost, wireGpuUncapturedError, wireContextCreationFailure, wireGlShaderDiagnostics, wireGpuShaderDiagnostics, wireGlErrorSampling, buildShaderCompileDiagnostic, createDiagnosticRollup, } from "./graphicsDiagnostics.js";
|
|
20
|
+
export { createMainSink, createWorkerAggregationSink } from "./aggregationSink.js";
|
|
18
21
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAClG,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AACjF,OAAO,EACL,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAClG,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AACjF,OAAO,EACL,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EACL,gBAAgB,EAChB,4BAA4B,EAC5B,aAAa,EACb,sBAAsB,EACtB,SAAS,EACT,SAAS,EACT,SAAS,EACT,aAAa,EACb,mBAAmB,EACnB,OAAO,GACR,MAAM,wBAAwB,CAAC;AAmBhC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,0BAA0B,EAC1B,uBAAuB,EACvB,wBAAwB,EACxB,mBAAmB,EACnB,4BAA4B,EAC5B,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAgClC,OAAO,EAAE,cAAc,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -1,17 +1,25 @@
|
|
|
1
1
|
import type { CollectRequest } from "@uptimizr/schema";
|
|
2
|
+
import type { AggregatorConfig } from "./aggregation/aggregator.js";
|
|
3
|
+
import type { Snapshot } from "./aggregation/snapshot.js";
|
|
4
|
+
import type { EventInput } from "./types.js";
|
|
2
5
|
/**
|
|
3
6
|
* Wire protocol for the opt-in offload worker (ADR 0031).
|
|
4
7
|
*
|
|
5
8
|
* These are **type-only** definitions shared by the main-thread processor
|
|
6
|
-
* ([`processor.ts`](./processor.ts))
|
|
9
|
+
* ([`processor.ts`](./processor.ts)), the aggregation sink
|
|
10
|
+
* ([`aggregationSink.ts`](./aggregationSink.ts)) and the worker entry
|
|
7
11
|
* ([`offloadWorker.ts`](./offloadWorker.ts)). Keeping the protocol in its own
|
|
8
12
|
* module (with no runtime exports) means the worker bundle pulls in none of the
|
|
9
|
-
*
|
|
13
|
+
* main-thread runtime code — it stays tiny.
|
|
10
14
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
+
* Two roles cross the boundary:
|
|
16
|
+
* - **Transport** (#93–99): a finalized plain-data `CollectRequest` batch travels
|
|
17
|
+
* to the worker to be serialized + dispatched; only an ack comes back.
|
|
18
|
+
* - **Aggregation** (#10): raw plain-number {@link Snapshot} DTOs travel to the
|
|
19
|
+
* worker (high-volume channels by transfer), are aggregated worker-side into
|
|
20
|
+
* finalized {@link EventInput}s, and those come back to the page for the
|
|
21
|
+
* envelope/`beforeSend`/queue/transport machinery — so the unload guarantee
|
|
22
|
+
* (ADR 0031 §5) and `beforeSend` (a main-thread closure) are preserved.
|
|
15
23
|
*/
|
|
16
24
|
/** Sets the collector URL the worker dispatches to. Sent once at construction. */
|
|
17
25
|
export interface WorkerInitMessage {
|
|
@@ -27,14 +35,50 @@ export interface WorkerBatchMessage {
|
|
|
27
35
|
/** The plain-data batch to serialize and send. */
|
|
28
36
|
batch: CollectRequest;
|
|
29
37
|
}
|
|
38
|
+
/** Configures the worker-resident aggregator. Sent once at construction. */
|
|
39
|
+
export interface WorkerAggInitMessage {
|
|
40
|
+
type: "aggInit";
|
|
41
|
+
/** Serializable per-channel aggregation config (no callbacks/handles). */
|
|
42
|
+
config: AggregatorConfig;
|
|
43
|
+
}
|
|
44
|
+
/** A raw snapshot DTO to aggregate worker-side (ADR 0031 follow-up, #10). */
|
|
45
|
+
export interface WorkerSnapshotMessage {
|
|
46
|
+
type: "snapshot";
|
|
47
|
+
/** Capture timestamp (epoch ms) stamped on the page; carried onto emitted events. */
|
|
48
|
+
capturedAt: number;
|
|
49
|
+
/** The plain-number snapshot to ingest. */
|
|
50
|
+
snapshot: Snapshot;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Drain barrier for the terminal unload flush (ADR 0031 §5). Because
|
|
54
|
+
* `postMessage` is ordered, by the time the worker echoes this back every prior
|
|
55
|
+
* snapshot's finalized events have already been posted to the page.
|
|
56
|
+
*/
|
|
57
|
+
export interface WorkerFlushUnloadMessage {
|
|
58
|
+
type: "flushUnload";
|
|
59
|
+
id: number;
|
|
60
|
+
}
|
|
30
61
|
/** Messages the main thread sends to the worker. */
|
|
31
|
-
export type WorkerInbound = WorkerInitMessage | WorkerBatchMessage;
|
|
62
|
+
export type WorkerInbound = WorkerInitMessage | WorkerBatchMessage | WorkerAggInitMessage | WorkerSnapshotMessage | WorkerFlushUnloadMessage;
|
|
32
63
|
/** The delivery result for one batch, reported back to the main thread. */
|
|
33
64
|
export interface WorkerResultMessage {
|
|
34
65
|
type: "result";
|
|
35
66
|
id: number;
|
|
36
67
|
ok: boolean;
|
|
37
68
|
}
|
|
69
|
+
/** Finalized events produced by the worker-resident aggregator (#10). */
|
|
70
|
+
export interface WorkerEventsMessage {
|
|
71
|
+
type: "events";
|
|
72
|
+
/** The `capturedAt` of the snapshot that produced these events (for `ts`). */
|
|
73
|
+
capturedAt: number;
|
|
74
|
+
/** Finalized, envelope-less events to emit on the page. */
|
|
75
|
+
events: EventInput[];
|
|
76
|
+
}
|
|
77
|
+
/** Ack that the unload drain barrier has been reached (#10). */
|
|
78
|
+
export interface WorkerUnloadDoneMessage {
|
|
79
|
+
type: "unloadDone";
|
|
80
|
+
id: number;
|
|
81
|
+
}
|
|
38
82
|
/** Messages the worker sends back to the main thread. */
|
|
39
|
-
export type WorkerOutbound = WorkerResultMessage;
|
|
83
|
+
export type WorkerOutbound = WorkerResultMessage | WorkerEventsMessage | WorkerUnloadDoneMessage;
|
|
40
84
|
//# sourceMappingURL=offloadProtocol.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"offloadProtocol.d.ts","sourceRoot":"","sources":["../src/offloadProtocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD
|
|
1
|
+
{"version":3,"file":"offloadProtocol.d.ts","sourceRoot":"","sources":["../src/offloadProtocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;;;;;;;;;;;;;;;;GAkBG;AAEH,kFAAkF;AAClF,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,GAAG,EAAE,MAAM,CAAC;CACb;AAED,6DAA6D;AAC7D,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,mEAAmE;IACnE,EAAE,EAAE,MAAM,CAAC;IACX,kDAAkD;IAClD,KAAK,EAAE,cAAc,CAAC;CACvB;AAED,4EAA4E;AAC5E,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,SAAS,CAAC;IAChB,0EAA0E;IAC1E,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAED,6EAA6E;AAC7E,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,UAAU,CAAC;IACjB,qFAAqF;IACrF,UAAU,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,aAAa,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,oDAAoD;AACpD,MAAM,MAAM,aAAa,GACrB,iBAAiB,GACjB,kBAAkB,GAClB,oBAAoB,GACpB,qBAAqB,GACrB,wBAAwB,CAAC;AAE7B,2EAA2E;AAC3E,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,QAAQ,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,OAAO,CAAC;CACb;AAED,yEAAyE;AACzE,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,QAAQ,CAAC;IACf,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB;AAED,gEAAgE;AAChE,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,YAAY,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,yDAAyD;AACzD,MAAM,MAAM,cAAc,GAAG,mBAAmB,GAAG,mBAAmB,GAAG,uBAAuB,CAAC"}
|
package/dist/offloadWorker.js
CHANGED
|
@@ -1,18 +1,50 @@
|
|
|
1
|
+
import { createAggregator } from "./aggregation/aggregator.js";
|
|
1
2
|
// The build uses the DOM lib (not WebWorker), so narrow `self` structurally.
|
|
2
3
|
const scope = self;
|
|
3
4
|
/** Resolved collector URL, set by the `init` message before any batch arrives. */
|
|
4
5
|
let collectUrl = "";
|
|
6
|
+
/** Worker-resident aggregator, created on `aggInit`. Buffers events per ingest. */
|
|
7
|
+
let aggregator;
|
|
8
|
+
let eventBuffer = [];
|
|
5
9
|
scope.addEventListener("message", (event) => {
|
|
6
10
|
const message = event.data;
|
|
7
11
|
if (!message) {
|
|
8
12
|
return;
|
|
9
13
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
switch (message.type) {
|
|
15
|
+
case "init":
|
|
16
|
+
collectUrl = message.url;
|
|
17
|
+
return;
|
|
18
|
+
case "batch":
|
|
19
|
+
void dispatch(message.id, message.batch);
|
|
20
|
+
return;
|
|
21
|
+
case "aggInit":
|
|
22
|
+
aggregator = createAggregator({
|
|
23
|
+
...message.config,
|
|
24
|
+
emit: (e) => eventBuffer.push(e),
|
|
25
|
+
});
|
|
26
|
+
return;
|
|
27
|
+
case "snapshot": {
|
|
28
|
+
if (!aggregator)
|
|
29
|
+
return;
|
|
30
|
+
eventBuffer = [];
|
|
31
|
+
aggregator.ingest(message.snapshot);
|
|
32
|
+
if (eventBuffer.length > 0) {
|
|
33
|
+
const out = {
|
|
34
|
+
type: "events",
|
|
35
|
+
capturedAt: message.capturedAt,
|
|
36
|
+
events: eventBuffer,
|
|
37
|
+
};
|
|
38
|
+
eventBuffer = [];
|
|
39
|
+
scope.postMessage(out);
|
|
40
|
+
}
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
case "flushUnload": {
|
|
44
|
+
const done = { type: "unloadDone", id: message.id };
|
|
45
|
+
scope.postMessage(done);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
16
48
|
}
|
|
17
49
|
});
|
|
18
50
|
/** Serialize and POST one batch, then report the outcome back to the page. */
|
|
@@ -37,5 +69,4 @@ async function dispatch(id, batch) {
|
|
|
37
69
|
const result = { type: "result", id, ok };
|
|
38
70
|
scope.postMessage(result);
|
|
39
71
|
}
|
|
40
|
-
export {};
|
|
41
72
|
//# sourceMappingURL=offloadWorker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"offloadWorker.js","sourceRoot":"","sources":["../src/offloadWorker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"offloadWorker.js","sourceRoot":"","sources":["../src/offloadWorker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAmB,MAAM,6BAA6B,CAAC;AAkChF,6EAA6E;AAC7E,MAAM,KAAK,GAAG,IAA8B,CAAC;AAE7C,kFAAkF;AAClF,IAAI,UAAU,GAAG,EAAE,CAAC;AAEpB,mFAAmF;AACnF,IAAI,UAAkC,CAAC;AACvC,IAAI,WAAW,GAAiB,EAAE,CAAC;AAEnC,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;IAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAiC,CAAC;IACxD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IACD,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,MAAM;YACT,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;YACzB,OAAO;QACT,KAAK,OAAO;YACV,KAAK,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YACzC,OAAO;QACT,KAAK,SAAS;YACZ,UAAU,GAAG,gBAAgB,CAAC;gBAC5B,GAAG,OAAO,CAAC,MAAM;gBACjB,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;aACjC,CAAC,CAAC;YACH,OAAO;QACT,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,IAAI,CAAC,UAAU;gBAAE,OAAO;YACxB,WAAW,GAAG,EAAE,CAAC;YACjB,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACpC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,GAAG,GAAwB;oBAC/B,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,MAAM,EAAE,WAAW;iBACpB,CAAC;gBACF,WAAW,GAAG,EAAE,CAAC;gBACjB,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;YACD,OAAO;QACT,CAAC;QACD,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,IAAI,GAA4B,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;YAC7E,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,KAAK,UAAU,QAAQ,CAAC,EAAU,EAAE,KAAc;IAChD,IAAI,EAAE,GAAG,KAAK,CAAC;IACf,IAAI,CAAC;QACH,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE;gBACxC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI;gBACJ,yEAAyE;gBACzE,SAAS,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM;aAChC,CAAC,CAAC;YACH,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,EAAE,GAAG,KAAK,CAAC;IACb,CAAC;IACD,MAAM,MAAM,GAAwB,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAC/D,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC"}
|
package/dist/processor.d.ts
CHANGED
|
@@ -88,6 +88,8 @@ export interface WorkerProcessorOptions {
|
|
|
88
88
|
* channels that opt in must own a fresh buffer per batch.
|
|
89
89
|
*/
|
|
90
90
|
export declare function collectTransferables(batch: CollectRequest): Transferable[];
|
|
91
|
+
/** Default factory: a module worker shipped alongside the SDK in `dist/`. */
|
|
92
|
+
export declare function defaultWorkerFactory(): WorkerLike;
|
|
91
93
|
/**
|
|
92
94
|
* Create a worker-backed processor that runs steady-state serialization +
|
|
93
95
|
* dispatch off the main thread (ADR 0031). Returns `null` when a worker cannot
|