@braidlabs/gateway 0.6.0 → 0.7.1

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.
@@ -99,6 +99,8 @@ export function singleFlightKey(request, url, extraHeaders = []) {
99
99
  // chain: if a registry loops a fragment back through this gateway, the inner request would
100
100
  // otherwise wait on the outer one — itself — until the timeout.
101
101
  request.headers.get(BRAID_VIA_HEADER) ?? '',
102
+ // Context an endpoint may route or render on — a tenant, say (see `GatewayOptions.baggage`).
103
+ request.headers.get('baggage') ?? '',
102
104
  // Sorted, so the key does not depend on the order a host happened to build its object in.
103
105
  ...[...extraHeaders].sort().map((name) => `${name}=${request.headers.get(name) ?? ''}`),
104
106
  ].join('\n');
@@ -1 +1 @@
1
- {"version":3,"file":"single-flight.js","sourceRoot":"","sources":["../../../../libs/braid-gateway/src/single-flight.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"single-flight.js","sourceRoot":"","sources":["../../../../libs/braid-gateway/src/single-flight.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,11 @@ export interface FragmentFetchEvent {
29
29
  outcome: 'ok' | 'error' | 'timeout' | 'shed';
30
30
  /** Absent when the fetch threw before a response existed. */
31
31
  status?: number;
32
+ /**
33
+ * `true` when this fetch joined an identical one already in flight (see `singleFlight`): its
34
+ * outcome is that fetch's, and no request of its own reached the endpoint.
35
+ */
36
+ coalesced?: boolean;
32
37
  durationMs: number;
33
38
  at: number;
34
39
  }
@@ -76,6 +81,31 @@ export type RegistryEvent = {
76
81
  error: string;
77
82
  at: number;
78
83
  };
84
+ /** A fragment fetch about to start, as {@link TelemetryOptions.onFragmentFetch} is told of it. */
85
+ export interface FragmentFetchStart {
86
+ fragmentId: string;
87
+ phase: FragmentFetchEvent['phase'];
88
+ method: string;
89
+ }
90
+ /** What a fetch hook hands back: headers for the fragment request, and a callback for its end. */
91
+ export interface FragmentFetchHooks {
92
+ /**
93
+ * Set on the fragment request — trace context, say — over anything already there; `null` removes
94
+ * one. A `traceparent` set or removed takes the caller's `tracestate` with it.
95
+ */
96
+ headers?: Record<string, string | null>;
97
+ /**
98
+ * Runs the endpoint fetch, so a tracing hook can make its span the active one there and an
99
+ * HTTP-client instrumentation's span nests under it. Must call `fetch` once and return its result.
100
+ * Not called for a fetch that joins one already in flight.
101
+ */
102
+ run?: <T>(fetch: () => T) => T;
103
+ /**
104
+ * Called once with the same event `on` receives, and the error when the fetch threw — even after
105
+ * a throwing hook has muted telemetry, so whatever it opened is closed.
106
+ */
107
+ end?: (event: FragmentFetchEvent, error?: unknown) => void;
108
+ }
79
109
  export interface TelemetryOptions {
80
110
  /**
81
111
  * Called for every event.
@@ -85,7 +115,15 @@ export interface TelemetryOptions {
85
115
  * one *is* wrapped — a broken telemetry sink must not fail the request it is describing, because
86
116
  * the whole point is to be safe to leave on in production.
87
117
  */
88
- on: (event: TelemetryEvent) => void;
118
+ on?: (event: TelemetryEvent) => void;
119
+ /**
120
+ * Called as each fragment fetch starts — after the credential rules and `additionalHeaders`,
121
+ * before the circuit breaker — for a hook that needs the start, not just the outcome: a tracing
122
+ * integration opening a span and propagating its context (see `@braidlabs/otel`).
123
+ *
124
+ * On the request path, so it must be cheap, and muted like `on` if it throws.
125
+ */
126
+ onFragmentFetch?: (fetch: FragmentFetchStart) => FragmentFetchHooks | void;
89
127
  /**
90
128
  * Collect web vitals in the browser and report them here. Off by default.
91
129
  *
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../../../libs/braid-gateway/src/telemetry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../../../libs/braid-gateway/src/telemetry.ts"],"names":[],"mappings":"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"}