Skip to content

Commit 510566f

Browse files
author
John Doe
committed
refactor: wip trace helper
1 parent a86caac commit 510566f

File tree

4 files changed

+37
-51
lines changed

4 files changed

+37
-51
lines changed

packages/utils/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
},
2525
"type": "module",
2626
"engines": {
27-
"node": ">=17.0.0"
27+
"node": ">=18.2.0"
2828
},
2929
"dependencies": {
3030
"@code-pushup/models": "0.102.0",

packages/utils/src/lib/trace-file-utils.ts

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import os from 'node:os';
22
import {
3+
type PerformanceEntry,
34
type PerformanceMark,
45
type PerformanceMeasure,
56
performance,
67
} from 'node:perf_hooks';
78
import { threadId } from 'node:worker_threads';
8-
import { defaultClock } from './clock-epoch';
9+
import { defaultClock } from './clock-epoch.js';
910
import type {
1011
BeginEvent,
1112
CompleteEvent,
@@ -17,7 +18,6 @@ import type {
1718
StartTracingEvent,
1819
TraceEvent,
1920
TraceEventContainer,
20-
TraceFile,
2121
} from './trace-file.type.js';
2222

2323
export const entryToTraceTimestamp = (
@@ -29,10 +29,9 @@ export const entryToTraceTimestamp = (
2929
(entry.entryType === 'measure' && asEnd ? entry.duration : 0),
3030
);
3131

32-
export const nextId2 = (() => {
33-
let i = 1;
34-
return () => ({ local: `0x${i++}` });
35-
})();
32+
// eslint-disable-next-line functional/no-let
33+
let id2Count = 0;
34+
export const nextId2 = () => ({ local: `0x${++id2Count}` });
3635

3736
const defaults = (opt?: { pid?: number; tid?: number; ts?: number }) => ({
3837
pid: opt?.pid ?? process.pid,
@@ -53,7 +52,6 @@ export const getInstantEvent = (opt: {
5352
}): InstantEvent => ({
5453
cat: 'blink.user_timing',
5554
ph: 'i',
56-
s: 't',
5755
name: opt.name,
5856
...defaults(opt),
5957
args: opt.args ?? {},
@@ -71,7 +69,6 @@ export const getStartTracing = (opt: {
7169
return {
7270
cat: 'devtools.timeline',
7371
ph: 'i',
74-
s: 't',
7572
name: 'TracingStartedInBrowser',
7673
pid,
7774
tid,
@@ -125,14 +122,13 @@ export function getSpanEvent(ph: 'b' | 'e', opt: SpanOpt): SpanEvent {
125122
return {
126123
cat: 'blink.user_timing',
127124
ph,
128-
s: 't',
129125
name: opt.name,
130126
id2: opt.id2,
131127
...defaults(opt),
132128
args: opt.args?.data?.detail
133129
? { data: { detail: opt.args.data.detail } }
134130
: {},
135-
} as SpanEvent;
131+
};
136132
}
137133

138134
export const getSpan = (opt: {

packages/utils/src/lib/trace-file-utils.unit.test.ts

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ describe('getTraceFile', () => {
3636
traceEvents: [
3737
getInstantEvent({
3838
name: 'test-event',
39-
ts: 1234567890,
39+
ts: 1_234_567_890,
4040
pid: 123,
4141
tid: 456,
4242
}),
@@ -46,7 +46,7 @@ describe('getTraceFile', () => {
4646
traceEvents: [
4747
expect.objectContaining({
4848
name: 'test-event',
49-
ts: 1234567890,
49+
ts: 1_234_567_890,
5050
pid: 123,
5151
tid: 456,
5252
}),
@@ -78,9 +78,9 @@ describe('getTraceFile', () => {
7878

7979
describe('frameTreeNodeId', () => {
8080
it('should generate correct frame tree node ID', () => {
81-
expect(frameTreeNodeId(123, 456)).toBe(1230456);
81+
expect(frameTreeNodeId(123, 456)).toBe(1_230_456);
8282
expect(frameTreeNodeId(1, 2)).toBe(102);
83-
expect(frameTreeNodeId(999, 999)).toBe(9990999);
83+
expect(frameTreeNodeId(999, 999)).toBe(9_990_999);
8484
});
8585
});
8686

@@ -97,7 +97,6 @@ describe('getStartTracing', () => {
9797
expect(getStartTracing({ url: 'https://example.com' })).toStrictEqual({
9898
cat: 'devtools.timeline',
9999
ph: 'i',
100-
s: 't',
101100
name: 'TracingStartedInBrowser',
102101
pid: expect.any(Number),
103102
tid: expect.any(Number),
@@ -131,14 +130,13 @@ describe('getStartTracing', () => {
131130
).toStrictEqual({
132131
cat: 'devtools.timeline',
133132
ph: 'i',
134-
s: 't',
135133
name: 'TracingStartedInBrowser',
136134
pid: 777,
137135
tid: 888,
138136
ts: expect.any(Number),
139137
args: {
140138
data: {
141-
frameTreeNodeId: 7770888,
139+
frameTreeNodeId: 7_770_888,
142140
frames: [
143141
{
144142
frame: 'FRAME0P777T888',
@@ -182,7 +180,7 @@ describe('getCompleteEvent', () => {
182180
dur: 500,
183181
pid: 111,
184182
tid: 222,
185-
ts: 1234567890,
183+
ts: 1_234_567_890,
186184
}),
187185
).toStrictEqual({
188186
cat: 'devtools.timeline',
@@ -191,7 +189,7 @@ describe('getCompleteEvent', () => {
191189
dur: 500,
192190
pid: 111,
193191
tid: 222,
194-
ts: 1234567890,
192+
ts: 1_234_567_890,
195193
args: {},
196194
});
197195
});
@@ -208,7 +206,6 @@ describe('markToInstantEvent', () => {
208206
).toStrictEqual({
209207
cat: 'blink.user_timing',
210208
ph: 'i',
211-
s: 't',
212209
name: 'test-mark',
213210
pid: expect.any(Number),
214211
tid: expect.any(Number),
@@ -227,7 +224,6 @@ describe('markToInstantEvent', () => {
227224
).toStrictEqual({
228225
cat: 'blink.user_timing',
229226
ph: 'i',
230-
s: 't',
231227
name: 'test-mark',
232228
pid: expect.any(Number),
233229
tid: expect.any(Number),
@@ -253,7 +249,6 @@ describe('markToInstantEvent', () => {
253249
).toStrictEqual({
254250
cat: 'blink.user_timing',
255251
ph: 'i',
256-
s: 't',
257252
name: 'custom-name',
258253
pid: 999,
259254
tid: 888,
@@ -276,7 +271,6 @@ describe('measureToSpanEvents', () => {
276271
{
277272
cat: 'blink.user_timing',
278273
ph: 'b',
279-
s: 't',
280274
name: 'test-measure',
281275
pid: expect.any(Number),
282276
tid: expect.any(Number),
@@ -287,7 +281,6 @@ describe('measureToSpanEvents', () => {
287281
{
288282
cat: 'blink.user_timing',
289283
ph: 'e',
290-
s: 't',
291284
name: 'test-measure',
292285
pid: expect.any(Number),
293286
tid: expect.any(Number),
@@ -310,7 +303,6 @@ describe('measureToSpanEvents', () => {
310303
{
311304
cat: 'blink.user_timing',
312305
ph: 'b',
313-
s: 't',
314306
name: 'test-measure',
315307
pid: expect.any(Number),
316308
tid: expect.any(Number),
@@ -321,7 +313,6 @@ describe('measureToSpanEvents', () => {
321313
{
322314
cat: 'blink.user_timing',
323315
ph: 'e',
324-
s: 't',
325316
name: 'test-measure',
326317
pid: expect.any(Number),
327318
tid: expect.any(Number),
@@ -404,7 +395,6 @@ describe('getSpanEvent', () => {
404395
).toStrictEqual({
405396
cat: 'blink.user_timing',
406397
ph: 'b',
407-
s: 't',
408398
name: 'test-span',
409399
pid: expect.any(Number),
410400
tid: expect.any(Number),
@@ -423,7 +413,6 @@ describe('getSpanEvent', () => {
423413
).toStrictEqual({
424414
cat: 'blink.user_timing',
425415
ph: 'e',
426-
s: 't',
427416
name: 'test-span',
428417
pid: expect.any(Number),
429418
tid: expect.any(Number),
@@ -447,7 +436,6 @@ describe('getSpan', () => {
447436
{
448437
cat: 'blink.user_timing',
449438
ph: 'b',
450-
s: 't',
451439
name: 'test-span',
452440
pid: expect.any(Number),
453441
tid: expect.any(Number),
@@ -458,7 +446,6 @@ describe('getSpan', () => {
458446
{
459447
cat: 'blink.user_timing',
460448
ph: 'e',
461-
s: 't',
462449
name: 'test-span',
463450
pid: expect.any(Number),
464451
tid: expect.any(Number),
@@ -493,7 +480,6 @@ describe('getSpan', () => {
493480
{
494481
cat: 'blink.user_timing',
495482
ph: 'b',
496-
s: 't',
497483
name: 'test-span',
498484
pid: expect.any(Number),
499485
tid: expect.any(Number),
@@ -504,7 +490,6 @@ describe('getSpan', () => {
504490
{
505491
cat: 'blink.user_timing',
506492
ph: 'e',
507-
s: 't',
508493
name: 'test-span',
509494
pid: expect.any(Number),
510495
tid: expect.any(Number),

packages/utils/src/lib/trace-file.type.ts

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,18 @@ import type { UserTimingDetail } from './user-timing-extensibility-api.type';
44
* Arguments for instant trace events.
55
* @property {UserTimingDetail} [detail] - Optional user timing detail with DevTools payload
66
*/
7-
export type InstantEventArgs = { detail?: UserTimingDetail };
7+
export type InstantEventArgs = {
8+
detail?: UserTimingDetail & Record<string, unknown>;
9+
};
810

911
/**
1012
* Arguments for span trace events (begin/end events).
1113
* @property {object} [data] - Optional data object
1214
* @property {UserTimingDetail} [data.detail] - Optional user timing detail with DevTools payload
1315
*/
14-
export type SpanEventArgs = { data?: { detail?: UserTimingDetail } };
16+
export type SpanEventArgs = {
17+
data?: { detail?: UserTimingDetail & Record<string, unknown> };
18+
};
1519

1620
/**
1721
* Arguments for complete trace events.
@@ -29,14 +33,14 @@ export type CompleteEventArgs = { detail?: Record<string, unknown> };
2933
export type StartTracingEventArgs = {
3034
data: {
3135
frameTreeNodeId: number;
32-
frames: Array<{
36+
frames: {
3337
frame: string;
3438
isInPrimaryMainFrame: boolean;
3539
isOutermostMainFrame: boolean;
3640
name: string;
3741
processId: number;
3842
url: string;
39-
}>;
43+
}[];
4044
persistentIds: boolean;
4145
};
4246
};
@@ -68,6 +72,16 @@ export type BaseTraceEvent = {
6872
args: TraceArgs;
6973
};
7074

75+
/**
76+
* Start tracing event for Chrome DevTools tracing.
77+
*/
78+
export type StartTracingEvent = BaseTraceEvent & {
79+
cat: 'devtools.timeline';
80+
ph: 'i';
81+
name: 'TracingStartedInBrowser';
82+
args: StartTracingEventArgs;
83+
};
84+
7185
/**
7286
* Complete trace event with duration.
7387
* Represents a complete operation with start time and duration.
@@ -81,14 +95,12 @@ export type CompleteEvent = BaseTraceEvent & { ph: 'X'; dur: number };
8195
* Used for user timing marks and other instantaneous events.
8296
* @property {'blink.user_timing'} cat - Fixed category for user timing events
8397
* @property {'i'} ph - Phase indicator for instant events
84-
* @property {'t'} s - Scope indicator (thread)
8598
* @property {never} [dur] - Duration is not applicable for instant events
8699
* @property {InstantEventArgs} [args] - Optional event arguments
87100
*/
88101
export type InstantEvent = Omit<BaseTraceEvent, 'cat' | 'args'> & {
89102
cat: 'blink.user_timing';
90103
ph: 'i';
91-
s: 't';
92104
dur?: never;
93105
args: InstantEventArgs;
94106
};
@@ -106,9 +118,13 @@ type SpanCore = Omit<BaseTraceEvent, 'args'> & {
106118
/**
107119
* Begin event for a span (paired with an end event).
108120
* @property {'b'} ph - Phase indicator for begin events
121+
* @property {'t'} s - Scope indicator (thread)
109122
* @property {never} [dur] - Duration is not applicable for begin events
110123
*/
111-
export type BeginEvent = SpanCore & { ph: 'b'; dur?: never };
124+
export type BeginEvent = SpanCore & {
125+
ph: 'b';
126+
dur?: never;
127+
};
112128

113129
/**
114130
* End event for a span (paired with a begin event).
@@ -125,17 +141,6 @@ export type SpanEvent = BeginEvent | EndEvent;
125141
/**
126142
* Union type of all trace event types.
127143
*/
128-
/**
129-
* Start tracing event for Chrome DevTools tracing.
130-
*/
131-
export type StartTracingEvent = BaseTraceEvent & {
132-
cat: 'devtools.timeline';
133-
ph: 'i';
134-
s: 't';
135-
name: 'TracingStartedInBrowser';
136-
args: StartTracingEventArgs;
137-
};
138-
139144
export type TraceEvent =
140145
| InstantEvent
141146
| CompleteEvent

0 commit comments

Comments
 (0)