@ifc-lite/load-trace 0.0.0-stage → 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.
Files changed (51) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +130 -2
  3. package/dist/call-meter.d.ts +16 -0
  4. package/dist/call-meter.d.ts.map +1 -0
  5. package/dist/call-meter.js +50 -0
  6. package/dist/call-meter.js.map +1 -0
  7. package/dist/chrome-trace.d.ts +23 -0
  8. package/dist/chrome-trace.d.ts.map +1 -0
  9. package/dist/chrome-trace.js +53 -0
  10. package/dist/chrome-trace.js.map +1 -0
  11. package/dist/counters.d.ts +34 -0
  12. package/dist/counters.d.ts.map +1 -0
  13. package/dist/counters.js +69 -0
  14. package/dist/counters.js.map +1 -0
  15. package/dist/frames.d.ts +69 -0
  16. package/dist/frames.d.ts.map +1 -0
  17. package/dist/frames.js +85 -0
  18. package/dist/frames.js.map +1 -0
  19. package/dist/index.d.ts +12 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +13 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/load-trace.d.ts +62 -0
  24. package/dist/load-trace.d.ts.map +1 -0
  25. package/dist/load-trace.js +199 -0
  26. package/dist/load-trace.js.map +1 -0
  27. package/dist/messages.d.ts +43 -0
  28. package/dist/messages.d.ts.map +1 -0
  29. package/dist/messages.js +137 -0
  30. package/dist/messages.js.map +1 -0
  31. package/dist/perf-sink.d.ts +15 -0
  32. package/dist/perf-sink.d.ts.map +1 -0
  33. package/dist/perf-sink.js +37 -0
  34. package/dist/perf-sink.js.map +1 -0
  35. package/dist/tree.d.ts +11 -0
  36. package/dist/tree.d.ts.map +1 -0
  37. package/dist/tree.js +25 -0
  38. package/dist/tree.js.map +1 -0
  39. package/dist/types.d.ts +70 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +5 -0
  42. package/dist/types.js.map +1 -0
  43. package/dist/worker-phases.d.ts +44 -0
  44. package/dist/worker-phases.d.ts.map +1 -0
  45. package/dist/worker-phases.js +78 -0
  46. package/dist/worker-phases.js.map +1 -0
  47. package/dist/worker.d.ts +72 -0
  48. package/dist/worker.d.ts.map +1 -0
  49. package/dist/worker.js +120 -0
  50. package/dist/worker.js.map +1 -0
  51. 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.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.3.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
  }