Skip to content

Commit 598896d

Browse files
committed
ref(utils): refactor promisebuffer
1 parent 6b1a8a3 commit 598896d

File tree

5 files changed

+30
-24
lines changed

5 files changed

+30
-24
lines changed

packages/browser/src/transports/base.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ import {
1717
eventStatusFromHttpCode,
1818
getGlobalObject,
1919
logger,
20-
parseRetryAfterHeader,
2120
makePromiseBuffer,
21+
parseRetryAfterHeader,
22+
PromiseBuffer,
2223
SentryError,
2324
} from '@sentry/utils';
2425

@@ -42,7 +43,7 @@ export abstract class BaseTransport implements Transport {
4243
protected readonly _api: APIDetails;
4344

4445
/** A simple buffer holding all requests. */
45-
protected readonly _buffer: PromiseBuffer<SentryResponse> = new PromiseBuffer(30);
46+
protected readonly _buffer: PromiseBuffer<SentryResponse> = makePromiseBuffer(30);
4647

4748
/** Locks transport after receiving rate limits in a response */
4849
protected readonly _rateLimits: Record<string, Date> = {};

packages/core/test/mocks/transport.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Event, Response, Transport } from '@sentry/types';
2-
import { PromiseBuffer, SyncPromise } from '@sentry/utils';
2+
import { PromiseBuffer, makePromiseBuffer, SyncPromise } from '@sentry/utils';
33

