@ifc-lite/load-trace 0.0.0-stage → 0.2.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/LICENSE +373 -0
- package/README.md +130 -2
- package/dist/call-meter.d.ts +16 -0
- package/dist/call-meter.d.ts.map +1 -0
- package/dist/call-meter.js +50 -0
- package/dist/call-meter.js.map +1 -0
- package/dist/chrome-trace.d.ts +23 -0
- package/dist/chrome-trace.d.ts.map +1 -0
- package/dist/chrome-trace.js +53 -0
- package/dist/chrome-trace.js.map +1 -0
- package/dist/counters.d.ts +34 -0
- package/dist/counters.d.ts.map +1 -0
- package/dist/counters.js +69 -0
- package/dist/counters.js.map +1 -0
- package/dist/frames.d.ts +69 -0
- package/dist/frames.d.ts.map +1 -0
- package/dist/frames.js +85 -0
- package/dist/frames.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/load-trace.d.ts +62 -0
- package/dist/load-trace.d.ts.map +1 -0
- package/dist/load-trace.js +199 -0
- package/dist/load-trace.js.map +1 -0
- package/dist/messages.d.ts +43 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +137 -0
- package/dist/messages.js.map +1 -0
- package/dist/perf-sink.d.ts +15 -0
- package/dist/perf-sink.d.ts.map +1 -0
- package/dist/perf-sink.js +37 -0
- package/dist/perf-sink.js.map +1 -0
- package/dist/tree.d.ts +11 -0
- package/dist/tree.d.ts.map +1 -0
- package/dist/tree.js +25 -0
- package/dist/tree.js.map +1 -0
- package/dist/types.d.ts +70 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/worker-phases.d.ts +44 -0
- package/dist/worker-phases.d.ts.map +1 -0
- package/dist/worker-phases.js +78 -0
- package/dist/worker-phases.js.map +1 -0
- package/dist/worker.d.ts +72 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +120 -0
- package/dist/worker.js.map +1 -0
- package/package.json +46 -3
package/dist/worker.js
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { perfCounters } from './counters.js';
|
|
5
|
+
import { accountWorkerOutput } from './messages.js';
|
|
6
|
+
/** Main -> worker: start recording, labelling spans with `thread`. */
|
|
7
|
+
export const TRACE_ENABLE_MESSAGE = 'load-trace:enable';
|
|
8
|
+
/** Worker -> main: finished spans, see `WorkerTracePayload`. */
|
|
9
|
+
export const TRACE_SPANS_MESSAGE = 'load-trace:spans';
|
|
10
|
+
/**
|
|
11
|
+
* Records spans on the worker's own clock. `timeOrigin` travels with every
|
|
12
|
+
* drained payload so the main thread can shift the spans onto its clock: a
|
|
13
|
+
* worker's `performance.now()` is relative to the WORKER's creation time.
|
|
14
|
+
*/
|
|
15
|
+
export function createWorkerSpanRecorder(thread, now = () => performance.now(), timeOrigin = performance.timeOrigin) {
|
|
16
|
+
const open = new Map();
|
|
17
|
+
let done = [];
|
|
18
|
+
let next = 0;
|
|
19
|
+
return {
|
|
20
|
+
thread,
|
|
21
|
+
begin(name, attrs) {
|
|
22
|
+
const token = next++;
|
|
23
|
+
open.set(token, { name, start: now(), end: Number.NaN, ...(attrs ? { attrs: { ...attrs } } : {}) });
|
|
24
|
+
return token;
|
|
25
|
+
},
|
|
26
|
+
end(token, attrs) {
|
|
27
|
+
const span = open.get(token);
|
|
28
|
+
if (!span)
|
|
29
|
+
return;
|
|
30
|
+
open.delete(token);
|
|
31
|
+
span.end = now();
|
|
32
|
+
if (attrs)
|
|
33
|
+
span.attrs = { ...span.attrs, ...attrs };
|
|
34
|
+
done.push(span);
|
|
35
|
+
},
|
|
36
|
+
endNamed(name) {
|
|
37
|
+
for (const [token, span] of open) {
|
|
38
|
+
if (span.name !== name)
|
|
39
|
+
continue;
|
|
40
|
+
open.delete(token);
|
|
41
|
+
span.end = now();
|
|
42
|
+
done.push(span);
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
drain() {
|
|
46
|
+
if (done.length === 0)
|
|
47
|
+
return null;
|
|
48
|
+
const spans = done;
|
|
49
|
+
done = [];
|
|
50
|
+
return { thread, timeOrigin, spans };
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export function createWorkerTraceHost(options) {
|
|
55
|
+
let recorder = null;
|
|
56
|
+
const seenOnce = new Set();
|
|
57
|
+
const once = new Set(options.onceTypes ?? []);
|
|
58
|
+
const counters = options.counters ?? perfCounters;
|
|
59
|
+
let countedEndpoint;
|
|
60
|
+
const flush = (rec) => {
|
|
61
|
+
const payload = rec.drain();
|
|
62
|
+
const moved = counters.drain();
|
|
63
|
+
if (!payload && !moved)
|
|
64
|
+
return;
|
|
65
|
+
const out = payload ?? { thread: rec.thread, timeOrigin: options.timeOrigin ?? performance.timeOrigin, spans: [] };
|
|
66
|
+
options.post({ type: TRACE_SPANS_MESSAGE, payload: moved ? { ...out, counters: moved } : out });
|
|
67
|
+
};
|
|
68
|
+
const host = async (data, run) => {
|
|
69
|
+
const type = data?.type;
|
|
70
|
+
if (type === TRACE_ENABLE_MESSAGE) {
|
|
71
|
+
const thread = data.thread;
|
|
72
|
+
recorder = createWorkerSpanRecorder(typeof thread === 'string' ? thread : 'worker', options.now, options.timeOrigin);
|
|
73
|
+
seenOnce.clear(); // a pooled worker (#7036) serves several loads: each gets its first-chunk span
|
|
74
|
+
counters.enable();
|
|
75
|
+
counters.drain(); // only what happens from here on belongs to a load
|
|
76
|
+
const endpoint = options.endpoint?.();
|
|
77
|
+
if (endpoint && endpoint !== countedEndpoint) {
|
|
78
|
+
accountWorkerOutput(endpoint, counters, () => { if (recorder)
|
|
79
|
+
flush(recorder); });
|
|
80
|
+
countedEndpoint = endpoint;
|
|
81
|
+
}
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const rec = recorder;
|
|
85
|
+
if (!rec)
|
|
86
|
+
return run();
|
|
87
|
+
const name = typeof type === 'string' ? options.spanNames[type] : undefined;
|
|
88
|
+
const traced = name !== undefined && !(once.has(type) && seenOnce.has(type));
|
|
89
|
+
if (traced && once.has(type))
|
|
90
|
+
seenOnce.add(type);
|
|
91
|
+
const token = traced ? rec.begin(name) : -1;
|
|
92
|
+
try {
|
|
93
|
+
await run();
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
if (traced)
|
|
97
|
+
rec.end(token);
|
|
98
|
+
flush(rec);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
return Object.assign(host, {
|
|
102
|
+
flush: (completedSpan) => {
|
|
103
|
+
if (!recorder)
|
|
104
|
+
return;
|
|
105
|
+
if (completedSpan !== undefined)
|
|
106
|
+
recorder.endNamed(completedSpan);
|
|
107
|
+
flush(recorder);
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/** Ask `worker` to record spans for `trace` (no-op when tracing is off). Returns `worker`. */
|
|
112
|
+
export function enableWorkerTrace(worker, trace, thread) {
|
|
113
|
+
if (trace.enabled)
|
|
114
|
+
worker.postMessage({ type: TRACE_ENABLE_MESSAGE, thread });
|
|
115
|
+
return worker;
|
|
116
|
+
}
|
|
117
|
+
export function isTraceSpansMessage(message) {
|
|
118
|
+
return message?.type === TRACE_SPANS_MESSAGE;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,49 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ifc-lite/load-trace",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Dependency-free load-trace spans: performance.measure plus a per-load, cross-thread span tree with worker clock alignment and Chrome-trace export",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"@types/node": "^26.6.4",
|
|
17
|
+
"typescript": "^6.0.3",
|
|
18
|
+
"vitest": "^5.0.3"
|
|
19
|
+
},
|
|
20
|
+
"license": "MPL-2.0",
|
|
21
|
+
"author": "Louis True",
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "https://github.com/LTplus-AG/ifc-lite.git",
|
|
25
|
+
"directory": "packages/load-trace"
|
|
26
|
+
},
|
|
27
|
+
"homepage": "https://ifclite.dev/docs/",
|
|
28
|
+
"bugs": "https://github.com/LTplus-AG/ifc-lite/issues",
|
|
29
|
+
"keywords": [
|
|
30
|
+
"ifc",
|
|
31
|
+
"bim",
|
|
32
|
+
"performance",
|
|
33
|
+
"tracing",
|
|
34
|
+
"user-timing"
|
|
35
|
+
],
|
|
36
|
+
"publishConfig": {
|
|
37
|
+
"access": "public"
|
|
38
|
+
},
|
|
39
|
+
"files": [
|
|
40
|
+
"dist",
|
|
41
|
+
"README.md"
|
|
42
|
+
],
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "pnpm exec tsc",
|
|
45
|
+
"typecheck": "node ../../scripts/typecheck-tests.mjs",
|
|
46
|
+
"dev": "pnpm exec tsc --watch",
|
|
47
|
+
"test": "vitest run"
|
|
48
|
+
}
|
|
6
49
|
}
|