Skip to content

Commit bde9951

Browse files
fix: ensure error events are sent (#167)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
1 parent 05c76c5 commit bde9951

File tree

6 files changed

+53
-24
lines changed

6 files changed

+53
-24
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ export interface Options {
103103
signal?: AbortSignal;
104104

105105
/**
106-
* Throw if a task fails (events will not work if true) @default false
106+
* Throws if a task fails @default false
107107
*/
108108
throws?: boolean;
109109

@@ -369,7 +369,7 @@ task.addEventListener('cycle', (evt) => {
369369
### `BenchEvent`
370370

371371
```ts
372-
export type BenchEvent = Event & { task?: Task };
372+
export type BenchEvent = Event & { error?: Error; task?: Task };
373373
```
374374

375375
### `process.hrtime`

src/bench.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ export default class Bench extends EventTarget {
101101
const limit = pLimit(this.threshold);
102102
const promises: Promise<void>[] = [];
103103
for (const task of this._tasks.values()) {
104-
promises.push(limit(() => task.warmup()));
104+
promises.push(limit(task.warmup.bind(task)));
105105
}
106106
await Promise.all(promises);
107107
} else {
@@ -124,7 +124,7 @@ export default class Bench extends EventTarget {
124124
const limit = pLimit(this.threshold);
125125
const promises: Promise<Task>[] = [];
126126
for (const task of this._tasks.values()) {
127-
promises.push(limit(() => task.run()));
127+
promises.push(limit(task.run.bind(task)));
128128
}
129129
values = await Promise.all(promises);
130130
} else {

src/event.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,21 @@ function createBenchEvent(eventType: BenchEvents, target?: Task) {
1414
return event;
1515
}
1616

17-
// eslint-disable-next-line import/prefer-default-export
18-
export { createBenchEvent };
17+
function createErrorEvent(target: Task, error: Error) {
18+
const event = new Event('error');
19+
Object.defineProperty(event, 'task', {
20+
value: target,
21+
enumerable: true,
22+
writable: false,
23+
configurable: false,
24+
});
25+
Object.defineProperty(event, 'error', {
26+
value: error,
27+
enumerable: true,
28+
writable: false,
29+
configurable: false,
30+
});
31+
return event;
32+
}
33+
34+
export { createBenchEvent, createErrorEvent };

src/task.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import pLimit from 'p-limit';
22
import type Bench from './bench';
3-
import { createBenchEvent } from './event';
3+
import { createBenchEvent, createErrorEvent } from './event';
44
import type {
55
AddEventListenerOptionsArgument,
66
Fn,
@@ -148,11 +148,11 @@ export default class Task extends EventTarget {
148148

149149
if (error) {
150150
this.setResult({ error });
151+
this.dispatchEvent(createErrorEvent(this, error));
152+
this.bench.dispatchEvent(createErrorEvent(this, error));
151153
if (this.bench.throws) {
152154
throw error;
153155
}
154-
this.dispatchEvent(createBenchEvent('error', this));
155-
this.bench.dispatchEvent(createBenchEvent('error', this));
156156
}
157157
}
158158

@@ -217,11 +217,11 @@ export default class Task extends EventTarget {
217217

218218
if (error) {
219219
this.setResult({ error });
220+
this.dispatchEvent(createErrorEvent(this, error));
221+
this.bench.dispatchEvent(createErrorEvent(this, error));
220222
if (this.bench.throws) {
221223
throw error;
222224
}
223-
this.dispatchEvent(createBenchEvent('error', this));
224-
this.bench.dispatchEvent(createBenchEvent('error', this));
225225
}
226226

227227
this.dispatchEvent(createBenchEvent('cycle', this));

src/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ export type BenchEvents =
269269

270270
export type Hook = (task: Task, mode: 'warmup' | 'run') => void | Promise<void>;
271271

272-
export type BenchEvent = Event & { task?: Task };
272+
export type BenchEvent = Event & { error?: Error; task?: Task };
273273

274274
export type EventListener = (evt: BenchEvent) => void;
275275

@@ -334,7 +334,7 @@ export interface Options {
334334
signal?: AbortSignal;
335335

336336
/**
337-
* Throw if a task fails (events will not work if true) @default false
337+
* Throws if a task fails @default false
338338
*/
339339
throws?: boolean;
340340

test/index.test.ts

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -198,21 +198,23 @@ test('events order at task completion', async () => {
198198

199199
test.each(['warmup', 'run'])('%s error event', async (mode) => {
200200
const bench = new Bench({ time: 100, warmup: mode === 'warmup' });
201-
const err = new Error();
201+
const error = new Error();
202202

203203
bench.add('error', () => {
204-
throw err;
204+
throw error;
205205
});
206206

207-
let taskErr: Error | undefined;
207+
let err: Error | undefined;
208+
let task: Task | undefined;
208209
bench.addEventListener('error', (evt) => {
209-
const { task } = evt;
210-
taskErr = task?.result?.error;
210+
const { error: e, task: t } = evt;
211+
err = e;
212+
task = t;
211213
});
212214

213-
await bench.run();
214-
215-
expect(taskErr).toStrictEqual(err);
215+
await expect(bench.run()).resolves.toBeDefined();
216+
expect(err).toStrictEqual(error);
217+
expect(task?.result?.error).toStrictEqual(error);
216218
});
217219

218220
test.each(['warmup', 'run'])('%s throws', async (mode) => {
@@ -223,12 +225,23 @@ test.each(['warmup', 'run'])('%s throws', async (mode) => {
223225
warmup: mode === 'warmup',
224226
warmupIterations: iterations,
225227
});
226-
const err = new Error();
228+
const error = new Error();
227229

228230
bench.add('error', () => {
229-
throw err;
231+
throw error;
230232
});
231-
await expect(() => bench.run()).rejects.toThrowError(err);
233+
234+
let err: Error | undefined;
235+
let task: Task | undefined;
236+
bench.addEventListener('error', (evt) => {
237+
const { error: e, task: t } = evt;
238+
err = e;
239+
task = t;
240+
});
241+
242+
await expect(bench.run()).rejects.toThrowError(error);
243+
expect(err).toStrictEqual(error);
244+
expect(task?.result?.error).toStrictEqual(error);
232245
});
233246

234247
test('detect faster task', async () => {

0 commit comments

Comments
 (0)