Skip to content

feat(core): Use global TextEncoder and TextDecoder #10701

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Feb 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion dev-packages/browser-integration-tests/utils/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export const properEnvelopeParser = (request: Request | null): EnvelopeItem[] =>
// https://develop.sentry.dev/sdk/envelopes/
const envelope = request?.postData() || '';

const [, items] = parseEnvelope(envelope, new TextEncoder(), new TextDecoder());
const [, items] = parseEnvelope(envelope);

return items;
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ export async function startEventProxyServer(options: EventProxyServerOptions): P
const rawSentryResponseBody = Buffer.concat(sentryResponseChunks).toString();

const data: SentryRequestCallbackData = {
envelope: parseEnvelope(proxyRequestBody, new TextEncoder(), new TextDecoder()),
envelope: parseEnvelope(proxyRequestBody),
rawProxyRequestBody: proxyRequestBody,
rawSentryResponseBody,
sentryResponseStatusCode: sentryResponse.statusCode,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ export async function startEventProxyServer(options: EventProxyServerOptions): P
const rawSentryResponseBody = Buffer.concat(sentryResponseChunks).toString();

const data: SentryRequestCallbackData = {
envelope: parseEnvelope(proxyRequestBody, new TextEncoder(), new TextDecoder()),
envelope: parseEnvelope(proxyRequestBody),
rawProxyRequestBody: proxyRequestBody,
rawSentryResponseBody,
sentryResponseStatusCode: sentryResponse.statusCode,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ export async function startEventProxyServer(options: EventProxyServerOptions): P
const rawSentryResponseBody = Buffer.concat(sentryResponseChunks).toString();

const data: SentryRequestCallbackData = {
envelope: parseEnvelope(proxyRequestBody, new TextEncoder(), new TextDecoder()),
envelope: parseEnvelope(proxyRequestBody),
rawProxyRequestBody: proxyRequestBody,
rawSentryResponseBody,
sentryResponseStatusCode: sentryResponse.statusCode,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ export async function startEventProxyServer(options: EventProxyServerOptions): P
const rawSentryResponseBody = Buffer.concat(sentryResponseChunks).toString();

const data: SentryRequestCallbackData = {
envelope: parseEnvelope(proxyRequestBody, new TextEncoder(), new TextDecoder()),
envelope: parseEnvelope(proxyRequestBody),
rawProxyRequestBody: proxyRequestBody,
rawSentryResponseBody,
sentryResponseStatusCode: sentryResponse.statusCode,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ export async function startEventProxyServer(options: EventProxyServerOptions): P
const rawSentryResponseBody = Buffer.concat(sentryResponseChunks).toString();

const data: SentryRequestCallbackData = {
envelope: parseEnvelope(proxyRequestBody, new TextEncoder(), new TextDecoder()),
envelope: parseEnvelope(proxyRequestBody),
rawProxyRequestBody: proxyRequestBody,
rawSentryResponseBody,
sentryResponseStatusCode: sentryResponse.statusCode,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ export async function startEventProxyServer(options: EventProxyServerOptions): P
const rawSentryResponseBody = Buffer.concat(sentryResponseChunks).toString();

const data: SentryRequestCallbackData = {
envelope: parseEnvelope(proxyRequestBody, new TextEncoder(), new TextDecoder()),
envelope: parseEnvelope(proxyRequestBody),
rawProxyRequestBody: proxyRequestBody,
rawSentryResponseBody,
sentryResponseStatusCode: sentryResponse.statusCode,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ export async function startEventProxyServer(options: EventProxyServerOptions): P
const rawSentryResponseBody = Buffer.concat(sentryResponseChunks).toString();

const data: SentryRequestCallbackData = {
envelope: parseEnvelope(proxyRequestBody, new TextEncoder(), new TextDecoder()),
envelope: parseEnvelope(proxyRequestBody),
rawProxyRequestBody: proxyRequestBody,
rawSentryResponseBody,
sentryResponseStatusCode: sentryResponse.statusCode,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ export async function startEventProxyServer(options: EventProxyServerOptions): P
const rawSentryResponseBody = Buffer.concat(sentryResponseChunks).toString();

const data: SentryRequestCallbackData = {
envelope: parseEnvelope(proxyRequestBody, new TextEncoder(), new TextDecoder()),
envelope: parseEnvelope(proxyRequestBody),
rawProxyRequestBody: proxyRequestBody,
rawSentryResponseBody,
sentryResponseStatusCode: sentryResponse.statusCode,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ export async function startEventProxyServer(options: EventProxyServerOptions): P
const rawSentryResponseBody = Buffer.concat(sentryResponseChunks).toString();

const data: SentryRequestCallbackData = {
envelope: parseEnvelope(proxyRequestBody, new TextEncoder(), new TextDecoder()),
envelope: parseEnvelope(proxyRequestBody),
rawProxyRequestBody: proxyRequestBody,
rawSentryResponseBody,
sentryResponseStatusCode: sentryResponse.statusCode,
Expand Down
3 changes: 1 addition & 2 deletions dev-packages/node-integration-tests/utils/server.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import type { AddressInfo } from 'net';
import { TextDecoder, TextEncoder } from 'util';
import type { Envelope } from '@sentry/types';
import { parseEnvelope } from '@sentry/utils';
import express from 'express';
Expand All @@ -15,7 +14,7 @@ export function createBasicSentryServer(onEnvelope: (env: Envelope) => void): Pr
app.use(express.raw({ type: () => true, inflate: true, limit: '100mb' }));
app.post('/api/:id/envelope/', (req, res) => {
try {
const env = parseEnvelope(req.body as Buffer, new TextEncoder(), new TextDecoder());
const env = parseEnvelope(req.body as Buffer);
onEnvelope(env);
} catch (e) {
// eslint-disable-next-line no-console
Expand Down
14 changes: 2 additions & 12 deletions packages/browser/src/transports/offline.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import type { OfflineStore, OfflineTransportOptions } from '@sentry/core';
import { makeOfflineTransport } from '@sentry/core';
import type { Envelope, InternalBaseTransportOptions, Transport } from '@sentry/types';
import type { TextDecoderInternal } from '@sentry/utils';
import { parseEnvelope, serializeEnvelope } from '@sentry/utils';

// 'Store', 'promisifyRequest' and 'createStore' were originally copied from the 'idb-keyval' package before being
Expand Down Expand Up @@ -95,11 +94,6 @@ export interface BrowserOfflineTransportOptions extends OfflineTransportOptions
* Default: 30
*/
maxQueueSize?: number;
/**
* Only required for testing on node.js
* @ignore
*/
textDecoder?: TextDecoderInternal;
}

function createIndexedDbStore(options: BrowserOfflineTransportOptions): OfflineStore {
Expand All @@ -117,7 +111,7 @@ function createIndexedDbStore(options: BrowserOfflineTransportOptions): OfflineS
return {
insert: async (env: Envelope) => {
try {
const serialized = await serializeEnvelope(env, options.textEncoder);
const serialized = await serializeEnvelope(env);
await insert(getStore(), serialized, options.maxQueueSize || 30);
} catch (_) {
//
Expand All @@ -127,11 +121,7 @@ function createIndexedDbStore(options: BrowserOfflineTransportOptions): OfflineS
try {
const deserialized = await pop(getStore());
if (deserialized) {
return parseEnvelope(
deserialized,
options.textEncoder || new TextEncoder(),
options.textDecoder || new TextDecoder(),
);
return parseEnvelope(deserialized);
}
} catch (_) {
//
Expand Down
6 changes: 2 additions & 4 deletions packages/browser/test/unit/transports/fetch.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { TextEncoder } from 'util';
import type { EventEnvelope, EventItem } from '@sentry/types';
import { createEnvelope, serializeEnvelope } from '@sentry/utils';

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

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

expect(mockFetch).toHaveBeenLastCalledWith(DEFAULT_FETCH_TRANSPORT_OPTIONS.url, {
body: serializeEnvelope(ERROR_ENVELOPE, new TextEncoder()),
body: serializeEnvelope(ERROR_ENVELOPE),
method: 'POST',
keepalive: true,
referrerPolicy: 'origin',
Expand Down Expand Up @@ -98,7 +96,7 @@ describe('NewFetchTransport', () => {

await transport.send(ERROR_ENVELOPE);
expect(mockFetch).toHaveBeenLastCalledWith(DEFAULT_FETCH_TRANSPORT_OPTIONS.url, {
body: serializeEnvelope(ERROR_ENVELOPE, new TextEncoder()),
body: serializeEnvelope(ERROR_ENVELOPE),
method: 'POST',
...REQUEST_OPTIONS,
});
Expand Down
4 changes: 2 additions & 2 deletions packages/browser/test/unit/transports/offline.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,6 @@ const ERROR_ENVELOPE = createEnvelope<EventEnvelope>({ event_id: 'aa3ff046696b4b

const transportOptions = {
recordDroppedEvent: () => undefined, // noop
textEncoder: new TextEncoder(),
textDecoder: new TextDecoder(),
};

type MockResult<T> = T | Error;
Expand Down Expand Up @@ -61,6 +59,8 @@ function delay(ms: number): Promise<void> {
describe('makeOfflineTransport', () => {
beforeAll(async () => {
await deleteDatabase('sentry');
(global as any).TextEncoder = TextEncoder;
(global as any).TextDecoder = TextDecoder;
});

it('indexedDb wrappers insert and pop', async () => {
Expand Down
4 changes: 1 addition & 3 deletions packages/browser/test/unit/transports/xhr.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { TextEncoder } from 'util';
import type { EventEnvelope, EventItem } from '@sentry/types';
import { createEnvelope, serializeEnvelope } from '@sentry/utils';

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

const ERROR_ENVELOPE = createEnvelope<EventEnvelope>({ event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2', sent_at: '123' }, [
Expand Down Expand Up @@ -66,7 +64,7 @@ describe('NewXHRTransport', () => {
expect(xhrMock.open).toHaveBeenCalledTimes(1);
expect(xhrMock.open).toHaveBeenCalledWith('POST', DEFAULT_XHR_TRANSPORT_OPTIONS.url);
expect(xhrMock.send).toHaveBeenCalledTimes(1);
expect(xhrMock.send).toHaveBeenCalledWith(serializeEnvelope(ERROR_ENVELOPE, new TextEncoder()));
expect(xhrMock.send).toHaveBeenCalledWith(serializeEnvelope(ERROR_ENVELOPE));
});

it('sets rate limit response headers', async () => {
Expand Down
8 changes: 1 addition & 7 deletions packages/core/src/baseclient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -374,13 +374,7 @@ export abstract class BaseClient<O extends ClientOptions> implements Client<O> {
let env = createEventEnvelope(event, this._dsn, this._options._metadata, this._options.tunnel);

for (const attachment of hint.attachments || []) {
env = addItemToEnvelope(
env,
createAttachmentEnvelopeItem(
attachment,
this._options.transportOptions && this._options.transportOptions.textEncoder,
),
);
env = addItemToEnvelope(env, createAttachmentEnvelopeItem(attachment));
}

const promise = this._sendEnvelope(env);
Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/transports/base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ export function createTransport(
};

const requestTask = (): PromiseLike<void | TransportMakeRequestResponse> =>
makeRequest({ body: serializeEnvelope(filteredEnvelope, options.textEncoder) }).then(
makeRequest({ body: serializeEnvelope(filteredEnvelope) }).then(
response => {
// We don't want to throw on NOK responses, but we want to at least log them
if (response.statusCode !== undefined && (response.statusCode < 200 || response.statusCode >= 300)) {
Expand Down
5 changes: 2 additions & 3 deletions packages/core/test/lib/attachments.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { TextDecoder, TextEncoder } from 'util';
import { parseEnvelope } from '@sentry/utils';

import { createTransport } from '../../src/transports/base';
Expand All @@ -21,8 +20,8 @@ describe('Attachments', () => {
dsn: 'https://username@domain/123',
enableSend: true,
transport: () =>
createTransport({ recordDroppedEvent: () => undefined, textEncoder: new TextEncoder() }, async req => {
const [, items] = parseEnvelope(req.body, new TextEncoder(), new TextDecoder());
createTransport({ recordDroppedEvent: () => undefined }, async req => {
const [, items] = parseEnvelope(req.body);
expect(items.length).toEqual(2);
// Second envelope item should be the attachment
expect(items[1][0]).toEqual({ type: 'attachment', length: 50000, filename: 'empty.bin' });
Expand Down
5 changes: 2 additions & 3 deletions packages/core/test/lib/integrations/metadata.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { TextDecoder, TextEncoder } from 'util';
import type { Event } from '@sentry/types';
import { GLOBAL_OBJ, createStackParser, nodeStackLineParser, parseEnvelope } from '@sentry/utils';

Expand Down Expand Up @@ -37,8 +36,8 @@ describe('ModuleMetadata integration', () => {
return event;
},
transport: () =>
createTransport({ recordDroppedEvent: () => undefined, textEncoder: new TextEncoder() }, async req => {
const [, items] = parseEnvelope(req.body, new TextEncoder(), new TextDecoder());
createTransport({ recordDroppedEvent: () => undefined }, async req => {
const [, items] = parseEnvelope(req.body);

expect(items[0][1]).toBeDefined();
const event = items[0][1] as Event;
Expand Down
11 changes: 3 additions & 8 deletions packages/core/test/lib/transports/base.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { TextEncoder } from 'util';
import type { AttachmentItem, EventEnvelope, EventItem, TransportMakeRequestResponse } from '@sentry/types';
import type { PromiseBuffer } from '@sentry/utils';
import { createEnvelope, resolvedSyncPromise, serializeEnvelope } from '@sentry/utils';
Expand Down Expand Up @@ -32,7 +31,6 @@ const ATTACHMENT_ENVELOPE = createEnvelope<EventEnvelope>(

const transportOptions = {
recordDroppedEvent: () => undefined, // noop
textEncoder: new TextEncoder(),
};

describe('createTransport', () => {
Expand All @@ -55,7 +53,7 @@ describe('createTransport', () => {
it('constructs a request to send to Sentry', async () => {
expect.assertions(1);
const transport = createTransport(transportOptions, req => {
expect(req.body).toEqual(serializeEnvelope(ERROR_ENVELOPE, new TextEncoder()));
expect(req.body).toEqual(serializeEnvelope(ERROR_ENVELOPE));
return resolvedSyncPromise({});
});
await transport.send(ERROR_ENVELOPE);
Expand All @@ -65,7 +63,7 @@ describe('createTransport', () => {
expect.assertions(2);

const transport = createTransport(transportOptions, req => {
expect(req.body).toEqual(serializeEnvelope(ERROR_ENVELOPE, new TextEncoder()));
expect(req.body).toEqual(serializeEnvelope(ERROR_ENVELOPE));
throw new Error();
});

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

const mockRecordDroppedEventCallback = jest.fn();

const transport = createTransport(
{ recordDroppedEvent: mockRecordDroppedEventCallback, textEncoder: new TextEncoder() },
mockRequestExecutor,
);
const transport = createTransport({ recordDroppedEvent: mockRecordDroppedEventCallback }, mockRequestExecutor);

return [transport, setTransportResponse, mockRequestExecutor, mockRecordDroppedEventCallback] as const;
}
Expand Down
4 changes: 1 addition & 3 deletions packages/core/test/lib/transports/multiplexed.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { TextDecoder, TextEncoder } from 'util';
import type {
BaseTransportOptions,
ClientReport,
Expand Down Expand Up @@ -59,7 +58,7 @@ const createTestTransport = (...assertions: Assertion[]): ((options: BaseTranspo
throw new Error('No assertion left');
}

const event = eventFromEnvelope(parseEnvelope(request.body, new TextEncoder(), new TextDecoder()), ['event']);
const event = eventFromEnvelope(parseEnvelope(request.body), ['event']);

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

const transportOptions = {
recordDroppedEvent: () => undefined, // noop
textEncoder: new TextEncoder(),
};

describe('makeMultiplexedTransport', () => {
Expand Down
2 changes: 0 additions & 2 deletions packages/core/test/lib/transports/offline.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { TextEncoder } from 'util';
import type {
ClientReport,
Envelope,
Expand Down Expand Up @@ -76,7 +75,6 @@ const CLIENT_REPORT_ENVELOPE = createClientReportEnvelope(

const transportOptions = {
recordDroppedEvent: () => undefined, // noop
textEncoder: new TextEncoder(),
};

type MockResult<T> = T | Error;
Expand Down
3 changes: 0 additions & 3 deletions packages/core/test/mocks/client.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { TextEncoder } from 'util';
import type {
ClientOptions,
Event,
Expand All @@ -19,12 +18,10 @@ export function getDefaultTestClientOptions(options: Partial<TestClientOptions>
return {
integrations: [],
sendClientReports: true,
transportOptions: { textEncoder: new TextEncoder() },
transport: () =>
createTransport(
{
recordDroppedEvent: () => undefined,
textEncoder: new TextEncoder(),
}, // noop
_ => resolvedSyncPromise({}),
),
Expand Down
3 changes: 1 addition & 2 deletions packages/core/test/mocks/transport.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { TextEncoder } from 'util';
import type { Transport } from '@sentry/types';
import { SyncPromise } from '@sentry/utils';

Expand All @@ -17,7 +16,7 @@ export function makeFakeTransport(delay: number = 2000): {
let sendCalled = 0;
let sentCount = 0;
const makeTransport = () =>
createTransport({ recordDroppedEvent: () => undefined, textEncoder: new TextEncoder() }, () => {
createTransport({ recordDroppedEvent: () => undefined }, () => {
sendCalled++;
return new SyncPromise(async res => {
await sleep(delay);
Expand Down
2 changes: 1 addition & 1 deletion packages/deno/test/transport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export function makeTestTransport(callback: (envelope: sentryTypes.Envelope) =>
async function doCallback(
request: sentryTypes.TransportRequest,
): Promise<sentryTypes.TransportMakeRequestResponse> {
await callback(sentryUtils.parseEnvelope(request.body, new TextEncoder(), new TextDecoder()));
await callback(sentryUtils.parseEnvelope(request.body));

return Promise.resolve({
statusCode: 200,
Expand Down
Loading