From 4bb4ab46254d6c0d860e41285f732a8b6c34b720 Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Fri, 16 Feb 2024 16:21:22 -0400 Subject: [PATCH 1/6] feat(core): Use global `TextEncoder` and `TextDecoder` --- .../angular-17/event-proxy-server.ts | 2 +- .../nextjs-14/event-proxy-server.ts | 2 +- .../nextjs-app-dir/event-proxy-server.ts | 2 +- .../event-proxy-server.ts | 2 +- .../node-express-app/event-proxy-server.ts | 2 +- .../node-hapi-app/event-proxy-server.ts | 2 +- .../sveltekit-2/event-proxy-server.ts | 2 +- .../sveltekit/event-proxy-server.ts | 2 +- .../vue-3/event-proxy-server.ts | 2 +- .../node-integration-tests/utils/server.ts | 3 +- packages/browser/src/transports/offline.ts | 14 +------ .../test/unit/transports/fetch.test.ts | 6 +-- .../test/unit/transports/offline.test.ts | 3 -- .../browser/test/unit/transports/xhr.test.ts | 4 +- packages/core/src/baseclient.ts | 8 +--- packages/core/src/transports/base.ts | 2 +- packages/core/test/lib/attachments.test.ts | 5 +-- .../test/lib/integrations/metadata.test.ts | 5 +-- .../core/test/lib/transports/base.test.ts | 11 ++--- .../test/lib/transports/multiplexed.test.ts | 4 +- .../core/test/lib/transports/offline.test.ts | 2 - packages/core/test/mocks/client.ts | 2 - packages/core/test/mocks/transport.ts | 3 +- packages/deno/test/transport.ts | 2 +- packages/gatsby/test/integration.test.tsx | 1 - .../node-experimental/test/sdk/client.test.ts | 1 - packages/node/src/client.ts | 7 ---- .../manual/express-scope-separation/start.js | 3 +- .../aggregates-disable-single-session.js | 3 +- .../caught-exception-errored-session.js | 3 +- .../errors-in-session-capped-to-one.js | 3 +- .../single-session/healthy-session.js | 3 +- .../terminal-state-sessions-sent-once.js | 3 +- .../uncaught-exception-crashed-session.js | 3 +- .../unhandled-rejection-crashed-session.js | 3 +- .../manual/webpack-async-context/index.js | 3 +- packages/node/test/transports/http.test.ts | 22 ++++------ packages/node/test/transports/https.test.ts | 14 +++---- .../coreHandlers/handleNetworkBreadcrumbs.ts | 16 ++----- .../src/coreHandlers/util/fetchUtils.ts | 23 +++------- .../src/coreHandlers/util/networkUtils.ts | 8 ++-- .../replay/src/coreHandlers/util/xhrUtils.ts | 10 ++--- .../handleNetworkBreadcrumbs.test.ts | 4 -- .../unit/coreHandlers/util/fetchUtils.test.ts | 7 ---- .../coreHandlers/util/networkUtils.test.ts | 22 ++++------ packages/types/src/index.ts | 1 - packages/types/src/textencoder.ts | 16 ------- packages/types/src/transport.ts | 2 - packages/utils/src/envelope.ts | 42 ++++++++----------- packages/utils/test/clientreport.test.ts | 6 +-- packages/utils/test/envelope.test.ts | 18 ++++---- .../vercel-edge/test/transports/index.test.ts | 6 +-- 52 files changed, 102 insertions(+), 243 deletions(-) delete mode 100644 packages/types/src/textencoder.ts diff --git a/dev-packages/e2e-tests/test-applications/angular-17/event-proxy-server.ts b/dev-packages/e2e-tests/test-applications/angular-17/event-proxy-server.ts index 4c2df32399f0..2a4dc2b525d9 100644 --- a/dev-packages/e2e-tests/test-applications/angular-17/event-proxy-server.ts +++ b/dev-packages/e2e-tests/test-applications/angular-17/event-proxy-server.ts @@ -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, diff --git a/dev-packages/e2e-tests/test-applications/nextjs-14/event-proxy-server.ts b/dev-packages/e2e-tests/test-applications/nextjs-14/event-proxy-server.ts index 9dee679c71e4..d14ca5cb5e72 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-14/event-proxy-server.ts +++ b/dev-packages/e2e-tests/test-applications/nextjs-14/event-proxy-server.ts @@ -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, diff --git a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/event-proxy-server.ts b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/event-proxy-server.ts index 9dee679c71e4..d14ca5cb5e72 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/event-proxy-server.ts +++ b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/event-proxy-server.ts @@ -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, diff --git a/dev-packages/e2e-tests/test-applications/node-experimental-fastify-app/event-proxy-server.ts b/dev-packages/e2e-tests/test-applications/node-experimental-fastify-app/event-proxy-server.ts index 9dee679c71e4..d14ca5cb5e72 100644 --- a/dev-packages/e2e-tests/test-applications/node-experimental-fastify-app/event-proxy-server.ts +++ b/dev-packages/e2e-tests/test-applications/node-experimental-fastify-app/event-proxy-server.ts @@ -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, diff --git a/dev-packages/e2e-tests/test-applications/node-express-app/event-proxy-server.ts b/dev-packages/e2e-tests/test-applications/node-express-app/event-proxy-server.ts index 9dee679c71e4..d14ca5cb5e72 100644 --- a/dev-packages/e2e-tests/test-applications/node-express-app/event-proxy-server.ts +++ b/dev-packages/e2e-tests/test-applications/node-express-app/event-proxy-server.ts @@ -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, diff --git a/dev-packages/e2e-tests/test-applications/node-hapi-app/event-proxy-server.ts b/dev-packages/e2e-tests/test-applications/node-hapi-app/event-proxy-server.ts index 9dee679c71e4..d14ca5cb5e72 100644 --- a/dev-packages/e2e-tests/test-applications/node-hapi-app/event-proxy-server.ts +++ b/dev-packages/e2e-tests/test-applications/node-hapi-app/event-proxy-server.ts @@ -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, diff --git a/dev-packages/e2e-tests/test-applications/sveltekit-2/event-proxy-server.ts b/dev-packages/e2e-tests/test-applications/sveltekit-2/event-proxy-server.ts index 4c2df32399f0..2a4dc2b525d9 100644 --- a/dev-packages/e2e-tests/test-applications/sveltekit-2/event-proxy-server.ts +++ b/dev-packages/e2e-tests/test-applications/sveltekit-2/event-proxy-server.ts @@ -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, diff --git a/dev-packages/e2e-tests/test-applications/sveltekit/event-proxy-server.ts b/dev-packages/e2e-tests/test-applications/sveltekit/event-proxy-server.ts index 1bc419bd0b4c..11f00b4a2426 100644 --- a/dev-packages/e2e-tests/test-applications/sveltekit/event-proxy-server.ts +++ b/dev-packages/e2e-tests/test-applications/sveltekit/event-proxy-server.ts @@ -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, diff --git a/dev-packages/e2e-tests/test-applications/vue-3/event-proxy-server.ts b/dev-packages/e2e-tests/test-applications/vue-3/event-proxy-server.ts index 4c2df32399f0..2a4dc2b525d9 100644 --- a/dev-packages/e2e-tests/test-applications/vue-3/event-proxy-server.ts +++ b/dev-packages/e2e-tests/test-applications/vue-3/event-proxy-server.ts @@ -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, diff --git a/dev-packages/node-integration-tests/utils/server.ts b/dev-packages/node-integration-tests/utils/server.ts index 933d07d8741f..01af9558f0ab 100644 --- a/dev-packages/node-integration-tests/utils/server.ts +++ b/dev-packages/node-integration-tests/utils/server.ts @@ -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'; @@ -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 diff --git a/packages/browser/src/transports/offline.ts b/packages/browser/src/transports/offline.ts index 099e6ad462c1..dbccb8507c01 100644 --- a/packages/browser/src/transports/offline.ts +++ b/packages/browser/src/transports/offline.ts @@ -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 @@ -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 { @@ -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 (_) { // @@ -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 (_) { // diff --git a/packages/browser/test/unit/transports/fetch.test.ts b/packages/browser/test/unit/transports/fetch.test.ts index 01a063d19e2d..c80688eb11c3 100644 --- a/packages/browser/test/unit/transports/fetch.test.ts +++ b/packages/browser/test/unit/transports/fetch.test.ts @@ -1,4 +1,3 @@ -import { TextEncoder } from 'util'; import type { EventEnvelope, EventItem } from '@sentry/types'; import { createEnvelope, serializeEnvelope } from '@sentry/utils'; @@ -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({ event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2', sent_at: '123' }, [ @@ -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', @@ -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, }); diff --git a/packages/browser/test/unit/transports/offline.test.ts b/packages/browser/test/unit/transports/offline.test.ts index a4f91d40efff..5df5cf60122c 100644 --- a/packages/browser/test/unit/transports/offline.test.ts +++ b/packages/browser/test/unit/transports/offline.test.ts @@ -1,6 +1,5 @@ import 'fake-indexeddb/auto'; -import { TextDecoder, TextEncoder } from 'util'; import { createTransport } from '@sentry/core'; import type { EventEnvelope, @@ -27,8 +26,6 @@ const ERROR_ENVELOPE = createEnvelope({ event_id: 'aa3ff046696b4b const transportOptions = { recordDroppedEvent: () => undefined, // noop - textEncoder: new TextEncoder(), - textDecoder: new TextDecoder(), }; type MockResult = T | Error; diff --git a/packages/browser/test/unit/transports/xhr.test.ts b/packages/browser/test/unit/transports/xhr.test.ts index 9e5290d224c2..5f969a4f9205 100644 --- a/packages/browser/test/unit/transports/xhr.test.ts +++ b/packages/browser/test/unit/transports/xhr.test.ts @@ -1,4 +1,3 @@ -import { TextEncoder } from 'util'; import type { EventEnvelope, EventItem } from '@sentry/types'; import { createEnvelope, serializeEnvelope } from '@sentry/utils'; @@ -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({ event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2', sent_at: '123' }, [ @@ -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 () => { diff --git a/packages/core/src/baseclient.ts b/packages/core/src/baseclient.ts index fadd11958fc9..e04374c51135 100644 --- a/packages/core/src/baseclient.ts +++ b/packages/core/src/baseclient.ts @@ -386,13 +386,7 @@ export abstract class BaseClient implements Client { 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); diff --git a/packages/core/src/transports/base.ts b/packages/core/src/transports/base.ts index 68e4522267db..2121ea6751f7 100644 --- a/packages/core/src/transports/base.ts +++ b/packages/core/src/transports/base.ts @@ -75,7 +75,7 @@ export function createTransport( }; const requestTask = (): PromiseLike => - 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)) { diff --git a/packages/core/test/lib/attachments.test.ts b/packages/core/test/lib/attachments.test.ts index 31ca5d0f6eaa..4f43f86a6451 100644 --- a/packages/core/test/lib/attachments.test.ts +++ b/packages/core/test/lib/attachments.test.ts @@ -1,4 +1,3 @@ -import { TextDecoder, TextEncoder } from 'util'; import { parseEnvelope } from '@sentry/utils'; import { createTransport } from '../../src/transports/base'; @@ -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' }); diff --git a/packages/core/test/lib/integrations/metadata.test.ts b/packages/core/test/lib/integrations/metadata.test.ts index d81948a8e495..be5d5a8b955d 100644 --- a/packages/core/test/lib/integrations/metadata.test.ts +++ b/packages/core/test/lib/integrations/metadata.test.ts @@ -1,4 +1,3 @@ -import { TextDecoder, TextEncoder } from 'util'; import type { Event } from '@sentry/types'; import { GLOBAL_OBJ, createStackParser, nodeStackLineParser, parseEnvelope } from '@sentry/utils'; @@ -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; diff --git a/packages/core/test/lib/transports/base.test.ts b/packages/core/test/lib/transports/base.test.ts index 5e6b504d9f6e..01cc8bf59c9b 100644 --- a/packages/core/test/lib/transports/base.test.ts +++ b/packages/core/test/lib/transports/base.test.ts @@ -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'; @@ -32,7 +31,6 @@ const ATTACHMENT_ENVELOPE = createEnvelope( const transportOptions = { recordDroppedEvent: () => undefined, // noop - textEncoder: new TextEncoder(), }; describe('createTransport', () => { @@ -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); @@ -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(); }); @@ -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; } diff --git a/packages/core/test/lib/transports/multiplexed.test.ts b/packages/core/test/lib/transports/multiplexed.test.ts index 097b3428805b..c2d0d2f1d318 100644 --- a/packages/core/test/lib/transports/multiplexed.test.ts +++ b/packages/core/test/lib/transports/multiplexed.test.ts @@ -1,4 +1,3 @@ -import { TextDecoder, TextEncoder } from 'util'; import type { BaseTransportOptions, ClientReport, @@ -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 }); @@ -69,7 +68,6 @@ const createTestTransport = (...assertions: Assertion[]): ((options: BaseTranspo const transportOptions = { recordDroppedEvent: () => undefined, // noop - textEncoder: new TextEncoder(), }; describe('makeMultiplexedTransport', () => { diff --git a/packages/core/test/lib/transports/offline.test.ts b/packages/core/test/lib/transports/offline.test.ts index 172c890e8049..7e87115b9cdb 100644 --- a/packages/core/test/lib/transports/offline.test.ts +++ b/packages/core/test/lib/transports/offline.test.ts @@ -1,4 +1,3 @@ -import { TextEncoder } from 'util'; import type { ClientReport, Envelope, @@ -76,7 +75,6 @@ const CLIENT_REPORT_ENVELOPE = createClientReportEnvelope( const transportOptions = { recordDroppedEvent: () => undefined, // noop - textEncoder: new TextEncoder(), }; type MockResult = T | Error; diff --git a/packages/core/test/mocks/client.ts b/packages/core/test/mocks/client.ts index ad47a50fceb8..4e1a8c63a0ea 100644 --- a/packages/core/test/mocks/client.ts +++ b/packages/core/test/mocks/client.ts @@ -19,12 +19,10 @@ export function getDefaultTestClientOptions(options: Partial return { integrations: [], sendClientReports: true, - transportOptions: { textEncoder: new TextEncoder() }, transport: () => createTransport( { recordDroppedEvent: () => undefined, - textEncoder: new TextEncoder(), }, // noop _ => resolvedSyncPromise({}), ), diff --git a/packages/core/test/mocks/transport.ts b/packages/core/test/mocks/transport.ts index e2338327be16..cfb15f0abb7a 100644 --- a/packages/core/test/mocks/transport.ts +++ b/packages/core/test/mocks/transport.ts @@ -1,4 +1,3 @@ -import { TextEncoder } from 'util'; import type { Transport } from '@sentry/types'; import { SyncPromise } from '@sentry/utils'; @@ -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); diff --git a/packages/deno/test/transport.ts b/packages/deno/test/transport.ts index 47cb86622cb7..d18bd610c7dc 100644 --- a/packages/deno/test/transport.ts +++ b/packages/deno/test/transport.ts @@ -13,7 +13,7 @@ export function makeTestTransport(callback: (envelope: sentryTypes.Envelope) => async function doCallback( request: sentryTypes.TransportRequest, ): Promise { - await callback(sentryUtils.parseEnvelope(request.body, new TextEncoder(), new TextDecoder())); + await callback(sentryUtils.parseEnvelope(request.body)); return Promise.resolve({ statusCode: 200, diff --git a/packages/gatsby/test/integration.test.tsx b/packages/gatsby/test/integration.test.tsx index dbe10d9a3fbb..fa0058136f59 100644 --- a/packages/gatsby/test/integration.test.tsx +++ b/packages/gatsby/test/integration.test.tsx @@ -1,4 +1,3 @@ -import { TextDecoder, TextEncoder } from 'util'; /* eslint-disable @typescript-eslint/no-explicit-any */ import { render } from '@testing-library/react'; import { useEffect } from 'react'; diff --git a/packages/node-experimental/test/sdk/client.test.ts b/packages/node-experimental/test/sdk/client.test.ts index b7db215a4cd8..40fcb2cfce6c 100644 --- a/packages/node-experimental/test/sdk/client.test.ts +++ b/packages/node-experimental/test/sdk/client.test.ts @@ -25,7 +25,6 @@ describe('NodeExperimentalClient', () => { version: SDK_VERSION, }, }, - transportOptions: { textEncoder: expect.any(Object) }, platform: 'node', runtime: { name: 'node', version: expect.any(String) }, serverName: expect.any(String), diff --git a/packages/node/src/client.ts b/packages/node/src/client.ts index 8611f902ab0e..5fbb7b208724 100644 --- a/packages/node/src/client.ts +++ b/packages/node/src/client.ts @@ -1,5 +1,4 @@ import * as os from 'os'; -import { TextEncoder } from 'util'; import type { ServerRuntimeClientOptions } from '@sentry/core'; import { ServerRuntimeClient, applySdkMetadata } from '@sentry/core'; @@ -19,12 +18,6 @@ export class NodeClient extends ServerRuntimeClient { public constructor(options: NodeClientOptions) { applySdkMetadata(options, 'node'); - // Until node supports global TextEncoder in all versions we support, we are forced to pass it from util - options.transportOptions = { - textEncoder: new TextEncoder(), - ...options.transportOptions, - }; - const clientOptions: ServerRuntimeClientOptions = { ...options, platform: 'node', diff --git a/packages/node/test/manual/express-scope-separation/start.js b/packages/node/test/manual/express-scope-separation/start.js index cfe8df9d2427..c1981c0d0632 100644 --- a/packages/node/test/manual/express-scope-separation/start.js +++ b/packages/node/test/manual/express-scope-separation/start.js @@ -3,7 +3,6 @@ const express = require('express'); const app = express(); const Sentry = require('../../../build/cjs'); const { colorize } = require('../colorize'); -const { TextEncoder } = require('util'); // don't log the test errors we're going to throw, so at a quick glance it doesn't look like the test itself has failed global.console.error = () => null; @@ -20,7 +19,7 @@ function assertTags(actual, expected) { let remaining = 3; function makeDummyTransport() { - return Sentry.createTransport({ recordDroppedEvent: () => undefined, textEncoder: new TextEncoder() }, req => { + return Sentry.createTransport({ recordDroppedEvent: () => undefined }, req => { --remaining; if (!remaining) { diff --git a/packages/node/test/manual/release-health/session-aggregates/aggregates-disable-single-session.js b/packages/node/test/manual/release-health/session-aggregates/aggregates-disable-single-session.js index 8fe93e9760fd..c9b5f934bcff 100644 --- a/packages/node/test/manual/release-health/session-aggregates/aggregates-disable-single-session.js +++ b/packages/node/test/manual/release-health/session-aggregates/aggregates-disable-single-session.js @@ -3,7 +3,6 @@ const express = require('express'); const app = express(); const Sentry = require('../../../../build/cjs'); const { assertSessions } = require('../test-utils'); -const { TextEncoder } = require('util'); function cleanUpAndExitSuccessfully() { server.close(); @@ -32,7 +31,7 @@ function assertSessionAggregates(session, expected) { } function makeDummyTransport() { - return Sentry.createTransport({ recordDroppedEvent: () => undefined, textEncoder: new TextEncoder() }, req => { + return Sentry.createTransport({ recordDroppedEvent: () => undefined }, req => { const sessionEnv = req.body .split('\n') .filter(l => !!l) diff --git a/packages/node/test/manual/release-health/single-session/caught-exception-errored-session.js b/packages/node/test/manual/release-health/single-session/caught-exception-errored-session.js index 0cecc8ee75e4..b2c2b0c9d265 100644 --- a/packages/node/test/manual/release-health/single-session/caught-exception-errored-session.js +++ b/packages/node/test/manual/release-health/single-session/caught-exception-errored-session.js @@ -1,6 +1,5 @@ const Sentry = require('../../../../build/cjs'); const { assertSessions, constructStrippedSessionObject, validateSessionCountFunction } = require('../test-utils'); -const { TextEncoder } = require('util'); const sessionCounts = { sessionCounter: 0, @@ -10,7 +9,7 @@ const sessionCounts = { validateSessionCountFunction(sessionCounts); function makeDummyTransport() { - return Sentry.createTransport({ recordDroppedEvent: () => undefined, textEncoder: new TextEncoder() }, req => { + return Sentry.createTransport({ recordDroppedEvent: () => undefined }, req => { const payload = req.body .split('\n') .filter(l => !!l) diff --git a/packages/node/test/manual/release-health/single-session/errors-in-session-capped-to-one.js b/packages/node/test/manual/release-health/single-session/errors-in-session-capped-to-one.js index 18ec6fefdc78..b2eef0d2df72 100644 --- a/packages/node/test/manual/release-health/single-session/errors-in-session-capped-to-one.js +++ b/packages/node/test/manual/release-health/single-session/errors-in-session-capped-to-one.js @@ -1,6 +1,5 @@ const Sentry = require('../../../../build/cjs'); const { assertSessions, constructStrippedSessionObject, validateSessionCountFunction } = require('../test-utils'); -const { TextEncoder } = require('util'); const sessionCounts = { sessionCounter: 0, @@ -10,7 +9,7 @@ const sessionCounts = { validateSessionCountFunction(sessionCounts); function makeDummyTransport() { - return Sentry.createTransport({ recordDroppedEvent: () => undefined, textEncoder: new TextEncoder() }, req => { + return Sentry.createTransport({ recordDroppedEvent: () => undefined }, req => { const payload = req.body .split('\n') .filter(l => !!l) diff --git a/packages/node/test/manual/release-health/single-session/healthy-session.js b/packages/node/test/manual/release-health/single-session/healthy-session.js index 11c3092dfcad..49420b0f23b5 100644 --- a/packages/node/test/manual/release-health/single-session/healthy-session.js +++ b/packages/node/test/manual/release-health/single-session/healthy-session.js @@ -1,6 +1,5 @@ const Sentry = require('../../../../build/cjs'); const { assertSessions, constructStrippedSessionObject, validateSessionCountFunction } = require('../test-utils'); -const { TextEncoder } = require('util'); const sessionCounts = { sessionCounter: 0, @@ -10,7 +9,7 @@ const sessionCounts = { validateSessionCountFunction(sessionCounts); function makeDummyTransport() { - return Sentry.createTransport({ recordDroppedEvent: () => undefined, textEncoder: new TextEncoder() }, req => { + return Sentry.createTransport({ recordDroppedEvent: () => undefined }, req => { sessionCounts.sessionCounter++; const sessionEnv = req.body diff --git a/packages/node/test/manual/release-health/single-session/terminal-state-sessions-sent-once.js b/packages/node/test/manual/release-health/single-session/terminal-state-sessions-sent-once.js index 571af19d0f94..40f95736d4d4 100644 --- a/packages/node/test/manual/release-health/single-session/terminal-state-sessions-sent-once.js +++ b/packages/node/test/manual/release-health/single-session/terminal-state-sessions-sent-once.js @@ -1,6 +1,5 @@ const Sentry = require('../../../../build/cjs'); const { assertSessions, constructStrippedSessionObject, validateSessionCountFunction } = require('../test-utils'); -const { TextEncoder } = require('util'); const sessionCounts = { sessionCounter: 0, @@ -10,7 +9,7 @@ const sessionCounts = { validateSessionCountFunction(sessionCounts); function makeDummyTransport() { - return Sentry.createTransport({ recordDroppedEvent: () => undefined, textEncoder: new TextEncoder() }, req => { + return Sentry.createTransport({ recordDroppedEvent: () => undefined }, req => { const payload = req.body .split('\n') .filter(l => !!l) diff --git a/packages/node/test/manual/release-health/single-session/uncaught-exception-crashed-session.js b/packages/node/test/manual/release-health/single-session/uncaught-exception-crashed-session.js index 1759c1cc2d0f..1c111e0d4f31 100644 --- a/packages/node/test/manual/release-health/single-session/uncaught-exception-crashed-session.js +++ b/packages/node/test/manual/release-health/single-session/uncaught-exception-crashed-session.js @@ -1,9 +1,8 @@ const Sentry = require('../../../../build/cjs'); const { assertSessions, constructStrippedSessionObject } = require('../test-utils'); -const { TextEncoder } = require('util'); function makeDummyTransport() { - return Sentry.createTransport({ recordDroppedEvent: () => undefined, textEncoder: new TextEncoder() }, req => { + return Sentry.createTransport({ recordDroppedEvent: () => undefined }, req => { if (req.category === 'session') { sessionCounts.sessionCounter++; const sessionEnv = req.body diff --git a/packages/node/test/manual/release-health/single-session/unhandled-rejection-crashed-session.js b/packages/node/test/manual/release-health/single-session/unhandled-rejection-crashed-session.js index cc8cf921c5d0..d2c5e6cf11d3 100644 --- a/packages/node/test/manual/release-health/single-session/unhandled-rejection-crashed-session.js +++ b/packages/node/test/manual/release-health/single-session/unhandled-rejection-crashed-session.js @@ -1,6 +1,5 @@ const Sentry = require('../../../../build/cjs'); const { assertSessions, constructStrippedSessionObject, validateSessionCountFunction } = require('../test-utils'); -const { TextEncoder } = require('util'); const sessionCounts = { sessionCounter: 0, @@ -10,7 +9,7 @@ const sessionCounts = { validateSessionCountFunction(sessionCounts); function makeDummyTransport() { - return Sentry.createTransport({ recordDroppedEvent: () => undefined, textEncoder: new TextEncoder() }, req => { + return Sentry.createTransport({ recordDroppedEvent: () => undefined }, req => { const payload = req.body .split('\n') .filter(l => !!l) diff --git a/packages/node/test/manual/webpack-async-context/index.js b/packages/node/test/manual/webpack-async-context/index.js index 143ae07e56f8..445b277d79aa 100644 --- a/packages/node/test/manual/webpack-async-context/index.js +++ b/packages/node/test/manual/webpack-async-context/index.js @@ -1,11 +1,10 @@ const Sentry = require('../../../build/cjs'); const { colorize } = require('../colorize'); -const { TextEncoder } = require('util'); let remaining = 2; function makeDummyTransport() { - return Sentry.createTransport({ recordDroppedEvent: () => undefined, textEncoder: new TextEncoder() }, req => { + return Sentry.createTransport({ recordDroppedEvent: () => undefined }, req => { --remaining; if (!remaining) { diff --git a/packages/node/test/transports/http.test.ts b/packages/node/test/transports/http.test.ts index 9611e34102f4..3b3d969af5e7 100644 --- a/packages/node/test/transports/http.test.ts +++ b/packages/node/test/transports/http.test.ts @@ -1,5 +1,5 @@ import * as http from 'http'; -import { TextEncoder } from 'util'; + import { createGunzip } from 'zlib'; import { createTransport } from '@sentry/core'; import type { EventEnvelope, EventItem } from '@sentry/types'; @@ -7,8 +7,6 @@ import { addItemToEnvelope, createAttachmentEnvelopeItem, createEnvelope, serial import { makeNodeTransport } from '../../src/transports'; -const textEncoder = new TextEncoder(); - jest.mock('@sentry/core', () => { const actualCore = jest.requireActual('@sentry/core'); return { @@ -68,19 +66,15 @@ const EVENT_ENVELOPE = createEnvelope({ event_id: 'aa3ff046696b4b [{ type: 'event' }, { event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2' }] as EventItem, ]); -const SERIALIZED_EVENT_ENVELOPE = serializeEnvelope(EVENT_ENVELOPE, textEncoder); +const SERIALIZED_EVENT_ENVELOPE = serializeEnvelope(EVENT_ENVELOPE); -const ATTACHMENT_ITEM = createAttachmentEnvelopeItem( - { filename: 'empty-file.bin', data: new Uint8Array(50_000) }, - textEncoder, -); +const ATTACHMENT_ITEM = createAttachmentEnvelopeItem({ filename: 'empty-file.bin', data: new Uint8Array(50_000) }); const EVENT_ATTACHMENT_ENVELOPE = addItemToEnvelope(EVENT_ENVELOPE, ATTACHMENT_ITEM); -const SERIALIZED_EVENT_ATTACHMENT_ENVELOPE = serializeEnvelope(EVENT_ATTACHMENT_ENVELOPE, textEncoder) as Uint8Array; +const SERIALIZED_EVENT_ATTACHMENT_ENVELOPE = serializeEnvelope(EVENT_ATTACHMENT_ENVELOPE) as Uint8Array; const defaultOptions = { url: TEST_SERVER_URL, recordDroppedEvent: () => undefined, - textEncoder, }; // empty function to keep test output clean @@ -306,7 +300,7 @@ describe('makeNewHttpTransport()', () => { const registeredRequestExecutor = (createTransport as jest.Mock).mock.calls[0][1]; const executorResult = registeredRequestExecutor({ - body: serializeEnvelope(EVENT_ENVELOPE, textEncoder), + body: serializeEnvelope(EVENT_ENVELOPE), category: 'error', }); @@ -326,7 +320,7 @@ describe('makeNewHttpTransport()', () => { const registeredRequestExecutor = (createTransport as jest.Mock).mock.calls[0][1]; const executorResult = registeredRequestExecutor({ - body: serializeEnvelope(EVENT_ENVELOPE, textEncoder), + body: serializeEnvelope(EVENT_ENVELOPE), category: 'error', }); @@ -354,7 +348,7 @@ describe('makeNewHttpTransport()', () => { const registeredRequestExecutor = (createTransport as jest.Mock).mock.calls[0][1]; const executorResult = registeredRequestExecutor({ - body: serializeEnvelope(EVENT_ENVELOPE, textEncoder), + body: serializeEnvelope(EVENT_ENVELOPE), category: 'error', }); @@ -382,7 +376,7 @@ describe('makeNewHttpTransport()', () => { const registeredRequestExecutor = (createTransport as jest.Mock).mock.calls[0][1]; const executorResult = registeredRequestExecutor({ - body: serializeEnvelope(EVENT_ENVELOPE, textEncoder), + body: serializeEnvelope(EVENT_ENVELOPE), category: 'error', }); diff --git a/packages/node/test/transports/https.test.ts b/packages/node/test/transports/https.test.ts index d26a65ddb5c8..58e3cb6c7faa 100644 --- a/packages/node/test/transports/https.test.ts +++ b/packages/node/test/transports/https.test.ts @@ -1,6 +1,5 @@ import * as http from 'http'; import * as https from 'https'; -import { TextEncoder } from 'util'; import { createTransport } from '@sentry/core'; import type { EventEnvelope, EventItem } from '@sentry/types'; import { createEnvelope, serializeEnvelope } from '@sentry/utils'; @@ -9,8 +8,6 @@ import { makeNodeTransport } from '../../src/transports'; import type { HTTPModule, HTTPModuleRequestIncomingMessage } from '../../src/transports/http-module'; import testServerCerts from './test-server-certs'; -const textEncoder = new TextEncoder(); - jest.mock('@sentry/core', () => { const actualCore = jest.requireActual('@sentry/core'); return { @@ -68,7 +65,7 @@ const EVENT_ENVELOPE = createEnvelope({ event_id: 'aa3ff046696b4b [{ type: 'event' }, { event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2' }] as EventItem, ]); -const SERIALIZED_EVENT_ENVELOPE = serializeEnvelope(EVENT_ENVELOPE, textEncoder); +const SERIALIZED_EVENT_ENVELOPE = serializeEnvelope(EVENT_ENVELOPE); const unsafeHttpsModule: HTTPModule = { request: jest @@ -82,7 +79,6 @@ const defaultOptions = { httpModule: unsafeHttpsModule, url: TEST_SERVER_URL, recordDroppedEvent: () => undefined, // noop - textEncoder, }; describe('makeNewHttpsTransport()', () => { @@ -295,7 +291,7 @@ describe('makeNewHttpsTransport()', () => { const registeredRequestExecutor = (createTransport as jest.Mock).mock.calls[0][1]; const executorResult = registeredRequestExecutor({ - body: serializeEnvelope(EVENT_ENVELOPE, textEncoder), + body: serializeEnvelope(EVENT_ENVELOPE), category: 'error', }); @@ -315,7 +311,7 @@ describe('makeNewHttpsTransport()', () => { const registeredRequestExecutor = (createTransport as jest.Mock).mock.calls[0][1]; const executorResult = registeredRequestExecutor({ - body: serializeEnvelope(EVENT_ENVELOPE, textEncoder), + body: serializeEnvelope(EVENT_ENVELOPE), category: 'error', }); @@ -343,7 +339,7 @@ describe('makeNewHttpsTransport()', () => { const registeredRequestExecutor = (createTransport as jest.Mock).mock.calls[0][1]; const executorResult = registeredRequestExecutor({ - body: serializeEnvelope(EVENT_ENVELOPE, textEncoder), + body: serializeEnvelope(EVENT_ENVELOPE), category: 'error', }); @@ -371,7 +367,7 @@ describe('makeNewHttpsTransport()', () => { const registeredRequestExecutor = (createTransport as jest.Mock).mock.calls[0][1]; const executorResult = registeredRequestExecutor({ - body: serializeEnvelope(EVENT_ENVELOPE, textEncoder), + body: serializeEnvelope(EVENT_ENVELOPE), category: 'error', }); diff --git a/packages/replay/src/coreHandlers/handleNetworkBreadcrumbs.ts b/packages/replay/src/coreHandlers/handleNetworkBreadcrumbs.ts index 4acafd5ca207..a31fc046b17a 100644 --- a/packages/replay/src/coreHandlers/handleNetworkBreadcrumbs.ts +++ b/packages/replay/src/coreHandlers/handleNetworkBreadcrumbs.ts @@ -1,11 +1,5 @@ import { getClient } from '@sentry/core'; -import type { - Breadcrumb, - BreadcrumbHint, - FetchBreadcrumbData, - TextEncoderInternal, - XhrBreadcrumbData, -} from '@sentry/types'; +import type { Breadcrumb, BreadcrumbHint, FetchBreadcrumbData, XhrBreadcrumbData } from '@sentry/types'; import { logger } from '@sentry/utils'; import { DEBUG_BUILD } from '../debug-build'; @@ -15,7 +9,6 @@ import { captureXhrBreadcrumbToReplay, enrichXhrBreadcrumb } from './util/xhrUti interface ExtendedNetworkBreadcrumbsOptions extends ReplayNetworkOptions { replay: ReplayContainer; - textEncoder: TextEncoderInternal; } /** @@ -28,8 +21,6 @@ export function handleNetworkBreadcrumbs(replay: ReplayContainer): void { const client = getClient(); try { - const textEncoder = new TextEncoder(); - const { networkDetailAllowUrls, networkDetailDenyUrls, @@ -40,7 +31,6 @@ export function handleNetworkBreadcrumbs(replay: ReplayContainer): void { const options: ExtendedNetworkBreadcrumbsOptions = { replay, - textEncoder, networkDetailAllowUrls, networkDetailDenyUrls, networkCaptureBodies, @@ -71,7 +61,7 @@ export function beforeAddNetworkBreadcrumb( // This has to be sync, as we need to ensure the breadcrumb is enriched in the same tick // Because the hook runs synchronously, and the breadcrumb is afterwards passed on // So any async mutations to it will not be reflected in the final breadcrumb - enrichXhrBreadcrumb(breadcrumb, hint, options); + enrichXhrBreadcrumb(breadcrumb, hint); // This call should not reject // eslint-disable-next-line @typescript-eslint/no-floating-promises @@ -82,7 +72,7 @@ export function beforeAddNetworkBreadcrumb( // This has to be sync, as we need to ensure the breadcrumb is enriched in the same tick // Because the hook runs synchronously, and the breadcrumb is afterwards passed on // So any async mutations to it will not be reflected in the final breadcrumb - enrichFetchBreadcrumb(breadcrumb, hint, options); + enrichFetchBreadcrumb(breadcrumb, hint); // This call should not reject // eslint-disable-next-line @typescript-eslint/no-floating-promises diff --git a/packages/replay/src/coreHandlers/util/fetchUtils.ts b/packages/replay/src/coreHandlers/util/fetchUtils.ts index 5b569b659f9d..399206ad659a 100644 --- a/packages/replay/src/coreHandlers/util/fetchUtils.ts +++ b/packages/replay/src/coreHandlers/util/fetchUtils.ts @@ -1,4 +1,4 @@ -import type { Breadcrumb, FetchBreadcrumbData, TextEncoderInternal } from '@sentry/types'; +import type { Breadcrumb, FetchBreadcrumbData } from '@sentry/types'; import { logger } from '@sentry/utils'; import { DEBUG_BUILD } from '../../debug-build'; @@ -31,7 +31,6 @@ export async function captureFetchBreadcrumbToReplay( breadcrumb: Breadcrumb & { data: FetchBreadcrumbData }, hint: Partial, options: ReplayNetworkOptions & { - textEncoder: TextEncoderInternal; replay: ReplayContainer; }, ): Promise { @@ -54,12 +53,11 @@ export async function captureFetchBreadcrumbToReplay( export function enrichFetchBreadcrumb( breadcrumb: Breadcrumb & { data: FetchBreadcrumbData }, hint: Partial, - options: { textEncoder: TextEncoderInternal }, ): void { const { input, response } = hint; const body = input ? _getFetchRequestArgBody(input) : undefined; - const reqSize = getBodySize(body, options.textEncoder); + const reqSize = getBodySize(body); const resSize = response ? parseContentLengthHeader(response.headers.get('content-length')) : undefined; @@ -74,9 +72,7 @@ export function enrichFetchBreadcrumb( async function _prepareFetchData( breadcrumb: Breadcrumb & { data: FetchBreadcrumbData }, hint: Partial, - options: ReplayNetworkOptions & { - textEncoder: TextEncoderInternal; - }, + options: ReplayNetworkOptions, ): Promise { const now = Date.now(); const { startTimestamp = now, endTimestamp = now } = hint; @@ -136,11 +132,8 @@ export async function _getResponseInfo( captureDetails: boolean, { networkCaptureBodies, - textEncoder, networkResponseHeaders, - }: Pick & { - textEncoder: TextEncoderInternal; - }, + }: Pick, response: Response | undefined, responseBodySize?: number, ): Promise { @@ -157,7 +150,7 @@ export async function _getResponseInfo( const [bodyText, warning] = await _parseFetchResponseBody(response); const result = getResponseData(bodyText, { networkCaptureBodies, - textEncoder, + responseBodySize, captureDetails, headers, @@ -174,7 +167,6 @@ function getResponseData( bodyText: string | undefined, { networkCaptureBodies, - textEncoder, responseBodySize, captureDetails, headers, @@ -183,14 +175,11 @@ function getResponseData( networkCaptureBodies: boolean; responseBodySize: number | undefined; headers: Record; - textEncoder: TextEncoderInternal; }, ): ReplayNetworkRequestOrResponse | undefined { try { const size = - bodyText && bodyText.length && responseBodySize === undefined - ? getBodySize(bodyText, textEncoder) - : responseBodySize; + bodyText && bodyText.length && responseBodySize === undefined ? getBodySize(bodyText) : responseBodySize; if (!captureDetails) { return buildSkippedNetworkRequestOrResponse(size); diff --git a/packages/replay/src/coreHandlers/util/networkUtils.ts b/packages/replay/src/coreHandlers/util/networkUtils.ts index 29d9684456ca..b6ae6ff5b13e 100644 --- a/packages/replay/src/coreHandlers/util/networkUtils.ts +++ b/packages/replay/src/coreHandlers/util/networkUtils.ts @@ -1,4 +1,3 @@ -import type { TextEncoderInternal } from '@sentry/types'; import { dropUndefinedKeys, logger, stringMatchesSomePattern } from '@sentry/utils'; import { NETWORK_BODY_MAX_SIZE, WINDOW } from '../../constants'; @@ -13,14 +12,13 @@ import type { } from '../../types'; /** Get the size of a body. */ -export function getBodySize( - body: RequestInit['body'], - textEncoder: TextEncoder | TextEncoderInternal, -): number | undefined { +export function getBodySize(body: RequestInit['body']): number | undefined { if (!body) { return undefined; } + const textEncoder = new TextEncoder(); + try { if (typeof body === 'string') { return textEncoder.encode(body).length; diff --git a/packages/replay/src/coreHandlers/util/xhrUtils.ts b/packages/replay/src/coreHandlers/util/xhrUtils.ts index b422d3bd1e81..4ce349f1bb2e 100644 --- a/packages/replay/src/coreHandlers/util/xhrUtils.ts +++ b/packages/replay/src/coreHandlers/util/xhrUtils.ts @@ -1,4 +1,4 @@ -import type { Breadcrumb, TextEncoderInternal, XhrBreadcrumbData } from '@sentry/types'; +import type { Breadcrumb, XhrBreadcrumbData } from '@sentry/types'; import { SENTRY_XHR_DATA_KEY, logger } from '@sentry/utils'; import { DEBUG_BUILD } from '../../debug-build'; @@ -50,7 +50,6 @@ export async function captureXhrBreadcrumbToReplay( export function enrichXhrBreadcrumb( breadcrumb: Breadcrumb & { data: XhrBreadcrumbData }, hint: Partial, - options: { textEncoder: TextEncoderInternal }, ): void { const { xhr, input } = hint; @@ -58,10 +57,10 @@ export function enrichXhrBreadcrumb( return; } - const reqSize = getBodySize(input, options.textEncoder); + const reqSize = getBodySize(input); const resSize = xhr.getResponseHeader('content-length') ? parseContentLengthHeader(xhr.getResponseHeader('content-length')) - : _getBodySize(xhr.response, xhr.responseType, options.textEncoder); + : _getBodySize(xhr.response, xhr.responseType); if (reqSize !== undefined) { breadcrumb.data.request_body_size = reqSize; @@ -208,11 +207,10 @@ export function _parseXhrResponse( function _getBodySize( body: XMLHttpRequest['response'], responseType: XMLHttpRequest['responseType'], - textEncoder: TextEncoder | TextEncoderInternal, ): number | undefined { try { const bodyStr = responseType === 'json' && body && typeof body === 'object' ? JSON.stringify(body) : body; - return getBodySize(bodyStr, textEncoder); + return getBodySize(bodyStr); } catch { return undefined; } diff --git a/packages/replay/test/unit/coreHandlers/handleNetworkBreadcrumbs.test.ts b/packages/replay/test/unit/coreHandlers/handleNetworkBreadcrumbs.test.ts index 00a8ffdf8829..de16549d081e 100644 --- a/packages/replay/test/unit/coreHandlers/handleNetworkBreadcrumbs.test.ts +++ b/packages/replay/test/unit/coreHandlers/handleNetworkBreadcrumbs.test.ts @@ -1,10 +1,8 @@ -import { TextEncoder } from 'util'; import type { Breadcrumb, BreadcrumbHint, FetchBreadcrumbHint, SentryWrappedXMLHttpRequest, - TextEncoderInternal, XhrBreadcrumbHint, } from '@sentry/types'; import { SENTRY_XHR_DATA_KEY } from '@sentry/utils'; @@ -55,14 +53,12 @@ describe('Unit | coreHandlers | handleNetworkBreadcrumbs', () => { describe('beforeAddNetworkBreadcrumb()', () => { let options: ReplayNetworkOptions & { replay: ReplayContainer; - textEncoder: TextEncoderInternal; }; beforeEach(() => { jest.setSystemTime(BASE_TIMESTAMP); options = { - textEncoder: new TextEncoder(), replay: setupReplayContainer(), networkDetailAllowUrls: ['https://example.com'], networkDetailDenyUrls: ['http://localhost:8080'], diff --git a/packages/replay/test/unit/coreHandlers/util/fetchUtils.test.ts b/packages/replay/test/unit/coreHandlers/util/fetchUtils.test.ts index 123ec85fe887..6d78a2583774 100644 --- a/packages/replay/test/unit/coreHandlers/util/fetchUtils.test.ts +++ b/packages/replay/test/unit/coreHandlers/util/fetchUtils.test.ts @@ -1,5 +1,3 @@ -import { TextEncoder } from 'util'; - import { _getResponseInfo } from '../../../../src/coreHandlers/util/fetchUtils'; describe('Unit | coreHandlers | util | fetchUtils', () => { @@ -9,7 +7,6 @@ describe('Unit | coreHandlers | util | fetchUtils', () => { false, { networkCaptureBodies: true, - textEncoder: new TextEncoder(), networkResponseHeaders: [], }, undefined, @@ -24,7 +21,6 @@ describe('Unit | coreHandlers | util | fetchUtils', () => { false, { networkCaptureBodies: true, - textEncoder: new TextEncoder(), networkResponseHeaders: [], }, undefined, @@ -58,7 +54,6 @@ describe('Unit | coreHandlers | util | fetchUtils', () => { true, { networkCaptureBodies: true, - textEncoder: new TextEncoder(), networkResponseHeaders: [], }, response, @@ -90,7 +85,6 @@ describe('Unit | coreHandlers | util | fetchUtils', () => { true, { networkCaptureBodies: true, - textEncoder: new TextEncoder(), networkResponseHeaders: [], }, response, @@ -122,7 +116,6 @@ describe('Unit | coreHandlers | util | fetchUtils', () => { true, { networkCaptureBodies: true, - textEncoder: new TextEncoder(), networkResponseHeaders: [], }, response, diff --git a/packages/replay/test/unit/coreHandlers/util/networkUtils.test.ts b/packages/replay/test/unit/coreHandlers/util/networkUtils.test.ts index fccbf24a0a23..8f240c8ea7a7 100644 --- a/packages/replay/test/unit/coreHandlers/util/networkUtils.test.ts +++ b/packages/replay/test/unit/coreHandlers/util/networkUtils.test.ts @@ -1,5 +1,3 @@ -import { TextEncoder } from 'util'; - import { NETWORK_BODY_MAX_SIZE } from '../../../../src/constants'; import { buildNetworkRequestOrResponse, @@ -25,18 +23,16 @@ describe('Unit | coreHandlers | util | networkUtils', () => { }); describe('getBodySize()', () => { - const textEncoder = new TextEncoder(); - it('works with empty body', () => { - expect(getBodySize(undefined, textEncoder)).toBe(undefined); - expect(getBodySize(null, textEncoder)).toBe(undefined); - expect(getBodySize('', textEncoder)).toBe(undefined); + expect(getBodySize(undefined)).toBe(undefined); + expect(getBodySize(null)).toBe(undefined); + expect(getBodySize('')).toBe(undefined); }); it('works with string body', () => { - expect(getBodySize('abcd', textEncoder)).toBe(4); + expect(getBodySize('abcd')).toBe(4); // Emojis are correctly counted as mutliple characters - expect(getBodySize('With emoji: 😈', textEncoder)).toBe(16); + expect(getBodySize('With emoji: 😈')).toBe(16); }); it('works with URLSearchParams', () => { @@ -45,7 +41,7 @@ describe('Unit | coreHandlers | util | networkUtils', () => { params.append('age', '42'); params.append('emoji', '😈'); - expect(getBodySize(params, textEncoder)).toBe(35); + expect(getBodySize(params)).toBe(35); }); it('works with FormData', () => { @@ -54,19 +50,19 @@ describe('Unit | coreHandlers | util | networkUtils', () => { formData.append('age', '42'); formData.append('emoji', '😈'); - expect(getBodySize(formData, textEncoder)).toBe(35); + expect(getBodySize(formData)).toBe(35); }); it('works with Blob', () => { const blob = new Blob(['Hello world: 😈'], { type: 'text/html' }); - expect(getBodySize(blob, textEncoder)).toBe(30); + expect(getBodySize(blob)).toBe(30); }); it('works with ArrayBuffer', () => { const arrayBuffer = new ArrayBuffer(8); - expect(getBodySize(arrayBuffer, textEncoder)).toBe(8); + expect(getBodySize(arrayBuffer)).toBe(8); }); }); diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index abdf076cf033..6a5f14d7b03c 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -102,7 +102,6 @@ export type { } from './span'; export type { StackFrame } from './stackframe'; export type { Stacktrace, StackParser, StackLineParser, StackLineParserFn } from './stacktrace'; -export type { TextEncoderInternal } from './textencoder'; export type { PropagationContext, TracePropagationTargets } from './tracing'; export type { StartSpanOptions } from './startSpanOptions'; export type { diff --git a/packages/types/src/textencoder.ts b/packages/types/src/textencoder.ts deleted file mode 100644 index 9071c14c007c..000000000000 --- a/packages/types/src/textencoder.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Vendored type from TS 3.8 `typescript/lib/lib.dom.d.ts`. - * - * Type is vendored in so that users don't have to opt-in to DOM types. - */ -export interface TextEncoderCommon { - /** - * Returns "utf-8". - */ - readonly encoding: string; -} - -// Combination of global TextEncoder and Node require('util').TextEncoder -export interface TextEncoderInternal extends TextEncoderCommon { - encode(input?: string): Uint8Array; -} diff --git a/packages/types/src/transport.ts b/packages/types/src/transport.ts index 05638b67228e..6866f8d19032 100644 --- a/packages/types/src/transport.ts +++ b/packages/types/src/transport.ts @@ -1,6 +1,5 @@ import type { Client } from './client'; import type { Envelope } from './envelope'; -import type { TextEncoderInternal } from './textencoder'; export type TransportRequest = { body: string | Uint8Array; @@ -18,7 +17,6 @@ export type TransportMakeRequestResponse = { export interface InternalBaseTransportOptions { bufferSize?: number; recordDroppedEvent: Client['recordDroppedEvent']; - textEncoder?: TextEncoderInternal; } export interface BaseTransportOptions extends InternalBaseTransportOptions { diff --git a/packages/utils/src/envelope.ts b/packages/utils/src/envelope.ts index c716ab282dfe..6d08ab3e32fa 100644 --- a/packages/utils/src/envelope.ts +++ b/packages/utils/src/envelope.ts @@ -11,7 +11,6 @@ import type { EventEnvelopeHeaders, SdkInfo, SdkMetadata, - TextEncoderInternal, } from '@sentry/types'; import { dsnToString } from './dsn'; @@ -69,17 +68,23 @@ export function envelopeContainsItemType(envelope: Envelope, types: EnvelopeItem } /** - * Encode a string to UTF8. + * Encode a string to UTF8 array. */ -function encodeUTF8(input: string, textEncoder?: TextEncoderInternal): Uint8Array { - const utf8 = textEncoder || new TextEncoder(); - return utf8.encode(input); +function encodeUTF8(input: string): Uint8Array { + return new TextEncoder().encode(input); +} + +/** + * Decode a UTF8 array to string. + */ +function decodeUTF8(input: Uint8Array): string { + return new TextDecoder().decode(input); } /** * Serializes an envelope. */ -export function serializeEnvelope(envelope: Envelope, textEncoder?: TextEncoderInternal): string | Uint8Array { +export function serializeEnvelope(envelope: Envelope): string | Uint8Array { const [envHeaders, items] = envelope; // Initially we construct our envelope as a string and only convert to binary chunks if we encounter binary data @@ -87,9 +92,9 @@ export function serializeEnvelope(envelope: Envelope, textEncoder?: TextEncoderI function append(next: string | Uint8Array): void { if (typeof parts === 'string') { - parts = typeof next === 'string' ? parts + next : [encodeUTF8(parts, textEncoder), next]; + parts = typeof next === 'string' ? parts + next : [encodeUTF8(parts), next]; } else { - parts.push(typeof next === 'string' ? encodeUTF8(next, textEncoder) : next); + parts.push(typeof next === 'string' ? encodeUTF8(next) : next); } } @@ -130,19 +135,11 @@ function concatBuffers(buffers: Uint8Array[]): Uint8Array { return merged; } -export interface TextDecoderInternal { - decode(input?: Uint8Array): string; -} - /** * Parses an envelope */ -export function parseEnvelope( - env: string | Uint8Array, - textEncoder: TextEncoderInternal, - textDecoder: TextDecoderInternal, -): Envelope { - let buffer = typeof env === 'string' ? textEncoder.encode(env) : env; +export function parseEnvelope(env: string | Uint8Array): Envelope { + let buffer = typeof env === 'string' ? encodeUTF8(env) : env; function readBinary(length: number): Uint8Array { const bin = buffer.subarray(0, length); @@ -158,7 +155,7 @@ export function parseEnvelope( i = buffer.length; } - return JSON.parse(textDecoder.decode(readBinary(i))) as T; + return JSON.parse(decodeUTF8(readBinary(i))) as T; } const envelopeHeader = readJson(); @@ -178,11 +175,8 @@ export function parseEnvelope( /** * Creates attachment envelope items */ -export function createAttachmentEnvelopeItem( - attachment: Attachment, - textEncoder?: TextEncoderInternal, -): AttachmentItem { - const buffer = typeof attachment.data === 'string' ? encodeUTF8(attachment.data, textEncoder) : attachment.data; +export function createAttachmentEnvelopeItem(attachment: Attachment): AttachmentItem { + const buffer = typeof attachment.data === 'string' ? encodeUTF8(attachment.data) : attachment.data; return [ dropUndefinedKeys({ diff --git a/packages/utils/test/clientreport.test.ts b/packages/utils/test/clientreport.test.ts index 05c30a9cf3ea..d54ec311d839 100644 --- a/packages/utils/test/clientreport.test.ts +++ b/packages/utils/test/clientreport.test.ts @@ -1,12 +1,8 @@ -import { TextDecoder, TextEncoder } from 'util'; import type { ClientReport } from '@sentry/types'; import { createClientReportEnvelope } from '../src/clientreport'; import { parseEnvelope, serializeEnvelope } from '../src/envelope'; -const encoder = new TextEncoder(); -const decoder = new TextDecoder(); - const DEFAULT_DISCARDED_EVENTS: ClientReport['discarded_events'] = [ { reason: 'before_send', @@ -46,7 +42,7 @@ describe('createClientReportEnvelope', () => { it('serializes an envelope', () => { const env = createClientReportEnvelope(DEFAULT_DISCARDED_EVENTS, MOCK_DSN, 123456); - const [headers, items] = parseEnvelope(serializeEnvelope(env, encoder), encoder, decoder); + const [headers, items] = parseEnvelope(serializeEnvelope(env)); expect(headers).toEqual({ dsn: 'https://public@example.com/1' }); expect(items).toEqual([ diff --git a/packages/utils/test/envelope.test.ts b/packages/utils/test/envelope.test.ts index 12cc501a96be..8c4d1eccc9ac 100644 --- a/packages/utils/test/envelope.test.ts +++ b/packages/utils/test/envelope.test.ts @@ -1,9 +1,5 @@ -import { TextDecoder, TextEncoder } from 'util'; import type { Event, EventEnvelope } from '@sentry/types'; -const encoder = new TextEncoder(); -const decoder = new TextDecoder(); - import { addItemToEnvelope, createEnvelope, @@ -29,10 +25,10 @@ describe('envelope', () => { describe('serializeEnvelope and parseEnvelope', () => { it('serializes an envelope', () => { const env = createEnvelope({ event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2', sent_at: '123' }, []); - const serializedEnvelope = serializeEnvelope(env, encoder); + const serializedEnvelope = serializeEnvelope(env); expect(typeof serializedEnvelope).toBe('string'); - const [headers] = parseEnvelope(serializedEnvelope, encoder, decoder); + const [headers] = parseEnvelope(serializedEnvelope); expect(headers).toEqual({ event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2', sent_at: '123' }); }); @@ -50,10 +46,10 @@ describe('envelope', () => { expect.assertions(6); - const serializedEnvelope = serializeEnvelope(env, encoder); + const serializedEnvelope = serializeEnvelope(env); expect(serializedEnvelope).toBeInstanceOf(Uint8Array); - const [parsedHeaders, parsedItems] = parseEnvelope(serializedEnvelope, encoder, decoder); + const [parsedHeaders, parsedItems] = parseEnvelope(serializedEnvelope); expect(parsedHeaders).toEqual({ event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2', sent_at: '123' }); expect(parsedItems).toHaveLength(3); expect(items[0]).toEqual([{ type: 'event' }, { event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2' }]); @@ -76,7 +72,7 @@ describe('envelope', () => { [{ type: 'event' }, egg], ]); - const serializedEnvelope = serializeEnvelope(env, encoder); + const serializedEnvelope = serializeEnvelope(env); const [, , serializedBody] = serializedEnvelope.toString().split('\n'); expect(serializedBody).toBe('{"chicken":{"egg":"[Circular ~]"}}'); @@ -86,7 +82,7 @@ describe('envelope', () => { describe('addItemToEnvelope()', () => { it('adds an item to an envelope', () => { const env = createEnvelope({ event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2', sent_at: '123' }, []); - let [envHeaders, items] = parseEnvelope(serializeEnvelope(env, encoder), encoder, decoder); + let [envHeaders, items] = parseEnvelope(serializeEnvelope(env)); expect(items).toHaveLength(0); expect(envHeaders).toEqual({ event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2', sent_at: '123' }); @@ -95,7 +91,7 @@ describe('envelope', () => { { event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2' }, ]); - [envHeaders, items] = parseEnvelope(serializeEnvelope(newEnv, encoder), encoder, decoder); + [envHeaders, items] = parseEnvelope(serializeEnvelope(newEnv)); expect(envHeaders).toEqual({ event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2', sent_at: '123' }); expect(items).toHaveLength(1); expect(items[0]).toEqual([{ type: 'event' }, { event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2' }]); diff --git a/packages/vercel-edge/test/transports/index.test.ts b/packages/vercel-edge/test/transports/index.test.ts index f2304f5b1fc2..74f5d1794ff8 100644 --- a/packages/vercel-edge/test/transports/index.test.ts +++ b/packages/vercel-edge/test/transports/index.test.ts @@ -1,4 +1,3 @@ -import { TextEncoder } from 'util'; import type { EventEnvelope, EventItem } from '@sentry/types'; import { createEnvelope, serializeEnvelope } from '@sentry/utils'; @@ -8,7 +7,6 @@ import { IsolatedPromiseBuffer, makeEdgeTransport } from '../../src/transports'; const DEFAULT_EDGE_TRANSPORT_OPTIONS: VercelEdgeTransportOptions = { url: 'https://sentry.io/api/42/store/?sentry_key=123&sentry_version=7', recordDroppedEvent: () => undefined, - textEncoder: new TextEncoder(), }; const ERROR_ENVELOPE = createEnvelope({ event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2', sent_at: '123' }, [ @@ -55,7 +53,7 @@ describe('Edge Transport', () => { expect(mockFetch).toHaveBeenCalledTimes(1); expect(mockFetch).toHaveBeenLastCalledWith(DEFAULT_EDGE_TRANSPORT_OPTIONS.url, { - body: serializeEnvelope(ERROR_ENVELOPE, new TextEncoder()), + body: serializeEnvelope(ERROR_ENVELOPE), method: 'POST', }); }); @@ -104,7 +102,7 @@ describe('Edge Transport', () => { await transport.send(ERROR_ENVELOPE); await transport.flush(); expect(mockFetch).toHaveBeenLastCalledWith(DEFAULT_EDGE_TRANSPORT_OPTIONS.url, { - body: serializeEnvelope(ERROR_ENVELOPE, new TextEncoder()), + body: serializeEnvelope(ERROR_ENVELOPE), method: 'POST', ...REQUEST_OPTIONS, }); From 8a62fcaf301bb7ef6a388a07498ef444c4f2775b Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Fri, 16 Feb 2024 16:26:08 -0400 Subject: [PATCH 2/6] lint --- packages/core/test/mocks/client.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/core/test/mocks/client.ts b/packages/core/test/mocks/client.ts index 4e1a8c63a0ea..59a792cf4723 100644 --- a/packages/core/test/mocks/client.ts +++ b/packages/core/test/mocks/client.ts @@ -1,4 +1,3 @@ -import { TextEncoder } from 'util'; import type { ClientOptions, Event, From 22909c5ad14ae64e48509f7ee3a22cd3b57be910 Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Sat, 17 Feb 2024 11:11:18 -0400 Subject: [PATCH 3/6] Fix gatsby test --- packages/gatsby/test/integration.test.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/gatsby/test/integration.test.tsx b/packages/gatsby/test/integration.test.tsx index fa0058136f59..dbe10d9a3fbb 100644 --- a/packages/gatsby/test/integration.test.tsx +++ b/packages/gatsby/test/integration.test.tsx @@ -1,3 +1,4 @@ +import { TextDecoder, TextEncoder } from 'util'; /* eslint-disable @typescript-eslint/no-explicit-any */ import { render } from '@testing-library/react'; import { useEffect } from 'react'; From cc66aa43fb16bb7b43f7123ebfe4ec665e4e90b3 Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Sat, 17 Feb 2024 11:45:42 -0400 Subject: [PATCH 4/6] Fix merge --- dev-packages/browser-integration-tests/utils/helpers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-packages/browser-integration-tests/utils/helpers.ts b/dev-packages/browser-integration-tests/utils/helpers.ts index 861f05b9f641..0e54eea0fb31 100644 --- a/dev-packages/browser-integration-tests/utils/helpers.ts +++ b/dev-packages/browser-integration-tests/utils/helpers.ts @@ -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; }; From b110533dd3d3d4bd9064601e2d9ae1e2500c302d Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Mon, 19 Feb 2024 15:13:59 -0400 Subject: [PATCH 5/6] Fix offline test --- packages/browser/test/unit/transports/offline.test.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/browser/test/unit/transports/offline.test.ts b/packages/browser/test/unit/transports/offline.test.ts index 5df5cf60122c..758c19d30798 100644 --- a/packages/browser/test/unit/transports/offline.test.ts +++ b/packages/browser/test/unit/transports/offline.test.ts @@ -1,5 +1,6 @@ import 'fake-indexeddb/auto'; +import { TextDecoder, TextEncoder } from 'util'; import { createTransport } from '@sentry/core'; import type { EventEnvelope, @@ -58,6 +59,8 @@ function delay(ms: number): Promise { describe('makeOfflineTransport', () => { beforeAll(async () => { await deleteDatabase('sentry'); + (global as any).TextEncoder = TextEncoder; + (global as any).TextDecoder = TextDecoder; }); it('indexedDb wrappers insert and pop', async () => { From 290afbec82447db16f38b79a2abd512644202e88 Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Mon, 19 Feb 2024 15:31:47 -0400 Subject: [PATCH 6/6] Fix merge breakage --- .../test/transports/http.test.ts | 21 +++++++------------ .../test/transports/https.test.ts | 14 +++++-------- 2 files changed, 12 insertions(+), 23 deletions(-) diff --git a/packages/node-experimental/test/transports/http.test.ts b/packages/node-experimental/test/transports/http.test.ts index c8c82d62faba..be33fe618aa1 100644 --- a/packages/node-experimental/test/transports/http.test.ts +++ b/packages/node-experimental/test/transports/http.test.ts @@ -1,5 +1,4 @@ import * as http from 'http'; -import { TextEncoder } from 'util'; import { createGunzip } from 'zlib'; import { createTransport } from '@sentry/core'; import type { EventEnvelope, EventItem } from '@sentry/types'; @@ -7,8 +6,6 @@ import { addItemToEnvelope, createAttachmentEnvelopeItem, createEnvelope, serial import { makeNodeTransport } from '../../src/transports'; -const textEncoder = new TextEncoder(); - jest.mock('@sentry/core', () => { const actualCore = jest.requireActual('@sentry/core'); return { @@ -69,19 +66,15 @@ const EVENT_ENVELOPE = createEnvelope({ event_id: 'aa3ff046696b4b [{ type: 'event' }, { event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2' }] as EventItem, ]); -const SERIALIZED_EVENT_ENVELOPE = serializeEnvelope(EVENT_ENVELOPE, textEncoder); +const SERIALIZED_EVENT_ENVELOPE = serializeEnvelope(EVENT_ENVELOPE); -const ATTACHMENT_ITEM = createAttachmentEnvelopeItem( - { filename: 'empty-file.bin', data: new Uint8Array(50_000) }, - textEncoder, -); +const ATTACHMENT_ITEM = createAttachmentEnvelopeItem({ filename: 'empty-file.bin', data: new Uint8Array(50_000) }); const EVENT_ATTACHMENT_ENVELOPE = addItemToEnvelope(EVENT_ENVELOPE, ATTACHMENT_ITEM); -const SERIALIZED_EVENT_ATTACHMENT_ENVELOPE = serializeEnvelope(EVENT_ATTACHMENT_ENVELOPE, textEncoder) as Uint8Array; +const SERIALIZED_EVENT_ATTACHMENT_ENVELOPE = serializeEnvelope(EVENT_ATTACHMENT_ENVELOPE) as Uint8Array; const defaultOptions = { url: TEST_SERVER_URL, recordDroppedEvent: () => undefined, - textEncoder, }; // empty function to keep test output clean @@ -307,7 +300,7 @@ describe('makeNewHttpTransport()', () => { const registeredRequestExecutor = (createTransport as jest.Mock).mock.calls[0][1]; const executorResult = registeredRequestExecutor({ - body: serializeEnvelope(EVENT_ENVELOPE, textEncoder), + body: serializeEnvelope(EVENT_ENVELOPE), category: 'error', }); @@ -327,7 +320,7 @@ describe('makeNewHttpTransport()', () => { const registeredRequestExecutor = (createTransport as jest.Mock).mock.calls[0][1]; const executorResult = registeredRequestExecutor({ - body: serializeEnvelope(EVENT_ENVELOPE, textEncoder), + body: serializeEnvelope(EVENT_ENVELOPE), category: 'error', }); @@ -355,7 +348,7 @@ describe('makeNewHttpTransport()', () => { const registeredRequestExecutor = (createTransport as jest.Mock).mock.calls[0][1]; const executorResult = registeredRequestExecutor({ - body: serializeEnvelope(EVENT_ENVELOPE, textEncoder), + body: serializeEnvelope(EVENT_ENVELOPE), category: 'error', }); @@ -383,7 +376,7 @@ describe('makeNewHttpTransport()', () => { const registeredRequestExecutor = (createTransport as jest.Mock).mock.calls[0][1]; const executorResult = registeredRequestExecutor({ - body: serializeEnvelope(EVENT_ENVELOPE, textEncoder), + body: serializeEnvelope(EVENT_ENVELOPE), category: 'error', }); diff --git a/packages/node-experimental/test/transports/https.test.ts b/packages/node-experimental/test/transports/https.test.ts index 40bed042eca5..82be28f84e9a 100644 --- a/packages/node-experimental/test/transports/https.test.ts +++ b/packages/node-experimental/test/transports/https.test.ts @@ -1,6 +1,5 @@ import * as http from 'http'; import * as https from 'https'; -import { TextEncoder } from 'util'; import { createTransport } from '@sentry/core'; import type { EventEnvelope, EventItem } from '@sentry/types'; import { createEnvelope, serializeEnvelope } from '@sentry/utils'; @@ -9,8 +8,6 @@ import { makeNodeTransport } from '../../src/transports'; import type { HTTPModule, HTTPModuleRequestIncomingMessage } from '../../src/transports/http-module'; import testServerCerts from './test-server-certs'; -const textEncoder = new TextEncoder(); - jest.mock('@sentry/core', () => { const actualCore = jest.requireActual('@sentry/core'); return { @@ -69,7 +66,7 @@ const EVENT_ENVELOPE = createEnvelope({ event_id: 'aa3ff046696b4b [{ type: 'event' }, { event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2' }] as EventItem, ]); -const SERIALIZED_EVENT_ENVELOPE = serializeEnvelope(EVENT_ENVELOPE, textEncoder); +const SERIALIZED_EVENT_ENVELOPE = serializeEnvelope(EVENT_ENVELOPE); const unsafeHttpsModule: HTTPModule = { request: jest @@ -83,7 +80,6 @@ const defaultOptions = { httpModule: unsafeHttpsModule, url: TEST_SERVER_URL, recordDroppedEvent: () => undefined, // noop - textEncoder, }; describe('makeNewHttpsTransport()', () => { @@ -296,7 +292,7 @@ describe('makeNewHttpsTransport()', () => { const registeredRequestExecutor = (createTransport as jest.Mock).mock.calls[0][1]; const executorResult = registeredRequestExecutor({ - body: serializeEnvelope(EVENT_ENVELOPE, textEncoder), + body: serializeEnvelope(EVENT_ENVELOPE), category: 'error', }); @@ -316,7 +312,7 @@ describe('makeNewHttpsTransport()', () => { const registeredRequestExecutor = (createTransport as jest.Mock).mock.calls[0][1]; const executorResult = registeredRequestExecutor({ - body: serializeEnvelope(EVENT_ENVELOPE, textEncoder), + body: serializeEnvelope(EVENT_ENVELOPE), category: 'error', }); @@ -344,7 +340,7 @@ describe('makeNewHttpsTransport()', () => { const registeredRequestExecutor = (createTransport as jest.Mock).mock.calls[0][1]; const executorResult = registeredRequestExecutor({ - body: serializeEnvelope(EVENT_ENVELOPE, textEncoder), + body: serializeEnvelope(EVENT_ENVELOPE), category: 'error', }); @@ -372,7 +368,7 @@ describe('makeNewHttpsTransport()', () => { const registeredRequestExecutor = (createTransport as jest.Mock).mock.calls[0][1]; const executorResult = registeredRequestExecutor({ - body: serializeEnvelope(EVENT_ENVELOPE, textEncoder), + body: serializeEnvelope(EVENT_ENVELOPE), category: 'error', });