@servicetitan/journey 4.1.0 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,37 +6,37 @@ Critical user journey monitoring for Datadog RUM (`user_journey` custom actions)
6
6
 
7
7
  Prefer `defineJourney` handles (`.start` / `.step` / `.complete`). Soft ambient attributes HTTP only when exactly one step is in flight — pass `{ stamp: step.stamp() }` after `await` or when steps overlap. `start()` always opens a new instance. Default aborted-request policy is `continue`.
8
8
 
9
- ## Request logs on failed journeys
10
-
11
- For attributed responses from `https://go.servicetitan.com`, Journey reads the
12
- `cf-ray` response header and adds request-specific Kibana links to bad CUF events.
13
- No application link builder or success/failure policy changes are needed.
14
-
15
- - If HTTP scoring closes the journey, `context.journey.kibana_url` points to that
16
- request and `context.journey.failed_request_id` identifies it.
17
- - `context.journey.steps[].requests[]` contains additional request IDs, status,
18
- timing and `kibana_url`. These are requests from the step, **not proof that every
19
- listed request caused the failure**. At most 5 requests per step and 20 across
20
- steps are included; `requests_truncated` marks omitted records.
21
- - Each link searches the production monolith log view by Ray ID prefix, from
22
- one minute before the request through one minute after its response. The
23
- prefix tolerates Cloudflare datacenter-suffix changes.
24
- - No readable response ID, ignored/aborted request, other origin or other
25
- environment: no new link. The existing host-provided user-level link is unchanged.
26
- A Cloudflare-generated error may have no backend log even with a Ray ID.
27
- - JavaScript/business failures can have step request links without a top-level
28
- failure link. Journey does not guess which earlier request caused the error.
29
- - No request URLs, query strings, bodies, usernames or other headers are collected
30
- by this feature. Request IDs are event details, **never metric group-by tags**.
31
-
32
- Adapters capture metadata before emission without changing HTTP scoring or
33
- transport results. jQuery captures headers before application callbacks while
34
- keeping existing scoring in `ajaxComplete`. Correlation belongs to the captured
35
- step, not a later journey with the same name. Cross-page serialized state does not
36
- carry request history; links cover responses observed in the current page.
37
-
38
- The host must adopt and deploy this package version. Separately bundled MFEs need
39
- an updated adapter and owning Journey runtime; older copies may omit the new
40
- fields. No SDK is initialized and no additional network requests are sent.
41
- Engineers still need Kibana access. Datadog link rendering and the final browser
42
- click-through must be checked during rollout.
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=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":""}
@@ -3,4 +3,6 @@ export declare const MAX_CORRELATED_REQUESTS = 5;
3
3
  export declare const MAX_JOURNEY_CORRELATED_REQUESTS = 20;
4
4
  /** Only allow a Cloudflare Ray ID and bounded numeric response metadata onto the wire. */
5
5
  export declare function sanitizeRequestCorrelation(value: JourneyRequestEvent): JourneyRequestEvent | undefined;
6
+ /** Production monolith origins whose Ray IDs have been verified against the log data view. */
7
+ export declare function isMonolithLogOrigin(value: string): boolean;
6
8
  //# sourceMappingURL=request-correlation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"request-correlation.d.ts","sourceRoot":"","sources":["../../src/core/request-correlation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnD,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAElD,0FAA0F;AAC1F,wBAAgB,0BAA0B,CACtC,KAAK,EAAE,mBAAmB,GAC3B,mBAAmB,GAAG,SAAS,CAuBjC"}
1
+ {"version":3,"file":"request-correlation.d.ts","sourceRoot":"","sources":["../../src/core/request-correlation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnD,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAElD,0FAA0F;AAC1F,wBAAgB,0BAA0B,CACtC,KAAK,EAAE,mBAAmB,GAC3B,mBAAmB,GAAG,SAAS,CAuBjC;AAED,8FAA8F;AAC9F,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAgB1D"}
@@ -11,5 +11,13 @@ export const MAX_JOURNEY_CORRELATED_REQUESTS = 20;
11
11
  status: value.status
12
12
  };
13
13
  }
14
+ /** Production monolith origins whose Ray IDs have been verified against the log data view. */ export function isMonolithLogOrigin(value) {
15
+ try {
16
+ const url = new URL(value);
17
+ return url.protocol === 'https:' && !url.port && !url.username && !url.password && (url.hostname === 'go.servicetitan.com' || /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:_[a-z0-9-]+)*\.eh\.go\.servicetitan\.com$/i.test(url.hostname));
18
+ } catch (unused) {
19
+ return false;
20
+ }
21
+ }
14
22
 
15
23
  //# sourceMappingURL=request-correlation.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/request-correlation.ts"],"sourcesContent":["import type { JourneyRequestEvent } from './types';\n\nexport const MAX_CORRELATED_REQUESTS = 5;\nexport const MAX_JOURNEY_CORRELATED_REQUESTS = 20;\n\n/** Only allow a Cloudflare Ray ID and bounded numeric response metadata onto the wire. */\nexport function sanitizeRequestCorrelation(\n value: JourneyRequestEvent\n): JourneyRequestEvent | undefined {\n if (\n !value ||\n typeof value.rayId !== 'string' ||\n !/^[a-f0-9]{16}(?:-[a-z]{3})?$/i.test(value.rayId) ||\n !Number.isFinite(value.startedAtEpoch) ||\n value.startedAtEpoch <= 0 ||\n value.startedAtEpoch > 8.64e15 - 2 * 86_400_000 ||\n !Number.isFinite(value.durationMs) ||\n value.durationMs < 0 ||\n value.durationMs > 86_400_000 ||\n !Number.isInteger(value.status) ||\n value.status < 100 ||\n value.status > 599\n ) {\n return undefined;\n }\n return {\n rayId: value.rayId.toLowerCase(),\n startedAtEpoch: Math.round(value.startedAtEpoch),\n durationMs: Math.round(value.durationMs),\n status: value.status,\n };\n}\n"],"names":["MAX_CORRELATED_REQUESTS","MAX_JOURNEY_CORRELATED_REQUESTS","sanitizeRequestCorrelation","value","rayId","test","Number","isFinite","startedAtEpoch","durationMs","isInteger","status","undefined","toLowerCase","Math","round"],"mappings":"AAEA,OAAO,MAAMA,0BAA0B,EAAE;AACzC,OAAO,MAAMC,kCAAkC,GAAG;AAElD,wFAAwF,GACxF,OAAO,SAASC,2BACZC,KAA0B;IAE1B,IACI,CAACA,SACD,OAAOA,MAAMC,KAAK,KAAK,YACvB,CAAC,gCAAgCC,IAAI,CAACF,MAAMC,KAAK,KACjD,CAACE,OAAOC,QAAQ,CAACJ,MAAMK,cAAc,KACrCL,MAAMK,cAAc,IAAI,KACxBL,MAAMK,cAAc,GAAG,UAAU,IAAI,YACrC,CAACF,OAAOC,QAAQ,CAACJ,MAAMM,UAAU,KACjCN,MAAMM,UAAU,GAAG,KACnBN,MAAMM,UAAU,GAAG,YACnB,CAACH,OAAOI,SAAS,CAACP,MAAMQ,MAAM,KAC9BR,MAAMQ,MAAM,GAAG,OACfR,MAAMQ,MAAM,GAAG,KACjB;QACE,OAAOC;IACX;IACA,OAAO;QACHR,OAAOD,MAAMC,KAAK,CAACS,WAAW;QAC9BL,gBAAgBM,KAAKC,KAAK,CAACZ,MAAMK,cAAc;QAC/CC,YAAYK,KAAKC,KAAK,CAACZ,MAAMM,UAAU;QACvCE,QAAQR,MAAMQ,MAAM;IACxB;AACJ"}
1
+ {"version":3,"sources":["../../src/core/request-correlation.ts"],"sourcesContent":["import type { JourneyRequestEvent } from './types';\n\nexport const MAX_CORRELATED_REQUESTS = 5;\nexport const MAX_JOURNEY_CORRELATED_REQUESTS = 20;\n\n/** Only allow a Cloudflare Ray ID and bounded numeric response metadata onto the wire. */\nexport function sanitizeRequestCorrelation(\n value: JourneyRequestEvent\n): JourneyRequestEvent | undefined {\n if (\n !value ||\n typeof value.rayId !== 'string' ||\n !/^[a-f0-9]{16}(?:-[a-z]{3})?$/i.test(value.rayId) ||\n !Number.isFinite(value.startedAtEpoch) ||\n value.startedAtEpoch <= 0 ||\n value.startedAtEpoch > 8.64e15 - 2 * 86_400_000 ||\n !Number.isFinite(value.durationMs) ||\n value.durationMs < 0 ||\n value.durationMs > 86_400_000 ||\n !Number.isInteger(value.status) ||\n value.status < 100 ||\n value.status > 599\n ) {\n return undefined;\n }\n return {\n rayId: value.rayId.toLowerCase(),\n startedAtEpoch: Math.round(value.startedAtEpoch),\n durationMs: Math.round(value.durationMs),\n status: value.status,\n };\n}\n\n/** Production monolith origins whose Ray IDs have been verified against the log data view. */\nexport function isMonolithLogOrigin(value: string): boolean {\n try {\n const url = new URL(value);\n return (\n url.protocol === 'https:' &&\n !url.port &&\n !url.username &&\n !url.password &&\n (url.hostname === 'go.servicetitan.com' ||\n /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:_[a-z0-9-]+)*\\.eh\\.go\\.servicetitan\\.com$/i.test(\n url.hostname\n ))\n );\n } catch {\n return false;\n }\n}\n"],"names":["MAX_CORRELATED_REQUESTS","MAX_JOURNEY_CORRELATED_REQUESTS","sanitizeRequestCorrelation","value","rayId","test","Number","isFinite","startedAtEpoch","durationMs","isInteger","status","undefined","toLowerCase","Math","round","isMonolithLogOrigin","url","URL","protocol","port","username","password","hostname"],"mappings":"AAEA,OAAO,MAAMA,0BAA0B,EAAE;AACzC,OAAO,MAAMC,kCAAkC,GAAG;AAElD,wFAAwF,GACxF,OAAO,SAASC,2BACZC,KAA0B;IAE1B,IACI,CAACA,SACD,OAAOA,MAAMC,KAAK,KAAK,YACvB,CAAC,gCAAgCC,IAAI,CAACF,MAAMC,KAAK,KACjD,CAACE,OAAOC,QAAQ,CAACJ,MAAMK,cAAc,KACrCL,MAAMK,cAAc,IAAI,KACxBL,MAAMK,cAAc,GAAG,UAAU,IAAI,YACrC,CAACF,OAAOC,QAAQ,CAACJ,MAAMM,UAAU,KACjCN,MAAMM,UAAU,GAAG,KACnBN,MAAMM,UAAU,GAAG,YACnB,CAACH,OAAOI,SAAS,CAACP,MAAMQ,MAAM,KAC9BR,MAAMQ,MAAM,GAAG,OACfR,MAAMQ,MAAM,GAAG,KACjB;QACE,OAAOC;IACX;IACA,OAAO;QACHR,OAAOD,MAAMC,KAAK,CAACS,WAAW;QAC9BL,gBAAgBM,KAAKC,KAAK,CAACZ,MAAMK,cAAc;QAC/CC,YAAYK,KAAKC,KAAK,CAACZ,MAAMM,UAAU;QACvCE,QAAQR,MAAMQ,MAAM;IACxB;AACJ;AAEA,4FAA4F,GAC5F,OAAO,SAASK,oBAAoBb,KAAa;IAC7C,IAAI;QACA,MAAMc,MAAM,IAAIC,IAAIf;QACpB,OACIc,IAAIE,QAAQ,KAAK,YACjB,CAACF,IAAIG,IAAI,IACT,CAACH,IAAII,QAAQ,IACb,CAACJ,IAAIK,QAAQ,IACZL,CAAAA,IAAIM,QAAQ,KAAK,yBACd,gFAAgFlB,IAAI,CAChFY,IAAIM,QAAQ,CAChB;IAEZ,EAAE,eAAM;QACJ,OAAO;IACX;AACJ"}
@@ -165,12 +165,12 @@ function toName(target) {
165
165
  ...s.attributes
166
166
  }
167
167
  } : {},