44
async function sleep(delay: number): Promise<void> {
55
return new SyncPromise(resolve => setTimeout(resolve, delay));
@@ -11,7 +11,7 @@ export class FakeTransport implements Transport {
1111
public delay: number = 2000;
1212

1313
/** A simple buffer holding all requests. */
14-
protected readonly _buffer: PromiseBuffer<Response> = new PromiseBuffer(9999);
14+
protected readonly _buffer: PromiseBuffer<Response> = makePromiseBuffer(9999);
1515

1616
public sendEvent(_event: Event): PromiseLike<Response> {
1717
this.sendCalled += 1;

packages/node/src/transports/base/index.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,14 @@ import {
1010
Transport,
1111
TransportOptions,
1212
} from '@sentry/types';
13-
import { eventStatusFromHttpCode, logger, parseRetryAfterHeader, PromiseBuffer, SentryError } from '@sentry/utils';
13+
import {
14+
eventStatusFromHttpCode,
15+
logger,
16+
parseRetryAfterHeader,
17+
PromiseBuffer,
18+
makePromiseBuffer,
19+
SentryError,
20+
} from '@sentry/utils';
1421
import * as fs from 'fs';
1522
import * as http from 'http';
1623
import * as https from 'https';
@@ -43,7 +50,7 @@ export abstract class BaseTransport implements Transport {
4350
protected _api: APIDetails;
4451

4552
/** A simple buffer holding all requests. */
46-
protected readonly _buffer: PromiseBuffer<Response> = new PromiseBuffer(30);
53+
protected readonly _buffer: PromiseBuffer<Response> = makePromiseBuffer(30);
4754

4855
/** Locks transport after receiving rate limits in a response */
4956
protected readonly _rateLimits: Record<string, Date> = {};

packages/utils/src/promisebuffer.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ function allPromises<U = unknown>(collection: Array<U | PromiseLike<U>>): Promis
2222
});
2323
}
2424

25-
interface PromiseBuffer<T> {
25+
export interface PromiseBuffer<T> {
2626
_buffer: Array<PromiseLike<T>>;
2727
isReady(): boolean;
2828
add(taskProducer: () => PromiseLike<T>): PromiseLike<T>;
@@ -31,13 +31,11 @@ interface PromiseBuffer<T> {
3131
drain(timeout?: number): PromiseLike<boolean>;
3232
}
3333

34-
const DEFAULT_BUFFER_LIMIT = 30;
35-
3634
/**
37-
* Create a new promise buffer
38-
* @param limit
35+
* Creates an new PromiseBuffer object with the specified limit
36+
* @param limit max number of promises that can be stored in the buffer
3937
*/
40-
export function makePromiseBuffer<T>(limit: number = DEFAULT_BUFFER_LIMIT): PromiseBuffer<T> {
38+
export function makePromiseBuffer<T>(limit?: number): PromiseBuffer<T> {
4139
const buffer: Array<PromiseLike<T>> = [];
4240

4341
/**
@@ -48,7 +46,7 @@ export function makePromiseBuffer<T>(limit: number = DEFAULT_BUFFER_LIMIT): Prom
4846
}
4947

5048
function isReady(): boolean {
51-
return length() < limit;
49+
return limit === undefined || length() < limit;
5250
}
5351

5452
/**
@@ -88,7 +86,7 @@ export function makePromiseBuffer<T>(limit: number = DEFAULT_BUFFER_LIMIT): Prom
8886
// have promises, so TS has to polyfill when down-compiling.)
8987
.then(null, () =>
9088
remove(task).then(null, () => {
91-
// We have to add another catch here because `this.remove()` starts a new promise chain.
89+
// We have to add another catch here because `remove()` starts a new promise chain.
9290
}),
9391
);
9492
return task;

packages/utils/test/promisebuffer.test.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
import { PromiseBuffer } from '../src/promisebuffer';
1+
import { makePromiseBuffer } from '../src/promisebuffer';
22
import { SyncPromise } from '../src/syncpromise';
33

44
describe('PromiseBuffer', () => {
55
describe('add()', () => {
66
test('no limit', () => {
7-
const buffer = new PromiseBuffer();
7+
const buffer = makePromiseBuffer();
88
const p = jest.fn(() => new SyncPromise(resolve => setTimeout(resolve)));
99
void buffer.add(p);
1010
expect(buffer.length()).toEqual(1);
1111
});
1212

1313
test('with limit', () => {
14-
const buffer = new PromiseBuffer(1);
14+
const buffer = makePromiseBuffer(1);
1515
let task1;
1616
const producer1 = jest.fn(() => {
1717
task1 = new SyncPromise(resolve => setTimeout(resolve));
@@ -28,7 +28,7 @@ describe('PromiseBuffer', () => {
2828

2929
describe('drain()', () => {
3030
test('without timeout', async () => {
31-
const buffer = new PromiseBuffer();
31+
const buffer = makePromiseBuffer();
3232
for (let i = 0; i < 5; i++) {
3333
void buffer.add(() => new SyncPromise(resolve => setTimeout(resolve)));
3434
}
@@ -39,7 +39,7 @@ describe('PromiseBuffer', () => {
3939
});
4040

4141
test('with timeout', async () => {
42-
const buffer = new PromiseBuffer();
42+
const buffer = makePromiseBuffer();
4343
for (let i = 0; i < 5; i++) {
4444
void buffer.add(() => new SyncPromise(resolve => setTimeout(resolve, 100)));
4545
}
@@ -49,7 +49,7 @@ describe('PromiseBuffer', () => {
4949
});
5050

5151
test('on empty buffer', async () => {
52-
const buffer = new PromiseBuffer();
52+
const buffer = makePromiseBuffer();
5353
expect(buffer.length()).toEqual(0);
5454
const result = await buffer.drain();
5555
expect(result).toEqual(true);
@@ -58,7 +58,7 @@ describe('PromiseBuffer', () => {
5858
});
5959

6060
test('resolved promises should not show up in buffer length', async () => {
61-
const buffer = new PromiseBuffer();
61+
const buffer = makePromiseBuffer();
6262
const producer = () => new SyncPromise(resolve => setTimeout(resolve));
6363
const task = buffer.add(producer);
6464
expect(buffer.length()).toEqual(1);
@@ -67,7 +67,7 @@ describe('PromiseBuffer', () => {
6767
});
6868

6969
test('rejected promises should not show up in buffer length', async () => {
70-
const buffer = new PromiseBuffer();
70+
const buffer = makePromiseBuffer();
7171
const producer = () => new SyncPromise((_, reject) => setTimeout(reject));
7272
const task = buffer.add(producer);
7373
expect(buffer.length()).toEqual(1);
@@ -80,7 +80,7 @@ describe('PromiseBuffer', () => {
8080
});
8181

8282
test('resolved task should give an access to the return value', async () => {
83-
const buffer = new PromiseBuffer<string>();
83+
const buffer = makePromiseBuffer<string>();
8484
const producer = () => new SyncPromise<string>(resolve => setTimeout(() => resolve('test')));
8585
const task = buffer.add(producer);
8686
const result = await task;
@@ -89,7 +89,7 @@ describe('PromiseBuffer', () => {
8989

9090
test('rejected task should give an access to the return value', async () => {
9191
expect.assertions(1);
92-
const buffer = new PromiseBuffer<string>();
92+
const buffer = makePromiseBuffer<string>();
9393
const producer = () => new SyncPromise<string>((_, reject) => setTimeout(() => reject(new Error('whoops'))));
9494
const task = buffer.add(producer);
9595
try {

0 commit comments

Comments
 (0)