Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
8ce8478
Add Live Debugger package
watson Apr 7, 2026
fc01d64
Fix trace correlation
watson Apr 22, 2026
7f87bfb
Use existing stack trace logic
watson Apr 22, 2026
dd5321b
Replace applicationId with service in delivery identity
watson Apr 23, 2026
82670e9
Rename DebuggerPublicApi to DatadogDebugger
watson Apr 23, 2026
61ed6c8
Clean up debugger payload creation
watson Apr 24, 2026
ed0d592
Rename root hostname property to host
watson Apr 24, 2026
c0cc92a
Code cleanup
watson Apr 24, 2026
78df852
Don't fall back to empty message string
watson Apr 24, 2026
4fd8acf
Cache ddtags
watson Apr 24, 2026
d576848
Make debugger package private
watson May 6, 2026
45e5b2b
Do not add 'dd' property to probe payload
watson May 6, 2026
6c20dc1
Final cleanup of removing hostname
watson May 6, 2026
ae680c5
Code cleanup
watson May 6, 2026
6fac7cc
Run e2e tests on all browsers
watson May 6, 2026
ec85f20
Use the real debugger SDK in the instrumentationOverhead benchmark
watson May 7, 2026
7bbfa49
Bump version
watson May 7, 2026
f8359b5
Result of yarn format
watson May 7, 2026
79647a2
Result of yarn lint
watson May 7, 2026
0b7f738
Private packages do not have version
watson May 7, 2026
7005d67
Regenerate instrumentation-overhead yarn.lock after version bump
watson May 7, 2026
83254be
Remove dated RUM reference in README.md
watson May 7, 2026
3be9610
sanitize @-prefixed refs in debugger expression compiler
watson May 7, 2026
09376b1
Pass dd_debugger source as an explicit override
watson May 7, 2026
038eb97
Relax BrowserStack unit timeouts for Firefox
watson May 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -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
1 change: 1 addition & 0 deletions LICENSE-3rdparty.csv
Original file line number Diff line number Diff line change
Expand Up @@ -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 <hello@luiscouto.pt>
dev,browserstack-local,MIT,Copyright 2016 BrowserStack
Expand Down
1 change: 1 addition & 0 deletions eslint-local-rules/disallowSideEffects.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 3 additions & 1 deletion packages/core/src/domain/configuration/configuration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -331,7 +333,7 @@ export interface Configuration extends TransportConfiguration {

// internal
sdkVersion: string | undefined
source: 'browser' | 'flutter' | 'unity'
source: SdkSource
variant: string | undefined
}

Expand Down
26 changes: 21 additions & 5 deletions packages/core/src/domain/configuration/endpointBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,34 @@ 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'
// 'manual' reflects that the request have been sent manually, outside of the SDK (ex: via curl or
// a Node.js script).
| 'manual'

/**
* Source values supported by the transport layer for the `ddsource` URL parameter.
*
* `'dd_debugger'` is internal to the Live Debugger SDK and is not part of
* `InitConfiguration.source`. It can only be supplied by passing it as the
* `sourceOverride` argument of `computeTransportConfiguration`.
*/
export type TransportSource = 'browser' | 'flutter' | 'unity' | 'dd_debugger'

// Internal: the endpoint builder accepts a wider `source` than the public
// `InitConfiguration.source` so that `computeTransportConfiguration` can pass
// the validated/overridden transport source through to URL building.
type EndpointBuilderInitConfiguration = Omit<InitConfiguration, 'source'> & {
source?: TransportSource
}

export type EndpointBuilder = ReturnType<typeof createEndpointBuilder>