168
- ...finalOutcome === 'bad' && ((_s_requests = s.requests) === null || _s_requests === void 0 ? void 0 : _s_requests.length) ? {
168
+ ...((_s_requests = s.requests) === null || _s_requests === void 0 ? void 0 : _s_requests.length) ? {
169
169
  requests: s.requests.map((request)=>({
170
170
  ...request
171
171
  }))
172
172
  } : {},
173
- ...finalOutcome === 'bad' && s.requestsTruncated ? {
173
+ ...s.requestsTruncated ? {
174
174
  requestsTruncated: true
175
175
  } : {}
176
176
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/runtime.ts"],"sourcesContent":["import {\n getAutoAttributeRequests as getSharedAutoAttributeRequests,\n getHttpAbortedRequestsPolicy as getSharedHttpAbortedRequestsPolicy,\n getHttpClientErrorRequestsPolicy as getSharedHttpClientErrorRequestsPolicy,\n getSharedSlowRequests,\n isJourneyDebugEnabled,\n} from '../global';\nimport { isCanceledError } from './abort-error';\nimport {\n resolveEndpointPolicy,\n sortEndpointsByLongestMatch,\n type SlowRequestConfig,\n} from './endpoint-policy';\nimport { deserializeJourneyState, projectJourneyState } from './persist';\nimport {\n clampMaxSteps,\n DEFAULT_MAX_STEPS,\n DEFAULT_JOURNEY_IDLE_MS,\n finiteSlowRequestMs,\n finiteTimeoutMs,\n MAX_ATTRIBUTED_REQUEST_KEYS,\n MAX_TAG_KEYS,\n resolveJourneyTimeoutMs,\n} from './limits';\nimport { assignRecord, emptyRecord, sanitizeJourneyEvent, setSafeAttribute } from './sanitize';\nimport { JourneyStepStamp, resolveStampOpts } from './step-tag';\nimport type { RequestPolicyConfig } from './request-policy';\nimport {\n JOURNEY_ENGINE,\n type JourneyDef,\n type JourneyEngine,\n type JourneyEvent,\n type JourneyNameLike,\n type JourneySink,\n type JourneyState,\n type JourneyStepEvent,\n type JourneyStepOptions,\n type JourneyStepTarget,\n type Outcome,\n type SerializedJourneyState,\n type StepHandle,\n type StepRecord,\n type TagValue,\n} from './types';\n\nconst DEFAULT_SLOW_REQUESTS: SlowRequestConfig = { defaultMs: 4_000, endpoints: [] };\n\nconst noopStep: StepHandle = {\n journeyName: null,\n setAttribute() {},\n setTags() {},\n completeJourney() {},\n failJourney() {},\n stamp: () => undefined,\n};\n\nfunction toName(target: JourneyNameLike): string {\n if (typeof target === 'string') {\n return target;\n }\n return 'config' in target ? target.config.name : target.name;\n}\n\n/** @internal Private — not part of the public package API. */\nexport interface JourneyRuntimeOptions {\n /**\n * DevTools label for this engine copy (`__stJourney.getDebugState().runtimes`).\n * Auto-assigned `runtime-N` from the current `__stJourney` registration count\n * when omitted at `registerJourneyRuntime`.\n */\n id?: string;\n /** Initial sinks. Defaults to `[]` — package bootstrap installs Datadog on the module runtime. */\n sinks?: readonly JourneySink[];\n slowRequests?: SlowRequestConfig;\n /** Cap recorded steps; default 50. */\n maxSteps?: number;\n /** Default timeout when JourneyDef.timeoutMs is omitted. 0 disables idle countdown. */\n defaultJourneyIdleMs?: number;\n}\n\n/** @internal Read-only snapshot for DevTools (`__stJourney.getDebugState`; empty unless debugging). */\nexport interface JourneyRuntimeDebugSnapshot {\n id: string;\n openJourneys: readonly {\n name: string;\n team: string;\n group: string;\n service: string;\n verdict: Outcome;\n reason: string | null;\n tags: Record<string, TagValue>;\n stepsInFlight: readonly string[];\n steps: readonly {\n name: string;\n outcome: 'good' | 'bad';\n durationMs: number;\n reason?: string;\n attributedRequestKeys?: readonly string[];\n }[];\n }[];\n activeStep: { journey: string; name: string } | null;\n /** Which shared policy knobs this runtime overrode (false = inherit global). */\n policyOverlay: {\n slowRequests: boolean;\n httpAbortedRequests: boolean;\n httpClientErrorRequests: boolean;\n autoAttributeRequests: boolean;\n };\n}\n\n/** @internal Freeze a caller-supplied journey def + tags snapshot. */\nexport function freezeJourneyDef(config: JourneyDef, tags: Record<string, TagValue>): JourneyDef {\n const endpoints = sortEndpointsByLongestMatch(config.endpoints);\n return Object.freeze({\n ...config,\n timeoutMs: config.timeoutMs !== undefined ? finiteTimeoutMs(config.timeoutMs) : undefined,\n stepTimeoutMs:\n config.stepTimeoutMs !== undefined ? finiteTimeoutMs(config.stepTimeoutMs) : undefined,\n slowRequestMs: finiteSlowRequestMs(config.slowRequestMs),\n maxSteps: config.maxSteps !== undefined ? clampMaxSteps(config.maxSteps) : undefined,\n endpoints: endpoints ? Object.freeze([...endpoints]) : undefined,\n expected: config.expected ? Object.freeze([...config.expected]) : undefined,\n tags: Object.freeze({ ...tags }),\n });\n}\n\n/**\n * @internal Private — not part of the public package API.\n * Isolated journey engine (open journeys, ambient steps, sinks, request thresholds).\n * App code should keep using free helpers (`defineJourney`, `journeyStep`, …) — they\n * bind to the module runtime. Prefer `resetJourney()` in tests.\n */\nexport interface JourneyRuntime {\n /** DevTools id for this engine copy. Auto `runtime-N` when registered without an id. */\n readonly id: string;\n getSlowRequests(): SlowRequestConfig;\n setSlowRequests(next: SlowRequestConfig): void;\n getMaxSteps(): number;\n setMaxSteps(next: number): void;\n getDefaultJourneyIdleMs(): number;\n setDefaultJourneyIdleMs(next: number): void;\n\n setSinks(next: readonly JourneySink[]): void;\n /** First `configureJourney({ sinks })` on this runtime wins. Returns false if already set. */\n trySetConfiguredSinks(next: readonly JourneySink[]): boolean;\n addSink(sink: JourneySink): void;\n emit(payload: JourneyEvent): void;\n\n setPolicyOverlay(next: {\n slowRequests?: SlowRequestConfig;\n httpAbortedRequests?: RequestPolicyConfig;\n httpClientErrorRequests?: RequestPolicyConfig;\n autoAttributeRequests?: boolean;\n }): void;\n getAutoAttributeRequests(): boolean;\n getHttpAbortedRequestsPolicy(): RequestPolicyConfig;\n getHttpClientErrorRequestsPolicy(): RequestPolicyConfig;\n\n getOpenJourney(name: string): JourneyState | undefined;\n /** @internal DevTools snapshot of open journeys / ambient step. */\n getDebugSnapshot(): JourneyRuntimeDebugSnapshot;\n firstOpenJourneyName(names: readonly string[]): string | null;\n setJourneyTags(name: string | null, tags: Record<string, TagValue>): void;\n startJourney(config: JourneyDef): void;\n failJourney(journey: JourneyState, reason: string): void;\n completeJourney(name: string | null, tags?: Record<string, TagValue>): void;\n completeJourneyState(journey: JourneyState, tags?: Record<string, TagValue>): void;\n excludeJourney(journey: JourneyState): void;\n updateOpenJourney(config: JourneyDef): void;\n /**\n * @internal Snapshot an open journey for cross-page transfer. Does NOT\n * close the journey. Returns `null` when no journey is open under `name`.\n */\n serializeJourneyState(name: string): SerializedJourneyState | null;\n /**\n * @internal Rehydrate a serialized journey onto this runtime. Returns\n * `null` (after emitting a `bad` `journey-timeout` event) when the journey\n * already exhausted its budget in transit.\n */\n restoreJourney(serialized: SerializedJourneyState, config: JourneyDef): JourneyState | null;\n\n activeJourneyStep(): StepRecord | null;\n journeyStep<T>(\n journey: JourneyStepTarget,\n stepName: string,\n fn: (step: StepHandle) => T | Promise<T>,\n opts?: JourneyStepOptions\n ): Promise<T>;\n journeyMountStep<T>(\n journey: JourneyStepTarget,\n stepName: string,\n fn: (step: StepHandle) => T | Promise<T>,\n opts?: JourneyStepOptions\n ): Promise<T>;\n\n reportBackendRequest(\n step: StepRecord | undefined,\n status: number | undefined,\n durationMs: number,\n requestKey: string\n ): void;\n /** True when this request key is ignored for the step's journey (never changes verdict). */\n shouldIgnoreRequest(journey: JourneyState, key: string): boolean;\n\n /** Close open journeys, clear ambient steps, restore default timeouts/sinks. */\n reset(options?: JourneyRuntimeOptions): void;\n}\n\n/** @internal Bind the fail/exclude/report hooks for a journey's creating engine. */\nexport function bindJourneyEngine(\n api: JourneyRuntime,\n journey: JourneyState,\n shouldIgnoreRequest: (target: JourneyState, key: string) => boolean\n): JourneyEngine {\n return {\n failJourney(reason) {\n api.failJourney(journey, reason);\n },\n exclude() {\n api.excludeJourney(journey);\n },\n shouldIgnoreRequest(key) {\n return shouldIgnoreRequest(journey, key);\n },\n reportBackendRequest(step, status, durationMs, requestKey) {\n api.reportBackendRequest(step, status, durationMs, requestKey);\n },\n getHttpAbortedRequestsPolicy() {\n return api.getHttpAbortedRequestsPolicy();\n },\n getHttpClientErrorRequestsPolicy() {\n return api.getHttpClientErrorRequestsPolicy();\n },\n };\n}\n\n/**\n * @internal Private — not part of the public package API.\n * Build an isolated engine. Rarely needed — apps use the default via free helpers.\n */\nexport function createJourneyRuntime(options: JourneyRuntimeOptions = {}): JourneyRuntime {\n let id = typeof options.id === 'string' && options.id !== '' ? options.id : '';\n const journeys = new Map<string, JourneyState>();\n const inFlight = new Set<StepRecord>();\n let sinks: JourneySink[] = [...(options.sinks ?? [])];\n let sinksConfigured = false;\n let overlay: {\n slowRequests?: SlowRequestConfig;\n httpAbortedRequests?: RequestPolicyConfig;\n httpClientErrorRequests?: RequestPolicyConfig;\n autoAttributeRequests?: boolean;\n } = {};\n let slowRequests: SlowRequestConfig = {\n defaultMs: options.slowRequests?.defaultMs ?? DEFAULT_SLOW_REQUESTS.defaultMs,\n endpoints: sortEndpointsByLongestMatch(\n options.slowRequests?.endpoints ?? DEFAULT_SLOW_REQUESTS.endpoints\n ),\n };\n let maxSteps = clampMaxSteps(options.maxSteps ?? DEFAULT_MAX_STEPS);\n let defaultJourneyIdleMs = finiteTimeoutMs(\n options.defaultJourneyIdleMs ?? DEFAULT_JOURNEY_IDLE_MS\n );\n\n function getInFlightSteps(journey: JourneyState): StepRecord[] {\n const out: StepRecord[] = [];\n for (const step of inFlight) {\n if (step.journey === journey) {\n out.push(step);\n }\n }\n return out;\n }\n\n function enterStep(step: StepRecord): void {\n inFlight.add(step);\n }\n\n function leaveStep(step: StepRecord): void {\n inFlight.delete(step);\n }\n\n function releaseInFlightSteps(journey: JourneyState): void {\n for (const step of [...inFlight]) {\n if (step.journey !== journey) {\n continue;\n }\n if (step.durationMs === 0) {\n step.durationMs = Math.round(globalThis.performance.now() - step.startedAt);\n }\n inFlight.delete(step);\n }\n }\n\n function clearCountdown(journey: JourneyState): void {\n if (journey.timer != null) {\n clearTimeout(journey.timer);\n journey.timer = null;\n }\n }\n\n function emit(payload: JourneyEvent): void {\n const safePayload = sanitizeJourneyEvent(payload);\n for (const sink of sinks) {\n try {\n sink(safePayload);\n } catch {\n // One sinking throw must not block the remaining sinks.\n }\n }\n }\n\n function finish(journey: JourneyState, outcome: Outcome, reason?: string): void {\n if (journey.closed) {\n return;\n }\n journey.closed = true;\n if (journeys.get(journey.name) === journey) {\n journeys.delete(journey.name);\n }\n clearCountdown(journey);\n releaseInFlightSteps(journey);\n\n let finalReason = journey.reason ?? reason;\n let finalOutcome = outcome;\n const durationMs = Math.round(globalThis.performance.now() - journey.startedAt);\n if (journey.timeoutExplicit && journey.timeoutMs > 0 && durationMs > journey.timeoutMs) {\n finalOutcome = 'bad';\n finalReason = finalReason ?? 'journey-timeout';\n }\n\n const steps: JourneyStepEvent[] = journey.steps.map(s => ({\n name: s.name,\n startMs: Math.round(s.startedAt - journey.startedAt),\n durationMs: s.durationMs,\n outcome: s.outcome,\n ...(s.reason ? { reason: s.reason } : {}),\n ...(s.httpStatus !== undefined ? { httpStatus: s.httpStatus } : {}),\n ...(Object.keys(s.attributes).length ? { attributes: { ...s.attributes } } : {}),\n ...(finalOutcome === 'bad' && s.requests?.length\n ? { requests: s.requests.map(request => ({ ...request })) }\n : {}),\n ...(finalOutcome === 'bad' && s.requestsTruncated ? { requestsTruncated: true } : {}),\n }));\n\n emit({\n journey: {\n name: journey.name,\n team: journey.team,\n group: journey.group,\n service: journey.service,\n outcome: finalOutcome,\n ...(finalOutcome === 'bad' && journey.scoringRequest\n ? { failedRequest: { ...journey.scoringRequest } }\n : {}),\n ...(finalReason ? { reason: finalReason } : {}),\n durationMs,\n steps,\n ...(journey.expected ? { expected: journey.expected } : {}),\n ...(Object.keys(journey.tags).length ? { tags: { ...journey.tags } } : {}),\n },\n });\n }\n\n function armCountdown(journey: JourneyState, delayMs: number = journey.timeoutMs): void {\n if (delayMs <= 0) {\n return;\n }\n journey.timer = setTimeout(() => {\n if (journey.timeoutExplicit) {\n finish(journey, 'bad', 'journey-timeout');\n return;\n }\n finish(journey, journey.verdict === 'bad' ? 'bad' : 'excluded', 'journey-idle-timeout');\n }, delayMs);\n }\n\n function effectiveSlowRequests(): SlowRequestConfig {\n return overlay.slowRequests ?? getSharedSlowRequests() ?? slowRequests;\n }\n\n function shouldIgnoreRequest(journey: JourneyState, key: string): boolean {\n return resolveEndpointPolicy(journey, effectiveSlowRequests(), key).ignore;\n }\n\n function trackAttributedKey(step: StepRecord, requestKey: string): void {\n if (!requestKey) {\n return;\n }\n step.attributedRequestKeys ??= [];\n if (step.attributedRequestKeys.length >= MAX_ATTRIBUTED_REQUEST_KEYS) {\n return;\n }\n if (!step.attributedRequestKeys.includes(requestKey)) {\n step.attributedRequestKeys.push(requestKey);\n }\n }\n\n function resolveJourneyName(journey: JourneyStepTarget): string | null {\n if (journey == null) {\n return null;\n }\n if (typeof journey === 'string' || !Array.isArray(journey)) {\n return toName(journey as JourneyNameLike);\n }\n return api.firstOpenJourneyName(journey.map(toName));\n }\n\n function configFromTarget(target: JourneyNameLike): JourneyDef | undefined {\n if (typeof target === 'string') {\n return undefined;\n }\n if ('config' in target && target.config != null && typeof target.config === 'object') {\n return target.config;\n }\n const rec = target as {\n name?: unknown;\n team?: unknown;\n group?: unknown;\n service?: unknown;\n };\n if (\n typeof rec.name === 'string' &&\n typeof rec.team === 'string' &&\n typeof rec.group === 'string' &&\n typeof rec.service === 'string'\n ) {\n return target as JourneyDef;\n }\n return undefined;\n }\n\n function maybeAutoStart(target: JourneyStepTarget): void {\n if (target == null || typeof target === 'string' || Array.isArray(target)) {\n return;\n }\n const def = configFromTarget(target as JourneyNameLike);\n if (def && !api.getOpenJourney(def.name)) {\n api.startJourney(def);\n }\n }\n\n function createStepHandle(journeyName: string, step: StepRecord): StepHandle {\n return {\n journeyName,\n setAttribute(key, value) {\n setSafeAttribute(step.attributes, key, value);\n },\n setTags(tags) {\n if (step.journey.closed) {\n return;\n }\n assignRecord(step.journey.tags, tags, MAX_TAG_KEYS);\n },\n completeJourney(tags) {\n api.completeJourneyState(step.journey, tags);\n },\n failJourney(reason) {\n api.failJourney(step.journey, reason);\n },\n // Box in JourneyStepStamp — raw StepRecord is circular and blows jQuery/axios deep-merge.\n stamp: scoreOrOpts => new JourneyStepStamp(step, resolveStampOpts(scoreOrOpts)),\n };\n }\n\n const api: JourneyRuntime = {\n get id() {\n return id;\n },\n set id(next: string) {\n id = next;\n },\n getSlowRequests() {\n return effectiveSlowRequests();\n },\n\n setSlowRequests(next) {\n slowRequests = {\n ...next,\n endpoints: sortEndpointsByLongestMatch(next.endpoints),\n };\n },\n\n getMaxSteps() {\n return maxSteps;\n },\n\n setMaxSteps(next) {\n maxSteps = clampMaxSteps(next);\n },\n\n getDefaultJourneyIdleMs() {\n return defaultJourneyIdleMs;\n },\n\n setDefaultJourneyIdleMs(next) {\n defaultJourneyIdleMs = finiteTimeoutMs(next);\n },\n\n setSinks(next) {\n sinks = [...next];\n },\n\n trySetConfiguredSinks(next) {\n if (sinksConfigured) {\n return false;\n }\n sinks = [...next];\n sinksConfigured = true;\n return true;\n },\n\n addSink(sink) {\n sinks.push(sink);\n },\n\n emit,\n\n setPolicyOverlay(next) {\n overlay = { ...overlay, ...next };\n },\n\n getAutoAttributeRequests() {\n if (overlay.autoAttributeRequests !== undefined) {\n return overlay.autoAttributeRequests;\n }\n return getSharedAutoAttributeRequests();\n },\n\n getHttpAbortedRequestsPolicy() {\n return overlay.httpAbortedRequests ?? getSharedHttpAbortedRequestsPolicy();\n },\n\n getHttpClientErrorRequestsPolicy() {\n return overlay.httpClientErrorRequests ?? getSharedHttpClientErrorRequestsPolicy();\n },\n\n getOpenJourney(name) {\n return journeys.get(name);\n },\n\n getDebugSnapshot() {\n const active = api.activeJourneyStep();\n return {\n id: api.id,\n openJourneys: [...journeys.values()].map(journey => ({\n name: journey.name,\n team: journey.team,\n group: journey.group,\n service: journey.service,\n verdict: journey.verdict,\n reason: journey.reason,\n tags: { ...journey.tags },\n stepsInFlight: getInFlightSteps(journey).map(step => step.name),\n steps: journey.steps.map(step => ({\n name: step.name,\n outcome: step.outcome,\n durationMs: step.durationMs,\n ...(step.reason ? { reason: step.reason } : {}),\n ...(step.attributedRequestKeys?.length\n ? { attributedRequestKeys: [...step.attributedRequestKeys] }\n : {}),\n })),\n })),\n activeStep: active ? { journey: active.journey.name, name: active.name } : null,\n policyOverlay: {\n slowRequests: overlay.slowRequests != null,\n httpAbortedRequests: overlay.httpAbortedRequests != null,\n httpClientErrorRequests: overlay.httpClientErrorRequests != null,\n autoAttributeRequests: overlay.autoAttributeRequests != null,\n },\n };\n },\n\n firstOpenJourneyName(names) {\n for (const name of names) {\n if (journeys.has(name)) {\n return name;\n }\n }\n return null;\n },\n\n setJourneyTags(name, tags) {\n const journey = name ? journeys.get(name) : undefined;\n if (journey) {\n assignRecord(journey.tags, tags, MAX_TAG_KEYS);\n }\n },\n\n startJourney(config) {\n const existing = journeys.get(config.name);\n if (existing) {\n finish(existing, existing.verdict === 'bad' ? 'bad' : 'excluded');\n }\n\n const tags = emptyRecord();\n assignRecord(tags, config.tags, MAX_TAG_KEYS);\n const snapshot = freezeJourneyDef(config, tags);\n const timeout = resolveJourneyTimeoutMs(snapshot.timeoutMs, defaultJourneyIdleMs);\n const journey: JourneyState = {\n config: snapshot,\n name: snapshot.name,\n team: snapshot.team,\n group: snapshot.group,\n service: snapshot.service,\n verdict: 'good',\n startedAt: globalThis.performance.now(),\n timeoutMs: timeout.ms,\n timeoutExplicit: timeout.explicit,\n stepTimeoutMs:\n snapshot.stepTimeoutMs !== undefined\n ? finiteTimeoutMs(snapshot.stepTimeoutMs)\n : undefined,\n reason: null,\n steps: [],\n expected: snapshot.expected ? [...snapshot.expected] : null,\n tags,\n slowRequestMs: finiteSlowRequestMs(snapshot.slowRequestMs),\n endpoints: snapshot.endpoints,\n timer: null,\n closed: false,\n maxSteps:\n snapshot.maxSteps !== undefined ? clampMaxSteps(snapshot.maxSteps) : undefined,\n };\n journeys.set(config.name, journey);\n journey[JOURNEY_ENGINE] = bindJourneyEngine(api, journey, shouldIgnoreRequest);\n armCountdown(journey);\n },\n\n failJourney(journey, reason) {\n if (journey.closed) {\n return;\n }\n journey.verdict = 'bad';\n journey.reason ??= reason;\n finish(journey, 'bad');\n },\n\n completeJourney(name, tags) {\n if (!name) {\n return;\n }\n const journey = journeys.get(name);\n if (journey) {\n api.completeJourneyState(journey, tags);\n }\n },\n\n completeJourneyState(journey, tags) {\n if (journey.closed) {\n return;\n }\n if (tags) {\n assignRecord(journey.tags, tags, MAX_TAG_KEYS);\n }\n finish(journey, journey.verdict === 'bad' ? 'bad' : 'good');\n },\n\n excludeJourney(journey) {\n if (journey.closed) {\n return;\n }\n finish(journey, journey.verdict === 'bad' ? 'bad' : 'excluded');\n },\n\n updateOpenJourney(config) {\n const journey = journeys.get(config.name);\n if (!journey || journey.closed) {\n return;\n }\n journey.team = config.team;\n journey.group = config.group;\n journey.service = config.service;\n const timeout = resolveJourneyTimeoutMs(config.timeoutMs, defaultJourneyIdleMs);\n journey.timeoutMs = timeout.ms;\n journey.timeoutExplicit = timeout.explicit;\n journey.stepTimeoutMs =\n config.stepTimeoutMs !== undefined\n ? finiteTimeoutMs(config.stepTimeoutMs)\n : undefined;\n journey.slowRequestMs = finiteSlowRequestMs(config.slowRequestMs);\n journey.endpoints = sortEndpointsByLongestMatch(config.endpoints);\n journey.expected = config.expected ? [...config.expected] : null;\n journey.maxSteps =\n config.maxSteps !== undefined ? clampMaxSteps(config.maxSteps) : undefined;\n if (config.tags) {\n assignRecord(journey.tags, config.tags, MAX_TAG_KEYS);\n }\n clearCountdown(journey);\n if (journey.timeoutMs <= 0) {\n return;\n }\n const elapsedMs = globalThis.performance.now() - journey.startedAt;\n const remainingMs = journey.timeoutMs - elapsedMs;\n if (remainingMs <= 0) {\n if (journey.timeoutExplicit) {\n finish(journey, 'bad', 'journey-timeout');\n return;\n }\n finish(\n journey,\n journey.verdict === 'bad' ? 'bad' : 'excluded',\n 'journey-idle-timeout'\n );\n return;\n }\n armCountdown(journey, remainingMs);\n },\n\n serializeJourneyState(name) {\n const journey = journeys.get(name);\n if (!journey || journey.closed) {\n return null;\n }\n return projectJourneyState(journey);\n },\n\n restoreJourney(serialized, config) {\n // Refuse double-registration: leave an existing journey under this name in place.\n if (journeys.has(config.name)) {\n return null;\n }\n\n const journey = deserializeJourneyState(serialized, config, api, defaultJourneyIdleMs);\n\n if (journey.timeoutMs > 0) {\n const elapsedMs = globalThis.performance.now() - journey.startedAt;\n if (elapsedMs >= journey.timeoutMs) {\n // journey not yet in journeys Map — finish() handles unregistered journeys gracefully.\n if (journey.timeoutExplicit) {\n finish(journey, 'bad', 'journey-timeout');\n } else {\n finish(\n journey,\n journey.verdict === 'bad' ? 'bad' : 'excluded',\n 'journey-idle-timeout'\n );\n }\n return null;\n }\n\n journeys.set(config.name, journey);\n\n const remainingMs = journey.timeoutMs - elapsedMs;\n if (remainingMs > 0) {\n armCountdown(journey, remainingMs);\n }\n } else {\n journeys.set(config.name, journey);\n }\n\n return journey;\n },\n\n activeJourneyStep() {\n if (!api.getAutoAttributeRequests()) {\n return null;\n }\n if (inFlight.size !== 1) {\n return null;\n }\n return inFlight.values().next().value ?? null;\n },\n\n async journeyStep(journey, stepName, fn, opts) {\n maybeAutoStart(journey);\n const journeyName = resolveJourneyName(journey);\n const open = journeyName ? journeys.get(journeyName) : undefined;\n if (!open || !journeyName) {\n if (isJourneyDebugEnabled()) {\n // eslint-disable-next-line no-console -- debug-only untraced hint\n console.debug(`[journey] step \"${stepName}\" ran untraced (no open journey)`);\n }\n return fn(noopStep);\n }\n\n const step: StepRecord = {\n name: stepName,\n startedAt: globalThis.performance.now(),\n durationMs: 0,\n outcome: 'good',\n attributes: emptyRecord(),\n journey: open,\n };\n const cap = open.maxSteps ?? maxSteps;\n if (open.steps.length >= cap) {\n open.tags.steps_truncated = true;\n } else {\n open.steps.push(step);\n }\n\n const handle = createStepHandle(journeyName, step);\n\n const stepTimeoutMs = opts?.timeoutMs ?? open.stepTimeoutMs ?? 0;\n let timeoutTimer: ReturnType<typeof setTimeout> | null = null;\n if (stepTimeoutMs > 0) {\n timeoutTimer = setTimeout(() => {\n if (open.closed) {\n return;\n }\n step.outcome = 'bad';\n step.reason ??= 'step-timeout';\n step.attributes.timeout_ms ??= stepTimeoutMs;\n step.durationMs = Math.round(globalThis.performance.now() - step.startedAt);\n api.failJourney(open, 'step-timeout');\n }, stepTimeoutMs);\n }\n\n enterStep(step);\n try {\n return await fn(handle);\n } catch (err) {\n if (isCanceledError(err)) {\n /*\n * Attributed abort is scored in onHttpComplete. Unattributed /\n * ignored abort throws must not apply policy (empty requestKey).\n */\n } else {\n step.outcome = 'bad';\n step.reason ??= 'step-error';\n api.failJourney(open, 'step-error');\n }\n throw err;\n } finally {\n if (timeoutTimer != null) {\n clearTimeout(timeoutTimer);\n }\n if (step.durationMs === 0) {\n step.durationMs = Math.round(globalThis.performance.now() - step.startedAt);\n }\n leaveStep(step);\n }\n },\n\n async journeyMountStep(journey, stepName, fn, opts) {\n await Promise.resolve();\n return api.journeyStep(journey, stepName, fn, opts);\n },\n\n shouldIgnoreRequest,\n\n reportBackendRequest(step, status, durationMs, requestKey) {\n if (!step?.journey) {\n return;\n }\n const journey = step.journey;\n if (journey.closed) {\n return;\n }\n trackAttributedKey(step, requestKey);\n const endpointPolicy = resolveEndpointPolicy(\n journey,\n effectiveSlowRequests(),\n requestKey\n );\n if (endpointPolicy.ignore) {\n return;\n }\n\n const failed = status === undefined || status >= 500;\n const threshold = endpointPolicy.slowRequestMs;\n const slow = threshold > 0 && durationMs > threshold;\n if (!failed && !slow) {\n return;\n }\n\n const category = failed ? 'request-error' : 'request-latency';\n\n step.outcome = 'bad';\n step.reason ??= category;\n if (failed && status !== undefined) {\n step.httpStatus = status;\n }\n\n api.failJourney(journey, category);\n },\n\n reset(next = {}) {\n for (const journey of [...journeys.values()]) {\n clearCountdown(journey);\n journey.closed = true;\n }\n journeys.clear();\n inFlight.clear();\n overlay = {};\n sinksConfigured = false;\n sinks = [...(next.sinks ?? [])];\n slowRequests = {\n defaultMs: next.slowRequests?.defaultMs ?? DEFAULT_SLOW_REQUESTS.defaultMs,\n endpoints: sortEndpointsByLongestMatch(\n next.slowRequests?.endpoints ?? DEFAULT_SLOW_REQUESTS.endpoints\n ),\n };\n maxSteps =\n next.maxSteps !== undefined ? clampMaxSteps(next.maxSteps) : DEFAULT_MAX_STEPS;\n defaultJourneyIdleMs = finiteTimeoutMs(\n next.defaultJourneyIdleMs ?? DEFAULT_JOURNEY_IDLE_MS\n );\n },\n };\n\n return api;\n}\n\n/**\n * @internal Private — not part of the public package API.\n * Module-scoped engine used by free helpers. App code does not need to touch this.\n * Each host/MFE bundle gets its own copy when the package is duplicated.\n */\nexport const moduleRuntime: JourneyRuntime = createJourneyRuntime();\n\nconst noopEngine: JourneyEngine = {\n failJourney() {},\n exclude() {},\n shouldIgnoreRequest() {\n return false;\n },\n reportBackendRequest() {},\n getHttpAbortedRequestsPolicy() {\n return 'continue';\n },\n getHttpClientErrorRequestsPolicy() {\n return 'continue';\n },\n};\n\n/**\n * True when this bundle can fail/exclude/report the journey: stamped engine, or\n * this runtime's own unstamped object. False for a foreign older-copy journey.\n */\nexport function canRouteHttpToJourney(journey: JourneyState): boolean {\n return (\n journey[JOURNEY_ENGINE] != null || moduleRuntime.getOpenJourney(journey.name) === journey\n );\n}\n\n/**\n * @internal Prefer the creating engine on a journey (MFE `step.stamp()` on a host transport).\n * Falls back to this bundle's module runtime only when this runtime owns the object.\n * Unstamped foreign journeys (older package copies) are a no-op so a same-named\n * host journey is not deleted from this map.\n */\nexport function resolveJourneyEngine(journey: JourneyState): JourneyEngine {\n const stamped = journey[JOURNEY_ENGINE];\n if (stamped) {\n return stamped;\n }\n if (moduleRuntime.getOpenJourney(journey.name) !== journey) {\n return noopEngine;\n }\n return {\n failJourney(reason) {\n moduleRuntime.failJourney(journey, reason);\n },\n exclude() {\n moduleRuntime.excludeJourney(journey);\n },\n shouldIgnoreRequest(key) {\n return moduleRuntime.shouldIgnoreRequest(journey, key);\n },\n reportBackendRequest(step, status, durationMs, requestKey) {\n moduleRuntime.reportBackendRequest(step, status, durationMs, requestKey);\n },\n getHttpAbortedRequestsPolicy() {\n return moduleRuntime.getHttpAbortedRequestsPolicy();\n },\n getHttpClientErrorRequestsPolicy() {\n return moduleRuntime.getHttpClientErrorRequestsPolicy();\n },\n };\n}\n\n/**\n * @internal Reset the module engine (open journeys, ambient steps, sinks, slow-request thresholds).\n * Intended for tests — call in `beforeEach` / `afterEach` instead of manual cleanup.\n */\nexport function resetJourney(options?: JourneyRuntimeOptions): void {\n moduleRuntime.reset(options);\n}\n"],"names":["getAutoAttributeRequests","getSharedAutoAttributeRequests","getHttpAbortedRequestsPolicy","getSharedHttpAbortedRequestsPolicy","getHttpClientErrorRequestsPolicy","getSharedHttpClientErrorRequestsPolicy","getSharedSlowRequests","isJourneyDebugEnabled","isCanceledError","resolveEndpointPolicy","sortEndpointsByLongestMatch","deserializeJourneyState","projectJourneyState","clampMaxSteps","DEFAULT_MAX_STEPS","DEFAULT_JOURNEY_IDLE_MS","finiteSlowRequestMs","finiteTimeoutMs","MAX_ATTRIBUTED_REQUEST_KEYS","MAX_TAG_KEYS","resolveJourneyTimeoutMs","assignRecord","emptyRecord","sanitizeJourneyEvent","setSafeAttribute","JourneyStepStamp","resolveStampOpts","JOURNEY_ENGINE","DEFAULT_SLOW_REQUESTS","defaultMs","endpoints","noopStep","journeyName","setAttribute","setTags","completeJourney","failJourney","stamp","undefined","toName","target","config","name","freezeJourneyDef","tags","Object","freeze","timeoutMs","stepTimeoutMs","slowRequestMs","maxSteps","expected","bindJourneyEngine","api","journey","shouldIgnoreRequest","reason","exclude","excludeJourney","key","reportBackendRequest","step","status","durationMs","requestKey","createJourneyRuntime","options","id","journeys","Map","inFlight","Set","sinks","sinksConfigured","overlay","slowRequests","defaultJourneyIdleMs","getInFlightSteps","out","push","enterStep","add","leaveStep","delete","releaseInFlightSteps","Math","round","globalThis","performance","now","startedAt","clearCountdown","timer","clearTimeout","emit","payload","safePayload","sink","finish","outcome","closed","get","finalReason","finalOutcome","timeoutExplicit","steps","map","s","startMs","httpStatus","keys","attributes","length","requests","request","requestsTruncated","team","group","service","scoringRequest","failedRequest","armCountdown","delayMs","setTimeout","verdict","effectiveSlowRequests","ignore","trackAttributedKey","attributedRequestKeys","includes","resolveJourneyName","Array","isArray","firstOpenJourneyName","configFromTarget","rec","maybeAutoStart","def","getOpenJourney","startJourney","createStepHandle","value","completeJourneyState","scoreOrOpts","next","getSlowRequests","setSlowRequests","getMaxSteps","setMaxSteps","getDefaultJourneyIdleMs","setDefaultJourneyIdleMs","setSinks","trySetConfiguredSinks","addSink","setPolicyOverlay","autoAttributeRequests","httpAbortedRequests","httpClientErrorRequests","getDebugSnapshot","active","activeJourneyStep","openJourneys","values","stepsInFlight","activeStep","policyOverlay","names","has","setJourneyTags","existing","snapshot","timeout","ms","explicit","set","updateOpenJourney","elapsedMs","remainingMs","serializeJourneyState","restoreJourney","serialized","size","journeyStep","stepName","fn","opts","open","console","debug","cap","steps_truncated","handle","timeoutTimer","timeout_ms","err","journeyMountStep","Promise","resolve","endpointPolicy","failed","threshold","slow","category","reset","clear","moduleRuntime","noopEngine","canRouteHttpToJourney","resolveJourneyEngine","stamped","resetJourney"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/core/runtime.ts"],"sourcesContent":["import {\n getAutoAttributeRequests as getSharedAutoAttributeRequests,\n getHttpAbortedRequestsPolicy as getSharedHttpAbortedRequestsPolicy,\n getHttpClientErrorRequestsPolicy as getSharedHttpClientErrorRequestsPolicy,\n getSharedSlowRequests,\n isJourneyDebugEnabled,\n} from '../global';\nimport { isCanceledError } from './abort-error';\nimport {\n resolveEndpointPolicy,\n sortEndpointsByLongestMatch,\n type SlowRequestConfig,\n} from './endpoint-policy';\nimport { deserializeJourneyState, projectJourneyState } from './persist';\nimport {\n clampMaxSteps,\n DEFAULT_MAX_STEPS,\n DEFAULT_JOURNEY_IDLE_MS,\n finiteSlowRequestMs,\n finiteTimeoutMs,\n MAX_ATTRIBUTED_REQUEST_KEYS,\n MAX_TAG_KEYS,\n resolveJourneyTimeoutMs,\n} from './limits';\nimport { assignRecord, emptyRecord, sanitizeJourneyEvent, setSafeAttribute } from './sanitize';\nimport { JourneyStepStamp, resolveStampOpts } from './step-tag';\nimport type { RequestPolicyConfig } from './request-policy';\nimport {\n JOURNEY_ENGINE,\n type JourneyDef,\n type JourneyEngine,\n type JourneyEvent,\n type JourneyNameLike,\n type JourneySink,\n type JourneyState,\n type JourneyStepEvent,\n type JourneyStepOptions,\n type JourneyStepTarget,\n type Outcome,\n type SerializedJourneyState,\n type StepHandle,\n type StepRecord,\n type TagValue,\n} from './types';\n\nconst DEFAULT_SLOW_REQUESTS: SlowRequestConfig = { defaultMs: 4_000, endpoints: [] };\n\nconst noopStep: StepHandle = {\n journeyName: null,\n setAttribute() {},\n setTags() {},\n completeJourney() {},\n failJourney() {},\n stamp: () => undefined,\n};\n\nfunction toName(target: JourneyNameLike): string {\n if (typeof target === 'string') {\n return target;\n }\n return 'config' in target ? target.config.name : target.name;\n}\n\n/** @internal Private — not part of the public package API. */\nexport interface JourneyRuntimeOptions {\n /**\n * DevTools label for this engine copy (`__stJourney.getDebugState().runtimes`).\n * Auto-assigned `runtime-N` from the current `__stJourney` registration count\n * when omitted at `registerJourneyRuntime`.\n */\n id?: string;\n /** Initial sinks. Defaults to `[]` — package bootstrap installs Datadog on the module runtime. */\n sinks?: readonly JourneySink[];\n slowRequests?: SlowRequestConfig;\n /** Cap recorded steps; default 50. */\n maxSteps?: number;\n /** Default timeout when JourneyDef.timeoutMs is omitted. 0 disables idle countdown. */\n defaultJourneyIdleMs?: number;\n}\n\n/** @internal Read-only snapshot for DevTools (`__stJourney.getDebugState`; empty unless debugging). */\nexport interface JourneyRuntimeDebugSnapshot {\n id: string;\n openJourneys: readonly {\n name: string;\n team: string;\n group: string;\n service: string;\n verdict: Outcome;\n reason: string | null;\n tags: Record<string, TagValue>;\n stepsInFlight: readonly string[];\n steps: readonly {\n name: string;\n outcome: 'good' | 'bad';\n durationMs: number;\n reason?: string;\n attributedRequestKeys?: readonly string[];\n }[];\n }[];\n activeStep: { journey: string; name: string } | null;\n /** Which shared policy knobs this runtime overrode (false = inherit global). */\n policyOverlay: {\n slowRequests: boolean;\n httpAbortedRequests: boolean;\n httpClientErrorRequests: boolean;\n autoAttributeRequests: boolean;\n };\n}\n\n/** @internal Freeze a caller-supplied journey def + tags snapshot. */\nexport function freezeJourneyDef(config: JourneyDef, tags: Record<string, TagValue>): JourneyDef {\n const endpoints = sortEndpointsByLongestMatch(config.endpoints);\n return Object.freeze({\n ...config,\n timeoutMs: config.timeoutMs !== undefined ? finiteTimeoutMs(config.timeoutMs) : undefined,\n stepTimeoutMs:\n config.stepTimeoutMs !== undefined ? finiteTimeoutMs(config.stepTimeoutMs) : undefined,\n slowRequestMs: finiteSlowRequestMs(config.slowRequestMs),\n maxSteps: config.maxSteps !== undefined ? clampMaxSteps(config.maxSteps) : undefined,\n endpoints: endpoints ? Object.freeze([...endpoints]) : undefined,\n expected: config.expected ? Object.freeze([...config.expected]) : undefined,\n tags: Object.freeze({ ...tags }),\n });\n}\n\n/**\n * @internal Private — not part of the public package API.\n * Isolated journey engine (open journeys, ambient steps, sinks, request thresholds).\n * App code should keep using free helpers (`defineJourney`, `journeyStep`, …) — they\n * bind to the module runtime. Prefer `resetJourney()` in tests.\n */\nexport interface JourneyRuntime {\n /** DevTools id for this engine copy. Auto `runtime-N` when registered without an id. */\n readonly id: string;\n getSlowRequests(): SlowRequestConfig;\n setSlowRequests(next: SlowRequestConfig): void;\n getMaxSteps(): number;\n setMaxSteps(next: number): void;\n getDefaultJourneyIdleMs(): number;\n setDefaultJourneyIdleMs(next: number): void;\n\n setSinks(next: readonly JourneySink[]): void;\n /** First `configureJourney({ sinks })` on this runtime wins. Returns false if already set. */\n trySetConfiguredSinks(next: readonly JourneySink[]): boolean;\n addSink(sink: JourneySink): void;\n emit(payload: JourneyEvent): void;\n\n setPolicyOverlay(next: {\n slowRequests?: SlowRequestConfig;\n httpAbortedRequests?: RequestPolicyConfig;\n httpClientErrorRequests?: RequestPolicyConfig;\n autoAttributeRequests?: boolean;\n }): void;\n getAutoAttributeRequests(): boolean;\n getHttpAbortedRequestsPolicy(): RequestPolicyConfig;\n getHttpClientErrorRequestsPolicy(): RequestPolicyConfig;\n\n getOpenJourney(name: string): JourneyState | undefined;\n /** @internal DevTools snapshot of open journeys / ambient step. */\n getDebugSnapshot(): JourneyRuntimeDebugSnapshot;\n firstOpenJourneyName(names: readonly string[]): string | null;\n setJourneyTags(name: string | null, tags: Record<string, TagValue>): void;\n startJourney(config: JourneyDef): void;\n failJourney(journey: JourneyState, reason: string): void;\n completeJourney(name: string | null, tags?: Record<string, TagValue>): void;\n completeJourneyState(journey: JourneyState, tags?: Record<string, TagValue>): void;\n excludeJourney(journey: JourneyState): void;\n updateOpenJourney(config: JourneyDef): void;\n /**\n * @internal Snapshot an open journey for cross-page transfer. Does NOT\n * close the journey. Returns `null` when no journey is open under `name`.\n */\n serializeJourneyState(name: string): SerializedJourneyState | null;\n /**\n * @internal Rehydrate a serialized journey onto this runtime. Returns\n * `null` (after emitting a `bad` `journey-timeout` event) when the journey\n * already exhausted its budget in transit.\n */\n restoreJourney(serialized: SerializedJourneyState, config: JourneyDef): JourneyState | null;\n\n activeJourneyStep(): StepRecord | null;\n journeyStep<T>(\n journey: JourneyStepTarget,\n stepName: string,\n fn: (step: StepHandle) => T | Promise<T>,\n opts?: JourneyStepOptions\n ): Promise<T>;\n journeyMountStep<T>(\n journey: JourneyStepTarget,\n stepName: string,\n fn: (step: StepHandle) => T | Promise<T>,\n opts?: JourneyStepOptions\n ): Promise<T>;\n\n reportBackendRequest(\n step: StepRecord | undefined,\n status: number | undefined,\n durationMs: number,\n requestKey: string\n ): void;\n /** True when this request key is ignored for the step's journey (never changes verdict). */\n shouldIgnoreRequest(journey: JourneyState, key: string): boolean;\n\n /** Close open journeys, clear ambient steps, restore default timeouts/sinks. */\n reset(options?: JourneyRuntimeOptions): void;\n}\n\n/** @internal Bind the fail/exclude/report hooks for a journey's creating engine. */\nexport function bindJourneyEngine(\n api: JourneyRuntime,\n journey: JourneyState,\n shouldIgnoreRequest: (target: JourneyState, key: string) => boolean\n): JourneyEngine {\n return {\n failJourney(reason) {\n api.failJourney(journey, reason);\n },\n exclude() {\n api.excludeJourney(journey);\n },\n shouldIgnoreRequest(key) {\n return shouldIgnoreRequest(journey, key);\n },\n reportBackendRequest(step, status, durationMs, requestKey) {\n api.reportBackendRequest(step, status, durationMs, requestKey);\n },\n getHttpAbortedRequestsPolicy() {\n return api.getHttpAbortedRequestsPolicy();\n },\n getHttpClientErrorRequestsPolicy() {\n return api.getHttpClientErrorRequestsPolicy();\n },\n };\n}\n\n/**\n * @internal Private — not part of the public package API.\n * Build an isolated engine. Rarely needed — apps use the default via free helpers.\n */\nexport function createJourneyRuntime(options: JourneyRuntimeOptions = {}): JourneyRuntime {\n let id = typeof options.id === 'string' && options.id !== '' ? options.id : '';\n const journeys = new Map<string, JourneyState>();\n const inFlight = new Set<StepRecord>();\n let sinks: JourneySink[] = [...(options.sinks ?? [])];\n let sinksConfigured = false;\n let overlay: {\n slowRequests?: SlowRequestConfig;\n httpAbortedRequests?: RequestPolicyConfig;\n httpClientErrorRequests?: RequestPolicyConfig;\n autoAttributeRequests?: boolean;\n } = {};\n let slowRequests: SlowRequestConfig = {\n defaultMs: options.slowRequests?.defaultMs ?? DEFAULT_SLOW_REQUESTS.defaultMs,\n endpoints: sortEndpointsByLongestMatch(\n options.slowRequests?.endpoints ?? DEFAULT_SLOW_REQUESTS.endpoints\n ),\n };\n let maxSteps = clampMaxSteps(options.maxSteps ?? DEFAULT_MAX_STEPS);\n let defaultJourneyIdleMs = finiteTimeoutMs(\n options.defaultJourneyIdleMs ?? DEFAULT_JOURNEY_IDLE_MS\n );\n\n function getInFlightSteps(journey: JourneyState): StepRecord[] {\n const out: StepRecord[] = [];\n for (const step of inFlight) {\n if (step.journey === journey) {\n out.push(step);\n }\n }\n return out;\n }\n\n function enterStep(step: StepRecord): void {\n inFlight.add(step);\n }\n\n function leaveStep(step: StepRecord): void {\n inFlight.delete(step);\n }\n\n function releaseInFlightSteps(journey: JourneyState): void {\n for (const step of [...inFlight]) {\n if (step.journey !== journey) {\n continue;\n }\n if (step.durationMs === 0) {\n step.durationMs = Math.round(globalThis.performance.now() - step.startedAt);\n }\n inFlight.delete(step);\n }\n }\n\n function clearCountdown(journey: JourneyState): void {\n if (journey.timer != null) {\n clearTimeout(journey.timer);\n journey.timer = null;\n }\n }\n\n function emit(payload: JourneyEvent): void {\n const safePayload = sanitizeJourneyEvent(payload);\n for (const sink of sinks) {\n try {\n sink(safePayload);\n } catch {\n // One sinking throw must not block the remaining sinks.\n }\n }\n }\n\n function finish(journey: JourneyState, outcome: Outcome, reason?: string): void {\n if (journey.closed) {\n return;\n }\n journey.closed = true;\n if (journeys.get(journey.name) === journey) {\n journeys.delete(journey.name);\n }\n clearCountdown(journey);\n releaseInFlightSteps(journey);\n\n let finalReason = journey.reason ?? reason;\n let finalOutcome = outcome;\n const durationMs = Math.round(globalThis.performance.now() - journey.startedAt);\n if (journey.timeoutExplicit && journey.timeoutMs > 0 && durationMs > journey.timeoutMs) {\n finalOutcome = 'bad';\n finalReason = finalReason ?? 'journey-timeout';\n }\n\n const steps: JourneyStepEvent[] = journey.steps.map(s => ({\n name: s.name,\n startMs: Math.round(s.startedAt - journey.startedAt),\n durationMs: s.durationMs,\n outcome: s.outcome,\n ...(s.reason ? { reason: s.reason } : {}),\n ...(s.httpStatus !== undefined ? { httpStatus: s.httpStatus } : {}),\n ...(Object.keys(s.attributes).length ? { attributes: { ...s.attributes } } : {}),\n ...(s.requests?.length\n ? { requests: s.requests.map(request => ({ ...request })) }\n : {}),\n ...(s.requestsTruncated ? { requestsTruncated: true } : {}),\n }));\n\n emit({\n journey: {\n name: journey.name,\n team: journey.team,\n group: journey.group,\n service: journey.service,\n outcome: finalOutcome,\n ...(finalOutcome === 'bad' && journey.scoringRequest\n ? { failedRequest: { ...journey.scoringRequest } }\n : {}),\n ...(finalReason ? { reason: finalReason } : {}),\n durationMs,\n steps,\n ...(journey.expected ? { expected: journey.expected } : {}),\n ...(Object.keys(journey.tags).length ? { tags: { ...journey.tags } } : {}),\n },\n });\n }\n\n function armCountdown(journey: JourneyState, delayMs: number = journey.timeoutMs): void {\n if (delayMs <= 0) {\n return;\n }\n journey.timer = setTimeout(() => {\n if (journey.timeoutExplicit) {\n finish(journey, 'bad', 'journey-timeout');\n return;\n }\n finish(journey, journey.verdict === 'bad' ? 'bad' : 'excluded', 'journey-idle-timeout');\n }, delayMs);\n }\n\n function effectiveSlowRequests(): SlowRequestConfig {\n return overlay.slowRequests ?? getSharedSlowRequests() ?? slowRequests;\n }\n\n function shouldIgnoreRequest(journey: JourneyState, key: string): boolean {\n return resolveEndpointPolicy(journey, effectiveSlowRequests(), key).ignore;\n }\n\n function trackAttributedKey(step: StepRecord, requestKey: string): void {\n if (!requestKey) {\n return;\n }\n step.attributedRequestKeys ??= [];\n if (step.attributedRequestKeys.length >= MAX_ATTRIBUTED_REQUEST_KEYS) {\n return;\n }\n if (!step.attributedRequestKeys.includes(requestKey)) {\n step.attributedRequestKeys.push(requestKey);\n }\n }\n\n function resolveJourneyName(journey: JourneyStepTarget): string | null {\n if (journey == null) {\n return null;\n }\n if (typeof journey === 'string' || !Array.isArray(journey)) {\n return toName(journey as JourneyNameLike);\n }\n return api.firstOpenJourneyName(journey.map(toName));\n }\n\n function configFromTarget(target: JourneyNameLike): JourneyDef | undefined {\n if (typeof target === 'string') {\n return undefined;\n }\n if ('config' in target && target.config != null && typeof target.config === 'object') {\n return target.config;\n }\n const rec = target as {\n name?: unknown;\n team?: unknown;\n group?: unknown;\n service?: unknown;\n };\n if (\n typeof rec.name === 'string' &&\n typeof rec.team === 'string' &&\n typeof rec.group === 'string' &&\n typeof rec.service === 'string'\n ) {\n return target as JourneyDef;\n }\n return undefined;\n }\n\n function maybeAutoStart(target: JourneyStepTarget): void {\n if (target == null || typeof target === 'string' || Array.isArray(target)) {\n return;\n }\n const def = configFromTarget(target as JourneyNameLike);\n if (def && !api.getOpenJourney(def.name)) {\n api.startJourney(def);\n }\n }\n\n function createStepHandle(journeyName: string, step: StepRecord): StepHandle {\n return {\n journeyName,\n setAttribute(key, value) {\n setSafeAttribute(step.attributes, key, value);\n },\n setTags(tags) {\n if (step.journey.closed) {\n return;\n }\n assignRecord(step.journey.tags, tags, MAX_TAG_KEYS);\n },\n completeJourney(tags) {\n api.completeJourneyState(step.journey, tags);\n },\n failJourney(reason) {\n api.failJourney(step.journey, reason);\n },\n // Box in JourneyStepStamp — raw StepRecord is circular and blows jQuery/axios deep-merge.\n stamp: scoreOrOpts => new JourneyStepStamp(step, resolveStampOpts(scoreOrOpts)),\n };\n }\n\n const api: JourneyRuntime = {\n get id() {\n return id;\n },\n set id(next: string) {\n id = next;\n },\n getSlowRequests() {\n return effectiveSlowRequests();\n },\n\n setSlowRequests(next) {\n slowRequests = {\n ...next,\n endpoints: sortEndpointsByLongestMatch(next.endpoints),\n };\n },\n\n getMaxSteps() {\n return maxSteps;\n },\n\n setMaxSteps(next) {\n maxSteps = clampMaxSteps(next);\n },\n\n getDefaultJourneyIdleMs() {\n return defaultJourneyIdleMs;\n },\n\n setDefaultJourneyIdleMs(next) {\n defaultJourneyIdleMs = finiteTimeoutMs(next);\n },\n\n setSinks(next) {\n sinks = [...next];\n },\n\n trySetConfiguredSinks(next) {\n if (sinksConfigured) {\n return false;\n }\n sinks = [...next];\n sinksConfigured = true;\n return true;\n },\n\n addSink(sink) {\n sinks.push(sink);\n },\n\n emit,\n\n setPolicyOverlay(next) {\n overlay = { ...overlay, ...next };\n },\n\n getAutoAttributeRequests() {\n if (overlay.autoAttributeRequests !== undefined) {\n return overlay.autoAttributeRequests;\n }\n return getSharedAutoAttributeRequests();\n },\n\n getHttpAbortedRequestsPolicy() {\n return overlay.httpAbortedRequests ?? getSharedHttpAbortedRequestsPolicy();\n },\n\n getHttpClientErrorRequestsPolicy() {\n return overlay.httpClientErrorRequests ?? getSharedHttpClientErrorRequestsPolicy();\n },\n\n getOpenJourney(name) {\n return journeys.get(name);\n },\n\n getDebugSnapshot() {\n const active = api.activeJourneyStep();\n return {\n id: api.id,\n openJourneys: [...journeys.values()].map(journey => ({\n name: journey.name,\n team: journey.team,\n group: journey.group,\n service: journey.service,\n verdict: journey.verdict,\n reason: journey.reason,\n tags: { ...journey.tags },\n stepsInFlight: getInFlightSteps(journey).map(step => step.name),\n steps: journey.steps.map(step => ({\n name: step.name,\n outcome: step.outcome,\n durationMs: step.durationMs,\n ...(step.reason ? { reason: step.reason } : {}),\n ...(step.attributedRequestKeys?.length\n ? { attributedRequestKeys: [...step.attributedRequestKeys] }\n : {}),\n })),\n })),\n activeStep: active ? { journey: active.journey.name, name: active.name } : null,\n policyOverlay: {\n slowRequests: overlay.slowRequests != null,\n httpAbortedRequests: overlay.httpAbortedRequests != null,\n httpClientErrorRequests: overlay.httpClientErrorRequests != null,\n autoAttributeRequests: overlay.autoAttributeRequests != null,\n },\n };\n },\n\n firstOpenJourneyName(names) {\n for (const name of names) {\n if (journeys.has(name)) {\n return name;\n }\n }\n return null;\n },\n\n setJourneyTags(name, tags) {\n const journey = name ? journeys.get(name) : undefined;\n if (journey) {\n assignRecord(journey.tags, tags, MAX_TAG_KEYS);\n }\n },\n\n startJourney(config) {\n const existing = journeys.get(config.name);\n if (existing) {\n finish(existing, existing.verdict === 'bad' ? 'bad' : 'excluded');\n }\n\n const tags = emptyRecord();\n assignRecord(tags, config.tags, MAX_TAG_KEYS);\n const snapshot = freezeJourneyDef(config, tags);\n const timeout = resolveJourneyTimeoutMs(snapshot.timeoutMs, defaultJourneyIdleMs);\n const journey: JourneyState = {\n config: snapshot,\n name: snapshot.name,\n team: snapshot.team,\n group: snapshot.group,\n service: snapshot.service,\n verdict: 'good',\n startedAt: globalThis.performance.now(),\n timeoutMs: timeout.ms,\n timeoutExplicit: timeout.explicit,\n stepTimeoutMs:\n snapshot.stepTimeoutMs !== undefined\n ? finiteTimeoutMs(snapshot.stepTimeoutMs)\n : undefined,\n reason: null,\n steps: [],\n expected: snapshot.expected ? [...snapshot.expected] : null,\n tags,\n slowRequestMs: finiteSlowRequestMs(snapshot.slowRequestMs),\n endpoints: snapshot.endpoints,\n timer: null,\n closed: false,\n maxSteps:\n snapshot.maxSteps !== undefined ? clampMaxSteps(snapshot.maxSteps) : undefined,\n };\n journeys.set(config.name, journey);\n journey[JOURNEY_ENGINE] = bindJourneyEngine(api, journey, shouldIgnoreRequest);\n armCountdown(journey);\n },\n\n failJourney(journey, reason) {\n if (journey.closed) {\n return;\n }\n journey.verdict = 'bad';\n journey.reason ??= reason;\n finish(journey, 'bad');\n },\n\n completeJourney(name, tags) {\n if (!name) {\n return;\n }\n const journey = journeys.get(name);\n if (journey) {\n api.completeJourneyState(journey, tags);\n }\n },\n\n completeJourneyState(journey, tags) {\n if (journey.closed) {\n return;\n }\n if (tags) {\n assignRecord(journey.tags, tags, MAX_TAG_KEYS);\n }\n finish(journey, journey.verdict === 'bad' ? 'bad' : 'good');\n },\n\n excludeJourney(journey) {\n if (journey.closed) {\n return;\n }\n finish(journey, journey.verdict === 'bad' ? 'bad' : 'excluded');\n },\n\n updateOpenJourney(config) {\n const journey = journeys.get(config.name);\n if (!journey || journey.closed) {\n return;\n }\n journey.team = config.team;\n journey.group = config.group;\n journey.service = config.service;\n const timeout = resolveJourneyTimeoutMs(config.timeoutMs, defaultJourneyIdleMs);\n journey.timeoutMs = timeout.ms;\n journey.timeoutExplicit = timeout.explicit;\n journey.stepTimeoutMs =\n config.stepTimeoutMs !== undefined\n ? finiteTimeoutMs(config.stepTimeoutMs)\n : undefined;\n journey.slowRequestMs = finiteSlowRequestMs(config.slowRequestMs);\n journey.endpoints = sortEndpointsByLongestMatch(config.endpoints);\n journey.expected = config.expected ? [...config.expected] : null;\n journey.maxSteps =\n config.maxSteps !== undefined ? clampMaxSteps(config.maxSteps) : undefined;\n if (config.tags) {\n assignRecord(journey.tags, config.tags, MAX_TAG_KEYS);\n }\n clearCountdown(journey);\n if (journey.timeoutMs <= 0) {\n return;\n }\n const elapsedMs = globalThis.performance.now() - journey.startedAt;\n const remainingMs = journey.timeoutMs - elapsedMs;\n if (remainingMs <= 0) {\n if (journey.timeoutExplicit) {\n finish(journey, 'bad', 'journey-timeout');\n return;\n }\n finish(\n journey,\n journey.verdict === 'bad' ? 'bad' : 'excluded',\n 'journey-idle-timeout'\n );\n return;\n }\n armCountdown(journey, remainingMs);\n },\n\n serializeJourneyState(name) {\n const journey = journeys.get(name);\n if (!journey || journey.closed) {\n return null;\n }\n return projectJourneyState(journey);\n },\n\n restoreJourney(serialized, config) {\n // Refuse double-registration: leave an existing journey under this name in place.\n if (journeys.has(config.name)) {\n return null;\n }\n\n const journey = deserializeJourneyState(serialized, config, api, defaultJourneyIdleMs);\n\n if (journey.timeoutMs > 0) {\n const elapsedMs = globalThis.performance.now() - journey.startedAt;\n if (elapsedMs >= journey.timeoutMs) {\n // journey not yet in journeys Map — finish() handles unregistered journeys gracefully.\n if (journey.timeoutExplicit) {\n finish(journey, 'bad', 'journey-timeout');\n } else {\n finish(\n journey,\n journey.verdict === 'bad' ? 'bad' : 'excluded',\n 'journey-idle-timeout'\n );\n }\n return null;\n }\n\n journeys.set(config.name, journey);\n\n const remainingMs = journey.timeoutMs - elapsedMs;\n if (remainingMs > 0) {\n armCountdown(journey, remainingMs);\n }\n } else {\n journeys.set(config.name, journey);\n }\n\n return journey;\n },\n\n activeJourneyStep() {\n if (!api.getAutoAttributeRequests()) {\n return null;\n }\n if (inFlight.size !== 1) {\n return null;\n }\n return inFlight.values().next().value ?? null;\n },\n\n async journeyStep(journey, stepName, fn, opts) {\n maybeAutoStart(journey);\n const journeyName = resolveJourneyName(journey);\n const open = journeyName ? journeys.get(journeyName) : undefined;\n if (!open || !journeyName) {\n if (isJourneyDebugEnabled()) {\n // eslint-disable-next-line no-console -- debug-only untraced hint\n console.debug(`[journey] step \"${stepName}\" ran untraced (no open journey)`);\n }\n return fn(noopStep);\n }\n\n const step: StepRecord = {\n name: stepName,\n startedAt: globalThis.performance.now(),\n durationMs: 0,\n outcome: 'good',\n attributes: emptyRecord(),\n journey: open,\n };\n const cap = open.maxSteps ?? maxSteps;\n if (open.steps.length >= cap) {\n open.tags.steps_truncated = true;\n } else {\n open.steps.push(step);\n }\n\n const handle = createStepHandle(journeyName, step);\n\n const stepTimeoutMs = opts?.timeoutMs ?? open.stepTimeoutMs ?? 0;\n let timeoutTimer: ReturnType<typeof setTimeout> | null = null;\n if (stepTimeoutMs > 0) {\n timeoutTimer = setTimeout(() => {\n if (open.closed) {\n return;\n }\n step.outcome = 'bad';\n step.reason ??= 'step-timeout';\n step.attributes.timeout_ms ??= stepTimeoutMs;\n step.durationMs = Math.round(globalThis.performance.now() - step.startedAt);\n api.failJourney(open, 'step-timeout');\n }, stepTimeoutMs);\n }\n\n enterStep(step);\n try {\n return await fn(handle);\n } catch (err) {\n if (isCanceledError(err)) {\n /*\n * Attributed abort is scored in onHttpComplete. Unattributed /\n * ignored abort throws must not apply policy (empty requestKey).\n */\n } else {\n step.outcome = 'bad';\n step.reason ??= 'step-error';\n api.failJourney(open, 'step-error');\n }\n throw err;\n } finally {\n if (timeoutTimer != null) {\n clearTimeout(timeoutTimer);\n }\n if (step.durationMs === 0) {\n step.durationMs = Math.round(globalThis.performance.now() - step.startedAt);\n }\n leaveStep(step);\n }\n },\n\n async journeyMountStep(journey, stepName, fn, opts) {\n await Promise.resolve();\n return api.journeyStep(journey, stepName, fn, opts);\n },\n\n shouldIgnoreRequest,\n\n reportBackendRequest(step, status, durationMs, requestKey) {\n if (!step?.journey) {\n return;\n }\n const journey = step.journey;\n if (journey.closed) {\n return;\n }\n trackAttributedKey(step, requestKey);\n const endpointPolicy = resolveEndpointPolicy(\n journey,\n effectiveSlowRequests(),\n requestKey\n );\n if (endpointPolicy.ignore) {\n return;\n }\n\n const failed = status === undefined || status >= 500;\n const threshold = endpointPolicy.slowRequestMs;\n const slow = threshold > 0 && durationMs > threshold;\n if (!failed && !slow) {\n return;\n }\n\n const category = failed ? 'request-error' : 'request-latency';\n\n step.outcome = 'bad';\n step.reason ??= category;\n if (failed && status !== undefined) {\n step.httpStatus = status;\n }\n\n api.failJourney(journey, category);\n },\n\n reset(next = {}) {\n for (const journey of [...journeys.values()]) {\n clearCountdown(journey);\n journey.closed = true;\n }\n journeys.clear();\n inFlight.clear();\n overlay = {};\n sinksConfigured = false;\n sinks = [...(next.sinks ?? [])];\n slowRequests = {\n defaultMs: next.slowRequests?.defaultMs ?? DEFAULT_SLOW_REQUESTS.defaultMs,\n endpoints: sortEndpointsByLongestMatch(\n next.slowRequests?.endpoints ?? DEFAULT_SLOW_REQUESTS.endpoints\n ),\n };\n maxSteps =\n next.maxSteps !== undefined ? clampMaxSteps(next.maxSteps) : DEFAULT_MAX_STEPS;\n defaultJourneyIdleMs = finiteTimeoutMs(\n next.defaultJourneyIdleMs ?? DEFAULT_JOURNEY_IDLE_MS\n );\n },\n };\n\n return api;\n}\n\n/**\n * @internal Private — not part of the public package API.\n * Module-scoped engine used by free helpers. App code does not need to touch this.\n * Each host/MFE bundle gets its own copy when the package is duplicated.\n */\nexport const moduleRuntime: JourneyRuntime = createJourneyRuntime();\n\nconst noopEngine: JourneyEngine = {\n failJourney() {},\n exclude() {},\n shouldIgnoreRequest() {\n return false;\n },\n reportBackendRequest() {},\n getHttpAbortedRequestsPolicy() {\n return 'continue';\n },\n getHttpClientErrorRequestsPolicy() {\n return 'continue';\n },\n};\n\n/**\n * True when this bundle can fail/exclude/report the journey: stamped engine, or\n * this runtime's own unstamped object. False for a foreign older-copy journey.\n */\nexport function canRouteHttpToJourney(journey: JourneyState): boolean {\n return (\n journey[JOURNEY_ENGINE] != null || moduleRuntime.getOpenJourney(journey.name) === journey\n );\n}\n\n/**\n * @internal Prefer the creating engine on a journey (MFE `step.stamp()` on a host transport).\n * Falls back to this bundle's module runtime only when this runtime owns the object.\n * Unstamped foreign journeys (older package copies) are a no-op so a same-named\n * host journey is not deleted from this map.\n */\nexport function resolveJourneyEngine(journey: JourneyState): JourneyEngine {\n const stamped = journey[JOURNEY_ENGINE];\n if (stamped) {\n return stamped;\n }\n if (moduleRuntime.getOpenJourney(journey.name) !== journey) {\n return noopEngine;\n }\n return {\n failJourney(reason) {\n moduleRuntime.failJourney(journey, reason);\n },\n exclude() {\n moduleRuntime.excludeJourney(journey);\n },\n shouldIgnoreRequest(key) {\n return moduleRuntime.shouldIgnoreRequest(journey, key);\n },\n reportBackendRequest(step, status, durationMs, requestKey) {\n moduleRuntime.reportBackendRequest(step, status, durationMs, requestKey);\n },\n getHttpAbortedRequestsPolicy() {\n return moduleRuntime.getHttpAbortedRequestsPolicy();\n },\n getHttpClientErrorRequestsPolicy() {\n return moduleRuntime.getHttpClientErrorRequestsPolicy();\n },\n };\n}\n\n/**\n * @internal Reset the module engine (open journeys, ambient steps, sinks, slow-request thresholds).\n * Intended for tests — call in `beforeEach` / `afterEach` instead of manual cleanup.\n */\nexport function resetJourney(options?: JourneyRuntimeOptions): void {\n moduleRuntime.reset(options);\n}\n"],"names":["getAutoAttributeRequests","getSharedAutoAttributeRequests","getHttpAbortedRequestsPolicy","getSharedHttpAbortedRequestsPolicy","getHttpClientErrorRequestsPolicy","getSharedHttpClientErrorRequestsPolicy","getSharedSlowRequests","isJourneyDebugEnabled","isCanceledError","resolveEndpointPolicy","sortEndpointsByLongestMatch","deserializeJourneyState","projectJourneyState","clampMaxSteps","DEFAULT_MAX_STEPS","DEFAULT_JOURNEY_IDLE_MS","finiteSlowRequestMs","finiteTimeoutMs","MAX_ATTRIBUTED_REQUEST_KEYS","MAX_TAG_KEYS","resolveJourneyTimeoutMs","assignRecord","emptyRecord","sanitizeJourneyEvent","setSafeAttribute","JourneyStepStamp","resolveStampOpts","JOURNEY_ENGINE","DEFAULT_SLOW_REQUESTS","defaultMs","endpoints","noopStep","journeyName","setAttribute","setTags","completeJourney","failJourney","stamp","undefined","toName","target","config","name","freezeJourneyDef","tags","Object","freeze","timeoutMs","stepTimeoutMs","slowRequestMs","maxSteps","expected","bindJourneyEngine","api","journey","shouldIgnoreRequest","reason","exclude","excludeJourney","key","reportBackendRequest","step","status","durationMs","requestKey","createJourneyRuntime","options","id","journeys","Map","inFlight","Set","sinks","sinksConfigured","overlay","slowRequests","defaultJourneyIdleMs","getInFlightSteps","out","push","enterStep","add","leaveStep","delete","releaseInFlightSteps","Math","round","globalThis","performance","now","startedAt","clearCountdown","timer","clearTimeout","emit","payload","safePayload","sink","finish","outcome","closed","get","finalReason","finalOutcome","timeoutExplicit","steps","map","s","startMs","httpStatus","keys","attributes","length","requests","request","requestsTruncated","team","group","service","scoringRequest","failedRequest","armCountdown","delayMs","setTimeout","verdict","effectiveSlowRequests","ignore","trackAttributedKey","attributedRequestKeys","includes","resolveJourneyName","Array","isArray","firstOpenJourneyName","configFromTarget","rec","maybeAutoStart","def","getOpenJourney","startJourney","createStepHandle","value","completeJourneyState","scoreOrOpts","next","getSlowRequests","setSlowRequests","getMaxSteps","setMaxSteps","getDefaultJourneyIdleMs","setDefaultJourneyIdleMs","setSinks","trySetConfiguredSinks","addSink","setPolicyOverlay","autoAttributeRequests","httpAbortedRequests","httpClientErrorRequests","getDebugSnapshot","active","activeJourneyStep","openJourneys","values","stepsInFlight","activeStep","policyOverlay","names","has","setJourneyTags","existing","snapshot","timeout","ms","explicit","set","updateOpenJourney","elapsedMs","remainingMs","serializeJourneyState","restoreJourney","serialized","size","journeyStep","stepName","fn","opts","open","console","debug","cap","steps_truncated","handle","timeoutTimer","timeout_ms","err","journeyMountStep","Promise","resolve","endpointPolicy","failed","threshold","slow","category","reset","clear","moduleRuntime","noopEngine","canRouteHttpToJourney","resolveJourneyEngine","stamped","resetJourney"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/core/sanitize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAoB,QAAQ,EAAE,MAAM,SAAS,CAAC;AASxE,8FAA8F;AAC9F,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOvD;AAED,wBAAgB,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAEtD;AAYD,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,yDAAyD;IACzD,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED;;GAEG;AACH,wBAAgB,UAAU,CACtB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACxC,OAAO,EAAE,iBAAiB,GAC3B,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAkC1B;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EAChC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACxC,OAAO,EAAE,MAAM,GAChB,IAAI,CAsBN;AAED,wBAAgB,gBAAgB,CAC5B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EACpC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GACjC,IAAI,CAYN;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
+ {"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"}
@@ -85,16 +85,16 @@ export function setSafeAttribute(attributes, key, value) {
85
85
  attributes[key] = next;
86
86
  }
87
87
  }
88
- function sanitizeStep(step, includeRequests) {
88
+ function sanitizeStep(step) {
89
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) : [];
90
+ const requests = Array.isArray(rawRequests) ? rawRequests.slice(0, MAX_CORRELATED_REQUESTS).map(sanitizeRequestCorrelation).filter((request)=>request !== undefined) : [];
91
91
  const name = normalizeTagValue(step.name);
92
92
  return {
93
93
  ...rest,
94
94
  ...requests.length ? {
95
95
  requests
96
96
  } : {},
97
- ...includeRequests && requestsTruncated === true ? {
97
+ ...requestsTruncated === true ? {
98
98
  requestsTruncated: true
99
99
  } : {},
100
100
  name: name || step.name,
@@ -118,7 +118,7 @@ function sanitizeStep(step, includeRequests) {
118
118
  normalizeKeys: true
119
119
  }) : undefined;
120
120
  const tagKeys = tags ? Object.keys(tags) : [];
121
- const steps = j.steps.map((step)=>sanitizeStep(step, j.outcome === 'bad'));
121
+ const steps = j.steps.map(sanitizeStep);
122
122
  // Prefer recently started steps at the cap; failedRequest preserves the scoring request separately.
123
123
  let requestBudget = MAX_JOURNEY_CORRELATED_REQUESTS;
124
124
  for(let index = steps.length - 1; index >= 0; index--){
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/sanitize.ts"],"sourcesContent":["import { isUnsafeKey, MAX_ATTRIBUTE_KEYS, MAX_TAG_KEYS, MAX_TAG_VALUE_LEN } from './limits';\nimport type { JourneyEvent, JourneyStepEvent, TagValue } from './types';\nimport {\n MAX_CORRELATED_REQUESTS,\n MAX_JOURNEY_CORRELATED_REQUESTS,\n sanitizeRequestCorrelation,\n} from './request-correlation';\n\nconst SANITIZED_EVENT = Symbol.for('st.journey.sanitized');\n\n/** Match Datadog metric-tag value rules so RUM attributes / globals join derived SLO tags. */\nexport function normalizeTagValue(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9_\\-:./]/g, '_')\n .replace(/_+/g, '_')\n .slice(0, MAX_TAG_VALUE_LEN)\n .replace(/_+$/, '');\n}\n\nexport function emptyRecord(): Record<string, TagValue> {\n return Object.create(null) as Record<string, TagValue>;\n}\n\nfunction asTagValue(value: unknown): TagValue | undefined {\n if (typeof value === 'string') {\n return normalizeTagValue(value);\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n return undefined;\n}\n\nexport interface CopyRecordOptions {\n maxKeys: number;\n /** When true, keys are run through {@link normalizeTagValue} (sink / wire). */\n normalizeKeys?: boolean;\n /** When true (default), string values are normalized. */\n normalizeStringValues?: boolean;\n}\n\n/**\n * Own-key copy onto a null-prototype object. Skips unsafe keys and excess keys.\n */\nexport function copyRecord(\n src: Record<string, unknown> | undefined,\n options: CopyRecordOptions\n): Record<string, TagValue> {\n const out = emptyRecord();\n if (src == null || typeof src !== 'object') {\n return out;\n }\n const normalizeKeys = options.normalizeKeys === true;\n const normalizeStringValues = options.normalizeStringValues !== false;\n for (const key of Object.keys(src)) {\n if (isUnsafeKey(key)) {\n continue;\n }\n const destKey = normalizeKeys ? normalizeTagValue(key) : key;\n if (!destKey || isUnsafeKey(destKey)) {\n continue;\n }\n const raw = src[key];\n const value = normalizeStringValues\n ? asTagValue(raw)\n : typeof raw === 'string' || typeof raw === 'number' || typeof raw === 'boolean'\n ? raw\n : undefined;\n if (value === undefined) {\n continue;\n }\n if (Object.prototype.hasOwnProperty.call(out, destKey)) {\n out[destKey] = value;\n continue;\n }\n if (Object.keys(out).length >= options.maxKeys) {\n continue;\n }\n out[destKey] = value;\n }\n return out;\n}\n\n/** Merge `src` into `target` (null-prototype), honouring caps and unsafe-key skips. */\nexport function assignRecord(\n target: Record<string, TagValue>,\n src: Record<string, unknown> | undefined,\n maxKeys: number\n): void {\n if (src == null || typeof src !== 'object') {\n return;\n }\n let room = maxKeys - Object.keys(target).length;\n for (const key of Object.keys(src)) {\n if (isUnsafeKey(key)) {\n continue;\n }\n const raw = src[key];\n if (typeof raw !== 'string' && typeof raw !== 'number' && typeof raw !== 'boolean') {\n continue;\n }\n const exists = Object.prototype.hasOwnProperty.call(target, key);\n if (!exists && room <= 0) {\n continue;\n }\n if (!exists) {\n room -= 1;\n }\n target[key] = raw;\n }\n}\n\nexport function setSafeAttribute(\n attributes: Record<string, TagValue>,\n key: string,\n value: string | number | boolean\n): void {\n if (isUnsafeKey(key)) {\n return;\n }\n const exists = Object.prototype.hasOwnProperty.call(attributes, key);\n if (!exists && Object.keys(attributes).length >= MAX_ATTRIBUTE_KEYS) {\n return;\n }\n const next = asTagValue(value);\n if (next !== undefined) {\n attributes[key] = next;\n }\n}\n\nfunction sanitizeStep(step: JourneyStepEvent, includeRequests: boolean): JourneyStepEvent {\n const { requests: rawRequests, requestsTruncated, ...rest } = step;\n const requests =\n includeRequests && Array.isArray(rawRequests)\n ? rawRequests\n .slice(0, MAX_CORRELATED_REQUESTS)\n .map(sanitizeRequestCorrelation)\n .filter(request => request !== undefined)\n : [];\n const name = normalizeTagValue(step.name);\n return {\n ...rest,\n ...(requests.length ? { requests } : {}),\n ...(includeRequests && requestsTruncated === true ? { requestsTruncated: true } : {}),\n name: name || step.name,\n ...(step.reason ? { reason: normalizeTagValue(step.reason) } : {}),\n ...(step.attributes\n ? {\n attributes: copyRecord(step.attributes, {\n maxKeys: MAX_ATTRIBUTE_KEYS,\n normalizeKeys: true,\n }),\n }\n : {}),\n };\n}\n\n/** Default-sink payload: normalized keys/names, capped maps, no unsafe keys. */\nexport function sanitizeJourneyEvent(event: JourneyEvent): JourneyEvent {\n const j = event.journey;\n const expected = j.expected?.map(name => normalizeTagValue(name)).filter(name => name !== '');\n const tags = j.tags\n ? copyRecord(j.tags, { maxKeys: MAX_TAG_KEYS, normalizeKeys: true })\n : undefined;\n const tagKeys = tags ? Object.keys(tags) : [];\n const steps = j.steps.map(step => sanitizeStep(step, j.outcome === 'bad'));\n // Prefer recently started steps at the cap; failedRequest preserves the scoring request separately.\n let requestBudget = MAX_JOURNEY_CORRELATED_REQUESTS;\n for (let index = steps.length - 1; index >= 0; index--) {\n const step = steps[index];\n if (!step.requests) {\n continue;\n }\n if (step.requests.length > requestBudget) {\n step.requestsTruncated = true;\n if (requestBudget === 0) {\n delete step.requests;\n } else {\n step.requests = step.requests.slice(-requestBudget);\n }\n }\n requestBudget -= step.requests?.length ?? 0;\n }\n const failedRequest =\n j.outcome === 'bad' && j.failedRequest\n ? sanitizeRequestCorrelation(j.failedRequest)\n : undefined;\n const sanitized: JourneyEvent = {\n journey: {\n name: normalizeTagValue(j.name),\n team: normalizeTagValue(j.team),\n group: normalizeTagValue(j.group),\n service: normalizeTagValue(j.service),\n outcome: j.outcome,\n ...(failedRequest ? { failedRequest } : {}),\n ...(j.reason ? { reason: normalizeTagValue(j.reason) } : {}),\n durationMs: j.durationMs,\n steps,\n ...(expected?.length ? { expected } : {}),\n ...(tagKeys.length ? { tags } : {}),\n },\n };\n Object.defineProperty(sanitized, SANITIZED_EVENT, {\n value: true,\n enumerable: false,\n configurable: false,\n });\n return sanitized;\n}\n\n/** True when payload already passed through sanitizeJourneyEvent. */\nexport function isSanitizedJourneyEvent(event: JourneyEvent): boolean {\n return (event as unknown as Record<PropertyKey, unknown>)[SANITIZED_EVENT] === true;\n}\n"],"names":["isUnsafeKey","MAX_ATTRIBUTE_KEYS","MAX_TAG_KEYS","MAX_TAG_VALUE_LEN","MAX_CORRELATED_REQUESTS","MAX_JOURNEY_CORRELATED_REQUESTS","sanitizeRequestCorrelation","SANITIZED_EVENT","Symbol","for","normalizeTagValue","value","toLowerCase","replace","slice","emptyRecord","Object","create","asTagValue","undefined","copyRecord","src","options","out","normalizeKeys","normalizeStringValues","key","keys","destKey","raw","prototype","hasOwnProperty","call","length","maxKeys","assignRecord","target","room","exists","setSafeAttribute","attributes","next","sanitizeStep","step","includeRequests","requests","rawRequests","requestsTruncated","rest","Array","isArray","map","filter","request","name","reason","sanitizeJourneyEvent","event","j","journey","expected","tags","tagKeys","steps","outcome","requestBudget","index","failedRequest","sanitized","team","group","service","durationMs","defineProperty","enumerable","configurable","isSanitizedJourneyEvent"],"mappings":"AAAA,SAASA,WAAW,EAAEC,kBAAkB,EAAEC,YAAY,EAAEC,iBAAiB,QAAQ,WAAW;AAE5F,SACIC,uBAAuB,EACvBC,+BAA+B,EAC/BC,0BAA0B,QACvB,wBAAwB;AAE/B,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,GAAGX,mBACTU,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,IAAIrB,YAAY0B,MAAM;YAClB;QACJ;QACA,MAAME,UAAUJ,gBAAgBd,kBAAkBgB,OAAOA;QACzD,IAAI,CAACE,WAAW5B,YAAY4B,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,IAAIrB,YAAY0B,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,IAAIX,YAAY0B,MAAM;QAClB;IACJ;IACA,MAAMY,SAAStB,OAAOc,SAAS,CAACC,cAAc,CAACC,IAAI,CAACQ,YAAYd;IAChE,IAAI,CAACY,UAAUtB,OAAOW,IAAI,CAACa,YAAYP,MAAM,IAAIhC,oBAAoB;QACjE;IACJ;IACA,MAAMwC,OAAOvB,WAAWP;IACxB,IAAI8B,SAAStB,WAAW;QACpBqB,UAAU,CAACd,IAAI,GAAGe;IACtB;AACJ;AAEA,SAASC,aAAaC,IAAsB,EAAEC,eAAwB;IAClE,MAAM,EAAEC,UAAUC,WAAW,EAAEC,iBAAiB,EAAE,GAAGC,MAAM,GAAGL;IAC9D,MAAME,WACFD,mBAAmBK,MAAMC,OAAO,CAACJ,eAC3BA,YACKhC,KAAK,CAAC,GAAGV,yBACT+C,GAAG,CAAC7C,4BACJ8C,MAAM,CAACC,CAAAA,UAAWA,YAAYlC,aACnC,EAAE;IACZ,MAAMmC,OAAO5C,kBAAkBiC,KAAKW,IAAI;IACxC,OAAO;QACH,GAAGN,IAAI;QACP,GAAIH,SAASZ,MAAM,GAAG;YAAEY;QAAS,IAAI,CAAC,CAAC;QACvC,GAAID,mBAAmBG,sBAAsB,OAAO;YAAEA,mBAAmB;QAAK,IAAI,CAAC,CAAC;QACpFO,MAAMA,QAAQX,KAAKW,IAAI;QACvB,GAAIX,KAAKY,MAAM,GAAG;YAAEA,QAAQ7C,kBAAkBiC,KAAKY,MAAM;QAAE,IAAI,CAAC,CAAC;QACjE,GAAIZ,KAAKH,UAAU,GACb;YACIA,YAAYpB,WAAWuB,KAAKH,UAAU,EAAE;gBACpCN,SAASjC;gBACTuB,eAAe;YACnB;QACJ,IACA,CAAC,CAAC;IACZ;AACJ;AAEA,8EAA8E,GAC9E,OAAO,SAASgC,qBAAqBC,KAAmB;QAEnCC;IADjB,MAAMA,IAAID,MAAME,OAAO;IACvB,MAAMC,YAAWF,cAAAA,EAAEE,QAAQ,cAAVF,kCAAAA,YAAYP,GAAG,CAACG,CAAAA,OAAQ5C,kBAAkB4C,OAAOF,MAAM,CAACE,CAAAA,OAAQA,SAAS;IAC1F,MAAMO,OAAOH,EAAEG,IAAI,GACbzC,WAAWsC,EAAEG,IAAI,EAAE;QAAE3B,SAAShC;QAAcsB,eAAe;IAAK,KAChEL;IACN,MAAM2C,UAAUD,OAAO7C,OAAOW,IAAI,CAACkC,QAAQ,EAAE;IAC7C,MAAME,QAAQL,EAAEK,KAAK,CAACZ,GAAG,CAACR,CAAAA,OAAQD,aAAaC,MAAMe,EAAEM,OAAO,KAAK;IACnE,oGAAoG;IACpG,IAAIC,gBAAgB5D;IACpB,IAAK,IAAI6D,QAAQH,MAAM9B,MAAM,GAAG,GAAGiC,SAAS,GAAGA,QAAS;;YAanCvB;QAZjB,MAAMA,OAAOoB,KAAK,CAACG,MAAM;QACzB,IAAI,CAACvB,KAAKE,QAAQ,EAAE;YAChB;QACJ;QACA,IAAIF,KAAKE,QAAQ,CAACZ,MAAM,GAAGgC,eAAe;YACtCtB,KAAKI,iBAAiB,GAAG;YACzB,IAAIkB,kBAAkB,GAAG;gBACrB,OAAOtB,KAAKE,QAAQ;YACxB,OAAO;gBACHF,KAAKE,QAAQ,GAAGF,KAAKE,QAAQ,CAAC/B,KAAK,CAAC,CAACmD;YACzC;QACJ;QACAA,0BAAiBtB,iBAAAA,KAAKE,QAAQ,cAAbF,qCAAAA,eAAeV,MAAM,uCAAI;IAC9C;IACA,MAAMkC,gBACFT,EAAEM,OAAO,KAAK,SAASN,EAAES,aAAa,GAChC7D,2BAA2BoD,EAAES,aAAa,IAC1ChD;IACV,MAAMiD,YAA0B;QAC5BT,SAAS;YACLL,MAAM5C,kBAAkBgD,EAAEJ,IAAI;YAC9Be,MAAM3D,kBAAkBgD,EAAEW,IAAI;YAC9BC,OAAO5D,kBAAkBgD,EAAEY,KAAK;YAChCC,SAAS7D,kBAAkBgD,EAAEa,OAAO;YACpCP,SAASN,EAAEM,OAAO;YAClB,GAAIG,gBAAgB;gBAAEA;YAAc,IAAI,CAAC,CAAC;YAC1C,GAAIT,EAAEH,MAAM,GAAG;gBAAEA,QAAQ7C,kBAAkBgD,EAAEH,MAAM;YAAE,IAAI,CAAC,CAAC;YAC3DiB,YAAYd,EAAEc,UAAU;YACxBT;YACA,GAAIH,CAAAA,qBAAAA,+BAAAA,SAAU3B,MAAM,IAAG;gBAAE2B;YAAS,IAAI,CAAC,CAAC;YACxC,GAAIE,QAAQ7B,MAAM,GAAG;gBAAE4B;YAAK,IAAI,CAAC,CAAC;QACtC;IACJ;IACA7C,OAAOyD,cAAc,CAACL,WAAW7D,iBAAiB;QAC9CI,OAAO;QACP+D,YAAY;QACZC,cAAc;IAClB;IACA,OAAOP;AACX;AAEA,mEAAmE,GACnE,OAAO,SAASQ,wBAAwBnB,KAAmB;IACvD,OAAO,AAACA,KAAiD,CAAClD,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): JourneyStepEvent {\n const { requests: rawRequests, requestsTruncated, ...rest } = step;\n const requests = Array.isArray(rawRequests)\n ? rawRequests\n .slice(0, MAX_CORRELATED_REQUESTS)\n .map(sanitizeRequestCorrelation)\n .filter(request => request !== undefined)\n : [];\n const name = normalizeTagValue(step.name);\n return {\n ...rest,\n ...(requests.length ? { requests } : {}),\n ...(requestsTruncated === true ? { requestsTruncated: true } : {}),\n name: name || step.name,\n ...(step.reason ? { reason: normalizeTagValue(step.reason) } : {}),\n ...(step.attributes\n ? {\n attributes: copyRecord(step.attributes, {\n maxKeys: MAX_ATTRIBUTE_KEYS,\n normalizeKeys: true,\n }),\n }\n : {}),\n };\n}\n\n/** Default-sink payload: normalized keys/names, capped maps, no unsafe keys. */\nexport function sanitizeJourneyEvent(event: JourneyEvent): JourneyEvent {\n const j = event.journey;\n const expected = j.expected?.map(name => normalizeTagValue(name)).filter(name => name !== '');\n const tags = j.tags\n ? copyRecord(j.tags, { maxKeys: MAX_TAG_KEYS, normalizeKeys: true })\n : undefined;\n const tagKeys = tags ? Object.keys(tags) : [];\n const steps = j.steps.map(sanitizeStep);\n // Prefer recently started steps at the cap; failedRequest preserves the scoring request separately.\n let requestBudget = MAX_JOURNEY_CORRELATED_REQUESTS;\n for (let index = steps.length - 1; index >= 0; index--) {\n const step = steps[index];\n if (!step.requests) {\n continue;\n }\n if (step.requests.length > requestBudget) {\n step.requestsTruncated = true;\n if (requestBudget === 0) {\n delete step.requests;\n } else {\n step.requests = step.requests.slice(-requestBudget);\n }\n }\n requestBudget -= step.requests?.length ?? 0;\n }\n const failedRequest =\n j.outcome === 'bad' && j.failedRequest\n ? sanitizeRequestCorrelation(j.failedRequest)\n : undefined;\n const sanitized: JourneyEvent = {\n journey: {\n name: normalizeTagValue(j.name),\n team: normalizeTagValue(j.team),\n group: normalizeTagValue(j.group),\n service: normalizeTagValue(j.service),\n outcome: j.outcome,\n ...(failedRequest ? { failedRequest } : {}),\n ...(j.reason ? { reason: normalizeTagValue(j.reason) } : {}),\n durationMs: j.durationMs,\n steps,\n ...(expected?.length ? { expected } : {}),\n ...(tagKeys.length ? { tags } : {}),\n },\n };\n Object.defineProperty(sanitized, SANITIZED_EVENT, {\n value: true,\n enumerable: false,\n configurable: false,\n });\n return sanitized;\n}\n\n/** True when payload already passed through sanitizeJourneyEvent. */\nexport function isSanitizedJourneyEvent(event: JourneyEvent): boolean {\n return (event as unknown as Record<PropertyKey, unknown>)[SANITIZED_EVENT] === true;\n}\n"],"names":["isUnsafeKey","MAX_ATTRIBUTE_KEYS","MAX_TAG_KEYS","MAX_TAG_VALUE_LEN","MAX_CORRELATED_REQUESTS","MAX_JOURNEY_CORRELATED_REQUESTS","sanitizeRequestCorrelation","SANITIZED_EVENT","Symbol","for","normalizeTagValue","value","toLowerCase","replace","slice","emptyRecord","Object","create","asTagValue","undefined","copyRecord","src","options","out","normalizeKeys","normalizeStringValues","key","keys","destKey","raw","prototype","hasOwnProperty","call","length","maxKeys","assignRecord","target","room","exists","setSafeAttribute","attributes","next","sanitizeStep","step","requests","rawRequests","requestsTruncated","rest","Array","isArray","map","filter","request","name","reason","sanitizeJourneyEvent","event","j","journey","expected","tags","tagKeys","steps","requestBudget","index","failedRequest","outcome","sanitized","team","group","service","durationMs","defineProperty","enumerable","configurable","isSanitizedJourneyEvent"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"request-correlation.d.ts","sourceRoot":"","sources":["../../src/integrations/request-correlation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAazD,iFAAiF;AACjF,wBAAgB,yBAAyB,CACrC,MAAM,EAAE,kBAAkB,GAC3B,mBAAmB,GAAG,SAAS,CAsEjC"}
1
+ {"version":3,"file":"request-correlation.d.ts","sourceRoot":"","sources":["../../src/integrations/request-correlation.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAYzD,iFAAiF;AACjF,wBAAgB,yBAAyB,CACrC,MAAM,EAAE,kBAAkB,GAC3B,mBAAmB,GAAG,SAAS,CAsEjC"}
@@ -1,6 +1,5 @@
1
- import { MAX_CORRELATED_REQUESTS, sanitizeRequestCorrelation } from '../core/request-correlation';
1
+ import { isMonolithLogOrigin, MAX_CORRELATED_REQUESTS, sanitizeRequestCorrelation } from '../core/request-correlation';
2
2
  import { canRouteHttpToJourney, resolveJourneyEngine } from '../core/runtime';
3
- const MONOLITH_ORIGIN = 'https://go.servicetitan.com';
4
3
  const capturedResponses = new WeakMap();
5
4
  /** Observation only. Safe to run before jQuery invokes application callbacks. */ export function captureRequestCorrelation(report) {
6
5
  try {
@@ -14,7 +13,7 @@ const capturedResponses = new WeakMap();
14
13
  const pageUrl = (_globalThis_location = globalThis.location) === null || _globalThis_location === void 0 ? void 0 : _globalThis_location.href;
15
14
  const base = report.baseURL ? new URL(report.baseURL, pageUrl).href : pageUrl;
16
15
  const url = new URL(report.url, base);
17
- if (url.origin !== MONOLITH_ORIGIN) {
16
+ if (!isMonolithLogOrigin(url.href)) {
18
17
  return;
19
18
  }
20
19
  const response = report.response;
@@ -27,7 +26,7 @@ const capturedResponses = new WeakMap();
27
26
  return ((_step_requests = step.requests) === null || _step_requests === void 0 ? void 0 : _step_requests.includes(captured)) ? captured : undefined;
28
27
  }
29
28
  const finalUrl = response.url || response.responseURL || ((_response_request = response.request) === null || _response_request === void 0 ? void 0 : _response_request.responseURL);
30
- if (finalUrl && new URL(finalUrl).origin !== MONOLITH_ORIGIN) {
29
+ if (finalUrl && !isMonolithLogOrigin(finalUrl)) {
31
30
  return;
32
31
  }
33
32
  const rayId = typeof response.getResponseHeader === 'function' ? response.getResponseHeader('cf-ray') : typeof ((_response_headers = response.headers) === null || _response_headers === void 0 ? void 0 : _response_headers.get) === 'function' ? response.headers.get('cf-ray') : (_response_headers1 = response.headers) === null || _response_headers1 === void 0 ? void 0 : _response_headers1['cf-ray'];