Skip to content

Commit be6b08e

Browse files
committed
PR feedback
1 parent e6220bb commit be6b08e

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

packages/core/src/utils/promisebuffer.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ export function makePromiseBuffer<T>(limit: number = 100): PromiseBuffer<T> {
7070
return resolvedSyncPromise(true);
7171
}
7272

73-
const drainPromise = Promise.all(Array.from(buffer)).then(() => true);
73+
// We want to resolve even if one of the promises rejects
74+
const drainPromise = Promise.allSettled(Array.from(buffer)).then(() => true);
7475

7576
if (!timeout) {
7677
return drainPromise;

packages/core/test/lib/utils/promisebuffer.test.ts

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ describe('PromiseBuffer', () => {
1919
void buffer.add(producer3);
2020
void buffer.add(producer4);
2121
void buffer.add(producer5);
22-
void expect(buffer.add(producer6)).rejects.toThrowError();
22+
await expect(buffer.add(producer6)).rejects.toThrowError();
2323

2424
expect(producer1).toHaveBeenCalledTimes(1);
2525
expect(producer2).toHaveBeenCalledTimes(1);
@@ -42,7 +42,7 @@ describe('PromiseBuffer', () => {
4242
expect(producer6).not.toHaveBeenCalled();
4343
});
4444

45-
test('sync promises', () => {
45+
test('sync promises', async () => {
4646
const buffer = makePromiseBuffer(1);
4747
let task1;
4848
const producer1 = vi.fn(() => {
@@ -51,14 +51,18 @@ describe('PromiseBuffer', () => {
5151
});
5252
const producer2 = vi.fn(() => resolvedSyncPromise());
5353
expect(buffer.add(producer1)).toEqual(task1);
54-
void expect(buffer.add(producer2)).rejects.toThrowError();
54+
const add2 = buffer.add(producer2);
55+
5556
// This is immediately executed and removed again from the buffer
5657
expect(buffer.$.length).toEqual(0);
58+
59+
await expect(add2).resolves.toBeUndefined();
60+
5761
expect(producer1).toHaveBeenCalled();
5862
expect(producer2).toHaveBeenCalled();
5963
});
6064

61-
test('async promises', () => {
65+
test('async promises', async () => {
6266
const buffer = makePromiseBuffer(1);
6367
let task1;
6468
const producer1 = vi.fn(() => {
@@ -67,8 +71,12 @@ describe('PromiseBuffer', () => {
6771
});
6872
const producer2 = vi.fn(() => new Promise(resolve => setTimeout(resolve, 1)));
6973
expect(buffer.add(producer1)).toEqual(task1);
70-
void expect(buffer.add(producer2)).rejects.toThrowError();
74+
const add2 = buffer.add(producer2);
75+
7176
expect(buffer.$.length).toEqual(1);
77+
78+
await expect(add2).rejects.toThrowError();
79+
7280
expect(producer1).toHaveBeenCalled();
7381
expect(producer2).not.toHaveBeenCalled();
7482
});
@@ -159,6 +167,21 @@ describe('PromiseBuffer', () => {
159167
expect(result).toEqual(true);
160168
expect(buffer.$.length).toEqual(0);
161169
});
170+
171+
test('resolves even if one of the promises rejects', async () => {
172+
const buffer = makePromiseBuffer();
173+
const p1 = vi.fn(() => new Promise(resolve => setTimeout(resolve, 1)));
174+
const p2 = vi.fn(() => new Promise((_, reject) => setTimeout(() => reject(new Error('whoops')), 1)));
175+
void buffer.add(p1);
176+
void buffer.add(p2);
177+
178+
const result = await buffer.drain();
179+
expect(result).toEqual(true);
180+
expect(buffer.$.length).toEqual(0);
181+
182+
expect(p1).toHaveBeenCalled();
183+
expect(p2).toHaveBeenCalled();
184+
});
162185
});
163186

164187
test('resolved promises should not show up in buffer length', async () => {

0 commit comments

Comments
 (0)