@servicetitan/journey 3.0.1 → 4.1.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 +35 -0
- package/dist/__tests__/core/persist.test.d.ts +2 -0
- package/dist/__tests__/core/persist.test.d.ts.map +1 -0
- package/dist/__tests__/integrations/request-correlation.test.d.ts +2 -0
- package/dist/__tests__/integrations/request-correlation.test.d.ts.map +1 -0
- package/dist/__tests__/sinks/kibana.test.d.ts +2 -0
- package/dist/__tests__/sinks/kibana.test.d.ts.map +1 -0
- package/dist/core/api.d.ts +13 -1
- package/dist/core/api.d.ts.map +1 -1
- package/dist/core/api.js +14 -0
- package/dist/core/api.js.map +1 -1
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/persist.d.ts +19 -0
- package/dist/core/persist.d.ts.map +1 -0
- package/dist/core/persist.js +111 -0
- package/dist/core/persist.js.map +1 -0
- package/dist/core/request-correlation.d.ts +6 -0
- package/dist/core/request-correlation.d.ts.map +1 -0
- package/dist/core/request-correlation.js +15 -0
- package/dist/core/request-correlation.js.map +1 -0
- package/dist/core/runtime.d.ts +16 -1
- package/dist/core/runtime.d.ts.map +1 -1
- package/dist/core/runtime.js +74 -23
- package/dist/core/runtime.js.map +1 -1
- package/dist/core/sanitize.d.ts.map +1 -1
- package/dist/core/sanitize.js +36 -3
- package/dist/core/sanitize.js.map +1 -1
- package/dist/core/types.d.ts +42 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/integrations/axios.d.ts.map +1 -1
- package/dist/integrations/axios.js +2 -1
- package/dist/integrations/axios.js.map +1 -1
- package/dist/integrations/http-report.d.ts +2 -0
- package/dist/integrations/http-report.d.ts.map +1 -1
- package/dist/integrations/http-report.js +17 -2
- package/dist/integrations/http-report.js.map +1 -1
- package/dist/integrations/jquery/instrument.d.ts +2 -0
- package/dist/integrations/jquery/instrument.d.ts.map +1 -1
- package/dist/integrations/jquery/instrument.js +31 -4
- package/dist/integrations/jquery/instrument.js.map +1 -1
- package/dist/integrations/request-correlation.d.ts +5 -0
- package/dist/integrations/request-correlation.d.ts.map +1 -0
- package/dist/integrations/request-correlation.js +65 -0
- package/dist/integrations/request-correlation.js.map +1 -0
- package/dist/sinks/datadog.d.ts.map +1 -1
- package/dist/sinks/datadog.js +18 -0
- package/dist/sinks/datadog.js.map +1 -1
- package/dist/sinks/kibana.d.ts +4 -0
- package/dist/sinks/kibana.d.ts.map +1 -0
- package/dist/sinks/kibana.js +20 -0
- package/dist/sinks/kibana.js.map +1 -0
- package/package.json +2 -2
- package/src/__tests__/core/persist.test.ts +496 -0
- package/src/__tests__/integrations/axios.test.ts +38 -1
- package/src/__tests__/integrations/jquery.test.ts +94 -1
- package/src/__tests__/integrations/request-correlation.test.ts +315 -0
- package/src/__tests__/sinks/kibana.test.ts +110 -0
- package/src/core/api.ts +19 -0
- package/src/core/index.ts +4 -0
- package/src/core/persist.ts +131 -0
- package/src/core/request-correlation.ts +32 -0
- package/src/core/runtime.ts +69 -2
- package/src/core/sanitize.ts +41 -3
- package/src/core/types.ts +44 -0
- package/src/index.ts +4 -1
- package/src/integrations/axios.ts +1 -0
- package/src/integrations/http-report.ts +33 -14
- package/src/integrations/jquery/instrument.ts +37 -5
- package/src/integrations/request-correlation.ts +90 -0
- package/src/sinks/datadog.ts +19 -0
- package/src/sinks/kibana.ts +24 -0
package/dist/core/runtime.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { getAutoAttributeRequests as getSharedAutoAttributeRequests, getHttpAbortedRequestsPolicy as getSharedHttpAbortedRequestsPolicy, getHttpClientErrorRequestsPolicy as getSharedHttpClientErrorRequestsPolicy, getSharedSlowRequests, isJourneyDebugEnabled } from '../global';
|
|
2
2
|
import { isCanceledError } from './abort-error';
|
|
3
3
|
import { resolveEndpointPolicy, sortEndpointsByLongestMatch } from './endpoint-policy';
|
|
4
|
+
import { deserializeJourneyState, projectJourneyState } from './persist';
|
|
4
5
|
import { clampMaxSteps, DEFAULT_MAX_STEPS, DEFAULT_JOURNEY_IDLE_MS, finiteSlowRequestMs, finiteTimeoutMs, MAX_ATTRIBUTED_REQUEST_KEYS, MAX_TAG_KEYS, resolveJourneyTimeoutMs } from './limits';
|
|
5
6
|
import { assignRecord, emptyRecord, sanitizeJourneyEvent, setSafeAttribute } from './sanitize';
|
|
6
7
|
import { JourneyStepStamp, resolveStampOpts } from './step-tag';
|
|
@@ -23,7 +24,7 @@ function toName(target) {
|
|
|
23
24
|
}
|
|
24
25
|
return 'config' in target ? target.config.name : target.name;
|
|
25
26
|
}
|
|
26
|
-
function freezeJourneyDef(config, tags) {
|
|
27
|
+
/** @internal Freeze a caller-supplied journey def + tags snapshot. */ export function freezeJourneyDef(config, tags) {
|
|
27
28
|
const endpoints = sortEndpointsByLongestMatch(config.endpoints);
|
|
28
29
|
return Object.freeze({
|
|
29
30
|
...config,
|
|
@@ -42,7 +43,7 @@ function freezeJourneyDef(config, tags) {
|
|
|
42
43
|
})
|
|
43
44
|
});
|
|
44
45
|
}
|
|
45
|
-
function bindJourneyEngine(api, journey, shouldIgnoreRequest) {
|
|
46
|
+
/** @internal Bind the fail/exclude/report hooks for a journey's creating engine. */ export function bindJourneyEngine(api, journey, shouldIgnoreRequest) {
|
|
46
47
|
return {
|
|
47
48
|
failJourney (reason) {
|
|
48
49
|
api.failJourney(journey, reason);
|
|
@@ -146,7 +147,9 @@ function bindJourneyEngine(api, journey, shouldIgnoreRequest) {
|
|
|
146
147
|
finalOutcome = 'bad';
|
|
147
148
|
finalReason = finalReason !== null && finalReason !== void 0 ? finalReason : 'journey-timeout';
|
|
148
149
|
}
|
|
149
|
-
const steps = journey.steps.map((s)=>
|
|
150
|
+
const steps = journey.steps.map((s)=>{
|
|
151
|
+
var _s_requests;
|
|
152
|
+
return {
|
|
150
153
|
name: s.name,
|
|
151
154
|
startMs: Math.round(s.startedAt - journey.startedAt),
|
|
152
155
|
durationMs: s.durationMs,
|
|
@@ -161,8 +164,17 @@ function bindJourneyEngine(api, journey, shouldIgnoreRequest) {
|
|
|
161
164
|
attributes: {
|
|
162
165
|
...s.attributes
|
|
163
166
|
}
|
|
167
|
+
} : {},
|
|
168
|
+
...finalOutcome === 'bad' && ((_s_requests = s.requests) === null || _s_requests === void 0 ? void 0 : _s_requests.length) ? {
|
|
169
|
+
requests: s.requests.map((request)=>({
|
|
170
|
+
...request
|
|
171
|
+
}))
|
|
172
|
+
} : {},
|
|
173
|
+
...finalOutcome === 'bad' && s.requestsTruncated ? {
|
|
174
|
+
requestsTruncated: true
|
|
164
175
|
} : {}
|
|
165
|
-
}
|
|
176
|
+
};
|
|
177
|
+
});
|
|
166
178
|
emit({
|
|
167
179
|
journey: {
|
|
168
180
|
name: journey.name,
|
|
@@ -170,6 +182,11 @@ function bindJourneyEngine(api, journey, shouldIgnoreRequest) {
|
|
|
170
182
|
group: journey.group,
|
|
171
183
|
service: journey.service,
|
|
172
184
|
outcome: finalOutcome,
|
|
185
|
+
...finalOutcome === 'bad' && journey.scoringRequest ? {
|
|
186
|
+
failedRequest: {
|
|
187
|
+
...journey.scoringRequest
|
|
188
|
+
}
|
|
189
|
+
} : {},
|
|
173
190
|
...finalReason ? {
|
|
174
191
|
reason: finalReason
|
|
175
192
|
} : {},
|
|
@@ -281,35 +298,35 @@ function bindJourneyEngine(api, journey, shouldIgnoreRequest) {
|
|
|
281
298
|
getSlowRequests () {
|
|
282
299
|
return effectiveSlowRequests();
|
|
283
300
|
},
|
|
284
|
-
setSlowRequests (
|
|
301
|
+
setSlowRequests (next) {
|
|
285
302
|
slowRequests = {
|
|
286
|
-
...
|
|
287
|
-
endpoints: sortEndpointsByLongestMatch(
|
|
303
|
+
...next,
|
|
304
|
+
endpoints: sortEndpointsByLongestMatch(next.endpoints)
|
|
288
305
|
};
|
|
289
306
|
},
|
|
290
307
|
getMaxSteps () {
|
|
291
308
|
return maxSteps;
|
|
292
309
|
},
|
|
293
|
-
setMaxSteps (
|
|
294
|
-
maxSteps = clampMaxSteps(
|
|
310
|
+
setMaxSteps (next) {
|
|
311
|
+
maxSteps = clampMaxSteps(next);
|
|
295
312
|
},
|
|
296
313
|
getDefaultJourneyIdleMs () {
|
|
297
314
|
return defaultJourneyIdleMs;
|
|
298
315
|
},
|
|
299
|
-
setDefaultJourneyIdleMs (
|
|
300
|
-
defaultJourneyIdleMs = finiteTimeoutMs(
|
|
316
|
+
setDefaultJourneyIdleMs (next) {
|
|
317
|
+
defaultJourneyIdleMs = finiteTimeoutMs(next);
|
|
301
318
|
},
|
|
302
|
-
setSinks (
|
|
319
|
+
setSinks (next) {
|
|
303
320
|
sinks = [
|
|
304
|
-
...
|
|
321
|
+
...next
|
|
305
322
|
];
|
|
306
323
|
},
|
|
307
|
-
trySetConfiguredSinks (
|
|
324
|
+
trySetConfiguredSinks (next) {
|
|
308
325
|
if (sinksConfigured) {
|
|
309
326
|
return false;
|
|
310
327
|
}
|
|
311
328
|
sinks = [
|
|
312
|
-
...
|
|
329
|
+
...next
|
|
313
330
|
];
|
|
314
331
|
sinksConfigured = true;
|
|
315
332
|
return true;
|
|
@@ -318,10 +335,10 @@ function bindJourneyEngine(api, journey, shouldIgnoreRequest) {
|
|
|
318
335
|
sinks.push(sink);
|
|
319
336
|
},
|
|
320
337
|
emit,
|
|
321
|
-
setPolicyOverlay (
|
|
338
|
+
setPolicyOverlay (next) {
|
|
322
339
|
overlay = {
|
|
323
340
|
...overlay,
|
|
324
|
-
...
|
|
341
|
+
...next
|
|
325
342
|
};
|
|
326
343
|
},
|
|
327
344
|
getAutoAttributeRequests () {
|
|
@@ -507,6 +524,40 @@ function bindJourneyEngine(api, journey, shouldIgnoreRequest) {
|
|
|
507
524
|
}
|
|
508
525
|
armCountdown(journey, remainingMs);
|
|
509
526
|
},
|
|
527
|
+
serializeJourneyState (name) {
|
|
528
|
+
const journey = journeys.get(name);
|
|
529
|
+
if (!journey || journey.closed) {
|
|
530
|
+
return null;
|
|
531
|
+
}
|
|
532
|
+
return projectJourneyState(journey);
|
|
533
|
+
},
|
|
534
|
+
restoreJourney (serialized, config) {
|
|
535
|
+
// Refuse double-registration: leave an existing journey under this name in place.
|
|
536
|
+
if (journeys.has(config.name)) {
|
|
537
|
+
return null;
|
|
538
|
+
}
|
|
539
|
+
const journey = deserializeJourneyState(serialized, config, api, defaultJourneyIdleMs);
|
|
540
|
+
if (journey.timeoutMs > 0) {
|
|
541
|
+
const elapsedMs = globalThis.performance.now() - journey.startedAt;
|
|
542
|
+
if (elapsedMs >= journey.timeoutMs) {
|
|
543
|
+
// journey not yet in journeys Map — finish() handles unregistered journeys gracefully.
|
|
544
|
+
if (journey.timeoutExplicit) {
|
|
545
|
+
finish(journey, 'bad', 'journey-timeout');
|
|
546
|
+
} else {
|
|
547
|
+
finish(journey, journey.verdict === 'bad' ? 'bad' : 'excluded', 'journey-idle-timeout');
|
|
548
|
+
}
|
|
549
|
+
return null;
|
|
550
|
+
}
|
|
551
|
+
journeys.set(config.name, journey);
|
|
552
|
+
const remainingMs = journey.timeoutMs - elapsedMs;
|
|
553
|
+
if (remainingMs > 0) {
|
|
554
|
+
armCountdown(journey, remainingMs);
|
|
555
|
+
}
|
|
556
|
+
} else {
|
|
557
|
+
journeys.set(config.name, journey);
|
|
558
|
+
}
|
|
559
|
+
return journey;
|
|
560
|
+
},
|
|
510
561
|
activeJourneyStep () {
|
|
511
562
|
var _inFlight_values_next_value;
|
|
512
563
|
if (!api.getAutoAttributeRequests()) {
|
|
@@ -617,7 +668,7 @@ function bindJourneyEngine(api, journey, shouldIgnoreRequest) {
|
|
|
617
668
|
}
|
|
618
669
|
api.failJourney(journey, category);
|
|
619
670
|
},
|
|
620
|
-
reset (
|
|
671
|
+
reset (next = {}) {
|
|
621
672
|
var _next_sinks, _ref, _ref1, _next_defaultJourneyIdleMs;
|
|
622
673
|
var _next_slowRequests, _next_slowRequests1;
|
|
623
674
|
for (const journey of [
|
|
@@ -631,14 +682,14 @@ function bindJourneyEngine(api, journey, shouldIgnoreRequest) {
|
|
|
631
682
|
overlay = {};
|
|
632
683
|
sinksConfigured = false;
|
|
633
684
|
sinks = [
|
|
634
|
-
...(_next_sinks =
|
|
685
|
+
...(_next_sinks = next.sinks) !== null && _next_sinks !== void 0 ? _next_sinks : []
|
|
635
686
|
];
|
|
636
687
|
slowRequests = {
|
|
637
|
-
defaultMs: (_ref = (_next_slowRequests =
|
|
638
|
-
endpoints: sortEndpointsByLongestMatch((_ref1 = (_next_slowRequests1 =
|
|
688
|
+
defaultMs: (_ref = (_next_slowRequests = next.slowRequests) === null || _next_slowRequests === void 0 ? void 0 : _next_slowRequests.defaultMs) !== null && _ref !== void 0 ? _ref : DEFAULT_SLOW_REQUESTS.defaultMs,
|
|
689
|
+
endpoints: sortEndpointsByLongestMatch((_ref1 = (_next_slowRequests1 = next.slowRequests) === null || _next_slowRequests1 === void 0 ? void 0 : _next_slowRequests1.endpoints) !== null && _ref1 !== void 0 ? _ref1 : DEFAULT_SLOW_REQUESTS.endpoints)
|
|
639
690
|
};
|
|
640
|
-
maxSteps =
|
|
641
|
-
defaultJourneyIdleMs = finiteTimeoutMs((_next_defaultJourneyIdleMs =
|
|
691
|
+
maxSteps = next.maxSteps !== undefined ? clampMaxSteps(next.maxSteps) : DEFAULT_MAX_STEPS;
|
|
692
|
+
defaultJourneyIdleMs = finiteTimeoutMs((_next_defaultJourneyIdleMs = next.defaultJourneyIdleMs) !== null && _next_defaultJourneyIdleMs !== void 0 ? _next_defaultJourneyIdleMs : DEFAULT_JOURNEY_IDLE_MS);
|
|
642
693
|
}
|
|
643
694
|
};
|
|
644
695
|
return api;
|
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 {\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 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\nfunction 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 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\nfunction 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 }));\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 ...(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 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","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","team","group","service","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","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 ...(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 +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;
|
|
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;AA6BD,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
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { isUnsafeKey, MAX_ATTRIBUTE_KEYS, MAX_TAG_KEYS, MAX_TAG_VALUE_LEN } from './limits';
|
|
2
|
+
import { MAX_CORRELATED_REQUESTS, MAX_JOURNEY_CORRELATED_REQUESTS, sanitizeRequestCorrelation } from './request-correlation';
|
|
2
3
|
const SANITIZED_EVENT = Symbol.for('st.journey.sanitized');
|
|
3
4
|
/** Match Datadog metric-tag value rules so RUM attributes / globals join derived SLO tags. */ export function normalizeTagValue(value) {
|
|
4
5
|
return value.toLowerCase().replace(/[^a-z0-9_\-:./]/g, '_').replace(/_+/g, '_').slice(0, MAX_TAG_VALUE_LEN).replace(/_+$/, '');
|
|
@@ -84,10 +85,18 @@ export function setSafeAttribute(attributes, key, value) {
|
|
|
84
85
|
attributes[key] = next;
|
|
85
86
|
}
|
|
86
87
|
}
|
|
87
|
-
function sanitizeStep(step) {
|
|
88
|
+
function sanitizeStep(step, includeRequests) {
|
|
89
|
+
const { requests: rawRequests, requestsTruncated, ...rest } = step;
|
|
90
|
+
const requests = includeRequests && Array.isArray(rawRequests) ? rawRequests.slice(0, MAX_CORRELATED_REQUESTS).map(sanitizeRequestCorrelation).filter((request)=>request !== undefined) : [];
|
|
88
91
|
const name = normalizeTagValue(step.name);
|
|
89
92
|
return {
|
|
90
|
-
...
|
|
93
|
+
...rest,
|
|
94
|
+
...requests.length ? {
|
|
95
|
+
requests
|
|
96
|
+
} : {},
|
|
97
|
+
...includeRequests && requestsTruncated === true ? {
|
|
98
|
+
requestsTruncated: true
|
|
99
|
+
} : {},
|
|
91
100
|
name: name || step.name,
|
|
92
101
|
...step.reason ? {
|
|
93
102
|
reason: normalizeTagValue(step.reason)
|
|
@@ -109,6 +118,27 @@ function sanitizeStep(step) {
|
|
|
109
118
|
normalizeKeys: true
|
|
110
119
|
}) : undefined;
|
|
111
120
|
const tagKeys = tags ? Object.keys(tags) : [];
|
|
121
|
+
const steps = j.steps.map((step)=>sanitizeStep(step, j.outcome === 'bad'));
|
|
122
|
+
// Prefer recently started steps at the cap; failedRequest preserves the scoring request separately.
|
|
123
|
+
let requestBudget = MAX_JOURNEY_CORRELATED_REQUESTS;
|
|
124
|
+
for(let index = steps.length - 1; index >= 0; index--){
|
|
125
|
+
var _ref;
|
|
126
|
+
var _step_requests;
|
|
127
|
+
const step = steps[index];
|
|
128
|
+
if (!step.requests) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (step.requests.length > requestBudget) {
|
|
132
|
+
step.requestsTruncated = true;
|
|
133
|
+
if (requestBudget === 0) {
|
|
134
|
+
delete step.requests;
|
|
135
|
+
} else {
|
|
136
|
+
step.requests = step.requests.slice(-requestBudget);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
requestBudget -= (_ref = (_step_requests = step.requests) === null || _step_requests === void 0 ? void 0 : _step_requests.length) !== null && _ref !== void 0 ? _ref : 0;
|
|
140
|
+
}
|
|
141
|
+
const failedRequest = j.outcome === 'bad' && j.failedRequest ? sanitizeRequestCorrelation(j.failedRequest) : undefined;
|
|
112
142
|
const sanitized = {
|
|
113
143
|
journey: {
|
|
114
144
|
name: normalizeTagValue(j.name),
|
|
@@ -116,11 +146,14 @@ function sanitizeStep(step) {
|
|
|
116
146
|
group: normalizeTagValue(j.group),
|
|
117
147
|
service: normalizeTagValue(j.service),
|
|
118
148
|
outcome: j.outcome,
|
|
149
|
+
...failedRequest ? {
|
|
150
|
+
failedRequest
|
|
151
|
+
} : {},
|
|
119
152
|
...j.reason ? {
|
|
120
153
|
reason: normalizeTagValue(j.reason)
|
|
121
154
|
} : {},
|
|
122
155
|
durationMs: j.durationMs,
|
|
123
|
-
steps
|
|
156
|
+
steps,
|
|
124
157
|
...(expected === null || expected === void 0 ? void 0 : expected.length) ? {
|
|
125
158
|
expected
|
|
126
159
|
} : {},
|
|
@@ -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';\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 name = normalizeTagValue(step.name);\n return {\n ...step,\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 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 ...(j.reason ? { reason: normalizeTagValue(j.reason) } : {}),\n durationMs: j.durationMs,\n steps: j.steps.map(sanitizeStep),\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","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","name","reason","sanitizeJourneyEvent","event","j","journey","expected","map","filter","tags","tagKeys","sanitized","team","group","service","outcome","durationMs","steps","defineProperty","enumerable","configurable","isSanitizedJourneyEvent"],"mappings":"AAAA,SAASA,WAAW,EAAEC,kBAAkB,EAAEC,YAAY,EAAEC,iBAAiB,QAAQ,WAAW;AAG5F,MAAMC,kBAAkBC,OAAOC,GAAG,CAAC;AAEnC,4FAA4F,GAC5F,OAAO,SAASC,kBAAkBC,KAAa;IAC3C,OAAOA,MACFC,WAAW,GACXC,OAAO,CAAC,oBAAoB,KAC5BA,OAAO,CAAC,OAAO,KACfC,KAAK,CAAC,GAAGR,mBACTO,OAAO,CAAC,OAAO;AACxB;AAEA,OAAO,SAASE;IACZ,OAAOC,OAAOC,MAAM,CAAC;AACzB;AAEA,SAASC,WAAWP,KAAc;IAC9B,IAAI,OAAOA,UAAU,UAAU;QAC3B,OAAOD,kBAAkBC;IAC7B;IACA,IAAI,OAAOA,UAAU,YAAY,OAAOA,UAAU,WAAW;QACzD,OAAOA;IACX;IACA,OAAOQ;AACX;AAUA;;CAEC,GACD,OAAO,SAASC,WACZC,GAAwC,EACxCC,OAA0B;IAE1B,MAAMC,MAAMR;IACZ,IAAIM,OAAO,QAAQ,OAAOA,QAAQ,UAAU;QACxC,OAAOE;IACX;IACA,MAAMC,gBAAgBF,QAAQE,aAAa,KAAK;IAChD,MAAMC,wBAAwBH,QAAQG,qBAAqB,KAAK;IAChE,KAAK,MAAMC,OAAOV,OAAOW,IAAI,CAACN,KAAM;QAChC,IAAIlB,YAAYuB,MAAM;YAClB;QACJ;QACA,MAAME,UAAUJ,gBAAgBd,kBAAkBgB,OAAOA;QACzD,IAAI,CAACE,WAAWzB,YAAYyB,UAAU;YAClC;QACJ;QACA,MAAMC,MAAMR,GAAG,CAACK,IAAI;QACpB,MAAMf,QAAQc,wBACRP,WAAWW,OACX,OAAOA,QAAQ,YAAY,OAAOA,QAAQ,YAAY,OAAOA,QAAQ,YACnEA,MACAV;QACR,IAAIR,UAAUQ,WAAW;YACrB;QACJ;QACA,IAAIH,OAAOc,SAAS,CAACC,cAAc,CAACC,IAAI,CAACT,KAAKK,UAAU;YACpDL,GAAG,CAACK,QAAQ,GAAGjB;YACf;QACJ;QACA,IAAIK,OAAOW,IAAI,CAACJ,KAAKU,MAAM,IAAIX,QAAQY,OAAO,EAAE;YAC5C;QACJ;QACAX,GAAG,CAACK,QAAQ,GAAGjB;IACnB;IACA,OAAOY;AACX;AAEA,qFAAqF,GACrF,OAAO,SAASY,aACZC,MAAgC,EAChCf,GAAwC,EACxCa,OAAe;IAEf,IAAIb,OAAO,QAAQ,OAAOA,QAAQ,UAAU;QACxC;IACJ;IACA,IAAIgB,OAAOH,UAAUlB,OAAOW,IAAI,CAACS,QAAQH,MAAM;IAC/C,KAAK,MAAMP,OAAOV,OAAOW,IAAI,CAACN,KAAM;QAChC,IAAIlB,YAAYuB,MAAM;YAClB;QACJ;QACA,MAAMG,MAAMR,GAAG,CAACK,IAAI;QACpB,IAAI,OAAOG,QAAQ,YAAY,OAAOA,QAAQ,YAAY,OAAOA,QAAQ,WAAW;YAChF;QACJ;QACA,MAAMS,SAAStB,OAAOc,SAAS,CAACC,cAAc,CAACC,IAAI,CAACI,QAAQV;QAC5D,IAAI,CAACY,UAAUD,QAAQ,GAAG;YACtB;QACJ;QACA,IAAI,CAACC,QAAQ;YACTD,QAAQ;QACZ;QACAD,MAAM,CAACV,IAAI,GAAGG;IAClB;AACJ;AAEA,OAAO,SAASU,iBACZC,UAAoC,EACpCd,GAAW,EACXf,KAAgC;IAEhC,IAAIR,YAAYuB,MAAM;QAClB;IACJ;IACA,MAAMY,SAAStB,OAAOc,SAAS,CAACC,cAAc,CAACC,IAAI,CAACQ,YAAYd;IAChE,IAAI,CAACY,UAAUtB,OAAOW,IAAI,CAACa,YAAYP,MAAM,IAAI7B,oBAAoB;QACjE;IACJ;IACA,MAAMqC,OAAOvB,WAAWP;IACxB,IAAI8B,SAAStB,WAAW;QACpBqB,UAAU,CAACd,IAAI,GAAGe;IACtB;AACJ;AAEA,SAASC,aAAaC,IAAsB;IACxC,MAAMC,OAAOlC,kBAAkBiC,KAAKC,IAAI;IACxC,OAAO;QACH,GAAGD,IAAI;QACPC,MAAMA,QAAQD,KAAKC,IAAI;QACvB,GAAID,KAAKE,MAAM,GAAG;YAAEA,QAAQnC,kBAAkBiC,KAAKE,MAAM;QAAE,IAAI,CAAC,CAAC;QACjE,GAAIF,KAAKH,UAAU,GACb;YACIA,YAAYpB,WAAWuB,KAAKH,UAAU,EAAE;gBACpCN,SAAS9B;gBACToB,eAAe;YACnB;QACJ,IACA,CAAC,CAAC;IACZ;AACJ;AAEA,8EAA8E,GAC9E,OAAO,SAASsB,qBAAqBC,KAAmB;QAEnCC;IADjB,MAAMA,IAAID,MAAME,OAAO;IACvB,MAAMC,YAAWF,cAAAA,EAAEE,QAAQ,cAAVF,kCAAAA,YAAYG,GAAG,CAACP,CAAAA,OAAQlC,kBAAkBkC,OAAOQ,MAAM,CAACR,CAAAA,OAAQA,SAAS;IAC1F,MAAMS,OAAOL,EAAEK,IAAI,GACbjC,WAAW4B,EAAEK,IAAI,EAAE;QAAEnB,SAAS7B;QAAcmB,eAAe;IAAK,KAChEL;IACN,MAAMmC,UAAUD,OAAOrC,OAAOW,IAAI,CAAC0B,QAAQ,EAAE;IAC7C,MAAME,YAA0B;QAC5BN,SAAS;YACLL,MAAMlC,kBAAkBsC,EAAEJ,IAAI;YAC9BY,MAAM9C,kBAAkBsC,EAAEQ,IAAI;YAC9BC,OAAO/C,kBAAkBsC,EAAES,KAAK;YAChCC,SAAShD,kBAAkBsC,EAAEU,OAAO;YACpCC,SAASX,EAAEW,OAAO;YAClB,GAAIX,EAAEH,MAAM,GAAG;gBAAEA,QAAQnC,kBAAkBsC,EAAEH,MAAM;YAAE,IAAI,CAAC,CAAC;YAC3De,YAAYZ,EAAEY,UAAU;YACxBC,OAAOb,EAAEa,KAAK,CAACV,GAAG,CAACT;YACnB,GAAIQ,CAAAA,qBAAAA,+BAAAA,SAAUjB,MAAM,IAAG;gBAAEiB;YAAS,IAAI,CAAC,CAAC;YACxC,GAAII,QAAQrB,MAAM,GAAG;gBAAEoB;YAAK,IAAI,CAAC,CAAC;QACtC;IACJ;IACArC,OAAO8C,cAAc,CAACP,WAAWhD,iBAAiB;QAC9CI,OAAO;QACPoD,YAAY;QACZC,cAAc;IAClB;IACA,OAAOT;AACX;AAEA,mEAAmE,GACnE,OAAO,SAASU,wBAAwBlB,KAAmB;IACvD,OAAO,AAACA,KAAiD,CAACxC,gBAAgB,KAAK;AACnF"}
|
|
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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"}
|