@forgehive/task 0.2.2 → 0.2.4
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/index.d.ts +12 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +66 -13
- package/dist/index.js.map +1 -1
- package/dist/test/add-listener-with-boundaries.test.js +78 -7
- package/dist/test/add-listener-with-boundaries.test.js.map +1 -1
- package/dist/test/add-listener.test.js +36 -0
- package/dist/test/add-listener.test.js.map +1 -1
- package/dist/test/boundary-modes.test.js +45 -5
- package/dist/test/boundary-modes.test.js.map +1 -1
- package/dist/test/execution-record-boundaries.test.js +12 -2
- package/dist/test/execution-record-boundaries.test.js.map +1 -1
- package/dist/test/integration-enhanced-records.test.d.ts +2 -0
- package/dist/test/integration-enhanced-records.test.d.ts.map +1 -0
- package/dist/test/integration-enhanced-records.test.js +467 -0
- package/dist/test/integration-enhanced-records.test.js.map +1 -0
- package/dist/test/listen-execution-records.test.d.ts +2 -0
- package/dist/test/listen-execution-records.test.d.ts.map +1 -0
- package/dist/test/listen-execution-records.test.js +223 -0
- package/dist/test/listen-execution-records.test.js.map +1 -0
- package/dist/test/metrics-collection.test.d.ts +2 -0
- package/dist/test/metrics-collection.test.d.ts.map +1 -0
- package/dist/test/metrics-collection.test.js +409 -0
- package/dist/test/metrics-collection.test.js.map +1 -0
- package/dist/test/performance-edge-cases.test.d.ts +2 -0
- package/dist/test/performance-edge-cases.test.d.ts.map +1 -0
- package/dist/test/performance-edge-cases.test.js +502 -0
- package/dist/test/performance-edge-cases.test.js.map +1 -0
- package/dist/test/run-boundary.test.js +27 -3
- package/dist/test/run-boundary.test.js.map +1 -1
- package/dist/test/safe-replay-complex-boundary.test.js +110 -9
- package/dist/test/safe-replay-complex-boundary.test.js.map +1 -1
- package/dist/test/safe-replay.test.js +35 -5
- package/dist/test/safe-replay.test.js.map +1 -1
- package/dist/test/safe-run.test.js +46 -4
- package/dist/test/safe-run.test.js.map +1 -1
- package/dist/test/setmetrics-boundary.test.d.ts +2 -0
- package/dist/test/setmetrics-boundary.test.d.ts.map +1 -0
- package/dist/test/setmetrics-boundary.test.js +195 -0
- package/dist/test/setmetrics-boundary.test.js.map +1 -0
- package/dist/test/task-with-boundaries.test.js +63 -2
- package/dist/test/task-with-boundaries.test.js.map +1 -1
- package/dist/test/timing-capture.test.d.ts +2 -0
- package/dist/test/timing-capture.test.d.ts.map +1 -0
- package/dist/test/timing-capture.test.js +304 -0
- package/dist/test/timing-capture.test.js.map +1 -0
- package/dist/test/timing-utilities.test.d.ts +2 -0
- package/dist/test/timing-utilities.test.d.ts.map +1 -0
- package/dist/test/timing-utilities.test.js +127 -0
- package/dist/test/timing-utilities.test.js.map +1 -0
- package/dist/types.d.ts +93 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +78 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/boundary.d.ts +3 -0
- package/dist/utils/boundary.d.ts.map +1 -1
- package/dist/utils/boundary.js +11 -2
- package/dist/utils/boundary.js.map +1 -1
- package/package.json +3 -2
- package/src/index.ts +97 -14
- package/src/test/add-listener-with-boundaries.test.ts +78 -7
- package/src/test/add-listener.test.ts +36 -0
- package/src/test/boundary-modes.test.ts +45 -5
- package/src/test/execution-record-boundaries.test.ts +12 -2
- package/src/test/listen-execution-records.test.ts +295 -0
- package/src/test/metrics-collection.test.ts +476 -0
- package/src/test/performance-edge-cases.test.ts +596 -0
- package/src/test/run-boundary.test.ts +27 -3
- package/src/test/safe-replay-complex-boundary.test.ts +115 -10
- package/src/test/safe-replay.test.ts +35 -5
- package/src/test/safe-run.test.ts +46 -4
- package/src/test/setmetrics-boundary.test.ts +223 -0
- package/src/test/task-with-boundaries.test.ts +71 -5
- package/src/test/timing-capture.test.ts +348 -0
- package/src/test/timing-utilities.test.ts +145 -0
- package/src/types.ts +139 -0
- package/src/utils/boundary.ts +15 -2
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const index_1 = require("../index");
|
|
4
|
+
const schema_1 = require("@forgehive/schema");
|
|
5
|
+
describe('Timing Capture Tests', () => {
|
|
6
|
+
describe('TimingTracker accuracy and reliability', () => {
|
|
7
|
+
it('should capture timing with millisecond precision', async () => {
|
|
8
|
+
const tracker = index_1.TimingTracker.create();
|
|
9
|
+
tracker.start();
|
|
10
|
+
await new Promise(resolve => setTimeout(resolve, 100)); // Wait 100ms
|
|
11
|
+
const timing = tracker.end();
|
|
12
|
+
expect(timing).not.toBeNull();
|
|
13
|
+
if (timing) {
|
|
14
|
+
expect(timing.duration).toBeGreaterThanOrEqual(90); // Allow for some variance
|
|
15
|
+
expect(timing.duration).toBeLessThan(150); // But not too much
|
|
16
|
+
expect(timing.endTime - timing.startTime).toBe(timing.duration);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
it('should handle rapid successive timing operations', () => {
|
|
20
|
+
const timings = [];
|
|
21
|
+
for (let i = 0; i < 10; i++) {
|
|
22
|
+
const tracker = index_1.TimingTracker.create();
|
|
23
|
+
tracker.start();
|
|
24
|
+
// Immediate end
|
|
25
|
+
const timing = tracker.end();
|
|
26
|
+
if (timing) {
|
|
27
|
+
timings.push(timing);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
timings.forEach(timing => {
|
|
31
|
+
expect(timing).not.toBeNull();
|
|
32
|
+
expect(timing.duration).toBeGreaterThanOrEqual(0);
|
|
33
|
+
expect(timing.duration).toBeLessThan(10); // Should be very fast
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
it('should provide monotonic timestamps', () => {
|
|
37
|
+
const tracker1 = index_1.TimingTracker.create();
|
|
38
|
+
const tracker2 = index_1.TimingTracker.create();
|
|
39
|
+
tracker1.start();
|
|
40
|
+
tracker2.start();
|
|
41
|
+
const timing1 = tracker1.end();
|
|
42
|
+
const timing2 = tracker2.end();
|
|
43
|
+
expect(timing1).not.toBeNull();
|
|
44
|
+
expect(timing2).not.toBeNull();
|
|
45
|
+
if (timing1 && timing2) {
|
|
46
|
+
expect(timing2.startTime).toBeGreaterThanOrEqual(timing1.startTime);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
describe('Boundary timing capture in various scenarios', () => {
|
|
51
|
+
it('should capture timing for successful boundary calls', async () => {
|
|
52
|
+
const task = (0, index_1.createTask)({
|
|
53
|
+
name: 'timing-test-success',
|
|
54
|
+
schema: new schema_1.Schema({ input: schema_1.Schema.string() }),
|
|
55
|
+
boundaries: {
|
|
56
|
+
slowOperation: async (data) => {
|
|
57
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
58
|
+
return `processed: ${data}`;
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
fn: async ({ input }, { slowOperation }) => {
|
|
62
|
+
const result = await slowOperation(input);
|
|
63
|
+
return { result };
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
const [result, error, record] = await task.safeRun({ input: 'test' });
|
|
67
|
+
expect(error).toBeNull();
|
|
68
|
+
expect(result).toEqual({ result: 'processed: test' });
|
|
69
|
+
expect(record.boundaries.slowOperation).toHaveLength(1);
|
|
70
|
+
const boundaryCall = record.boundaries.slowOperation[0];
|
|
71
|
+
expect(boundaryCall.timing).toEqual(expect.objectContaining({
|
|
72
|
+
startTime: expect.any(Number),
|
|
73
|
+
endTime: expect.any(Number),
|
|
74
|
+
duration: expect.any(Number)
|
|
75
|
+
}));
|
|
76
|
+
expect(boundaryCall.timing.duration).toBeGreaterThanOrEqual(40);
|
|
77
|
+
expect(boundaryCall.timing.duration).toBeLessThan(100);
|
|
78
|
+
});
|
|
79
|
+
it('should capture timing for failed boundary calls', async () => {
|
|
80
|
+
const task = (0, index_1.createTask)({
|
|
81
|
+
name: 'timing-test-error',
|
|
82
|
+
schema: new schema_1.Schema({ input: schema_1.Schema.string() }),
|
|
83
|
+
boundaries: {
|
|
84
|
+
failingOperation: async (data) => {
|
|
85
|
+
await new Promise(resolve => setTimeout(resolve, 30));
|
|
86
|
+
throw new Error(`Failed to process: ${data}`);
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
fn: async ({ input }, { failingOperation }) => {
|
|
90
|
+
const result = await failingOperation(input);
|
|
91
|
+
return { result };
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
const [result, error, record] = await task.safeRun({ input: 'test' });
|
|
95
|
+
expect(result).toBeNull();
|
|
96
|
+
expect(error).not.toBeNull();
|
|
97
|
+
expect(record.boundaries.failingOperation).toHaveLength(1);
|
|
98
|
+
const boundaryCall = record.boundaries.failingOperation[0];
|
|
99
|
+
expect(boundaryCall.timing).toEqual(expect.objectContaining({
|
|
100
|
+
startTime: expect.any(Number),
|
|
101
|
+
endTime: expect.any(Number),
|
|
102
|
+
duration: expect.any(Number)
|
|
103
|
+
}));
|
|
104
|
+
expect(boundaryCall.timing.duration).toBeGreaterThanOrEqual(20);
|
|
105
|
+
expect(boundaryCall.timing.duration).toBeLessThan(60);
|
|
106
|
+
expect('error' in boundaryCall).toBe(true);
|
|
107
|
+
});
|
|
108
|
+
it('should capture timing for multiple boundary calls', async () => {
|
|
109
|
+
const task = (0, index_1.createTask)({
|
|
110
|
+
name: 'timing-test-multiple',
|
|
111
|
+
schema: new schema_1.Schema({ count: schema_1.Schema.number() }),
|
|
112
|
+
boundaries: {
|
|
113
|
+
operation: async (index) => {
|
|
114
|
+
await new Promise(resolve => setTimeout(resolve, 20 + index * 10));
|
|
115
|
+
return `result-${index}`;
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
fn: async ({ count }, { operation }) => {
|
|
119
|
+
const results = [];
|
|
120
|
+
for (let i = 0; i < count; i++) {
|
|
121
|
+
results.push(await operation(i));
|
|
122
|
+
}
|
|
123
|
+
return { results };
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
const [result, error, record] = await task.safeRun({ count: 3 });
|
|
127
|
+
expect(error).toBeNull();
|
|
128
|
+
expect(result === null || result === void 0 ? void 0 : result.results).toEqual(['result-0', 'result-1', 'result-2']);
|
|
129
|
+
expect(record.boundaries.operation).toHaveLength(3);
|
|
130
|
+
record.boundaries.operation.forEach((call, index) => {
|
|
131
|
+
expect(call.timing).toEqual(expect.objectContaining({
|
|
132
|
+
startTime: expect.any(Number),
|
|
133
|
+
endTime: expect.any(Number),
|
|
134
|
+
duration: expect.any(Number)
|
|
135
|
+
}));
|
|
136
|
+
// Each call should take longer than the previous
|
|
137
|
+
expect(call.timing.duration).toBeGreaterThanOrEqual(15 + index * 10);
|
|
138
|
+
expect(call.timing.duration).toBeLessThan(50 + index * 10);
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
it('should capture timing for parallel boundary calls', async () => {
|
|
142
|
+
const task = (0, index_1.createTask)({
|
|
143
|
+
name: 'timing-test-parallel',
|
|
144
|
+
schema: new schema_1.Schema({ delay: schema_1.Schema.number() }),
|
|
145
|
+
boundaries: {
|
|
146
|
+
operationA: async (delay) => {
|
|
147
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
148
|
+
return 'A';
|
|
149
|
+
},
|
|
150
|
+
operationB: async (delay) => {
|
|
151
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
152
|
+
return 'B';
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
fn: async ({ delay }, { operationA, operationB }) => {
|
|
156
|
+
const [resultA, resultB] = await Promise.all([
|
|
157
|
+
operationA(delay),
|
|
158
|
+
operationB(delay)
|
|
159
|
+
]);
|
|
160
|
+
return { resultA, resultB };
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
const [result, error, record] = await task.safeRun({ delay: 50 });
|
|
164
|
+
expect(error).toBeNull();
|
|
165
|
+
expect(result).toEqual({ resultA: 'A', resultB: 'B' });
|
|
166
|
+
expect(record.boundaries.operationA).toHaveLength(1);
|
|
167
|
+
expect(record.boundaries.operationB).toHaveLength(1);
|
|
168
|
+
const callA = record.boundaries.operationA[0];
|
|
169
|
+
const callB = record.boundaries.operationB[0];
|
|
170
|
+
expect(callA.timing.duration).toBeGreaterThanOrEqual(40);
|
|
171
|
+
expect(callB.timing.duration).toBeGreaterThanOrEqual(40);
|
|
172
|
+
// Both calls should overlap in time since they run in parallel
|
|
173
|
+
const startDiff = Math.abs(callA.timing.startTime - callB.timing.startTime);
|
|
174
|
+
expect(startDiff).toBeLessThan(20); // Started within 20ms of each other
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
describe('Main function timing capture', () => {
|
|
178
|
+
it('should capture timing for main task function execution', async () => {
|
|
179
|
+
var _a, _b;
|
|
180
|
+
const task = (0, index_1.createTask)({
|
|
181
|
+
name: 'timing-test-main',
|
|
182
|
+
schema: new schema_1.Schema({ delay: schema_1.Schema.number() }),
|
|
183
|
+
boundaries: {},
|
|
184
|
+
fn: async ({ delay }) => {
|
|
185
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
186
|
+
return { completed: true };
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
const [result, error, record] = await task.safeRun({ delay: 100 });
|
|
190
|
+
expect(error).toBeNull();
|
|
191
|
+
expect(result).toEqual({ completed: true });
|
|
192
|
+
expect(record.timing).toEqual(expect.objectContaining({
|
|
193
|
+
startTime: expect.any(Number),
|
|
194
|
+
endTime: expect.any(Number),
|
|
195
|
+
duration: expect.any(Number)
|
|
196
|
+
}));
|
|
197
|
+
expect((_a = record.timing) === null || _a === void 0 ? void 0 : _a.duration).toBeGreaterThanOrEqual(90);
|
|
198
|
+
expect((_b = record.timing) === null || _b === void 0 ? void 0 : _b.duration).toBeLessThan(150);
|
|
199
|
+
});
|
|
200
|
+
it('should capture timing even when main function throws error', async () => {
|
|
201
|
+
var _a, _b;
|
|
202
|
+
const task = (0, index_1.createTask)({
|
|
203
|
+
name: 'timing-test-main-error',
|
|
204
|
+
schema: new schema_1.Schema({ delay: schema_1.Schema.number() }),
|
|
205
|
+
boundaries: {},
|
|
206
|
+
fn: async ({ delay }) => {
|
|
207
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
208
|
+
throw new Error('Intentional error');
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
const [result, error, record] = await task.safeRun({ delay: 80 });
|
|
212
|
+
expect(result).toBeNull();
|
|
213
|
+
expect(error).not.toBeNull();
|
|
214
|
+
expect(record.timing).toEqual(expect.objectContaining({
|
|
215
|
+
startTime: expect.any(Number),
|
|
216
|
+
endTime: expect.any(Number),
|
|
217
|
+
duration: expect.any(Number)
|
|
218
|
+
}));
|
|
219
|
+
expect((_a = record.timing) === null || _a === void 0 ? void 0 : _a.duration).toBeGreaterThanOrEqual(70);
|
|
220
|
+
expect((_b = record.timing) === null || _b === void 0 ? void 0 : _b.duration).toBeLessThan(120);
|
|
221
|
+
});
|
|
222
|
+
it('should include both main function and boundary timing', async () => {
|
|
223
|
+
var _a, _b;
|
|
224
|
+
const task = (0, index_1.createTask)({
|
|
225
|
+
name: 'timing-test-comprehensive',
|
|
226
|
+
schema: new schema_1.Schema({ delay: schema_1.Schema.number() }),
|
|
227
|
+
boundaries: {
|
|
228
|
+
slowBoundary: async (delay) => {
|
|
229
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
230
|
+
return 'boundary-result';
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
fn: async ({ delay }, { slowBoundary }) => {
|
|
234
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
235
|
+
const boundaryResult = await slowBoundary(delay);
|
|
236
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
237
|
+
return { main: 'completed', boundary: boundaryResult };
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
const [result, error, record] = await task.safeRun({ delay: 50 });
|
|
241
|
+
expect(error).toBeNull();
|
|
242
|
+
expect(result).toEqual({ main: 'completed', boundary: 'boundary-result' });
|
|
243
|
+
// Main function timing should include all delays
|
|
244
|
+
expect((_a = record.timing) === null || _a === void 0 ? void 0 : _a.duration).toBeGreaterThanOrEqual(140); // 3 * 50ms delays
|
|
245
|
+
expect((_b = record.timing) === null || _b === void 0 ? void 0 : _b.duration).toBeLessThan(200);
|
|
246
|
+
// Boundary timing should only include its delay
|
|
247
|
+
expect(record.boundaries.slowBoundary[0].timing.duration).toBeGreaterThanOrEqual(40);
|
|
248
|
+
expect(record.boundaries.slowBoundary[0].timing.duration).toBeLessThan(80);
|
|
249
|
+
// Boundary timing should be within the main function timing
|
|
250
|
+
const mainTiming = record.timing;
|
|
251
|
+
const boundaryTiming = record.boundaries.slowBoundary[0].timing;
|
|
252
|
+
expect(boundaryTiming.startTime).toBeGreaterThanOrEqual(mainTiming.startTime);
|
|
253
|
+
expect(boundaryTiming.endTime).toBeLessThanOrEqual(mainTiming.endTime);
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
describe('Edge cases and error scenarios', () => {
|
|
257
|
+
it('should handle timing when schema validation fails', async () => {
|
|
258
|
+
const task = (0, index_1.createTask)({
|
|
259
|
+
name: 'timing-test-validation-error',
|
|
260
|
+
schema: new schema_1.Schema({ requiredField: schema_1.Schema.string() }),
|
|
261
|
+
boundaries: {},
|
|
262
|
+
fn: async ({ requiredField }) => {
|
|
263
|
+
return { field: requiredField };
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
// siabled to test an incorrect execution
|
|
267
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
268
|
+
const [result, error, record] = await task.safeRun({ wrongField: 'test' });
|
|
269
|
+
expect(result).toBeNull();
|
|
270
|
+
expect(error).not.toBeNull();
|
|
271
|
+
expect(record.type).toBe('error');
|
|
272
|
+
// Should not have main function timing since function wasn't executed
|
|
273
|
+
expect(record.timing).toBeUndefined();
|
|
274
|
+
});
|
|
275
|
+
it('should handle timing with very fast operations', async () => {
|
|
276
|
+
const task = (0, index_1.createTask)({
|
|
277
|
+
name: 'timing-test-fast',
|
|
278
|
+
schema: new schema_1.Schema({ input: schema_1.Schema.string() }),
|
|
279
|
+
boundaries: {
|
|
280
|
+
fastOperation: async (data) => {
|
|
281
|
+
return data.toUpperCase(); // Very fast operation
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
fn: async ({ input }, { fastOperation }) => {
|
|
285
|
+
const result = await fastOperation(input);
|
|
286
|
+
return { result };
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
const [result, error, record] = await task.safeRun({ input: 'test' });
|
|
290
|
+
expect(error).toBeNull();
|
|
291
|
+
expect(result).toEqual({ result: 'TEST' });
|
|
292
|
+
const boundaryCall = record.boundaries.fastOperation[0];
|
|
293
|
+
expect(boundaryCall.timing).toEqual(expect.objectContaining({
|
|
294
|
+
startTime: expect.any(Number),
|
|
295
|
+
endTime: expect.any(Number),
|
|
296
|
+
duration: expect.any(Number)
|
|
297
|
+
}));
|
|
298
|
+
// Even very fast operations should have non-negative duration
|
|
299
|
+
expect(boundaryCall.timing.duration).toBeGreaterThanOrEqual(0);
|
|
300
|
+
expect(boundaryCall.timing.duration).toBeLessThan(50);
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
});
|
|
304
|
+
//# sourceMappingURL=timing-capture.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing-capture.test.js","sourceRoot":"","sources":["../../src/test/timing-capture.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing-utilities.test.d.ts","sourceRoot":"","sources":["../../src/test/timing-utilities.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const types_1 = require("../types");
|
|
4
|
+
describe('Timing Utilities', () => {
|
|
5
|
+
describe('TimingTracker', () => {
|
|
6
|
+
it('should track timing correctly with proper TypeScript types', () => {
|
|
7
|
+
const tracker = new types_1.TimingTracker();
|
|
8
|
+
tracker.start();
|
|
9
|
+
const timing = tracker.end();
|
|
10
|
+
expect(timing).not.toBeNull();
|
|
11
|
+
if (timing) {
|
|
12
|
+
expect(typeof timing.startTime).toBe('number');
|
|
13
|
+
expect(typeof timing.endTime).toBe('number');
|
|
14
|
+
expect(typeof timing.duration).toBe('number');
|
|
15
|
+
expect(timing.startTime).toBeLessThanOrEqual(timing.endTime);
|
|
16
|
+
expect(timing.duration).toBeGreaterThanOrEqual(0);
|
|
17
|
+
expect(timing.duration).toBe(timing.endTime - timing.startTime);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
it('should return null if end() called without start()', () => {
|
|
21
|
+
const tracker = new types_1.TimingTracker();
|
|
22
|
+
const timing = tracker.end();
|
|
23
|
+
expect(timing).toBeNull();
|
|
24
|
+
});
|
|
25
|
+
it('should create new instances via static method with correct type', () => {
|
|
26
|
+
const tracker = types_1.TimingTracker.create();
|
|
27
|
+
expect(tracker).toBeInstanceOf(types_1.TimingTracker);
|
|
28
|
+
});
|
|
29
|
+
it('should handle multiple start/end cycles', () => {
|
|
30
|
+
const tracker = new types_1.TimingTracker();
|
|
31
|
+
// First cycle
|
|
32
|
+
tracker.start();
|
|
33
|
+
const timing1 = tracker.end();
|
|
34
|
+
expect(timing1).not.toBeNull();
|
|
35
|
+
// Second cycle
|
|
36
|
+
tracker.start();
|
|
37
|
+
const timing2 = tracker.end();
|
|
38
|
+
expect(timing2).not.toBeNull();
|
|
39
|
+
if (timing1 && timing2) {
|
|
40
|
+
expect(timing2.startTime).toBeGreaterThanOrEqual(timing1.endTime);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
describe('TypeScript Type Definitions', () => {
|
|
45
|
+
it('should enforce TimingInfo structure with required properties', () => {
|
|
46
|
+
const timing = {
|
|
47
|
+
startTime: 1000,
|
|
48
|
+
endTime: 2000,
|
|
49
|
+
duration: 1000
|
|
50
|
+
};
|
|
51
|
+
expect(timing.startTime).toBe(1000);
|
|
52
|
+
expect(timing.endTime).toBe(2000);
|
|
53
|
+
expect(timing.duration).toBe(1000);
|
|
54
|
+
// TypeScript should enforce these are numbers
|
|
55
|
+
expect(typeof timing.startTime).toBe('number');
|
|
56
|
+
expect(typeof timing.endTime).toBe('number');
|
|
57
|
+
expect(typeof timing.duration).toBe('number');
|
|
58
|
+
});
|
|
59
|
+
it('should enforce Metric structure with typed properties', () => {
|
|
60
|
+
const metric = {
|
|
61
|
+
type: 'performance',
|
|
62
|
+
name: 'response_time',
|
|
63
|
+
value: 150
|
|
64
|
+
};
|
|
65
|
+
expect(metric.type).toBe('performance');
|
|
66
|
+
expect(metric.name).toBe('response_time');
|
|
67
|
+
expect(metric.value).toBe(150);
|
|
68
|
+
// TypeScript should enforce correct types
|
|
69
|
+
expect(typeof metric.type).toBe('string');
|
|
70
|
+
expect(typeof metric.name).toBe('string');
|
|
71
|
+
expect(typeof metric.value).toBe('number');
|
|
72
|
+
});
|
|
73
|
+
it('should support generic BoundaryTimingRecord with proper typing', () => {
|
|
74
|
+
const stringNumberRecord = {
|
|
75
|
+
input: ['test'],
|
|
76
|
+
output: 42,
|
|
77
|
+
timing: {
|
|
78
|
+
startTime: 1000,
|
|
79
|
+
endTime: 2000,
|
|
80
|
+
duration: 1000
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
expect(stringNumberRecord.input).toEqual(['test']);
|
|
84
|
+
expect(stringNumberRecord.output).toBe(42);
|
|
85
|
+
expect(stringNumberRecord.timing.duration).toBe(1000);
|
|
86
|
+
// Test with error record
|
|
87
|
+
const errorRecord = {
|
|
88
|
+
input: ['test'],
|
|
89
|
+
error: 'Something went wrong',
|
|
90
|
+
timing: {
|
|
91
|
+
startTime: 1000,
|
|
92
|
+
endTime: 2000,
|
|
93
|
+
duration: 1000
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
expect(errorRecord.input).toEqual(['test']);
|
|
97
|
+
expect(errorRecord.error).toBe('Something went wrong');
|
|
98
|
+
expect(errorRecord.output).toBeUndefined();
|
|
99
|
+
});
|
|
100
|
+
it('should support BaseExecutionRecord with comprehensive typing', () => {
|
|
101
|
+
var _a, _b, _c, _d;
|
|
102
|
+
const executionRecord = {
|
|
103
|
+
input: { userId: 'user123' },
|
|
104
|
+
output: { result: 42 },
|
|
105
|
+
taskName: 'testTask',
|
|
106
|
+
metadata: { environment: 'test' },
|
|
107
|
+
metrics: [
|
|
108
|
+
{ type: 'performance', name: 'execution_time', value: 150 }
|
|
109
|
+
],
|
|
110
|
+
timing: {
|
|
111
|
+
startTime: 1000,
|
|
112
|
+
endTime: 2000,
|
|
113
|
+
duration: 1000
|
|
114
|
+
},
|
|
115
|
+
type: 'success'
|
|
116
|
+
};
|
|
117
|
+
expect(executionRecord.input.userId).toBe('user123');
|
|
118
|
+
expect((_a = executionRecord.output) === null || _a === void 0 ? void 0 : _a.result).toBe(42);
|
|
119
|
+
expect(executionRecord.taskName).toBe('testTask');
|
|
120
|
+
expect((_b = executionRecord.metadata) === null || _b === void 0 ? void 0 : _b.environment).toBe('test');
|
|
121
|
+
expect((_c = executionRecord.metrics) === null || _c === void 0 ? void 0 : _c[0].value).toBe(150);
|
|
122
|
+
expect((_d = executionRecord.timing) === null || _d === void 0 ? void 0 : _d.duration).toBe(1000);
|
|
123
|
+
expect(executionRecord.type).toBe('success');
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
//# sourceMappingURL=timing-utilities.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing-utilities.test.js","sourceRoot":"","sources":["../../src/test/timing-utilities.test.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for execution timing and metrics
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Timing information for tracking start/end times and duration
|
|
6
|
+
*/
|
|
7
|
+
export interface TimingInfo {
|
|
8
|
+
/** Unix timestamp in milliseconds when execution started */
|
|
9
|
+
startTime: number;
|
|
10
|
+
/** Unix timestamp in milliseconds when execution ended */
|
|
11
|
+
endTime: number;
|
|
12
|
+
/** Computed duration in milliseconds (endTime - startTime) */
|
|
13
|
+
duration?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Metric data structure for collecting custom measurements
|
|
17
|
+
*/
|
|
18
|
+
export interface Metric {
|
|
19
|
+
/** Category of metric (e.g., "performance", "business", "error") */
|
|
20
|
+
type: string;
|
|
21
|
+
/** Specific metric name (e.g., "response_time", "items_processed") */
|
|
22
|
+
name: string;
|
|
23
|
+
/** Numeric value of the metric */
|
|
24
|
+
value: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Utility class for capturing timing information
|
|
28
|
+
*/
|
|
29
|
+
export declare class TimingTracker {
|
|
30
|
+
private startTime;
|
|
31
|
+
/**
|
|
32
|
+
* Start timing capture
|
|
33
|
+
*/
|
|
34
|
+
start(): void;
|
|
35
|
+
/**
|
|
36
|
+
* End timing capture and return timing information
|
|
37
|
+
* @returns TimingInfo object or null if start() was not called
|
|
38
|
+
*/
|
|
39
|
+
end(): TimingInfo | null;
|
|
40
|
+
/**
|
|
41
|
+
* Create a new TimingTracker instance
|
|
42
|
+
* @returns New TimingTracker instance
|
|
43
|
+
*/
|
|
44
|
+
static create(): TimingTracker;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Enhanced boundary record with timing information
|
|
48
|
+
*/
|
|
49
|
+
export interface BoundaryTimingRecord<TInput = unknown[], TOutput = unknown> {
|
|
50
|
+
input: TInput;
|
|
51
|
+
output?: TOutput;
|
|
52
|
+
error?: string;
|
|
53
|
+
timing: TimingInfo;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Base execution record interface with timing and metrics support
|
|
57
|
+
*/
|
|
58
|
+
export interface BaseExecutionRecord<InputType = unknown, OutputType = unknown, B = unknown> {
|
|
59
|
+
/** The input arguments passed to the task */
|
|
60
|
+
input: InputType;
|
|
61
|
+
/** The output returned by the task (if successful) */
|
|
62
|
+
output?: OutputType | null;
|
|
63
|
+
/** The error message if the task failed */
|
|
64
|
+
error?: string;
|
|
65
|
+
/** Boundary execution data */
|
|
66
|
+
boundaries?: B;
|
|
67
|
+
/** The name of the task (if set) */
|
|
68
|
+
taskName?: string;
|
|
69
|
+
/** Additional context metadata */
|
|
70
|
+
metadata?: Record<string, string>;
|
|
71
|
+
/** Array of collected metrics */
|
|
72
|
+
metrics?: Metric[];
|
|
73
|
+
/** Main function execution timing */
|
|
74
|
+
timing?: TimingInfo;
|
|
75
|
+
/** The type of execution record - computed from output/error state */
|
|
76
|
+
type: 'success' | 'error' | 'pending';
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Validates a metric object to ensure it conforms to the Metric interface
|
|
80
|
+
* @param metric - The metric object to validate
|
|
81
|
+
* @returns true if the metric is valid, false otherwise
|
|
82
|
+
*/
|
|
83
|
+
export declare function validateMetric(metric: unknown): metric is Metric;
|
|
84
|
+
/**
|
|
85
|
+
* Creates a validated metric object
|
|
86
|
+
* @param type - The metric type/category
|
|
87
|
+
* @param name - The metric name
|
|
88
|
+
* @param value - The metric value
|
|
89
|
+
* @returns A valid Metric object
|
|
90
|
+
* @throws Error if the metric data is invalid
|
|
91
|
+
*/
|
|
92
|
+
export declare function createMetric(type: string, name: string, value: number): Metric;
|
|
93
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAsB;IAEvC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;;OAGG;IACH,GAAG,IAAI,UAAU,GAAG,IAAI;IAexB;;;OAGG;IACH,MAAM,CAAC,MAAM,IAAI,aAAa;CAG/B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB,CAAC,MAAM,GAAG,OAAO,EAAE,EAAE,OAAO,GAAG,OAAO;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,UAAU,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB,CAAC,SAAS,GAAG,OAAO,EAAE,UAAU,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO;IACzF,6CAA6C;IAC7C,KAAK,EAAE,SAAS,CAAC;IACjB,sDAAsD;IACtD,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC3B,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,UAAU,CAAC,EAAE,CAAC,CAAC;IACf,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,qCAAqC;IACrC,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,sEAAsE;IACtE,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;CACvC;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,MAAM,CAYhE;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ9E"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Shared types for execution timing and metrics
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.TimingTracker = void 0;
|
|
7
|
+
exports.validateMetric = validateMetric;
|
|
8
|
+
exports.createMetric = createMetric;
|
|
9
|
+
/**
|
|
10
|
+
* Utility class for capturing timing information
|
|
11
|
+
*/
|
|
12
|
+
class TimingTracker {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.startTime = null;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Start timing capture
|
|
18
|
+
*/
|
|
19
|
+
start() {
|
|
20
|
+
this.startTime = Date.now();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* End timing capture and return timing information
|
|
24
|
+
* @returns TimingInfo object or null if start() was not called
|
|
25
|
+
*/
|
|
26
|
+
end() {
|
|
27
|
+
if (this.startTime === null) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
const endTime = Date.now();
|
|
31
|
+
const result = {
|
|
32
|
+
startTime: this.startTime,
|
|
33
|
+
endTime,
|
|
34
|
+
duration: endTime - this.startTime
|
|
35
|
+
};
|
|
36
|
+
// Reset startTime so subsequent calls return null
|
|
37
|
+
this.startTime = null;
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Create a new TimingTracker instance
|
|
42
|
+
* @returns New TimingTracker instance
|
|
43
|
+
*/
|
|
44
|
+
static create() {
|
|
45
|
+
return new TimingTracker();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.TimingTracker = TimingTracker;
|
|
49
|
+
/**
|
|
50
|
+
* Validates a metric object to ensure it conforms to the Metric interface
|
|
51
|
+
* @param metric - The metric object to validate
|
|
52
|
+
* @returns true if the metric is valid, false otherwise
|
|
53
|
+
*/
|
|
54
|
+
function validateMetric(metric) {
|
|
55
|
+
if (typeof metric !== 'object' || metric === null) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
const m = metric;
|
|
59
|
+
return (typeof m.type === 'string' && m.type.length > 0 &&
|
|
60
|
+
typeof m.name === 'string' && m.name.length > 0 &&
|
|
61
|
+
typeof m.value === 'number' && !isNaN(m.value) && isFinite(m.value));
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Creates a validated metric object
|
|
65
|
+
* @param type - The metric type/category
|
|
66
|
+
* @param name - The metric name
|
|
67
|
+
* @param value - The metric value
|
|
68
|
+
* @returns A valid Metric object
|
|
69
|
+
* @throws Error if the metric data is invalid
|
|
70
|
+
*/
|
|
71
|
+
function createMetric(type, name, value) {
|
|
72
|
+
const metric = { type, name, value };
|
|
73
|
+
if (!validateMetric(metric)) {
|
|
74
|
+
throw new Error(`Invalid metric: type="${type}", name="${name}", value=${value}`);
|
|
75
|
+
}
|
|
76
|
+
return metric;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AA0GH,wCAYC;AAUD,oCAQC;AA9GD;;GAEG;AACH,MAAa,aAAa;IAA1B;QACU,cAAS,GAAkB,IAAI,CAAA;IAmCzC,CAAC;IAjCC;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC7B,CAAC;IAED;;;OAGG;IACH,GAAG;QACD,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAAA,OAAO,IAAI,CAAA;QAAA,CAAC;QAE1C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAC1B,MAAM,MAAM,GAAG;YACb,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO;YACP,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC,SAAS;SACnC,CAAA;QAED,kDAAkD;QAClD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QACrB,OAAO,MAAM,CAAA;IACf,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,aAAa,EAAE,CAAA;IAC5B,CAAC;CACF;AApCD,sCAoCC;AAoCD;;;;GAIG;AACH,SAAgB,cAAc,CAAC,MAAe;IAC5C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,CAAC,GAAG,MAAiC,CAAA;IAE3C,OAAO,CACL,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;QAC/C,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;QAC/C,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CACpE,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,YAAY,CAAC,IAAY,EAAE,IAAY,EAAE,KAAa;IACpE,MAAM,MAAM,GAAW,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;IAE5C,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,YAAY,IAAI,YAAY,KAAK,EAAE,CAAC,CAAA;IACnF,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
|