@stainlessdev/xray-fetch 0.1.0-branch.bg-publish-to-npm.18b1cb1

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/dist/index.cjs ADDED
@@ -0,0 +1,579 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ getXrayContext: () => getXrayContext,
24
+ wrapFetch: () => wrapFetch,
25
+ wrapFetchPreserve: () => wrapFetchPreserve
26
+ });
27
+ module.exports = __toCommonJS(index_exports);
28
+
29
+ // src/adapter.ts
30
+ var import_internal = require("@stainlessdev/xray-core/internal");
31
+ function wrapFetch(handler, xray, options) {
32
+ return async (req) => {
33
+ const normalizedRequest = {
34
+ method: req.method,
35
+ url: req.url,
36
+ route: options?.route,
37
+ headers: (0, import_internal.headerValuesFromFetchHeaders)(req.headers),
38
+ requestId: resolveRequestId(options?.requestId, req, xray),
39
+ startTimeMs: Date.now()
40
+ };
41
+ const ctx = xray.startRequest(normalizedRequest);
42
+ (0, import_internal.bindContextToObject)(req, ctx);
43
+ if (options?.requestId) {
44
+ (0, import_internal.setContextRequestId)(ctx, options.requestId);
45
+ }
46
+ if (options?.route) {
47
+ (0, import_internal.setContextRoute)(ctx, options.route);
48
+ }
49
+ if (options?.capture) {
50
+ (0, import_internal.setCaptureOverride)(ctx, options.capture);
51
+ }
52
+ if (options?.redaction) {
53
+ (0, import_internal.setRedactionOverride)(ctx, options.redaction);
54
+ }
55
+ if (options?.onRequest) {
56
+ try {
57
+ options.onRequest(ctx);
58
+ } catch (err) {
59
+ (0, import_internal.logWithLevel)(xray.config.logger, "warn", xray.config.logLevel, "xray: onRequest failed", {
60
+ error: err instanceof Error ? err.message : String(err)
61
+ });
62
+ }
63
+ }
64
+ const capture = options?.capture ? { ...xray.config.capture, ...options.capture } : xray.config.capture;
65
+ const requestCapture = capture.requestBody === "none" ? null : wrapRequestBody(req, capture.maxBodyBytes);
66
+ const requestForHandler = requestCapture?.request ?? req;
67
+ if (requestForHandler !== req) {
68
+ (0, import_internal.bindContextToObject)(requestForHandler, ctx);
69
+ }
70
+ let response;
71
+ try {
72
+ response = await handler(requestForHandler);
73
+ } catch (err) {
74
+ const log = xray.endRequest(
75
+ ctx,
76
+ {
77
+ statusCode: void 0,
78
+ headers: void 0,
79
+ body: void 0,
80
+ endTimeMs: Date.now()
81
+ },
82
+ err
83
+ );
84
+ if (options?.onError) {
85
+ try {
86
+ options.onError(ctx, err);
87
+ } catch (errInner) {
88
+ (0, import_internal.logWithLevel)(xray.config.logger, "warn", xray.config.logLevel, "xray: onError failed", {
89
+ error: errInner instanceof Error ? errInner.message : String(errInner)
90
+ });
91
+ }
92
+ }
93
+ if (options?.onResponse) {
94
+ try {
95
+ options.onResponse(ctx, log);
96
+ } catch (errInner) {
97
+ (0, import_internal.logWithLevel)(
98
+ xray.config.logger,
99
+ "warn",
100
+ xray.config.logLevel,
101
+ "xray: onResponse failed",
102
+ {
103
+ error: errInner instanceof Error ? errInner.message : String(errInner)
104
+ }
105
+ );
106
+ }
107
+ }
108
+ throw err;
109
+ }
110
+ if (!(response instanceof Response)) {
111
+ const log = xray.endRequest(ctx, {
112
+ statusCode: void 0,
113
+ headers: void 0,
114
+ body: void 0,
115
+ endTimeMs: Date.now()
116
+ });
117
+ if (options?.onResponse) {
118
+ try {
119
+ options.onResponse(ctx, log);
120
+ } catch (err) {
121
+ (0, import_internal.logWithLevel)(
122
+ xray.config.logger,
123
+ "warn",
124
+ xray.config.logLevel,
125
+ "xray: onResponse failed",
126
+ {
127
+ error: err instanceof Error ? err.message : String(err)
128
+ }
129
+ );
130
+ }
131
+ }
132
+ return response;
133
+ }
134
+ const responseHeaders = new Headers(response.headers);
135
+ const statusCode = response.status;
136
+ const isUpgrade = (0, import_internal.isWebsocketUpgradeFetch)(statusCode, req.headers, responseHeaders);
137
+ if (!response.body || isUpgrade || capture.responseBody === "none") {
138
+ const log = finalizeResponse(
139
+ ctx,
140
+ xray,
141
+ normalizedRequest,
142
+ capture,
143
+ requestCapture?.capture ?? null,
144
+ responseHeaders,
145
+ statusCode,
146
+ null
147
+ );
148
+ if (options?.onResponse) {
149
+ try {
150
+ options.onResponse(ctx, log);
151
+ } catch (err) {
152
+ (0, import_internal.logWithLevel)(
153
+ xray.config.logger,
154
+ "warn",
155
+ xray.config.logLevel,
156
+ "xray: onResponse failed",
157
+ {
158
+ error: err instanceof Error ? err.message : String(err)
159
+ }
160
+ );
161
+ }
162
+ }
163
+ return new Response(response.body, {
164
+ headers: responseHeaders,
165
+ status: response.status,
166
+ statusText: response.statusText
167
+ });
168
+ }
169
+ const responseCapture = new import_internal.LimitedBuffer(capture.maxBodyBytes);
170
+ let finished = false;
171
+ const finalize = () => {
172
+ if (finished) {
173
+ return;
174
+ }
175
+ finished = true;
176
+ const log = finalizeResponse(
177
+ ctx,
178
+ xray,
179
+ normalizedRequest,
180
+ capture,
181
+ requestCapture?.capture ?? null,
182
+ responseHeaders,
183
+ statusCode,
184
+ responseCapture
185
+ );
186
+ if (options?.onResponse) {
187
+ try {
188
+ options.onResponse(ctx, log);
189
+ } catch (err) {
190
+ (0, import_internal.logWithLevel)(
191
+ xray.config.logger,
192
+ "warn",
193
+ xray.config.logLevel,
194
+ "xray: onResponse failed",
195
+ {
196
+ error: err instanceof Error ? err.message : String(err)
197
+ }
198
+ );
199
+ }
200
+ }
201
+ };
202
+ const wrappedBody = wrapReadableStream(response.body, responseCapture, finalize, () => {
203
+ finalize();
204
+ });
205
+ return new Response(wrappedBody, {
206
+ headers: responseHeaders,
207
+ status: response.status,
208
+ statusText: response.statusText
209
+ });
210
+ };
211
+ }
212
+ function wrapFetchPreserve(handler, xray, options) {
213
+ return async (req) => {
214
+ const normalizedRequest = {
215
+ method: req.method,
216
+ url: req.url,
217
+ route: options?.route,
218
+ headers: (0, import_internal.headerValuesFromFetchHeaders)(req.headers),
219
+ requestId: resolveRequestId(options?.requestId, req, xray),
220
+ startTimeMs: Date.now()
221
+ };
222
+ const ctx = xray.startRequest(normalizedRequest);
223
+ (0, import_internal.bindContextToObject)(req, ctx);
224
+ if (options?.requestId) {
225
+ (0, import_internal.setContextRequestId)(ctx, options.requestId);
226
+ }
227
+ if (options?.route) {
228
+ (0, import_internal.setContextRoute)(ctx, options.route);
229
+ }
230
+ if (options?.capture) {
231
+ (0, import_internal.setCaptureOverride)(ctx, options.capture);
232
+ }
233
+ if (options?.redaction) {
234
+ (0, import_internal.setRedactionOverride)(ctx, options.redaction);
235
+ }
236
+ if (options?.onRequest) {
237
+ try {
238
+ options.onRequest(ctx);
239
+ } catch (err) {
240
+ (0, import_internal.logWithLevel)(xray.config.logger, "warn", xray.config.logLevel, "xray: onRequest failed", {
241
+ error: err instanceof Error ? err.message : String(err)
242
+ });
243
+ }
244
+ }
245
+ const capture = options?.capture ? { ...xray.config.capture, ...options.capture } : xray.config.capture;
246
+ const requestCapturePromise = capture.requestBody === "none" ? Promise.resolve(null) : captureRequestClone(req, capture.maxBodyBytes, xray);
247
+ let response;
248
+ try {
249
+ response = await handler(req);
250
+ } catch (err) {
251
+ const log = xray.endRequest(
252
+ ctx,
253
+ {
254
+ statusCode: void 0,
255
+ headers: void 0,
256
+ body: void 0,
257
+ endTimeMs: Date.now()
258
+ },
259
+ err
260
+ );
261
+ if (options?.onError) {
262
+ try {
263
+ options.onError(ctx, err);
264
+ } catch (errInner) {
265
+ (0, import_internal.logWithLevel)(xray.config.logger, "warn", xray.config.logLevel, "xray: onError failed", {
266
+ error: errInner instanceof Error ? errInner.message : String(errInner)
267
+ });
268
+ }
269
+ }
270
+ if (options?.onResponse) {
271
+ try {
272
+ options.onResponse(ctx, log);
273
+ } catch (errInner) {
274
+ (0, import_internal.logWithLevel)(
275
+ xray.config.logger,
276
+ "warn",
277
+ xray.config.logLevel,
278
+ "xray: onResponse failed",
279
+ {
280
+ error: errInner instanceof Error ? errInner.message : String(errInner)
281
+ }
282
+ );
283
+ }
284
+ }
285
+ throw err;
286
+ }
287
+ if (!(response instanceof Response)) {
288
+ const log = xray.endRequest(ctx, {
289
+ statusCode: void 0,
290
+ headers: void 0,
291
+ body: void 0,
292
+ endTimeMs: Date.now()
293
+ });
294
+ if (options?.onResponse) {
295
+ try {
296
+ options.onResponse(ctx, log);
297
+ } catch (err) {
298
+ (0, import_internal.logWithLevel)(
299
+ xray.config.logger,
300
+ "warn",
301
+ xray.config.logLevel,
302
+ "xray: onResponse failed",
303
+ {
304
+ error: err instanceof Error ? err.message : String(err)
305
+ }
306
+ );
307
+ }
308
+ }
309
+ return response;
310
+ }
311
+ const responseHeaders = new Headers(response.headers);
312
+ const statusCode = response.status;
313
+ const isUpgrade = (0, import_internal.isWebsocketUpgradeFetch)(statusCode, req.headers, responseHeaders);
314
+ const responseCapturePromise = !response.body || isUpgrade || capture.responseBody === "none" ? Promise.resolve(null) : captureResponseClone(response, capture.maxBodyBytes, xray);
315
+ void (async () => {
316
+ const [requestCapture, responseCapture] = await Promise.all([
317
+ requestCapturePromise,
318
+ responseCapturePromise
319
+ ]);
320
+ const log = finalizeResponse(
321
+ ctx,
322
+ xray,
323
+ normalizedRequest,
324
+ capture,
325
+ requestCapture,
326
+ responseHeaders,
327
+ statusCode,
328
+ responseCapture
329
+ );
330
+ if (options?.onResponse) {
331
+ try {
332
+ options.onResponse(ctx, log);
333
+ } catch (err) {
334
+ (0, import_internal.logWithLevel)(
335
+ xray.config.logger,
336
+ "warn",
337
+ xray.config.logLevel,
338
+ "xray: onResponse failed",
339
+ {
340
+ error: err instanceof Error ? err.message : String(err)
341
+ }
342
+ );
343
+ }
344
+ }
345
+ })().catch((err) => {
346
+ (0, import_internal.logWithLevel)(
347
+ xray.config.logger,
348
+ "warn",
349
+ xray.config.logLevel,
350
+ "xray: response capture failed",
351
+ {
352
+ error: err instanceof Error ? err.message : String(err)
353
+ }
354
+ );
355
+ });
356
+ return response;
357
+ };
358
+ }
359
+ function getXrayContext(req) {
360
+ return (0, import_internal.getXrayContextFromObject)(req);
361
+ }
362
+ function wrapRequestBody(request, limit) {
363
+ if (limit <= 0 || !request.body || request.bodyUsed) {
364
+ return { capture: null, request };
365
+ }
366
+ const originalBody = request.body;
367
+ const capture = {
368
+ buffer: new import_internal.LimitedBuffer(limit),
369
+ read: false
370
+ };
371
+ let controller = null;
372
+ let started = false;
373
+ let reader = null;
374
+ const wrappedStream = new ReadableStream({
375
+ start(c) {
376
+ controller = c;
377
+ },
378
+ async cancel(reason) {
379
+ if (!started) {
380
+ return;
381
+ }
382
+ try {
383
+ await reader?.cancel(reason);
384
+ } finally {
385
+ }
386
+ }
387
+ });
388
+ const startPump = () => {
389
+ if (started) {
390
+ return;
391
+ }
392
+ started = true;
393
+ reader = originalBody.getReader();
394
+ void (async () => {
395
+ try {
396
+ while (true) {
397
+ const { done, value } = await reader.read();
398
+ if (done) {
399
+ controller?.close();
400
+ return;
401
+ }
402
+ if (value) {
403
+ capture.read = true;
404
+ capture.buffer.write(value);
405
+ controller?.enqueue(value);
406
+ }
407
+ }
408
+ } catch (err) {
409
+ controller?.error(err);
410
+ }
411
+ })();
412
+ };
413
+ const originalGetReader = wrappedStream.getReader.bind(wrappedStream);
414
+ wrappedStream.getReader = (...args) => {
415
+ startPump();
416
+ return originalGetReader(...args);
417
+ };
418
+ const init = {
419
+ body: wrappedStream,
420
+ cache: request.cache,
421
+ credentials: request.credentials,
422
+ headers: request.headers,
423
+ integrity: request.integrity,
424
+ keepalive: request.keepalive,
425
+ method: request.method,
426
+ mode: request.mode,
427
+ redirect: request.redirect,
428
+ referrer: request.referrer,
429
+ referrerPolicy: request.referrerPolicy,
430
+ signal: request.signal
431
+ };
432
+ if (isNodeRuntime()) {
433
+ init.duplex = "half";
434
+ }
435
+ const wrappedRequest = new Request(request.url, init);
436
+ return { capture, request: wrappedRequest };
437
+ }
438
+ async function captureRequestClone(request, limit, xray) {
439
+ if (limit <= 0 || !request.body || request.bodyUsed) {
440
+ return null;
441
+ }
442
+ let clone;
443
+ try {
444
+ clone = request.clone();
445
+ } catch {
446
+ (0, import_internal.logWithLevel)(xray.config.logger, "warn", xray.config.logLevel, "xray: request clone failed");
447
+ return null;
448
+ }
449
+ const buffer = new import_internal.LimitedBuffer(limit);
450
+ await readStreamToBuffer(clone.body, buffer);
451
+ return buffer;
452
+ }
453
+ async function captureResponseClone(response, limit, xray) {
454
+ if (limit <= 0 || !response.body || response.bodyUsed) {
455
+ return null;
456
+ }
457
+ let clone;
458
+ try {
459
+ clone = response.clone();
460
+ } catch {
461
+ (0, import_internal.logWithLevel)(xray.config.logger, "warn", xray.config.logLevel, "xray: response clone failed");
462
+ return null;
463
+ }
464
+ const buffer = new import_internal.LimitedBuffer(limit);
465
+ await readStreamToBuffer(clone.body, buffer);
466
+ return buffer;
467
+ }
468
+ async function readStreamToBuffer(stream, buffer) {
469
+ if (!stream) {
470
+ return;
471
+ }
472
+ const reader = stream.getReader();
473
+ try {
474
+ while (true) {
475
+ const { done, value } = await reader.read();
476
+ if (done) {
477
+ return;
478
+ }
479
+ if (value) {
480
+ buffer.write(value);
481
+ }
482
+ }
483
+ } finally {
484
+ try {
485
+ reader.releaseLock();
486
+ } catch {
487
+ }
488
+ }
489
+ }
490
+ function wrapReadableStream(stream, capture, onFinish, onError) {
491
+ const reader = stream.getReader();
492
+ return new ReadableStream({
493
+ async pull(controller) {
494
+ try {
495
+ const { done, value } = await reader.read();
496
+ if (done) {
497
+ controller.close();
498
+ onFinish();
499
+ try {
500
+ reader.releaseLock();
501
+ } catch {
502
+ }
503
+ return;
504
+ }
505
+ if (value) {
506
+ capture.write(value);
507
+ controller.enqueue(value);
508
+ }
509
+ } catch (err) {
510
+ controller.error(err);
511
+ onError?.(err);
512
+ onFinish();
513
+ try {
514
+ reader.releaseLock();
515
+ } catch {
516
+ }
517
+ }
518
+ },
519
+ async cancel(reason) {
520
+ try {
521
+ await reader.cancel(reason);
522
+ } finally {
523
+ onFinish();
524
+ try {
525
+ reader.releaseLock();
526
+ } catch {
527
+ }
528
+ }
529
+ }
530
+ });
531
+ }
532
+ function finalizeResponse(ctx, xray, normalizedRequest, capture, requestCapture, responseHeaders, statusCode, responseCapture) {
533
+ if (requestCapture) {
534
+ const buffer = requestCapture instanceof import_internal.LimitedBuffer ? requestCapture : requestCapture.buffer;
535
+ const read = requestCapture instanceof import_internal.LimitedBuffer ? true : requestCapture.read;
536
+ if (read) {
537
+ normalizedRequest.body = (0, import_internal.makeCapturedBody)(
538
+ buffer.bytes(),
539
+ buffer.totalBytes(),
540
+ buffer.truncated(),
541
+ capture.requestBody === "text" ? "text" : "base64"
542
+ );
543
+ }
544
+ }
545
+ const responseBody = responseCapture ? (0, import_internal.makeCapturedBody)(
546
+ responseCapture.bytes(),
547
+ responseCapture.totalBytes(),
548
+ responseCapture.truncated(),
549
+ capture.responseBody === "text" ? "text" : "base64"
550
+ ) : void 0;
551
+ return xray.endRequest(ctx, {
552
+ statusCode,
553
+ headers: (0, import_internal.headerValuesFromFetchHeaders)(responseHeaders),
554
+ body: responseBody,
555
+ endTimeMs: Date.now()
556
+ });
557
+ }
558
+ function resolveRequestId(explicit, req, xray) {
559
+ if (explicit) {
560
+ return explicit;
561
+ }
562
+ const headerName = xray.config.requestId.header.toLowerCase();
563
+ const value = req.headers.get(headerName);
564
+ if (value && value.trim()) {
565
+ return value.trim();
566
+ }
567
+ return void 0;
568
+ }
569
+ function isNodeRuntime() {
570
+ const maybeProcess = globalThis.process;
571
+ return !!maybeProcess?.versions?.node;
572
+ }
573
+ // Annotate the CommonJS export names for ESM import in node:
574
+ 0 && (module.exports = {
575
+ getXrayContext,
576
+ wrapFetch,
577
+ wrapFetchPreserve
578
+ });
579
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/adapter.ts"],"sourcesContent":["export { wrapFetch, wrapFetchPreserve, getXrayContext } from './adapter';\nexport type { WrapOptions } from './adapter';\n","import type {\n CaptureConfig,\n NormalizedRequest,\n RedactionConfig,\n RequestLog,\n XrayContext,\n XrayEmitter,\n} from '@stainlessdev/xray-core';\nimport {\n LimitedBuffer,\n bindContextToObject,\n getXrayContextFromObject,\n headerValuesFromFetchHeaders,\n isWebsocketUpgradeFetch,\n logWithLevel,\n makeCapturedBody,\n setCaptureOverride,\n setContextRequestId,\n setContextRoute,\n setRedactionOverride,\n} from '@stainlessdev/xray-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: resolveRequestId(options?.requestId, req, xray),\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 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: resolveRequestId(options?.requestId, req, xray),\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 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 resolveRequestId(\n explicit: string | undefined,\n req: Request,\n xray: XrayEmitter,\n): string | undefined {\n if (explicit) {\n return explicit;\n }\n const headerName = xray.config.requestId.header.toLowerCase();\n const value = req.headers.get(headerName);\n if (value && value.trim()) {\n return value.trim();\n }\n return undefined;\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"],"mappings":"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","names":[]}
@@ -0,0 +1,16 @@
1
+ import { XrayEmitter, CaptureConfig, RedactionConfig, XrayContext, RequestLog } from '@stainlessdev/xray-core';
2
+
3
+ interface WrapOptions {
4
+ route?: string;
5
+ requestId?: string;
6
+ capture?: Partial<CaptureConfig>;
7
+ redaction?: Partial<RedactionConfig>;
8
+ onRequest?: (ctx: XrayContext) => void;
9
+ onResponse?: (ctx: XrayContext, log: RequestLog) => void;
10
+ onError?: (ctx: XrayContext, err: unknown) => void;
11
+ }
12
+ declare function wrapFetch(handler: (req: Request) => Response | Promise<Response>, xray: XrayEmitter, options?: WrapOptions): (req: Request) => Promise<Response>;
13
+ declare function wrapFetchPreserve(handler: (req: Request) => Response | Promise<Response>, xray: XrayEmitter, options?: WrapOptions): (req: Request) => Promise<Response>;
14
+ declare function getXrayContext(req: Request): XrayContext | undefined;
15
+
16
+ export { type WrapOptions, getXrayContext, wrapFetch, wrapFetchPreserve };
@@ -0,0 +1,16 @@
1
+ import { XrayEmitter, CaptureConfig, RedactionConfig, XrayContext, RequestLog } from '@stainlessdev/xray-core';
2
+
3
+ interface WrapOptions {
4
+ route?: string;
5
+ requestId?: string;
6
+ capture?: Partial<CaptureConfig>;
7
+ redaction?: Partial<RedactionConfig>;
8
+ onRequest?: (ctx: XrayContext) => void;
9
+ onResponse?: (ctx: XrayContext, log: RequestLog) => void;
10
+ onError?: (ctx: XrayContext, err: unknown) => void;
11
+ }
12
+ declare function wrapFetch(handler: (req: Request) => Response | Promise<Response>, xray: XrayEmitter, options?: WrapOptions): (req: Request) => Promise<Response>;
13
+ declare function wrapFetchPreserve(handler: (req: Request) => Response | Promise<Response>, xray: XrayEmitter, options?: WrapOptions): (req: Request) => Promise<Response>;
14
+ declare function getXrayContext(req: Request): XrayContext | undefined;
15
+
16
+ export { type WrapOptions, getXrayContext, wrapFetch, wrapFetchPreserve };
package/dist/index.js ADDED
@@ -0,0 +1,562 @@
1
+ // src/adapter.ts
2
+ import {
3
+ LimitedBuffer,
4
+ bindContextToObject,
5
+ getXrayContextFromObject,
6
+ headerValuesFromFetchHeaders,
7
+ isWebsocketUpgradeFetch,
8
+ logWithLevel,
9
+ makeCapturedBody,
10
+ setCaptureOverride,
11
+ setContextRequestId,
12
+ setContextRoute,
13
+ setRedactionOverride
14
+ } from "@stainlessdev/xray-core/internal";
15
+ function wrapFetch(handler, xray, options) {
16
+ return async (req) => {
17
+ const normalizedRequest = {
18
+ method: req.method,
19
+ url: req.url,
20
+ route: options?.route,
21
+ headers: headerValuesFromFetchHeaders(req.headers),
22
+ requestId: resolveRequestId(options?.requestId, req, xray),
23
+ startTimeMs: Date.now()
24
+ };
25
+ const ctx = xray.startRequest(normalizedRequest);
26
+ bindContextToObject(req, ctx);
27
+ if (options?.requestId) {
28
+ setContextRequestId(ctx, options.requestId);
29
+ }
30
+ if (options?.route) {
31
+ setContextRoute(ctx, options.route);
32
+ }
33
+ if (options?.capture) {
34
+ setCaptureOverride(ctx, options.capture);
35
+ }
36
+ if (options?.redaction) {
37
+ setRedactionOverride(ctx, options.redaction);
38
+ }
39
+ if (options?.onRequest) {
40
+ try {
41
+ options.onRequest(ctx);
42
+ } catch (err) {
43
+ logWithLevel(xray.config.logger, "warn", xray.config.logLevel, "xray: onRequest failed", {
44
+ error: err instanceof Error ? err.message : String(err)
45
+ });
46
+ }
47
+ }
48
+ const capture = options?.capture ? { ...xray.config.capture, ...options.capture } : xray.config.capture;
49
+ const requestCapture = capture.requestBody === "none" ? null : wrapRequestBody(req, capture.maxBodyBytes);
50
+ const requestForHandler = requestCapture?.request ?? req;
51
+ if (requestForHandler !== req) {
52
+ bindContextToObject(requestForHandler, ctx);
53
+ }
54
+ let response;
55
+ try {
56
+ response = await handler(requestForHandler);
57
+ } catch (err) {
58
+ const log = xray.endRequest(
59
+ ctx,
60
+ {
61
+ statusCode: void 0,
62
+ headers: void 0,
63
+ body: void 0,
64
+ endTimeMs: Date.now()
65
+ },
66
+ err
67
+ );
68
+ if (options?.onError) {
69
+ try {
70
+ options.onError(ctx, err);
71
+ } catch (errInner) {
72
+ logWithLevel(xray.config.logger, "warn", xray.config.logLevel, "xray: onError failed", {
73
+ error: errInner instanceof Error ? errInner.message : String(errInner)
74
+ });
75
+ }
76
+ }
77
+ if (options?.onResponse) {
78
+ try {
79
+ options.onResponse(ctx, log);
80
+ } catch (errInner) {
81
+ logWithLevel(
82
+ xray.config.logger,
83
+ "warn",
84
+ xray.config.logLevel,
85
+ "xray: onResponse failed",
86
+ {
87
+ error: errInner instanceof Error ? errInner.message : String(errInner)
88
+ }
89
+ );
90
+ }
91
+ }
92
+ throw err;
93
+ }
94
+ if (!(response instanceof Response)) {
95
+ const log = xray.endRequest(ctx, {
96
+ statusCode: void 0,
97
+ headers: void 0,
98
+ body: void 0,
99
+ endTimeMs: Date.now()
100
+ });
101
+ if (options?.onResponse) {
102
+ try {
103
+ options.onResponse(ctx, log);
104
+ } catch (err) {
105
+ logWithLevel(
106
+ xray.config.logger,
107
+ "warn",
108
+ xray.config.logLevel,
109
+ "xray: onResponse failed",
110
+ {
111
+ error: err instanceof Error ? err.message : String(err)
112
+ }
113
+ );
114
+ }
115
+ }
116
+ return response;
117
+ }
118
+ const responseHeaders = new Headers(response.headers);
119
+ const statusCode = response.status;
120
+ const isUpgrade = isWebsocketUpgradeFetch(statusCode, req.headers, responseHeaders);
121
+ if (!response.body || isUpgrade || capture.responseBody === "none") {
122
+ const log = finalizeResponse(
123
+ ctx,
124
+ xray,
125
+ normalizedRequest,
126
+ capture,
127
+ requestCapture?.capture ?? null,
128
+ responseHeaders,
129
+ statusCode,
130
+ null
131
+ );
132
+ if (options?.onResponse) {
133
+ try {
134
+ options.onResponse(ctx, log);
135
+ } catch (err) {
136
+ logWithLevel(
137
+ xray.config.logger,
138
+ "warn",
139
+ xray.config.logLevel,
140
+ "xray: onResponse failed",
141
+ {
142
+ error: err instanceof Error ? err.message : String(err)
143
+ }
144
+ );
145
+ }
146
+ }
147
+ return new Response(response.body, {
148
+ headers: responseHeaders,
149
+ status: response.status,
150
+ statusText: response.statusText
151
+ });
152
+ }
153
+ const responseCapture = new LimitedBuffer(capture.maxBodyBytes);
154
+ let finished = false;
155
+ const finalize = () => {
156
+ if (finished) {
157
+ return;
158
+ }
159
+ finished = true;
160
+ const log = finalizeResponse(
161
+ ctx,
162
+ xray,
163
+ normalizedRequest,
164
+ capture,
165
+ requestCapture?.capture ?? null,
166
+ responseHeaders,
167
+ statusCode,
168
+ responseCapture
169
+ );
170
+ if (options?.onResponse) {
171
+ try {
172
+ options.onResponse(ctx, log);
173
+ } catch (err) {
174
+ logWithLevel(
175
+ xray.config.logger,
176
+ "warn",
177
+ xray.config.logLevel,
178
+ "xray: onResponse failed",
179
+ {
180
+ error: err instanceof Error ? err.message : String(err)
181
+ }
182
+ );
183
+ }
184
+ }
185
+ };
186
+ const wrappedBody = wrapReadableStream(response.body, responseCapture, finalize, () => {
187
+ finalize();
188
+ });
189
+ return new Response(wrappedBody, {
190
+ headers: responseHeaders,
191
+ status: response.status,
192
+ statusText: response.statusText
193
+ });
194
+ };
195
+ }
196
+ function wrapFetchPreserve(handler, xray, options) {
197
+ return async (req) => {
198
+ const normalizedRequest = {
199
+ method: req.method,
200
+ url: req.url,
201
+ route: options?.route,
202
+ headers: headerValuesFromFetchHeaders(req.headers),
203
+ requestId: resolveRequestId(options?.requestId, req, xray),
204
+ startTimeMs: Date.now()
205
+ };
206
+ const ctx = xray.startRequest(normalizedRequest);
207
+ bindContextToObject(req, ctx);
208
+ if (options?.requestId) {
209
+ setContextRequestId(ctx, options.requestId);
210
+ }
211
+ if (options?.route) {
212
+ setContextRoute(ctx, options.route);
213
+ }
214
+ if (options?.capture) {
215
+ setCaptureOverride(ctx, options.capture);
216
+ }
217
+ if (options?.redaction) {
218
+ setRedactionOverride(ctx, options.redaction);
219
+ }
220
+ if (options?.onRequest) {
221
+ try {
222
+ options.onRequest(ctx);
223
+ } catch (err) {
224
+ logWithLevel(xray.config.logger, "warn", xray.config.logLevel, "xray: onRequest failed", {
225
+ error: err instanceof Error ? err.message : String(err)
226
+ });
227
+ }
228
+ }
229
+ const capture = options?.capture ? { ...xray.config.capture, ...options.capture } : xray.config.capture;
230
+ const requestCapturePromise = capture.requestBody === "none" ? Promise.resolve(null) : captureRequestClone(req, capture.maxBodyBytes, xray);
231
+ let response;
232
+ try {
233
+ response = await handler(req);
234
+ } catch (err) {
235
+ const log = xray.endRequest(
236
+ ctx,
237
+ {
238
+ statusCode: void 0,
239
+ headers: void 0,
240
+ body: void 0,
241
+ endTimeMs: Date.now()
242
+ },
243
+ err
244
+ );
245
+ if (options?.onError) {
246
+ try {
247
+ options.onError(ctx, err);
248
+ } catch (errInner) {
249
+ logWithLevel(xray.config.logger, "warn", xray.config.logLevel, "xray: onError failed", {
250
+ error: errInner instanceof Error ? errInner.message : String(errInner)
251
+ });
252
+ }
253
+ }
254
+ if (options?.onResponse) {
255
+ try {
256
+ options.onResponse(ctx, log);
257
+ } catch (errInner) {
258
+ logWithLevel(
259
+ xray.config.logger,
260
+ "warn",
261
+ xray.config.logLevel,
262
+ "xray: onResponse failed",
263
+ {
264
+ error: errInner instanceof Error ? errInner.message : String(errInner)
265
+ }
266
+ );
267
+ }
268
+ }
269
+ throw err;
270
+ }
271
+ if (!(response instanceof Response)) {
272
+ const log = xray.endRequest(ctx, {
273
+ statusCode: void 0,
274
+ headers: void 0,
275
+ body: void 0,
276
+ endTimeMs: Date.now()
277
+ });
278
+ if (options?.onResponse) {
279
+ try {
280
+ options.onResponse(ctx, log);
281
+ } catch (err) {
282
+ logWithLevel(
283
+ xray.config.logger,
284
+ "warn",
285
+ xray.config.logLevel,
286
+ "xray: onResponse failed",
287
+ {
288
+ error: err instanceof Error ? err.message : String(err)
289
+ }
290
+ );
291
+ }
292
+ }
293
+ return response;
294
+ }
295
+ const responseHeaders = new Headers(response.headers);
296
+ const statusCode = response.status;
297
+ const isUpgrade = isWebsocketUpgradeFetch(statusCode, req.headers, responseHeaders);
298
+ const responseCapturePromise = !response.body || isUpgrade || capture.responseBody === "none" ? Promise.resolve(null) : captureResponseClone(response, capture.maxBodyBytes, xray);
299
+ void (async () => {
300
+ const [requestCapture, responseCapture] = await Promise.all([
301
+ requestCapturePromise,
302
+ responseCapturePromise
303
+ ]);
304
+ const log = finalizeResponse(
305
+ ctx,
306
+ xray,
307
+ normalizedRequest,
308
+ capture,
309
+ requestCapture,
310
+ responseHeaders,
311
+ statusCode,
312
+ responseCapture
313
+ );
314
+ if (options?.onResponse) {
315
+ try {
316
+ options.onResponse(ctx, log);
317
+ } catch (err) {
318
+ logWithLevel(
319
+ xray.config.logger,
320
+ "warn",
321
+ xray.config.logLevel,
322
+ "xray: onResponse failed",
323
+ {
324
+ error: err instanceof Error ? err.message : String(err)
325
+ }
326
+ );
327
+ }
328
+ }
329
+ })().catch((err) => {
330
+ logWithLevel(
331
+ xray.config.logger,
332
+ "warn",
333
+ xray.config.logLevel,
334
+ "xray: response capture failed",
335
+ {
336
+ error: err instanceof Error ? err.message : String(err)
337
+ }
338
+ );
339
+ });
340
+ return response;
341
+ };
342
+ }
343
+ function getXrayContext(req) {
344
+ return getXrayContextFromObject(req);
345
+ }
346
+ function wrapRequestBody(request, limit) {
347
+ if (limit <= 0 || !request.body || request.bodyUsed) {
348
+ return { capture: null, request };
349
+ }
350
+ const originalBody = request.body;
351
+ const capture = {
352
+ buffer: new LimitedBuffer(limit),
353
+ read: false
354
+ };
355
+ let controller = null;
356
+ let started = false;
357
+ let reader = null;
358
+ const wrappedStream = new ReadableStream({
359
+ start(c) {
360
+ controller = c;
361
+ },
362
+ async cancel(reason) {
363
+ if (!started) {
364
+ return;
365
+ }
366
+ try {
367
+ await reader?.cancel(reason);
368
+ } finally {
369
+ }
370
+ }
371
+ });
372
+ const startPump = () => {
373
+ if (started) {
374
+ return;
375
+ }
376
+ started = true;
377
+ reader = originalBody.getReader();
378
+ void (async () => {
379
+ try {
380
+ while (true) {
381
+ const { done, value } = await reader.read();
382
+ if (done) {
383
+ controller?.close();
384
+ return;
385
+ }
386
+ if (value) {
387
+ capture.read = true;
388
+ capture.buffer.write(value);
389
+ controller?.enqueue(value);
390
+ }
391
+ }
392
+ } catch (err) {
393
+ controller?.error(err);
394
+ }
395
+ })();
396
+ };
397
+ const originalGetReader = wrappedStream.getReader.bind(wrappedStream);
398
+ wrappedStream.getReader = (...args) => {
399
+ startPump();
400
+ return originalGetReader(...args);
401
+ };
402
+ const init = {
403
+ body: wrappedStream,
404
+ cache: request.cache,
405
+ credentials: request.credentials,
406
+ headers: request.headers,
407
+ integrity: request.integrity,
408
+ keepalive: request.keepalive,
409
+ method: request.method,
410
+ mode: request.mode,
411
+ redirect: request.redirect,
412
+ referrer: request.referrer,
413
+ referrerPolicy: request.referrerPolicy,
414
+ signal: request.signal
415
+ };
416
+ if (isNodeRuntime()) {
417
+ init.duplex = "half";
418
+ }
419
+ const wrappedRequest = new Request(request.url, init);
420
+ return { capture, request: wrappedRequest };
421
+ }
422
+ async function captureRequestClone(request, limit, xray) {
423
+ if (limit <= 0 || !request.body || request.bodyUsed) {
424
+ return null;
425
+ }
426
+ let clone;
427
+ try {
428
+ clone = request.clone();
429
+ } catch {
430
+ logWithLevel(xray.config.logger, "warn", xray.config.logLevel, "xray: request clone failed");
431
+ return null;
432
+ }
433
+ const buffer = new LimitedBuffer(limit);
434
+ await readStreamToBuffer(clone.body, buffer);
435
+ return buffer;
436
+ }
437
+ async function captureResponseClone(response, limit, xray) {
438
+ if (limit <= 0 || !response.body || response.bodyUsed) {
439
+ return null;
440
+ }
441
+ let clone;
442
+ try {
443
+ clone = response.clone();
444
+ } catch {
445
+ logWithLevel(xray.config.logger, "warn", xray.config.logLevel, "xray: response clone failed");
446
+ return null;
447
+ }
448
+ const buffer = new LimitedBuffer(limit);
449
+ await readStreamToBuffer(clone.body, buffer);
450
+ return buffer;
451
+ }
452
+ async function readStreamToBuffer(stream, buffer) {
453
+ if (!stream) {
454
+ return;
455
+ }
456
+ const reader = stream.getReader();
457
+ try {
458
+ while (true) {
459
+ const { done, value } = await reader.read();
460
+ if (done) {
461
+ return;
462
+ }
463
+ if (value) {
464
+ buffer.write(value);
465
+ }
466
+ }
467
+ } finally {
468
+ try {
469
+ reader.releaseLock();
470
+ } catch {
471
+ }
472
+ }
473
+ }
474
+ function wrapReadableStream(stream, capture, onFinish, onError) {
475
+ const reader = stream.getReader();
476
+ return new ReadableStream({
477
+ async pull(controller) {
478
+ try {
479
+ const { done, value } = await reader.read();
480
+ if (done) {
481
+ controller.close();
482
+ onFinish();
483
+ try {
484
+ reader.releaseLock();
485
+ } catch {
486
+ }
487
+ return;
488
+ }
489
+ if (value) {
490
+ capture.write(value);
491
+ controller.enqueue(value);
492
+ }
493
+ } catch (err) {
494
+ controller.error(err);
495
+ onError?.(err);
496
+ onFinish();
497
+ try {
498
+ reader.releaseLock();
499
+ } catch {
500
+ }
501
+ }
502
+ },
503
+ async cancel(reason) {
504
+ try {
505
+ await reader.cancel(reason);
506
+ } finally {
507
+ onFinish();
508
+ try {
509
+ reader.releaseLock();
510
+ } catch {
511
+ }
512
+ }
513
+ }
514
+ });
515
+ }
516
+ function finalizeResponse(ctx, xray, normalizedRequest, capture, requestCapture, responseHeaders, statusCode, responseCapture) {
517
+ if (requestCapture) {
518
+ const buffer = requestCapture instanceof LimitedBuffer ? requestCapture : requestCapture.buffer;
519
+ const read = requestCapture instanceof LimitedBuffer ? true : requestCapture.read;
520
+ if (read) {
521
+ normalizedRequest.body = makeCapturedBody(
522
+ buffer.bytes(),
523
+ buffer.totalBytes(),
524
+ buffer.truncated(),
525
+ capture.requestBody === "text" ? "text" : "base64"
526
+ );
527
+ }
528
+ }
529
+ const responseBody = responseCapture ? makeCapturedBody(
530
+ responseCapture.bytes(),
531
+ responseCapture.totalBytes(),
532
+ responseCapture.truncated(),
533
+ capture.responseBody === "text" ? "text" : "base64"
534
+ ) : void 0;
535
+ return xray.endRequest(ctx, {
536
+ statusCode,
537
+ headers: headerValuesFromFetchHeaders(responseHeaders),
538
+ body: responseBody,
539
+ endTimeMs: Date.now()
540
+ });
541
+ }
542
+ function resolveRequestId(explicit, req, xray) {
543
+ if (explicit) {
544
+ return explicit;
545
+ }
546
+ const headerName = xray.config.requestId.header.toLowerCase();
547
+ const value = req.headers.get(headerName);
548
+ if (value && value.trim()) {
549
+ return value.trim();
550
+ }
551
+ return void 0;
552
+ }
553
+ function isNodeRuntime() {
554
+ const maybeProcess = globalThis.process;
555
+ return !!maybeProcess?.versions?.node;
556
+ }
557
+ export {
558
+ getXrayContext,
559
+ wrapFetch,
560
+ wrapFetchPreserve
561
+ };
562
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapter.ts"],"sourcesContent":["import type {\n CaptureConfig,\n NormalizedRequest,\n RedactionConfig,\n RequestLog,\n XrayContext,\n XrayEmitter,\n} from '@stainlessdev/xray-core';\nimport {\n LimitedBuffer,\n bindContextToObject,\n getXrayContextFromObject,\n headerValuesFromFetchHeaders,\n isWebsocketUpgradeFetch,\n logWithLevel,\n makeCapturedBody,\n setCaptureOverride,\n setContextRequestId,\n setContextRoute,\n setRedactionOverride,\n} from '@stainlessdev/xray-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: resolveRequestId(options?.requestId, req, xray),\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 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: resolveRequestId(options?.requestId, req, xray),\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 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 resolveRequestId(\n explicit: string | undefined,\n req: Request,\n xray: XrayEmitter,\n): string | undefined {\n if (explicit) {\n return explicit;\n }\n const headerName = xray.config.requestId.header.toLowerCase();\n const value = req.headers.get(headerName);\n if (value && value.trim()) {\n return value.trim();\n }\n return undefined;\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"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@stainlessdev/xray-fetch",
3
+ "version": "0.1.0-branch.bg-publish-to-npm.18b1cb1",
4
+ "description": "Fetch API adapter for Stainless X-ray request logging",
5
+ "files": [
6
+ "dist"
7
+ ],
8
+ "type": "module",
9
+ "main": "./dist/index.cjs",
10
+ "module": "./dist/index.js",
11
+ "types": "./dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "import": "./dist/index.js",
16
+ "require": "./dist/index.cjs"
17
+ }
18
+ },
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "dependencies": {
23
+ "@stainlessdev/xray-core": "0.1.0-branch.bg-publish-to-npm.18b1cb1"
24
+ },
25
+ "devDependencies": {
26
+ "@opentelemetry/api": "^1.9.0",
27
+ "@opentelemetry/core": "^2.2.0",
28
+ "@opentelemetry/otlp-transformer": "^0.208.0",
29
+ "@opentelemetry/resources": "^2.2.0",
30
+ "@opentelemetry/sdk-trace-base": "^2.2.0",
31
+ "@opentelemetry/semantic-conventions": "^1.29.0",
32
+ "@types/node": "^20.11.0",
33
+ "oxlint": "^1.39.0",
34
+ "tsup": "^8.0.0",
35
+ "tsx": "^4.19.0",
36
+ "typescript": "^5.4.0"
37
+ },
38
+ "peerDependencies": {
39
+ "@opentelemetry/api": "^1.9.0",
40
+ "@opentelemetry/core": "^2.2.0",
41
+ "@opentelemetry/otlp-transformer": "^0.208.0",
42
+ "@opentelemetry/resources": "^2.2.0",
43
+ "@opentelemetry/sdk-trace-base": "^2.2.0",
44
+ "@opentelemetry/semantic-conventions": "^1.29.0"
45
+ },
46
+ "engines": {
47
+ "node": ">=20"
48
+ },
49
+ "scripts": {
50
+ "build": "tsup",
51
+ "test": "tsx --test test/*.test.ts",
52
+ "typecheck": "tsc --noEmit",
53
+ "lint": "oxlint",
54
+ "clean": "rm -rf dist"
55
+ }
56
+ }