Skip to content

Commit ad219fd

Browse files
authored
fix: Store processing state for each flush call separately (getsentry#2143)
1 parent 2ff420e commit ad219fd

File tree

2 files changed

+31
-16
lines changed

2 files changed

+31
-16
lines changed

packages/core/src/baseclient.ts

+18-16
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,6 @@ export abstract class BaseClient<B extends Backend, O extends Options> implement
5858
/** Is the client still processing a call? */
5959
protected _processing: boolean = false;
6060

61-
/** Processing interval */
62-
protected _processingInterval?: number;
63-
6461
/**
6562
* Initializes this client instance.
6663
*
@@ -166,14 +163,12 @@ export abstract class BaseClient<B extends Backend, O extends Options> implement
166163
* @inheritDoc
167164
*/
168165
public flush(timeout?: number): Promise<boolean> {
169-
return this._isClientProcessing(timeout).then(clientReady => {
170-
if (this._processingInterval) {
171-
clearInterval(this._processingInterval);
172-
}
166+
return this._isClientProcessing(timeout).then(status => {
167+
clearInterval(status.interval);
173168
return this._getBackend()
174169
.getTransport()
175170
.close(timeout)
176-
.then(transportFlushed => clientReady && transportFlushed);
171+
.then(transportFlushed => status.ready && transportFlushed);
177172
});
178173
}
179174

@@ -207,20 +202,27 @@ export abstract class BaseClient<B extends Backend, O extends Options> implement
207202
}
208203

209204
/** Waits for the client to be done with processing. */
210-
protected _isClientProcessing(timeout?: number): Promise<boolean> {
211-
return new Promise<boolean>(resolve => {
205+
protected _isClientProcessing(timeout?: number): Promise<{ ready: boolean; interval: number }> {
206+
return new Promise<{ ready: boolean; interval: number }>(resolve => {
212207
let ticked: number = 0;
213208
const tick: number = 1;
214-
if (this._processingInterval) {
215-
clearInterval(this._processingInterval);
216-
}
217-
this._processingInterval = (setInterval(() => {
209+
210+
let interval = 0;
211+
clearInterval(interval);
212+
213+
interval = (setInterval(() => {
218214
if (!this._processing) {
219-
resolve(true);
215+
resolve({
216+
interval,
217+
ready: true,
218+
});
220219
} else {
221220
ticked += tick;
222221
if (timeout && ticked >= timeout) {
223-
resolve(false);
222+
resolve({
223+
interval,
224+
ready: false,
225+
});
224226
}
225227
}
226228
}, tick) as unknown) as number;

packages/core/test/lib/base.test.ts

+13
Original file line numberDiff line numberDiff line change
@@ -469,5 +469,18 @@ describe('BaseClient', () => {
469469
// Sends after close shouldn't work anymore
470470
expect(client.captureMessage('test')).toBeFalsy();
471471
});
472+
473+
test('multiple concurrent flush calls should just work', async () => {
474+
jest.useRealTimers();
475+
expect.assertions(3);
476+
477+
const client = new TestClient({ dsn: PUBLIC_DSN });
478+
479+
return Promise.all([
480+
client.flush(1).then(() => expect(true).toEqual(true)),
481+
client.flush(1).then(() => expect(true).toEqual(true)),
482+
client.flush(1).then(() => expect(true).toEqual(true)),
483+
]);
484+
});
472485
});
473486
});

0 commit comments

Comments
 (0)