@servicetitan/journey 4.0.0 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +35 -0
  2. package/dist/__tests__/integrations/request-correlation.test.d.ts +2 -0
  3. package/dist/__tests__/integrations/request-correlation.test.d.ts.map +1 -0
  4. package/dist/__tests__/sinks/datadog-links.test.d.ts +2 -0
  5. package/dist/__tests__/sinks/datadog-links.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/index.d.ts +1 -1
  9. package/dist/core/index.d.ts.map +1 -1
  10. package/dist/core/index.js.map +1 -1
  11. package/dist/core/request-correlation.d.ts +8 -0
  12. package/dist/core/request-correlation.d.ts.map +1 -0
  13. package/dist/core/request-correlation.js +23 -0
  14. package/dist/core/request-correlation.js.map +1 -0
  15. package/dist/core/runtime.d.ts.map +1 -1
  16. package/dist/core/runtime.js +18 -2
  17. package/dist/core/runtime.js.map +1 -1
  18. package/dist/core/sanitize.d.ts.map +1 -1
  19. package/dist/core/sanitize.js +35 -2
  20. package/dist/core/sanitize.js.map +1 -1
  21. package/dist/core/types.d.ts +17 -0
  22. package/dist/core/types.d.ts.map +1 -1
  23. package/dist/core/types.js.map +1 -1
  24. package/dist/index.d.ts +1 -1
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js.map +1 -1
  27. package/dist/integrations/axios.d.ts.map +1 -1
  28. package/dist/integrations/axios.js +2 -1
  29. package/dist/integrations/axios.js.map +1 -1
  30. package/dist/integrations/http-report.d.ts +2 -0
  31. package/dist/integrations/http-report.d.ts.map +1 -1
  32. package/dist/integrations/http-report.js +17 -2
  33. package/dist/integrations/http-report.js.map +1 -1
  34. package/dist/integrations/jquery/instrument.d.ts +2 -0
  35. package/dist/integrations/jquery/instrument.d.ts.map +1 -1
  36. package/dist/integrations/jquery/instrument.js +31 -4
  37. package/dist/integrations/jquery/instrument.js.map +1 -1
  38. package/dist/integrations/request-correlation.d.ts +5 -0
  39. package/dist/integrations/request-correlation.d.ts.map +1 -0
  40. package/dist/integrations/request-correlation.js +64 -0
  41. package/dist/integrations/request-correlation.js.map +1 -0
  42. package/dist/sinks/datadog.d.ts.map +1 -1
  43. package/dist/sinks/datadog.js +26 -0
  44. package/dist/sinks/datadog.js.map +1 -1
  45. package/dist/sinks/kibana.d.ts +11 -0
  46. package/dist/sinks/kibana.d.ts.map +1 -0
  47. package/dist/sinks/kibana.js +92 -0
  48. package/dist/sinks/kibana.js.map +1 -0
  49. package/package.json +2 -2
  50. package/src/__tests__/integrations/axios.test.ts +38 -1
  51. package/src/__tests__/integrations/jquery.test.ts +94 -1
  52. package/src/__tests__/integrations/request-correlation.test.ts +383 -0
  53. package/src/__tests__/sinks/datadog-links.test.ts +58 -0
  54. package/src/__tests__/sinks/kibana.test.ts +267 -0
  55. package/src/core/index.ts +1 -0
  56. package/src/core/request-correlation.ts +51 -0
  57. package/src/core/runtime.ts +7 -0
  58. package/src/core/sanitize.ts +39 -2
  59. package/src/core/types.ts +18 -0
  60. package/src/index.ts +1 -1
  61. package/src/integrations/axios.ts +1 -0
  62. package/src/integrations/http-report.ts +33 -14
  63. package/src/integrations/jquery/instrument.ts +37 -5
  64. package/src/integrations/request-correlation.ts +93 -0
  65. package/src/sinks/datadog.ts +21 -0
  66. package/src/sinks/kibana.ts +140 -0
