From edc1f9146f6dac50b2f82e2e6632ce7e3bfd91a9 Mon Sep 17 00:00:00 2001 From: Rick Klein Date: Tue, 28 Apr 2026 17:44:01 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20[DEBUG-5296]=20expose=20core=20hook?= =?UTF-8?q?s=20for=20the=20live=20debugger=20package?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Original author: Thomas Watson (split of #4449) Co-authored-by: Thomas Watson --- .github/CODEOWNERS | 7 +++++++ LICENSE-3rdparty.csv | 1 + eslint-local-rules/disallowSideEffects.js | 1 + .../src/domain/configuration/configuration.ts | 15 ++++++++++++--- .../src/domain/configuration/endpointBuilder.ts | 2 +- .../configuration/transportConfiguration.ts | 6 ++++-- packages/core/src/index.ts | 11 ++++++++++- packages/core/src/transport/index.ts | 1 + test/unit/browsers.conf.ts | 5 +++++ tsconfig.base.json | 4 +++- typedoc.json | 2 +- yarn.lock | 11 ++++++++++- 12 files changed, 56 insertions(+), 10 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 4293d648be..6341acad68 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -12,3 +12,10 @@ test/e2e/scenario/recorder/** @Datadog/rum-browser @Datadog/se # Docs /README.md @Datadog/rum-browser @DataDog/documentation + +# Debugger +packages/debugger @Datadog/rum-browser @DataDog/debugger +packages/debugger/README.md @Datadog/rum-browser @DataDog/debugger @DataDog/documentation +test/apps/instrumentation-overhead @Datadog/rum-browser @DataDog/debugger +test/e2e/scenario/debugger.scenario.ts @Datadog/rum-browser @DataDog/debugger +test/performance/scenarios/instrumentationOverhead.scenario.ts @Datadog/rum-browser @DataDog/debugger diff --git a/LICENSE-3rdparty.csv b/LICENSE-3rdparty.csv index 97b9fba1fc..597bf5278b 100644 --- a/LICENSE-3rdparty.csv +++ b/LICENSE-3rdparty.csv @@ -38,6 +38,7 @@ dev,@vitejs/plugin-react,MIT,Copyright (c) 2019-present Evan You & Vite Contribu dev,@vitejs/plugin-vue,MIT,Copyright (c) 2019-present, Yuxi (Evan) You and Vite contributors dev,@module-federation/enhanced,MIT, Copyright (c) 2020 ScriptedAlchemy LLC (Zack Jackson) Zhou Shaw (zhouxiao) dev,@vue/test-utils,MIT,Copyright (c) 2021-present vuejs +dev,acorn,MIT,Copyright (C) 2012-2022 by various contributors (see AUTHORS) dev,ajv,MIT,Copyright 2015-2017 Evgeny Poberezkin dev,babel-loader,MIT,Copyright (c) 2014-2019 Luís Couto dev,browserstack-local,MIT,Copyright 2016 BrowserStack diff --git a/eslint-local-rules/disallowSideEffects.js b/eslint-local-rules/disallowSideEffects.js index 890c5852df..906925cbd2 100644 --- a/eslint-local-rules/disallowSideEffects.js +++ b/eslint-local-rules/disallowSideEffects.js @@ -29,6 +29,7 @@ const pathsWithSideEffect = new Set([ `${packagesRoot}/logs/src/entries/main.ts`, `${packagesRoot}/rum/src/entries/main.ts`, `${packagesRoot}/rum-slim/src/entries/main.ts`, + `${packagesRoot}/debugger/src/entries/main.ts`, ]) // Those packages are known to have no side effects when evaluated diff --git a/packages/core/src/domain/configuration/configuration.ts b/packages/core/src/domain/configuration/configuration.ts index 29c42d5b6b..60908d7525 100644 --- a/packages/core/src/domain/configuration/configuration.ts +++ b/packages/core/src/domain/configuration/configuration.ts @@ -276,7 +276,7 @@ export interface InitConfiguration { * * @internal */ - source?: 'browser' | 'flutter' | 'unity' | undefined + source?: 'browser' | 'flutter' | 'unity' | 'dd_debugger' | undefined /** * [Internal option] Additional configuration for the SDK. @@ -311,6 +311,8 @@ export interface ReplicaUserConfiguration { clientToken: string } +export type SdkSource = 'browser' | 'flutter' | 'unity' + export interface Configuration extends TransportConfiguration { // Built from init configuration beforeSend: GenericBeforeSendCallback | undefined @@ -331,10 +333,14 @@ export interface Configuration extends TransportConfiguration { // internal sdkVersion: string | undefined - source: 'browser' | 'flutter' | 'unity' + source: SdkSource variant: string | undefined } +function toSdkSource(source: TransportConfiguration['source']): SdkSource { + return source === 'dd_debugger' ? 'browser' : source +} + function isString(tag: unknown, tagName: string): tag is string | undefined | null { if (tag !== undefined && tag !== null && typeof tag !== 'string') { display.error(`${tagName} must be defined as a string`) @@ -398,6 +404,8 @@ export function validateAndBuildConfiguration( return } + const transportConfiguration = computeTransportConfiguration(initConfiguration) + return { beforeSend: initConfiguration.beforeSend && catchUserErrors(initConfiguration.beforeSend, 'beforeSend threw an error:'), @@ -423,7 +431,8 @@ export function validateAndBuildConfiguration( variant: initConfiguration.variant, sdkVersion: initConfiguration.sdkVersion, - ...computeTransportConfiguration(initConfiguration), + ...transportConfiguration, + source: toSdkSource(transportConfiguration.source), } } diff --git a/packages/core/src/domain/configuration/endpointBuilder.ts b/packages/core/src/domain/configuration/endpointBuilder.ts index 78754b6fa5..69a79ba0dc 100644 --- a/packages/core/src/domain/configuration/endpointBuilder.ts +++ b/packages/core/src/domain/configuration/endpointBuilder.ts @@ -8,7 +8,7 @@ import type { InitConfiguration } from './configuration' // replaced at build time declare const __BUILD_ENV__SDK_VERSION__: string -export type TrackType = 'logs' | 'rum' | 'replay' | 'profile' | 'exposures' | 'flagevaluation' +export type TrackType = 'logs' | 'rum' | 'replay' | 'profile' | 'exposures' | 'flagevaluation' | 'debugger' export type ApiType = | 'fetch' | 'beacon' diff --git a/packages/core/src/domain/configuration/transportConfiguration.ts b/packages/core/src/domain/configuration/transportConfiguration.ts index 3ea3d0440c..19f5ac85bf 100644 --- a/packages/core/src/domain/configuration/transportConfiguration.ts +++ b/packages/core/src/domain/configuration/transportConfiguration.ts @@ -11,10 +11,11 @@ export interface TransportConfiguration { profilingEndpointBuilder: EndpointBuilder exposuresEndpointBuilder: EndpointBuilder flagEvaluationEndpointBuilder: EndpointBuilder + debuggerEndpointBuilder: EndpointBuilder datacenter?: string | undefined replica?: ReplicaConfiguration site: Site - source: 'browser' | 'flutter' | 'unity' + source: 'browser' | 'flutter' | 'unity' | 'dd_debugger' } export interface ReplicaConfiguration { @@ -38,7 +39,7 @@ export function computeTransportConfiguration(initConfiguration: InitConfigurati } function validateSource(source: string | undefined) { - if (source === 'flutter' || source === 'unity') { + if (source === 'flutter' || source === 'unity' || source === 'dd_debugger') { return source } return 'browser' @@ -52,6 +53,7 @@ function computeEndpointBuilders(initConfiguration: InitConfiguration) { sessionReplayEndpointBuilder: createEndpointBuilder(initConfiguration, 'replay'), exposuresEndpointBuilder: createEndpointBuilder(initConfiguration, 'exposures'), flagEvaluationEndpointBuilder: createEndpointBuilder(initConfiguration, 'flagevaluation'), + debuggerEndpointBuilder: createEndpointBuilder(initConfiguration, 'debugger'), } } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index a976c60832..2fbdc6c3e4 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -7,6 +7,7 @@ export { isSampleRate, buildEndpointHost, isIntakeUrl, + computeTransportConfiguration, } from './domain/configuration' export * from './domain/intakeSites' export type { TrackingConsentState } from './domain/trackingConsent' @@ -57,7 +58,15 @@ export { SESSION_NOT_TRACKED, SessionPersistence, } from './domain/session/sessionConstants' -export type { BandwidthStats, HttpRequest, HttpRequestEvent, Payload, FlushEvent, FlushReason } from './transport' +export type { + Batch, + BandwidthStats, + HttpRequest, + HttpRequestEvent, + Payload, + FlushEvent, + FlushReason, +} from './transport' export { createHttpRequest, canUseEventBridge, diff --git a/packages/core/src/transport/index.ts b/packages/core/src/transport/index.ts index ce6307356c..bf12615aa9 100644 --- a/packages/core/src/transport/index.ts +++ b/packages/core/src/transport/index.ts @@ -2,6 +2,7 @@ export type { BandwidthStats, HttpRequest, HttpRequestEvent, Payload, RetryInfo export { createHttpRequest } from './httpRequest' export type { BrowserWindowWithEventBridge, DatadogEventBridge } from './eventBridge' export { canUseEventBridge, bridgeSupports, getEventBridge, BridgeCapability } from './eventBridge' +export type { Batch } from './batch' export { createBatch } from './batch' export type { FlushController, FlushEvent, FlushReason } from './flushController' export { createFlushController, FLUSH_DURATION_LIMIT } from './flushController' diff --git a/test/unit/browsers.conf.ts b/test/unit/browsers.conf.ts index ebf634fb2e..a04ae3a03f 100644 --- a/test/unit/browsers.conf.ts +++ b/test/unit/browsers.conf.ts @@ -2,6 +2,11 @@ import type { BrowserConfiguration } from '../browsers.conf' +// The ECMAScript version supported by the oldest browser in the list below (Chrome 63 → ES2017). +// Used by tests that validate runtime-generated code strings (e.g. the expression compiler) which +// bypass TypeScript/webpack transpilation and must only use syntax supported by all target browsers. +export const OLDEST_BROWSER_ECMA_VERSION = 2017 + export const browserConfigurations: BrowserConfiguration[] = [ { sessionName: 'Edge', diff --git a/tsconfig.base.json b/tsconfig.base.json index 040b37b41f..1ecdb20fc4 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -41,7 +41,9 @@ "@datadog/browser-rum-nextjs": ["./packages/rum-nextjs/src/entries/main"], - "@datadog/browser-worker": ["./packages/worker/src/entries/main"] + "@datadog/browser-worker": ["./packages/worker/src/entries/main"], + + "@datadog/browser-debugger": ["./packages/debugger/src/entries/main"] } } } diff --git a/typedoc.json b/typedoc.json index 4ed1055538..055a6773e4 100644 --- a/typedoc.json +++ b/typedoc.json @@ -7,7 +7,7 @@ ], "entryPointStrategy": "packages", "includeVersion": true, - "exclude": ["packages/core", "packages/rum-core", "packages/worker"], + "exclude": ["packages/core", "packages/rum-core", "packages/worker", "packages/debugger"], "validation": { "notExported": true, "invalidLink": true, diff --git a/yarn.lock b/yarn.lock index 887108dff0..727f9301df 100644 --- a/yarn.lock +++ b/yarn.lock @@ -312,6 +312,15 @@ __metadata: languageName: unknown linkType: soft +"@datadog/browser-debugger@workspace:packages/debugger": + version: 0.0.0-use.local + resolution: "@datadog/browser-debugger@workspace:packages/debugger" + dependencies: + "@datadog/browser-core": "npm:6.32.0" + acorn: "npm:8.16.0" + languageName: unknown + linkType: soft + "@datadog/browser-logs@workspace:*, @datadog/browser-logs@workspace:packages/logs": version: 0.0.0-use.local resolution: "@datadog/browser-logs@workspace:packages/logs" @@ -3209,7 +3218,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.15.0, acorn@npm:^8.16.0": +"acorn@npm:8.16.0, acorn@npm:^8.15.0, acorn@npm:^8.16.0": version: 8.16.0 resolution: "acorn@npm:8.16.0" bin: