@servicetitan/journey 1.0.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 +7 -0
- package/dist/__mocks__/test-runtime.d.ts +16 -0
- package/dist/__mocks__/test-runtime.d.ts.map +1 -0
- package/dist/__tests__/ambient.test.d.ts +2 -0
- package/dist/__tests__/ambient.test.d.ts.map +1 -0
- package/dist/__tests__/axios.test.d.ts +2 -0
- package/dist/__tests__/axios.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/context.test.d.ts +2 -0
- package/dist/__tests__/context.test.d.ts.map +1 -0
- package/dist/__tests__/datadog.test.d.ts +2 -0
- package/dist/__tests__/datadog.test.d.ts.map +1 -0
- package/dist/__tests__/define-journey.test.d.ts +2 -0
- package/dist/__tests__/define-journey.test.d.ts.map +1 -0
- package/dist/__tests__/expose-app-journey.test.d.ts +2 -0
- package/dist/__tests__/expose-app-journey.test.d.ts.map +1 -0
- package/dist/__tests__/fetch.test.d.ts +2 -0
- package/dist/__tests__/fetch.test.d.ts.map +1 -0
- package/dist/__tests__/jquery.test.d.ts +2 -0
- package/dist/__tests__/jquery.test.d.ts.map +1 -0
- package/dist/__tests__/registry.test.d.ts +2 -0
- package/dist/__tests__/registry.test.d.ts.map +1 -0
- package/dist/__tests__/request-key.test.d.ts +2 -0
- package/dist/__tests__/request-key.test.d.ts.map +1 -0
- package/dist/__tests__/requests.test.d.ts +2 -0
- package/dist/__tests__/requests.test.d.ts.map +1 -0
- package/dist/__tests__/runtime.test.d.ts +2 -0
- package/dist/__tests__/runtime.test.d.ts.map +1 -0
- package/dist/__tests__/scope.test.d.ts +2 -0
- package/dist/__tests__/scope.test.d.ts.map +1 -0
- package/dist/__tests__/sinks.test.d.ts +2 -0
- package/dist/__tests__/sinks.test.d.ts.map +1 -0
- package/dist/__tests__/step.test.d.ts +2 -0
- package/dist/__tests__/step.test.d.ts.map +1 -0
- package/dist/__tests__/timeouts.test.d.ts +2 -0
- package/dist/__tests__/timeouts.test.d.ts.map +1 -0
- package/dist/config.d.ts +42 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +46 -0
- package/dist/config.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +5 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/registry.d.ts +50 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +102 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/runtime.d.ts +51 -0
- package/dist/core/runtime.d.ts.map +1 -0
- package/dist/core/runtime.js +401 -0
- package/dist/core/runtime.js.map +1 -0
- package/dist/core/step-tag.d.ts +16 -0
- package/dist/core/step-tag.d.ts.map +1 -0
- package/dist/core/step-tag.js +35 -0
- package/dist/core/step-tag.js.map +1 -0
- package/dist/core/types.d.ts +143 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/endpoint-policy.d.ts +29 -0
- package/dist/endpoint-policy.d.ts.map +1 -0
- package/dist/endpoint-policy.js +39 -0
- package/dist/endpoint-policy.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/axios.d.ts +23 -0
- package/dist/integrations/axios.d.ts.map +1 -0
- package/dist/integrations/axios.js +51 -0
- package/dist/integrations/axios.js.map +1 -0
- package/dist/integrations/fetch.d.ts +21 -0
- package/dist/integrations/fetch.d.ts.map +1 -0
- package/dist/integrations/fetch.js +63 -0
- package/dist/integrations/fetch.js.map +1 -0
- package/dist/integrations/jquery/index.d.ts +22 -0
- package/dist/integrations/jquery/index.d.ts.map +1 -0
- package/dist/integrations/jquery/index.js +27 -0
- package/dist/integrations/jquery/index.js.map +1 -0
- package/dist/integrations/jquery/instrument.d.ts +18 -0
- package/dist/integrations/jquery/instrument.d.ts.map +1 -0
- package/dist/integrations/jquery/instrument.js +44 -0
- package/dist/integrations/jquery/instrument.js.map +1 -0
- package/dist/integrations/react/context.d.ts +6 -0
- package/dist/integrations/react/context.d.ts.map +1 -0
- package/dist/integrations/react/context.js +14 -0
- package/dist/integrations/react/context.js.map +1 -0
- package/dist/integrations/react/scope.d.ts +13 -0
- package/dist/integrations/react/scope.d.ts.map +1 -0
- package/dist/integrations/react/scope.js +27 -0
- package/dist/integrations/react/scope.js.map +1 -0
- package/dist/integrations/request-key.d.ts +17 -0
- package/dist/integrations/request-key.d.ts.map +1 -0
- package/dist/integrations/request-key.js +39 -0
- package/dist/integrations/request-key.js.map +1 -0
- package/dist/sinks/datadog.d.ts +6 -0
- package/dist/sinks/datadog.d.ts.map +1 -0
- package/dist/sinks/datadog.js +64 -0
- package/dist/sinks/datadog.js.map +1 -0
- package/package.json +44 -0
- package/src/__mocks__/test-runtime.ts +37 -0
- package/src/__tests__/ambient.test.ts +101 -0
- package/src/__tests__/axios.test.ts +365 -0
- package/src/__tests__/config.test.ts +261 -0
- package/src/__tests__/context.test.tsx +84 -0
- package/src/__tests__/datadog.test.ts +160 -0
- package/src/__tests__/define-journey.test.ts +176 -0
- package/src/__tests__/expose-app-journey.test.ts +149 -0
- package/src/__tests__/fetch.test.ts +264 -0
- package/src/__tests__/jquery.test.ts +327 -0
- package/src/__tests__/registry.test.ts +265 -0
- package/src/__tests__/request-key.test.ts +81 -0
- package/src/__tests__/requests.test.ts +337 -0
- package/src/__tests__/runtime.test.ts +273 -0
- package/src/__tests__/scope.test.tsx +128 -0
- package/src/__tests__/sinks.test.ts +99 -0
- package/src/__tests__/step.test.ts +305 -0
- package/src/__tests__/timeouts.test.ts +226 -0
- package/src/config.ts +87 -0
- package/src/core/index.ts +39 -0
- package/src/core/registry.ts +162 -0
- package/src/core/runtime.ts +489 -0
- package/src/core/step-tag.ts +24 -0
- package/src/core/types.ts +160 -0
- package/src/endpoint-policy.ts +66 -0
- package/src/index.ts +51 -0
- package/src/integrations/axios.ts +85 -0
- package/src/integrations/fetch.ts +97 -0
- package/src/integrations/jquery/index.ts +62 -0
- package/src/integrations/jquery/instrument.ts +84 -0
- package/src/integrations/react/context.ts +17 -0
- package/src/integrations/react/scope.tsx +32 -0
- package/src/integrations/request-key.ts +46 -0
- package/src/sinks/datadog.ts +71 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timing metadata stamped onto a request config so the response handler can attribute
|
|
3
|
+
* and measure the round trip. Intersect with your transport's config type.
|
|
4
|
+
*
|
|
5
|
+
* `journeyStep` is a JourneyStepTag (from `step.tag()` or ambient instrumentation)
|
|
6
|
+
* or, historically, a raw StepRecord. Adapters unwrap via `resolveJourneyStep`.
|
|
7
|
+
*/
|
|
8
|
+
export interface JourneyTimedMeta {
|
|
9
|
+
journeyStart?: number;
|
|
10
|
+
journeyStep?: unknown;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function pageOrigin(): string {
|
|
14
|
+
try {
|
|
15
|
+
return globalThis.location?.origin ?? '';
|
|
16
|
+
} catch {
|
|
17
|
+
return '';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Endpoint key for timeout / ignore lookup: PATH for same-origin (vs instance baseURL),
|
|
23
|
+
* or "host/path" for cross-domain.
|
|
24
|
+
*/
|
|
25
|
+
export function requestKey(
|
|
26
|
+
url: string | undefined,
|
|
27
|
+
configBaseURL: string | undefined,
|
|
28
|
+
instanceBaseURL: string | undefined
|
|
29
|
+
): string {
|
|
30
|
+
const origin = pageOrigin();
|
|
31
|
+
const base = configBaseURL ?? instanceBaseURL ?? origin;
|
|
32
|
+
let abs: URL;
|
|
33
|
+
try {
|
|
34
|
+
abs = new URL(url ?? '', base || undefined);
|
|
35
|
+
} catch {
|
|
36
|
+
return url ?? '';
|
|
37
|
+
}
|
|
38
|
+
let homeOrigin: string;
|
|
39
|
+
try {
|
|
40
|
+
const homeBase = instanceBaseURL ?? origin;
|
|
41
|
+
homeOrigin = new URL(homeBase || 'http://localhost').origin;
|
|
42
|
+
} catch {
|
|
43
|
+
homeOrigin = origin;
|
|
44
|
+
}
|
|
45
|
+
return abs.origin === homeOrigin ? abs.pathname : abs.host + abs.pathname;
|
|
46
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { datadogRum } from '@datadog/browser-rum';
|
|
2
|
+
|
|
3
|
+
import type { JourneyEvent, JourneyStepEvent, TagValue } from '../core/types';
|
|
4
|
+
|
|
5
|
+
const JOURNEY_ACTION = 'user_journey';
|
|
6
|
+
|
|
7
|
+
const RUM_GLOBAL_KEY = '__stJourneyRum';
|
|
8
|
+
|
|
9
|
+
/** Host-only: publish the initialized RUM instance so MFE bundles share the same session. */
|
|
10
|
+
export function setJourneyRum(rum: unknown): void {
|
|
11
|
+
(globalThis as Record<string, unknown>)[RUM_GLOBAL_KEY] = rum;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function resolveRum(): typeof datadogRum {
|
|
15
|
+
const shared = (globalThis as Record<string, unknown>)[RUM_GLOBAL_KEY];
|
|
16
|
+
return (shared as typeof datadogRum | undefined) ?? datadogRum;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Match Datadog metric-tag value rules so RUM attributes join derived SLO tags.
|
|
20
|
+
const MAX_TAG_VALUE_LEN = 200;
|
|
21
|
+
function normalizeTagValue(value: string): string {
|
|
22
|
+
return value
|
|
23
|
+
.toLowerCase()
|
|
24
|
+
.replace(/[^a-z0-9_\-:./]/g, '_')
|
|
25
|
+
.replace(/_+/g, '_')
|
|
26
|
+
.slice(0, MAX_TAG_VALUE_LEN)
|
|
27
|
+
.replace(/_+$/, '');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function normalizeTags(tags: Record<string, TagValue>): Record<string, TagValue> {
|
|
31
|
+
const out: Record<string, TagValue> = {};
|
|
32
|
+
for (const [key, value] of Object.entries(tags)) {
|
|
33
|
+
out[key] = typeof value === 'string' ? normalizeTagValue(value) : value;
|
|
34
|
+
}
|
|
35
|
+
return out;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function toDatadogStep(step: JourneyStepEvent) {
|
|
39
|
+
/* eslint-disable @typescript-eslint/naming-convention -- Datadog RUM wire format (snake_case) */
|
|
40
|
+
return {
|
|
41
|
+
name: step.name,
|
|
42
|
+
start_ms: step.startMs,
|
|
43
|
+
duration_ms: step.durationMs,
|
|
44
|
+
outcome: step.outcome,
|
|
45
|
+
...(step.reason ? { reason: step.reason } : {}),
|
|
46
|
+
...(step.httpStatus !== undefined ? { http_status: step.httpStatus } : {}),
|
|
47
|
+
...(step.attributes ? { attributes: step.attributes } : {}),
|
|
48
|
+
};
|
|
49
|
+
/* eslint-enable @typescript-eslint/naming-convention */
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Ship one terminal journey as a RUM custom action (`user_journey`). */
|
|
53
|
+
export function sendToDatadog(payload: JourneyEvent): void {
|
|
54
|
+
const j = payload.journey;
|
|
55
|
+
/* eslint-disable @typescript-eslint/naming-convention -- Datadog RUM wire format (snake_case) */
|
|
56
|
+
resolveRum().addAction(JOURNEY_ACTION, {
|
|
57
|
+
journey: {
|
|
58
|
+
name: normalizeTagValue(j.name),
|
|
59
|
+
team: normalizeTagValue(j.team),
|
|
60
|
+
group: normalizeTagValue(j.group),
|
|
61
|
+
service: normalizeTagValue(j.service),
|
|
62
|
+
outcome: j.outcome,
|
|
63
|
+
...(j.reason ? { reason: normalizeTagValue(j.reason) } : {}),
|
|
64
|
+
duration_ms: j.durationMs,
|
|
65
|
+
steps: j.steps.map(toDatadogStep),
|
|
66
|
+
...(j.expected ? { expected: j.expected } : {}),
|
|
67
|
+
...(j.tags ? { tags: normalizeTags(j.tags) } : {}),
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
/* eslint-enable @typescript-eslint/naming-convention */
|
|
71
|
+
}
|