Skip to content

Commit c276386

Browse files
authored
ref: Avoid using SentryError for PromiseBuffer control flow (#15822)
This replaces usage of `SentryError` for promise buffer control flow. Instead, we can use a symbol and just check this directly, we do not even care about the message here. ref #15725 (comment)
1 parent d650218 commit c276386

File tree

7 files changed

+24
-14
lines changed

7 files changed

+24
-14
lines changed

packages/cloudflare/src/transport.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { BaseTransportOptions, Transport, TransportMakeRequestResponse, TransportRequest } from '@sentry/core';
2-
import { SentryError, createTransport, suppressTracing } from '@sentry/core';
2+
import { SENTRY_BUFFER_FULL_ERROR, createTransport, suppressTracing } from '@sentry/core';
33

44
export interface CloudflareTransportOptions extends BaseTransportOptions {
55
/** Fetch API init parameters. */
@@ -38,7 +38,7 @@ export class IsolatedPromiseBuffer {
3838
*/
3939
public add(taskProducer: () => PromiseLike<TransportMakeRequestResponse>): PromiseLike<TransportMakeRequestResponse> {
4040
if (this._taskProducers.length >= this._bufferSize) {
41-
return Promise.reject(new SentryError('Not adding Promise because buffer limit was reached.'));
41+
return Promise.reject(SENTRY_BUFFER_FULL_ERROR);
4242
}
4343

4444
this._taskProducers.push(taskProducer);

packages/cloudflare/test/transport.test.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { createEnvelope, serializeEnvelope } from '@sentry/core';
1+
import { SENTRY_BUFFER_FULL_ERROR, createEnvelope, serializeEnvelope } from '@sentry/core';
22
import type { EventEnvelope, EventItem } from '@sentry/core';
33
import { afterAll, describe, expect, it, vi } from 'vitest';
44

@@ -140,7 +140,12 @@ describe('IsolatedPromiseBuffer', () => {
140140
await ipb.add(task2);
141141
await ipb.add(task3);
142142

143-
await expect(ipb.add(task4)).rejects.toThrowError('Not adding Promise because buffer limit was reached.');
143+
try {
144+
await ipb.add(task4);
145+
throw new Error('Should not be called');
146+
} catch (error) {
147+
expect(error).toBe(SENTRY_BUFFER_FULL_ERROR);
148+
}
144149
});
145150

146151
it('should not throw when one of the tasks throws when drained', async () => {

packages/core/src/transports/base.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,8 @@ import {
1414
forEachEnvelopeItem,
1515
serializeEnvelope,
1616
} from '../utils-hoist/envelope';
17-
import { SentryError } from '../utils-hoist/error';
1817
import { logger } from '../utils-hoist/logger';
19-
import { type PromiseBuffer, makePromiseBuffer } from '../utils-hoist/promisebuffer';
18+
import { type PromiseBuffer, makePromiseBuffer, SENTRY_BUFFER_FULL_ERROR } from '../utils-hoist/promisebuffer';
2019
import { type RateLimits, isRateLimited, updateRateLimits } from '../utils-hoist/ratelimit';
2120
import { resolvedSyncPromise } from '../utils-hoist/syncpromise';
2221

@@ -85,7 +84,7 @@ export function createTransport(
8584
return buffer.add(requestTask).then(
8685
result => result,
8786
error => {
88-
if (error instanceof SentryError) {
87+
if (error === SENTRY_BUFFER_FULL_ERROR) {
8988
DEBUG_BUILD && logger.error('Skipped sending event because buffer is full.');
9089
recordEnvelopeLoss('queue_overflow');
9190
return resolvedSyncPromise({});

packages/core/src/utils-hoist/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ export {
5353
objectify,
5454
} from './object';
5555
export { basename, dirname, isAbsolute, join, normalizePath, relative, resolve } from './path';
56-
export { makePromiseBuffer } from './promisebuffer';
56+
export { makePromiseBuffer, SENTRY_BUFFER_FULL_ERROR } from './promisebuffer';
5757
export type { PromiseBuffer } from './promisebuffer';
5858

5959
export { severityLevelFromString } from './severity';

packages/core/src/utils-hoist/promisebuffer.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { SentryError } from './error';
21
import { SyncPromise, rejectedSyncPromise, resolvedSyncPromise } from './syncpromise';
32

43
export interface PromiseBuffer<T> {
@@ -9,6 +8,8 @@ export interface PromiseBuffer<T> {
98
drain(timeout?: number): PromiseLike<boolean>;
109
}
1110

11+
export const SENTRY_BUFFER_FULL_ERROR = Symbol.for('SentryBufferFullError');
12+
1213
/**
1314
* Creates an new PromiseBuffer object with the specified limit
1415
* @param limit max number of promises that can be stored in the buffer
@@ -42,7 +43,7 @@ export function makePromiseBuffer<T>(limit?: number): PromiseBuffer<T> {
4243
*/
4344
function add(taskProducer: () => PromiseLike<T>): PromiseLike<T> {
4445
if (!isReady()) {
45-
return rejectedSyncPromise(new SentryError('Not adding Promise because buffer limit was reached.'));
46+
return rejectedSyncPromise(SENTRY_BUFFER_FULL_ERROR);
4647
}
4748

4849
// start the task and add its promise to the queue

packages/vercel-edge/src/transports/index.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { BaseTransportOptions, Transport, TransportMakeRequestResponse, TransportRequest } from '@sentry/core';
2-
import { SentryError, createTransport, suppressTracing } from '@sentry/core';
2+
import { SENTRY_BUFFER_FULL_ERROR, createTransport, suppressTracing } from '@sentry/core';
33

44
export interface VercelEdgeTransportOptions extends BaseTransportOptions {
55
/** Fetch API init parameters. */
@@ -38,7 +38,7 @@ export class IsolatedPromiseBuffer {
3838
*/
3939
public add(taskProducer: () => PromiseLike<TransportMakeRequestResponse>): PromiseLike<TransportMakeRequestResponse> {
4040
if (this._taskProducers.length >= this._bufferSize) {
41-
return Promise.reject(new SentryError('Not adding Promise because buffer limit was reached.'));
41+
return Promise.reject(SENTRY_BUFFER_FULL_ERROR);
4242
}
4343

4444
this._taskProducers.push(taskProducer);

packages/vercel-edge/test/transports/index.test.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { afterAll, describe, expect, it, vi } from 'vitest';
22

3-
import { createEnvelope, serializeEnvelope } from '@sentry/core';
3+
import { SENTRY_BUFFER_FULL_ERROR, createEnvelope, serializeEnvelope } from '@sentry/core';
44
import type { EventEnvelope, EventItem } from '@sentry/core';
55

66
import type { VercelEdgeTransportOptions } from '../../src/transports';
@@ -139,7 +139,12 @@ describe('IsolatedPromiseBuffer', () => {
139139
await ipb.add(task2);
140140
await ipb.add(task3);
141141

142-
await expect(ipb.add(task4)).rejects.toThrowError('Not adding Promise because buffer limit was reached.');
142+
try {
143+
await ipb.add(task4);
144+
throw new Error('Should not be called');
145+
} catch (error) {
146+
expect(error).toBe(SENTRY_BUFFER_FULL_ERROR);
147+
}
143148
});
144149

145150
it('should not throw when one of the tasks throws when drained', async () => {

0 commit comments

Comments
 (0)