package/README.md CHANGED
@@ -5,3 +5,38 @@ Critical user journey monitoring for Datadog RUM (`user_journey` custom actions)
5
5
  - **Docs:** [Journey](https://docs.st.dev/docs/frontend/journey) (source: [`packages/docs/docs/journey.mdx`](../docs/docs/journey.mdx))
6
6
 
7
7
  Prefer `defineJourney` handles (`.start` / `.step` / `.complete`). Soft ambient attributes HTTP only when exactly one step is in flight — pass `{ stamp: step.stamp() }` after `await` or when steps overlap. `start()` always opens a new instance. Default aborted-request policy is `continue`.
8
+
9
+ ## Kibana links on journeys
10
+
11
+ Open `context.journey.kibana_url`, regardless of the journey's outcome or failure reason.
12
+
13
+ - `kibana_scope: request`: the identified request that caused an HTTP-scored failure.
14
+ Its ID is also in `failed_request_id`. Existing precise links are unchanged.
15
+ - `kibana_scope: related_logs`: a search for this tenant and username/email during
16
+ the journey, with a one-minute buffer. This covers step errors, timeouts, network
17
+ failures without a response, and good/excluded journeys when host user context exists.
18
+ - `kibana_scope: related_requests`: captured requests when host user context is unavailable.
19
+ These requests are context, not proof that they caused the failure.
20
+
21
+ Every retained response with a readable `cf-ray` also has its own
22
+ `steps[].requests[].kibana_url`, including successful responses. The existing limits
23
+ remain: five requests per step and 20 across the event, with `requests_truncated` flags.
24
+ The feature adds no network calls or changes to scoring, thresholds, or transport behavior.
25
+
26
+ Supported origins are `https://go.servicetitan.com` and production Enterprise Hub
27
+ monolith hosts (`https://<tenant>.eh.go.servicetitan.com`), verified against the same
28
+ production log view. Other origins are not assumed to share that log contract.
29
+ Ignored/aborted requests are not captured. Cross-page serialization does not carry
30
+ request history from the previous page.
31
+
32
+ Related-log searches read `tenant` and `name`/`email` from the host RUM `getUser()`.
33
+ Those existing identity values are included in the link's query; request URLs, bodies,
34
+ and other headers are not collected. Missing identity never falls back to all tenants.
35
+ Without usable user context or any captured request IDs, no safe link can be built.
36
+ Frontend-only failures and requests that never reached the app may have no backend logs.
37
+ The existing `usr.kibanaUrl` is untouched. Links are event details, not metric tags.
38
+
39
+ The updated package must be published, adopted, and deployed by the host. Separately
40
+ bundled MFEs also need an updated owning runtime to retain request details. Browser
41
+ click-through and Datadog display still require rollout verification; Kibana access
42
+ is required to view logs.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=request-correlation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-correlation.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integrations/request-correlation.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=datadog-links.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datadog-links.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/sinks/datadog-links.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=kibana.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kibana.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/sinks/kibana.test.ts"],"names":[],"mappings":""}
@@ -1,7 +1,7 @@
1
1
  /** Core barrel — public free helpers, handles, and types. Engine lives in `./runtime`. */
2
2
  export { completeJourney, defineJourney, excludeJourney, failJourney, journeyStep, reportBackendRequest, resolveStamp, restoreJourney, serializeJourneyState, setJourneyTags, singleInFlightJourneyStep, } from './api';
3
3
  export { resetJourney, } from './runtime';
4
- export type { JourneyDef, JourneyEvent, JourneyHandle, JourneyNameLike, JourneySink, JourneyStepEvent, JourneyStepOptions, JourneyStepTarget, SerializedJourneyState, StepHandle, TagValue, } from './types';
4
+ export type { JourneyDef, JourneyEvent, JourneyRequestEvent, JourneyHandle, JourneyNameLike, JourneySink, JourneyStepEvent, JourneyStepOptions, JourneyStepTarget, SerializedJourneyState, StepHandle, TagValue, } from './types';
5
5
  export { JourneyStepStamp } from './step-tag';
6
6
  export type { JourneyHttpPolicyContext, JourneyHttpScore, JourneyHttpScoreContext, JourneyRequestPolicy, JourneyStampOptions, RequestPolicyConfig, } from './request-policy';
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAE1F,OAAO,EACH,eAAe,EACf,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,EACX,oBAAoB,EACpB,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,yBAAyB,GAC5B,MAAM,OAAO,CAAC;AACf,OAAO,EAEH,YAAY,GACf,MAAM,WAAW,CAAC;AACnB,YAAY,EACR,UAAU,EACV,YAAY,EACZ,aAAa,EACb,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,UAAU,EACV,QAAQ,GACX,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,YAAY,EACR,wBAAwB,EACxB,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,GACtB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAE1F,OAAO,EACH,eAAe,EACf,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,EACX,oBAAoB,EACpB,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,yBAAyB,GAC5B,MAAM,OAAO,CAAC;AACf,OAAO,EAEH,YAAY,GACf,MAAM,WAAW,CAAC;AACnB,YAAY,EACR,UAAU,EACV,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,UAAU,EACV,QAAQ,GACX,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,YAAY,EACR,wBAAwB,EACxB,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,GACtB,MAAM,kBAAkB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/index.ts"],"sourcesContent":["/** Core barrel — public free helpers, handles, and types. Engine lives in `./runtime`. */\n\nexport {\n completeJourney,\n defineJourney,\n excludeJourney,\n failJourney,\n journeyStep,\n reportBackendRequest,\n resolveStamp,\n restoreJourney,\n serializeJourneyState,\n setJourneyTags,\n singleInFlightJourneyStep,\n} from './api';\nexport {\n // @internal Test helper — not a supported consumer API.\n resetJourney,\n} from './runtime';\nexport type {\n JourneyDef,\n JourneyEvent,\n JourneyHandle,\n JourneyNameLike,\n JourneySink,\n JourneyStepEvent,\n JourneyStepOptions,\n JourneyStepTarget,\n SerializedJourneyState,\n StepHandle,\n TagValue,\n} from './types';\nexport { JourneyStepStamp } from './step-tag';\nexport type {\n JourneyHttpPolicyContext,\n JourneyHttpScore,\n JourneyHttpScoreContext,\n JourneyRequestPolicy,\n JourneyStampOptions,\n RequestPolicyConfig,\n} from './request-policy';\n"],"names":["completeJourney","defineJourney","excludeJourney","failJourney","journeyStep","reportBackendRequest","resolveStamp","restoreJourney","serializeJourneyState","setJourneyTags","singleInFlightJourneyStep","resetJourney","JourneyStepStamp"],"mappings":"AAAA,wFAAwF,GAExF,SACIA,eAAe,EACfC,aAAa,EACbC,cAAc,EACdC,WAAW,EACXC,WAAW,EACXC,oBAAoB,EACpBC,YAAY,EACZC,cAAc,EACdC,qBAAqB,EACrBC,cAAc,EACdC,yBAAyB,QACtB,QAAQ;AACf,SACI,wDAAwD;AACxDC,YAAY,QACT,YAAY;AAcnB,SAASC,gBAAgB,QAAQ,aAAa"}
1
+ {"version":3,"sources":["../../src/core/index.ts"],"sourcesContent":["/** Core barrel — public free helpers, handles, and types. Engine lives in `./runtime`. */\n\nexport {\n completeJourney,\n defineJourney,\n excludeJourney,\n failJourney,\n journeyStep,\n reportBackendRequest,\n resolveStamp,\n restoreJourney,\n serializeJourneyState,\n setJourneyTags,\n singleInFlightJourneyStep,\n} from './api';\nexport {\n // @internal Test helper — not a supported consumer API.\n resetJourney,\n} from './runtime';\nexport type {\n JourneyDef,\n JourneyEvent,\n JourneyRequestEvent,\n JourneyHandle,\n JourneyNameLike,\n JourneySink,\n JourneyStepEvent,\n JourneyStepOptions,\n JourneyStepTarget,\n SerializedJourneyState,\n StepHandle,\n TagValue,\n} from './types';\nexport { JourneyStepStamp } from './step-tag';\nexport type {\n JourneyHttpPolicyContext,\n JourneyHttpScore,\n JourneyHttpScoreContext,\n JourneyRequestPolicy,\n JourneyStampOptions,\n RequestPolicyConfig,\n} from './request-policy';\n"],"names":["completeJourney","defineJourney","excludeJourney","failJourney","journeyStep","reportBackendRequest","resolveStamp","restoreJourney","serializeJourneyState","setJourneyTags","singleInFlightJourneyStep","resetJourney","JourneyStepStamp"],"mappings":"AAAA,wFAAwF,GAExF,SACIA,eAAe,EACfC,aAAa,EACbC,cAAc,EACdC,WAAW,EACXC,WAAW,EACXC,oBAAoB,EACpBC,YAAY,EACZC,cAAc,EACdC,qBAAqB,EACrBC,cAAc,EACdC,yBAAyB,QACtB,QAAQ;AACf,SACI,wDAAwD;AACxDC,YAAY,QACT,YAAY;AAenB,SAASC,gBAAgB,QAAQ,aAAa"}
@@ -0,0 +1,8 @@
1
+ import type { JourneyRequestEvent } from './types';
2
+ export declare const MAX_CORRELATED_REQUESTS = 5;
3
+ export declare const MAX_JOURNEY_CORRELATED_REQUESTS = 20;
4
+ /** Only allow a Cloudflare Ray ID and bounded numeric response metadata onto the wire. */
5
+ export declare function sanitizeRequestCorrelation(value: JourneyRequestEvent): JourneyRequestEvent | undefined;
6
+ /** Production monolith origins whose Ray IDs have been verified against the log data view. */
7
+ export declare function isMonolithLogOrigin(value: string): boolean;
8
+ //# sourceMappingURL=request-correlation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-correlation.d.ts","sourceRoot":"","sources":["../../src/core/request-correlation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnD,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAElD,0FAA0F;AAC1F,wBAAgB,0BAA0B,CACtC,KAAK,EAAE,mBAAmB,GAC3B,mBAAmB,GAAG,SAAS,CAuBjC;AAED,8FAA8F;AAC9F,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAgB1D"}
@@ -0,0 +1,23 @@
1
+ export const MAX_CORRELATED_REQUESTS = 5;
2
+ export const MAX_JOURNEY_CORRELATED_REQUESTS = 20;
3
+ /** Only allow a Cloudflare Ray ID and bounded numeric response metadata onto the wire. */ export function sanitizeRequestCorrelation(value) {
4
+ if (!value || typeof value.rayId !== 'string' || !/^[a-f0-9]{16}(?:-[a-z]{3})?$/i.test(value.rayId) || !Number.isFinite(value.startedAtEpoch) || value.startedAtEpoch <= 0 || value.startedAtEpoch > 8.64e15 - 2 * 86400000 || !Number.isFinite(value.durationMs) || value.durationMs < 0 || value.durationMs > 86400000 || !Number.isInteger(value.status) || value.status < 100 || value.status > 599) {
5
+ return undefined;
6
+ }
7
+ return {
8
+ rayId: value.rayId.toLowerCase(),
9
+ startedAtEpoch: Math.round(value.startedAtEpoch),
10
+ durationMs: Math.round(value.durationMs),
11
+ status: value.status
12
+ };
13
+ }
14
+ /** Production monolith origins whose Ray IDs have been verified against the log data view. */ export function isMonolithLogOrigin(value) {
15
+ try {
16
+ const url = new URL(value);
17
+ return url.protocol === 'https:' && !url.port && !url.username && !url.password && (url.hostname === 'go.servicetitan.com' || /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:_[a-z0-9-]+)*\.eh\.go\.servicetitan\.com$/i.test(url.hostname));
18
+ } catch (unused) {
19
+ return false;
20
+ }
21
+ }
22
+
23
+ //# sourceMappingURL=request-correlation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/request-correlation.ts"],"sourcesContent":["import type { JourneyRequestEvent } from './types';\n\nexport const MAX_CORRELATED_REQUESTS = 5;\nexport const MAX_JOURNEY_CORRELATED_REQUESTS = 20;\n\n/** Only allow a Cloudflare Ray ID and bounded numeric response metadata onto the wire. */\nexport function sanitizeRequestCorrelation(\n value: JourneyRequestEvent\n): JourneyRequestEvent | undefined {\n if (\n !value ||\n typeof value.rayId !== 'string' ||\n !/^[a-f0-9]{16}(?:-[a-z]{3})?$/i.test(value.rayId) ||\n !Number.isFinite(value.startedAtEpoch) ||\n value.startedAtEpoch <= 0 ||\n value.startedAtEpoch > 8.64e15 - 2 * 86_400_000 ||\n !Number.isFinite(value.durationMs) ||\n value.durationMs < 0 ||\n value.durationMs > 86_400_000 ||\n !Number.isInteger(value.status) ||\n value.status < 100 ||\n value.status > 599\n ) {\n return undefined;\n }\n return {\n rayId: value.rayId.toLowerCase(),\n startedAtEpoch: Math.round(value.startedAtEpoch),\n durationMs: Math.round(value.durationMs),\n status: value.status,\n };\n}\n\n/** Production monolith origins whose Ray IDs have been verified against the log data view. */\nexport function isMonolithLogOrigin(value: string): boolean {\n try {\n const url = new URL(value);\n return (\n url.protocol === 'https:' &&\n !url.port &&\n !url.username &&\n !url.password &&\n (url.hostname === 'go.servicetitan.com' ||\n /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:_[a-z0-9-]+)*\\.eh\\.go\\.servicetitan\\.com$/i.test(\n url.hostname\n ))\n );\n } catch {\n return false;\n }\n}\n"],"names":["MAX_CORRELATED_REQUESTS","MAX_JOURNEY_CORRELATED_REQUESTS","sanitizeRequestCorrelation","value","rayId","test","Number","isFinite","startedAtEpoch","durationMs","isInteger","status","undefined","toLowerCase","Math","round","isMonolithLogOrigin","url","URL","protocol","port","username","password","hostname"],"mappings":"AAEA,OAAO,MAAMA,0BAA0B,EAAE;AACzC,OAAO,MAAMC,kCAAkC,GAAG;AAElD,wFAAwF,GACxF,OAAO,SAASC,2BACZC,KAA0B;IAE1B,IACI,CAACA,SACD,OAAOA,MAAMC,KAAK,KAAK,YACvB,CAAC,gCAAgCC,IAAI,CAACF,MAAMC,KAAK,KACjD,CAACE,OAAOC,QAAQ,CAACJ,MAAMK,cAAc,KACrCL,MAAMK,cAAc,IAAI,KACxBL,MAAMK,cAAc,GAAG,UAAU,IAAI,YACrC,CAACF,OAAOC,QAAQ,CAACJ,MAAMM,UAAU,KACjCN,MAAMM,UAAU,GAAG,KACnBN,MAAMM,UAAU,GAAG,YACnB,CAACH,OAAOI,SAAS,CAACP,MAAMQ,MAAM,KAC9BR,MAAMQ,MAAM,GAAG,OACfR,MAAMQ,MAAM,GAAG,KACjB;QACE,OAAOC;IACX;IACA,OAAO;QACHR,OAAOD,MAAMC,KAAK,CAACS,WAAW;QAC9BL,gBAAgBM,KAAKC,KAAK,CAACZ,MAAMK,cAAc;QAC/CC,YAAYK,KAAKC,KAAK,CAACZ,MAAMM,UAAU;QACvCE,QAAQR,MAAMQ,MAAM;IACxB;AACJ;AAEA,4FAA4F,GAC5F,OAAO,SAASK,oBAAoBb,KAAa;IAC7C,IAAI;QACA,MAAMc,MAAM,IAAIC,IAAIf;QACpB,OACIc,IAAIE,QAAQ,KAAK,YACjB,CAACF,IAAIG,IAAI,IACT,CAACH,IAAII,QAAQ,IACb,CAACJ,IAAIK,QAAQ,IACZL,CAAAA,IAAIM,QAAQ,KAAK,yBACd,gFAAgFlB,IAAI,CAChFY,IAAIM,QAAQ,CAChB;IAEZ,EAAE,eAAM;QACJ,OAAO;IACX;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/core/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/core/runtime.ts"],"names":[],"mappings":"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"}
@@ -147,7 +147,9 @@ function toName(target) {
147
147
  finalOutcome = 'bad';
148
148
  finalReason = finalReason !== null && finalReason !== void 0 ? finalReason : 'journey-timeout';
149
149
  }
150
- const steps = journey.steps.map((s)=>({
150
+ const steps = journey.steps.map((s)=>{
151
+ var _s_requests;
152
+ return {
151
153
  name: s.name,
152
154
  startMs: Math.round(s.startedAt - journey.startedAt),
153
155
  durationMs: s.durationMs,
@@ -162,8 +164,17 @@ function toName(target) {
162
164
  attributes: {
163
165
  ...s.attributes
164
166
  }
167
+ } : {},
168
+ ...((_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
+ ...s.requestsTruncated ? {
174
+ requestsTruncated: true
165
175
  } : {}
166
- }));
176
+ };
177
+ });
167
178
  emit({
168
179
  journey: {
169
180
  name: journey.name,
@@ -171,6 +182,11 @@ function toName(target) {
171
182
  group: journey.group,
172
183
  service: journey.service,
173
184
  outcome: finalOutcome,
185
+ ...finalOutcome === 'bad' && journey.scoringRequest ? {
186
+ failedRequest: {
187
+ ...journey.scoringRequest
188
+ }
189
+ } : {},
174
190
  ...finalReason ? {
175
191
  reason: finalReason
176
192
  } : {},
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/runtime.ts"],"sourcesContent":["import {\n getAutoAttributeRequests as getSharedAutoAttributeRequests,\n getHttpAbortedRequestsPolicy as getSharedHttpAbortedRequestsPolicy,\n getHttpClientErrorRequestsPolicy as getSharedHttpClientErrorRequestsPolicy,\n getSharedSlowRequests,\n isJourneyDebugEnabled,\n} from '../global';\nimport { isCanceledError } from './abort-error';\nimport {\n resolveEndpointPolicy,\n sortEndpointsByLongestMatch,\n type SlowRequestConfig,\n} from './endpoint-policy';\nimport { deserializeJourneyState, projectJourneyState } from './persist';\nimport {\n clampMaxSteps,\n DEFAULT_MAX_STEPS,\n DEFAULT_JOURNEY_IDLE_MS,\n finiteSlowRequestMs,\n finiteTimeoutMs,\n MAX_ATTRIBUTED_REQUEST_KEYS,\n MAX_TAG_KEYS,\n resolveJourneyTimeoutMs,\n} from './limits';\nimport { assignRecord, emptyRecord, sanitizeJourneyEvent, setSafeAttribute } from './sanitize';\nimport { JourneyStepStamp, resolveStampOpts } from './step-tag';\nimport type { RequestPolicyConfig } from './request-policy';\nimport {\n JOURNEY_ENGINE,\n type JourneyDef,\n type JourneyEngine,\n type JourneyEvent,\n type JourneyNameLike,\n type JourneySink,\n type JourneyState,\n type JourneyStepEvent,\n type JourneyStepOptions,\n type JourneyStepTarget,\n type Outcome,\n type SerializedJourneyState,\n type StepHandle,\n type StepRecord,\n type TagValue,\n} from './types';\n\nconst DEFAULT_SLOW_REQUESTS: SlowRequestConfig = { defaultMs: 4_000, endpoints: [] };\n\nconst noopStep: StepHandle = {\n journeyName: null,\n setAttribute() {},\n setTags() {},\n completeJourney() {},\n failJourney() {},\n stamp: () => undefined,\n};\n\nfunction toName(target: JourneyNameLike): string {\n if (typeof target === 'string') {\n return target;\n }\n return 'config' in target ? target.config.name : target.name;\n}\n\n/** @internal Private — not part of the public package API. */\nexport interface JourneyRuntimeOptions {\n /**\n * DevTools label for this engine copy (`__stJourney.getDebugState().runtimes`).\n * Auto-assigned `runtime-N` from the current `__stJourney` registration count\n * when omitted at `registerJourneyRuntime`.\n */\n id?: string;\n /** Initial sinks. Defaults to `[]` — package bootstrap installs Datadog on the module runtime. */\n sinks?: readonly JourneySink[];\n slowRequests?: SlowRequestConfig;\n /** Cap recorded steps; default 50. */\n maxSteps?: number;\n /** Default timeout when JourneyDef.timeoutMs is omitted. 0 disables idle countdown. */\n defaultJourneyIdleMs?: number;\n}\n\n/** @internal Read-only snapshot for DevTools (`__stJourney.getDebugState`; empty unless debugging). */\nexport interface JourneyRuntimeDebugSnapshot {\n id: string;\n openJourneys: readonly {\n name: string;\n team: string;\n group: string;\n service: string;\n verdict: Outcome;\n reason: string | null;\n tags: Record<string, TagValue>;\n stepsInFlight: readonly string[];\n steps: readonly {\n name: string;\n outcome: 'good' | 'bad';\n durationMs: number;\n reason?: string;\n attributedRequestKeys?: readonly string[];\n }[];\n }[];\n activeStep: { journey: string; name: string } | null;\n /** Which shared policy knobs this runtime overrode (false = inherit global). */\n policyOverlay: {\n slowRequests: boolean;\n httpAbortedRequests: boolean;\n httpClientErrorRequests: boolean;\n autoAttributeRequests: boolean;\n };\n}\n\n/** @internal Freeze a caller-supplied journey def + tags snapshot. */\nexport function freezeJourneyDef(config: JourneyDef, tags: Record<string, TagValue>): JourneyDef {\n const endpoints = sortEndpointsByLongestMatch(config.endpoints);\n return Object.freeze({\n ...config,\n timeoutMs: config.timeoutMs !== undefined ? finiteTimeoutMs(config.timeoutMs) : undefined,\n stepTimeoutMs:\n config.stepTimeoutMs !== undefined ? finiteTimeoutMs(config.stepTimeoutMs) : undefined,\n slowRequestMs: finiteSlowRequestMs(config.slowRequestMs),\n maxSteps: config.maxSteps !== undefined ? clampMaxSteps(config.maxSteps) : undefined,\n endpoints: endpoints ? Object.freeze([...endpoints]) : undefined,\n expected: config.expected ? Object.freeze([...config.expected]) : undefined,\n tags: Object.freeze({ ...tags }),\n });\n}\n\n/**\n * @internal Private — not part of the public package API.\n * Isolated journey engine (open journeys, ambient steps, sinks, request thresholds).\n * App code should keep using free helpers (`defineJourney`, `journeyStep`, …) — they\n * bind to the module runtime. Prefer `resetJourney()` in tests.\n */\nexport interface JourneyRuntime {\n /** DevTools id for this engine copy. Auto `runtime-N` when registered without an id. */\n readonly id: string;\n getSlowRequests(): SlowRequestConfig;\n setSlowRequests(next: SlowRequestConfig): void;\n getMaxSteps(): number;\n setMaxSteps(next: number): void;\n getDefaultJourneyIdleMs(): number;\n setDefaultJourneyIdleMs(next: number): void;\n\n setSinks(next: readonly JourneySink[]): void;\n /** First `configureJourney({ sinks })` on this runtime wins. Returns false if already set. */\n trySetConfiguredSinks(next: readonly JourneySink[]): boolean;\n addSink(sink: JourneySink): void;\n emit(payload: JourneyEvent): void;\n\n setPolicyOverlay(next: {\n slowRequests?: SlowRequestConfig;\n httpAbortedRequests?: RequestPolicyConfig;\n httpClientErrorRequests?: RequestPolicyConfig;\n autoAttributeRequests?: boolean;\n }): void;\n getAutoAttributeRequests(): boolean;\n getHttpAbortedRequestsPolicy(): RequestPolicyConfig;\n getHttpClientErrorRequestsPolicy(): RequestPolicyConfig;\n\n getOpenJourney(name: string): JourneyState | undefined;\n /** @internal DevTools snapshot of open journeys / ambient step. */\n getDebugSnapshot(): JourneyRuntimeDebugSnapshot;\n firstOpenJourneyName(names: readonly string[]): string | null;\n setJourneyTags(name: string | null, tags: Record<string, TagValue>): void;\n startJourney(config: JourneyDef): void;\n failJourney(journey: JourneyState, reason: string): void;\n completeJourney(name: string | null, tags?: Record<string, TagValue>): void;\n completeJourneyState(journey: JourneyState, tags?: Record<string, TagValue>): void;\n excludeJourney(journey: JourneyState): void;\n updateOpenJourney(config: JourneyDef): void;\n /**\n * @internal Snapshot an open journey for cross-page transfer. Does NOT\n * close the journey. Returns `null` when no journey is open under `name`.\n */\n serializeJourneyState(name: string): SerializedJourneyState | null;\n /**\n * @internal Rehydrate a serialized journey onto this runtime. Returns\n * `null` (after emitting a `bad` `journey-timeout` event) when the journey\n * already exhausted its budget in transit.\n */\n restoreJourney(serialized: SerializedJourneyState, config: JourneyDef): JourneyState | null;\n\n activeJourneyStep(): StepRecord | null;\n journeyStep<T>(\n journey: JourneyStepTarget,\n stepName: string,\n fn: (step: StepHandle) => T | Promise<T>,\n opts?: JourneyStepOptions\n ): Promise<T>;\n journeyMountStep<T>(\n journey: JourneyStepTarget,\n stepName: string,\n fn: (step: StepHandle) => T | Promise<T>,\n opts?: JourneyStepOptions\n ): Promise<T>;\n\n reportBackendRequest(\n step: StepRecord | undefined,\n status: number | undefined,\n durationMs: number,\n requestKey: string\n ): void;\n /** True when this request key is ignored for the step's journey (never changes verdict). */\n shouldIgnoreRequest(journey: JourneyState, key: string): boolean;\n\n /** Close open journeys, clear ambient steps, restore default timeouts/sinks. */\n reset(options?: JourneyRuntimeOptions): void;\n}\n\n/** @internal Bind the fail/exclude/report hooks for a journey's creating engine. */\nexport function bindJourneyEngine(\n api: JourneyRuntime,\n journey: JourneyState,\n shouldIgnoreRequest: (target: JourneyState, key: string) => boolean\n): JourneyEngine {\n return {\n failJourney(reason) {\n api.failJourney(journey, reason);\n },\n exclude() {\n api.excludeJourney(journey);\n },\n shouldIgnoreRequest(key) {\n return shouldIgnoreRequest(journey, key);\n },\n reportBackendRequest(step, status, durationMs, requestKey) {\n api.reportBackendRequest(step, status, durationMs, requestKey);\n },\n getHttpAbortedRequestsPolicy() {\n return api.getHttpAbortedRequestsPolicy();\n },\n getHttpClientErrorRequestsPolicy() {\n return api.getHttpClientErrorRequestsPolicy();\n },\n };\n}\n\n/**\n * @internal Private — not part of the public package API.\n * Build an isolated engine. Rarely needed — apps use the default via free helpers.\n */\nexport function createJourneyRuntime(options: JourneyRuntimeOptions = {}): JourneyRuntime {\n let id = typeof options.id === 'string' && options.id !== '' ? options.id : '';\n const journeys = new Map<string, JourneyState>();\n const inFlight = new Set<StepRecord>();\n let sinks: JourneySink[] = [...(options.sinks ?? [])];\n let sinksConfigured = false;\n let overlay: {\n slowRequests?: SlowRequestConfig;\n httpAbortedRequests?: RequestPolicyConfig;\n httpClientErrorRequests?: RequestPolicyConfig;\n autoAttributeRequests?: boolean;\n } = {};\n let slowRequests: SlowRequestConfig = {\n defaultMs: options.slowRequests?.defaultMs ?? DEFAULT_SLOW_REQUESTS.defaultMs,\n endpoints: sortEndpointsByLongestMatch(\n options.slowRequests?.endpoints ?? DEFAULT_SLOW_REQUESTS.endpoints\n ),\n };\n let maxSteps = clampMaxSteps(options.maxSteps ?? DEFAULT_MAX_STEPS);\n let defaultJourneyIdleMs = finiteTimeoutMs(\n options.defaultJourneyIdleMs ?? DEFAULT_JOURNEY_IDLE_MS\n );\n\n function getInFlightSteps(journey: JourneyState): StepRecord[] {\n const out: StepRecord[] = [];\n for (const step of inFlight) {\n if (step.journey === journey) {\n out.push(step);\n }\n }\n return out;\n }\n\n function enterStep(step: StepRecord): void {\n inFlight.add(step);\n }\n\n function leaveStep(step: StepRecord): void {\n inFlight.delete(step);\n }\n\n function releaseInFlightSteps(journey: JourneyState): void {\n for (const step of [...inFlight]) {\n if (step.journey !== journey) {\n continue;\n }\n if (step.durationMs === 0) {\n step.durationMs = Math.round(globalThis.performance.now() - step.startedAt);\n }\n inFlight.delete(step);\n }\n }\n\n function clearCountdown(journey: JourneyState): void {\n if (journey.timer != null) {\n clearTimeout(journey.timer);\n journey.timer = null;\n }\n }\n\n function emit(payload: JourneyEvent): void {\n const safePayload = sanitizeJourneyEvent(payload);\n for (const sink of sinks) {\n try {\n sink(safePayload);\n } catch {\n // One sinking throw must not block the remaining sinks.\n }\n }\n }\n\n function finish(journey: JourneyState, outcome: Outcome, reason?: string): void {\n if (journey.closed) {\n return;\n }\n journey.closed = true;\n if (journeys.get(journey.name) === journey) {\n journeys.delete(journey.name);\n }\n clearCountdown(journey);\n releaseInFlightSteps(journey);\n\n let finalReason = journey.reason ?? reason;\n let finalOutcome = outcome;\n const durationMs = Math.round(globalThis.performance.now() - journey.startedAt);\n if (journey.timeoutExplicit && journey.timeoutMs > 0 && durationMs > journey.timeoutMs) {\n finalOutcome = 'bad';\n finalReason = finalReason ?? 'journey-timeout';\n }\n\n const steps: JourneyStepEvent[] = journey.steps.map(s => ({\n name: s.name,\n startMs: Math.round(s.startedAt - journey.startedAt),\n durationMs: s.durationMs,\n outcome: s.outcome,\n ...(s.reason ? { reason: s.reason } : {}),\n ...(s.httpStatus !== undefined ? { httpStatus: s.httpStatus } : {}),\n ...(Object.keys(s.attributes).length ? { attributes: { ...s.attributes } } : {}),\n }));\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 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","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","serializeJourneyState","restoreJourney","serialized","size","journeyStep","stepName","fn","opts","open","console","debug","cap","steps_truncated","handle","timeoutTimer","timeout_ms","err","journeyMountStep","Promise","resolve","endpointPolicy","failed","threshold","slow","category","reset","clear","moduleRuntime","noopEngine","canRouteHttpToJourney","resolveJourneyEngine","stamped","resetJourney"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/core/runtime.ts"],"sourcesContent":["import {\n getAutoAttributeRequests as getSharedAutoAttributeRequests,\n getHttpAbortedRequestsPolicy as getSharedHttpAbortedRequestsPolicy,\n getHttpClientErrorRequestsPolicy as getSharedHttpClientErrorRequestsPolicy,\n getSharedSlowRequests,\n isJourneyDebugEnabled,\n} from '../global';\nimport { isCanceledError } from './abort-error';\nimport {\n resolveEndpointPolicy,\n sortEndpointsByLongestMatch,\n type SlowRequestConfig,\n} from './endpoint-policy';\nimport { deserializeJourneyState, projectJourneyState } from './persist';\nimport {\n clampMaxSteps,\n DEFAULT_MAX_STEPS,\n DEFAULT_JOURNEY_IDLE_MS,\n finiteSlowRequestMs,\n finiteTimeoutMs,\n MAX_ATTRIBUTED_REQUEST_KEYS,\n MAX_TAG_KEYS,\n resolveJourneyTimeoutMs,\n} from './limits';\nimport { assignRecord, emptyRecord, sanitizeJourneyEvent, setSafeAttribute } from './sanitize';\nimport { JourneyStepStamp, resolveStampOpts } from './step-tag';\nimport type { RequestPolicyConfig } from './request-policy';\nimport {\n JOURNEY_ENGINE,\n type JourneyDef,\n type JourneyEngine,\n type JourneyEvent,\n type JourneyNameLike,\n type JourneySink,\n type JourneyState,\n type JourneyStepEvent,\n type JourneyStepOptions,\n type JourneyStepTarget,\n type Outcome,\n type SerializedJourneyState,\n type StepHandle,\n type StepRecord,\n type TagValue,\n} from './types';\n\nconst DEFAULT_SLOW_REQUESTS: SlowRequestConfig = { defaultMs: 4_000, endpoints: [] };\n\nconst noopStep: StepHandle = {\n journeyName: null,\n setAttribute() {},\n setTags() {},\n completeJourney() {},\n failJourney() {},\n stamp: () => undefined,\n};\n\nfunction toName(target: JourneyNameLike): string {\n if (typeof target === 'string') {\n return target;\n }\n return 'config' in target ? target.config.name : target.name;\n}\n\n/** @internal Private — not part of the public package API. */\nexport interface JourneyRuntimeOptions {\n /**\n * DevTools label for this engine copy (`__stJourney.getDebugState().runtimes`).\n * Auto-assigned `runtime-N` from the current `__stJourney` registration count\n * when omitted at `registerJourneyRuntime`.\n */\n id?: string;\n /** Initial sinks. Defaults to `[]` — package bootstrap installs Datadog on the module runtime. */\n sinks?: readonly JourneySink[];\n slowRequests?: SlowRequestConfig;\n /** Cap recorded steps; default 50. */\n maxSteps?: number;\n /** Default timeout when JourneyDef.timeoutMs is omitted. 0 disables idle countdown. */\n defaultJourneyIdleMs?: number;\n}\n\n/** @internal Read-only snapshot for DevTools (`__stJourney.getDebugState`; empty unless debugging). */\nexport interface JourneyRuntimeDebugSnapshot {\n id: string;\n openJourneys: readonly {\n name: string;\n team: string;\n group: string;\n service: string;\n verdict: Outcome;\n reason: string | null;\n tags: Record<string, TagValue>;\n stepsInFlight: readonly string[];\n steps: readonly {\n name: string;\n outcome: 'good' | 'bad';\n durationMs: number;\n reason?: string;\n attributedRequestKeys?: readonly string[];\n }[];\n }[];\n activeStep: { journey: string; name: string } | null;\n /** Which shared policy knobs this runtime overrode (false = inherit global). */\n policyOverlay: {\n slowRequests: boolean;\n httpAbortedRequests: boolean;\n httpClientErrorRequests: boolean;\n autoAttributeRequests: boolean;\n };\n}\n\n/** @internal Freeze a caller-supplied journey def + tags snapshot. */\nexport function freezeJourneyDef(config: JourneyDef, tags: Record<string, TagValue>): JourneyDef {\n const endpoints = sortEndpointsByLongestMatch(config.endpoints);\n return Object.freeze({\n ...config,\n timeoutMs: config.timeoutMs !== undefined ? finiteTimeoutMs(config.timeoutMs) : undefined,\n stepTimeoutMs:\n config.stepTimeoutMs !== undefined ? finiteTimeoutMs(config.stepTimeoutMs) : undefined,\n slowRequestMs: finiteSlowRequestMs(config.slowRequestMs),\n maxSteps: config.maxSteps !== undefined ? clampMaxSteps(config.maxSteps) : undefined,\n endpoints: endpoints ? Object.freeze([...endpoints]) : undefined,\n expected: config.expected ? Object.freeze([...config.expected]) : undefined,\n tags: Object.freeze({ ...tags }),\n });\n}\n\n/**\n * @internal Private — not part of the public package API.\n * Isolated journey engine (open journeys, ambient steps, sinks, request thresholds).\n * App code should keep using free helpers (`defineJourney`, `journeyStep`, …) — they\n * bind to the module runtime. Prefer `resetJourney()` in tests.\n */\nexport interface JourneyRuntime {\n /** DevTools id for this engine copy. Auto `runtime-N` when registered without an id. */\n readonly id: string;\n getSlowRequests(): SlowRequestConfig;\n setSlowRequests(next: SlowRequestConfig): void;\n getMaxSteps(): number;\n setMaxSteps(next: number): void;\n getDefaultJourneyIdleMs(): number;\n setDefaultJourneyIdleMs(next: number): void;\n\n setSinks(next: readonly JourneySink[]): void;\n /** First `configureJourney({ sinks })` on this runtime wins. Returns false if already set. */\n trySetConfiguredSinks(next: readonly JourneySink[]): boolean;\n addSink(sink: JourneySink): void;\n emit(payload: JourneyEvent): void;\n\n setPolicyOverlay(next: {\n slowRequests?: SlowRequestConfig;\n httpAbortedRequests?: RequestPolicyConfig;\n httpClientErrorRequests?: RequestPolicyConfig;\n autoAttributeRequests?: boolean;\n }): void;\n getAutoAttributeRequests(): boolean;\n getHttpAbortedRequestsPolicy(): RequestPolicyConfig;\n getHttpClientErrorRequestsPolicy(): RequestPolicyConfig;\n\n getOpenJourney(name: string): JourneyState | undefined;\n /** @internal DevTools snapshot of open journeys / ambient step. */\n getDebugSnapshot(): JourneyRuntimeDebugSnapshot;\n firstOpenJourneyName(names: readonly string[]): string | null;\n setJourneyTags(name: string | null, tags: Record<string, TagValue>): void;\n startJourney(config: JourneyDef): void;\n failJourney(journey: JourneyState, reason: string): void;\n completeJourney(name: string | null, tags?: Record<string, TagValue>): void;\n completeJourneyState(journey: JourneyState, tags?: Record<string, TagValue>): void;\n excludeJourney(journey: JourneyState): void;\n updateOpenJourney(config: JourneyDef): void;\n /**\n * @internal Snapshot an open journey for cross-page transfer. Does NOT\n * close the journey. Returns `null` when no journey is open under `name`.\n */\n serializeJourneyState(name: string): SerializedJourneyState | null;\n /**\n * @internal Rehydrate a serialized journey onto this runtime. Returns\n * `null` (after emitting a `bad` `journey-timeout` event) when the journey\n * already exhausted its budget in transit.\n */\n restoreJourney(serialized: SerializedJourneyState, config: JourneyDef): JourneyState | null;\n\n activeJourneyStep(): StepRecord | null;\n journeyStep<T>(\n journey: JourneyStepTarget,\n stepName: string,\n fn: (step: StepHandle) => T | Promise<T>,\n opts?: JourneyStepOptions\n ): Promise<T>;\n journeyMountStep<T>(\n journey: JourneyStepTarget,\n stepName: string,\n fn: (step: StepHandle) => T | Promise<T>,\n opts?: JourneyStepOptions\n ): Promise<T>;\n\n reportBackendRequest(\n step: StepRecord | undefined,\n status: number | undefined,\n durationMs: number,\n requestKey: string\n ): void;\n /** True when this request key is ignored for the step's journey (never changes verdict). */\n shouldIgnoreRequest(journey: JourneyState, key: string): boolean;\n\n /** Close open journeys, clear ambient steps, restore default timeouts/sinks. */\n reset(options?: JourneyRuntimeOptions): void;\n}\n\n/** @internal Bind the fail/exclude/report hooks for a journey's creating engine. */\nexport function bindJourneyEngine(\n api: JourneyRuntime,\n journey: JourneyState,\n shouldIgnoreRequest: (target: JourneyState, key: string) => boolean\n): JourneyEngine {\n return {\n failJourney(reason) {\n api.failJourney(journey, reason);\n },\n exclude() {\n api.excludeJourney(journey);\n },\n shouldIgnoreRequest(key) {\n return shouldIgnoreRequest(journey, key);\n },\n reportBackendRequest(step, status, durationMs, requestKey) {\n api.reportBackendRequest(step, status, durationMs, requestKey);\n },\n getHttpAbortedRequestsPolicy() {\n return api.getHttpAbortedRequestsPolicy();\n },\n getHttpClientErrorRequestsPolicy() {\n return api.getHttpClientErrorRequestsPolicy();\n },\n };\n}\n\n/**\n * @internal Private — not part of the public package API.\n * Build an isolated engine. Rarely needed — apps use the default via free helpers.\n */\nexport function createJourneyRuntime(options: JourneyRuntimeOptions = {}): JourneyRuntime {\n let id = typeof options.id === 'string' && options.id !== '' ? options.id : '';\n const journeys = new Map<string, JourneyState>();\n const inFlight = new Set<StepRecord>();\n let sinks: JourneySink[] = [...(options.sinks ?? [])];\n let sinksConfigured = false;\n let overlay: {\n slowRequests?: SlowRequestConfig;\n httpAbortedRequests?: RequestPolicyConfig;\n httpClientErrorRequests?: RequestPolicyConfig;\n autoAttributeRequests?: boolean;\n } = {};\n let slowRequests: SlowRequestConfig = {\n defaultMs: options.slowRequests?.defaultMs ?? DEFAULT_SLOW_REQUESTS.defaultMs,\n endpoints: sortEndpointsByLongestMatch(\n options.slowRequests?.endpoints ?? DEFAULT_SLOW_REQUESTS.endpoints\n ),\n };\n let maxSteps = clampMaxSteps(options.maxSteps ?? DEFAULT_MAX_STEPS);\n let defaultJourneyIdleMs = finiteTimeoutMs(\n options.defaultJourneyIdleMs ?? DEFAULT_JOURNEY_IDLE_MS\n );\n\n function getInFlightSteps(journey: JourneyState): StepRecord[] {\n const out: StepRecord[] = [];\n for (const step of inFlight) {\n if (step.journey === journey) {\n out.push(step);\n }\n }\n return out;\n }\n\n function enterStep(step: StepRecord): void {\n inFlight.add(step);\n }\n\n function leaveStep(step: StepRecord): void {\n inFlight.delete(step);\n }\n\n function releaseInFlightSteps(journey: JourneyState): void {\n for (const step of [...inFlight]) {\n if (step.journey !== journey) {\n continue;\n }\n if (step.durationMs === 0) {\n step.durationMs = Math.round(globalThis.performance.now() - step.startedAt);\n }\n inFlight.delete(step);\n }\n }\n\n function clearCountdown(journey: JourneyState): void {\n if (journey.timer != null) {\n clearTimeout(journey.timer);\n journey.timer = null;\n }\n }\n\n function emit(payload: JourneyEvent): void {\n const safePayload = sanitizeJourneyEvent(payload);\n for (const sink of sinks) {\n try {\n sink(safePayload);\n } catch {\n // One sinking throw must not block the remaining sinks.\n }\n }\n }\n\n function finish(journey: JourneyState, outcome: Outcome, reason?: string): void {\n if (journey.closed) {\n return;\n }\n journey.closed = true;\n if (journeys.get(journey.name) === journey) {\n journeys.delete(journey.name);\n }\n clearCountdown(journey);\n releaseInFlightSteps(journey);\n\n let finalReason = journey.reason ?? reason;\n let finalOutcome = outcome;\n const durationMs = Math.round(globalThis.performance.now() - journey.startedAt);\n if (journey.timeoutExplicit && journey.timeoutMs > 0 && durationMs > journey.timeoutMs) {\n finalOutcome = 'bad';\n finalReason = finalReason ?? 'journey-timeout';\n }\n\n const steps: JourneyStepEvent[] = journey.steps.map(s => ({\n name: s.name,\n startMs: Math.round(s.startedAt - journey.startedAt),\n durationMs: s.durationMs,\n outcome: s.outcome,\n ...(s.reason ? { reason: s.reason } : {}),\n ...(s.httpStatus !== undefined ? { httpStatus: s.httpStatus } : {}),\n ...(Object.keys(s.attributes).length ? { attributes: { ...s.attributes } } : {}),\n ...(s.requests?.length\n ? { requests: s.requests.map(request => ({ ...request })) }\n : {}),\n ...(s.requestsTruncated ? { requestsTruncated: true } : {}),\n }));\n\n emit({\n journey: {\n name: journey.name,\n team: journey.team,\n group: journey.group,\n service: journey.service,\n outcome: finalOutcome,\n ...(finalOutcome === 'bad' && journey.scoringRequest\n ? { failedRequest: { ...journey.scoringRequest } }\n : {}),\n ...(finalReason ? { reason: finalReason } : {}),\n durationMs,\n steps,\n ...(journey.expected ? { expected: journey.expected } : {}),\n ...(Object.keys(journey.tags).length ? { tags: { ...journey.tags } } : {}),\n },\n });\n }\n\n function armCountdown(journey: JourneyState, delayMs: number = journey.timeoutMs): void {\n if (delayMs <= 0) {\n return;\n }\n journey.timer = setTimeout(() => {\n if (journey.timeoutExplicit) {\n finish(journey, 'bad', 'journey-timeout');\n return;\n }\n finish(journey, journey.verdict === 'bad' ? 'bad' : 'excluded', 'journey-idle-timeout');\n }, delayMs);\n }\n\n function effectiveSlowRequests(): SlowRequestConfig {\n return overlay.slowRequests ?? getSharedSlowRequests() ?? slowRequests;\n }\n\n function shouldIgnoreRequest(journey: JourneyState, key: string): boolean {\n return resolveEndpointPolicy(journey, effectiveSlowRequests(), key).ignore;\n }\n\n function trackAttributedKey(step: StepRecord, requestKey: string): void {\n if (!requestKey) {\n return;\n }\n step.attributedRequestKeys ??= [];\n if (step.attributedRequestKeys.length >= MAX_ATTRIBUTED_REQUEST_KEYS) {\n return;\n }\n if (!step.attributedRequestKeys.includes(requestKey)) {\n step.attributedRequestKeys.push(requestKey);\n }\n }\n\n function resolveJourneyName(journey: JourneyStepTarget): string | null {\n if (journey == null) {\n return null;\n }\n if (typeof journey === 'string' || !Array.isArray(journey)) {\n return toName(journey as JourneyNameLike);\n }\n return api.firstOpenJourneyName(journey.map(toName));\n }\n\n function configFromTarget(target: JourneyNameLike): JourneyDef | undefined {\n if (typeof target === 'string') {\n return undefined;\n }\n if ('config' in target && target.config != null && typeof target.config === 'object') {\n return target.config;\n }\n const rec = target as {\n name?: unknown;\n team?: unknown;\n group?: unknown;\n service?: unknown;\n };\n if (\n typeof rec.name === 'string' &&\n typeof rec.team === 'string' &&\n typeof rec.group === 'string' &&\n typeof rec.service === 'string'\n ) {\n return target as JourneyDef;\n }\n return undefined;\n }\n\n function maybeAutoStart(target: JourneyStepTarget): void {\n if (target == null || typeof target === 'string' || Array.isArray(target)) {\n return;\n }\n const def = configFromTarget(target as JourneyNameLike);\n if (def && !api.getOpenJourney(def.name)) {\n api.startJourney(def);\n }\n }\n\n function createStepHandle(journeyName: string, step: StepRecord): StepHandle {\n return {\n journeyName,\n setAttribute(key, value) {\n setSafeAttribute(step.attributes, key, value);\n },\n setTags(tags) {\n if (step.journey.closed) {\n return;\n }\n assignRecord(step.journey.tags, tags, MAX_TAG_KEYS);\n },\n completeJourney(tags) {\n api.completeJourneyState(step.journey, tags);\n },\n failJourney(reason) {\n api.failJourney(step.journey, reason);\n },\n // Box in JourneyStepStamp — raw StepRecord is circular and blows jQuery/axios deep-merge.\n stamp: scoreOrOpts => new JourneyStepStamp(step, resolveStampOpts(scoreOrOpts)),\n };\n }\n\n const api: JourneyRuntime = {\n get id() {\n return id;\n },\n set id(next: string) {\n id = next;\n },\n getSlowRequests() {\n return effectiveSlowRequests();\n },\n\n setSlowRequests(next) {\n slowRequests = {\n ...next,\n endpoints: sortEndpointsByLongestMatch(next.endpoints),\n };\n },\n\n getMaxSteps() {\n return maxSteps;\n },\n\n setMaxSteps(next) {\n maxSteps = clampMaxSteps(next);\n },\n\n getDefaultJourneyIdleMs() {\n return defaultJourneyIdleMs;\n },\n\n setDefaultJourneyIdleMs(next) {\n defaultJourneyIdleMs = finiteTimeoutMs(next);\n },\n\n setSinks(next) {\n sinks = [...next];\n },\n\n trySetConfiguredSinks(next) {\n if (sinksConfigured) {\n return false;\n }\n sinks = [...next];\n sinksConfigured = true;\n return true;\n },\n\n addSink(sink) {\n sinks.push(sink);\n },\n\n emit,\n\n setPolicyOverlay(next) {\n overlay = { ...overlay, ...next };\n },\n\n getAutoAttributeRequests() {\n if (overlay.autoAttributeRequests !== undefined) {\n return overlay.autoAttributeRequests;\n }\n return getSharedAutoAttributeRequests();\n },\n\n getHttpAbortedRequestsPolicy() {\n return overlay.httpAbortedRequests ?? getSharedHttpAbortedRequestsPolicy();\n },\n\n getHttpClientErrorRequestsPolicy() {\n return overlay.httpClientErrorRequests ?? getSharedHttpClientErrorRequestsPolicy();\n },\n\n getOpenJourney(name) {\n return journeys.get(name);\n },\n\n getDebugSnapshot() {\n const active = api.activeJourneyStep();\n return {\n id: api.id,\n openJourneys: [...journeys.values()].map(journey => ({\n name: journey.name,\n team: journey.team,\n group: journey.group,\n service: journey.service,\n verdict: journey.verdict,\n reason: journey.reason,\n tags: { ...journey.tags },\n stepsInFlight: getInFlightSteps(journey).map(step => step.name),\n steps: journey.steps.map(step => ({\n name: step.name,\n outcome: step.outcome,\n durationMs: step.durationMs,\n ...(step.reason ? { reason: step.reason } : {}),\n ...(step.attributedRequestKeys?.length\n ? { attributedRequestKeys: [...step.attributedRequestKeys] }\n : {}),\n })),\n })),\n activeStep: active ? { journey: active.journey.name, name: active.name } : null,\n policyOverlay: {\n slowRequests: overlay.slowRequests != null,\n httpAbortedRequests: overlay.httpAbortedRequests != null,\n httpClientErrorRequests: overlay.httpClientErrorRequests != null,\n autoAttributeRequests: overlay.autoAttributeRequests != null,\n },\n };\n },\n\n firstOpenJourneyName(names) {\n for (const name of names) {\n if (journeys.has(name)) {\n return name;\n }\n }\n return null;\n },\n\n setJourneyTags(name, tags) {\n const journey = name ? journeys.get(name) : undefined;\n if (journey) {\n assignRecord(journey.tags, tags, MAX_TAG_KEYS);\n }\n },\n\n startJourney(config) {\n const existing = journeys.get(config.name);\n if (existing) {\n finish(existing, existing.verdict === 'bad' ? 'bad' : 'excluded');\n }\n\n const tags = emptyRecord();\n assignRecord(tags, config.tags, MAX_TAG_KEYS);\n const snapshot = freezeJourneyDef(config, tags);\n const timeout = resolveJourneyTimeoutMs(snapshot.timeoutMs, defaultJourneyIdleMs);\n const journey: JourneyState = {\n config: snapshot,\n name: snapshot.name,\n team: snapshot.team,\n group: snapshot.group,\n service: snapshot.service,\n verdict: 'good',\n startedAt: globalThis.performance.now(),\n timeoutMs: timeout.ms,\n timeoutExplicit: timeout.explicit,\n stepTimeoutMs:\n snapshot.stepTimeoutMs !== undefined\n ? finiteTimeoutMs(snapshot.stepTimeoutMs)\n : undefined,\n reason: null,\n steps: [],\n expected: snapshot.expected ? [...snapshot.expected] : null,\n tags,\n slowRequestMs: finiteSlowRequestMs(snapshot.slowRequestMs),\n endpoints: snapshot.endpoints,\n timer: null,\n closed: false,\n maxSteps:\n snapshot.maxSteps !== undefined ? clampMaxSteps(snapshot.maxSteps) : undefined,\n };\n journeys.set(config.name, journey);\n journey[JOURNEY_ENGINE] = bindJourneyEngine(api, journey, shouldIgnoreRequest);\n armCountdown(journey);\n },\n\n failJourney(journey, reason) {\n if (journey.closed) {\n return;\n }\n journey.verdict = 'bad';\n journey.reason ??= reason;\n finish(journey, 'bad');\n },\n\n completeJourney(name, tags) {\n if (!name) {\n return;\n }\n const journey = journeys.get(name);\n if (journey) {\n api.completeJourneyState(journey, tags);\n }\n },\n\n completeJourneyState(journey, tags) {\n if (journey.closed) {\n return;\n }\n if (tags) {\n assignRecord(journey.tags, tags, MAX_TAG_KEYS);\n }\n finish(journey, journey.verdict === 'bad' ? 'bad' : 'good');\n },\n\n excludeJourney(journey) {\n if (journey.closed) {\n return;\n }\n finish(journey, journey.verdict === 'bad' ? 'bad' : 'excluded');\n },\n\n updateOpenJourney(config) {\n const journey = journeys.get(config.name);\n if (!journey || journey.closed) {\n return;\n }\n journey.team = config.team;\n journey.group = config.group;\n journey.service = config.service;\n const timeout = resolveJourneyTimeoutMs(config.timeoutMs, defaultJourneyIdleMs);\n journey.timeoutMs = timeout.ms;\n journey.timeoutExplicit = timeout.explicit;\n journey.stepTimeoutMs =\n config.stepTimeoutMs !== undefined\n ? finiteTimeoutMs(config.stepTimeoutMs)\n : undefined;\n journey.slowRequestMs = finiteSlowRequestMs(config.slowRequestMs);\n journey.endpoints = sortEndpointsByLongestMatch(config.endpoints);\n journey.expected = config.expected ? [...config.expected] : null;\n journey.maxSteps =\n config.maxSteps !== undefined ? clampMaxSteps(config.maxSteps) : undefined;\n if (config.tags) {\n assignRecord(journey.tags, config.tags, MAX_TAG_KEYS);\n }\n clearCountdown(journey);\n if (journey.timeoutMs <= 0) {\n return;\n }\n const elapsedMs = globalThis.performance.now() - journey.startedAt;\n const remainingMs = journey.timeoutMs - elapsedMs;\n if (remainingMs <= 0) {\n if (journey.timeoutExplicit) {\n finish(journey, 'bad', 'journey-timeout');\n return;\n }\n finish(\n journey,\n journey.verdict === 'bad' ? 'bad' : 'excluded',\n 'journey-idle-timeout'\n );\n return;\n }\n armCountdown(journey, remainingMs);\n },\n\n serializeJourneyState(name) {\n const journey = journeys.get(name);\n if (!journey || journey.closed) {\n return null;\n }\n return projectJourneyState(journey);\n },\n\n restoreJourney(serialized, config) {\n // Refuse double-registration: leave an existing journey under this name in place.\n if (journeys.has(config.name)) {\n return null;\n }\n\n const journey = deserializeJourneyState(serialized, config, api, defaultJourneyIdleMs);\n\n if (journey.timeoutMs > 0) {\n const elapsedMs = globalThis.performance.now() - journey.startedAt;\n if (elapsedMs >= journey.timeoutMs) {\n // journey not yet in journeys Map — finish() handles unregistered journeys gracefully.\n if (journey.timeoutExplicit) {\n finish(journey, 'bad', 'journey-timeout');\n } else {\n finish(\n journey,\n journey.verdict === 'bad' ? 'bad' : 'excluded',\n 'journey-idle-timeout'\n );\n }\n return null;\n }\n\n journeys.set(config.name, journey);\n\n const remainingMs = journey.timeoutMs - elapsedMs;\n if (remainingMs > 0) {\n armCountdown(journey, remainingMs);\n }\n } else {\n journeys.set(config.name, journey);\n }\n\n return journey;\n },\n\n activeJourneyStep() {\n if (!api.getAutoAttributeRequests()) {\n return null;\n }\n if (inFlight.size !== 1) {\n return null;\n }\n return inFlight.values().next().value ?? null;\n },\n\n async journeyStep(journey, stepName, fn, opts) {\n maybeAutoStart(journey);\n const journeyName = resolveJourneyName(journey);\n const open = journeyName ? journeys.get(journeyName) : undefined;\n if (!open || !journeyName) {\n if (isJourneyDebugEnabled()) {\n // eslint-disable-next-line no-console -- debug-only untraced hint\n console.debug(`[journey] step \"${stepName}\" ran untraced (no open journey)`);\n }\n return fn(noopStep);\n }\n\n const step: StepRecord = {\n name: stepName,\n startedAt: globalThis.performance.now(),\n durationMs: 0,\n outcome: 'good',\n attributes: emptyRecord(),\n journey: open,\n };\n const cap = open.maxSteps ?? maxSteps;\n if (open.steps.length >= cap) {\n open.tags.steps_truncated = true;\n } else {\n open.steps.push(step);\n }\n\n const handle = createStepHandle(journeyName, step);\n\n const stepTimeoutMs = opts?.timeoutMs ?? open.stepTimeoutMs ?? 0;\n let timeoutTimer: ReturnType<typeof setTimeout> | null = null;\n if (stepTimeoutMs > 0) {\n timeoutTimer = setTimeout(() => {\n if (open.closed) {\n return;\n }\n step.outcome = 'bad';\n step.reason ??= 'step-timeout';\n step.attributes.timeout_ms ??= stepTimeoutMs;\n step.durationMs = Math.round(globalThis.performance.now() - step.startedAt);\n api.failJourney(open, 'step-timeout');\n }, stepTimeoutMs);\n }\n\n enterStep(step);\n try {\n return await fn(handle);\n } catch (err) {\n if (isCanceledError(err)) {\n /*\n * Attributed abort is scored in onHttpComplete. Unattributed /\n * ignored abort throws must not apply policy (empty requestKey).\n */\n } else {\n step.outcome = 'bad';\n step.reason ??= 'step-error';\n api.failJourney(open, 'step-error');\n }\n throw err;\n } finally {\n if (timeoutTimer != null) {\n clearTimeout(timeoutTimer);\n }\n if (step.durationMs === 0) {\n step.durationMs = Math.round(globalThis.performance.now() - step.startedAt);\n }\n leaveStep(step);\n }\n },\n\n async journeyMountStep(journey, stepName, fn, opts) {\n await Promise.resolve();\n return api.journeyStep(journey, stepName, fn, opts);\n },\n\n shouldIgnoreRequest,\n\n reportBackendRequest(step, status, durationMs, requestKey) {\n if (!step?.journey) {\n return;\n }\n const journey = step.journey;\n if (journey.closed) {\n return;\n }\n trackAttributedKey(step, requestKey);\n const endpointPolicy = resolveEndpointPolicy(\n journey,\n effectiveSlowRequests(),\n requestKey\n );\n if (endpointPolicy.ignore) {\n return;\n }\n\n const failed = status === undefined || status >= 500;\n const threshold = endpointPolicy.slowRequestMs;\n const slow = threshold > 0 && durationMs > threshold;\n if (!failed && !slow) {\n return;\n }\n\n const category = failed ? 'request-error' : 'request-latency';\n\n step.outcome = 'bad';\n step.reason ??= category;\n if (failed && status !== undefined) {\n step.httpStatus = status;\n }\n\n api.failJourney(journey, category);\n },\n\n reset(next = {}) {\n for (const journey of [...journeys.values()]) {\n clearCountdown(journey);\n journey.closed = true;\n }\n journeys.clear();\n inFlight.clear();\n overlay = {};\n sinksConfigured = false;\n sinks = [...(next.sinks ?? [])];\n slowRequests = {\n defaultMs: next.slowRequests?.defaultMs ?? DEFAULT_SLOW_REQUESTS.defaultMs,\n endpoints: sortEndpointsByLongestMatch(\n next.slowRequests?.endpoints ?? DEFAULT_SLOW_REQUESTS.endpoints\n ),\n };\n maxSteps =\n next.maxSteps !== undefined ? clampMaxSteps(next.maxSteps) : DEFAULT_MAX_STEPS;\n defaultJourneyIdleMs = finiteTimeoutMs(\n next.defaultJourneyIdleMs ?? DEFAULT_JOURNEY_IDLE_MS\n );\n },\n };\n\n return api;\n}\n\n/**\n * @internal Private — not part of the public package API.\n * Module-scoped engine used by free helpers. App code does not need to touch this.\n * Each host/MFE bundle gets its own copy when the package is duplicated.\n */\nexport const moduleRuntime: JourneyRuntime = createJourneyRuntime();\n\nconst noopEngine: JourneyEngine = {\n failJourney() {},\n exclude() {},\n shouldIgnoreRequest() {\n return false;\n },\n reportBackendRequest() {},\n getHttpAbortedRequestsPolicy() {\n return 'continue';\n },\n getHttpClientErrorRequestsPolicy() {\n return 'continue';\n },\n};\n\n/**\n * True when this bundle can fail/exclude/report the journey: stamped engine, or\n * this runtime's own unstamped object. False for a foreign older-copy journey.\n */\nexport function canRouteHttpToJourney(journey: JourneyState): boolean {\n return (\n journey[JOURNEY_ENGINE] != null || moduleRuntime.getOpenJourney(journey.name) === journey\n );\n}\n\n/**\n * @internal Prefer the creating engine on a journey (MFE `step.stamp()` on a host transport).\n * Falls back to this bundle's module runtime only when this runtime owns the object.\n * Unstamped foreign journeys (older package copies) are a no-op so a same-named\n * host journey is not deleted from this map.\n */\nexport function resolveJourneyEngine(journey: JourneyState): JourneyEngine {\n const stamped = journey[JOURNEY_ENGINE];\n if (stamped) {\n return stamped;\n }\n if (moduleRuntime.getOpenJourney(journey.name) !== journey) {\n return noopEngine;\n }\n return {\n failJourney(reason) {\n moduleRuntime.failJourney(journey, reason);\n },\n exclude() {\n moduleRuntime.excludeJourney(journey);\n },\n shouldIgnoreRequest(key) {\n return moduleRuntime.shouldIgnoreRequest(journey, key);\n },\n reportBackendRequest(step, status, durationMs, requestKey) {\n moduleRuntime.reportBackendRequest(step, status, durationMs, requestKey);\n },\n getHttpAbortedRequestsPolicy() {\n return moduleRuntime.getHttpAbortedRequestsPolicy();\n },\n getHttpClientErrorRequestsPolicy() {\n return moduleRuntime.getHttpClientErrorRequestsPolicy();\n },\n };\n}\n\n/**\n * @internal Reset the module engine (open journeys, ambient steps, sinks, slow-request thresholds).\n * Intended for tests — call in `beforeEach` / `afterEach` instead of manual cleanup.\n */\nexport function resetJourney(options?: JourneyRuntimeOptions): void {\n moduleRuntime.reset(options);\n}\n"],"names":["getAutoAttributeRequests","getSharedAutoAttributeRequests","getHttpAbortedRequestsPolicy","getSharedHttpAbortedRequestsPolicy","getHttpClientErrorRequestsPolicy","getSharedHttpClientErrorRequestsPolicy","getSharedSlowRequests","isJourneyDebugEnabled","isCanceledError","resolveEndpointPolicy","sortEndpointsByLongestMatch","deserializeJourneyState","projectJourneyState","clampMaxSteps","DEFAULT_MAX_STEPS","DEFAULT_JOURNEY_IDLE_MS","finiteSlowRequestMs","finiteTimeoutMs","MAX_ATTRIBUTED_REQUEST_KEYS","MAX_TAG_KEYS","resolveJourneyTimeoutMs","assignRecord","emptyRecord","sanitizeJourneyEvent","setSafeAttribute","JourneyStepStamp","resolveStampOpts","JOURNEY_ENGINE","DEFAULT_SLOW_REQUESTS","defaultMs","endpoints","noopStep","journeyName","setAttribute","setTags","completeJourney","failJourney","stamp","undefined","toName","target","config","name","freezeJourneyDef","tags","Object","freeze","timeoutMs","stepTimeoutMs","slowRequestMs","maxSteps","expected","bindJourneyEngine","api","journey","shouldIgnoreRequest","reason","exclude","excludeJourney","key","reportBackendRequest","step","status","durationMs","requestKey","createJourneyRuntime","options","id","journeys","Map","inFlight","Set","sinks","sinksConfigured","overlay","slowRequests","defaultJourneyIdleMs","getInFlightSteps","out","push","enterStep","add","leaveStep","delete","releaseInFlightSteps","Math","round","globalThis","performance","now","startedAt","clearCountdown","timer","clearTimeout","emit","payload","safePayload","sink","finish","outcome","closed","get","finalReason","finalOutcome","timeoutExplicit","steps","map","s","startMs","httpStatus","keys","attributes","length","requests","request","requestsTruncated","team","group","service","scoringRequest","failedRequest","armCountdown","delayMs","setTimeout","verdict","effectiveSlowRequests","ignore","trackAttributedKey","attributedRequestKeys","includes","resolveJourneyName","Array","isArray","firstOpenJourneyName","configFromTarget","rec","maybeAutoStart","def","getOpenJourney","startJourney","createStepHandle","value","completeJourneyState","scoreOrOpts","next","getSlowRequests","setSlowRequests","getMaxSteps","setMaxSteps","getDefaultJourneyIdleMs","setDefaultJourneyIdleMs","setSinks","trySetConfiguredSinks","addSink","setPolicyOverlay","autoAttributeRequests","httpAbortedRequests","httpClientErrorRequests","getDebugSnapshot","active","activeJourneyStep","openJourneys","values","stepsInFlight","activeStep","policyOverlay","names","has","setJourneyTags","existing","snapshot","timeout","ms","explicit","set","updateOpenJourney","elapsedMs","remainingMs","serializeJourneyState","restoreJourney","serialized","size","journeyStep","stepName","fn","opts","open","console","debug","cap","steps_truncated","handle","timeoutTimer","timeout_ms","err","journeyMountStep","Promise","resolve","endpointPolicy","failed","threshold","slow","category","reset","clear","moduleRuntime","noopEngine","canRouteHttpToJourney","resolveJourneyEngine","stamped","resetJourney"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/core/sanitize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAoB,QAAQ,EAAE,MAAM,SAAS,CAAC;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;AA4BD,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(/_+$/, '');
@@ -85,9 +86,17 @@ export function setSafeAttribute(attributes, key, value) {
85
86
  }
86
87
  }
87
88
  function sanitizeStep(step) {
89
+ const { requests: rawRequests, requestsTruncated, ...rest } = step;
90
+ const requests = 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
+ ...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(sanitizeStep);
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
  } : {},