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

Lines changed: 2 additions & 2 deletions
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

Lines changed: 7 additions & 2 deletions
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

Lines changed: 2 additions & 3 deletions
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 3 additions & 2 deletions
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

Lines changed: 2 additions & 2 deletions
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

Lines changed: 7 additions & 2 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy