@servicetitan/journey 4.1.0 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -34
- package/dist/__tests__/sinks/datadog-links.test.d.ts +2 -0
- package/dist/__tests__/sinks/datadog-links.test.d.ts.map +1 -0
- package/dist/core/request-correlation.d.ts +2 -0
- package/dist/core/request-correlation.d.ts.map +1 -1
- package/dist/core/request-correlation.js +8 -0
- package/dist/core/request-correlation.js.map +1 -1
- package/dist/core/runtime.js +2 -2
- package/dist/core/runtime.js.map +1 -1
- package/dist/core/sanitize.d.ts.map +1 -1
- package/dist/core/sanitize.js +4 -4
- package/dist/core/sanitize.js.map +1 -1
- package/dist/integrations/request-correlation.d.ts.map +1 -1
- package/dist/integrations/request-correlation.js +3 -4
- package/dist/integrations/request-correlation.js.map +1 -1
- package/dist/sinks/datadog.d.ts.map +1 -1
- package/dist/sinks/datadog.js +11 -3
- package/dist/sinks/datadog.js.map +1 -1
- package/dist/sinks/kibana.d.ts +8 -1
- package/dist/sinks/kibana.d.ts.map +1 -1
- package/dist/sinks/kibana.js +74 -2
- package/dist/sinks/kibana.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/integrations/request-correlation.test.ts +72 -4
- package/src/__tests__/sinks/datadog-links.test.ts +58 -0
- package/src/__tests__/sinks/kibana.test.ts +161 -4
- package/src/core/request-correlation.ts +19 -0
- package/src/core/runtime.ts +2 -2
- package/src/core/sanitize.ts +9 -10
- package/src/integrations/request-correlation.ts +7 -4
- package/src/sinks/datadog.ts +4 -2
- package/src/sinks/kibana.ts +119 -3
package/README.md
CHANGED
|
@@ -6,37 +6,37 @@ Critical user journey monitoring for Datadog RUM (`user_journey` custom actions)
|
|
|
6
6
|
|
|
7
7
|
Prefer `defineJourney` handles (`.start` / `.step` / `.complete`). Soft ambient attributes HTTP only when exactly one step is in flight — pass `{ stamp: step.stamp() }` after `await` or when steps overlap. `start()` always opens a new instance. Default aborted-request policy is `continue`.
|
|
8
8
|
|
|
9
|
-
##
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
9
|
+
## Kibana links on journeys
|
|
10
|
+
|
|
11
|
+
Open `context.journey.kibana_url`, regardless of the journey's outcome or failure reason.
|
|
12
|
+
|
|
13
|
+
- `kibana_scope: request`: the identified request that caused an HTTP-scored failure.
|
|
14
|
+
Its ID is also in `failed_request_id`. Existing precise links are unchanged.
|
|
15
|
+
- `kibana_scope: related_logs`: a search for this tenant and username/email during
|
|
16
|
+
the journey, with a one-minute buffer. This covers step errors, timeouts, network
|
|
17
|
+
failures without a response, and good/excluded journeys when host user context exists.
|
|
18
|
+
- `kibana_scope: related_requests`: captured requests when host user context is unavailable.
|
|
19
|
+
These requests are context, not proof that they caused the failure.
|
|
20
|
+
|
|
21
|
+
Every retained response with a readable `cf-ray` also has its own
|
|
22
|
+
`steps[].requests[].kibana_url`, including successful responses. The existing limits
|
|
23
|
+
remain: five requests per step and 20 across the event, with `requests_truncated` flags.
|
|
24
|
+
The feature adds no network calls or changes to scoring, thresholds, or transport behavior.
|
|
25
|
+
|
|
26
|
+
Supported origins are `https://go.servicetitan.com` and production Enterprise Hub
|
|
27
|
+
monolith hosts (`https://<tenant>.eh.go.servicetitan.com`), verified against the same
|
|
28
|
+
production log view. Other origins are not assumed to share that log contract.
|
|
29
|
+
Ignored/aborted requests are not captured. Cross-page serialization does not carry
|
|
30
|
+
request history from the previous page.
|
|
31
|
+
|
|
32
|
+
Related-log searches read `tenant` and `name`/`email` from the host RUM `getUser()`.
|
|
33
|
+
Those existing identity values are included in the link's query; request URLs, bodies,
|
|
34
|
+
and other headers are not collected. Missing identity never falls back to all tenants.
|
|
35
|
+
Without usable user context or any captured request IDs, no safe link can be built.
|
|
36
|
+
Frontend-only failures and requests that never reached the app may have no backend logs.
|
|
37
|
+
The existing `usr.kibanaUrl` is untouched. Links are event details, not metric tags.
|
|
38
|
+
|
|
39
|
+
The updated package must be published, adopted, and deployed by the host. Separately
|
|
40
|
+
bundled MFEs also need an updated owning runtime to retain request details. Browser
|
|
41
|
+
click-through and Datadog display still require rollout verification; Kibana access
|
|
42
|
+
is required to view logs.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datadog-links.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/sinks/datadog-links.test.ts"],"names":[],"mappings":""}
|
|
@@ -3,4 +3,6 @@ export declare const MAX_CORRELATED_REQUESTS = 5;
|
|
|
3
3
|
export declare const MAX_JOURNEY_CORRELATED_REQUESTS = 20;
|
|
4
4
|
/** Only allow a Cloudflare Ray ID and bounded numeric response metadata onto the wire. */
|
|
5
5
|
export declare function sanitizeRequestCorrelation(value: JourneyRequestEvent): JourneyRequestEvent | undefined;
|
|
6
|
+
/** Production monolith origins whose Ray IDs have been verified against the log data view. */
|
|
7
|
+
export declare function isMonolithLogOrigin(value: string): boolean;
|
|
6
8
|
//# sourceMappingURL=request-correlation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-correlation.d.ts","sourceRoot":"","sources":["../../src/core/request-correlation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnD,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAElD,0FAA0F;AAC1F,wBAAgB,0BAA0B,CACtC,KAAK,EAAE,mBAAmB,GAC3B,mBAAmB,GAAG,SAAS,CAuBjC"}
|
|
1
|
+
{"version":3,"file":"request-correlation.d.ts","sourceRoot":"","sources":["../../src/core/request-correlation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnD,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAElD,0FAA0F;AAC1F,wBAAgB,0BAA0B,CACtC,KAAK,EAAE,mBAAmB,GAC3B,mBAAmB,GAAG,SAAS,CAuBjC;AAED,8FAA8F;AAC9F,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAgB1D"}
|
|
@@ -11,5 +11,13 @@ export const MAX_JOURNEY_CORRELATED_REQUESTS = 20;
|
|
|
11
11
|
status: value.status
|
|
12
12
|
};
|
|
13
13
|
}
|
|
14
|
+
/** Production monolith origins whose Ray IDs have been verified against the log data view. */ export function isMonolithLogOrigin(value) {
|
|
15
|
+
try {
|
|
16
|
+
const url = new URL(value);
|
|
17
|
+
return url.protocol === 'https:' && !url.port && !url.username && !url.password && (url.hostname === 'go.servicetitan.com' || /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:_[a-z0-9-]+)*\.eh\.go\.servicetitan\.com$/i.test(url.hostname));
|
|
18
|
+
} catch (unused) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
14
22
|
|
|
15
23
|
//# sourceMappingURL=request-correlation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/request-correlation.ts"],"sourcesContent":["import type { JourneyRequestEvent } from './types';\n\nexport const MAX_CORRELATED_REQUESTS = 5;\nexport const MAX_JOURNEY_CORRELATED_REQUESTS = 20;\n\n/** Only allow a Cloudflare Ray ID and bounded numeric response metadata onto the wire. */\nexport function sanitizeRequestCorrelation(\n value: JourneyRequestEvent\n): JourneyRequestEvent | undefined {\n if (\n !value ||\n typeof value.rayId !== 'string' ||\n !/^[a-f0-9]{16}(?:-[a-z]{3})?$/i.test(value.rayId) ||\n !Number.isFinite(value.startedAtEpoch) ||\n value.startedAtEpoch <= 0 ||\n value.startedAtEpoch > 8.64e15 - 2 * 86_400_000 ||\n !Number.isFinite(value.durationMs) ||\n value.durationMs < 0 ||\n value.durationMs > 86_400_000 ||\n !Number.isInteger(value.status) ||\n value.status < 100 ||\n value.status > 599\n ) {\n return undefined;\n }\n return {\n rayId: value.rayId.toLowerCase(),\n startedAtEpoch: Math.round(value.startedAtEpoch),\n durationMs: Math.round(value.durationMs),\n status: value.status,\n };\n}\n"],"names":["MAX_CORRELATED_REQUESTS","MAX_JOURNEY_CORRELATED_REQUESTS","sanitizeRequestCorrelation","value","rayId","test","Number","isFinite","startedAtEpoch","durationMs","isInteger","status","undefined","toLowerCase","Math","round"],"mappings":"AAEA,OAAO,MAAMA,0BAA0B,EAAE;AACzC,OAAO,MAAMC,kCAAkC,GAAG;AAElD,wFAAwF,GACxF,OAAO,SAASC,2BACZC,KAA0B;IAE1B,IACI,CAACA,SACD,OAAOA,MAAMC,KAAK,KAAK,YACvB,CAAC,gCAAgCC,IAAI,CAACF,MAAMC,KAAK,KACjD,CAACE,OAAOC,QAAQ,CAACJ,MAAMK,cAAc,KACrCL,MAAMK,cAAc,IAAI,KACxBL,MAAMK,cAAc,GAAG,UAAU,IAAI,YACrC,CAACF,OAAOC,QAAQ,CAACJ,MAAMM,UAAU,KACjCN,MAAMM,UAAU,GAAG,KACnBN,MAAMM,UAAU,GAAG,YACnB,CAACH,OAAOI,SAAS,CAACP,MAAMQ,MAAM,KAC9BR,MAAMQ,MAAM,GAAG,OACfR,MAAMQ,MAAM,GAAG,KACjB;QACE,OAAOC;IACX;IACA,OAAO;QACHR,OAAOD,MAAMC,KAAK,CAACS,WAAW;QAC9BL,gBAAgBM,KAAKC,KAAK,CAACZ,MAAMK,cAAc;QAC/CC,YAAYK,KAAKC,KAAK,CAACZ,MAAMM,UAAU;QACvCE,QAAQR,MAAMQ,MAAM;IACxB;AACJ"}
|
|
1
|
+
{"version":3,"sources":["../../src/core/request-correlation.ts"],"sourcesContent":["import type { JourneyRequestEvent } from './types';\n\nexport const MAX_CORRELATED_REQUESTS = 5;\nexport const MAX_JOURNEY_CORRELATED_REQUESTS = 20;\n\n/** Only allow a Cloudflare Ray ID and bounded numeric response metadata onto the wire. */\nexport function sanitizeRequestCorrelation(\n value: JourneyRequestEvent\n): JourneyRequestEvent | undefined {\n if (\n !value ||\n typeof value.rayId !== 'string' ||\n !/^[a-f0-9]{16}(?:-[a-z]{3})?$/i.test(value.rayId) ||\n !Number.isFinite(value.startedAtEpoch) ||\n value.startedAtEpoch <= 0 ||\n value.startedAtEpoch > 8.64e15 - 2 * 86_400_000 ||\n !Number.isFinite(value.durationMs) ||\n value.durationMs < 0 ||\n value.durationMs > 86_400_000 ||\n !Number.isInteger(value.status) ||\n value.status < 100 ||\n value.status > 599\n ) {\n return undefined;\n }\n return {\n rayId: value.rayId.toLowerCase(),\n startedAtEpoch: Math.round(value.startedAtEpoch),\n durationMs: Math.round(value.durationMs),\n status: value.status,\n };\n}\n\n/** Production monolith origins whose Ray IDs have been verified against the log data view. */\nexport function isMonolithLogOrigin(value: string): boolean {\n try {\n const url = new URL(value);\n return (\n url.protocol === 'https:' &&\n !url.port &&\n !url.username &&\n !url.password &&\n (url.hostname === 'go.servicetitan.com' ||\n /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:_[a-z0-9-]+)*\\.eh\\.go\\.servicetitan\\.com$/i.test(\n url.hostname\n ))\n );\n } catch {\n return false;\n }\n}\n"],"names":["MAX_CORRELATED_REQUESTS","MAX_JOURNEY_CORRELATED_REQUESTS","sanitizeRequestCorrelation","value","rayId","test","Number","isFinite","startedAtEpoch","durationMs","isInteger","status","undefined","toLowerCase","Math","round","isMonolithLogOrigin","url","URL","protocol","port","username","password","hostname"],"mappings":"AAEA,OAAO,MAAMA,0BAA0B,EAAE;AACzC,OAAO,MAAMC,kCAAkC,GAAG;AAElD,wFAAwF,GACxF,OAAO,SAASC,2BACZC,KAA0B;IAE1B,IACI,CAACA,SACD,OAAOA,MAAMC,KAAK,KAAK,YACvB,CAAC,gCAAgCC,IAAI,CAACF,MAAMC,KAAK,KACjD,CAACE,OAAOC,QAAQ,CAACJ,MAAMK,cAAc,KACrCL,MAAMK,cAAc,IAAI,KACxBL,MAAMK,cAAc,GAAG,UAAU,IAAI,YACrC,CAACF,OAAOC,QAAQ,CAACJ,MAAMM,UAAU,KACjCN,MAAMM,UAAU,GAAG,KACnBN,MAAMM,UAAU,GAAG,YACnB,CAACH,OAAOI,SAAS,CAACP,MAAMQ,MAAM,KAC9BR,MAAMQ,MAAM,GAAG,OACfR,MAAMQ,MAAM,GAAG,KACjB;QACE,OAAOC;IACX;IACA,OAAO;QACHR,OAAOD,MAAMC,KAAK,CAACS,WAAW;QAC9BL,gBAAgBM,KAAKC,KAAK,CAACZ,MAAMK,cAAc;QAC/CC,YAAYK,KAAKC,KAAK,CAACZ,MAAMM,UAAU;QACvCE,QAAQR,MAAMQ,MAAM;IACxB;AACJ;AAEA,4FAA4F,GAC5F,OAAO,SAASK,oBAAoBb,KAAa;IAC7C,IAAI;QACA,MAAMc,MAAM,IAAIC,IAAIf;QACpB,OACIc,IAAIE,QAAQ,KAAK,YACjB,CAACF,IAAIG,IAAI,IACT,CAACH,IAAII,QAAQ,IACb,CAACJ,IAAIK,QAAQ,IACZL,CAAAA,IAAIM,QAAQ,KAAK,yBACd,gFAAgFlB,IAAI,CAChFY,IAAIM,QAAQ,CAChB;IAEZ,EAAE,eAAM;QACJ,OAAO;IACX;AACJ"}
|
package/dist/core/runtime.js
CHANGED
|
@@ -165,12 +165,12 @@ function toName(target) {
|
|
|
165
165
|
...s.attributes
|
|
166
166
|
}
|
|
167
167
|
} : {},
|
|
168
|
-
...
|
|
168
|
+
...((_s_requests = s.requests) === null || _s_requests === void 0 ? void 0 : _s_requests.length) ? {
|
|
169
169
|
requests: s.requests.map((request)=>({
|
|
170
170
|
...request
|
|
171
171
|
}))
|
|
172
172
|
} : {},
|
|
173
|
-
...
|
|
173
|
+
...s.requestsTruncated ? {
|
|
174
174
|
requestsTruncated: true
|
|
175
175
|
} : {}
|
|
176
176
|
};
|
package/dist/core/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/runtime.ts"],"sourcesContent":["import {\n getAutoAttributeRequests as getSharedAutoAttributeRequests,\n getHttpAbortedRequestsPolicy as getSharedHttpAbortedRequestsPolicy,\n getHttpClientErrorRequestsPolicy as getSharedHttpClientErrorRequestsPolicy,\n getSharedSlowRequests,\n isJourneyDebugEnabled,\n} from '../global';\nimport { isCanceledError } from './abort-error';\nimport {\n resolveEndpointPolicy,\n sortEndpointsByLongestMatch,\n type SlowRequestConfig,\n} from './endpoint-policy';\nimport { deserializeJourneyState, projectJourneyState } from './persist';\nimport {\n clampMaxSteps,\n DEFAULT_MAX_STEPS,\n DEFAULT_JOURNEY_IDLE_MS,\n finiteSlowRequestMs,\n finiteTimeoutMs,\n MAX_ATTRIBUTED_REQUEST_KEYS,\n MAX_TAG_KEYS,\n resolveJourneyTimeoutMs,\n} from './limits';\nimport { assignRecord, emptyRecord, sanitizeJourneyEvent, setSafeAttribute } from './sanitize';\nimport { JourneyStepStamp, resolveStampOpts } from './step-tag';\nimport type { RequestPolicyConfig } from './request-policy';\nimport {\n JOURNEY_ENGINE,\n type JourneyDef,\n type JourneyEngine,\n type JourneyEvent,\n type JourneyNameLike,\n type JourneySink,\n type JourneyState,\n type JourneyStepEvent,\n type JourneyStepOptions,\n type JourneyStepTarget,\n type Outcome,\n type SerializedJourneyState,\n type StepHandle,\n type StepRecord,\n type TagValue,\n} from './types';\n\nconst DEFAULT_SLOW_REQUESTS: SlowRequestConfig = { defaultMs: 4_000, endpoints: [] };\n\nconst noopStep: StepHandle = {\n journeyName: null,\n setAttribute() {},\n setTags() {},\n completeJourney() {},\n failJourney() {},\n stamp: () => undefined,\n};\n\nfunction toName(target: JourneyNameLike): string {\n if (typeof target === 'string') {\n return target;\n }\n return 'config' in target ? target.config.name : target.name;\n}\n\n/** @internal Private — not part of the public package API. */\nexport interface JourneyRuntimeOptions {\n /**\n * DevTools label for this engine copy (`__stJourney.getDebugState().runtimes`).\n * Auto-assigned `runtime-N` from the current `__stJourney` registration count\n * when omitted at `registerJourneyRuntime`.\n */\n id?: string;\n /** Initial sinks. Defaults to `[]` — package bootstrap installs Datadog on the module runtime. */\n sinks?: readonly JourneySink[];\n slowRequests?: SlowRequestConfig;\n /** Cap recorded steps; default 50. */\n maxSteps?: number;\n /** Default timeout when JourneyDef.timeoutMs is omitted. 0 disables idle countdown. */\n defaultJourneyIdleMs?: number;\n}\n\n/** @internal Read-only snapshot for DevTools (`__stJourney.getDebugState`; empty unless debugging). */\nexport interface JourneyRuntimeDebugSnapshot {\n id: string;\n openJourneys: readonly {\n name: string;\n team: string;\n group: string;\n service: string;\n verdict: Outcome;\n reason: string | null;\n tags: Record<string, TagValue>;\n stepsInFlight: readonly string[];\n steps: readonly {\n name: string;\n outcome: 'good' | 'bad';\n durationMs: number;\n reason?: string;\n attributedRequestKeys?: readonly string[];\n }[];\n }[];\n activeStep: { journey: string; name: string } | null;\n /** Which shared policy knobs this runtime overrode (false = inherit global). */\n policyOverlay: {\n slowRequests: boolean;\n httpAbortedRequests: boolean;\n httpClientErrorRequests: boolean;\n autoAttributeRequests: boolean;\n };\n}\n\n/** @internal Freeze a caller-supplied journey def + tags snapshot. */\nexport function freezeJourneyDef(config: JourneyDef, tags: Record<string, TagValue>): JourneyDef {\n const endpoints = sortEndpointsByLongestMatch(config.endpoints);\n return Object.freeze({\n ...config,\n timeoutMs: config.timeoutMs !== undefined ? finiteTimeoutMs(config.timeoutMs) : undefined,\n stepTimeoutMs:\n config.stepTimeoutMs !== undefined ? finiteTimeoutMs(config.stepTimeoutMs) : undefined,\n slowRequestMs: finiteSlowRequestMs(config.slowRequestMs),\n maxSteps: config.maxSteps !== undefined ? clampMaxSteps(config.maxSteps) : undefined,\n endpoints: endpoints ? Object.freeze([...endpoints]) : undefined,\n expected: config.expected ? Object.freeze([...config.expected]) : undefined,\n tags: Object.freeze({ ...tags }),\n });\n}\n\n/**\n * @internal Private — not part of the public package API.\n * Isolated journey engine (open journeys, ambient steps, sinks, request thresholds).\n * App code should keep using free helpers (`defineJourney`, `journeyStep`, …) — they\n * bind to the module runtime. Prefer `resetJourney()` in tests.\n */\nexport interface JourneyRuntime {\n /** DevTools id for this engine copy. Auto `runtime-N` when registered without an id. */\n readonly id: string;\n getSlowRequests(): SlowRequestConfig;\n setSlowRequests(next: SlowRequestConfig): void;\n getMaxSteps(): number;\n setMaxSteps(next: number): void;\n getDefaultJourneyIdleMs(): number;\n setDefaultJourneyIdleMs(next: number): void;\n\n setSinks(next: readonly JourneySink[]): void;\n /** First `configureJourney({ sinks })` on this runtime wins. Returns false if already set. */\n trySetConfiguredSinks(next: readonly JourneySink[]): boolean;\n addSink(sink: JourneySink): void;\n emit(payload: JourneyEvent): void;\n\n setPolicyOverlay(next: {\n slowRequests?: SlowRequestConfig;\n httpAbortedRequests?: RequestPolicyConfig;\n httpClientErrorRequests?: RequestPolicyConfig;\n autoAttributeRequests?: boolean;\n }): void;\n getAutoAttributeRequests(): boolean;\n getHttpAbortedRequestsPolicy(): RequestPolicyConfig;\n getHttpClientErrorRequestsPolicy(): RequestPolicyConfig;\n\n getOpenJourney(name: string): JourneyState | undefined;\n /** @internal DevTools snapshot of open journeys / ambient step. */\n getDebugSnapshot(): JourneyRuntimeDebugSnapshot;\n firstOpenJourneyName(names: readonly string[]): string | null;\n setJourneyTags(name: string | null, tags: Record<string, TagValue>): void;\n startJourney(config: JourneyDef): void;\n failJourney(journey: JourneyState, reason: string): void;\n completeJourney(name: string | null, tags?: Record<string, TagValue>): void;\n completeJourneyState(journey: JourneyState, tags?: Record<string, TagValue>): void;\n excludeJourney(journey: JourneyState): void;\n updateOpenJourney(config: JourneyDef): void;\n /**\n * @internal Snapshot an open journey for cross-page transfer. Does NOT\n * close the journey. Returns `null` when no journey is open under `name`.\n */\n serializeJourneyState(name: string): SerializedJourneyState | null;\n /**\n * @internal Rehydrate a serialized journey onto this runtime. Returns\n * `null` (after emitting a `bad` `journey-timeout` event) when the journey\n * already exhausted its budget in transit.\n */\n restoreJourney(serialized: SerializedJourneyState, config: JourneyDef): JourneyState | null;\n\n activeJourneyStep(): StepRecord | null;\n journeyStep<T>(\n journey: JourneyStepTarget,\n stepName: string,\n fn: (step: StepHandle) => T | Promise<T>,\n opts?: JourneyStepOptions\n ): Promise<T>;\n journeyMountStep<T>(\n journey: JourneyStepTarget,\n stepName: string,\n fn: (step: StepHandle) => T | Promise<T>,\n opts?: JourneyStepOptions\n ): Promise<T>;\n\n reportBackendRequest(\n step: StepRecord | undefined,\n status: number | undefined,\n durationMs: number,\n requestKey: string\n ): void;\n /** True when this request key is ignored for the step's journey (never changes verdict). */\n shouldIgnoreRequest(journey: JourneyState, key: string): boolean;\n\n /** Close open journeys, clear ambient steps, restore default timeouts/sinks. */\n reset(options?: JourneyRuntimeOptions): void;\n}\n\n/** @internal Bind the fail/exclude/report hooks for a journey's creating engine. */\nexport function bindJourneyEngine(\n api: JourneyRuntime,\n journey: JourneyState,\n shouldIgnoreRequest: (target: JourneyState, key: string) => boolean\n): JourneyEngine {\n return {\n failJourney(reason) {\n api.failJourney(journey, reason);\n },\n exclude() {\n api.excludeJourney(journey);\n },\n shouldIgnoreRequest(key) {\n return shouldIgnoreRequest(journey, key);\n },\n reportBackendRequest(step, status, durationMs, requestKey) {\n api.reportBackendRequest(step, status, durationMs, requestKey);\n },\n getHttpAbortedRequestsPolicy() {\n return api.getHttpAbortedRequestsPolicy();\n },\n getHttpClientErrorRequestsPolicy() {\n return api.getHttpClientErrorRequestsPolicy();\n },\n };\n}\n\n/**\n * @internal Private — not part of the public package API.\n * Build an isolated engine. Rarely needed — apps use the default via free helpers.\n */\nexport function createJourneyRuntime(options: JourneyRuntimeOptions = {}): JourneyRuntime {\n let id = typeof options.id === 'string' && options.id !== '' ? options.id : '';\n const journeys = new Map<string, JourneyState>();\n const inFlight = new Set<StepRecord>();\n let sinks: JourneySink[] = [...(options.sinks ?? [])];\n let sinksConfigured = false;\n let overlay: {\n slowRequests?: SlowRequestConfig;\n httpAbortedRequests?: RequestPolicyConfig;\n httpClientErrorRequests?: RequestPolicyConfig;\n autoAttributeRequests?: boolean;\n } = {};\n let slowRequests: SlowRequestConfig = {\n defaultMs: options.slowRequests?.defaultMs ?? DEFAULT_SLOW_REQUESTS.defaultMs,\n endpoints: sortEndpointsByLongestMatch(\n options.slowRequests?.endpoints ?? DEFAULT_SLOW_REQUESTS.endpoints\n ),\n };\n let maxSteps = clampMaxSteps(options.maxSteps ?? DEFAULT_MAX_STEPS);\n let defaultJourneyIdleMs = finiteTimeoutMs(\n options.defaultJourneyIdleMs ?? DEFAULT_JOURNEY_IDLE_MS\n );\n\n function getInFlightSteps(journey: JourneyState): StepRecord[] {\n const out: StepRecord[] = [];\n for (const step of inFlight) {\n if (step.journey === journey) {\n out.push(step);\n }\n }\n return out;\n }\n\n function enterStep(step: StepRecord): void {\n inFlight.add(step);\n }\n\n function leaveStep(step: StepRecord): void {\n inFlight.delete(step);\n }\n\n function releaseInFlightSteps(journey: JourneyState): void {\n for (const step of [...inFlight]) {\n if (step.journey !== journey) {\n continue;\n }\n if (step.durationMs === 0) {\n step.durationMs = Math.round(globalThis.performance.now() - step.startedAt);\n }\n inFlight.delete(step);\n }\n }\n\n function clearCountdown(journey: JourneyState): void {\n if (journey.timer != null) {\n clearTimeout(journey.timer);\n journey.timer = null;\n }\n }\n\n function emit(payload: JourneyEvent): void {\n const safePayload = sanitizeJourneyEvent(payload);\n for (const sink of sinks) {\n try {\n sink(safePayload);\n } catch {\n // One sinking throw must not block the remaining sinks.\n }\n }\n }\n\n function finish(journey: JourneyState, outcome: Outcome, reason?: string): void {\n if (journey.closed) {\n return;\n }\n journey.closed = true;\n if (journeys.get(journey.name) === journey) {\n journeys.delete(journey.name);\n }\n clearCountdown(journey);\n releaseInFlightSteps(journey);\n\n let finalReason = journey.reason ?? reason;\n let finalOutcome = outcome;\n const durationMs = Math.round(globalThis.performance.now() - journey.startedAt);\n if (journey.timeoutExplicit && journey.timeoutMs > 0 && durationMs > journey.timeoutMs) {\n finalOutcome = 'bad';\n finalReason = finalReason ?? 'journey-timeout';\n }\n\n const steps: JourneyStepEvent[] = journey.steps.map(s => ({\n name: s.name,\n startMs: Math.round(s.startedAt - journey.startedAt),\n durationMs: s.durationMs,\n outcome: s.outcome,\n ...(s.reason ? { reason: s.reason } : {}),\n ...(s.httpStatus !== undefined ? { httpStatus: s.httpStatus } : {}),\n ...(Object.keys(s.attributes).length ? { attributes: { ...s.attributes } } : {}),\n ...(finalOutcome === 'bad' && s.requests?.length\n ? { requests: s.requests.map(request => ({ ...request })) }\n : {}),\n ...(finalOutcome === 'bad' && s.requestsTruncated ? { requestsTruncated: true } : {}),\n }));\n\n emit({\n journey: {\n name: journey.name,\n team: journey.team,\n group: journey.group,\n service: journey.service,\n outcome: finalOutcome,\n ...(finalOutcome === 'bad' && journey.scoringRequest\n ? { failedRequest: { ...journey.scoringRequest } }\n : {}),\n ...(finalReason ? { reason: finalReason } : {}),\n durationMs,\n steps,\n ...(journey.expected ? { expected: journey.expected } : {}),\n ...(Object.keys(journey.tags).length ? { tags: { ...journey.tags } } : {}),\n },\n });\n }\n\n function armCountdown(journey: JourneyState, delayMs: number = journey.timeoutMs): void {\n if (delayMs <= 0) {\n return;\n }\n journey.timer = setTimeout(() => {\n if (journey.timeoutExplicit) {\n finish(journey, 'bad', 'journey-timeout');\n return;\n }\n finish(journey, journey.verdict === 'bad' ? 'bad' : 'excluded', 'journey-idle-timeout');\n }, delayMs);\n }\n\n function effectiveSlowRequests(): SlowRequestConfig {\n return overlay.slowRequests ?? getSharedSlowRequests() ?? slowRequests;\n }\n\n function shouldIgnoreRequest(journey: JourneyState, key: string): boolean {\n return resolveEndpointPolicy(journey, effectiveSlowRequests(), key).ignore;\n }\n\n function trackAttributedKey(step: StepRecord, requestKey: string): void {\n if (!requestKey) {\n return;\n }\n step.attributedRequestKeys ??= [];\n if (step.attributedRequestKeys.length >= MAX_ATTRIBUTED_REQUEST_KEYS) {\n return;\n }\n if (!step.attributedRequestKeys.includes(requestKey)) {\n step.attributedRequestKeys.push(requestKey);\n }\n }\n\n function resolveJourneyName(journey: JourneyStepTarget): string | null {\n if (journey == null) {\n return null;\n }\n if (typeof journey === 'string' || !Array.isArray(journey)) {\n return toName(journey as JourneyNameLike);\n }\n return api.firstOpenJourneyName(journey.map(toName));\n }\n\n function configFromTarget(target: JourneyNameLike): JourneyDef | undefined {\n if (typeof target === 'string') {\n return undefined;\n }\n if ('config' in target && target.config != null && typeof target.config === 'object') {\n return target.config;\n }\n const rec = target as {\n name?: unknown;\n team?: unknown;\n group?: unknown;\n service?: unknown;\n };\n if (\n typeof rec.name === 'string' &&\n typeof rec.team === 'string' &&\n typeof rec.group === 'string' &&\n typeof rec.service === 'string'\n ) {\n return target as JourneyDef;\n }\n return undefined;\n }\n\n function maybeAutoStart(target: JourneyStepTarget): void {\n if (target == null || typeof target === 'string' || Array.isArray(target)) {\n return;\n }\n const def = configFromTarget(target as JourneyNameLike);\n if (def && !api.getOpenJourney(def.name)) {\n api.startJourney(def);\n }\n }\n\n function createStepHandle(journeyName: string, step: StepRecord): StepHandle {\n return {\n journeyName,\n setAttribute(key, value) {\n setSafeAttribute(step.attributes, key, value);\n },\n setTags(tags) {\n if (step.journey.closed) {\n return;\n }\n assignRecord(step.journey.tags, tags, MAX_TAG_KEYS);\n },\n completeJourney(tags) {\n api.completeJourneyState(step.journey, tags);\n },\n failJourney(reason) {\n api.failJourney(step.journey, reason);\n },\n // Box in JourneyStepStamp — raw StepRecord is circular and blows jQuery/axios deep-merge.\n stamp: scoreOrOpts => new JourneyStepStamp(step, resolveStampOpts(scoreOrOpts)),\n };\n }\n\n const api: JourneyRuntime = {\n get id() {\n return id;\n },\n set id(next: string) {\n id = next;\n },\n getSlowRequests() {\n return effectiveSlowRequests();\n },\n\n setSlowRequests(next) {\n slowRequests = {\n ...next,\n endpoints: sortEndpointsByLongestMatch(next.endpoints),\n };\n },\n\n getMaxSteps() {\n return maxSteps;\n },\n\n setMaxSteps(next) {\n maxSteps = clampMaxSteps(next);\n },\n\n getDefaultJourneyIdleMs() {\n return defaultJourneyIdleMs;\n },\n\n setDefaultJourneyIdleMs(next) {\n defaultJourneyIdleMs = finiteTimeoutMs(next);\n },\n\n setSinks(next) {\n sinks = [...next];\n },\n\n trySetConfiguredSinks(next) {\n if (sinksConfigured) {\n return false;\n }\n sinks = [...next];\n sinksConfigured = true;\n return true;\n },\n\n addSink(sink) {\n sinks.push(sink);\n },\n\n emit,\n\n setPolicyOverlay(next) {\n overlay = { ...overlay, ...next };\n },\n\n getAutoAttributeRequests() {\n if (overlay.autoAttributeRequests !== undefined) {\n return overlay.autoAttributeRequests;\n }\n return getSharedAutoAttributeRequests();\n },\n\n getHttpAbortedRequestsPolicy() {\n return overlay.httpAbortedRequests ?? getSharedHttpAbortedRequestsPolicy();\n },\n\n getHttpClientErrorRequestsPolicy() {\n return overlay.httpClientErrorRequests ?? getSharedHttpClientErrorRequestsPolicy();\n },\n\n getOpenJourney(name) {\n return journeys.get(name);\n },\n\n getDebugSnapshot() {\n const active = api.activeJourneyStep();\n return {\n id: api.id,\n openJourneys: [...journeys.values()].map(journey => ({\n name: journey.name,\n team: journey.team,\n group: journey.group,\n service: journey.service,\n verdict: journey.verdict,\n reason: journey.reason,\n tags: { ...journey.tags },\n stepsInFlight: getInFlightSteps(journey).map(step => step.name),\n steps: journey.steps.map(step => ({\n name: step.name,\n outcome: step.outcome,\n durationMs: step.durationMs,\n ...(step.reason ? { reason: step.reason } : {}),\n ...(step.attributedRequestKeys?.length\n ? { attributedRequestKeys: [...step.attributedRequestKeys] }\n : {}),\n })),\n })),\n activeStep: active ? { journey: active.journey.name, name: active.name } : null,\n policyOverlay: {\n slowRequests: overlay.slowRequests != null,\n httpAbortedRequests: overlay.httpAbortedRequests != null,\n httpClientErrorRequests: overlay.httpClientErrorRequests != null,\n autoAttributeRequests: overlay.autoAttributeRequests != null,\n },\n };\n },\n\n firstOpenJourneyName(names) {\n for (const name of names) {\n if (journeys.has(name)) {\n return name;\n }\n }\n return null;\n },\n\n setJourneyTags(name, tags) {\n const journey = name ? journeys.get(name) : undefined;\n if (journey) {\n assignRecord(journey.tags, tags, MAX_TAG_KEYS);\n }\n },\n\n startJourney(config) {\n const existing = journeys.get(config.name);\n if (existing) {\n finish(existing, existing.verdict === 'bad' ? 'bad' : 'excluded');\n }\n\n const tags = emptyRecord();\n assignRecord(tags, config.tags, MAX_TAG_KEYS);\n const snapshot = freezeJourneyDef(config, tags);\n const timeout = resolveJourneyTimeoutMs(snapshot.timeoutMs, defaultJourneyIdleMs);\n const journey: JourneyState = {\n config: snapshot,\n name: snapshot.name,\n team: snapshot.team,\n group: snapshot.group,\n service: snapshot.service,\n verdict: 'good',\n startedAt: globalThis.performance.now(),\n timeoutMs: timeout.ms,\n timeoutExplicit: timeout.explicit,\n stepTimeoutMs:\n snapshot.stepTimeoutMs !== undefined\n ? finiteTimeoutMs(snapshot.stepTimeoutMs)\n : undefined,\n reason: null,\n steps: [],\n expected: snapshot.expected ? [...snapshot.expected] : null,\n tags,\n slowRequestMs: finiteSlowRequestMs(snapshot.slowRequestMs),\n endpoints: snapshot.endpoints,\n timer: null,\n closed: false,\n maxSteps:\n snapshot.maxSteps !== undefined ? clampMaxSteps(snapshot.maxSteps) : undefined,\n };\n journeys.set(config.name, journey);\n journey[JOURNEY_ENGINE] = bindJourneyEngine(api, journey, shouldIgnoreRequest);\n armCountdown(journey);\n },\n\n failJourney(journey, reason) {\n if (journey.closed) {\n return;\n }\n journey.verdict = 'bad';\n journey.reason ??= reason;\n finish(journey, 'bad');\n },\n\n completeJourney(name, tags) {\n if (!name) {\n return;\n }\n const journey = journeys.get(name);\n if (journey) {\n api.completeJourneyState(journey, tags);\n }\n },\n\n completeJourneyState(journey, tags) {\n if (journey.closed) {\n return;\n }\n if (tags) {\n assignRecord(journey.tags, tags, MAX_TAG_KEYS);\n }\n finish(journey, journey.verdict === 'bad' ? 'bad' : 'good');\n },\n\n excludeJourney(journey) {\n if (journey.closed) {\n return;\n }\n finish(journey, journey.verdict === 'bad' ? 'bad' : 'excluded');\n },\n\n updateOpenJourney(config) {\n const journey = journeys.get(config.name);\n if (!journey || journey.closed) {\n return;\n }\n journey.team = config.team;\n journey.group = config.group;\n journey.service = config.service;\n const timeout = resolveJourneyTimeoutMs(config.timeoutMs, defaultJourneyIdleMs);\n journey.timeoutMs = timeout.ms;\n journey.timeoutExplicit = timeout.explicit;\n journey.stepTimeoutMs =\n config.stepTimeoutMs !== undefined\n ? finiteTimeoutMs(config.stepTimeoutMs)\n : undefined;\n journey.slowRequestMs = finiteSlowRequestMs(config.slowRequestMs);\n journey.endpoints = sortEndpointsByLongestMatch(config.endpoints);\n journey.expected = config.expected ? [...config.expected] : null;\n journey.maxSteps =\n config.maxSteps !== undefined ? clampMaxSteps(config.maxSteps) : undefined;\n if (config.tags) {\n assignRecord(journey.tags, config.tags, MAX_TAG_KEYS);\n }\n clearCountdown(journey);\n if (journey.timeoutMs <= 0) {\n return;\n }\n const elapsedMs = globalThis.performance.now() - journey.startedAt;\n const remainingMs = journey.timeoutMs - elapsedMs;\n if (remainingMs <= 0) {\n if (journey.timeoutExplicit) {\n finish(journey, 'bad', 'journey-timeout');\n return;\n }\n finish(\n journey,\n journey.verdict === 'bad' ? 'bad' : 'excluded',\n 'journey-idle-timeout'\n );\n return;\n }\n armCountdown(journey, remainingMs);\n },\n\n serializeJourneyState(name) {\n const journey = journeys.get(name);\n if (!journey || journey.closed) {\n return null;\n }\n return projectJourneyState(journey);\n },\n\n restoreJourney(serialized, config) {\n // Refuse double-registration: leave an existing journey under this name in place.\n if (journeys.has(config.name)) {\n return null;\n }\n\n const journey = deserializeJourneyState(serialized, config, api, defaultJourneyIdleMs);\n\n if (journey.timeoutMs > 0) {\n const elapsedMs = globalThis.performance.now() - journey.startedAt;\n if (elapsedMs >= journey.timeoutMs) {\n // journey not yet in journeys Map — finish() handles unregistered journeys gracefully.\n if (journey.timeoutExplicit) {\n finish(journey, 'bad', 'journey-timeout');\n } else {\n finish(\n journey,\n journey.verdict === 'bad' ? 'bad' : 'excluded',\n 'journey-idle-timeout'\n );\n }\n return null;\n }\n\n journeys.set(config.name, journey);\n\n const remainingMs = journey.timeoutMs - elapsedMs;\n if (remainingMs > 0) {\n armCountdown(journey, remainingMs);\n }\n } else {\n journeys.set(config.name, journey);\n }\n\n return journey;\n },\n\n activeJourneyStep() {\n if (!api.getAutoAttributeRequests()) {\n return null;\n }\n if (inFlight.size !== 1) {\n return null;\n }\n return inFlight.values().next().value ?? null;\n },\n\n async journeyStep(journey, stepName, fn, opts) {\n maybeAutoStart(journey);\n const journeyName = resolveJourneyName(journey);\n const open = journeyName ? journeys.get(journeyName) : undefined;\n if (!open || !journeyName) {\n if (isJourneyDebugEnabled()) {\n // eslint-disable-next-line no-console -- debug-only untraced hint\n console.debug(`[journey] step \"${stepName}\" ran untraced (no open journey)`);\n }\n return fn(noopStep);\n }\n\n const step: StepRecord = {\n name: stepName,\n startedAt: globalThis.performance.now(),\n durationMs: 0,\n outcome: 'good',\n attributes: emptyRecord(),\n journey: open,\n };\n const cap = open.maxSteps ?? maxSteps;\n if (open.steps.length >= cap) {\n open.tags.steps_truncated = true;\n } else {\n open.steps.push(step);\n }\n\n const handle = createStepHandle(journeyName, step);\n\n const stepTimeoutMs = opts?.timeoutMs ?? open.stepTimeoutMs ?? 0;\n let timeoutTimer: ReturnType<typeof setTimeout> | null = null;\n if (stepTimeoutMs > 0) {\n timeoutTimer = setTimeout(() => {\n if (open.closed) {\n return;\n }\n step.outcome = 'bad';\n step.reason ??= 'step-timeout';\n step.attributes.timeout_ms ??= stepTimeoutMs;\n step.durationMs = Math.round(globalThis.performance.now() - step.startedAt);\n api.failJourney(open, 'step-timeout');\n }, stepTimeoutMs);\n }\n\n enterStep(step);\n try {\n return await fn(handle);\n } catch (err) {\n if (isCanceledError(err)) {\n /*\n * Attributed abort is scored in onHttpComplete. Unattributed /\n * ignored abort throws must not apply policy (empty requestKey).\n */\n } else {\n step.outcome = 'bad';\n step.reason ??= 'step-error';\n api.failJourney(open, 'step-error');\n }\n throw err;\n } finally {\n if (timeoutTimer != null) {\n clearTimeout(timeoutTimer);\n }\n if (step.durationMs === 0) {\n step.durationMs = Math.round(globalThis.performance.now() - step.startedAt);\n }\n leaveStep(step);\n }\n },\n\n async journeyMountStep(journey, stepName, fn, opts) {\n await Promise.resolve();\n return api.journeyStep(journey, stepName, fn, opts);\n },\n\n shouldIgnoreRequest,\n\n reportBackendRequest(step, status, durationMs, requestKey) {\n if (!step?.journey) {\n return;\n }\n const journey = step.journey;\n if (journey.closed) {\n return;\n }\n trackAttributedKey(step, requestKey);\n const endpointPolicy = resolveEndpointPolicy(\n journey,\n effectiveSlowRequests(),\n requestKey\n );\n if (endpointPolicy.ignore) {\n return;\n }\n\n const failed = status === undefined || status >= 500;\n const threshold = endpointPolicy.slowRequestMs;\n const slow = threshold > 0 && durationMs > threshold;\n if (!failed && !slow) {\n return;\n }\n\n const category = failed ? 'request-error' : 'request-latency';\n\n step.outcome = 'bad';\n step.reason ??= category;\n if (failed && status !== undefined) {\n step.httpStatus = status;\n }\n\n api.failJourney(journey, category);\n },\n\n reset(next = {}) {\n for (const journey of [...journeys.values()]) {\n clearCountdown(journey);\n journey.closed = true;\n }\n journeys.clear();\n inFlight.clear();\n overlay = {};\n sinksConfigured = false;\n sinks = [...(next.sinks ?? [])];\n slowRequests = {\n defaultMs: next.slowRequests?.defaultMs ?? DEFAULT_SLOW_REQUESTS.defaultMs,\n endpoints: sortEndpointsByLongestMatch(\n next.slowRequests?.endpoints ?? DEFAULT_SLOW_REQUESTS.endpoints\n ),\n };\n maxSteps =\n next.maxSteps !== undefined ? clampMaxSteps(next.maxSteps) : DEFAULT_MAX_STEPS;\n defaultJourneyIdleMs = finiteTimeoutMs(\n next.defaultJourneyIdleMs ?? DEFAULT_JOURNEY_IDLE_MS\n );\n },\n };\n\n return api;\n}\n\n/**\n * @internal Private — not part of the public package API.\n * Module-scoped engine used by free helpers. App code does not need to touch this.\n * Each host/MFE bundle gets its own copy when the package is duplicated.\n */\nexport const moduleRuntime: JourneyRuntime = createJourneyRuntime();\n\nconst noopEngine: JourneyEngine = {\n failJourney() {},\n exclude() {},\n shouldIgnoreRequest() {\n return false;\n },\n reportBackendRequest() {},\n getHttpAbortedRequestsPolicy() {\n return 'continue';\n },\n getHttpClientErrorRequestsPolicy() {\n return 'continue';\n },\n};\n\n/**\n * True when this bundle can fail/exclude/report the journey: stamped engine, or\n * this runtime's own unstamped object. False for a foreign older-copy journey.\n */\nexport function canRouteHttpToJourney(journey: JourneyState): boolean {\n return (\n journey[JOURNEY_ENGINE] != null || moduleRuntime.getOpenJourney(journey.name) === journey\n );\n}\n\n/**\n * @internal Prefer the creating engine on a journey (MFE `step.stamp()` on a host transport).\n * Falls back to this bundle's module runtime only when this runtime owns the object.\n * Unstamped foreign journeys (older package copies) are a no-op so a same-named\n * host journey is not deleted from this map.\n */\nexport function resolveJourneyEngine(journey: JourneyState): JourneyEngine {\n const stamped = journey[JOURNEY_ENGINE];\n if (stamped) {\n return stamped;\n }\n if (moduleRuntime.getOpenJourney(journey.name) !== journey) {\n return noopEngine;\n }\n return {\n failJourney(reason) {\n moduleRuntime.failJourney(journey, reason);\n },\n exclude() {\n moduleRuntime.excludeJourney(journey);\n },\n shouldIgnoreRequest(key) {\n return moduleRuntime.shouldIgnoreRequest(journey, key);\n },\n reportBackendRequest(step, status, durationMs, requestKey) {\n moduleRuntime.reportBackendRequest(step, status, durationMs, requestKey);\n },\n getHttpAbortedRequestsPolicy() {\n return moduleRuntime.getHttpAbortedRequestsPolicy();\n },\n getHttpClientErrorRequestsPolicy() {\n return moduleRuntime.getHttpClientErrorRequestsPolicy();\n },\n };\n}\n\n/**\n * @internal Reset the module engine (open journeys, ambient steps, sinks, slow-request thresholds).\n * Intended for tests — call in `beforeEach` / `afterEach` instead of manual cleanup.\n */\nexport function resetJourney(options?: JourneyRuntimeOptions): void {\n moduleRuntime.reset(options);\n}\n"],"names":["getAutoAttributeRequests","getSharedAutoAttributeRequests","getHttpAbortedRequestsPolicy","getSharedHttpAbortedRequestsPolicy","getHttpClientErrorRequestsPolicy","getSharedHttpClientErrorRequestsPolicy","getSharedSlowRequests","isJourneyDebugEnabled","isCanceledError","resolveEndpointPolicy","sortEndpointsByLongestMatch","deserializeJourneyState","projectJourneyState","clampMaxSteps","DEFAULT_MAX_STEPS","DEFAULT_JOURNEY_IDLE_MS","finiteSlowRequestMs","finiteTimeoutMs","MAX_ATTRIBUTED_REQUEST_KEYS","MAX_TAG_KEYS","resolveJourneyTimeoutMs","assignRecord","emptyRecord","sanitizeJourneyEvent","setSafeAttribute","JourneyStepStamp","resolveStampOpts","JOURNEY_ENGINE","DEFAULT_SLOW_REQUESTS","defaultMs","endpoints","noopStep","journeyName","setAttribute","setTags","completeJourney","failJourney","stamp","undefined","toName","target","config","name","freezeJourneyDef","tags","Object","freeze","timeoutMs","stepTimeoutMs","slowRequestMs","maxSteps","expected","bindJourneyEngine","api","journey","shouldIgnoreRequest","reason","exclude","excludeJourney","key","reportBackendRequest","step","status","durationMs","requestKey","createJourneyRuntime","options","id","journeys","Map","inFlight","Set","sinks","sinksConfigured","overlay","slowRequests","defaultJourneyIdleMs","getInFlightSteps","out","push","enterStep","add","leaveStep","delete","releaseInFlightSteps","Math","round","globalThis","performance","now","startedAt","clearCountdown","timer","clearTimeout","emit","payload","safePayload","sink","finish","outcome","closed","get","finalReason","finalOutcome","timeoutExplicit","steps","map","s","startMs","httpStatus","keys","attributes","length","requests","request","requestsTruncated","team","group","service","scoringRequest","failedRequest","armCountdown","delayMs","setTimeout","verdict","effectiveSlowRequests","ignore","trackAttributedKey","attributedRequestKeys","includes","resolveJourneyName","Array","isArray","firstOpenJourneyName","configFromTarget","rec","maybeAutoStart","def","getOpenJourney","startJourney","createStepHandle","value","completeJourneyState","scoreOrOpts","next","getSlowRequests","setSlowRequests","getMaxSteps","setMaxSteps","getDefaultJourneyIdleMs","setDefaultJourneyIdleMs","setSinks","trySetConfiguredSinks","addSink","setPolicyOverlay","autoAttributeRequests","httpAbortedRequests","httpClientErrorRequests","getDebugSnapshot","active","activeJourneyStep","openJourneys","values","stepsInFlight","activeStep","policyOverlay","names","has","setJourneyTags","existing","snapshot","timeout","ms","explicit","set","updateOpenJourney","elapsedMs","remainingMs","serializeJourneyState","restoreJourney","serialized","size","journeyStep","stepName","fn","opts","open","console","debug","cap","steps_truncated","handle","timeoutTimer","timeout_ms","err","journeyMountStep","Promise","resolve","endpointPolicy","failed","threshold","slow","category","reset","clear","moduleRuntime","noopEngine","canRouteHttpToJourney","resolveJourneyEngine","stamped","resetJourney"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/core/runtime.ts"],"sourcesContent":["import {\n getAutoAttributeRequests as getSharedAutoAttributeRequests,\n getHttpAbortedRequestsPolicy as getSharedHttpAbortedRequestsPolicy,\n getHttpClientErrorRequestsPolicy as getSharedHttpClientErrorRequestsPolicy,\n getSharedSlowRequests,\n isJourneyDebugEnabled,\n} from '../global';\nimport { isCanceledError } from './abort-error';\nimport {\n resolveEndpointPolicy,\n sortEndpointsByLongestMatch,\n type SlowRequestConfig,\n} from './endpoint-policy';\nimport { deserializeJourneyState, projectJourneyState } from './persist';\nimport {\n clampMaxSteps,\n DEFAULT_MAX_STEPS,\n DEFAULT_JOURNEY_IDLE_MS,\n finiteSlowRequestMs,\n finiteTimeoutMs,\n MAX_ATTRIBUTED_REQUEST_KEYS,\n MAX_TAG_KEYS,\n resolveJourneyTimeoutMs,\n} from './limits';\nimport { assignRecord, emptyRecord, sanitizeJourneyEvent, setSafeAttribute } from './sanitize';\nimport { JourneyStepStamp, resolveStampOpts } from './step-tag';\nimport type { RequestPolicyConfig } from './request-policy';\nimport {\n JOURNEY_ENGINE,\n type JourneyDef,\n type JourneyEngine,\n type JourneyEvent,\n type JourneyNameLike,\n type JourneySink,\n type JourneyState,\n type JourneyStepEvent,\n type JourneyStepOptions,\n type JourneyStepTarget,\n type Outcome,\n type SerializedJourneyState,\n type StepHandle,\n type StepRecord,\n type TagValue,\n} from './types';\n\nconst DEFAULT_SLOW_REQUESTS: SlowRequestConfig = { defaultMs: 4_000, endpoints: [] };\n\nconst noopStep: StepHandle = {\n journeyName: null,\n setAttribute() {},\n setTags() {},\n completeJourney() {},\n failJourney() {},\n stamp: () => undefined,\n};\n\nfunction toName(target: JourneyNameLike): string {\n if (typeof target === 'string') {\n return target;\n }\n return 'config' in target ? target.config.name : target.name;\n}\n\n/** @internal Private — not part of the public package API. */\nexport interface JourneyRuntimeOptions {\n /**\n * DevTools label for this engine copy (`__stJourney.getDebugState().runtimes`).\n * Auto-assigned `runtime-N` from the current `__stJourney` registration count\n * when omitted at `registerJourneyRuntime`.\n */\n id?: string;\n /** Initial sinks. Defaults to `[]` — package bootstrap installs Datadog on the module runtime. */\n sinks?: readonly JourneySink[];\n slowRequests?: SlowRequestConfig;\n /** Cap recorded steps; default 50. */\n maxSteps?: number;\n /** Default timeout when JourneyDef.timeoutMs is omitted. 0 disables idle countdown. */\n defaultJourneyIdleMs?: number;\n}\n\n/** @internal Read-only snapshot for DevTools (`__stJourney.getDebugState`; empty unless debugging). */\nexport interface JourneyRuntimeDebugSnapshot {\n id: string;\n openJourneys: readonly {\n name: string;\n team: string;\n group: string;\n service: string;\n verdict: Outcome;\n reason: string | null;\n tags: Record<string, TagValue>;\n stepsInFlight: readonly string[];\n steps: readonly {\n name: string;\n outcome: 'good' | 'bad';\n durationMs: number;\n reason?: string;\n attributedRequestKeys?: readonly string[];\n }[];\n }[];\n activeStep: { journey: string; name: string } | null;\n /** Which shared policy knobs this runtime overrode (false = inherit global). */\n policyOverlay: {\n slowRequests: boolean;\n httpAbortedRequests: boolean;\n httpClientErrorRequests: boolean;\n autoAttributeRequests: boolean;\n };\n}\n\n/** @internal Freeze a caller-supplied journey def + tags snapshot. */\nexport function freezeJourneyDef(config: JourneyDef, tags: Record<string, TagValue>): JourneyDef {\n const endpoints = sortEndpointsByLongestMatch(config.endpoints);\n return Object.freeze({\n ...config,\n timeoutMs: config.timeoutMs !== undefined ? finiteTimeoutMs(config.timeoutMs) : undefined,\n stepTimeoutMs:\n config.stepTimeoutMs !== undefined ? finiteTimeoutMs(config.stepTimeoutMs) : undefined,\n slowRequestMs: finiteSlowRequestMs(config.slowRequestMs),\n maxSteps: config.maxSteps !== undefined ? clampMaxSteps(config.maxSteps) : undefined,\n endpoints: endpoints ? Object.freeze([...endpoints]) : undefined,\n expected: config.expected ? Object.freeze([...config.expected]) : undefined,\n tags: Object.freeze({ ...tags }),\n });\n}\n\n/**\n * @internal Private — not part of the public package API.\n * Isolated journey engine (open journeys, ambient steps, sinks, request thresholds).\n * App code should keep using free helpers (`defineJourney`, `journeyStep`, …) — they\n * bind to the module runtime. Prefer `resetJourney()` in tests.\n */\nexport interface JourneyRuntime {\n /** DevTools id for this engine copy. Auto `runtime-N` when registered without an id. */\n readonly id: string;\n getSlowRequests(): SlowRequestConfig;\n setSlowRequests(next: SlowRequestConfig): void;\n getMaxSteps(): number;\n setMaxSteps(next: number): void;\n getDefaultJourneyIdleMs(): number;\n setDefaultJourneyIdleMs(next: number): void;\n\n setSinks(next: readonly JourneySink[]): void;\n /** First `configureJourney({ sinks })` on this runtime wins. Returns false if already set. */\n trySetConfiguredSinks(next: readonly JourneySink[]): boolean;\n addSink(sink: JourneySink): void;\n emit(payload: JourneyEvent): void;\n\n setPolicyOverlay(next: {\n slowRequests?: SlowRequestConfig;\n httpAbortedRequests?: RequestPolicyConfig;\n httpClientErrorRequests?: RequestPolicyConfig;\n autoAttributeRequests?: boolean;\n }): void;\n getAutoAttributeRequests(): boolean;\n getHttpAbortedRequestsPolicy(): RequestPolicyConfig;\n getHttpClientErrorRequestsPolicy(): RequestPolicyConfig;\n\n getOpenJourney(name: string): JourneyState | undefined;\n /** @internal DevTools snapshot of open journeys / ambient step. */\n getDebugSnapshot(): JourneyRuntimeDebugSnapshot;\n firstOpenJourneyName(names: readonly string[]): string | null;\n setJourneyTags(name: string | null, tags: Record<string, TagValue>): void;\n startJourney(config: JourneyDef): void;\n failJourney(journey: JourneyState, reason: string): void;\n completeJourney(name: string | null, tags?: Record<string, TagValue>): void;\n completeJourneyState(journey: JourneyState, tags?: Record<string, TagValue>): void;\n excludeJourney(journey: JourneyState): void;\n updateOpenJourney(config: JourneyDef): void;\n /**\n * @internal Snapshot an open journey for cross-page transfer. Does NOT\n * close the journey. Returns `null` when no journey is open under `name`.\n */\n serializeJourneyState(name: string): SerializedJourneyState | null;\n /**\n * @internal Rehydrate a serialized journey onto this runtime. Returns\n * `null` (after emitting a `bad` `journey-timeout` event) when the journey\n * already exhausted its budget in transit.\n */\n restoreJourney(serialized: SerializedJourneyState, config: JourneyDef): JourneyState | null;\n\n activeJourneyStep(): StepRecord | null;\n journeyStep<T>(\n journey: JourneyStepTarget,\n stepName: string,\n fn: (step: StepHandle) => T | Promise<T>,\n opts?: JourneyStepOptions\n ): Promise<T>;\n journeyMountStep<T>(\n journey: JourneyStepTarget,\n stepName: string,\n fn: (step: StepHandle) => T | Promise<T>,\n opts?: JourneyStepOptions\n ): Promise<T>;\n\n reportBackendRequest(\n step: StepRecord | undefined,\n status: number | undefined,\n durationMs: number,\n requestKey: string\n ): void;\n /** True when this request key is ignored for the step's journey (never changes verdict). */\n shouldIgnoreRequest(journey: JourneyState, key: string): boolean;\n\n /** Close open journeys, clear ambient steps, restore default timeouts/sinks. */\n reset(options?: JourneyRuntimeOptions): void;\n}\n\n/** @internal Bind the fail/exclude/report hooks for a journey's creating engine. */\nexport function bindJourneyEngine(\n api: JourneyRuntime,\n journey: JourneyState,\n shouldIgnoreRequest: (target: JourneyState, key: string) => boolean\n): JourneyEngine {\n return {\n failJourney(reason) {\n api.failJourney(journey, reason);\n },\n exclude() {\n api.excludeJourney(journey);\n },\n shouldIgnoreRequest(key) {\n return shouldIgnoreRequest(journey, key);\n },\n reportBackendRequest(step, status, durationMs, requestKey) {\n api.reportBackendRequest(step, status, durationMs, requestKey);\n },\n getHttpAbortedRequestsPolicy() {\n return api.getHttpAbortedRequestsPolicy();\n },\n getHttpClientErrorRequestsPolicy() {\n return api.getHttpClientErrorRequestsPolicy();\n },\n };\n}\n\n/**\n * @internal Private — not part of the public package API.\n * Build an isolated engine. Rarely needed — apps use the default via free helpers.\n */\nexport function createJourneyRuntime(options: JourneyRuntimeOptions = {}): JourneyRuntime {\n let id = typeof options.id === 'string' && options.id !== '' ? options.id : '';\n const journeys = new Map<string, JourneyState>();\n const inFlight = new Set<StepRecord>();\n let sinks: JourneySink[] = [...(options.sinks ?? [])];\n let sinksConfigured = false;\n let overlay: {\n slowRequests?: SlowRequestConfig;\n httpAbortedRequests?: RequestPolicyConfig;\n httpClientErrorRequests?: RequestPolicyConfig;\n autoAttributeRequests?: boolean;\n } = {};\n let slowRequests: SlowRequestConfig = {\n defaultMs: options.slowRequests?.defaultMs ?? DEFAULT_SLOW_REQUESTS.defaultMs,\n endpoints: sortEndpointsByLongestMatch(\n options.slowRequests?.endpoints ?? DEFAULT_SLOW_REQUESTS.endpoints\n ),\n };\n let maxSteps = clampMaxSteps(options.maxSteps ?? DEFAULT_MAX_STEPS);\n let defaultJourneyIdleMs = finiteTimeoutMs(\n options.defaultJourneyIdleMs ?? DEFAULT_JOURNEY_IDLE_MS\n );\n\n function getInFlightSteps(journey: JourneyState): StepRecord[] {\n const out: StepRecord[] = [];\n for (const step of inFlight) {\n if (step.journey === journey) {\n out.push(step);\n }\n }\n return out;\n }\n\n function enterStep(step: StepRecord): void {\n inFlight.add(step);\n }\n\n function leaveStep(step: StepRecord): void {\n inFlight.delete(step);\n }\n\n function releaseInFlightSteps(journey: JourneyState): void {\n for (const step of [...inFlight]) {\n if (step.journey !== journey) {\n continue;\n }\n if (step.durationMs === 0) {\n step.durationMs = Math.round(globalThis.performance.now() - step.startedAt);\n }\n inFlight.delete(step);\n }\n }\n\n function clearCountdown(journey: JourneyState): void {\n if (journey.timer != null) {\n clearTimeout(journey.timer);\n journey.timer = null;\n }\n }\n\n function emit(payload: JourneyEvent): void {\n const safePayload = sanitizeJourneyEvent(payload);\n for (const sink of sinks) {\n try {\n sink(safePayload);\n } catch {\n // One sinking throw must not block the remaining sinks.\n }\n }\n }\n\n function finish(journey: JourneyState, outcome: Outcome, reason?: string): void {\n if (journey.closed) {\n return;\n }\n journey.closed = true;\n if (journeys.get(journey.name) === journey) {\n journeys.delete(journey.name);\n }\n clearCountdown(journey);\n releaseInFlightSteps(journey);\n\n let finalReason = journey.reason ?? reason;\n let finalOutcome = outcome;\n const durationMs = Math.round(globalThis.performance.now() - journey.startedAt);\n if (journey.timeoutExplicit && journey.timeoutMs > 0 && durationMs > journey.timeoutMs) {\n finalOutcome = 'bad';\n finalReason = finalReason ?? 'journey-timeout';\n }\n\n const steps: JourneyStepEvent[] = journey.steps.map(s => ({\n name: s.name,\n startMs: Math.round(s.startedAt - journey.startedAt),\n durationMs: s.durationMs,\n outcome: s.outcome,\n ...(s.reason ? { reason: s.reason } : {}),\n ...(s.httpStatus !== undefined ? { httpStatus: s.httpStatus } : {}),\n ...(Object.keys(s.attributes).length ? { attributes: { ...s.attributes } } : {}),\n ...(s.requests?.length\n ? { requests: s.requests.map(request => ({ ...request })) }\n : {}),\n ...(s.requestsTruncated ? { requestsTruncated: true } : {}),\n }));\n\n emit({\n journey: {\n name: journey.name,\n team: journey.team,\n group: journey.group,\n service: journey.service,\n outcome: finalOutcome,\n ...(finalOutcome === 'bad' && journey.scoringRequest\n ? { failedRequest: { ...journey.scoringRequest } }\n : {}),\n ...(finalReason ? { reason: finalReason } : {}),\n durationMs,\n steps,\n ...(journey.expected ? { expected: journey.expected } : {}),\n ...(Object.keys(journey.tags).length ? { tags: { ...journey.tags } } : {}),\n },\n });\n }\n\n function armCountdown(journey: JourneyState, delayMs: number = journey.timeoutMs): void {\n if (delayMs <= 0) {\n return;\n }\n journey.timer = setTimeout(() => {\n if (journey.timeoutExplicit) {\n finish(journey, 'bad', 'journey-timeout');\n return;\n }\n finish(journey, journey.verdict === 'bad' ? 'bad' : 'excluded', 'journey-idle-timeout');\n }, delayMs);\n }\n\n function effectiveSlowRequests(): SlowRequestConfig {\n return overlay.slowRequests ?? getSharedSlowRequests() ?? slowRequests;\n }\n\n function shouldIgnoreRequest(journey: JourneyState, key: string): boolean {\n return resolveEndpointPolicy(journey, effectiveSlowRequests(), key).ignore;\n }\n\n function trackAttributedKey(step: StepRecord, requestKey: string): void {\n if (!requestKey) {\n return;\n }\n step.attributedRequestKeys ??= [];\n if (step.attributedRequestKeys.length >= MAX_ATTRIBUTED_REQUEST_KEYS) {\n return;\n }\n if (!step.attributedRequestKeys.includes(requestKey)) {\n step.attributedRequestKeys.push(requestKey);\n }\n }\n\n function resolveJourneyName(journey: JourneyStepTarget): string | null {\n if (journey == null) {\n return null;\n }\n if (typeof journey === 'string' || !Array.isArray(journey)) {\n return toName(journey as JourneyNameLike);\n }\n return api.firstOpenJourneyName(journey.map(toName));\n }\n\n function configFromTarget(target: JourneyNameLike): JourneyDef | undefined {\n if (typeof target === 'string') {\n return undefined;\n }\n if ('config' in target && target.config != null && typeof target.config === 'object') {\n return target.config;\n }\n const rec = target as {\n name?: unknown;\n team?: unknown;\n group?: unknown;\n service?: unknown;\n };\n if (\n typeof rec.name === 'string' &&\n typeof rec.team === 'string' &&\n typeof rec.group === 'string' &&\n typeof rec.service === 'string'\n ) {\n return target as JourneyDef;\n }\n return undefined;\n }\n\n function maybeAutoStart(target: JourneyStepTarget): void {\n if (target == null || typeof target === 'string' || Array.isArray(target)) {\n return;\n }\n const def = configFromTarget(target as JourneyNameLike);\n if (def && !api.getOpenJourney(def.name)) {\n api.startJourney(def);\n }\n }\n\n function createStepHandle(journeyName: string, step: StepRecord): StepHandle {\n return {\n journeyName,\n setAttribute(key, value) {\n setSafeAttribute(step.attributes, key, value);\n },\n setTags(tags) {\n if (step.journey.closed) {\n return;\n }\n assignRecord(step.journey.tags, tags, MAX_TAG_KEYS);\n },\n completeJourney(tags) {\n api.completeJourneyState(step.journey, tags);\n },\n failJourney(reason) {\n api.failJourney(step.journey, reason);\n },\n // Box in JourneyStepStamp — raw StepRecord is circular and blows jQuery/axios deep-merge.\n stamp: scoreOrOpts => new JourneyStepStamp(step, resolveStampOpts(scoreOrOpts)),\n };\n }\n\n const api: JourneyRuntime = {\n get id() {\n return id;\n },\n set id(next: string) {\n id = next;\n },\n getSlowRequests() {\n return effectiveSlowRequests();\n },\n\n setSlowRequests(next) {\n slowRequests = {\n ...next,\n endpoints: sortEndpointsByLongestMatch(next.endpoints),\n };\n },\n\n getMaxSteps() {\n return maxSteps;\n },\n\n setMaxSteps(next) {\n maxSteps = clampMaxSteps(next);\n },\n\n getDefaultJourneyIdleMs() {\n return defaultJourneyIdleMs;\n },\n\n setDefaultJourneyIdleMs(next) {\n defaultJourneyIdleMs = finiteTimeoutMs(next);\n },\n\n setSinks(next) {\n sinks = [...next];\n },\n\n trySetConfiguredSinks(next) {\n if (sinksConfigured) {\n return false;\n }\n sinks = [...next];\n sinksConfigured = true;\n return true;\n },\n\n addSink(sink) {\n sinks.push(sink);\n },\n\n emit,\n\n setPolicyOverlay(next) {\n overlay = { ...overlay, ...next };\n },\n\n getAutoAttributeRequests() {\n if (overlay.autoAttributeRequests !== undefined) {\n return overlay.autoAttributeRequests;\n }\n return getSharedAutoAttributeRequests();\n },\n\n getHttpAbortedRequestsPolicy() {\n return overlay.httpAbortedRequests ?? getSharedHttpAbortedRequestsPolicy();\n },\n\n getHttpClientErrorRequestsPolicy() {\n return overlay.httpClientErrorRequests ?? getSharedHttpClientErrorRequestsPolicy();\n },\n\n getOpenJourney(name) {\n return journeys.get(name);\n },\n\n getDebugSnapshot() {\n const active = api.activeJourneyStep();\n return {\n id: api.id,\n openJourneys: [...journeys.values()].map(journey => ({\n name: journey.name,\n team: journey.team,\n group: journey.group,\n service: journey.service,\n verdict: journey.verdict,\n reason: journey.reason,\n tags: { ...journey.tags },\n stepsInFlight: getInFlightSteps(journey).map(step => step.name),\n steps: journey.steps.map(step => ({\n name: step.name,\n outcome: step.outcome,\n durationMs: step.durationMs,\n ...(step.reason ? { reason: step.reason } : {}),\n ...(step.attributedRequestKeys?.length\n ? { attributedRequestKeys: [...step.attributedRequestKeys] }\n : {}),\n })),\n })),\n activeStep: active ? { journey: active.journey.name, name: active.name } : null,\n policyOverlay: {\n slowRequests: overlay.slowRequests != null,\n httpAbortedRequests: overlay.httpAbortedRequests != null,\n httpClientErrorRequests: overlay.httpClientErrorRequests != null,\n autoAttributeRequests: overlay.autoAttributeRequests != null,\n },\n };\n },\n\n firstOpenJourneyName(names) {\n for (const name of names) {\n if (journeys.has(name)) {\n return name;\n }\n }\n return null;\n },\n\n setJourneyTags(name, tags) {\n const journey = name ? journeys.get(name) : undefined;\n if (journey) {\n assignRecord(journey.tags, tags, MAX_TAG_KEYS);\n }\n },\n\n startJourney(config) {\n const existing = journeys.get(config.name);\n if (existing) {\n finish(existing, existing.verdict === 'bad' ? 'bad' : 'excluded');\n }\n\n const tags = emptyRecord();\n assignRecord(tags, config.tags, MAX_TAG_KEYS);\n const snapshot = freezeJourneyDef(config, tags);\n const timeout = resolveJourneyTimeoutMs(snapshot.timeoutMs, defaultJourneyIdleMs);\n const journey: JourneyState = {\n config: snapshot,\n name: snapshot.name,\n team: snapshot.team,\n group: snapshot.group,\n service: snapshot.service,\n verdict: 'good',\n startedAt: globalThis.performance.now(),\n timeoutMs: timeout.ms,\n timeoutExplicit: timeout.explicit,\n stepTimeoutMs:\n snapshot.stepTimeoutMs !== undefined\n ? finiteTimeoutMs(snapshot.stepTimeoutMs)\n : undefined,\n reason: null,\n steps: [],\n expected: snapshot.expected ? [...snapshot.expected] : null,\n tags,\n slowRequestMs: finiteSlowRequestMs(snapshot.slowRequestMs),\n endpoints: snapshot.endpoints,\n timer: null,\n closed: false,\n maxSteps:\n snapshot.maxSteps !== undefined ? clampMaxSteps(snapshot.maxSteps) : undefined,\n };\n journeys.set(config.name, journey);\n journey[JOURNEY_ENGINE] = bindJourneyEngine(api, journey, shouldIgnoreRequest);\n armCountdown(journey);\n },\n\n failJourney(journey, reason) {\n if (journey.closed) {\n return;\n }\n journey.verdict = 'bad';\n journey.reason ??= reason;\n finish(journey, 'bad');\n },\n\n completeJourney(name, tags) {\n if (!name) {\n return;\n }\n const journey = journeys.get(name);\n if (journey) {\n api.completeJourneyState(journey, tags);\n }\n },\n\n completeJourneyState(journey, tags) {\n if (journey.closed) {\n return;\n }\n if (tags) {\n assignRecord(journey.tags, tags, MAX_TAG_KEYS);\n }\n finish(journey, journey.verdict === 'bad' ? 'bad' : 'good');\n },\n\n excludeJourney(journey) {\n if (journey.closed) {\n return;\n }\n finish(journey, journey.verdict === 'bad' ? 'bad' : 'excluded');\n },\n\n updateOpenJourney(config) {\n const journey = journeys.get(config.name);\n if (!journey || journey.closed) {\n return;\n }\n journey.team = config.team;\n journey.group = config.group;\n journey.service = config.service;\n const timeout = resolveJourneyTimeoutMs(config.timeoutMs, defaultJourneyIdleMs);\n journey.timeoutMs = timeout.ms;\n journey.timeoutExplicit = timeout.explicit;\n journey.stepTimeoutMs =\n config.stepTimeoutMs !== undefined\n ? finiteTimeoutMs(config.stepTimeoutMs)\n : undefined;\n journey.slowRequestMs = finiteSlowRequestMs(config.slowRequestMs);\n journey.endpoints = sortEndpointsByLongestMatch(config.endpoints);\n journey.expected = config.expected ? [...config.expected] : null;\n journey.maxSteps =\n config.maxSteps !== undefined ? clampMaxSteps(config.maxSteps) : undefined;\n if (config.tags) {\n assignRecord(journey.tags, config.tags, MAX_TAG_KEYS);\n }\n clearCountdown(journey);\n if (journey.timeoutMs <= 0) {\n return;\n }\n const elapsedMs = globalThis.performance.now() - journey.startedAt;\n const remainingMs = journey.timeoutMs - elapsedMs;\n if (remainingMs <= 0) {\n if (journey.timeoutExplicit) {\n finish(journey, 'bad', 'journey-timeout');\n return;\n }\n finish(\n journey,\n journey.verdict === 'bad' ? 'bad' : 'excluded',\n 'journey-idle-timeout'\n );\n return;\n }\n armCountdown(journey, remainingMs);\n },\n\n serializeJourneyState(name) {\n const journey = journeys.get(name);\n if (!journey || journey.closed) {\n return null;\n }\n return projectJourneyState(journey);\n },\n\n restoreJourney(serialized, config) {\n // Refuse double-registration: leave an existing journey under this name in place.\n if (journeys.has(config.name)) {\n return null;\n }\n\n const journey = deserializeJourneyState(serialized, config, api, defaultJourneyIdleMs);\n\n if (journey.timeoutMs > 0) {\n const elapsedMs = globalThis.performance.now() - journey.startedAt;\n if (elapsedMs >= journey.timeoutMs) {\n // journey not yet in journeys Map — finish() handles unregistered journeys gracefully.\n if (journey.timeoutExplicit) {\n finish(journey, 'bad', 'journey-timeout');\n } else {\n finish(\n journey,\n journey.verdict === 'bad' ? 'bad' : 'excluded',\n 'journey-idle-timeout'\n );\n }\n return null;\n }\n\n journeys.set(config.name, journey);\n\n const remainingMs = journey.timeoutMs - elapsedMs;\n if (remainingMs > 0) {\n armCountdown(journey, remainingMs);\n }\n } else {\n journeys.set(config.name, journey);\n }\n\n return journey;\n },\n\n activeJourneyStep() {\n if (!api.getAutoAttributeRequests()) {\n return null;\n }\n if (inFlight.size !== 1) {\n return null;\n }\n return inFlight.values().next().value ?? null;\n },\n\n async journeyStep(journey, stepName, fn, opts) {\n maybeAutoStart(journey);\n const journeyName = resolveJourneyName(journey);\n const open = journeyName ? journeys.get(journeyName) : undefined;\n if (!open || !journeyName) {\n if (isJourneyDebugEnabled()) {\n // eslint-disable-next-line no-console -- debug-only untraced hint\n console.debug(`[journey] step \"${stepName}\" ran untraced (no open journey)`);\n }\n return fn(noopStep);\n }\n\n const step: StepRecord = {\n name: stepName,\n startedAt: globalThis.performance.now(),\n durationMs: 0,\n outcome: 'good',\n attributes: emptyRecord(),\n journey: open,\n };\n const cap = open.maxSteps ?? maxSteps;\n if (open.steps.length >= cap) {\n open.tags.steps_truncated = true;\n } else {\n open.steps.push(step);\n }\n\n const handle = createStepHandle(journeyName, step);\n\n const stepTimeoutMs = opts?.timeoutMs ?? open.stepTimeoutMs ?? 0;\n let timeoutTimer: ReturnType<typeof setTimeout> | null = null;\n if (stepTimeoutMs > 0) {\n timeoutTimer = setTimeout(() => {\n if (open.closed) {\n return;\n }\n step.outcome = 'bad';\n step.reason ??= 'step-timeout';\n step.attributes.timeout_ms ??= stepTimeoutMs;\n step.durationMs = Math.round(globalThis.performance.now() - step.startedAt);\n api.failJourney(open, 'step-timeout');\n }, stepTimeoutMs);\n }\n\n enterStep(step);\n try {\n return await fn(handle);\n } catch (err) {\n if (isCanceledError(err)) {\n /*\n * Attributed abort is scored in onHttpComplete. Unattributed /\n * ignored abort throws must not apply policy (empty requestKey).\n */\n } else {\n step.outcome = 'bad';\n step.reason ??= 'step-error';\n api.failJourney(open, 'step-error');\n }\n throw err;\n } finally {\n if (timeoutTimer != null) {\n clearTimeout(timeoutTimer);\n }\n if (step.durationMs === 0) {\n step.durationMs = Math.round(globalThis.performance.now() - step.startedAt);\n }\n leaveStep(step);\n }\n },\n\n async journeyMountStep(journey, stepName, fn, opts) {\n await Promise.resolve();\n return api.journeyStep(journey, stepName, fn, opts);\n },\n\n shouldIgnoreRequest,\n\n reportBackendRequest(step, status, durationMs, requestKey) {\n if (!step?.journey) {\n return;\n }\n const journey = step.journey;\n if (journey.closed) {\n return;\n }\n trackAttributedKey(step, requestKey);\n const endpointPolicy = resolveEndpointPolicy(\n journey,\n effectiveSlowRequests(),\n requestKey\n );\n if (endpointPolicy.ignore) {\n return;\n }\n\n const failed = status === undefined || status >= 500;\n const threshold = endpointPolicy.slowRequestMs;\n const slow = threshold > 0 && durationMs > threshold;\n if (!failed && !slow) {\n return;\n }\n\n const category = failed ? 'request-error' : 'request-latency';\n\n step.outcome = 'bad';\n step.reason ??= category;\n if (failed && status !== undefined) {\n step.httpStatus = status;\n }\n\n api.failJourney(journey, category);\n },\n\n reset(next = {}) {\n for (const journey of [...journeys.values()]) {\n clearCountdown(journey);\n journey.closed = true;\n }\n journeys.clear();\n inFlight.clear();\n overlay = {};\n sinksConfigured = false;\n sinks = [...(next.sinks ?? [])];\n slowRequests = {\n defaultMs: next.slowRequests?.defaultMs ?? DEFAULT_SLOW_REQUESTS.defaultMs,\n endpoints: sortEndpointsByLongestMatch(\n next.slowRequests?.endpoints ?? DEFAULT_SLOW_REQUESTS.endpoints\n ),\n };\n maxSteps =\n next.maxSteps !== undefined ? clampMaxSteps(next.maxSteps) : DEFAULT_MAX_STEPS;\n defaultJourneyIdleMs = finiteTimeoutMs(\n next.defaultJourneyIdleMs ?? DEFAULT_JOURNEY_IDLE_MS\n );\n },\n };\n\n return api;\n}\n\n/**\n * @internal Private — not part of the public package API.\n * Module-scoped engine used by free helpers. App code does not need to touch this.\n * Each host/MFE bundle gets its own copy when the package is duplicated.\n */\nexport const moduleRuntime: JourneyRuntime = createJourneyRuntime();\n\nconst noopEngine: JourneyEngine = {\n failJourney() {},\n exclude() {},\n shouldIgnoreRequest() {\n return false;\n },\n reportBackendRequest() {},\n getHttpAbortedRequestsPolicy() {\n return 'continue';\n },\n getHttpClientErrorRequestsPolicy() {\n return 'continue';\n },\n};\n\n/**\n * True when this bundle can fail/exclude/report the journey: stamped engine, or\n * this runtime's own unstamped object. False for a foreign older-copy journey.\n */\nexport function canRouteHttpToJourney(journey: JourneyState): boolean {\n return (\n journey[JOURNEY_ENGINE] != null || moduleRuntime.getOpenJourney(journey.name) === journey\n );\n}\n\n/**\n * @internal Prefer the creating engine on a journey (MFE `step.stamp()` on a host transport).\n * Falls back to this bundle's module runtime only when this runtime owns the object.\n * Unstamped foreign journeys (older package copies) are a no-op so a same-named\n * host journey is not deleted from this map.\n */\nexport function resolveJourneyEngine(journey: JourneyState): JourneyEngine {\n const stamped = journey[JOURNEY_ENGINE];\n if (stamped) {\n return stamped;\n }\n if (moduleRuntime.getOpenJourney(journey.name) !== journey) {\n return noopEngine;\n }\n return {\n failJourney(reason) {\n moduleRuntime.failJourney(journey, reason);\n },\n exclude() {\n moduleRuntime.excludeJourney(journey);\n },\n shouldIgnoreRequest(key) {\n return moduleRuntime.shouldIgnoreRequest(journey, key);\n },\n reportBackendRequest(step, status, durationMs, requestKey) {\n moduleRuntime.reportBackendRequest(step, status, durationMs, requestKey);\n },\n getHttpAbortedRequestsPolicy() {\n return moduleRuntime.getHttpAbortedRequestsPolicy();\n },\n getHttpClientErrorRequestsPolicy() {\n return moduleRuntime.getHttpClientErrorRequestsPolicy();\n },\n };\n}\n\n/**\n * @internal Reset the module engine (open journeys, ambient steps, sinks, slow-request thresholds).\n * Intended for tests — call in `beforeEach` / `afterEach` instead of manual cleanup.\n */\nexport function resetJourney(options?: JourneyRuntimeOptions): void {\n moduleRuntime.reset(options);\n}\n"],"names":["getAutoAttributeRequests","getSharedAutoAttributeRequests","getHttpAbortedRequestsPolicy","getSharedHttpAbortedRequestsPolicy","getHttpClientErrorRequestsPolicy","getSharedHttpClientErrorRequestsPolicy","getSharedSlowRequests","isJourneyDebugEnabled","isCanceledError","resolveEndpointPolicy","sortEndpointsByLongestMatch","deserializeJourneyState","projectJourneyState","clampMaxSteps","DEFAULT_MAX_STEPS","DEFAULT_JOURNEY_IDLE_MS","finiteSlowRequestMs","finiteTimeoutMs","MAX_ATTRIBUTED_REQUEST_KEYS","MAX_TAG_KEYS","resolveJourneyTimeoutMs","assignRecord","emptyRecord","sanitizeJourneyEvent","setSafeAttribute","JourneyStepStamp","resolveStampOpts","JOURNEY_ENGINE","DEFAULT_SLOW_REQUESTS","defaultMs","endpoints","noopStep","journeyName","setAttribute","setTags","completeJourney","failJourney","stamp","undefined","toName","target","config","name","freezeJourneyDef","tags","Object","freeze","timeoutMs","stepTimeoutMs","slowRequestMs","maxSteps","expected","bindJourneyEngine","api","journey","shouldIgnoreRequest","reason","exclude","excludeJourney","key","reportBackendRequest","step","status","durationMs","requestKey","createJourneyRuntime","options","id","journeys","Map","inFlight","Set","sinks","sinksConfigured","overlay","slowRequests","defaultJourneyIdleMs","getInFlightSteps","out","push","enterStep","add","leaveStep","delete","releaseInFlightSteps","Math","round","globalThis","performance","now","startedAt","clearCountdown","timer","clearTimeout","emit","payload","safePayload","sink","finish","outcome","closed","get","finalReason","finalOutcome","timeoutExplicit","steps","map","s","startMs","httpStatus","keys","attributes","length","requests","request","requestsTruncated","team","group","service","scoringRequest","failedRequest","armCountdown","delayMs","setTimeout","verdict","effectiveSlowRequests","ignore","trackAttributedKey","attributedRequestKeys","includes","resolveJourneyName","Array","isArray","firstOpenJourneyName","configFromTarget","rec","maybeAutoStart","def","getOpenJourney","startJourney","createStepHandle","value","completeJourneyState","scoreOrOpts","next","getSlowRequests","setSlowRequests","getMaxSteps","setMaxSteps","getDefaultJourneyIdleMs","setDefaultJourneyIdleMs","setSinks","trySetConfiguredSinks","addSink","setPolicyOverlay","autoAttributeRequests","httpAbortedRequests","httpClientErrorRequests","getDebugSnapshot","active","activeJourneyStep","openJourneys","values","stepsInFlight","activeStep","policyOverlay","names","has","setJourneyTags","existing","snapshot","timeout","ms","explicit","set","updateOpenJourney","elapsedMs","remainingMs","serializeJourneyState","restoreJourney","serialized","size","journeyStep","stepName","fn","opts","open","console","debug","cap","steps_truncated","handle","timeoutTimer","timeout_ms","err","journeyMountStep","Promise","resolve","endpointPolicy","failed","threshold","slow","category","reset","clear","moduleRuntime","noopEngine","canRouteHttpToJourney","resolveJourneyEngine","stamped","resetJourney"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/core/sanitize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAoB,QAAQ,EAAE,MAAM,SAAS,CAAC;AASxE,8FAA8F;AAC9F,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOvD;AAED,wBAAgB,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAEtD;AAYD,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,yDAAyD;IACzD,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED;;GAEG;AACH,wBAAgB,UAAU,CACtB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACxC,OAAO,EAAE,iBAAiB,GAC3B,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAkC1B;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EAChC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACxC,OAAO,EAAE,MAAM,GAChB,IAAI,CAsBN;AAED,wBAAgB,gBAAgB,CAC5B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EACpC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GACjC,IAAI,CAYN;
|
|
1
|
+
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/core/sanitize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAoB,QAAQ,EAAE,MAAM,SAAS,CAAC;AASxE,8FAA8F;AAC9F,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOvD;AAED,wBAAgB,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAEtD;AAYD,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,yDAAyD;IACzD,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED;;GAEG;AACH,wBAAgB,UAAU,CACtB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACxC,OAAO,EAAE,iBAAiB,GAC3B,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAkC1B;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EAChC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACxC,OAAO,EAAE,MAAM,GAChB,IAAI,CAsBN;AAED,wBAAgB,gBAAgB,CAC5B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EACpC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GACjC,IAAI,CAYN;AA4BD,gFAAgF;AAChF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,CAkDtE;AAED,qEAAqE;AACrE,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAEpE"}
|
package/dist/core/sanitize.js
CHANGED
|
@@ -85,16 +85,16 @@ export function setSafeAttribute(attributes, key, value) {
|
|
|
85
85
|
attributes[key] = next;
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
|
-
function sanitizeStep(step
|
|
88
|
+
function sanitizeStep(step) {
|
|
89
89
|
const { requests: rawRequests, requestsTruncated, ...rest } = step;
|
|
90
|
-
const requests =
|
|
90
|
+
const requests = Array.isArray(rawRequests) ? rawRequests.slice(0, MAX_CORRELATED_REQUESTS).map(sanitizeRequestCorrelation).filter((request)=>request !== undefined) : [];
|
|
91
91
|
const name = normalizeTagValue(step.name);
|
|
92
92
|
return {
|
|
93
93
|
...rest,
|
|
94
94
|
...requests.length ? {
|
|
95
95
|
requests
|
|
96
96
|
} : {},
|
|
97
|
-
...
|
|
97
|
+
...requestsTruncated === true ? {
|
|
98
98
|
requestsTruncated: true
|
|
99
99
|
} : {},
|
|
100
100
|
name: name || step.name,
|
|
@@ -118,7 +118,7 @@ function sanitizeStep(step, includeRequests) {
|
|
|
118
118
|
normalizeKeys: true
|
|
119
119
|
}) : undefined;
|
|
120
120
|
const tagKeys = tags ? Object.keys(tags) : [];
|
|
121
|
-
const steps = j.steps.map(
|
|
121
|
+
const steps = j.steps.map(sanitizeStep);
|
|
122
122
|
// Prefer recently started steps at the cap; failedRequest preserves the scoring request separately.
|
|
123
123
|
let requestBudget = MAX_JOURNEY_CORRELATED_REQUESTS;
|
|
124
124
|
for(let index = steps.length - 1; index >= 0; index--){
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/sanitize.ts"],"sourcesContent":["import { isUnsafeKey, MAX_ATTRIBUTE_KEYS, MAX_TAG_KEYS, MAX_TAG_VALUE_LEN } from './limits';\nimport type { JourneyEvent, JourneyStepEvent, TagValue } from './types';\nimport {\n MAX_CORRELATED_REQUESTS,\n MAX_JOURNEY_CORRELATED_REQUESTS,\n sanitizeRequestCorrelation,\n} from './request-correlation';\n\nconst SANITIZED_EVENT = Symbol.for('st.journey.sanitized');\n\n/** Match Datadog metric-tag value rules so RUM attributes / globals join derived SLO tags. */\nexport function normalizeTagValue(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9_\\-:./]/g, '_')\n .replace(/_+/g, '_')\n .slice(0, MAX_TAG_VALUE_LEN)\n .replace(/_+$/, '');\n}\n\nexport function emptyRecord(): Record<string, TagValue> {\n return Object.create(null) as Record<string, TagValue>;\n}\n\nfunction asTagValue(value: unknown): TagValue | undefined {\n if (typeof value === 'string') {\n return normalizeTagValue(value);\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n return undefined;\n}\n\nexport interface CopyRecordOptions {\n maxKeys: number;\n /** When true, keys are run through {@link normalizeTagValue} (sink / wire). */\n normalizeKeys?: boolean;\n /** When true (default), string values are normalized. */\n normalizeStringValues?: boolean;\n}\n\n/**\n * Own-key copy onto a null-prototype object. Skips unsafe keys and excess keys.\n */\nexport function copyRecord(\n src: Record<string, unknown> | undefined,\n options: CopyRecordOptions\n): Record<string, TagValue> {\n const out = emptyRecord();\n if (src == null || typeof src !== 'object') {\n return out;\n }\n const normalizeKeys = options.normalizeKeys === true;\n const normalizeStringValues = options.normalizeStringValues !== false;\n for (const key of Object.keys(src)) {\n if (isUnsafeKey(key)) {\n continue;\n }\n const destKey = normalizeKeys ? normalizeTagValue(key) : key;\n if (!destKey || isUnsafeKey(destKey)) {\n continue;\n }\n const raw = src[key];\n const value = normalizeStringValues\n ? asTagValue(raw)\n : typeof raw === 'string' || typeof raw === 'number' || typeof raw === 'boolean'\n ? raw\n : undefined;\n if (value === undefined) {\n continue;\n }\n if (Object.prototype.hasOwnProperty.call(out, destKey)) {\n out[destKey] = value;\n continue;\n }\n if (Object.keys(out).length >= options.maxKeys) {\n continue;\n }\n out[destKey] = value;\n }\n return out;\n}\n\n/** Merge `src` into `target` (null-prototype), honouring caps and unsafe-key skips. */\nexport function assignRecord(\n target: Record<string, TagValue>,\n src: Record<string, unknown> | undefined,\n maxKeys: number\n): void {\n if (src == null || typeof src !== 'object') {\n return;\n }\n let room = maxKeys - Object.keys(target).length;\n for (const key of Object.keys(src)) {\n if (isUnsafeKey(key)) {\n continue;\n }\n const raw = src[key];\n if (typeof raw !== 'string' && typeof raw !== 'number' && typeof raw !== 'boolean') {\n continue;\n }\n const exists = Object.prototype.hasOwnProperty.call(target, key);\n if (!exists && room <= 0) {\n continue;\n }\n if (!exists) {\n room -= 1;\n }\n target[key] = raw;\n }\n}\n\nexport function setSafeAttribute(\n attributes: Record<string, TagValue>,\n key: string,\n value: string | number | boolean\n): void {\n if (isUnsafeKey(key)) {\n return;\n }\n const exists = Object.prototype.hasOwnProperty.call(attributes, key);\n if (!exists && Object.keys(attributes).length >= MAX_ATTRIBUTE_KEYS) {\n return;\n }\n const next = asTagValue(value);\n if (next !== undefined) {\n attributes[key] = next;\n }\n}\n\nfunction sanitizeStep(step: JourneyStepEvent, includeRequests: boolean): JourneyStepEvent {\n const { requests: rawRequests, requestsTruncated, ...rest } = step;\n const requests =\n includeRequests && Array.isArray(rawRequests)\n ? rawRequests\n .slice(0, MAX_CORRELATED_REQUESTS)\n .map(sanitizeRequestCorrelation)\n .filter(request => request !== undefined)\n : [];\n const name = normalizeTagValue(step.name);\n return {\n ...rest,\n ...(requests.length ? { requests } : {}),\n ...(includeRequests && requestsTruncated === true ? { requestsTruncated: true } : {}),\n name: name || step.name,\n ...(step.reason ? { reason: normalizeTagValue(step.reason) } : {}),\n ...(step.attributes\n ? {\n attributes: copyRecord(step.attributes, {\n maxKeys: MAX_ATTRIBUTE_KEYS,\n normalizeKeys: true,\n }),\n }\n : {}),\n };\n}\n\n/** Default-sink payload: normalized keys/names, capped maps, no unsafe keys. */\nexport function sanitizeJourneyEvent(event: JourneyEvent): JourneyEvent {\n const j = event.journey;\n const expected = j.expected?.map(name => normalizeTagValue(name)).filter(name => name !== '');\n const tags = j.tags\n ? copyRecord(j.tags, { maxKeys: MAX_TAG_KEYS, normalizeKeys: true })\n : undefined;\n const tagKeys = tags ? Object.keys(tags) : [];\n const steps = j.steps.map(step => sanitizeStep(step, j.outcome === 'bad'));\n // Prefer recently started steps at the cap; failedRequest preserves the scoring request separately.\n let requestBudget = MAX_JOURNEY_CORRELATED_REQUESTS;\n for (let index = steps.length - 1; index >= 0; index--) {\n const step = steps[index];\n if (!step.requests) {\n continue;\n }\n if (step.requests.length > requestBudget) {\n step.requestsTruncated = true;\n if (requestBudget === 0) {\n delete step.requests;\n } else {\n step.requests = step.requests.slice(-requestBudget);\n }\n }\n requestBudget -= step.requests?.length ?? 0;\n }\n const failedRequest =\n j.outcome === 'bad' && j.failedRequest\n ? sanitizeRequestCorrelation(j.failedRequest)\n : undefined;\n const sanitized: JourneyEvent = {\n journey: {\n name: normalizeTagValue(j.name),\n team: normalizeTagValue(j.team),\n group: normalizeTagValue(j.group),\n service: normalizeTagValue(j.service),\n outcome: j.outcome,\n ...(failedRequest ? { failedRequest } : {}),\n ...(j.reason ? { reason: normalizeTagValue(j.reason) } : {}),\n durationMs: j.durationMs,\n steps,\n ...(expected?.length ? { expected } : {}),\n ...(tagKeys.length ? { tags } : {}),\n },\n };\n Object.defineProperty(sanitized, SANITIZED_EVENT, {\n value: true,\n enumerable: false,\n configurable: false,\n });\n return sanitized;\n}\n\n/** True when payload already passed through sanitizeJourneyEvent. */\nexport function isSanitizedJourneyEvent(event: JourneyEvent): boolean {\n return (event as unknown as Record<PropertyKey, unknown>)[SANITIZED_EVENT] === true;\n}\n"],"names":["isUnsafeKey","MAX_ATTRIBUTE_KEYS","MAX_TAG_KEYS","MAX_TAG_VALUE_LEN","MAX_CORRELATED_REQUESTS","MAX_JOURNEY_CORRELATED_REQUESTS","sanitizeRequestCorrelation","SANITIZED_EVENT","Symbol","for","normalizeTagValue","value","toLowerCase","replace","slice","emptyRecord","Object","create","asTagValue","undefined","copyRecord","src","options","out","normalizeKeys","normalizeStringValues","key","keys","destKey","raw","prototype","hasOwnProperty","call","length","maxKeys","assignRecord","target","room","exists","setSafeAttribute","attributes","next","sanitizeStep","step","includeRequests","requests","rawRequests","requestsTruncated","rest","Array","isArray","map","filter","request","name","reason","sanitizeJourneyEvent","event","j","journey","expected","tags","tagKeys","steps","outcome","requestBudget","index","failedRequest","sanitized","team","group","service","durationMs","defineProperty","enumerable","configurable","isSanitizedJourneyEvent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/core/sanitize.ts"],"sourcesContent":["import { isUnsafeKey, MAX_ATTRIBUTE_KEYS, MAX_TAG_KEYS, MAX_TAG_VALUE_LEN } from './limits';\nimport type { JourneyEvent, JourneyStepEvent, TagValue } from './types';\nimport {\n MAX_CORRELATED_REQUESTS,\n MAX_JOURNEY_CORRELATED_REQUESTS,\n sanitizeRequestCorrelation,\n} from './request-correlation';\n\nconst SANITIZED_EVENT = Symbol.for('st.journey.sanitized');\n\n/** Match Datadog metric-tag value rules so RUM attributes / globals join derived SLO tags. */\nexport function normalizeTagValue(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9_\\-:./]/g, '_')\n .replace(/_+/g, '_')\n .slice(0, MAX_TAG_VALUE_LEN)\n .replace(/_+$/, '');\n}\n\nexport function emptyRecord(): Record<string, TagValue> {\n return Object.create(null) as Record<string, TagValue>;\n}\n\nfunction asTagValue(value: unknown): TagValue | undefined {\n if (typeof value === 'string') {\n return normalizeTagValue(value);\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n return undefined;\n}\n\nexport interface CopyRecordOptions {\n maxKeys: number;\n /** When true, keys are run through {@link normalizeTagValue} (sink / wire). */\n normalizeKeys?: boolean;\n /** When true (default), string values are normalized. */\n normalizeStringValues?: boolean;\n}\n\n/**\n * Own-key copy onto a null-prototype object. Skips unsafe keys and excess keys.\n */\nexport function copyRecord(\n src: Record<string, unknown> | undefined,\n options: CopyRecordOptions\n): Record<string, TagValue> {\n const out = emptyRecord();\n if (src == null || typeof src !== 'object') {\n return out;\n }\n const normalizeKeys = options.normalizeKeys === true;\n const normalizeStringValues = options.normalizeStringValues !== false;\n for (const key of Object.keys(src)) {\n if (isUnsafeKey(key)) {\n continue;\n }\n const destKey = normalizeKeys ? normalizeTagValue(key) : key;\n if (!destKey || isUnsafeKey(destKey)) {\n continue;\n }\n const raw = src[key];\n const value = normalizeStringValues\n ? asTagValue(raw)\n : typeof raw === 'string' || typeof raw === 'number' || typeof raw === 'boolean'\n ? raw\n : undefined;\n if (value === undefined) {\n continue;\n }\n if (Object.prototype.hasOwnProperty.call(out, destKey)) {\n out[destKey] = value;\n continue;\n }\n if (Object.keys(out).length >= options.maxKeys) {\n continue;\n }\n out[destKey] = value;\n }\n return out;\n}\n\n/** Merge `src` into `target` (null-prototype), honouring caps and unsafe-key skips. */\nexport function assignRecord(\n target: Record<string, TagValue>,\n src: Record<string, unknown> | undefined,\n maxKeys: number\n): void {\n if (src == null || typeof src !== 'object') {\n return;\n }\n let room = maxKeys - Object.keys(target).length;\n for (const key of Object.keys(src)) {\n if (isUnsafeKey(key)) {\n continue;\n }\n const raw = src[key];\n if (typeof raw !== 'string' && typeof raw !== 'number' && typeof raw !== 'boolean') {\n continue;\n }\n const exists = Object.prototype.hasOwnProperty.call(target, key);\n if (!exists && room <= 0) {\n continue;\n }\n if (!exists) {\n room -= 1;\n }\n target[key] = raw;\n }\n}\n\nexport function setSafeAttribute(\n attributes: Record<string, TagValue>,\n key: string,\n value: string | number | boolean\n): void {\n if (isUnsafeKey(key)) {\n return;\n }\n const exists = Object.prototype.hasOwnProperty.call(attributes, key);\n if (!exists && Object.keys(attributes).length >= MAX_ATTRIBUTE_KEYS) {\n return;\n }\n const next = asTagValue(value);\n if (next !== undefined) {\n attributes[key] = next;\n }\n}\n\nfunction sanitizeStep(step: JourneyStepEvent): JourneyStepEvent {\n const { requests: rawRequests, requestsTruncated, ...rest } = step;\n const requests = Array.isArray(rawRequests)\n ? rawRequests\n .slice(0, MAX_CORRELATED_REQUESTS)\n .map(sanitizeRequestCorrelation)\n .filter(request => request !== undefined)\n : [];\n const name = normalizeTagValue(step.name);\n return {\n ...rest,\n ...(requests.length ? { requests } : {}),\n ...(requestsTruncated === true ? { requestsTruncated: true } : {}),\n name: name || step.name,\n ...(step.reason ? { reason: normalizeTagValue(step.reason) } : {}),\n ...(step.attributes\n ? {\n attributes: copyRecord(step.attributes, {\n maxKeys: MAX_ATTRIBUTE_KEYS,\n normalizeKeys: true,\n }),\n }\n : {}),\n };\n}\n\n/** Default-sink payload: normalized keys/names, capped maps, no unsafe keys. */\nexport function sanitizeJourneyEvent(event: JourneyEvent): JourneyEvent {\n const j = event.journey;\n const expected = j.expected?.map(name => normalizeTagValue(name)).filter(name => name !== '');\n const tags = j.tags\n ? copyRecord(j.tags, { maxKeys: MAX_TAG_KEYS, normalizeKeys: true })\n : undefined;\n const tagKeys = tags ? Object.keys(tags) : [];\n const steps = j.steps.map(sanitizeStep);\n // Prefer recently started steps at the cap; failedRequest preserves the scoring request separately.\n let requestBudget = MAX_JOURNEY_CORRELATED_REQUESTS;\n for (let index = steps.length - 1; index >= 0; index--) {\n const step = steps[index];\n if (!step.requests) {\n continue;\n }\n if (step.requests.length > requestBudget) {\n step.requestsTruncated = true;\n if (requestBudget === 0) {\n delete step.requests;\n } else {\n step.requests = step.requests.slice(-requestBudget);\n }\n }\n requestBudget -= step.requests?.length ?? 0;\n }\n const failedRequest =\n j.outcome === 'bad' && j.failedRequest\n ? sanitizeRequestCorrelation(j.failedRequest)\n : undefined;\n const sanitized: JourneyEvent = {\n journey: {\n name: normalizeTagValue(j.name),\n team: normalizeTagValue(j.team),\n group: normalizeTagValue(j.group),\n service: normalizeTagValue(j.service),\n outcome: j.outcome,\n ...(failedRequest ? { failedRequest } : {}),\n ...(j.reason ? { reason: normalizeTagValue(j.reason) } : {}),\n durationMs: j.durationMs,\n steps,\n ...(expected?.length ? { expected } : {}),\n ...(tagKeys.length ? { tags } : {}),\n },\n };\n Object.defineProperty(sanitized, SANITIZED_EVENT, {\n value: true,\n enumerable: false,\n configurable: false,\n });\n return sanitized;\n}\n\n/** True when payload already passed through sanitizeJourneyEvent. */\nexport function isSanitizedJourneyEvent(event: JourneyEvent): boolean {\n return (event as unknown as Record<PropertyKey, unknown>)[SANITIZED_EVENT] === true;\n}\n"],"names":["isUnsafeKey","MAX_ATTRIBUTE_KEYS","MAX_TAG_KEYS","MAX_TAG_VALUE_LEN","MAX_CORRELATED_REQUESTS","MAX_JOURNEY_CORRELATED_REQUESTS","sanitizeRequestCorrelation","SANITIZED_EVENT","Symbol","for","normalizeTagValue","value","toLowerCase","replace","slice","emptyRecord","Object","create","asTagValue","undefined","copyRecord","src","options","out","normalizeKeys","normalizeStringValues","key","keys","destKey","raw","prototype","hasOwnProperty","call","length","maxKeys","assignRecord","target","room","exists","setSafeAttribute","attributes","next","sanitizeStep","step","requests","rawRequests","requestsTruncated","rest","Array","isArray","map","filter","request","name","reason","sanitizeJourneyEvent","event","j","journey","expected","tags","tagKeys","steps","requestBudget","index","failedRequest","outcome","sanitized","team","group","service","durationMs","defineProperty","enumerable","configurable","isSanitizedJourneyEvent"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-correlation.d.ts","sourceRoot":"","sources":["../../src/integrations/request-correlation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"request-correlation.d.ts","sourceRoot":"","sources":["../../src/integrations/request-correlation.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAYzD,iFAAiF;AACjF,wBAAgB,yBAAyB,CACrC,MAAM,EAAE,kBAAkB,GAC3B,mBAAmB,GAAG,SAAS,CAsEjC"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { MAX_CORRELATED_REQUESTS, sanitizeRequestCorrelation } from '../core/request-correlation';
|
|
1
|
+
import { isMonolithLogOrigin, MAX_CORRELATED_REQUESTS, sanitizeRequestCorrelation } from '../core/request-correlation';
|
|
2
2
|
import { canRouteHttpToJourney, resolveJourneyEngine } from '../core/runtime';
|
|
3
|
-
const MONOLITH_ORIGIN = 'https://go.servicetitan.com';
|
|
4
3
|
const capturedResponses = new WeakMap();
|
|
5
4
|
/** Observation only. Safe to run before jQuery invokes application callbacks. */ export function captureRequestCorrelation(report) {
|
|
6
5
|
try {
|
|
@@ -14,7 +13,7 @@ const capturedResponses = new WeakMap();
|
|
|
14
13
|
const pageUrl = (_globalThis_location = globalThis.location) === null || _globalThis_location === void 0 ? void 0 : _globalThis_location.href;
|
|
15
14
|
const base = report.baseURL ? new URL(report.baseURL, pageUrl).href : pageUrl;
|
|
16
15
|
const url = new URL(report.url, base);
|
|
17
|
-
if (url.
|
|
16
|
+
if (!isMonolithLogOrigin(url.href)) {
|
|
18
17
|
return;
|
|
19
18
|
}
|
|
20
19
|
const response = report.response;
|
|
@@ -27,7 +26,7 @@ const capturedResponses = new WeakMap();
|
|
|
27
26
|
return ((_step_requests = step.requests) === null || _step_requests === void 0 ? void 0 : _step_requests.includes(captured)) ? captured : undefined;
|
|
28
27
|
}
|
|
29
28
|
const finalUrl = response.url || response.responseURL || ((_response_request = response.request) === null || _response_request === void 0 ? void 0 : _response_request.responseURL);
|
|
30
|
-
if (finalUrl &&
|
|
29
|
+
if (finalUrl && !isMonolithLogOrigin(finalUrl)) {
|
|
31
30
|
return;
|
|
32
31
|
}
|
|
33
32
|
const rayId = typeof response.getResponseHeader === 'function' ? response.getResponseHeader('cf-ray') : typeof ((_response_headers = response.headers) === null || _response_headers === void 0 ? void 0 : _response_headers.get) === 'function' ? response.headers.get('cf-ray') : (_response_headers1 = response.headers) === null || _response_headers1 === void 0 ? void 0 : _response_headers1['cf-ray'];
|