Skip to content

Commit 166bfc9

Browse files
authored
feat(v8/core): remove void from transport return (#10794)
Use `Promise<TransportMakeRequestResponse>` instead of `Promise<void | TransportMakeRequestResponse>`. As a result, remove `__sentry__baseTransport__` field from transports.
1 parent 76c4c26 commit 166bfc9

File tree

25 files changed

+79
-204
lines changed

25 files changed

+79
-204
lines changed

MIGRATION.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,7 @@ Removed top-level exports: `tracingOrigins`, `MetricsAggregator`, `metricsAggreg
272272
- [Removal of `spanStatusfromHttpCode` in favour of `getSpanStatusFromHttpCode`](./MIGRATION.md#removal-of-spanstatusfromhttpcode-in-favour-of-getspanstatusfromhttpcode)
273273
- [Removal of `addGlobalEventProcessor` in favour of `addEventProcessor`](./MIGRATION.md#removal-of-addglobaleventprocessor-in-favour-of-addeventprocessor)
274274
- [Removal of `lastEventId()` method](./MIGRATION.md#deprecate-lasteventid)
275+
- [Remove `void` from transport return types](./MIGRATION.md#remove-void-from-transport-return-types)
275276

276277
#### Deprecation of `Hub` and `getCurrentHub()`
277278

@@ -435,6 +436,23 @@ addEventProcessor(event => {
435436

436437
The `lastEventId` function has been removed. See [below](./MIGRATION.md#deprecate-lasteventid) for more details.
437438

439+
#### Remove `void` from transport return types
440+
441+
The `send` method on the `Transport` interface now always requires a `TransportMakeRequestResponse` to be returned in
442+
the promise. This means that the `void` return type is no longer allowed.
443+
444+
```ts
445+
// Before (v7)
446+
interface Transport {
447+
send(event: Event): Promise<void | TransportMakeRequestResponse>;
448+
}
449+
450+
// After (v8)
451+
interface Transport {
452+
send(event: Event): Promise<TransportMakeRequestResponse>;
453+
}
454+
```
455+
438456
### Browser SDK (Browser, React, Vue, Angular, Ember, etc.)
439457

440458
Removed top-level exports: `Offline`, `makeXHRTransport`, `BrowserTracing`

dev-packages/browser-integration-tests/suites/replay/errors/errorModeCustomTransport/init.js

Lines changed: 0 additions & 23 deletions
This file was deleted.

dev-packages/browser-integration-tests/suites/replay/errors/errorModeCustomTransport/test.ts

Lines changed: 0 additions & 42 deletions
This file was deleted.

dev-packages/node-integration-tests/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import type { Express } from 'express';
77
*/
88
export function loggingTransport(_options: BaseTransportOptions): Transport {
99
return {
10-
send(request: Envelope): Promise<void | TransportMakeRequestResponse> {
10+
send(request: Envelope): Promise<TransportMakeRequestResponse> {
1111
// eslint-disable-next-line no-console
1212
console.log(JSON.stringify(request));
1313
return Promise.resolve({ statusCode: 200 });

packages/core/src/baseclient.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -432,10 +432,7 @@ export abstract class BaseClient<O extends ClientOptions> implements Client<O> {
432432
public on(hook: 'preprocessEvent', callback: (event: Event, hint?: EventHint) => void): void;
433433

434434
/** @inheritdoc */
435-
public on(
436-
hook: 'afterSendEvent',
437-
callback: (event: Event, sendResponse: TransportMakeRequestResponse | void) => void,
438-
): void;
435+
public on(hook: 'afterSendEvent', callback: (event: Event, sendResponse: TransportMakeRequestResponse) => void): void;
439436

440437
/** @inheritdoc */
441438
public on(hook: 'beforeAddBreadcrumb', callback: (breadcrumb: Breadcrumb, hint?: BreadcrumbHint) => void): void;
@@ -485,7 +482,7 @@ export abstract class BaseClient<O extends ClientOptions> implements Client<O> {
485482
public emit(hook: 'preprocessEvent', event: Event, hint?: EventHint): void;
486483

487484
/** @inheritdoc */
488-
public emit(hook: 'afterSendEvent', event: Event, sendResponse: TransportMakeRequestResponse | void): void;
485+
public emit(hook: 'afterSendEvent', event: Event, sendResponse: TransportMakeRequestResponse): void;
489486

490487
/** @inheritdoc */
491488
public emit(hook: 'beforeAddBreadcrumb', breadcrumb: Breadcrumb, hint?: BreadcrumbHint): void;
@@ -518,16 +515,17 @@ export abstract class BaseClient<O extends ClientOptions> implements Client<O> {
518515
/**
519516
* @inheritdoc
520517
*/
521-
public sendEnvelope(envelope: Envelope): PromiseLike<void | TransportMakeRequestResponse> | void {
518+
public sendEnvelope(envelope: Envelope): PromiseLike<TransportMakeRequestResponse> | void {
522519
this.emit('beforeEnvelope', envelope);
523520

524521
if (this._isEnabled() && this._transport) {
525522
return this._transport.send(envelope).then(null, reason => {
526523
DEBUG_BUILD && logger.error('Error while sending event:', reason);
524+
return reason;
527525
});
528-
} else {
529-
DEBUG_BUILD && logger.error('Transport disabled');
530526
}
527+
528+
DEBUG_BUILD && logger.error('Transport disabled');
531529
}
532530

533531
/* eslint-enable @typescript-eslint/unified-signatures */

packages/core/src/transports/base.ts

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,14 @@ export const DEFAULT_TRANSPORT_BUFFER_SIZE = 30;
3737
export function createTransport(
3838
options: InternalBaseTransportOptions,
3939
makeRequest: TransportRequestExecutor,
40-
buffer: PromiseBuffer<void | TransportMakeRequestResponse> = makePromiseBuffer(
40+
buffer: PromiseBuffer<TransportMakeRequestResponse> = makePromiseBuffer(
4141
options.bufferSize || DEFAULT_TRANSPORT_BUFFER_SIZE,
4242
),
4343
): Transport {
4444
let rateLimits: RateLimits = {};
4545
const flush = (timeout?: number): PromiseLike<boolean> => buffer.drain(timeout);
4646

47-
function send(envelope: Envelope): PromiseLike<void | TransportMakeRequestResponse> {
47+
function send(envelope: Envelope): PromiseLike<TransportMakeRequestResponse> {
4848
const filteredEnvelopeItems: EnvelopeItem[] = [];
4949

5050
// Drop rate limited items from envelope
@@ -60,7 +60,7 @@ export function createTransport(
6060

6161
// Skip sending if envelope is empty after filtering out rate limited events
6262
if (filteredEnvelopeItems.length === 0) {
63-
return resolvedSyncPromise();
63+
return resolvedSyncPromise({});
6464
}
6565

6666
// eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -74,7 +74,7 @@ export function createTransport(
7474
});
7575
};
7676

77-
const requestTask = (): PromiseLike<void | TransportMakeRequestResponse> =>
77+
const requestTask = (): PromiseLike<TransportMakeRequestResponse> =>
7878
makeRequest({ body: serializeEnvelope(filteredEnvelope) }).then(
7979
response => {
8080
// We don't want to throw on NOK responses, but we want to at least log them
@@ -97,18 +97,14 @@ export function createTransport(
9797
if (error instanceof SentryError) {
9898
DEBUG_BUILD && logger.error('Skipped sending event because buffer is full.');
9999
recordEnvelopeLoss('queue_overflow');
100-
return resolvedSyncPromise();
100+
return resolvedSyncPromise({});
101101
} else {
102102
throw error;
103103
}
104104
},
105105
);
106106
}
107107

108-
// We use this to identifify if the transport is the base transport
109-
// TODO (v8): Remove this again as we'll no longer need it
110-
send.__sentry__baseTransport__ = true;
111-
112108
return {
113109
send,
114110
flush,

packages/core/src/transports/multiplexed.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ function makeOverrideReleaseTransport<TO extends BaseTransportOptions>(
5757
const transport = createTransport(options);
5858

5959
return {
60-
send: async (envelope: Envelope): Promise<void | TransportMakeRequestResponse> => {
60+
send: async (envelope: Envelope): Promise<TransportMakeRequestResponse> => {
6161
const event = eventFromEnvelope(envelope, ['event', 'transaction', 'profile', 'replay_event']);
6262

6363
if (event) {
@@ -101,7 +101,7 @@ export function makeMultiplexedTransport<TO extends BaseTransportOptions>(
101101
return otherTransports[key];
102102
}
103103

104-
async function send(envelope: Envelope): Promise<void | TransportMakeRequestResponse> {
104+
async function send(envelope: Envelope): Promise<TransportMakeRequestResponse> {
105105
function getEvent(types?: EnvelopeItemType[]): Event | undefined {
106106
const eventTypes: EnvelopeItemType[] = types && types.length ? types : ['event'];
107107
return eventFromEnvelope(envelope, eventTypes);

packages/core/src/transports/offline.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ export function makeOfflineTransport<TO>(
113113
retryDelay = Math.min(retryDelay * 2, MAX_DELAY);
114114
}
115115

116-
async function send(envelope: Envelope): Promise<void | TransportMakeRequestResponse> {
116+
async function send(envelope: Envelope): Promise<TransportMakeRequestResponse> {
117117
try {
118118
const result = await transport.send(envelope);
119119

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1804,7 +1804,7 @@ describe('BaseClient', () => {
18041804

18051805
expect(mockSend).toBeCalledTimes(1);
18061806
expect(callback).toBeCalledTimes(1);
1807-
expect(callback).toBeCalledWith(errorEvent, undefined);
1807+
expect(callback).toBeCalledWith(errorEvent, 'send error');
18081808
});
18091809

18101810
it('passes the response to the hook', async () => {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ const transportOptions = {
3535

3636
describe('createTransport', () => {
3737
it('flushes the buffer', async () => {
38-
const mockBuffer: PromiseBuffer<void> = {
38+
const mockBuffer: PromiseBuffer<TransportMakeRequestResponse> = {
3939
$: [],
4040
add: jest.fn(),
4141
drain: jest.fn(),

packages/feedback/src/util/handleFeedbackSubmit.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { TransportMakeRequestResponse } from '@sentry/types';
2-
import { logger } from '@sentry/utils';
2+
import { logger, resolvedSyncPromise } from '@sentry/utils';
33

44
import { FEEDBACK_WIDGET_SOURCE } from '../constants';
55
import { DEBUG_BUILD } from '../debug-build';
@@ -15,10 +15,10 @@ export async function handleFeedbackSubmit(
1515
dialog: DialogComponent | null,
1616
feedback: FeedbackFormData,
1717
options?: SendFeedbackOptions,
18-
): Promise<TransportMakeRequestResponse | void> {
18+
): Promise<TransportMakeRequestResponse> {
1919
if (!dialog) {
2020
// Not sure when this would happen
21-
return;
21+
return resolvedSyncPromise({});
2222
}
2323

2424
const showFetchError = (): void => {
@@ -39,4 +39,6 @@ export async function handleFeedbackSubmit(
3939
DEBUG_BUILD && logger.error(err);
4040
showFetchError();
4141
}
42+
43+
return resolvedSyncPromise({});
4244
}

packages/feedback/src/util/sendFeedbackRequest.ts

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { createEventEnvelope, getClient, withScope } from '@sentry/core';
22
import type { FeedbackEvent, TransportMakeRequestResponse } from '@sentry/types';
3+
import { resolvedSyncPromise } from '@sentry/utils';
34

45
import { FEEDBACK_API_SOURCE, FEEDBACK_WIDGET_SOURCE } from '../constants';
56
import type { SendFeedbackData, SendFeedbackOptions } from '../types';
@@ -11,13 +12,13 @@ import { prepareFeedbackEvent } from './prepareFeedbackEvent';
1112
export async function sendFeedbackRequest(
1213
{ feedback: { message, email, name, source, url } }: SendFeedbackData,
1314
{ includeReplay = true }: SendFeedbackOptions = {},
14-
): Promise<void | TransportMakeRequestResponse> {
15+
): Promise<TransportMakeRequestResponse> {
1516
const client = getClient();
1617
const transport = client && client.getTransport();
1718
const dsn = client && client.getDsn();
1819

1920
if (!client || !transport || !dsn) {
20-
return;
21+
return resolvedSyncPromise({});
2122
}
2223

2324
const baseEvent: FeedbackEvent = {
@@ -48,14 +49,14 @@ export async function sendFeedbackRequest(
4849
});
4950

5051
if (!feedbackEvent) {
51-
return;
52+
return resolvedSyncPromise({});
5253
}
5354

5455
client.emit('beforeSendFeedback', feedbackEvent, { includeReplay: Boolean(includeReplay) });
5556

5657
const envelope = createEventEnvelope(feedbackEvent, dsn, client.getOptions()._metadata, client.getOptions().tunnel);
5758

58-
let response: void | TransportMakeRequestResponse;
59+
let response: TransportMakeRequestResponse;
5960

6061
try {
6162
response = await transport.send(envelope);
@@ -72,11 +73,6 @@ export async function sendFeedbackRequest(
7273
throw error;
7374
}
7475

75-
// TODO (v8): we can remove this guard once transport.send's type signature doesn't include void anymore
76-
if (!response) {
77-
return;
78-
}
79-
8076
// Require valid status codes, otherwise can assume feedback was not sent successfully
8177
if (typeof response.statusCode === 'number' && (response.statusCode < 200 || response.statusCode >= 300)) {
8278
throw new Error('Unable to send Feedback');

packages/feedback/src/widget/createWidget.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ export function createWidget({
109109
const result = await handleFeedbackSubmit(dialog, feedback);
110110

111111
// Error submitting feedback
112-
if (!result) {
112+
if (!result || Object.keys(result).length === 0) {
113113
if (options.onSubmitError) {
114114
options.onSubmitError();
115115
}

packages/feedback/test/utils/mockSdk.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,11 @@ class MockTransport implements Transport {
1111
send: (request: Envelope) => PromiseLike<TransportMakeRequestResponse>;
1212

1313
constructor() {
14-
const send: ((request: Envelope) => PromiseLike<TransportMakeRequestResponse>) & {
15-
__sentry__baseTransport__?: boolean;
16-
} = jest.fn(async () => {
14+
this.send = jest.fn(async () => {
1715
return {
1816
statusCode: 200,
1917
};
2018
});
21-
22-
send.__sentry__baseTransport__ = true;
23-
this.send = send;
2419
}
2520

2621
async flush() {

packages/feedback/test/widget/createWidget.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ describe('createWidget', () => {
130130
});
131131

132132
(sendFeedbackRequest as jest.Mock).mockImplementation(() => {
133-
return Promise.resolve(true);
133+
return Promise.resolve({ statusCode: 200 });
134134
});
135135
widget.actor?.el?.dispatchEvent(new Event('click'));
136136

@@ -180,7 +180,7 @@ describe('createWidget', () => {
180180
});
181181

182182
(sendFeedbackRequest as jest.Mock).mockImplementation(() => {
183-
return true;
183+
return Promise.resolve({ statusCode: 200 });
184184
});
185185
widget.actor?.el?.dispatchEvent(new Event('click'));
186186

0 commit comments

Comments
 (0)