@stainlessdev/xray-emitter 0.2.0 → 0.3.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 +1 -2
- package/dist/{chunk-2HW4AEKB.cjs → chunk-55YD27PV.cjs} +28 -28
- package/dist/chunk-55YD27PV.cjs.map +1 -0
- package/dist/{chunk-YVMMCTXW.js → chunk-7KT6EPVZ.js} +1 -1
- package/dist/{chunk-YVMMCTXW.js.map → chunk-7KT6EPVZ.js.map} +1 -1
- package/dist/{chunk-GNSXLLEC.cjs → chunk-CPHFCOA5.cjs} +9 -9
- package/dist/{chunk-GNSXLLEC.cjs.map → chunk-CPHFCOA5.cjs.map} +1 -1
- package/dist/{chunk-JKW6E4L3.cjs → chunk-DNBARLGB.cjs} +1 -1
- package/dist/{chunk-JKW6E4L3.cjs.map → chunk-DNBARLGB.cjs.map} +1 -1
- package/dist/{chunk-ZP5OEA4I.js → chunk-DV3MVQBB.js} +4 -4
- package/dist/chunk-DV3MVQBB.js.map +1 -0
- package/dist/{chunk-WTHVUHGI.js → chunk-FGXXKIF7.js} +4 -4
- package/dist/chunk-FGXXKIF7.js.map +1 -0
- package/dist/{chunk-TSCMZ5TV.js → chunk-GYXI3DWB.js} +35 -3
- package/dist/chunk-GYXI3DWB.js.map +1 -0
- package/dist/{chunk-6UH43LVD.js → chunk-NTIUR3OC.js} +2 -2
- package/dist/{chunk-DBI3HXNR.cjs → chunk-SUVCVINA.cjs} +47 -47
- package/dist/chunk-SUVCVINA.cjs.map +1 -0
- package/dist/{chunk-XO6YWDFL.cjs → chunk-UJWD5CFA.cjs} +53 -21
- package/dist/chunk-UJWD5CFA.cjs.map +1 -0
- package/dist/effect.cjs +19 -19
- package/dist/effect.cjs.map +1 -1
- package/dist/effect.d.cts +30 -3
- package/dist/effect.d.ts +30 -3
- package/dist/effect.js +4 -4
- package/dist/effect.js.map +1 -1
- package/dist/emitter-Bi_m_w5h.d.cts +10 -0
- package/dist/emitter-Dy7bRGTq.d.ts +10 -0
- package/dist/express.cjs +7 -7
- package/dist/express.cjs.map +1 -1
- package/dist/express.d.cts +9 -2
- package/dist/express.d.ts +9 -2
- package/dist/express.js +4 -4
- package/dist/express.js.map +1 -1
- package/dist/fastify.cjs +10 -10
- package/dist/fastify.cjs.map +1 -1
- package/dist/fastify.d.cts +9 -2
- package/dist/fastify.d.ts +9 -2
- package/dist/fastify.js +4 -4
- package/dist/fastify.js.map +1 -1
- package/dist/fetch.cjs +5 -5
- package/dist/fetch.d.cts +39 -2
- package/dist/fetch.d.ts +39 -2
- package/dist/fetch.js +4 -4
- package/dist/hono.cjs +9 -9
- package/dist/hono.cjs.map +1 -1
- package/dist/hono.d.cts +15 -3
- package/dist/hono.d.ts +15 -3
- package/dist/hono.js +4 -4
- package/dist/hono.js.map +1 -1
- package/dist/index.cjs +3 -3
- package/dist/index.d.cts +8 -2
- package/dist/index.d.ts +8 -2
- package/dist/index.js +2 -2
- package/dist/internal.cjs +3 -3
- package/dist/internal.d.cts +1 -1
- package/dist/internal.d.ts +1 -1
- package/dist/internal.js +2 -2
- package/dist/next.cjs +7 -7
- package/dist/next.cjs.map +1 -1
- package/dist/next.d.cts +9 -3
- package/dist/next.d.ts +9 -3
- package/dist/next.js +4 -4
- package/dist/next.js.map +1 -1
- package/dist/node.cjs +5 -5
- package/dist/node.d.cts +42 -1
- package/dist/node.d.ts +42 -1
- package/dist/node.js +4 -4
- package/dist/remix.cjs +7 -7
- package/dist/remix.cjs.map +1 -1
- package/dist/remix.d.cts +10 -3
- package/dist/remix.d.ts +10 -3
- package/dist/remix.js +4 -4
- package/dist/remix.js.map +1 -1
- package/dist/types-BrKvhHbn.d.cts +446 -0
- package/dist/types-BrKvhHbn.d.ts +446 -0
- package/package.json +1 -1
- package/dist/chunk-2HW4AEKB.cjs.map +0 -1
- package/dist/chunk-DBI3HXNR.cjs.map +0 -1
- package/dist/chunk-TSCMZ5TV.js.map +0 -1
- package/dist/chunk-WTHVUHGI.js.map +0 -1
- package/dist/chunk-XO6YWDFL.cjs.map +0 -1
- package/dist/chunk-ZP5OEA4I.js.map +0 -1
- package/dist/emitter-BqfrGIod.d.cts +0 -5
- package/dist/emitter-CScYhwGA.d.ts +0 -5
- package/dist/types-Z1nirh-F.d.cts +0 -149
- package/dist/types-Z1nirh-F.d.ts +0 -149
- /package/dist/{chunk-6UH43LVD.js.map → chunk-NTIUR3OC.js.map} +0 -0
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
import * as _opentelemetry_sdk_trace_base from '@opentelemetry/sdk-trace-base';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Exporter settings used by the OTLP trace exporter.
|
|
5
|
+
*/
|
|
6
|
+
interface ExporterConfig {
|
|
7
|
+
/**
|
|
8
|
+
* OTLP trace endpoint URL. `/v1/traces` is appended if missing.
|
|
9
|
+
*/
|
|
10
|
+
endpointUrl: string;
|
|
11
|
+
/**
|
|
12
|
+
* Additional OTLP exporter headers (for example `Authorization`).
|
|
13
|
+
*/
|
|
14
|
+
headers?: Record<string, string>;
|
|
15
|
+
/**
|
|
16
|
+
* Export timeout in milliseconds.
|
|
17
|
+
*/
|
|
18
|
+
timeoutMs: number;
|
|
19
|
+
/**
|
|
20
|
+
* Span processor mode.
|
|
21
|
+
*
|
|
22
|
+
* Use `batch` (default) for lower overhead in long-lived services.
|
|
23
|
+
* Use `simple` to export each span immediately (useful for tests and
|
|
24
|
+
* short-lived runtimes).
|
|
25
|
+
*/
|
|
26
|
+
spanProcessor: 'simple' | 'batch';
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Request/response capture settings.
|
|
30
|
+
*/
|
|
31
|
+
interface CaptureConfig {
|
|
32
|
+
/**
|
|
33
|
+
* Include sanitized request headers in logs/spans.
|
|
34
|
+
*/
|
|
35
|
+
requestHeaders: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Include sanitized response headers in logs/spans.
|
|
38
|
+
*/
|
|
39
|
+
responseHeaders: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Request body capture mode.
|
|
42
|
+
*
|
|
43
|
+
* `none` disables capture, `text` records UTF-8 text, and `base64` preserves
|
|
44
|
+
* binary payloads safely.
|
|
45
|
+
*/
|
|
46
|
+
requestBody: 'none' | 'text' | 'base64';
|
|
47
|
+
/**
|
|
48
|
+
* Response body capture mode.
|
|
49
|
+
*
|
|
50
|
+
* `none` disables capture, `text` records UTF-8 text, and `base64` preserves
|
|
51
|
+
* binary payloads safely.
|
|
52
|
+
*/
|
|
53
|
+
responseBody: 'none' | 'text' | 'base64';
|
|
54
|
+
/**
|
|
55
|
+
* Maximum captured bytes per request/response body before truncation.
|
|
56
|
+
*/
|
|
57
|
+
maxBodyBytes: number;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Redaction settings for logs and captured payloads.
|
|
61
|
+
*/
|
|
62
|
+
interface RedactionConfig {
|
|
63
|
+
/**
|
|
64
|
+
* Header names to redact (case-insensitive).
|
|
65
|
+
*/
|
|
66
|
+
headers: string[];
|
|
67
|
+
/**
|
|
68
|
+
* Query parameter names to redact (case-insensitive).
|
|
69
|
+
*/
|
|
70
|
+
queryParams: string[];
|
|
71
|
+
/**
|
|
72
|
+
* JSON paths to redact in captured JSON bodies.
|
|
73
|
+
*/
|
|
74
|
+
bodyJsonPaths: string[];
|
|
75
|
+
/**
|
|
76
|
+
* Replacement value used for redacted data.
|
|
77
|
+
*/
|
|
78
|
+
replacement: string;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Request ID extraction and propagation settings.
|
|
82
|
+
*/
|
|
83
|
+
interface RequestIdConfig {
|
|
84
|
+
/**
|
|
85
|
+
* Response header name to read request IDs from. This is normalized to
|
|
86
|
+
* lowercase during configuration.
|
|
87
|
+
*/
|
|
88
|
+
header: string;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Route normalization settings.
|
|
92
|
+
*/
|
|
93
|
+
interface RouteConfig {
|
|
94
|
+
/**
|
|
95
|
+
* When true, normalize route patterns before emitting logs.
|
|
96
|
+
*/
|
|
97
|
+
normalize: boolean;
|
|
98
|
+
/**
|
|
99
|
+
* Optional custom normalizer. Defaults to X-ray's built-in normalizer.
|
|
100
|
+
*/
|
|
101
|
+
normalizer?: (path: string) => string;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Core emitter configuration.
|
|
105
|
+
*/
|
|
106
|
+
interface XrayConfig {
|
|
107
|
+
/**
|
|
108
|
+
* Logical service name for all emitted request logs.
|
|
109
|
+
*/
|
|
110
|
+
serviceName: string;
|
|
111
|
+
/**
|
|
112
|
+
* Optional deployment environment label.
|
|
113
|
+
*/
|
|
114
|
+
environment?: string;
|
|
115
|
+
/**
|
|
116
|
+
* Optional service version label.
|
|
117
|
+
*/
|
|
118
|
+
version?: string;
|
|
119
|
+
/**
|
|
120
|
+
* Logger for internal X-ray diagnostics.
|
|
121
|
+
*/
|
|
122
|
+
logger?: Logger;
|
|
123
|
+
/**
|
|
124
|
+
* Minimum log level for internal diagnostics.
|
|
125
|
+
*/
|
|
126
|
+
logLevel?: LogLevel;
|
|
127
|
+
/**
|
|
128
|
+
* OTLP endpoint URL. Falls back to `STAINLESS_XRAY_ENDPOINT_URL`.
|
|
129
|
+
*/
|
|
130
|
+
endpointUrl?: string;
|
|
131
|
+
/**
|
|
132
|
+
* Exporter overrides.
|
|
133
|
+
*/
|
|
134
|
+
exporter?: Partial<ExporterConfig>;
|
|
135
|
+
/**
|
|
136
|
+
* Capture overrides.
|
|
137
|
+
*/
|
|
138
|
+
capture?: Partial<CaptureConfig>;
|
|
139
|
+
/**
|
|
140
|
+
* Redaction overrides.
|
|
141
|
+
*/
|
|
142
|
+
redaction?: Partial<RedactionConfig>;
|
|
143
|
+
/**
|
|
144
|
+
* Request ID resolution settings. The header is read from response headers at
|
|
145
|
+
* the end of the request.
|
|
146
|
+
*/
|
|
147
|
+
requestId?: Partial<RequestIdConfig>;
|
|
148
|
+
/**
|
|
149
|
+
* Route normalization overrides.
|
|
150
|
+
*/
|
|
151
|
+
route?: Partial<RouteConfig>;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Runtime config accepted by framework/node/fetch entrypoints.
|
|
155
|
+
*/
|
|
156
|
+
type XrayRuntimeConfig = Omit<XrayConfig, 'exporter'> & {
|
|
157
|
+
exporter?: Partial<ExporterConfig> & {
|
|
158
|
+
/**
|
|
159
|
+
* Custom exporter instance. When provided, endpoint/header options are ignored.
|
|
160
|
+
*/
|
|
161
|
+
instance?: _opentelemetry_sdk_trace_base.SpanExporter;
|
|
162
|
+
};
|
|
163
|
+
};
|
|
164
|
+
/**
|
|
165
|
+
* Fully-resolved configuration returned by `normalizeConfig`.
|
|
166
|
+
*/
|
|
167
|
+
interface ResolvedXrayConfig {
|
|
168
|
+
serviceName: string;
|
|
169
|
+
environment?: string;
|
|
170
|
+
version?: string;
|
|
171
|
+
logger: Logger;
|
|
172
|
+
logLevel: LogLevel;
|
|
173
|
+
exporter: ExporterConfig;
|
|
174
|
+
capture: CaptureConfig;
|
|
175
|
+
redaction: RedactionConfig;
|
|
176
|
+
requestId: RequestIdConfig;
|
|
177
|
+
route: RouteConfig;
|
|
178
|
+
}
|
|
179
|
+
declare class XrayConfigError extends Error {
|
|
180
|
+
code: 'INVALID_CONFIG' | 'INVALID_REDACTION';
|
|
181
|
+
constructor(code: XrayConfigError['code'], message: string);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Normalize and validate user configuration.
|
|
185
|
+
*
|
|
186
|
+
* Applies defaults, validates required fields, and resolves environment
|
|
187
|
+
* fallbacks such as `STAINLESS_XRAY_ENDPOINT_URL`.
|
|
188
|
+
*/
|
|
189
|
+
declare function normalizeConfig(config: XrayConfig): ResolvedXrayConfig;
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Attribute value types accepted by OpenTelemetry span attributes.
|
|
193
|
+
*/
|
|
194
|
+
type AttributeValue = string | number | boolean | string[] | number[] | boolean[];
|
|
195
|
+
/**
|
|
196
|
+
* Logging levels used by the internal X-ray logger.
|
|
197
|
+
*/
|
|
198
|
+
type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
199
|
+
/**
|
|
200
|
+
* Logger contract used by X-ray for internal diagnostics.
|
|
201
|
+
*/
|
|
202
|
+
interface Logger {
|
|
203
|
+
debug(msg: string, fields?: Record<string, unknown>): void;
|
|
204
|
+
info(msg: string, fields?: Record<string, unknown>): void;
|
|
205
|
+
warn(msg: string, fields?: Record<string, unknown>): void;
|
|
206
|
+
error(msg: string, fields?: Record<string, unknown>): void;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Captured request/response body payload details.
|
|
210
|
+
*/
|
|
211
|
+
interface CapturedBody {
|
|
212
|
+
/**
|
|
213
|
+
* Total body size before truncation.
|
|
214
|
+
*/
|
|
215
|
+
bytes: number;
|
|
216
|
+
/**
|
|
217
|
+
* Encoding used for `value`.
|
|
218
|
+
*/
|
|
219
|
+
encoding: 'utf8' | 'base64';
|
|
220
|
+
/**
|
|
221
|
+
* True when `value` was truncated due to `capture.maxBodyBytes`.
|
|
222
|
+
*/
|
|
223
|
+
truncated: boolean;
|
|
224
|
+
/**
|
|
225
|
+
* Captured body payload. Omitted when there is no body.
|
|
226
|
+
*/
|
|
227
|
+
value?: string;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Final emitted request log record.
|
|
231
|
+
*/
|
|
232
|
+
interface RequestLog {
|
|
233
|
+
/**
|
|
234
|
+
* Request identifier for this request.
|
|
235
|
+
*
|
|
236
|
+
* Written to span attributes and, where supported by the runtime/framework
|
|
237
|
+
* adapter, propagated to response headers.
|
|
238
|
+
*/
|
|
239
|
+
requestId: string;
|
|
240
|
+
/**
|
|
241
|
+
* OpenTelemetry trace ID for this request span.
|
|
242
|
+
*/
|
|
243
|
+
traceId?: string;
|
|
244
|
+
/**
|
|
245
|
+
* OpenTelemetry span ID for this request span.
|
|
246
|
+
*/
|
|
247
|
+
spanId?: string;
|
|
248
|
+
/**
|
|
249
|
+
* Service name from configuration.
|
|
250
|
+
*/
|
|
251
|
+
serviceName: string;
|
|
252
|
+
/**
|
|
253
|
+
* HTTP method recorded at request start (for example `GET` or `POST`).
|
|
254
|
+
*/
|
|
255
|
+
method: string;
|
|
256
|
+
/**
|
|
257
|
+
* Full URL after redaction.
|
|
258
|
+
*/
|
|
259
|
+
url: string;
|
|
260
|
+
/**
|
|
261
|
+
* Normalized route pattern when available (for example `/users/{id}`).
|
|
262
|
+
*/
|
|
263
|
+
route?: string;
|
|
264
|
+
/**
|
|
265
|
+
* Final HTTP response status code, when known.
|
|
266
|
+
*/
|
|
267
|
+
statusCode?: number;
|
|
268
|
+
/**
|
|
269
|
+
* Request duration in milliseconds.
|
|
270
|
+
*/
|
|
271
|
+
durationMs: number;
|
|
272
|
+
/**
|
|
273
|
+
* Sanitized and optionally redacted request headers.
|
|
274
|
+
*/
|
|
275
|
+
requestHeaders?: Record<string, string | string[]>;
|
|
276
|
+
/**
|
|
277
|
+
* Sanitized and optionally redacted response headers.
|
|
278
|
+
*/
|
|
279
|
+
responseHeaders?: Record<string, string | string[]>;
|
|
280
|
+
/**
|
|
281
|
+
* Captured request body when enabled by capture settings.
|
|
282
|
+
*/
|
|
283
|
+
requestBody?: CapturedBody;
|
|
284
|
+
/**
|
|
285
|
+
* Captured response body when enabled by capture settings.
|
|
286
|
+
*/
|
|
287
|
+
responseBody?: CapturedBody;
|
|
288
|
+
/**
|
|
289
|
+
* Tenant identifier recorded via `setActor`.
|
|
290
|
+
*/
|
|
291
|
+
tenantId?: string;
|
|
292
|
+
/**
|
|
293
|
+
* User identifier recorded via `setActor` or legacy `setUserId`.
|
|
294
|
+
*/
|
|
295
|
+
userId?: string;
|
|
296
|
+
/**
|
|
297
|
+
* Session identifier recorded via `setSessionId`.
|
|
298
|
+
*/
|
|
299
|
+
sessionId?: string;
|
|
300
|
+
/**
|
|
301
|
+
* Captured error details when the request fails.
|
|
302
|
+
*/
|
|
303
|
+
error?: {
|
|
304
|
+
message: string;
|
|
305
|
+
type?: string;
|
|
306
|
+
stack?: string;
|
|
307
|
+
};
|
|
308
|
+
/**
|
|
309
|
+
* Custom attributes added via `setAttribute`.
|
|
310
|
+
*/
|
|
311
|
+
attributes?: Record<string, AttributeValue>;
|
|
312
|
+
/**
|
|
313
|
+
* ISO timestamp for when request processing completed.
|
|
314
|
+
*/
|
|
315
|
+
timestamp: string;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Per-request context bound to framework request objects.
|
|
319
|
+
*/
|
|
320
|
+
interface XrayContext {
|
|
321
|
+
/**
|
|
322
|
+
* Final request ID. May be empty until request completion.
|
|
323
|
+
*/
|
|
324
|
+
requestId: string;
|
|
325
|
+
/**
|
|
326
|
+
* OpenTelemetry trace ID, when tracing is active.
|
|
327
|
+
*/
|
|
328
|
+
traceId?: string;
|
|
329
|
+
/**
|
|
330
|
+
* OpenTelemetry span ID, when tracing is active.
|
|
331
|
+
*/
|
|
332
|
+
spanId?: string;
|
|
333
|
+
/**
|
|
334
|
+
* Set actor identity for the request.
|
|
335
|
+
*
|
|
336
|
+
* `tenantId` is always recorded.
|
|
337
|
+
* `userId` is recorded only when non-empty.
|
|
338
|
+
*/
|
|
339
|
+
setActor(tenantId: string, userId: string): void;
|
|
340
|
+
/**
|
|
341
|
+
* @deprecated Use `setActor(tenantId, userId)` to record tenant and user IDs together.
|
|
342
|
+
*/
|
|
343
|
+
setUserId(id: string): void;
|
|
344
|
+
/**
|
|
345
|
+
* Set a session identifier on the request log.
|
|
346
|
+
*/
|
|
347
|
+
setSessionId(id: string): void;
|
|
348
|
+
/**
|
|
349
|
+
* Add or overwrite a custom attribute on the request span/log.
|
|
350
|
+
*/
|
|
351
|
+
setAttribute(key: string, value: AttributeValue): void;
|
|
352
|
+
/**
|
|
353
|
+
* Add a span event for the current request.
|
|
354
|
+
*/
|
|
355
|
+
addEvent(name: string, attributes?: Record<string, AttributeValue>): void;
|
|
356
|
+
/**
|
|
357
|
+
* Mark the request as failed with error details.
|
|
358
|
+
*/
|
|
359
|
+
setError(err: unknown): void;
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Runtime-agnostic request input passed into `startRequest`.
|
|
363
|
+
*/
|
|
364
|
+
interface NormalizedRequest {
|
|
365
|
+
/**
|
|
366
|
+
* HTTP method used for span naming and emitted log metadata.
|
|
367
|
+
*/
|
|
368
|
+
method: string;
|
|
369
|
+
/**
|
|
370
|
+
* Full request URL before redaction.
|
|
371
|
+
*/
|
|
372
|
+
url: string;
|
|
373
|
+
/**
|
|
374
|
+
* Route pattern (if known at request start).
|
|
375
|
+
*/
|
|
376
|
+
route?: string;
|
|
377
|
+
/**
|
|
378
|
+
* Request headers as normalized string/string[] values.
|
|
379
|
+
*/
|
|
380
|
+
headers: Record<string, string | string[]>;
|
|
381
|
+
/**
|
|
382
|
+
* Optional pre-captured body.
|
|
383
|
+
*/
|
|
384
|
+
body?: CapturedBody;
|
|
385
|
+
/**
|
|
386
|
+
* Optional explicit request ID. If omitted, X-ray reads from response headers
|
|
387
|
+
* when the span is closed (and generates a UUIDv7 if none is present).
|
|
388
|
+
*/
|
|
389
|
+
requestId?: string;
|
|
390
|
+
/**
|
|
391
|
+
* Client remote address, used for client address attributes.
|
|
392
|
+
*/
|
|
393
|
+
remoteAddress?: string;
|
|
394
|
+
/**
|
|
395
|
+
* Request start timestamp (milliseconds since epoch).
|
|
396
|
+
*/
|
|
397
|
+
startTimeMs: number;
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Runtime-agnostic response input passed into `endRequest`.
|
|
401
|
+
*/
|
|
402
|
+
interface NormalizedResponse {
|
|
403
|
+
/**
|
|
404
|
+
* HTTP response status code, if a response was produced.
|
|
405
|
+
*/
|
|
406
|
+
statusCode?: number;
|
|
407
|
+
/**
|
|
408
|
+
* Response headers available at request completion.
|
|
409
|
+
*/
|
|
410
|
+
headers?: Record<string, string | string[]>;
|
|
411
|
+
/**
|
|
412
|
+
* Optional captured response body.
|
|
413
|
+
*/
|
|
414
|
+
body?: CapturedBody;
|
|
415
|
+
/**
|
|
416
|
+
* Response completion timestamp (milliseconds since epoch).
|
|
417
|
+
*/
|
|
418
|
+
endTimeMs: number;
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Runtime-agnostic emitter API used by adapters/framework wrappers.
|
|
422
|
+
*/
|
|
423
|
+
interface XrayEmitter {
|
|
424
|
+
/**
|
|
425
|
+
* Fully-resolved runtime configuration.
|
|
426
|
+
*/
|
|
427
|
+
config: ResolvedXrayConfig;
|
|
428
|
+
/**
|
|
429
|
+
* Start request tracking and return a mutable per-request context.
|
|
430
|
+
*/
|
|
431
|
+
startRequest(req: NormalizedRequest): XrayContext;
|
|
432
|
+
/**
|
|
433
|
+
* Finish request tracking and return the emitted request log payload.
|
|
434
|
+
*/
|
|
435
|
+
endRequest(ctx: XrayContext, res: NormalizedResponse, err?: unknown): RequestLog;
|
|
436
|
+
/**
|
|
437
|
+
* Flush pending spans to the configured exporter.
|
|
438
|
+
*/
|
|
439
|
+
flush(): Promise<void>;
|
|
440
|
+
/**
|
|
441
|
+
* Shutdown the emitter and release exporter resources.
|
|
442
|
+
*/
|
|
443
|
+
shutdown(): Promise<void>;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
export { type AttributeValue as A, type CapturedBody as C, type ExporterConfig as E, type LogLevel as L, type NormalizedRequest as N, type RequestLog as R, type XrayConfig as X, type XrayEmitter as a, type Logger as b, type NormalizedResponse as c, type XrayContext as d, type CaptureConfig as e, type RedactionConfig as f, type RequestIdConfig as g, type ResolvedXrayConfig as h, type RouteConfig as i, type XrayRuntimeConfig as j, XrayConfigError as k, normalizeConfig as n };
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/xray-emitter-js/xray-emitter-js/dist/chunk-2HW4AEKB.cjs","../src/node/emitter.ts","../src/node/adapter.ts"],"names":["createEmitter"],"mappings":"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EAAA;AACT;AAES;AACD,EAAA;AACF,EAAA;AACF,IAAA;AACF,EAAA;AAEM,EAAA;AACF,EAAA;AACF,IAAA;AACF,EAAA;AACO,EAAA;AACT;AAES;AACH,EAAA;AACF,IAAA;AACF,EAAA;AACI,EAAA;AACF,IAAA;AACF,EAAA;AACO,EAAA;AACT;AAES;AACF,EAAA;AACH,IAAA;AACF,EAAA;AACM,EAAA;AACC,EAAA;AACT;AAES;AACA,EAAA;AAKT;AAMM;AAEG;AACH,EAAA;AACF,IAAA;AACF,EAAA;AACM,EAAA;AACF,EAAA;AACF,IAAA;AACF,EAAA;AAEM,EAAA;AACN,EAAA;AAEM,EAAA;AACF,EAAA;AACE,IAAA;AACF,MAAA;AACF,IAAA;AACA,IAAA;AACF,EAAA;AAEI,EAAA;AAKA,EAAA;AACF,IAAA;AACF,EAAA;AAEO,EAAA;AACL,IAAA;AACA,IAAA;AACM,IAAA;AACJ,MAAA;AACF,IAAA;AACI,IAAA;AACF,MAAA;AACI,MAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACD,EAAA;AACH;AAES;AACD,EAAA;AAKA,EAAA;AACA,EAAA;AACD,EAAA;AACH,IAAA;AACF,EAAA;AAEM,EAAA;AACA,EAAA;AACC,EAAA;AACT;AAES;AACH,EAAA;AACF,IAAA;AACF,EAAA;AACI,EAAA;AACF,IAAA;AACM,MAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AACO,EAAA;AACT;AAES;AAID,EAAA;AACD,EAAA;AACH,IAAA;AACF,EAAA;AAEM,EAAA;AACN,EAAA;AACE,IAAA;AACM,MAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AACI,EAAA;AACF,IAAA;AACM,MAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AACO,EAAA;AACT;AAES;AAKF,EAAA;AACH,IAAA;AACF,EAAA;AACM,EAAA;AACF,EAAA;AACF,IAAA;AACF,EAAA;AAEM,EAAA;AACA,EAAA;AAKF,EAAA;AACF,IAAA;AACF,EAAA;AAEM,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACC,IAAA;AACH,MAAA;AACF,IAAA;AACA,IAAA;AACM,MAAA;AACF,QAAA;AACF,MAAA;AACA,MAAA;AACA,MAAA;AACI,MAAA;AACF,QAAA;AACA,QAAA;AACF,MAAA;AACF,IAAA;AACA,IAAA;AACD,EAAA;AAEM,EAAA;AACT;AAES;AACD,EAAA;AACA,EAAA;AACN,EAAA;AACQ,IAAA;AACF,IAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AACO,EAAA;AACT;AAES;AACD,EAAA;AACA,EAAA;AACD,EAAA;AACH,IAAA;AACF,EAAA;AACK,EAAA;AACH,IAAA;AACF,EAAA;AACM,EAAA;AACC,EAAA;AACT;AAES;AACF,EAAA;AACH,IAAA;AACF,EAAA;AACO,EAAA;AACT;AFpIU;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/xray-emitter-js/xray-emitter-js/dist/chunk-2HW4AEKB.cjs","sourcesContent":[null,"import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';\nimport {\n createEmitter as createCoreEmitter,\n normalizeConfig,\n type XrayRuntimeConfig,\n} from '../core/index';\n\nexport function createEmitter(config: XrayRuntimeConfig) {\n const resolved = normalizeConfig(config);\n const exporter =\n config.exporter?.instance ??\n new OTLPTraceExporter({\n url: resolved.exporter.endpointUrl,\n headers: resolved.exporter.headers ?? {},\n timeoutMillis: resolved.exporter.timeoutMs,\n });\n\n return createCoreEmitter(config, exporter);\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http';\nimport { TLSSocket } from 'node:tls';\nimport type {\n CaptureConfig,\n NormalizedRequest,\n NormalizedResponse,\n RedactionConfig,\n RequestLog,\n XrayContext,\n XrayEmitter,\n} from '../core/index';\nimport {\n LimitedBuffer,\n bindContextToObject,\n getXrayContextFromObject,\n headerValuesFromNodeHeaders,\n isWebsocketUpgrade,\n logWithLevel,\n makeCapturedBody,\n setCaptureOverride,\n setContextRequestId,\n setContextRoute,\n setRedactionOverride,\n generateRequestId,\n} from '../core/internal';\n\nexport type NodeHttpHandler = (req: IncomingMessage, res: ServerResponse) => void | Promise<void>;\n\nexport interface WrapOptions {\n route?: string;\n requestId?: string;\n capture?: Partial<CaptureConfig>;\n redaction?: Partial<RedactionConfig>;\n onRequest?: (ctx: XrayContext) => void;\n onResponse?: (ctx: XrayContext, log: RequestLog) => void;\n onError?: (ctx: XrayContext, err: unknown) => void;\n}\n\nexport function wrapHttpHandler(\n handler: NodeHttpHandler,\n xray: XrayEmitter,\n options?: WrapOptions,\n): NodeHttpHandler {\n return (req, res) => {\n const normalizedRequest: NormalizedRequest = {\n method: req.method ?? 'GET',\n url: fullUrl(req),\n route: options?.route,\n headers: headerValuesFromNodeHeaders(\n req.headers as Record<string, string | string[] | number | undefined>,\n ),\n requestId: options?.requestId,\n remoteAddress: req.socket?.remoteAddress,\n startTimeMs: Date.now(),\n };\n\n trackExpressParams(req);\n\n const ctx = xray.startRequest(normalizedRequest);\n bindContextToObject(req, ctx);\n bindContextToObject(res, ctx);\n\n if (options?.requestId) {\n setContextRequestId(ctx, options.requestId);\n }\n if (options?.route) {\n setContextRoute(ctx, options.route);\n }\n if (options?.capture) {\n setCaptureOverride(ctx, options.capture);\n }\n if (options?.redaction) {\n setRedactionOverride(ctx, options.redaction);\n }\n\n if (options?.onRequest) {\n try {\n options.onRequest(ctx);\n } catch (err) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onRequest failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const capture = options?.capture\n ? { ...xray.config.capture, ...options.capture }\n : xray.config.capture;\n\n const requestCapture =\n capture.requestBody === 'none' ? null : wrapRequestBody(req, capture.maxBodyBytes);\n const recorder = new ResponseRecorder(\n capture.responseBody !== 'none',\n capture.maxBodyBytes,\n (response) => {\n ensureResponseRequestId(response, ctx, xray);\n },\n );\n recorder.wrap(res);\n\n let finished = false;\n let capturedError: unknown;\n let onErrorCalled = false;\n\n const finish = () => {\n if (finished) {\n return;\n }\n finished = true;\n if (!normalizedRequest.route) {\n const route = resolveExpressRoute(req);\n if (route) {\n normalizedRequest.route = route;\n }\n }\n\n if (requestCapture && requestCapture.read) {\n normalizedRequest.body = makeCapturedBody(\n requestCapture.buffer.bytes(),\n requestCapture.buffer.totalBytes(),\n requestCapture.buffer.truncated(),\n capture.requestBody === 'text' ? 'text' : 'base64',\n );\n }\n\n const responseHeaders = recorder.headersSnapshot(res.getHeaders());\n const recordedStatus = recorder.statusCode() ?? res.statusCode;\n const statusCode = capturedError && !recorder.hasWrittenHeader() ? 500 : recordedStatus;\n const isUpgrade = isWebsocketUpgrade(\n statusCode ?? 0,\n normalizedRequest.headers,\n responseHeaders,\n );\n\n const responseBody =\n recorder.bodyCaptured() && !isUpgrade\n ? makeCapturedBody(\n recorder.body(),\n recorder.totalBytes(),\n recorder.truncated(),\n capture.responseBody === 'text' ? 'text' : 'base64',\n )\n : undefined;\n\n const normalizedResponse: NormalizedResponse = {\n statusCode: statusCode ?? undefined,\n headers: responseHeaders,\n body: responseBody,\n endTimeMs: Date.now(),\n };\n\n const log = xray.endRequest(ctx, normalizedResponse, capturedError);\n\n if (capturedError && options?.onError && !onErrorCalled) {\n onErrorCalled = true;\n try {\n options.onError(ctx, capturedError);\n } catch (err) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onError failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (err) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: err instanceof Error ? err.message : String(err),\n },\n );\n }\n }\n };\n\n res.once('finish', finish);\n res.once('close', finish);\n\n try {\n const result = handler(req, res);\n if (result && typeof (result as Promise<void>).catch === 'function') {\n void (result as Promise<void>).catch((err) => {\n capturedError = err;\n if (options?.onError && !onErrorCalled) {\n onErrorCalled = true;\n try {\n options.onError(ctx, err);\n } catch (errInner) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onError failed',\n {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n },\n );\n }\n }\n });\n }\n } catch (err) {\n capturedError = err;\n if (options?.onError && !onErrorCalled) {\n onErrorCalled = true;\n try {\n options.onError(ctx, err);\n } catch (errInner) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onError failed', {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n });\n }\n }\n throw err;\n }\n };\n}\n\nexport function getXrayContext(req: IncomingMessage): XrayContext | undefined {\n return getXrayContextFromObject(req);\n}\n\ntype RequestCapture = {\n buffer: LimitedBuffer;\n read: boolean;\n userConsuming: boolean;\n};\n\nfunction wrapRequestBody(req: IncomingMessage, limit: number): RequestCapture | null {\n if (limit <= 0) {\n return null;\n }\n if (!hasRequestBody(req)) {\n return null;\n }\n\n const capture: RequestCapture = {\n buffer: new LimitedBuffer(limit),\n read: false,\n userConsuming: false,\n };\n\n const originalPush = req.push;\n req.push = function push(chunk: unknown, encoding?: BufferEncoding): boolean {\n if (chunk != null) {\n recordChunk(capture, chunk, encoding);\n }\n return originalPush.call(req, chunk as any, encoding as any);\n } as typeof req.push;\n\n const originalEmit = req.emit;\n req.emit = function emit(event: string, ...args: unknown[]): boolean {\n if (event === 'data' && capture.userConsuming && args[0] != null) {\n capture.read = true;\n }\n if (event === 'end' && capture.userConsuming) {\n capture.read = true;\n }\n return originalEmit.call(req, event, ...args);\n } as typeof req.emit;\n\n const originalOn = req.on;\n req.on = function on(event: string, listener: (...args: any[]) => void): any {\n if (event === 'data' || event === 'readable') {\n capture.userConsuming = true;\n }\n return originalOn.call(req, event, listener);\n } as typeof req.on;\n\n const originalOnce = req.once;\n req.once = function once(event: string, listener: (...args: any[]) => void): any {\n if (event === 'data' || event === 'readable') {\n capture.userConsuming = true;\n }\n return originalOnce.call(req, event, listener);\n } as typeof req.once;\n\n const originalAddListener = req.addListener;\n req.addListener = function addListener(event: string, listener: (...args: any[]) => void): any {\n if (event === 'data' || event === 'readable') {\n capture.userConsuming = true;\n }\n return originalAddListener.call(req, event, listener);\n } as typeof req.addListener;\n\n const originalPipe = req.pipe;\n req.pipe = function pipe(destination: unknown, options?: unknown): unknown {\n capture.userConsuming = true;\n return originalPipe.call(req, destination as any, options as any);\n } as typeof req.pipe;\n\n const originalRead = req.read;\n req.read = function read(size?: number): any {\n capture.userConsuming = true;\n const chunk = originalRead.call(req, size as any) as unknown;\n const readableFlowing = (req as IncomingMessage & { readableFlowing?: boolean | null })\n .readableFlowing;\n const hasDataListeners =\n typeof req.listenerCount === 'function' && req.listenerCount('data') > 0;\n if (!hasDataListeners && readableFlowing !== true && chunk != null) {\n capture.read = true;\n }\n return chunk as any;\n } as typeof req.read;\n\n return capture;\n}\n\nfunction hasRequestBody(req: IncomingMessage): boolean {\n if (req.headers['content-length'] != null) {\n return true;\n }\n if (req.headers['transfer-encoding'] != null) {\n return true;\n }\n return false;\n}\n\nfunction recordChunk(capture: RequestCapture, chunk: unknown, encoding?: BufferEncoding): void {\n const bytes = toBytes(chunk, encoding);\n if (!bytes) {\n return;\n }\n capture.buffer.write(bytes);\n}\n\nfunction toBytes(chunk: unknown, encoding?: BufferEncoding): Uint8Array | null {\n if (chunk == null) {\n return null;\n }\n if (typeof chunk === 'string') {\n return Buffer.from(chunk, encoding);\n }\n if (chunk instanceof Uint8Array) {\n return chunk;\n }\n if (chunk instanceof ArrayBuffer) {\n return new Uint8Array(chunk);\n }\n return null;\n}\n\nclass ResponseRecorder {\n private readonly buffer: LimitedBuffer | null;\n private headerSnapshot?: Record<string, string | string[] | number | undefined>;\n private status?: number;\n private wroteHeader = false;\n private bytes = 0;\n private readonly onHeader?: (res: ServerResponse) => void;\n\n constructor(captureBody: boolean, maxBodySize: number, onHeader?: (res: ServerResponse) => void) {\n this.buffer = captureBody ? new LimitedBuffer(maxBodySize) : null;\n this.onHeader = onHeader;\n }\n\n body(): Uint8Array {\n return this.buffer?.bytes() ?? new Uint8Array();\n }\n\n totalBytes(): number {\n return this.buffer?.totalBytes() ?? 0;\n }\n\n bodyCaptured(): boolean {\n return !!this.buffer && this.buffer.totalBytes() > 0;\n }\n\n bytesWritten(): number {\n return this.bytes;\n }\n\n hasWrittenHeader(): boolean {\n return this.wroteHeader;\n }\n\n headersSnapshot(\n defaultHeaders: Record<string, string | string[] | number | undefined>,\n ): Record<string, string | string[]> {\n if (this.headerSnapshot) {\n return headerValuesFromNodeHeaders(this.headerSnapshot);\n }\n return headerValuesFromNodeHeaders(defaultHeaders);\n }\n\n statusCode(): number | undefined {\n return this.status;\n }\n\n truncated(): boolean {\n return this.buffer?.truncated() ?? false;\n }\n\n wrap(res: ServerResponse): void {\n const originalWriteHead = res.writeHead;\n res.writeHead = ((statusCode: number, ...args: any[]) => {\n if (!this.wroteHeader) {\n this.applyWriteHeadHeaders(res, args);\n }\n this.recordHeader(res, statusCode);\n return (originalWriteHead as any).call(res, statusCode, ...args);\n }) as typeof res.writeHead;\n\n const originalWrite = res.write;\n res.write = ((chunk: unknown, encoding?: BufferEncoding, cb?: (err?: Error | null) => void) => {\n this.recordHeader(res, res.statusCode ?? 200);\n this.recordWrite(chunk, encoding);\n return originalWrite.call(res, chunk as any, encoding as any, cb as any);\n }) as typeof res.write;\n\n const originalEnd = res.end;\n res.end = ((chunk?: unknown, encoding?: BufferEncoding, cb?: () => void) => {\n this.recordHeader(res, res.statusCode ?? 200);\n if (chunk) {\n this.recordWrite(chunk, encoding);\n }\n return originalEnd.call(res, chunk as any, encoding as any, cb as any);\n }) as typeof res.end;\n\n if (typeof res.flushHeaders === 'function') {\n const originalFlush = res.flushHeaders;\n res.flushHeaders = (() => {\n this.recordHeader(res, res.statusCode ?? 200);\n return originalFlush.call(res);\n }) as typeof res.flushHeaders;\n }\n }\n\n private recordHeader(res: ServerResponse, statusCode: number): void {\n if (this.wroteHeader) {\n return;\n }\n this.onHeader?.(res);\n this.wroteHeader = true;\n this.status = statusCode;\n this.headerSnapshot = { ...res.getHeaders() } as Record<\n string,\n string | string[] | number | undefined\n >;\n }\n\n private applyWriteHeadHeaders(res: ServerResponse, args: any[]): void {\n if (args.length === 0) {\n return;\n }\n const headersArg = typeof args[0] === 'string' ? args[1] : args[0];\n if (!headersArg) {\n return;\n }\n if (Array.isArray(headersArg)) {\n if (headersArg.length === 0) {\n return;\n }\n if (typeof headersArg[0] === 'string') {\n for (let i = 0; i < headersArg.length - 1; i += 2) {\n const name = headersArg[i];\n const value = headersArg[i + 1];\n if (typeof name === 'string' && value !== undefined && value !== null) {\n res.setHeader(name, value as any);\n }\n }\n return;\n }\n for (const entry of headersArg) {\n if (!Array.isArray(entry)) {\n continue;\n }\n const [name, value] = entry;\n if (typeof name === 'string' && value !== undefined && value !== null) {\n res.setHeader(name, value as any);\n }\n }\n return;\n }\n if (typeof headersArg === 'object') {\n for (const [name, value] of Object.entries(headersArg as Record<string, unknown>)) {\n if (value !== undefined && value !== null) {\n res.setHeader(name, value as any);\n }\n }\n }\n }\n\n private recordWrite(chunk: unknown, encoding?: BufferEncoding): void {\n const bytes = toBytes(chunk, encoding);\n if (!bytes) {\n return;\n }\n this.bytes += bytes.length;\n if (this.buffer) {\n this.buffer.write(bytes);\n }\n }\n}\n\nfunction ensureResponseRequestId(res: ServerResponse, ctx: XrayContext, xray: XrayEmitter): void {\n const headerName = xray.config.requestId.header;\n const existing = headerValueFromNode(res.getHeader(headerName));\n if (existing) {\n return;\n }\n\n const explicit = normalizeRequestIdCandidate(ctx.requestId);\n if (explicit) {\n res.setHeader(canonicalHeaderName(headerName), explicit);\n return;\n }\n\n const generated = generateRequestId();\n res.setHeader(canonicalHeaderName(headerName), generated);\n setContextRequestId(ctx, generated);\n}\n\nfunction fullUrl(req: IncomingMessage): string {\n const requestUrl = resolveRequestUrl(req);\n if (!requestUrl) {\n return '';\n }\n if (requestUrl.startsWith('http://') || requestUrl.startsWith('https://')) {\n return requestUrl;\n }\n\n const host = req.headers['host'];\n if (!host || typeof host !== 'string') {\n return requestUrl;\n }\n const scheme = req.socket instanceof TLSSocket ? 'https' : 'http';\n return `${scheme}://${host}${requestUrl}`;\n}\n\nfunction resolveRequestUrl(req: IncomingMessage): string {\n const requestUrl = req.url ?? '';\n if (requestUrl.startsWith('http://') || requestUrl.startsWith('https://')) {\n return requestUrl;\n }\n\n const expressReq = req as IncomingMessage & { originalUrl?: unknown };\n if (typeof expressReq.originalUrl === 'string' && expressReq.originalUrl.length > 0) {\n return expressReq.originalUrl;\n }\n return requestUrl;\n}\n\nfunction headerValueFromNode(value: unknown): string | undefined {\n if (value == null) {\n return undefined;\n }\n if (Array.isArray(value)) {\n return normalizeRequestIdCandidate(value[0]);\n }\n return normalizeRequestIdCandidate(`${value}`);\n}\n\nfunction normalizeRequestIdCandidate(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction canonicalHeaderName(headerName: string): string {\n return headerName\n .split('-')\n .filter(Boolean)\n .map((part) => (part ? part[0]!.toUpperCase() + part.slice(1) : part))\n .join('-');\n}\n\ntype ExpressRoutePath = string | string[] | RegExp;\n\ntype ExpressRouteParams = Record<string, string | string[]>;\n\nconst expressParamsHistory = new WeakMap<IncomingMessage, ExpressRouteParams[]>();\n\nfunction trackExpressParams(req: IncomingMessage): void {\n if (expressParamsHistory.has(req)) {\n return;\n }\n const anyReq = req as IncomingMessage & { app?: unknown };\n if (typeof anyReq.app !== 'function') {\n return;\n }\n\n const history: ExpressRouteParams[] = [];\n expressParamsHistory.set(req, history);\n\n const descriptor = Object.getOwnPropertyDescriptor(req, 'params');\n if (descriptor && !descriptor.configurable) {\n if (descriptor.value && typeof descriptor.value === 'object') {\n history.push({ ...(descriptor.value as ExpressRouteParams) });\n }\n return;\n }\n\n let current = (\n descriptor && 'value' in descriptor\n ? (descriptor.value as ExpressRouteParams | undefined)\n : undefined\n ) as ExpressRouteParams | undefined;\n if (current && typeof current === 'object') {\n history.push({ ...current });\n }\n\n Object.defineProperty(req, 'params', {\n configurable: true,\n enumerable: descriptor?.enumerable ?? true,\n get() {\n return current;\n },\n set(value) {\n current = value as ExpressRouteParams | undefined;\n if (value && typeof value === 'object') {\n history.push({ ...(value as ExpressRouteParams) });\n }\n },\n });\n}\n\nfunction resolveExpressRoute(req: IncomingMessage): string | undefined {\n const anyReq = req as IncomingMessage & {\n baseUrl?: string;\n params?: ExpressRouteParams;\n route?: { path?: ExpressRoutePath };\n };\n const routePath = extractExpressRoutePath(anyReq.route?.path);\n const baseUrl = anyReq.baseUrl ?? '';\n if (!routePath && !baseUrl) {\n return undefined;\n }\n\n const params = collectExpressParams(req, anyReq.params);\n const resolvedBaseUrl = replaceBaseUrlParams(baseUrl, params, routePath);\n return joinExpressRoute(resolvedBaseUrl, routePath);\n}\n\nfunction extractExpressRoutePath(path?: ExpressRoutePath): string | undefined {\n if (typeof path === 'string') {\n return path;\n }\n if (Array.isArray(path)) {\n for (const entry of path) {\n if (typeof entry === 'string') {\n return entry;\n }\n }\n }\n return undefined;\n}\n\nfunction collectExpressParams(\n req: IncomingMessage,\n fallback?: ExpressRouteParams,\n): ExpressRouteParams {\n const history = expressParamsHistory.get(req);\n if (!history || history.length === 0) {\n return fallback ?? {};\n }\n\n const merged: ExpressRouteParams = {};\n for (const snapshot of history) {\n for (const [key, value] of Object.entries(snapshot)) {\n if (!(key in merged)) {\n merged[key] = value;\n }\n }\n }\n if (fallback) {\n for (const [key, value] of Object.entries(fallback)) {\n if (!(key in merged)) {\n merged[key] = value;\n }\n }\n }\n return merged;\n}\n\nfunction replaceBaseUrlParams(\n baseUrl: string,\n params: ExpressRouteParams,\n routePath?: string,\n): string {\n if (!baseUrl) {\n return baseUrl;\n }\n const entries = Object.entries(params);\n if (entries.length === 0) {\n return baseUrl;\n }\n\n const excluded = new Set(routePath ? extractExpressParamNames(routePath) : []);\n const replacements = entries\n .filter(([name]) => !excluded.has(name))\n .map(([name, value]) => ({ name, value: Array.isArray(value) ? value[0] : value }))\n .filter((entry): entry is { name: string; value: string } => !!entry.value);\n\n if (replacements.length === 0) {\n return baseUrl;\n }\n\n const used = new Set<string>();\n const encodedCache = new Map<string, string>();\n const segments = baseUrl.split('/');\n const updated = segments.map((segment) => {\n if (!segment) {\n return segment;\n }\n for (const { name, value } of replacements) {\n if (used.has(name)) {\n continue;\n }\n const encodedValue = encodedCache.get(value) ?? encodeURIComponent(value);\n encodedCache.set(value, encodedValue);\n if (segment === value || segment === encodedValue) {\n used.add(name);\n return `:${name}`;\n }\n }\n return segment;\n });\n\n return updated.join('/');\n}\n\nfunction extractExpressParamNames(path: string): string[] {\n const names: string[] = [];\n const paramPattern = /:([A-Za-z0-9_]+)(?:\\([^)]*\\))?[?*+]?/g;\n for (const match of path.matchAll(paramPattern)) {\n const name = match[1];\n if (name) {\n names.push(name);\n }\n }\n return names;\n}\n\nfunction joinExpressRoute(baseUrl: string, routePath?: string): string {\n const base = baseUrl ? ensureLeadingSlash(baseUrl) : '';\n const route = routePath ? ensureLeadingSlash(routePath) : '';\n if (!base) {\n return route || '/';\n }\n if (!route || route === '/') {\n return base;\n }\n const trimmedBase = base.endsWith('/') ? base.slice(0, -1) : base;\n return `${trimmedBase}${route}`;\n}\n\nfunction ensureLeadingSlash(path: string): string {\n if (!path) {\n return '/';\n }\n return path.startsWith('/') ? path : `/${path}`;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/xray-emitter-js/xray-emitter-js/dist/chunk-DBI3HXNR.cjs","../src/fetch/emitter.ts","../src/fetch/adapter.ts"],"names":["createEmitter"],"mappings":"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","file":"/home/runner/work/xray-emitter-js/xray-emitter-js/dist/chunk-DBI3HXNR.cjs","sourcesContent":[null,"// Use the bare package import so that Node.js resolves to the Node build (http\n// transport) while bundlers (webpack, vite, wrangler/esbuild) follow the\n// package.json \"browser\" field and resolve to the browser build automatically.\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';\nimport {\n createEmitter as createCoreEmitter,\n normalizeConfig,\n type XrayRuntimeConfig,\n} from '../core/index';\n\nexport function createEmitter(config: XrayRuntimeConfig) {\n const resolved = normalizeConfig(config);\n const exporter =\n config.exporter?.instance ??\n new OTLPTraceExporter({\n url: resolved.exporter.endpointUrl,\n headers: resolved.exporter.headers ?? {},\n timeoutMillis: resolved.exporter.timeoutMs,\n });\n\n return createCoreEmitter(config, exporter);\n}\n","import type {\n CaptureConfig,\n NormalizedRequest,\n RedactionConfig,\n RequestLog,\n XrayContext,\n XrayEmitter,\n} from '../core/index';\nimport {\n LimitedBuffer,\n bindContextToObject,\n getXrayContextFromObject,\n headerValuesFromFetchHeaders,\n isWebsocketUpgradeFetch,\n logWithLevel,\n makeCapturedBody,\n setCaptureOverride,\n setContextRequestId,\n setContextRoute,\n setRedactionOverride,\n generateRequestId,\n} from '../core/internal';\n\nexport interface WrapOptions {\n route?: string;\n requestId?: string;\n capture?: Partial<CaptureConfig>;\n redaction?: Partial<RedactionConfig>;\n onRequest?: (ctx: XrayContext) => void;\n onResponse?: (ctx: XrayContext, log: RequestLog) => void;\n onError?: (ctx: XrayContext, err: unknown) => void;\n}\n\nexport function wrapFetch(\n handler: (req: Request) => Response | Promise<Response>,\n xray: XrayEmitter,\n options?: WrapOptions,\n): (req: Request) => Promise<Response> {\n return async (req: Request) => {\n const normalizedRequest: NormalizedRequest = {\n method: req.method,\n url: req.url,\n route: options?.route,\n headers: headerValuesFromFetchHeaders(req.headers),\n requestId: options?.requestId,\n startTimeMs: Date.now(),\n };\n\n const ctx = xray.startRequest(normalizedRequest);\n bindContextToObject(req, ctx);\n\n if (options?.requestId) {\n setContextRequestId(ctx, options.requestId);\n }\n if (options?.route) {\n setContextRoute(ctx, options.route);\n }\n if (options?.capture) {\n setCaptureOverride(ctx, options.capture);\n }\n if (options?.redaction) {\n setRedactionOverride(ctx, options.redaction);\n }\n\n if (options?.onRequest) {\n try {\n options.onRequest(ctx);\n } catch (err) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onRequest failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const capture = options?.capture\n ? { ...xray.config.capture, ...options.capture }\n : xray.config.capture;\n const requestCapture =\n capture.requestBody === 'none' ? null : wrapRequestBody(req, capture.maxBodyBytes);\n const requestForHandler = requestCapture?.request ?? req;\n if (requestForHandler !== req) {\n bindContextToObject(requestForHandler, ctx);\n }\n\n let response: Response;\n try {\n response = await handler(requestForHandler);\n } catch (err) {\n const log = xray.endRequest(\n ctx,\n {\n statusCode: undefined,\n headers: undefined,\n body: undefined,\n endTimeMs: Date.now(),\n },\n err,\n );\n if (options?.onError) {\n try {\n options.onError(ctx, err);\n } catch (errInner) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onError failed', {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n });\n }\n }\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (errInner) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n },\n );\n }\n }\n throw err;\n }\n\n if (!(response instanceof Response)) {\n const log = xray.endRequest(ctx, {\n statusCode: undefined,\n headers: undefined,\n body: undefined,\n endTimeMs: Date.now(),\n });\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (err) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: err instanceof Error ? err.message : String(err),\n },\n );\n }\n }\n return response;\n }\n\n const responseHeaders = new Headers(response.headers);\n ensureResponseRequestIdHeaders(responseHeaders, ctx, xray);\n const statusCode = response.status;\n const isUpgrade = isWebsocketUpgradeFetch(statusCode, req.headers, responseHeaders);\n\n if (!response.body || isUpgrade || capture.responseBody === 'none') {\n const log = finalizeResponse(\n ctx,\n xray,\n normalizedRequest,\n capture,\n requestCapture?.capture ?? null,\n responseHeaders,\n statusCode,\n null,\n );\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (err) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: err instanceof Error ? err.message : String(err),\n },\n );\n }\n }\n return new Response(response.body, {\n headers: responseHeaders,\n status: response.status,\n statusText: response.statusText,\n });\n }\n\n const responseCapture = new LimitedBuffer(capture.maxBodyBytes);\n let finished = false;\n const finalize = () => {\n if (finished) {\n return;\n }\n finished = true;\n const log = finalizeResponse(\n ctx,\n xray,\n normalizedRequest,\n capture,\n requestCapture?.capture ?? null,\n responseHeaders,\n statusCode,\n responseCapture,\n );\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (err) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: err instanceof Error ? err.message : String(err),\n },\n );\n }\n }\n };\n\n const wrappedBody = wrapReadableStream(response.body, responseCapture, finalize, () => {\n finalize();\n });\n\n return new Response(wrappedBody, {\n headers: responseHeaders,\n status: response.status,\n statusText: response.statusText,\n });\n };\n}\n\nexport function wrapFetchPreserve(\n handler: (req: Request) => Response | Promise<Response>,\n xray: XrayEmitter,\n options?: WrapOptions,\n): (req: Request) => Promise<Response> {\n return async (req: Request) => {\n const normalizedRequest: NormalizedRequest = {\n method: req.method,\n url: req.url,\n route: options?.route,\n headers: headerValuesFromFetchHeaders(req.headers),\n requestId: options?.requestId,\n startTimeMs: Date.now(),\n };\n\n const ctx = xray.startRequest(normalizedRequest);\n bindContextToObject(req, ctx);\n\n if (options?.requestId) {\n setContextRequestId(ctx, options.requestId);\n }\n if (options?.route) {\n setContextRoute(ctx, options.route);\n }\n if (options?.capture) {\n setCaptureOverride(ctx, options.capture);\n }\n if (options?.redaction) {\n setRedactionOverride(ctx, options.redaction);\n }\n\n if (options?.onRequest) {\n try {\n options.onRequest(ctx);\n } catch (err) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onRequest failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const capture = options?.capture\n ? { ...xray.config.capture, ...options.capture }\n : xray.config.capture;\n const requestCapturePromise =\n capture.requestBody === 'none'\n ? Promise.resolve(null)\n : captureRequestClone(req, capture.maxBodyBytes, xray);\n\n let response: Response;\n try {\n response = await handler(req);\n } catch (err) {\n const log = xray.endRequest(\n ctx,\n {\n statusCode: undefined,\n headers: undefined,\n body: undefined,\n endTimeMs: Date.now(),\n },\n err,\n );\n if (options?.onError) {\n try {\n options.onError(ctx, err);\n } catch (errInner) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onError failed', {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n });\n }\n }\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (errInner) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n },\n );\n }\n }\n throw err;\n }\n\n if (!(response instanceof Response)) {\n const log = xray.endRequest(ctx, {\n statusCode: undefined,\n headers: undefined,\n body: undefined,\n endTimeMs: Date.now(),\n });\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (err) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: err instanceof Error ? err.message : String(err),\n },\n );\n }\n }\n return response;\n }\n\n const responseHeaders = new Headers(response.headers);\n const ensured = ensureResponseRequestIdHeaders(responseHeaders, ctx, xray);\n if (ensured.set) {\n const headerName = canonicalHeaderName(xray.config.requestId.header);\n try {\n response.headers.set(headerName, ensured.value ?? '');\n } catch {\n response = new Response(response.body, {\n headers: responseHeaders,\n status: response.status,\n statusText: response.statusText,\n });\n }\n }\n const statusCode = response.status;\n const isUpgrade = isWebsocketUpgradeFetch(statusCode, req.headers, responseHeaders);\n const responseCapturePromise =\n !response.body || isUpgrade || capture.responseBody === 'none'\n ? Promise.resolve(null)\n : captureResponseClone(response, capture.maxBodyBytes, xray);\n\n void (async () => {\n const [requestCapture, responseCapture] = await Promise.all([\n requestCapturePromise,\n responseCapturePromise,\n ]);\n const log = finalizeResponse(\n ctx,\n xray,\n normalizedRequest,\n capture,\n requestCapture,\n responseHeaders,\n statusCode,\n responseCapture,\n );\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (err) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: err instanceof Error ? err.message : String(err),\n },\n );\n }\n }\n })().catch((err) => {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: response capture failed',\n {\n error: err instanceof Error ? err.message : String(err),\n },\n );\n });\n\n return response;\n };\n}\n\nexport function getXrayContext(req: Request): XrayContext | undefined {\n return getXrayContextFromObject(req);\n}\n\ntype RequestCapture = {\n buffer: LimitedBuffer;\n read: boolean;\n};\n\nfunction wrapRequestBody(\n request: Request,\n limit: number,\n): { capture: RequestCapture | null; request: Request } {\n if (limit <= 0 || !request.body || request.bodyUsed) {\n return { capture: null, request };\n }\n\n const originalBody = request.body;\n const capture: RequestCapture = {\n buffer: new LimitedBuffer(limit),\n read: false,\n };\n\n let controller: ReadableStreamDefaultController<Uint8Array> | null = null;\n let started = false;\n let reader: ReadableStreamDefaultReader<Uint8Array> | null = null;\n\n const wrappedStream = new ReadableStream<Uint8Array>({\n start(c) {\n controller = c;\n },\n async cancel(reason) {\n if (!started) {\n return;\n }\n try {\n await reader?.cancel(reason);\n } finally {\n // Ignore cancellation.\n }\n },\n });\n\n const startPump = () => {\n if (started) {\n return;\n }\n started = true;\n reader = originalBody.getReader();\n void (async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n controller?.close();\n return;\n }\n if (value) {\n capture.read = true;\n capture.buffer.write(value);\n controller?.enqueue(value);\n }\n }\n } catch (err) {\n controller?.error(err);\n }\n })();\n };\n\n const originalGetReader = wrappedStream.getReader.bind(wrappedStream);\n (wrappedStream as unknown as { getReader: typeof wrappedStream.getReader }).getReader = (\n ...args: unknown[]\n ) => {\n startPump();\n // @ts-expect-error - preserve built-in `getReader` overloads\n return originalGetReader(...args);\n };\n\n const init: RequestInit & { duplex?: 'half' } = {\n body: wrappedStream,\n cache: request.cache,\n credentials: request.credentials,\n headers: request.headers,\n integrity: request.integrity,\n keepalive: request.keepalive,\n method: request.method,\n mode: request.mode,\n redirect: request.redirect,\n referrer: request.referrer,\n referrerPolicy: request.referrerPolicy,\n signal: request.signal,\n };\n if (isNodeRuntime()) {\n init.duplex = 'half';\n }\n\n const wrappedRequest = new Request(request.url, init);\n return { capture, request: wrappedRequest };\n}\n\nasync function captureRequestClone(\n request: Request,\n limit: number,\n xray: XrayEmitter,\n): Promise<LimitedBuffer | null> {\n if (limit <= 0 || !request.body || request.bodyUsed) {\n return null;\n }\n let clone: Request;\n try {\n clone = request.clone();\n } catch {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: request clone failed');\n return null;\n }\n\n const buffer = new LimitedBuffer(limit);\n await readStreamToBuffer(clone.body, buffer);\n return buffer;\n}\n\nasync function captureResponseClone(\n response: Response,\n limit: number,\n xray: XrayEmitter,\n): Promise<LimitedBuffer | null> {\n if (limit <= 0 || !response.body || response.bodyUsed) {\n return null;\n }\n let clone: Response;\n try {\n clone = response.clone();\n } catch {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: response clone failed');\n return null;\n }\n\n const buffer = new LimitedBuffer(limit);\n await readStreamToBuffer(clone.body, buffer);\n return buffer;\n}\n\nasync function readStreamToBuffer(\n stream: ReadableStream<Uint8Array> | null,\n buffer: LimitedBuffer,\n): Promise<void> {\n if (!stream) {\n return;\n }\n\n const reader = stream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n return;\n }\n if (value) {\n buffer.write(value);\n }\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // Ignore release failures; reader may already be closed.\n }\n }\n}\n\nfunction wrapReadableStream(\n stream: ReadableStream<Uint8Array>,\n capture: LimitedBuffer,\n onFinish: () => void,\n onError?: (err: unknown) => void,\n): ReadableStream<Uint8Array> {\n const reader = stream.getReader();\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n onFinish();\n try {\n reader.releaseLock();\n } catch {\n // Ignore release failures; reader may already be closed.\n }\n return;\n }\n if (value) {\n capture.write(value);\n controller.enqueue(value);\n }\n } catch (err) {\n controller.error(err);\n onError?.(err);\n onFinish();\n try {\n reader.releaseLock();\n } catch {\n // Ignore release failures; reader may already be closed.\n }\n }\n },\n async cancel(reason) {\n try {\n await reader.cancel(reason);\n } finally {\n onFinish();\n try {\n reader.releaseLock();\n } catch {\n // Ignore release failures; reader may already be closed.\n }\n }\n },\n });\n}\n\nfunction finalizeResponse(\n ctx: XrayContext,\n xray: XrayEmitter,\n normalizedRequest: NormalizedRequest,\n capture: CaptureConfig,\n requestCapture: RequestCapture | LimitedBuffer | null,\n responseHeaders: Headers,\n statusCode: number,\n responseCapture: LimitedBuffer | null,\n): RequestLog {\n if (requestCapture) {\n const buffer = requestCapture instanceof LimitedBuffer ? requestCapture : requestCapture.buffer;\n const read = requestCapture instanceof LimitedBuffer ? true : requestCapture.read;\n if (read) {\n normalizedRequest.body = makeCapturedBody(\n buffer.bytes(),\n buffer.totalBytes(),\n buffer.truncated(),\n capture.requestBody === 'text' ? 'text' : 'base64',\n );\n }\n }\n\n const responseBody = responseCapture\n ? makeCapturedBody(\n responseCapture.bytes(),\n responseCapture.totalBytes(),\n responseCapture.truncated(),\n capture.responseBody === 'text' ? 'text' : 'base64',\n )\n : undefined;\n\n return xray.endRequest(ctx, {\n statusCode,\n headers: headerValuesFromFetchHeaders(responseHeaders),\n body: responseBody,\n endTimeMs: Date.now(),\n });\n}\n\nfunction ensureResponseRequestIdHeaders(\n headers: Headers,\n ctx: XrayContext,\n xray: XrayEmitter,\n): { value?: string; set: boolean } {\n const headerName = xray.config.requestId.header;\n const existing = normalizeRequestIdCandidate(headers.get(headerName) ?? undefined);\n if (existing) {\n return { value: existing, set: false };\n }\n\n const explicit = normalizeRequestIdCandidate(ctx.requestId);\n if (explicit) {\n headers.set(canonicalHeaderName(headerName), explicit);\n return { value: explicit, set: true };\n }\n\n const generated = generateRequestId();\n headers.set(canonicalHeaderName(headerName), generated);\n setContextRequestId(ctx, generated);\n return { value: generated, set: true };\n}\n\nfunction isNodeRuntime(): boolean {\n const maybeProcess = (\n globalThis as typeof globalThis & {\n process?: { versions?: { node?: string } };\n }\n ).process;\n return !!maybeProcess?.versions?.node;\n}\n\nfunction normalizeRequestIdCandidate(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction canonicalHeaderName(headerName: string): string {\n return headerName\n .split('-')\n .filter(Boolean)\n .map((part) => (part ? part[0]!.toUpperCase() + part.slice(1) : part))\n .join('-');\n}\n"]}
|