Skip to content

Commit fe41836

Browse files
authored
feat(core): Use global TextEncoder and TextDecoder (#10701)
Closes #10694 Use global `TextEncoder` and `TextDecoder` now that they are supported by all platforms that will be supported by v8 of the SDKs.
1 parent 3b9c37e commit fe41836

File tree

53 files changed

+117
-265
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+117
-265
lines changed

dev-packages/browser-integration-tests/utils/helpers.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export const properEnvelopeParser = (request: Request | null): EnvelopeItem[] =>
3434
// https://develop.sentry.dev/sdk/envelopes/
3535
const envelope = request?.postData() || '';
3636

37-
const [, items] = parseEnvelope(envelope, new TextEncoder(), new TextDecoder());
37+
const [, items] = parseEnvelope(envelope);
3838

3939
return items;
4040
};

dev-packages/e2e-tests/test-applications/angular-17/event-proxy-server.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export async function startEventProxyServer(options: EventProxyServerOptions): P
7979
const rawSentryResponseBody = Buffer.concat(sentryResponseChunks).toString();
8080

8181
const data: SentryRequestCallbackData = {
82-
envelope: parseEnvelope(proxyRequestBody, new TextEncoder(), new TextDecoder()),
82+
envelope: parseEnvelope(proxyRequestBody),
8383
rawProxyRequestBody: proxyRequestBody,
8484
rawSentryResponseBody,
8585
sentryResponseStatusCode: sentryResponse.statusCode,

dev-packages/e2e-tests/test-applications/nextjs-14/event-proxy-server.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export async function startEventProxyServer(options: EventProxyServerOptions): P
7979
const rawSentryResponseBody = Buffer.concat(sentryResponseChunks).toString();
8080

8181
const data: SentryRequestCallbackData = {
82-
envelope: parseEnvelope(proxyRequestBody, new TextEncoder(), new TextDecoder()),
82+
envelope: parseEnvelope(proxyRequestBody),
8383
rawProxyRequestBody: proxyRequestBody,
8484
rawSentryResponseBody,
8585
sentryResponseStatusCode: sentryResponse.statusCode,

dev-packages/e2e-tests/test-applications/nextjs-app-dir/event-proxy-server.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export async function startEventProxyServer(options: EventProxyServerOptions): P
7979
const rawSentryResponseBody = Buffer.concat(sentryResponseChunks).toString();
8080

8181
const data: SentryRequestCallbackData = {
82-
envelope: parseEnvelope(proxyRequestBody, new TextEncoder(), new TextDecoder()),
82+
envelope: parseEnvelope(proxyRequestBody),
8383
rawProxyRequestBody: proxyRequestBody,
8484
rawSentryResponseBody,
8585
sentryResponseStatusCode: sentryResponse.statusCode,

dev-packages/e2e-tests/test-applications/node-experimental-fastify-app/event-proxy-server.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export async function startEventProxyServer(options: EventProxyServerOptions): P
7979
const rawSentryResponseBody = Buffer.concat(sentryResponseChunks).toString();
8080

8181
const data: SentryRequestCallbackData = {
82-
envelope: parseEnvelope(proxyRequestBody, new TextEncoder(), new TextDecoder()),
82+
envelope: parseEnvelope(proxyRequestBody),
8383
rawProxyRequestBody: proxyRequestBody,
8484
rawSentryResponseBody,
8585
sentryResponseStatusCode: sentryResponse.statusCode,

dev-packages/e2e-tests/test-applications/node-express-app/event-proxy-server.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export async function startEventProxyServer(options: EventProxyServerOptions): P
7979
const rawSentryResponseBody = Buffer.concat(sentryResponseChunks).toString();
8080

8181
const data: SentryRequestCallbackData = {
82-
envelope: parseEnvelope(proxyRequestBody, new TextEncoder(), new TextDecoder()),
82+
envelope: parseEnvelope(proxyRequestBody),
8383
rawProxyRequestBody: proxyRequestBody,
8484
rawSentryResponseBody,
8585
sentryResponseStatusCode: sentryResponse.statusCode,

dev-packages/e2e-tests/test-applications/node-hapi-app/event-proxy-server.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export async function startEventProxyServer(options: EventProxyServerOptions): P
7979
const rawSentryResponseBody = Buffer.concat(sentryResponseChunks).toString();
8080

8181
const data: SentryRequestCallbackData = {
82-
envelope: parseEnvelope(proxyRequestBody, new TextEncoder(), new TextDecoder()),
82+
envelope: parseEnvelope(proxyRequestBody),
8383
rawProxyRequestBody: proxyRequestBody,
8484
rawSentryResponseBody,
8585
sentryResponseStatusCode: sentryResponse.statusCode,

dev-packages/e2e-tests/test-applications/sveltekit-2/event-proxy-server.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export async function startEventProxyServer(options: EventProxyServerOptions): P
7979
const rawSentryResponseBody = Buffer.concat(sentryResponseChunks).toString();
8080

8181
const data: SentryRequestCallbackData = {
82-
envelope: parseEnvelope(proxyRequestBody, new TextEncoder(), new TextDecoder()),
82+
envelope: parseEnvelope(proxyRequestBody),
8383
rawProxyRequestBody: proxyRequestBody,
8484
rawSentryResponseBody,
8585
sentryResponseStatusCode: sentryResponse.statusCode,

dev-packages/e2e-tests/test-applications/sveltekit/event-proxy-server.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export async function startEventProxyServer(options: EventProxyServerOptions): P
7979
const rawSentryResponseBody = Buffer.concat(sentryResponseChunks).toString();
8080

8181
const data: SentryRequestCallbackData = {
82-
envelope: parseEnvelope(proxyRequestBody, new TextEncoder(), new TextDecoder()),
82+
envelope: parseEnvelope(proxyRequestBody),
8383
rawProxyRequestBody: proxyRequestBody,
8484
rawSentryResponseBody,
8585
sentryResponseStatusCode: sentryResponse.statusCode,

dev-packages/e2e-tests/test-applications/vue-3/event-proxy-server.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export async function startEventProxyServer(options: EventProxyServerOptions): P
7979
const rawSentryResponseBody = Buffer.concat(sentryResponseChunks).toString();
8080

8181
const data: SentryRequestCallbackData = {
82-
envelope: parseEnvelope(proxyRequestBody, new TextEncoder(), new TextDecoder()),
82+
envelope: parseEnvelope(proxyRequestBody),
8383
rawProxyRequestBody: proxyRequestBody,
8484
rawSentryResponseBody,
8585
sentryResponseStatusCode: sentryResponse.statusCode,

dev-packages/node-integration-tests/utils/server.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import type { AddressInfo } from 'net';
2-
import { TextDecoder, TextEncoder } from 'util';
32
import type { Envelope } from '@sentry/types';
43
import { parseEnvelope } from '@sentry/utils';
54
import express from 'express';
@@ -15,7 +14,7 @@ export function createBasicSentryServer(onEnvelope: (env: Envelope) => void): Pr
1514
app.use(express.raw({ type: () => true, inflate: true, limit: '100mb' }));
1615
app.post('/api/:id/envelope/', (req, res) => {
1716
try {
18-
const env = parseEnvelope(req.body as Buffer, new TextEncoder(), new TextDecoder());
17+
const env = parseEnvelope(req.body as Buffer);
1918
onEnvelope(env);
2019
} catch (e) {
2120
// eslint-disable-next-line no-console

packages/browser/src/transports/offline.ts

+2-12
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import type { OfflineStore, OfflineTransportOptions } from '@sentry/core';
22
import { makeOfflineTransport } from '@sentry/core';
33
import type { Envelope, InternalBaseTransportOptions, Transport } from '@sentry/types';
4-
import type { TextDecoderInternal } from '@sentry/utils';
54
import { parseEnvelope, serializeEnvelope } from '@sentry/utils';
65

76
// 'Store', 'promisifyRequest' and 'createStore' were originally copied from the 'idb-keyval' package before being
@@ -95,11 +94,6 @@ export interface BrowserOfflineTransportOptions extends OfflineTransportOptions
9594
* Default: 30
9695
*/
9796
maxQueueSize?: number;
98-
/**
99-
* Only required for testing on node.js
100-
* @ignore
101-
*/
102-
textDecoder?: TextDecoderInternal;
10397
}
10498

10599
function createIndexedDbStore(options: BrowserOfflineTransportOptions): OfflineStore {
@@ -117,7 +111,7 @@ function createIndexedDbStore(options: BrowserOfflineTransportOptions): OfflineS
117111
return {
118112
insert: async (env: Envelope) => {
119113
try {
120-
const serialized = await serializeEnvelope(env, options.textEncoder);
114+
const serialized = await serializeEnvelope(env);
121115
await insert(getStore(), serialized, options.maxQueueSize || 30);
122116
} catch (_) {
123117
//
@@ -127,11 +121,7 @@ function createIndexedDbStore(options: BrowserOfflineTransportOptions): OfflineS
127121
try {
128122
const deserialized = await pop(getStore());
129123
if (deserialized) {
130-
return parseEnvelope(
131-
deserialized,
132-
options.textEncoder || new TextEncoder(),
133-
options.textDecoder || new TextDecoder(),
134-
);
124+
return parseEnvelope(deserialized);
135125
}
136126
} catch (_) {
137127
//

packages/browser/test/unit/transports/fetch.test.ts

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { TextEncoder } from 'util';
21
import type { EventEnvelope, EventItem } from '@sentry/types';
32
import { createEnvelope, serializeEnvelope } from '@sentry/utils';
43

@@ -9,7 +8,6 @@ import type { FetchImpl } from '../../../src/transports/utils';
98
const DEFAULT_FETCH_TRANSPORT_OPTIONS: BrowserTransportOptions = {
109
url: 'https://sentry.io/api/42/store/?sentry_key=123&sentry_version=7',
1110
recordDroppedEvent: () => undefined,
12-
textEncoder: new TextEncoder(),
1311
};
1412

1513
const ERROR_ENVELOPE = createEnvelope<EventEnvelope>({ event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2', sent_at: '123' }, [
@@ -47,7 +45,7 @@ describe('NewFetchTransport', () => {
4745
expect(mockFetch).toHaveBeenCalledTimes(1);
4846

4947
expect(mockFetch).toHaveBeenLastCalledWith(DEFAULT_FETCH_TRANSPORT_OPTIONS.url, {
50-
body: serializeEnvelope(ERROR_ENVELOPE, new TextEncoder()),
48+
body: serializeEnvelope(ERROR_ENVELOPE),
5149
method: 'POST',
5250
keepalive: true,
5351
referrerPolicy: 'origin',
@@ -98,7 +96,7 @@ describe('NewFetchTransport', () => {
9896

9997
await transport.send(ERROR_ENVELOPE);
10098
expect(mockFetch).toHaveBeenLastCalledWith(DEFAULT_FETCH_TRANSPORT_OPTIONS.url, {
101-
body: serializeEnvelope(ERROR_ENVELOPE, new TextEncoder()),
99+
body: serializeEnvelope(ERROR_ENVELOPE),
102100
method: 'POST',
103101
...REQUEST_OPTIONS,
104102
});

packages/browser/test/unit/transports/offline.test.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ const ERROR_ENVELOPE = createEnvelope<EventEnvelope>({ event_id: 'aa3ff046696b4b
2727

2828
const transportOptions = {
2929
recordDroppedEvent: () => undefined, // noop
30-
textEncoder: new TextEncoder(),
31-
textDecoder: new TextDecoder(),
3230
};
3331

3432
type MockResult<T> = T | Error;
@@ -61,6 +59,8 @@ function delay(ms: number): Promise<void> {
6159
describe('makeOfflineTransport', () => {
6260
beforeAll(async () => {
6361
await deleteDatabase('sentry');
62+
(global as any).TextEncoder = TextEncoder;
63+
(global as any).TextDecoder = TextDecoder;
6464
});
6565

6666
it('indexedDb wrappers insert and pop', async () => {

packages/browser/test/unit/transports/xhr.test.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { TextEncoder } from 'util';
21
import type { EventEnvelope, EventItem } from '@sentry/types';
32
import { createEnvelope, serializeEnvelope } from '@sentry/utils';
43

@@ -8,7 +7,6 @@ import { makeXHRTransport } from '../../../src/transports/xhr';
87
const DEFAULT_XHR_TRANSPORT_OPTIONS: BrowserTransportOptions = {
98
url: 'https://sentry.io/api/42/store/?sentry_key=123&sentry_version=7',
109
recordDroppedEvent: () => undefined,
11-
textEncoder: new TextEncoder(),
1210
};
1311

1412
const ERROR_ENVELOPE = createEnvelope<EventEnvelope>({ event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2', sent_at: '123' }, [
@@ -66,7 +64,7 @@ describe('NewXHRTransport', () => {
6664
expect(xhrMock.open).toHaveBeenCalledTimes(1);
6765
expect(xhrMock.open).toHaveBeenCalledWith('POST', DEFAULT_XHR_TRANSPORT_OPTIONS.url);
6866
expect(xhrMock.send).toHaveBeenCalledTimes(1);
69-
expect(xhrMock.send).toHaveBeenCalledWith(serializeEnvelope(ERROR_ENVELOPE, new TextEncoder()));
67+
expect(xhrMock.send).toHaveBeenCalledWith(serializeEnvelope(ERROR_ENVELOPE));
7068
});
7169

7270
it('sets rate limit response headers', async () => {

packages/core/src/baseclient.ts

+1-7
Original file line numberDiff line numberDiff line change
@@ -374,13 +374,7 @@ export abstract class BaseClient<O extends ClientOptions> implements Client<O> {
374374
let env = createEventEnvelope(event, this._dsn, this._options._metadata, this._options.tunnel);
375375

376376
for (const attachment of hint.attachments || []) {
377-
env = addItemToEnvelope(
378-
env,
379-
createAttachmentEnvelopeItem(
380-
attachment,
381-
this._options.transportOptions && this._options.transportOptions.textEncoder,
382-
),
383-
);
377+
env = addItemToEnvelope(env, createAttachmentEnvelopeItem(attachment));
384378
}
385379

386380
const promise = this._sendEnvelope(env);

packages/core/src/transports/base.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ export function createTransport(
7575
};
7676

7777
const requestTask = (): PromiseLike<void | TransportMakeRequestResponse> =>
78-
makeRequest({ body: serializeEnvelope(filteredEnvelope, options.textEncoder) }).then(
78+
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
8181
if (response.statusCode !== undefined && (response.statusCode < 200 || response.statusCode >= 300)) {

packages/core/test/lib/attachments.test.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { TextDecoder, TextEncoder } from 'util';
21
import { parseEnvelope } from '@sentry/utils';
32

43
import { createTransport } from '../../src/transports/base';
@@ -21,8 +20,8 @@ describe('Attachments', () => {
2120
dsn: 'https://username@domain/123',
2221
enableSend: true,
2322
transport: () =>
24-
createTransport({ recordDroppedEvent: () => undefined, textEncoder: new TextEncoder() }, async req => {
25-
const [, items] = parseEnvelope(req.body, new TextEncoder(), new TextDecoder());
23+
createTransport({ recordDroppedEvent: () => undefined }, async req => {
24+
const [, items] = parseEnvelope(req.body);
2625
expect(items.length).toEqual(2);
2726
// Second envelope item should be the attachment
2827
expect(items[1][0]).toEqual({ type: 'attachment', length: 50000, filename: 'empty.bin' });

packages/core/test/lib/integrations/metadata.test.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { TextDecoder, TextEncoder } from 'util';
21
import type { Event } from '@sentry/types';
32
import { GLOBAL_OBJ, createStackParser, nodeStackLineParser, parseEnvelope } from '@sentry/utils';
43

@@ -37,8 +36,8 @@ describe('ModuleMetadata integration', () => {
3736
return event;
3837
},
3938
transport: () =>
40-
createTransport({ recordDroppedEvent: () => undefined, textEncoder: new TextEncoder() }, async req => {
41-
const [, items] = parseEnvelope(req.body, new TextEncoder(), new TextDecoder());
39+
createTransport({ recordDroppedEvent: () => undefined }, async req => {
40+
const [, items] = parseEnvelope(req.body);
4241

4342
expect(items[0][1]).toBeDefined();
4443
const event = items[0][1] as Event;

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

+3-8
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { TextEncoder } from 'util';
21
import type { AttachmentItem, EventEnvelope, EventItem, TransportMakeRequestResponse } from '@sentry/types';
32
import type { PromiseBuffer } from '@sentry/utils';
43
import { createEnvelope, resolvedSyncPromise, serializeEnvelope } from '@sentry/utils';
@@ -32,7 +31,6 @@ const ATTACHMENT_ENVELOPE = createEnvelope<EventEnvelope>(
3231

3332
const transportOptions = {
3433
recordDroppedEvent: () => undefined, // noop
35-
textEncoder: new TextEncoder(),
3634
};
3735

3836
describe('createTransport', () => {
@@ -55,7 +53,7 @@ describe('createTransport', () => {
5553
it('constructs a request to send to Sentry', async () => {
5654
expect.assertions(1);
5755
const transport = createTransport(transportOptions, req => {
58-
expect(req.body).toEqual(serializeEnvelope(ERROR_ENVELOPE, new TextEncoder()));
56+
expect(req.body).toEqual(serializeEnvelope(ERROR_ENVELOPE));
5957
return resolvedSyncPromise({});
6058
});
6159
await transport.send(ERROR_ENVELOPE);
@@ -65,7 +63,7 @@ describe('createTransport', () => {
6563
expect.assertions(2);
6664

6765
const transport = createTransport(transportOptions, req => {
68-
expect(req.body).toEqual(serializeEnvelope(ERROR_ENVELOPE, new TextEncoder()));
66+
expect(req.body).toEqual(serializeEnvelope(ERROR_ENVELOPE));
6967
throw new Error();
7068
});
7169

@@ -101,10 +99,7 @@ describe('createTransport', () => {
10199

102100
const mockRecordDroppedEventCallback = jest.fn();
103101

104-
const transport = createTransport(
105-
{ recordDroppedEvent: mockRecordDroppedEventCallback, textEncoder: new TextEncoder() },
106-
mockRequestExecutor,
107-
);
102+
const transport = createTransport({ recordDroppedEvent: mockRecordDroppedEventCallback }, mockRequestExecutor);
108103

109104
return [transport, setTransportResponse, mockRequestExecutor, mockRecordDroppedEventCallback] as const;
110105
}

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

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { TextDecoder, TextEncoder } from 'util';
21
import type {
32
BaseTransportOptions,
43
ClientReport,
@@ -59,7 +58,7 @@ const createTestTransport = (...assertions: Assertion[]): ((options: BaseTranspo
5958
throw new Error('No assertion left');
6059
}
6160

62-
const event = eventFromEnvelope(parseEnvelope(request.body, new TextEncoder(), new TextDecoder()), ['event']);
61+
const event = eventFromEnvelope(parseEnvelope(request.body), ['event']);
6362

6463
assertion(options.url, event?.release, request.body);
6564
resolve({ statusCode: 200 });
@@ -69,7 +68,6 @@ const createTestTransport = (...assertions: Assertion[]): ((options: BaseTranspo
6968

7069
const transportOptions = {
7170
recordDroppedEvent: () => undefined, // noop
72-
textEncoder: new TextEncoder(),
7371
};
7472

7573
describe('makeMultiplexedTransport', () => {

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

-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { TextEncoder } from 'util';
21
import type {
32
ClientReport,
43
Envelope,
@@ -76,7 +75,6 @@ const CLIENT_REPORT_ENVELOPE = createClientReportEnvelope(
7675

7776
const transportOptions = {
7877
recordDroppedEvent: () => undefined, // noop
79-
textEncoder: new TextEncoder(),
8078
};
8179

8280
type MockResult<T> = T | Error;

packages/core/test/mocks/client.ts

-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { TextEncoder } from 'util';
21
import type {
32
ClientOptions,
43
Event,
@@ -19,12 +18,10 @@ export function getDefaultTestClientOptions(options: Partial<TestClientOptions>
1918
return {
2019
integrations: [],
2120
sendClientReports: true,
22-
transportOptions: { textEncoder: new TextEncoder() },
2321
transport: () =>
2422
createTransport(
2523
{
2624
recordDroppedEvent: () => undefined,
27-
textEncoder: new TextEncoder(),
2825
}, // noop
2926
_ => resolvedSyncPromise({}),
3027
),

packages/core/test/mocks/transport.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { TextEncoder } from 'util';
21
import type { Transport } from '@sentry/types';
32
import { SyncPromise } from '@sentry/utils';
43

@@ -17,7 +16,7 @@ export function makeFakeTransport(delay: number = 2000): {
1716
let sendCalled = 0;
1817
let sentCount = 0;
1918
const makeTransport = () =>
20-
createTransport({ recordDroppedEvent: () => undefined, textEncoder: new TextEncoder() }, () => {
19+
createTransport({ recordDroppedEvent: () => undefined }, () => {
2120
sendCalled++;
2221
return new SyncPromise(async res => {
2322
await sleep(delay);

packages/deno/test/transport.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export function makeTestTransport(callback: (envelope: sentryTypes.Envelope) =>
1313
async function doCallback(
1414
request: sentryTypes.TransportRequest,
1515
): Promise<sentryTypes.TransportMakeRequestResponse> {
16-
await callback(sentryUtils.parseEnvelope(request.body, new TextEncoder(), new TextDecoder()));
16+
await callback(sentryUtils.parseEnvelope(request.body));
1717

1818
return Promise.resolve({
1919
statusCode: 200,

0 commit comments

Comments
 (0)