export function createEndpointBuilder(
initConfiguration: InitConfiguration,
initConfiguration: EndpointBuilderInitConfiguration,
trackType: TrackType,
extraParameters?: string[]
) {
Expand All @@ -40,7 +56,7 @@ export function createEndpointBuilder(
* request, as only parameters are changing.
*/
function createEndpointUrlWithParametersBuilder(
initConfiguration: InitConfiguration,
initConfiguration: EndpointBuilderInitConfiguration,
trackType: TrackType
): (parameters: string) => string {
const path = `/api/v2/${trackType}`
Expand All @@ -58,7 +74,7 @@ function createEndpointUrlWithParametersBuilder(

export function buildEndpointHost(
trackType: TrackType,
initConfiguration: InitConfiguration & { usePciIntake?: boolean }
initConfiguration: Omit<InitConfiguration, 'source'> & { usePciIntake?: boolean }
) {
const { site = INTAKE_SITE_US1, internalAnalyticsSubdomain } = initConfiguration

Expand All @@ -84,7 +100,7 @@ export function buildEndpointHost(
* request, as they change randomly.
*/
function buildEndpointParameters(
{ clientToken, internalAnalyticsSubdomain, source = 'browser' }: InitConfiguration,
{ clientToken, internalAnalyticsSubdomain, source = 'browser' }: EndpointBuilderInitConfiguration,
trackType: TrackType,
api: ApiType,
{ retry, encoding }: Payload,
Expand Down
53 changes: 42 additions & 11 deletions packages/core/src/domain/configuration/transportConfiguration.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { Site } from '../intakeSites'
import { INTAKE_SITE_US1, INTAKE_URL_PARAMETERS } from '../intakeSites'
import type { InitConfiguration } from './configuration'
import type { EndpointBuilder } from './endpointBuilder'
import type { InitConfiguration, SdkSource } from './configuration'
import type { EndpointBuilder, TransportSource } from './endpointBuilder'
import { createEndpointBuilder } from './endpointBuilder'

export interface TransportConfiguration {
Expand All @@ -11,23 +11,51 @@ export interface TransportConfiguration {
profilingEndpointBuilder: EndpointBuilder
exposuresEndpointBuilder: EndpointBuilder
flagEvaluationEndpointBuilder: EndpointBuilder
debuggerEndpointBuilder: EndpointBuilder
datacenter?: string | undefined
replica?: ReplicaConfiguration
site: Site
source: 'browser' | 'flutter' | 'unity'
source: TransportSource
}

export interface ReplicaConfiguration {
logsEndpointBuilder: EndpointBuilder
rumEndpointBuilder: EndpointBuilder
}

export function computeTransportConfiguration(initConfiguration: InitConfiguration): TransportConfiguration {
// Internal: init configuration once the transport source has been resolved
// (validated user value or `sourceOverride` from `computeTransportConfiguration`).
type ResolvedSourceInitConfiguration = Omit<InitConfiguration, 'source'> & {
source: TransportSource
}

/**
* Compute the transport configuration (endpoint builders, replica, etc.) for an
* SDK init configuration.
*
* When called without `sourceOverride`, the resulting `source` is whatever was
* provided in `initConfiguration.source` (validated to a `SdkSource`, defaulting
* to `browser`).
*
* When called with `sourceOverride`, that value is used instead.
*/
export function computeTransportConfiguration(
initConfiguration: InitConfiguration
): TransportConfiguration & { source: SdkSource }
export function computeTransportConfiguration(
initConfiguration: InitConfiguration,
sourceOverride: TransportSource
): TransportConfiguration
export function computeTransportConfiguration(
initConfiguration: InitConfiguration,
sourceOverride?: TransportSource
): TransportConfiguration {
const site = initConfiguration.site || INTAKE_SITE_US1
const source = validateSource(initConfiguration.source)
const source: TransportSource = sourceOverride ?? validateSource(initConfiguration.source)

const endpointBuilders = computeEndpointBuilders({ ...initConfiguration, site, source })
const replicaConfiguration = computeReplicaConfiguration({ ...initConfiguration, site, source })
const resolvedConfiguration: ResolvedSourceInitConfiguration = { ...initConfiguration, site, source }
const endpointBuilders = computeEndpointBuilders(resolvedConfiguration)
const replicaConfiguration = computeReplicaConfiguration(resolvedConfiguration)

return {
replica: replicaConfiguration,
Expand All @@ -37,30 +65,33 @@ export function computeTransportConfiguration(initConfiguration: InitConfigurati
}
}

function validateSource(source: string | undefined) {
function validateSource(source: string | undefined): SdkSource {
if (source === 'flutter' || source === 'unity') {
return source
}
return 'browser'
}

function computeEndpointBuilders(initConfiguration: InitConfiguration) {
function computeEndpointBuilders(initConfiguration: ResolvedSourceInitConfiguration) {
return {
logsEndpointBuilder: createEndpointBuilder(initConfiguration, 'logs'),
rumEndpointBuilder: createEndpointBuilder(initConfiguration, 'rum'),
profilingEndpointBuilder: createEndpointBuilder(initConfiguration, 'profile'),
sessionReplayEndpointBuilder: createEndpointBuilder(initConfiguration, 'replay'),
exposuresEndpointBuilder: createEndpointBuilder(initConfiguration, 'exposures'),
flagEvaluationEndpointBuilder: createEndpointBuilder(initConfiguration, 'flagevaluation'),
debuggerEndpointBuilder: createEndpointBuilder(initConfiguration, 'debugger'),
}
}

function computeReplicaConfiguration(initConfiguration: InitConfiguration): ReplicaConfiguration | undefined {
function computeReplicaConfiguration(
initConfiguration: ResolvedSourceInitConfiguration
): ReplicaConfiguration | undefined {
if (!initConfiguration.replica) {
return
}

const replicaConfiguration: InitConfiguration = {
const replicaConfiguration: ResolvedSourceInitConfiguration = {
...initConfiguration,
site: INTAKE_SITE_US1,
clientToken: initConfiguration.replica.clientToken,
Expand Down
11 changes: 10 additions & 1 deletion packages/core/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ export {
isSampleRate,
buildEndpointHost,
isIntakeUrl,
computeTransportConfiguration,
} from './domain/configuration'
export * from './domain/intakeSites'
export type { TrackingConsentState } from './domain/trackingConsent'
Expand Down Expand Up @@ -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,
Expand Down
1 change: 1 addition & 0 deletions packages/core/src/transport/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Loading
Loading