From 2120c1b046c3b8eba05d01e9725897dece14fa94 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Mon, 25 Aug 2025 09:58:17 +0200 Subject: [PATCH 1/2] fix(browser): Use correct global object type in `registerWebWorker` --- packages/browser/src/integrations/webWorker.ts | 6 +++--- packages/browser/tsconfig.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/browser/src/integrations/webWorker.ts b/packages/browser/src/integrations/webWorker.ts index f422f372a463..34409522c780 100644 --- a/packages/browser/src/integrations/webWorker.ts +++ b/packages/browser/src/integrations/webWorker.ts @@ -25,7 +25,7 @@ interface WebWorkerIntegration extends Integration { * any messages from the worker. Otherwise, your message handlers will receive * messages from the Sentry SDK which you need to ignore. * - * This integration only has an effect, if you call `Sentry.registerWorker(self)` + * This integration only has an effect, if you call `Sentry.registerWebWorker(self)` * from within the worker(s) you're adding to the integration. * * Given that you want to initialize the SDK as early as possible, you most likely @@ -114,7 +114,7 @@ function listenForSentryDebugIdMessages(worker: Worker): void { } interface RegisterWebWorkerOptions { - self: Worker & { _sentryDebugIds?: Record }; + self: DedicatedWorkerGlobalScope & { _sentryDebugIds?: Record }; } /** @@ -125,7 +125,7 @@ interface RegisterWebWorkerOptions { * import * as Sentry from '@sentry/'; * * // Do this as early as possible in your worker. - * Sentry.registerWorker({ self }); + * Sentry.registerWebWorker({ self }); * * // continue setting up your worker * self.postMessage(...) diff --git a/packages/browser/tsconfig.json b/packages/browser/tsconfig.json index 6b204e508047..1ac927bde013 100644 --- a/packages/browser/tsconfig.json +++ b/packages/browser/tsconfig.json @@ -4,6 +4,6 @@ "include": ["src/**/*", "test/loader.js"], "compilerOptions": { - "lib": ["DOM", "ES2018"], + "lib": ["DOM", "ES2018", "WebWorker"] } } From 9492a5b49f0cde767da01277f543e57a719410f6 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Mon, 25 Aug 2025 10:41:38 +0200 Subject: [PATCH 2/2] don't break ts setups, fix tests --- .../browser-webworker-vite/src/worker.ts | 4 +--- .../browser-webworker-vite/src/worker2.ts | 4 +--- .../browser-webworker-vite/src/worker3.ts | 4 +--- .../browser-webworker-vite/tsconfig.json | 5 +++-- packages/browser/src/integrations/webWorker.ts | 15 ++++++++++++++- 5 files changed, 20 insertions(+), 12 deletions(-) diff --git a/dev-packages/e2e-tests/test-applications/browser-webworker-vite/src/worker.ts b/dev-packages/e2e-tests/test-applications/browser-webworker-vite/src/worker.ts index 455e8e395901..6ed994e9006b 100644 --- a/dev-packages/e2e-tests/test-applications/browser-webworker-vite/src/worker.ts +++ b/dev-packages/e2e-tests/test-applications/browser-webworker-vite/src/worker.ts @@ -1,8 +1,6 @@ import * as Sentry from '@sentry/browser'; -// type cast necessary because TS thinks this file is part of the main -// thread where self is of type `Window` instead of `Worker` -Sentry.registerWebWorker({ self: self as unknown as Worker }); +Sentry.registerWebWorker({ self }); // Let the main thread know the worker is ready self.postMessage({ diff --git a/dev-packages/e2e-tests/test-applications/browser-webworker-vite/src/worker2.ts b/dev-packages/e2e-tests/test-applications/browser-webworker-vite/src/worker2.ts index 8dfb70b32853..2582bf234c75 100644 --- a/dev-packages/e2e-tests/test-applications/browser-webworker-vite/src/worker2.ts +++ b/dev-packages/e2e-tests/test-applications/browser-webworker-vite/src/worker2.ts @@ -1,8 +1,6 @@ import * as Sentry from '@sentry/browser'; -// type cast necessary because TS thinks this file is part of the main -// thread where self is of type `Window` instead of `Worker` -Sentry.registerWebWorker({ self: self as unknown as Worker }); +Sentry.registerWebWorker({ self }); // Let the main thread know the worker is ready self.postMessage({ diff --git a/dev-packages/e2e-tests/test-applications/browser-webworker-vite/src/worker3.ts b/dev-packages/e2e-tests/test-applications/browser-webworker-vite/src/worker3.ts index d68265c24ab7..7ea35b0cd82d 100644 --- a/dev-packages/e2e-tests/test-applications/browser-webworker-vite/src/worker3.ts +++ b/dev-packages/e2e-tests/test-applications/browser-webworker-vite/src/worker3.ts @@ -1,8 +1,6 @@ import * as Sentry from '@sentry/browser'; -// type cast necessary because TS thinks this file is part of the main -// thread where self is of type `Window` instead of `Worker` -Sentry.registerWebWorker({ self: self as unknown as Worker }); +Sentry.registerWebWorker({ self }); // Let the main thread know the worker is ready self.postMessage({ diff --git a/dev-packages/e2e-tests/test-applications/browser-webworker-vite/tsconfig.json b/dev-packages/e2e-tests/test-applications/browser-webworker-vite/tsconfig.json index 4f5edc248c88..41928e7c8bb1 100644 --- a/dev-packages/e2e-tests/test-applications/browser-webworker-vite/tsconfig.json +++ b/dev-packages/e2e-tests/test-applications/browser-webworker-vite/tsconfig.json @@ -3,8 +3,9 @@ "target": "ES2022", "useDefineForClassFields": true, "module": "ESNext", - "lib": ["ES2022", "DOM", "DOM.Iterable"], - "skipLibCheck": true, + "lib": ["ES2022", "DOM", "DOM.Iterable", "WebWorker"], + "skipLibCheck": false, + "skipDefaultLibCheck": true, /* Bundler mode */ "moduleResolution": "bundler", diff --git a/packages/browser/src/integrations/webWorker.ts b/packages/browser/src/integrations/webWorker.ts index 34409522c780..1f7a266a9c8e 100644 --- a/packages/browser/src/integrations/webWorker.ts +++ b/packages/browser/src/integrations/webWorker.ts @@ -113,8 +113,21 @@ function listenForSentryDebugIdMessages(worker: Worker): void { }); } +/** + * Minimal interface for DedicatedWorkerGlobalScope, only requiring the postMessage method. + * (which is the only thing we need from the worker's global object) + * + * @see https://developer.mozilla.org/en-US/docs/Web/API/DedicatedWorkerGlobalScope + * + * We can't use the actual type because it breaks everyone who doesn't have {"lib": ["WebWorker"]} + * but uses {"skipLibCheck": true} in their tsconfig.json. + */ +interface MinimalDedicatedWorkerGlobalScope { + postMessage: (message: unknown) => void; +} + interface RegisterWebWorkerOptions { - self: DedicatedWorkerGlobalScope & { _sentryDebugIds?: Record }; + self: MinimalDedicatedWorkerGlobalScope & { _sentryDebugIds?: Record }; } /**