Skip to content

Commit 09376b1

Browse files
committed
Pass dd_debugger source as an explicit override
Previously, the Debugger SDK set `source: 'dd_debugger'` on its init configuration so it would flow into the `ddsource` URL parameter, which forced `validateAndBuildConfiguration` to convert it back to 'browser' via a `toSdkSource` helper before storing on `Configuration.source` (used as the SDK source on RUM events). The round-trip was confusing because the same field was playing two roles: URL routing source and RUM event SDK source. Split them apart: - `InitConfiguration.source` no longer accepts 'dd_debugger'. - `computeTransportConfiguration` takes an optional `sourceOverride` parameter (typed `TransportSource`, includes 'dd_debugger') used only for URL building. The Debugger SDK passes 'dd_debugger' there. - Function overloads narrow the return type when no override is given, so `Configuration.source` is `SdkSource` without a runtime conversion. - `toSdkSource` is removed. Wire behavior is unchanged: URLs still go out with `?ddsource=dd_debugger&...&dd-evp-origin=browser`, RUM events still carry a valid `SdkSource`, and downstream `source:dd_debugger` queries keep working.
1 parent 3be9610 commit 09376b1

4 files changed

Lines changed: 64 additions & 26 deletions

File tree

packages/core/src/domain/configuration/configuration.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ export interface InitConfiguration {
276276
*
277277
* @internal
278278
*/
279-
source?: 'browser' | 'flutter' | 'unity' | 'dd_debugger' | undefined
279+
source?: 'browser' | 'flutter' | 'unity' | undefined
280280

281281
/**
282282
* [Internal option] Additional configuration for the SDK.
@@ -337,10 +337,6 @@ export interface Configuration extends TransportConfiguration {
337337
variant: string | undefined
338338
}
339339

340-
function toSdkSource(source: TransportConfiguration['source']): SdkSource {
341-
return source === 'dd_debugger' ? 'browser' : source
342-
}
343-
344340
function isString(tag: unknown, tagName: string): tag is string | undefined | null {
345341
if (tag !== undefined && tag !== null && typeof tag !== 'string') {
346342
display.error(`${tagName} must be defined as a string`)
@@ -404,8 +400,6 @@ export function validateAndBuildConfiguration(
404400
return
405401
}
406402

407-
const transportConfiguration = computeTransportConfiguration(initConfiguration)
408-
409403
return {
410404
beforeSend:
411405
initConfiguration.beforeSend && catchUserErrors(initConfiguration.beforeSend, 'beforeSend threw an error:'),
@@ -431,8 +425,7 @@ export function validateAndBuildConfiguration(
431425
variant: initConfiguration.variant,
432426
sdkVersion: initConfiguration.sdkVersion,
433427

434-
...transportConfiguration,
435-
source: toSdkSource(transportConfiguration.source),
428+
...computeTransportConfiguration(initConfiguration),
436429
}
437430
}
438431

packages/core/src/domain/configuration/endpointBuilder.ts

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,26 @@ export type ApiType =
1616
// a Node.js script).
1717
| 'manual'
1818

19+
/**
20+
* Source values supported by the transport layer for the `ddsource` URL parameter.
21+
*
22+
* `'dd_debugger'` is internal to the Live Debugger SDK and is not part of
23+
* `InitConfiguration.source`. It can only be supplied by passing it as the
24+
* `sourceOverride` argument of `computeTransportConfiguration`.
25+
*/
26+
export type TransportSource = 'browser' | 'flutter' | 'unity' | 'dd_debugger'
27+
28+
// Internal: the endpoint builder accepts a wider `source` than the public
29+
// `InitConfiguration.source` so that `computeTransportConfiguration` can pass
30+
// the validated/overridden transport source through to URL building.
31+
type EndpointBuilderInitConfiguration = Omit<InitConfiguration, 'source'> & {
32+
source?: TransportSource
33+
}
34+
1935
export type EndpointBuilder = ReturnType<typeof createEndpointBuilder>
2036

2137
export function createEndpointBuilder(
22-
initConfiguration: InitConfiguration,
38+
initConfiguration: EndpointBuilderInitConfiguration,
2339
trackType: TrackType,
2440
extraParameters?: string[]
2541
) {
@@ -40,7 +56,7 @@ export function createEndpointBuilder(
4056
* request, as only parameters are changing.
4157
*/
4258
function createEndpointUrlWithParametersBuilder(
43-
initConfiguration: InitConfiguration,
59+
initConfiguration: EndpointBuilderInitConfiguration,
4460
trackType: TrackType
4561
): (parameters: string) => string {
4662
const path = `/api/v2/${trackType}`
@@ -58,7 +74,7 @@ function createEndpointUrlWithParametersBuilder(
5874

5975
export function buildEndpointHost(
6076
trackType: TrackType,
61-
initConfiguration: InitConfiguration & { usePciIntake?: boolean }
77+
initConfiguration: Omit<InitConfiguration, 'source'> & { usePciIntake?: boolean }
6278
) {
6379
const { site = INTAKE_SITE_US1, internalAnalyticsSubdomain } = initConfiguration
6480

@@ -84,7 +100,7 @@ export function buildEndpointHost(
84100
* request, as they change randomly.
85101
*/
86102
function buildEndpointParameters(
87-
{ clientToken, internalAnalyticsSubdomain, source = 'browser' }: InitConfiguration,
103+
{ clientToken, internalAnalyticsSubdomain, source = 'browser' }: EndpointBuilderInitConfiguration,
88104
trackType: TrackType,
89105
api: ApiType,
90106
{ retry, encoding }: Payload,

packages/core/src/domain/configuration/transportConfiguration.ts

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { Site } from '../intakeSites'
22
import { INTAKE_SITE_US1, INTAKE_URL_PARAMETERS } from '../intakeSites'
3-
import type { InitConfiguration } from './configuration'
4-
import type { EndpointBuilder } from './endpointBuilder'
3+
import type { InitConfiguration, SdkSource } from './configuration'
4+
import type { EndpointBuilder, TransportSource } from './endpointBuilder'
55
import { createEndpointBuilder } from './endpointBuilder'
66

77
export interface TransportConfiguration {
@@ -15,20 +15,47 @@ export interface TransportConfiguration {
1515
datacenter?: string | undefined
1616
replica?: ReplicaConfiguration
1717
site: Site
18-
source: 'browser' | 'flutter' | 'unity' | 'dd_debugger'
18+
source: TransportSource
1919
}
2020

2121
export interface ReplicaConfiguration {
2222
logsEndpointBuilder: EndpointBuilder
2323
rumEndpointBuilder: EndpointBuilder
2424
}
2525

26-
export function computeTransportConfiguration(initConfiguration: InitConfiguration): TransportConfiguration {
26+
// Internal: init configuration once the transport source has been resolved
27+
// (validated user value or `sourceOverride` from `computeTransportConfiguration`).
28+
type ResolvedSourceInitConfiguration = Omit<InitConfiguration, 'source'> & {
29+
source: TransportSource
30+
}
31+
32+
/**
33+
* Compute the transport configuration (endpoint builders, replica, etc.) for an
34+
* SDK init configuration.
35+
*
36+
* When called without `sourceOverride`, the resulting `source` is whatever was
37+
* provided in `initConfiguration.source` (validated to a `SdkSource`, defaulting
38+
* to `browser`).
39+
*
40+
* When called with `sourceOverride`, that value is used instead.
41+
*/
42+
export function computeTransportConfiguration(
43+
initConfiguration: InitConfiguration
44+
): TransportConfiguration & { source: SdkSource }
45+
export function computeTransportConfiguration(
46+
initConfiguration: InitConfiguration,
47+
sourceOverride: TransportSource
48+
): TransportConfiguration
49+
export function computeTransportConfiguration(
50+
initConfiguration: InitConfiguration,
51+
sourceOverride?: TransportSource
52+
): TransportConfiguration {
2753
const site = initConfiguration.site || INTAKE_SITE_US1
28-
const source = validateSource(initConfiguration.source)
54+
const source: TransportSource = sourceOverride ?? validateSource(initConfiguration.source)
2955

30-
const endpointBuilders = computeEndpointBuilders({ ...initConfiguration, site, source })
31-
const replicaConfiguration = computeReplicaConfiguration({ ...initConfiguration, site, source })
56+
const resolvedConfiguration: ResolvedSourceInitConfiguration = { ...initConfiguration, site, source }
57+
const endpointBuilders = computeEndpointBuilders(resolvedConfiguration)
58+
const replicaConfiguration = computeReplicaConfiguration(resolvedConfiguration)
3259

3360
return {
3461
replica: replicaConfiguration,
@@ -38,14 +65,14 @@ export function computeTransportConfiguration(initConfiguration: InitConfigurati
3865
}
3966
}
4067

41-
function validateSource(source: string | undefined) {
42-
if (source === 'flutter' || source === 'unity' || source === 'dd_debugger') {
68+
function validateSource(source: string | undefined): SdkSource {
69+
if (source === 'flutter' || source === 'unity') {
4370
return source
4471
}
4572
return 'browser'
4673
}
4774

48-
function computeEndpointBuilders(initConfiguration: InitConfiguration) {
75+
function computeEndpointBuilders(initConfiguration: ResolvedSourceInitConfiguration) {
4976
return {
5077
logsEndpointBuilder: createEndpointBuilder(initConfiguration, 'logs'),
5178
rumEndpointBuilder: createEndpointBuilder(initConfiguration, 'rum'),
@@ -57,12 +84,14 @@ function computeEndpointBuilders(initConfiguration: InitConfiguration) {
5784
}
5885
}
5986

60-
function computeReplicaConfiguration(initConfiguration: InitConfiguration): ReplicaConfiguration | undefined {
87+
function computeReplicaConfiguration(
88+
initConfiguration: ResolvedSourceInitConfiguration
89+
): ReplicaConfiguration | undefined {
6190
if (!initConfiguration.replica) {
6291
return
6392
}
6493

65-
const replicaConfiguration: InitConfiguration = {
94+
const replicaConfiguration: ResolvedSourceInitConfiguration = {
6695
...initConfiguration,
6796
site: INTAKE_SITE_US1,
6897
clientToken: initConfiguration.replica.clientToken,

packages/debugger/src/transport/startDebuggerBatch.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
} from '@datadog/browser-core'
1313

1414
export function startDebuggerBatch(initConfiguration: InitConfiguration): Batch {
15-
const { debuggerEndpointBuilder } = computeTransportConfiguration({ ...initConfiguration, source: 'dd_debugger' })
15+
const { debuggerEndpointBuilder } = computeTransportConfiguration(initConfiguration, 'dd_debugger')
1616

1717
const batch = createBatch({
1818
encoder: createIdentityEncoder(),

0 commit comments

Comments
 (0)