@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.
Files changed (79) hide show
  1. package/README.md +35 -0
  2. package/dist/__tests__/core/persist.test.d.ts +2 -0
  3. package/dist/__tests__/core/persist.test.d.ts.map +1 -0
  4. package/dist/__tests__/integrations/request-correlation.test.d.ts +2 -0
  5. package/dist/__tests__/integrations/request-correlation.test.d.ts.map +1 -0
  6. package/dist/__tests__/sinks/kibana.test.d.ts +2 -0
  7. package/dist/__tests__/sinks/kibana.test.d.ts.map +1 -0
  8. package/dist/core/api.d.ts +13 -1
  9. package/dist/core/api.d.ts.map +1 -1
  10. package/dist/core/api.js +14 -0
  11. package/dist/core/api.js.map +1 -1
  12. package/dist/core/index.d.ts +2 -2
  13. package/dist/core/index.d.ts.map +1 -1
  14. package/dist/core/index.js +1 -1
  15. package/dist/core/index.js.map +1 -1
  16. package/dist/core/persist.d.ts +19 -0
  17. package/dist/core/persist.d.ts.map +1 -0
  18. package/dist/core/persist.js +111 -0
  19. package/dist/core/persist.js.map +1 -0
  20. package/dist/core/request-correlation.d.ts +6 -0
  21. package/dist/core/request-correlation.d.ts.map +1 -0
  22. package/dist/core/request-correlation.js +15 -0
  23. package/dist/core/request-correlation.js.map +1 -0
  24. package/dist/core/runtime.d.ts +16 -1
  25. package/dist/core/runtime.d.ts.map +1 -1
  26. package/dist/core/runtime.js +74 -23
  27. package/dist/core/runtime.js.map +1 -1
  28. package/dist/core/sanitize.d.ts.map +1 -1
  29. package/dist/core/sanitize.js +36 -3
  30. package/dist/core/sanitize.js.map +1 -1
  31. package/dist/core/types.d.ts +42 -0
  32. package/dist/core/types.d.ts.map +1 -1
  33. package/dist/core/types.js.map +1 -1
  34. package/dist/index.d.ts +2 -2
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +1 -1
  37. package/dist/index.js.map +1 -1
  38. package/dist/integrations/axios.d.ts.map +1 -1
  39. package/dist/integrations/axios.js +2 -1
  40. package/dist/integrations/axios.js.map +1 -1
  41. package/dist/integrations/http-report.d.ts +2 -0
  42. package/dist/integrations/http-report.d.ts.map +1 -1
  43. package/dist/integrations/http-report.js +17 -2
  44. package/dist/integrations/http-report.js.map +1 -1
  45. package/dist/integrations/jquery/instrument.d.ts +2 -0
  46. package/dist/integrations/jquery/instrument.d.ts.map +1 -1
  47. package/dist/integrations/jquery/instrument.js +31 -4
  48. package/dist/integrations/jquery/instrument.js.map +1 -1
  49. package/dist/integrations/request-correlation.d.ts +5 -0
  50. package/dist/integrations/request-correlation.d.ts.map +1 -0
  51. package/dist/integrations/request-correlation.js +65 -0
  52. package/dist/integrations/request-correlation.js.map +1 -0
  53. package/dist/sinks/datadog.d.ts.map +1 -1
  54. package/dist/sinks/datadog.js +18 -0
  55. package/dist/sinks/datadog.js.map +1 -1
  56. package/dist/sinks/kibana.d.ts +4 -0
  57. package/dist/sinks/kibana.d.ts.map +1 -0
  58. package/dist/sinks/kibana.js +20 -0
  59. package/dist/sinks/kibana.js.map +1 -0
  60. package/package.json +2 -2
  61. package/src/__tests__/core/persist.test.ts +496 -0
  62. package/src/__tests__/integrations/axios.test.ts +38 -1
  63. package/src/__tests__/integrations/jquery.test.ts +94 -1
  64. package/src/__tests__/integrations/request-correlation.test.ts +315 -0
  65. package/src/__tests__/sinks/kibana.test.ts +110 -0
  66. package/src/core/api.ts +19 -0
  67. package/src/core/index.ts +4 -0
  68. package/src/core/persist.ts +131 -0
  69. package/src/core/request-correlation.ts +32 -0
  70. package/src/core/runtime.ts +69 -2
  71. package/src/core/sanitize.ts +41 -3
  72. package/src/core/types.ts +44 -0
  73. package/src/index.ts +4 -1
  74. package/src/integrations/axios.ts +1 -0
  75. package/src/integrations/http-report.ts +33 -14
  76. package/src/integrations/jquery/instrument.ts +37 -5
  77. package/src/integrations/request-correlation.ts +90 -0
  78. package/src/sinks/datadog.ts +19 -0
  79. package/src/sinks/kibana.ts +24 -0
@@ -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 (next1) {
301
+ setSlowRequests (next) {
285
302
  slowRequests = {
286
- ...next1,
287
- endpoints: sortEndpointsByLongestMatch(next1.endpoints)
303
+ ...next,
304
+ endpoints: sortEndpointsByLongestMatch(next.endpoints)
288
305
  };
289
306
  },
290
307
  getMaxSteps () {
291
308
  return maxSteps;
292
309
  },
293
- setMaxSteps (next1) {
294
- maxSteps = clampMaxSteps(next1);
310
+ setMaxSteps (next) {
311
+ maxSteps = clampMaxSteps(next);
295
312
  },
296
313
  getDefaultJourneyIdleMs () {
297
314
  return defaultJourneyIdleMs;
298
315
  },
299
- setDefaultJourneyIdleMs (next1) {
300
- defaultJourneyIdleMs = finiteTimeoutMs(next1);
316
+ setDefaultJourneyIdleMs (next) {
317
+ defaultJourneyIdleMs = finiteTimeoutMs(next);
301
318
  },
302
- setSinks (next1) {
319
+ setSinks (next) {
303
320
  sinks = [
304
- ...next1
321
+ ...next
305
322
  ];
306
323
  },
307
- trySetConfiguredSinks (next1) {
324
+ trySetConfiguredSinks (next) {
308
325
  if (sinksConfigured) {
309
326
  return false;
310
327
  }
311
328
  sinks = [
312
- ...next1
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 (next1) {
338
+ setPolicyOverlay (next) {
322
339
  overlay = {
323
340
  ...overlay,
324
- ...next1
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 (next1 = {}) {
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 = next1.sinks) !== null && _next_sinks !== void 0 ? _next_sinks : []
685
+ ...(_next_sinks = next.sinks) !== null && _next_sinks !== void 0 ? _next_sinks : []
635
686
  ];
636
687
  slowRequests = {
637
- defaultMs: (_ref = (_next_slowRequests = next1.slowRequests) === null || _next_slowRequests === void 0 ? void 0 : _next_slowRequests.defaultMs) !== null && _ref !== void 0 ? _ref : DEFAULT_SLOW_REQUESTS.defaultMs,
638
- endpoints: sortEndpointsByLongestMatch((_ref1 = (_next_slowRequests1 = next1.slowRequests) === null || _next_slowRequests1 === void 0 ? void 0 : _next_slowRequests1.endpoints) !== null && _ref1 !== void 0 ? _ref1 : DEFAULT_SLOW_REQUESTS.endpoints)
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 = next1.maxSteps !== undefined ? clampMaxSteps(next1.maxSteps) : DEFAULT_MAX_STEPS;
641
- defaultJourneyIdleMs = finiteTimeoutMs((_next_defaultJourneyIdleMs = next1.defaultJourneyIdleMs) !== null && _next_defaultJourneyIdleMs !== void 0 ? _next_defaultJourneyIdleMs : DEFAULT_JOURNEY_IDLE_MS);
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;
@@ -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;AAIxE,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;AAmBD,gFAAgF;AAChF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,CA2BtE;AAED,qEAAqE;AACrE,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAEpE"}
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"}
@@ -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
- ...step,
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: j.steps.map(sanitizeStep),
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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"}