@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
package/dist/effect.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/xray-emitter-js/xray-emitter-js/dist/effect.cjs","../src/effect/effect.ts"],"names":["createEmitter","log"],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACA;ACjBA,gCAA4C;AAC5C,4CAAiF;AAkD1E,SAASA,cAAAA,CAAc,MAAA,EAA2B,OAAA,EAAsC;AAC7F,EAAA,MAAM,QAAA,EAAU,6CAAA,MAAyB,CAAA;AACzC,EAAA,MAAM,WAAA,EAAa,sBAAA,CAAuB,OAAA,EAAS,OAAO,CAAA;AAC1D,EAAA,UAAA,CAAW,MAAA,EAAQ,OAAA,CAAQ,KAAA;AAC3B,EAAA,UAAA,CAAW,SAAA,EAAW,OAAA,CAAQ,QAAA;AAC9B,EAAA,OAAO,UAAA;AACT;AAEO,SAAS,sBAAA,CAAuB,IAAA,EAAmB,OAAA,EAAyC;AACjG,EAAA,OAAA,CAAQ,CAAO,OAAA,EAAA,GACb,cAAA,CAAO,GAAA,CAAI,QAAA,EAAA,CAAA,EAAa;AACtB,IAAA,MAAM,QAAA,EAAU,KAAA,EAAO,2BAAA,CAAkB,iBAAA;AAEzC,IAAA,MAAM,QAAA,EAAU,qBAAA,CAAsB,OAAA,CAAQ,OAAO,CAAA;AACrD,IAAA,MAAM,IAAA,EAAM,YAAA,CAAa,OAAA,CAAQ,WAAA,EAAa,OAAO,CAAA;AAIrD,IAAA,MAAM,eAAA,EAAiB,KAAA,EAAO,cAAA,CAAO,aAAA,CAAc,oBAAA,CAAW,YAAY,CAAA;AAC1E,IAAA,MAAM,MAAA,EAAQ,cAAA,CAAO,MAAA,CAAO,cAAc,EAAA,EACtC,MAAA,CAAO,cAAA,CAAe,KAAA,CAAM,KAAA,CAAM,IAAI,EAAA,kBACtC,OAAA,2BAAS,OAAA;AAGb,IAAA,MAAM,eAAA,EAAiB,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,WAAA;AAC3C,IAAA,IAAI,WAAA;AACJ,IAAA,GAAA,CAAI,eAAA,GAAkB,eAAA,IAAmB,MAAA,EAAQ;AAC/C,MAAA,MAAM,WAAA,EAAa,KAAA,EAAO,cAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA;AACpD,MAAA,GAAA,CAAI,UAAA,CAAW,KAAA,IAAS,OAAA,EAAS;AAC/B,QAAA,MAAM,MAAA,EAAQ,IAAI,WAAA,CAAY,CAAA,CAAE,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA;AACvD,QAAA,MAAM,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,YAAA;AACrC,QAAA,MAAM,UAAA,EAAY,KAAA,CAAM,OAAA,EAAS,QAAA;AACjC,QAAA,MAAM,MAAA,EAAQ,UAAA,EAAY,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,QAAQ,EAAA,EAAI,KAAA;AACrD,QAAA,YAAA,EAAc,gDAAA,KAAiB,EAAO,KAAA,CAAM,MAAA,EAAQ,SAAA,EAAW,cAAc,CAAA;AAAA,MAC/E;AAAA,IACF;AAEA,IAAA,MAAM,kBAAA,EAAuC;AAAA,MAC3C,MAAA,EAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,GAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA,EAAM,WAAA;AAAA,MACN,SAAA,kBAAW,OAAA,6BAAS,WAAA;AAAA,MACpB,aAAA,EACE,OAAA,CAAQ,aAAA,CAAc,KAAA,IAAS,OAAA,EAAS,OAAA,CAAQ,aAAA,CAAc,MAAA,EAAQ,KAAA,CAAA;AAAA,MACxE,WAAA,EAAa,IAAA,CAAK,GAAA,CAAI;AAAA,IACxB,CAAA;AAEA,IAAA,MAAM,IAAA,EAAM,IAAA,CAAK,YAAA,CAAa,iBAAiB,CAAA;AAC/C,IAAA,mDAAA,OAAoB,EAAS,GAAG,CAAA;AAEhC,IAAA,GAAA,iBAAI,OAAA,6BAAS,WAAA,EAAW;AACtB,MAAA,mDAAA,GAAoB,EAAK,OAAA,CAAQ,SAAS,CAAA;AAAA,IAC5C;AACA,IAAA,GAAA,CAAI,KAAA,EAAO;AACT,MAAA,+CAAA,GAAgB,EAAK,KAAK,CAAA;AAAA,IAC5B;AACA,IAAA,GAAA,iBAAI,OAAA,6BAAS,SAAA,EAAS;AACpB,MAAA,kDAAA,GAAmB,EAAK,OAAA,CAAQ,OAAO,CAAA;AAAA,IACzC;AACA,IAAA,GAAA,iBAAI,OAAA,6BAAS,WAAA,EAAW;AACtB,MAAA,oDAAA,GAAqB,EAAK,OAAA,CAAQ,SAAS,CAAA;AAAA,IAC7C;AAEA,IAAA,GAAA,iBAAI,OAAA,6BAAS,WAAA,EAAW;AACtB,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,SAAA,CAAU,GAAG,CAAA;AAAA,MACvB,EAAA,MAAA,CAAS,GAAA,EAAK;AACZ,QAAA,4CAAA,IAAa,CAAK,MAAA,CAAO,MAAA,EAAQ,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,wBAAA,EAA0B;AAAA,UACvF,KAAA,EAAO,IAAA,WAAe,MAAA,EAAQ,GAAA,CAAI,QAAA,EAAU,MAAA,CAAO,GAAG;AAAA,QACxD,CAAC,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,EAAO,KAAA,EAAO,cAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAEvC,IAAA,GAAA,CAAI,YAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG;AACxB,MAAA,MAAM,SAAA,EAAW,IAAA,CAAK,KAAA;AACtB,MAAA,MAAM,gBAAA,EAAkB,qBAAA,CAAsB,QAAA,CAAS,OAAO,CAAA;AAE9D,MAAA,MAAMC,KAAAA,EAAM,IAAA,CAAK,UAAA,CAAW,GAAA,EAAK;AAAA,QAC/B,UAAA,EAAY,QAAA,CAAS,MAAA;AAAA,QACrB,OAAA,EAAS,eAAA;AAAA,QACT,IAAA,EAAM,mBAAA,CAAoB,IAAA,EAAM,QAAQ,CAAA;AAAA,QACxC,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI;AAAA,MACtB,CAAC,CAAA;AAED,MAAA,GAAA,iBAAI,OAAA,6BAAS,YAAA,EAAY;AACvB,QAAA,IAAI;AACF,UAAA,OAAA,CAAQ,UAAA,CAAW,GAAA,EAAKA,IAAG,CAAA;AAAA,QAC7B,EAAA,MAAA,CAAS,GAAA,EAAK;AACZ,UAAA,4CAAA;AAAA,YACE,IAAA,CAAK,MAAA,CAAO,MAAA;AAAA,YACZ,MAAA;AAAA,YACA,IAAA,CAAK,MAAA,CAAO,QAAA;AAAA,YACZ,yBAAA;AAAA,YACA,EAAE,KAAA,EAAO,IAAA,WAAe,MAAA,EAAQ,GAAA,CAAI,QAAA,EAAU,MAAA,CAAO,GAAG,EAAE;AAAA,UAC5D,CAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,EAAQ,aAAA,CAAM,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAKrC,IAAA,MAAM,CAAC,aAAa,EAAA,EAAI,KAAA,EAAO,yBAAA,CAAgB,aAAA,CAAc,IAAA,CAAK,KAAK,CAAA;AAEvE,IAAA,MAAM,IAAA,EAAM,IAAA,CAAK,UAAA;AAAA,MACf,GAAA;AAAA,MACA;AAAA,QACE,UAAA,EAAY,aAAA,CAAc,MAAA;AAAA,QAC1B,OAAA,EAAS,qBAAA,CAAsB,aAAA,CAAc,OAAO,CAAA;AAAA,QACpD,IAAA,EAAM,KAAA,CAAA;AAAA,QACN,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI;AAAA,MACtB,CAAA;AAAA,MACA;AAAA,IACF,CAAA;AAEA,IAAA,GAAA,iBAAI,OAAA,6BAAS,SAAA,EAAS;AACpB,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAK,KAAK,CAAA;AAAA,MAC5B,EAAA,MAAA,CAAS,QAAA,EAAU;AACjB,QAAA,4CAAA,IAAa,CAAK,MAAA,CAAO,MAAA,EAAQ,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,sBAAA,EAAwB;AAAA,UACrF,KAAA,EAAO,SAAA,WAAoB,MAAA,EAAQ,QAAA,CAAS,QAAA,EAAU,MAAA,CAAO,QAAQ;AAAA,QACvE,CAAC,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,GAAA,iBAAI,OAAA,6BAAS,YAAA,EAAY;AACvB,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,UAAA,CAAW,GAAA,EAAK,GAAG,CAAA;AAAA,MAC7B,EAAA,MAAA,CAAS,QAAA,EAAU;AACjB,QAAA,4CAAA;AAAA,UACE,IAAA,CAAK,MAAA,CAAO,MAAA;AAAA,UACZ,MAAA;AAAA,UACA,IAAA,CAAK,MAAA,CAAO,QAAA;AAAA,UACZ,yBAAA;AAAA,UACA;AAAA,YACE,KAAA,EAAO,SAAA,WAAoB,MAAA,EAAQ,QAAA,CAAS,QAAA,EAAU,MAAA,CAAO,QAAQ;AAAA,UACvE;AAAA,QACF,CAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,KAAA,EAAO,cAAA,CAAO,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA;AAAA,EAC3C,CAAC,CAAA,CAAA;AACL;AAKO,SAAS,cAAA,CACd,OAAA,EACyB;AACzB,EAAA,OAAO,wDAAA,OAAgC,CAAA;AACzC;AAKO,IAAM,mBAAA,EAIT,cAAA,CAAO,GAAA,CAAI,2BAAA,CAAkB,iBAAA,EAAmB,CAAC,OAAA,EAAA,GAAY,wDAAA,OAAgC,CAAC,CAAA;AAElG,SAAS,qBAAA,CAAsB,OAAA,EAA6D;AAC1F,EAAA,MAAM,OAAA,EAA4C,CAAC,CAAA;AACnD,EAAA,IAAA,CAAA,MAAW,CAAC,GAAA,EAAK,KAAK,EAAA,GAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,IAAA,GAAA,CAAI,OAAO,MAAA,IAAU,QAAA,EAAU;AAC7B,MAAA,MAAA,CAAO,GAAG,EAAA,EAAI,KAAA;AAAA,IAChB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAA,CAAa,GAAA,EAAa,OAAA,EAAoD;AACrF,EAAA,GAAA,CAAI,GAAA,CAAI,UAAA,CAAW,SAAS,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,UAAU,CAAA,EAAG;AAC3D,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,EAAO,OAAA,CAAQ,MAAM,CAAA;AAC3B,EAAA,GAAA,CAAI,CAAC,KAAA,GAAQ,OAAO,KAAA,IAAS,QAAA,EAAU;AACrC,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAA,OAAA,EAAU,IAAI,CAAA,EAAA;AACvB;AAES;AAIW,EAAA;AACI,EAAA;AAEA,EAAA;AACJ,EAAA;AACC,IAAA;AACC,IAAA;AACJ,IAAA;AACP,IAAA;AACT,EAAA;AACO,EAAA;AACT;ADhFwB;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/xray-emitter-js/xray-emitter-js/dist/effect.cjs","sourcesContent":[null,"import { Cause, Effect, Exit, Option } from 'effect';\nimport { Headers, HttpApp, HttpRouter, HttpServerError, HttpServerRequest } from '@effect/platform';\nimport type {\n CaptureConfig,\n NormalizedRequest,\n RedactionConfig,\n RequestLog,\n XrayContext,\n XrayEmitter,\n XrayRuntimeConfig,\n} from '../core/index';\nimport { createEmitter as createFetchEmitter } from '../fetch/fetch';\nimport {\n bindContextToObject,\n getXrayContextFromObject,\n logWithLevel,\n makeCapturedBody,\n setCaptureOverride,\n setContextRequestId,\n setContextRoute,\n setRedactionOverride,\n} from '../core/internal';\n\nexport { createEmitter as createCoreEmitter } from '../fetch/fetch';\nexport type {\n CaptureConfig,\n RedactionConfig,\n RequestLog,\n XrayConfig,\n XrayContext,\n XrayEmitter,\n XrayRuntimeConfig,\n} from '../core/index';\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\ntype EffectMiddleware = <E, R>(httpApp: HttpApp.Default<E, R>) => HttpApp.Default<E, R>;\n\ntype EffectEmitter = EffectMiddleware & {\n flush: XrayEmitter['flush'];\n shutdown: XrayEmitter['shutdown'];\n};\n\nexport function createEmitter(config: XrayRuntimeConfig, options?: WrapOptions): EffectEmitter {\n const emitter = createFetchEmitter(config);\n const middleware = createEffectMiddleware(emitter, options) as EffectEmitter;\n middleware.flush = emitter.flush;\n middleware.shutdown = emitter.shutdown;\n return middleware;\n}\n\nexport function createEffectMiddleware(xray: XrayEmitter, options?: WrapOptions): EffectMiddleware {\n return (<E, R>(httpApp: HttpApp.Default<E, R>): HttpApp.Default<E, R> =>\n Effect.gen(function* () {\n const request = yield* HttpServerRequest.HttpServerRequest;\n\n const headers = effectHeadersToRecord(request.headers);\n const url = buildFullUrl(request.originalUrl, headers);\n\n // Try to read the route pattern from HttpRouter.RouteContext (available\n // when the middleware is applied via HttpRouter.use).\n const routeCtxOption = yield* Effect.serviceOption(HttpRouter.RouteContext);\n const route = Option.isSome(routeCtxOption)\n ? String(routeCtxOption.value.route.path)\n : options?.route;\n\n // Capture request body if configured.\n const captureReqBody = xray.config.capture.requestBody;\n let requestBody: NormalizedRequest['body'];\n if (captureReqBody && captureReqBody !== 'none') {\n const textResult = yield* Effect.either(request.text);\n if (textResult._tag === 'Right') {\n const bytes = new TextEncoder().encode(textResult.right);\n const maxBytes = xray.config.capture.maxBodyBytes;\n const truncated = bytes.length > maxBytes;\n const slice = truncated ? bytes.slice(0, maxBytes) : bytes;\n requestBody = makeCapturedBody(slice, bytes.length, truncated, captureReqBody);\n }\n }\n\n const normalizedRequest: NormalizedRequest = {\n method: request.method,\n url,\n route,\n headers,\n body: requestBody,\n requestId: options?.requestId,\n remoteAddress:\n request.remoteAddress._tag === 'Some' ? request.remoteAddress.value : undefined,\n startTimeMs: Date.now(),\n };\n\n const ctx = xray.startRequest(normalizedRequest);\n bindContextToObject(request, ctx);\n\n if (options?.requestId) {\n setContextRequestId(ctx, options.requestId);\n }\n if (route) {\n setContextRoute(ctx, 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 exit = yield* Effect.exit(httpApp);\n\n if (Exit.isSuccess(exit)) {\n const response = exit.value;\n const responseHeaders = effectHeadersToRecord(response.headers);\n\n const log = xray.endRequest(ctx, {\n statusCode: response.status,\n headers: responseHeaders,\n body: captureResponseBody(xray, response),\n endTimeMs: Date.now(),\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 { error: err instanceof Error ? err.message : String(err) },\n );\n }\n }\n\n return response;\n }\n\n const error = Cause.squash(exit.cause);\n\n // Resolve the HTTP response that the platform would send for this error\n // (e.g. 404 for RouteNotFound, 500 for unhandled). This mirrors what\n // HttpApp.toWebHandler does internally via causeResponse.\n const [errorResponse] = yield* HttpServerError.causeResponse(exit.cause);\n\n const log = xray.endRequest(\n ctx,\n {\n statusCode: errorResponse.status,\n headers: effectHeadersToRecord(errorResponse.headers),\n body: undefined,\n endTimeMs: Date.now(),\n },\n error,\n );\n\n if (options?.onError) {\n try {\n options.onError(ctx, error);\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\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\n return yield* Effect.failCause(exit.cause);\n })) as EffectMiddleware;\n}\n\n/**\n * Retrieve the XrayContext bound to a request object.\n */\nexport function getXrayContext(\n request: HttpServerRequest.HttpServerRequest,\n): XrayContext | undefined {\n return getXrayContextFromObject(request);\n}\n\n/**\n * Effect that retrieves the XrayContext from the current HttpServerRequest in scope.\n */\nexport const currentXrayContext: Effect.Effect<\n XrayContext | undefined,\n never,\n HttpServerRequest.HttpServerRequest\n> = Effect.map(HttpServerRequest.HttpServerRequest, (request) => getXrayContextFromObject(request));\n\nfunction effectHeadersToRecord(headers: Headers.Headers): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {};\n for (const [key, value] of Object.entries(headers)) {\n if (typeof value === 'string') {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction buildFullUrl(url: string, headers: Record<string, string | string[]>): string {\n if (url.startsWith('http://') || url.startsWith('https://')) {\n return url;\n }\n const host = headers['host'];\n if (!host || typeof host !== 'string') {\n return url;\n }\n return `http://${host}${url}`;\n}\n\nfunction captureResponseBody(\n xray: XrayEmitter,\n response: { body: { _tag: string; body?: unknown; contentLength?: number } },\n): ReturnType<typeof makeCapturedBody> {\n const mode = xray.config.capture.responseBody;\n if (!mode || mode === 'none') return undefined;\n\n const body = response.body;\n if (body._tag === 'Uint8Array' && body.body instanceof Uint8Array) {\n const maxBytes = xray.config.capture.maxBodyBytes;\n const truncated = body.body.length > maxBytes;\n const slice = truncated ? body.body.slice(0, maxBytes) : body.body;\n return makeCapturedBody(slice, body.body.length, truncated, mode);\n }\n return undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/xray-emitter-js/xray-emitter-js/dist/effect.cjs","../src/effect/effect.ts"],"names":["createEmitter","log"],"mappings":"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","file":"/home/runner/work/xray-emitter-js/xray-emitter-js/dist/effect.cjs","sourcesContent":[null,"import { Cause, Effect, Exit, Option } from 'effect';\nimport { Headers, HttpApp, HttpRouter, HttpServerError, HttpServerRequest } from '@effect/platform';\nimport type {\n CaptureConfig,\n NormalizedRequest,\n RedactionConfig,\n RequestLog,\n XrayContext,\n XrayEmitter,\n XrayRuntimeConfig,\n} from '../core/index';\nimport { createEmitter as createFetchEmitter } from '../fetch/fetch';\nimport {\n bindContextToObject,\n getXrayContextFromObject,\n logWithLevel,\n makeCapturedBody,\n setCaptureOverride,\n setContextRequestId,\n setContextRoute,\n setRedactionOverride,\n} from '../core/internal';\n\nexport { createEmitter as createCoreEmitter } from '../fetch/fetch';\nexport type {\n CaptureConfig,\n RedactionConfig,\n RequestLog,\n XrayConfig,\n XrayContext,\n XrayEmitter,\n XrayRuntimeConfig,\n} from '../core/index';\n\nexport interface WrapOptions {\n /**\n * Explicit route pattern for this handler (for example `/users/:id`).\n */\n route?: string;\n /**\n * Explicit request ID. Skips header lookup/generation when provided.\n */\n requestId?: string;\n /**\n * Per-handler capture overrides.\n */\n capture?: Partial<CaptureConfig>;\n /**\n * Per-handler redaction overrides.\n */\n redaction?: Partial<RedactionConfig>;\n /**\n * Hook called after request context is created.\n */\n onRequest?: (ctx: XrayContext) => void;\n /**\n * Hook called after the request has been finalized and logged.\n */\n onResponse?: (ctx: XrayContext, log: RequestLog) => void;\n /**\n * Hook called when request handling fails.\n */\n onError?: (ctx: XrayContext, err: unknown) => void;\n}\n\ntype EffectMiddleware = <E, R>(httpApp: HttpApp.Default<E, R>) => HttpApp.Default<E, R>;\n\ntype EffectEmitter = EffectMiddleware & {\n flush: XrayEmitter['flush'];\n shutdown: XrayEmitter['shutdown'];\n};\n\n/**\n * Create Effect middleware and expose `flush()`/`shutdown()`.\n */\nexport function createEmitter(config: XrayRuntimeConfig, options?: WrapOptions): EffectEmitter {\n const emitter = createFetchEmitter(config);\n const middleware = createEffectMiddleware(emitter, options) as EffectEmitter;\n middleware.flush = emitter.flush;\n middleware.shutdown = emitter.shutdown;\n return middleware;\n}\n\n/**\n * Create Effect middleware from an existing core `XrayEmitter`.\n */\nexport function createEffectMiddleware(xray: XrayEmitter, options?: WrapOptions): EffectMiddleware {\n return (<E, R>(httpApp: HttpApp.Default<E, R>): HttpApp.Default<E, R> =>\n Effect.gen(function* () {\n const request = yield* HttpServerRequest.HttpServerRequest;\n\n const headers = effectHeadersToRecord(request.headers);\n const url = buildFullUrl(request.originalUrl, headers);\n\n // Try to read the route pattern from HttpRouter.RouteContext (available\n // when the middleware is applied via HttpRouter.use).\n const routeCtxOption = yield* Effect.serviceOption(HttpRouter.RouteContext);\n const route = Option.isSome(routeCtxOption)\n ? String(routeCtxOption.value.route.path)\n : options?.route;\n\n // Capture request body if configured.\n const captureReqBody = xray.config.capture.requestBody;\n let requestBody: NormalizedRequest['body'];\n if (captureReqBody && captureReqBody !== 'none') {\n const textResult = yield* Effect.either(request.text);\n if (textResult._tag === 'Right') {\n const bytes = new TextEncoder().encode(textResult.right);\n const maxBytes = xray.config.capture.maxBodyBytes;\n const truncated = bytes.length > maxBytes;\n const slice = truncated ? bytes.slice(0, maxBytes) : bytes;\n requestBody = makeCapturedBody(slice, bytes.length, truncated, captureReqBody);\n }\n }\n\n const normalizedRequest: NormalizedRequest = {\n method: request.method,\n url,\n route,\n headers,\n body: requestBody,\n requestId: options?.requestId,\n remoteAddress:\n request.remoteAddress._tag === 'Some' ? request.remoteAddress.value : undefined,\n startTimeMs: Date.now(),\n };\n\n const ctx = xray.startRequest(normalizedRequest);\n bindContextToObject(request, ctx);\n\n if (options?.requestId) {\n setContextRequestId(ctx, options.requestId);\n }\n if (route) {\n setContextRoute(ctx, 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 exit = yield* Effect.exit(httpApp);\n\n if (Exit.isSuccess(exit)) {\n const response = exit.value;\n const responseHeaders = effectHeadersToRecord(response.headers);\n\n const log = xray.endRequest(ctx, {\n statusCode: response.status,\n headers: responseHeaders,\n body: captureResponseBody(xray, response),\n endTimeMs: Date.now(),\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 { error: err instanceof Error ? err.message : String(err) },\n );\n }\n }\n\n return response;\n }\n\n const error = Cause.squash(exit.cause);\n\n // Resolve the HTTP response that the platform would send for this error\n // (e.g. 404 for RouteNotFound, 500 for unhandled). This mirrors what\n // HttpApp.toWebHandler does internally via causeResponse.\n const [errorResponse] = yield* HttpServerError.causeResponse(exit.cause);\n\n const log = xray.endRequest(\n ctx,\n {\n statusCode: errorResponse.status,\n headers: effectHeadersToRecord(errorResponse.headers),\n body: undefined,\n endTimeMs: Date.now(),\n },\n error,\n );\n\n if (options?.onError) {\n try {\n options.onError(ctx, error);\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\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\n return yield* Effect.failCause(exit.cause);\n })) as EffectMiddleware;\n}\n\n/**\n * Retrieve the XrayContext bound to a request object.\n */\nexport function getXrayContext(\n request: HttpServerRequest.HttpServerRequest,\n): XrayContext | undefined {\n return getXrayContextFromObject(request);\n}\n\n/**\n * Effect that retrieves the XrayContext from the current HttpServerRequest in scope.\n */\nexport const currentXrayContext: Effect.Effect<\n XrayContext | undefined,\n never,\n HttpServerRequest.HttpServerRequest\n> = Effect.map(HttpServerRequest.HttpServerRequest, (request) => getXrayContextFromObject(request));\n\nfunction effectHeadersToRecord(headers: Headers.Headers): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {};\n for (const [key, value] of Object.entries(headers)) {\n if (typeof value === 'string') {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction buildFullUrl(url: string, headers: Record<string, string | string[]>): string {\n if (url.startsWith('http://') || url.startsWith('https://')) {\n return url;\n }\n const host = headers['host'];\n if (!host || typeof host !== 'string') {\n return url;\n }\n return `http://${host}${url}`;\n}\n\nfunction captureResponseBody(\n xray: XrayEmitter,\n response: { body: { _tag: string; body?: unknown; contentLength?: number } },\n): ReturnType<typeof makeCapturedBody> {\n const mode = xray.config.capture.responseBody;\n if (!mode || mode === 'none') return undefined;\n\n const body = response.body;\n if (body._tag === 'Uint8Array' && body.body instanceof Uint8Array) {\n const maxBytes = xray.config.capture.maxBodyBytes;\n const truncated = body.body.length > maxBytes;\n const slice = truncated ? body.body.slice(0, maxBytes) : body.body;\n return makeCapturedBody(slice, body.body.length, truncated, mode);\n }\n return undefined;\n}\n"]}
|
package/dist/effect.d.cts
CHANGED
|
@@ -1,17 +1,38 @@
|
|
|
1
1
|
import { Effect } from 'effect';
|
|
2
2
|
import { HttpApp, HttpServerRequest } from '@effect/platform';
|
|
3
|
-
import { e as CaptureConfig, f as RedactionConfig, d as XrayContext, R as RequestLog, j as XrayRuntimeConfig, a as XrayEmitter } from './types-
|
|
4
|
-
export { X as XrayConfig } from './types-
|
|
5
|
-
export { c as createCoreEmitter } from './emitter-
|
|
3
|
+
import { e as CaptureConfig, f as RedactionConfig, d as XrayContext, R as RequestLog, j as XrayRuntimeConfig, a as XrayEmitter } from './types-BrKvhHbn.cjs';
|
|
4
|
+
export { X as XrayConfig } from './types-BrKvhHbn.cjs';
|
|
5
|
+
export { c as createCoreEmitter } from './emitter-Bi_m_w5h.cjs';
|
|
6
6
|
import '@opentelemetry/sdk-trace-base';
|
|
7
7
|
|
|
8
8
|
interface WrapOptions {
|
|
9
|
+
/**
|
|
10
|
+
* Explicit route pattern for this handler (for example `/users/:id`).
|
|
11
|
+
*/
|
|
9
12
|
route?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Explicit request ID. Skips header lookup/generation when provided.
|
|
15
|
+
*/
|
|
10
16
|
requestId?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Per-handler capture overrides.
|
|
19
|
+
*/
|
|
11
20
|
capture?: Partial<CaptureConfig>;
|
|
21
|
+
/**
|
|
22
|
+
* Per-handler redaction overrides.
|
|
23
|
+
*/
|
|
12
24
|
redaction?: Partial<RedactionConfig>;
|
|
25
|
+
/**
|
|
26
|
+
* Hook called after request context is created.
|
|
27
|
+
*/
|
|
13
28
|
onRequest?: (ctx: XrayContext) => void;
|
|
29
|
+
/**
|
|
30
|
+
* Hook called after the request has been finalized and logged.
|
|
31
|
+
*/
|
|
14
32
|
onResponse?: (ctx: XrayContext, log: RequestLog) => void;
|
|
33
|
+
/**
|
|
34
|
+
* Hook called when request handling fails.
|
|
35
|
+
*/
|
|
15
36
|
onError?: (ctx: XrayContext, err: unknown) => void;
|
|
16
37
|
}
|
|
17
38
|
type EffectMiddleware = <E, R>(httpApp: HttpApp.Default<E, R>) => HttpApp.Default<E, R>;
|
|
@@ -19,7 +40,13 @@ type EffectEmitter = EffectMiddleware & {
|
|
|
19
40
|
flush: XrayEmitter['flush'];
|
|
20
41
|
shutdown: XrayEmitter['shutdown'];
|
|
21
42
|
};
|
|
43
|
+
/**
|
|
44
|
+
* Create Effect middleware and expose `flush()`/`shutdown()`.
|
|
45
|
+
*/
|
|
22
46
|
declare function createEmitter(config: XrayRuntimeConfig, options?: WrapOptions): EffectEmitter;
|
|
47
|
+
/**
|
|
48
|
+
* Create Effect middleware from an existing core `XrayEmitter`.
|
|
49
|
+
*/
|
|
23
50
|
declare function createEffectMiddleware(xray: XrayEmitter, options?: WrapOptions): EffectMiddleware;
|
|
24
51
|
/**
|
|
25
52
|
* Retrieve the XrayContext bound to a request object.
|
package/dist/effect.d.ts
CHANGED
|
@@ -1,17 +1,38 @@
|
|
|
1
1
|
import { Effect } from 'effect';
|
|
2
2
|
import { HttpApp, HttpServerRequest } from '@effect/platform';
|
|
3
|
-
import { e as CaptureConfig, f as RedactionConfig, d as XrayContext, R as RequestLog, j as XrayRuntimeConfig, a as XrayEmitter } from './types-
|
|
4
|
-
export { X as XrayConfig } from './types-
|
|
5
|
-
export { c as createCoreEmitter } from './emitter-
|
|
3
|
+
import { e as CaptureConfig, f as RedactionConfig, d as XrayContext, R as RequestLog, j as XrayRuntimeConfig, a as XrayEmitter } from './types-BrKvhHbn.js';
|
|
4
|
+
export { X as XrayConfig } from './types-BrKvhHbn.js';
|
|
5
|
+
export { c as createCoreEmitter } from './emitter-Dy7bRGTq.js';
|
|
6
6
|
import '@opentelemetry/sdk-trace-base';
|
|
7
7
|
|
|
8
8
|
interface WrapOptions {
|
|
9
|
+
/**
|
|
10
|
+
* Explicit route pattern for this handler (for example `/users/:id`).
|
|
11
|
+
*/
|
|
9
12
|
route?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Explicit request ID. Skips header lookup/generation when provided.
|
|
15
|
+
*/
|
|
10
16
|
requestId?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Per-handler capture overrides.
|
|
19
|
+
*/
|
|
11
20
|
capture?: Partial<CaptureConfig>;
|
|
21
|
+
/**
|
|
22
|
+
* Per-handler redaction overrides.
|
|
23
|
+
*/
|
|
12
24
|
redaction?: Partial<RedactionConfig>;
|
|
25
|
+
/**
|
|
26
|
+
* Hook called after request context is created.
|
|
27
|
+
*/
|
|
13
28
|
onRequest?: (ctx: XrayContext) => void;
|
|
29
|
+
/**
|
|
30
|
+
* Hook called after the request has been finalized and logged.
|
|
31
|
+
*/
|
|
14
32
|
onResponse?: (ctx: XrayContext, log: RequestLog) => void;
|
|
33
|
+
/**
|
|
34
|
+
* Hook called when request handling fails.
|
|
35
|
+
*/
|
|
15
36
|
onError?: (ctx: XrayContext, err: unknown) => void;
|
|
16
37
|
}
|
|
17
38
|
type EffectMiddleware = <E, R>(httpApp: HttpApp.Default<E, R>) => HttpApp.Default<E, R>;
|
|
@@ -19,7 +40,13 @@ type EffectEmitter = EffectMiddleware & {
|
|
|
19
40
|
flush: XrayEmitter['flush'];
|
|
20
41
|
shutdown: XrayEmitter['shutdown'];
|
|
21
42
|
};
|
|
43
|
+
/**
|
|
44
|
+
* Create Effect middleware and expose `flush()`/`shutdown()`.
|
|
45
|
+
*/
|
|
22
46
|
declare function createEmitter(config: XrayRuntimeConfig, options?: WrapOptions): EffectEmitter;
|
|
47
|
+
/**
|
|
48
|
+
* Create Effect middleware from an existing core `XrayEmitter`.
|
|
49
|
+
*/
|
|
23
50
|
declare function createEffectMiddleware(xray: XrayEmitter, options?: WrapOptions): EffectMiddleware;
|
|
24
51
|
/**
|
|
25
52
|
* Retrieve the XrayContext bound to a request object.
|
package/dist/effect.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createEmitter
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-DV3MVQBB.js";
|
|
4
|
+
import "./chunk-GYXI3DWB.js";
|
|
5
5
|
import {
|
|
6
6
|
bindContextToObject,
|
|
7
7
|
getXrayContextFromObject,
|
|
@@ -9,11 +9,11 @@ import {
|
|
|
9
9
|
setContextRequestId,
|
|
10
10
|
setContextRoute,
|
|
11
11
|
setRedactionOverride
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-NTIUR3OC.js";
|
|
13
13
|
import {
|
|
14
14
|
logWithLevel,
|
|
15
15
|
makeCapturedBody
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-7KT6EPVZ.js";
|
|
17
17
|
|
|
18
18
|
// src/effect/effect.ts
|
|
19
19
|
import { Cause, Effect, Exit, Option } from "effect";
|
package/dist/effect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/effect/effect.ts"],"sourcesContent":["import { Cause, Effect, Exit, Option } from 'effect';\nimport { Headers, HttpApp, HttpRouter, HttpServerError, HttpServerRequest } from '@effect/platform';\nimport type {\n CaptureConfig,\n NormalizedRequest,\n RedactionConfig,\n RequestLog,\n XrayContext,\n XrayEmitter,\n XrayRuntimeConfig,\n} from '../core/index';\nimport { createEmitter as createFetchEmitter } from '../fetch/fetch';\nimport {\n bindContextToObject,\n getXrayContextFromObject,\n logWithLevel,\n makeCapturedBody,\n setCaptureOverride,\n setContextRequestId,\n setContextRoute,\n setRedactionOverride,\n} from '../core/internal';\n\nexport { createEmitter as createCoreEmitter } from '../fetch/fetch';\nexport type {\n CaptureConfig,\n RedactionConfig,\n RequestLog,\n XrayConfig,\n XrayContext,\n XrayEmitter,\n XrayRuntimeConfig,\n} from '../core/index';\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\ntype EffectMiddleware = <E, R>(httpApp: HttpApp.Default<E, R>) => HttpApp.Default<E, R>;\n\ntype EffectEmitter = EffectMiddleware & {\n flush: XrayEmitter['flush'];\n shutdown: XrayEmitter['shutdown'];\n};\n\nexport function createEmitter(config: XrayRuntimeConfig, options?: WrapOptions): EffectEmitter {\n const emitter = createFetchEmitter(config);\n const middleware = createEffectMiddleware(emitter, options) as EffectEmitter;\n middleware.flush = emitter.flush;\n middleware.shutdown = emitter.shutdown;\n return middleware;\n}\n\nexport function createEffectMiddleware(xray: XrayEmitter, options?: WrapOptions): EffectMiddleware {\n return (<E, R>(httpApp: HttpApp.Default<E, R>): HttpApp.Default<E, R> =>\n Effect.gen(function* () {\n const request = yield* HttpServerRequest.HttpServerRequest;\n\n const headers = effectHeadersToRecord(request.headers);\n const url = buildFullUrl(request.originalUrl, headers);\n\n // Try to read the route pattern from HttpRouter.RouteContext (available\n // when the middleware is applied via HttpRouter.use).\n const routeCtxOption = yield* Effect.serviceOption(HttpRouter.RouteContext);\n const route = Option.isSome(routeCtxOption)\n ? String(routeCtxOption.value.route.path)\n : options?.route;\n\n // Capture request body if configured.\n const captureReqBody = xray.config.capture.requestBody;\n let requestBody: NormalizedRequest['body'];\n if (captureReqBody && captureReqBody !== 'none') {\n const textResult = yield* Effect.either(request.text);\n if (textResult._tag === 'Right') {\n const bytes = new TextEncoder().encode(textResult.right);\n const maxBytes = xray.config.capture.maxBodyBytes;\n const truncated = bytes.length > maxBytes;\n const slice = truncated ? bytes.slice(0, maxBytes) : bytes;\n requestBody = makeCapturedBody(slice, bytes.length, truncated, captureReqBody);\n }\n }\n\n const normalizedRequest: NormalizedRequest = {\n method: request.method,\n url,\n route,\n headers,\n body: requestBody,\n requestId: options?.requestId,\n remoteAddress:\n request.remoteAddress._tag === 'Some' ? request.remoteAddress.value : undefined,\n startTimeMs: Date.now(),\n };\n\n const ctx = xray.startRequest(normalizedRequest);\n bindContextToObject(request, ctx);\n\n if (options?.requestId) {\n setContextRequestId(ctx, options.requestId);\n }\n if (route) {\n setContextRoute(ctx, 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 exit = yield* Effect.exit(httpApp);\n\n if (Exit.isSuccess(exit)) {\n const response = exit.value;\n const responseHeaders = effectHeadersToRecord(response.headers);\n\n const log = xray.endRequest(ctx, {\n statusCode: response.status,\n headers: responseHeaders,\n body: captureResponseBody(xray, response),\n endTimeMs: Date.now(),\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 { error: err instanceof Error ? err.message : String(err) },\n );\n }\n }\n\n return response;\n }\n\n const error = Cause.squash(exit.cause);\n\n // Resolve the HTTP response that the platform would send for this error\n // (e.g. 404 for RouteNotFound, 500 for unhandled). This mirrors what\n // HttpApp.toWebHandler does internally via causeResponse.\n const [errorResponse] = yield* HttpServerError.causeResponse(exit.cause);\n\n const log = xray.endRequest(\n ctx,\n {\n statusCode: errorResponse.status,\n headers: effectHeadersToRecord(errorResponse.headers),\n body: undefined,\n endTimeMs: Date.now(),\n },\n error,\n );\n\n if (options?.onError) {\n try {\n options.onError(ctx, error);\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\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\n return yield* Effect.failCause(exit.cause);\n })) as EffectMiddleware;\n}\n\n/**\n * Retrieve the XrayContext bound to a request object.\n */\nexport function getXrayContext(\n request: HttpServerRequest.HttpServerRequest,\n): XrayContext | undefined {\n return getXrayContextFromObject(request);\n}\n\n/**\n * Effect that retrieves the XrayContext from the current HttpServerRequest in scope.\n */\nexport const currentXrayContext: Effect.Effect<\n XrayContext | undefined,\n never,\n HttpServerRequest.HttpServerRequest\n> = Effect.map(HttpServerRequest.HttpServerRequest, (request) => getXrayContextFromObject(request));\n\nfunction effectHeadersToRecord(headers: Headers.Headers): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {};\n for (const [key, value] of Object.entries(headers)) {\n if (typeof value === 'string') {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction buildFullUrl(url: string, headers: Record<string, string | string[]>): string {\n if (url.startsWith('http://') || url.startsWith('https://')) {\n return url;\n }\n const host = headers['host'];\n if (!host || typeof host !== 'string') {\n return url;\n }\n return `http://${host}${url}`;\n}\n\nfunction captureResponseBody(\n xray: XrayEmitter,\n response: { body: { _tag: string; body?: unknown; contentLength?: number } },\n): ReturnType<typeof makeCapturedBody> {\n const mode = xray.config.capture.responseBody;\n if (!mode || mode === 'none') return undefined;\n\n const body = response.body;\n if (body._tag === 'Uint8Array' && body.body instanceof Uint8Array) {\n const maxBytes = xray.config.capture.maxBodyBytes;\n const truncated = body.body.length > maxBytes;\n const slice = truncated ? body.body.slice(0, maxBytes) : body.body;\n return makeCapturedBody(slice, body.body.length, truncated, mode);\n }\n return undefined;\n}\n"],"mappings":"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","names":["createEmitter","log"]}
|
|
1
|
+
{"version":3,"sources":["../src/effect/effect.ts"],"sourcesContent":["import { Cause, Effect, Exit, Option } from 'effect';\nimport { Headers, HttpApp, HttpRouter, HttpServerError, HttpServerRequest } from '@effect/platform';\nimport type {\n CaptureConfig,\n NormalizedRequest,\n RedactionConfig,\n RequestLog,\n XrayContext,\n XrayEmitter,\n XrayRuntimeConfig,\n} from '../core/index';\nimport { createEmitter as createFetchEmitter } from '../fetch/fetch';\nimport {\n bindContextToObject,\n getXrayContextFromObject,\n logWithLevel,\n makeCapturedBody,\n setCaptureOverride,\n setContextRequestId,\n setContextRoute,\n setRedactionOverride,\n} from '../core/internal';\n\nexport { createEmitter as createCoreEmitter } from '../fetch/fetch';\nexport type {\n CaptureConfig,\n RedactionConfig,\n RequestLog,\n XrayConfig,\n XrayContext,\n XrayEmitter,\n XrayRuntimeConfig,\n} from '../core/index';\n\nexport interface WrapOptions {\n /**\n * Explicit route pattern for this handler (for example `/users/:id`).\n */\n route?: string;\n /**\n * Explicit request ID. Skips header lookup/generation when provided.\n */\n requestId?: string;\n /**\n * Per-handler capture overrides.\n */\n capture?: Partial<CaptureConfig>;\n /**\n * Per-handler redaction overrides.\n */\n redaction?: Partial<RedactionConfig>;\n /**\n * Hook called after request context is created.\n */\n onRequest?: (ctx: XrayContext) => void;\n /**\n * Hook called after the request has been finalized and logged.\n */\n onResponse?: (ctx: XrayContext, log: RequestLog) => void;\n /**\n * Hook called when request handling fails.\n */\n onError?: (ctx: XrayContext, err: unknown) => void;\n}\n\ntype EffectMiddleware = <E, R>(httpApp: HttpApp.Default<E, R>) => HttpApp.Default<E, R>;\n\ntype EffectEmitter = EffectMiddleware & {\n flush: XrayEmitter['flush'];\n shutdown: XrayEmitter['shutdown'];\n};\n\n/**\n * Create Effect middleware and expose `flush()`/`shutdown()`.\n */\nexport function createEmitter(config: XrayRuntimeConfig, options?: WrapOptions): EffectEmitter {\n const emitter = createFetchEmitter(config);\n const middleware = createEffectMiddleware(emitter, options) as EffectEmitter;\n middleware.flush = emitter.flush;\n middleware.shutdown = emitter.shutdown;\n return middleware;\n}\n\n/**\n * Create Effect middleware from an existing core `XrayEmitter`.\n */\nexport function createEffectMiddleware(xray: XrayEmitter, options?: WrapOptions): EffectMiddleware {\n return (<E, R>(httpApp: HttpApp.Default<E, R>): HttpApp.Default<E, R> =>\n Effect.gen(function* () {\n const request = yield* HttpServerRequest.HttpServerRequest;\n\n const headers = effectHeadersToRecord(request.headers);\n const url = buildFullUrl(request.originalUrl, headers);\n\n // Try to read the route pattern from HttpRouter.RouteContext (available\n // when the middleware is applied via HttpRouter.use).\n const routeCtxOption = yield* Effect.serviceOption(HttpRouter.RouteContext);\n const route = Option.isSome(routeCtxOption)\n ? String(routeCtxOption.value.route.path)\n : options?.route;\n\n // Capture request body if configured.\n const captureReqBody = xray.config.capture.requestBody;\n let requestBody: NormalizedRequest['body'];\n if (captureReqBody && captureReqBody !== 'none') {\n const textResult = yield* Effect.either(request.text);\n if (textResult._tag === 'Right') {\n const bytes = new TextEncoder().encode(textResult.right);\n const maxBytes = xray.config.capture.maxBodyBytes;\n const truncated = bytes.length > maxBytes;\n const slice = truncated ? bytes.slice(0, maxBytes) : bytes;\n requestBody = makeCapturedBody(slice, bytes.length, truncated, captureReqBody);\n }\n }\n\n const normalizedRequest: NormalizedRequest = {\n method: request.method,\n url,\n route,\n headers,\n body: requestBody,\n requestId: options?.requestId,\n remoteAddress:\n request.remoteAddress._tag === 'Some' ? request.remoteAddress.value : undefined,\n startTimeMs: Date.now(),\n };\n\n const ctx = xray.startRequest(normalizedRequest);\n bindContextToObject(request, ctx);\n\n if (options?.requestId) {\n setContextRequestId(ctx, options.requestId);\n }\n if (route) {\n setContextRoute(ctx, 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 exit = yield* Effect.exit(httpApp);\n\n if (Exit.isSuccess(exit)) {\n const response = exit.value;\n const responseHeaders = effectHeadersToRecord(response.headers);\n\n const log = xray.endRequest(ctx, {\n statusCode: response.status,\n headers: responseHeaders,\n body: captureResponseBody(xray, response),\n endTimeMs: Date.now(),\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 { error: err instanceof Error ? err.message : String(err) },\n );\n }\n }\n\n return response;\n }\n\n const error = Cause.squash(exit.cause);\n\n // Resolve the HTTP response that the platform would send for this error\n // (e.g. 404 for RouteNotFound, 500 for unhandled). This mirrors what\n // HttpApp.toWebHandler does internally via causeResponse.\n const [errorResponse] = yield* HttpServerError.causeResponse(exit.cause);\n\n const log = xray.endRequest(\n ctx,\n {\n statusCode: errorResponse.status,\n headers: effectHeadersToRecord(errorResponse.headers),\n body: undefined,\n endTimeMs: Date.now(),\n },\n error,\n );\n\n if (options?.onError) {\n try {\n options.onError(ctx, error);\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\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\n return yield* Effect.failCause(exit.cause);\n })) as EffectMiddleware;\n}\n\n/**\n * Retrieve the XrayContext bound to a request object.\n */\nexport function getXrayContext(\n request: HttpServerRequest.HttpServerRequest,\n): XrayContext | undefined {\n return getXrayContextFromObject(request);\n}\n\n/**\n * Effect that retrieves the XrayContext from the current HttpServerRequest in scope.\n */\nexport const currentXrayContext: Effect.Effect<\n XrayContext | undefined,\n never,\n HttpServerRequest.HttpServerRequest\n> = Effect.map(HttpServerRequest.HttpServerRequest, (request) => getXrayContextFromObject(request));\n\nfunction effectHeadersToRecord(headers: Headers.Headers): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {};\n for (const [key, value] of Object.entries(headers)) {\n if (typeof value === 'string') {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction buildFullUrl(url: string, headers: Record<string, string | string[]>): string {\n if (url.startsWith('http://') || url.startsWith('https://')) {\n return url;\n }\n const host = headers['host'];\n if (!host || typeof host !== 'string') {\n return url;\n }\n return `http://${host}${url}`;\n}\n\nfunction captureResponseBody(\n xray: XrayEmitter,\n response: { body: { _tag: string; body?: unknown; contentLength?: number } },\n): ReturnType<typeof makeCapturedBody> {\n const mode = xray.config.capture.responseBody;\n if (!mode || mode === 'none') return undefined;\n\n const body = response.body;\n if (body._tag === 'Uint8Array' && body.body instanceof Uint8Array) {\n const maxBytes = xray.config.capture.maxBodyBytes;\n const truncated = body.body.length > maxBytes;\n const slice = truncated ? body.body.slice(0, maxBytes) : body.body;\n return makeCapturedBody(slice, body.body.length, truncated, mode);\n }\n return undefined;\n}\n"],"mappings":"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","names":["createEmitter","log"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { j as XrayRuntimeConfig, a as XrayEmitter } from './types-BrKvhHbn.cjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Create a fetch/edge runtime emitter using OTLP HTTP transport by default.
|
|
5
|
+
*
|
|
6
|
+
* Pass `config.exporter.instance` to provide a custom `SpanExporter`.
|
|
7
|
+
*/
|
|
8
|
+
declare function createEmitter(config: XrayRuntimeConfig): XrayEmitter;
|
|
9
|
+
|
|
10
|
+
export { createEmitter as c };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { j as XrayRuntimeConfig, a as XrayEmitter } from './types-BrKvhHbn.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Create a fetch/edge runtime emitter using OTLP HTTP transport by default.
|
|
5
|
+
*
|
|
6
|
+
* Pass `config.exporter.instance` to provide a custom `SpanExporter`.
|
|
7
|
+
*/
|
|
8
|
+
declare function createEmitter(config: XrayRuntimeConfig): XrayEmitter;
|
|
9
|
+
|
|
10
|
+
export { createEmitter as c };
|
package/dist/express.cjs
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
5
|
-
require('./chunk-
|
|
6
|
-
require('./chunk-
|
|
7
|
-
require('./chunk-
|
|
4
|
+
var _chunk55YD27PVcjs = require('./chunk-55YD27PV.cjs');
|
|
5
|
+
require('./chunk-UJWD5CFA.cjs');
|
|
6
|
+
require('./chunk-CPHFCOA5.cjs');
|
|
7
|
+
require('./chunk-DNBARLGB.cjs');
|
|
8
8
|
|
|
9
9
|
// src/express/express.ts
|
|
10
10
|
function createEmitter2(config, options) {
|
|
11
|
-
const emitter =
|
|
11
|
+
const emitter = _chunk55YD27PVcjs.createEmitter.call(void 0, config);
|
|
12
12
|
const middleware = createExpressMiddleware(emitter, options);
|
|
13
13
|
middleware.flush = emitter.flush;
|
|
14
14
|
middleware.shutdown = emitter.shutdown;
|
|
@@ -16,7 +16,7 @@ function createEmitter2(config, options) {
|
|
|
16
16
|
}
|
|
17
17
|
function createExpressMiddleware(xray, options) {
|
|
18
18
|
return (req, res, next) => {
|
|
19
|
-
const wrapped =
|
|
19
|
+
const wrapped = _chunk55YD27PVcjs.wrapHttpHandler.call(void 0,
|
|
20
20
|
() => {
|
|
21
21
|
next();
|
|
22
22
|
},
|
|
@@ -41,5 +41,5 @@ function createExpressMiddleware(xray, options) {
|
|
|
41
41
|
|
|
42
42
|
|
|
43
43
|
|
|
44
|
-
exports.createCoreEmitter =
|
|
44
|
+
exports.createCoreEmitter = _chunk55YD27PVcjs.createEmitter; exports.createEmitter = createEmitter2; exports.createExpressMiddleware = createExpressMiddleware;
|
|
45
45
|
//# sourceMappingURL=express.cjs.map
|
package/dist/express.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/xray-emitter-js/xray-emitter-js/dist/express.cjs","../src/express/express.ts"],"names":["createEmitter"],"mappings":"AAAA;AACE;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B;AACA;
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/xray-emitter-js/xray-emitter-js/dist/express.cjs","../src/express/express.ts"],"names":["createEmitter"],"mappings":"AAAA;AACE;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B;AACA;AC0BO,SAASA,cAAAA,CAAc,MAAA,EAA2B,OAAA,EAAuC;AAC9F,EAAA,MAAM,QAAA,EAAU,6CAAA,MAAwB,CAAA;AACxC,EAAA,MAAM,WAAA,EAAa,uBAAA,CAAwB,OAAA,EAAS,OAAO,CAAA;AAC3D,EAAA,UAAA,CAAW,MAAA,EAAQ,OAAA,CAAQ,KAAA;AAC3B,EAAA,UAAA,CAAW,SAAA,EAAW,OAAA,CAAQ,QAAA;AAC9B,EAAA,OAAO,UAAA;AACT;AAKO,SAAS,uBAAA,CACd,IAAA,EACA,OAAA,EACmB;AACnB,EAAA,OAAO,CAAC,GAAA,EAAK,GAAA,EAAK,IAAA,EAAA,GAAS;AACzB,IAAA,MAAM,QAAA,EAAU,+CAAA;AAAA,MACd,CAAA,EAAA,GAAM;AACJ,QAAA,IAAA,CAAK,CAAA;AAAA,MACP,CAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,QACE,GAAG,OAAA;AAAA,QACH,SAAA,EAAW,CAAC,GAAA,EAAA,GAAqB;AAC/B,UAAC,GAAA,CAA4C,KAAA,EAAO,GAAA;AACpD,2BAAC,GAAA,CAA0D,MAAA,UAAA,CAA1D,GAAA,CAA0D,OAAA,EAAW,CAAC,CAAA,GAAA;AACvE,UACG,GAAA,CAAyD,MAAA,CAG1D,KAAA,EAAO,GAAA;AACT,0BAAA,OAAA,2BAAS,SAAA,0BAAA,CAAY,GAAG,GAAA;AAAA,QAC1B;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,OAAA,EAAS,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC/B,IAAA,GAAA,CAAI,OAAA,GAAU,OAAQ,MAAA,CAAyB,MAAA,IAAU,UAAA,EAAY;AACnE,MAAA,KAAM,MAAA,CAAyB,KAAA,CAAM,IAAI,CAAA;AAAA,IAC3C;AAAA,EACF,CAAA;AACF;ADpCA;AACE;AACA;AACA;AACF,+JAAC","file":"/home/runner/work/xray-emitter-js/xray-emitter-js/dist/express.cjs","sourcesContent":[null,"import type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { XrayEmitter, XrayContext, XrayRuntimeConfig } from '../core/index';\nimport {\n createEmitter as createNodeEmitter,\n wrapHttpHandler,\n type WrapOptions,\n} from '../node/node';\n\nexport { createNodeEmitter as createCoreEmitter };\nexport type {\n CaptureConfig,\n RedactionConfig,\n RequestLog,\n XrayConfig,\n XrayContext,\n XrayEmitter,\n XrayRuntimeConfig,\n} from '../core/index';\nexport type { WrapOptions } from '../node/node';\n\ntype NextFunction = (err?: unknown) => void;\n\n// copy types from Express to avoid a package dependency\ntype ExpressMiddleware = (req: IncomingMessage, res: ServerResponse, next: NextFunction) => void;\n\ntype ExpressEmitter = ExpressMiddleware & {\n flush: XrayEmitter['flush'];\n shutdown: XrayEmitter['shutdown'];\n};\n\n/**\n * Create Express middleware that instruments requests and exposes\n * `flush()`/`shutdown()` on the returned middleware function.\n */\nexport function createEmitter(config: XrayRuntimeConfig, options?: WrapOptions): ExpressEmitter {\n const emitter = createNodeEmitter(config);\n const middleware = createExpressMiddleware(emitter, options) as ExpressEmitter;\n middleware.flush = emitter.flush;\n middleware.shutdown = emitter.shutdown;\n return middleware;\n}\n\n/**\n * Create Express middleware from an existing core `XrayEmitter`.\n */\nexport function createExpressMiddleware(\n xray: XrayEmitter,\n options?: WrapOptions,\n): ExpressMiddleware {\n return (req, res, next) => {\n const wrapped = wrapHttpHandler(\n () => {\n next();\n },\n xray,\n {\n ...options,\n onRequest: (ctx: XrayContext) => {\n (req as typeof req & { xray?: XrayContext }).xray = ctx;\n (res as typeof res & { locals?: Record<string, unknown> }).locals ??= {};\n (\n (res as typeof res & { locals: Record<string, unknown> }).locals as {\n xray?: XrayContext;\n }\n ).xray = ctx;\n options?.onRequest?.(ctx);\n },\n },\n );\n\n const result = wrapped(req, res);\n if (result && typeof (result as Promise<void>).catch === 'function') {\n void (result as Promise<void>).catch(next);\n }\n };\n}\n"]}
|
package/dist/express.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
-
import { j as XrayRuntimeConfig, a as XrayEmitter } from './types-
|
|
3
|
-
export { e as CaptureConfig, f as RedactionConfig, R as RequestLog, X as XrayConfig, d as XrayContext } from './types-
|
|
2
|
+
import { j as XrayRuntimeConfig, a as XrayEmitter } from './types-BrKvhHbn.cjs';
|
|
3
|
+
export { e as CaptureConfig, f as RedactionConfig, R as RequestLog, X as XrayConfig, d as XrayContext } from './types-BrKvhHbn.cjs';
|
|
4
4
|
import { WrapOptions } from './node.cjs';
|
|
5
5
|
export { createEmitter as createCoreEmitter } from './node.cjs';
|
|
6
6
|
import '@opentelemetry/sdk-trace-base';
|
|
@@ -11,7 +11,14 @@ type ExpressEmitter = ExpressMiddleware & {
|
|
|
11
11
|
flush: XrayEmitter['flush'];
|
|
12
12
|
shutdown: XrayEmitter['shutdown'];
|
|
13
13
|
};
|
|
14
|
+
/**
|
|
15
|
+
* Create Express middleware that instruments requests and exposes
|
|
16
|
+
* `flush()`/`shutdown()` on the returned middleware function.
|
|
17
|
+
*/
|
|
14
18
|
declare function createEmitter(config: XrayRuntimeConfig, options?: WrapOptions): ExpressEmitter;
|
|
19
|
+
/**
|
|
20
|
+
* Create Express middleware from an existing core `XrayEmitter`.
|
|
21
|
+
*/
|
|
15
22
|
declare function createExpressMiddleware(xray: XrayEmitter, options?: WrapOptions): ExpressMiddleware;
|
|
16
23
|
|
|
17
24
|
export { WrapOptions, XrayEmitter, XrayRuntimeConfig, createEmitter, createExpressMiddleware };
|
package/dist/express.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
-
import { j as XrayRuntimeConfig, a as XrayEmitter } from './types-
|
|
3
|
-
export { e as CaptureConfig, f as RedactionConfig, R as RequestLog, X as XrayConfig, d as XrayContext } from './types-
|
|
2
|
+
import { j as XrayRuntimeConfig, a as XrayEmitter } from './types-BrKvhHbn.js';
|
|
3
|
+
export { e as CaptureConfig, f as RedactionConfig, R as RequestLog, X as XrayConfig, d as XrayContext } from './types-BrKvhHbn.js';
|
|
4
4
|
import { WrapOptions } from './node.js';
|
|
5
5
|
export { createEmitter as createCoreEmitter } from './node.js';
|
|
6
6
|
import '@opentelemetry/sdk-trace-base';
|
|
@@ -11,7 +11,14 @@ type ExpressEmitter = ExpressMiddleware & {
|
|
|
11
11
|
flush: XrayEmitter['flush'];
|
|
12
12
|
shutdown: XrayEmitter['shutdown'];
|
|
13
13
|
};
|
|
14
|
+
/**
|
|
15
|
+
* Create Express middleware that instruments requests and exposes
|
|
16
|
+
* `flush()`/`shutdown()` on the returned middleware function.
|
|
17
|
+
*/
|
|
14
18
|
declare function createEmitter(config: XrayRuntimeConfig, options?: WrapOptions): ExpressEmitter;
|
|
19
|
+
/**
|
|
20
|
+
* Create Express middleware from an existing core `XrayEmitter`.
|
|
21
|
+
*/
|
|
15
22
|
declare function createExpressMiddleware(xray: XrayEmitter, options?: WrapOptions): ExpressMiddleware;
|
|
16
23
|
|
|
17
24
|
export { WrapOptions, XrayEmitter, XrayRuntimeConfig, createEmitter, createExpressMiddleware };
|
package/dist/express.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createEmitter,
|
|
3
3
|
wrapHttpHandler
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-FGXXKIF7.js";
|
|
5
|
+
import "./chunk-GYXI3DWB.js";
|
|
6
|
+
import "./chunk-NTIUR3OC.js";
|
|
7
|
+
import "./chunk-7KT6EPVZ.js";
|
|
8
8
|
|
|
9
9
|
// src/express/express.ts
|
|
10
10
|
function createEmitter2(config, options) {
|
package/dist/express.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/express/express.ts"],"sourcesContent":["import type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { XrayEmitter, XrayContext, XrayRuntimeConfig } from '../core/index';\nimport {\n createEmitter as createNodeEmitter,\n wrapHttpHandler,\n type WrapOptions,\n} from '../node/node';\n\nexport { createNodeEmitter as createCoreEmitter };\nexport type {\n CaptureConfig,\n RedactionConfig,\n RequestLog,\n XrayConfig,\n XrayContext,\n XrayEmitter,\n XrayRuntimeConfig,\n} from '../core/index';\nexport type { WrapOptions } from '../node/node';\n\ntype NextFunction = (err?: unknown) => void;\n\n// copy types from Express to avoid a package dependency\ntype ExpressMiddleware = (req: IncomingMessage, res: ServerResponse, next: NextFunction) => void;\n\ntype ExpressEmitter = ExpressMiddleware & {\n flush: XrayEmitter['flush'];\n shutdown: XrayEmitter['shutdown'];\n};\n\nexport function createEmitter(config: XrayRuntimeConfig, options?: WrapOptions): ExpressEmitter {\n const emitter = createNodeEmitter(config);\n const middleware = createExpressMiddleware(emitter, options) as ExpressEmitter;\n middleware.flush = emitter.flush;\n middleware.shutdown = emitter.shutdown;\n return middleware;\n}\n\nexport function createExpressMiddleware(\n xray: XrayEmitter,\n options?: WrapOptions,\n): ExpressMiddleware {\n return (req, res, next) => {\n const wrapped = wrapHttpHandler(\n () => {\n next();\n },\n xray,\n {\n ...options,\n onRequest: (ctx: XrayContext) => {\n (req as typeof req & { xray?: XrayContext }).xray = ctx;\n (res as typeof res & { locals?: Record<string, unknown> }).locals ??= {};\n (\n (res as typeof res & { locals: Record<string, unknown> }).locals as {\n xray?: XrayContext;\n }\n ).xray = ctx;\n options?.onRequest?.(ctx);\n },\n },\n );\n\n const result = wrapped(req, res);\n if (result && typeof (result as Promise<void>).catch === 'function') {\n void (result as Promise<void>).catch(next);\n }\n };\n}\n"],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"sources":["../src/express/express.ts"],"sourcesContent":["import type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { XrayEmitter, XrayContext, XrayRuntimeConfig } from '../core/index';\nimport {\n createEmitter as createNodeEmitter,\n wrapHttpHandler,\n type WrapOptions,\n} from '../node/node';\n\nexport { createNodeEmitter as createCoreEmitter };\nexport type {\n CaptureConfig,\n RedactionConfig,\n RequestLog,\n XrayConfig,\n XrayContext,\n XrayEmitter,\n XrayRuntimeConfig,\n} from '../core/index';\nexport type { WrapOptions } from '../node/node';\n\ntype NextFunction = (err?: unknown) => void;\n\n// copy types from Express to avoid a package dependency\ntype ExpressMiddleware = (req: IncomingMessage, res: ServerResponse, next: NextFunction) => void;\n\ntype ExpressEmitter = ExpressMiddleware & {\n flush: XrayEmitter['flush'];\n shutdown: XrayEmitter['shutdown'];\n};\n\n/**\n * Create Express middleware that instruments requests and exposes\n * `flush()`/`shutdown()` on the returned middleware function.\n */\nexport function createEmitter(config: XrayRuntimeConfig, options?: WrapOptions): ExpressEmitter {\n const emitter = createNodeEmitter(config);\n const middleware = createExpressMiddleware(emitter, options) as ExpressEmitter;\n middleware.flush = emitter.flush;\n middleware.shutdown = emitter.shutdown;\n return middleware;\n}\n\n/**\n * Create Express middleware from an existing core `XrayEmitter`.\n */\nexport function createExpressMiddleware(\n xray: XrayEmitter,\n options?: WrapOptions,\n): ExpressMiddleware {\n return (req, res, next) => {\n const wrapped = wrapHttpHandler(\n () => {\n next();\n },\n xray,\n {\n ...options,\n onRequest: (ctx: XrayContext) => {\n (req as typeof req & { xray?: XrayContext }).xray = ctx;\n (res as typeof res & { locals?: Record<string, unknown> }).locals ??= {};\n (\n (res as typeof res & { locals: Record<string, unknown> }).locals as {\n xray?: XrayContext;\n }\n ).xray = ctx;\n options?.onRequest?.(ctx);\n },\n },\n );\n\n const result = wrapped(req, res);\n if (result && typeof (result as Promise<void>).catch === 'function') {\n void (result as Promise<void>).catch(next);\n }\n };\n}\n"],"mappings":";;;;;;;;;AAkCO,SAASA,eAAc,QAA2B,SAAuC;AAC9F,QAAM,UAAU,cAAkB,MAAM;AACxC,QAAM,aAAa,wBAAwB,SAAS,OAAO;AAC3D,aAAW,QAAQ,QAAQ;AAC3B,aAAW,WAAW,QAAQ;AAC9B,SAAO;AACT;AAKO,SAAS,wBACd,MACA,SACmB;AACnB,SAAO,CAAC,KAAK,KAAK,SAAS;AACzB,UAAM,UAAU;AAAA,MACd,MAAM;AACJ,aAAK;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,WAAW,CAAC,QAAqB;AAC/B,UAAC,IAA4C,OAAO;AACpD,UAAC,IAA0D,WAA1D,IAA0D,SAAW,CAAC;AACvE,UACG,IAAyD,OAG1D,OAAO;AACT,mBAAS,YAAY,GAAG;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS,QAAQ,KAAK,GAAG;AAC/B,QAAI,UAAU,OAAQ,OAAyB,UAAU,YAAY;AACnE,WAAM,OAAyB,MAAM,IAAI;AAAA,IAC3C;AAAA,EACF;AACF;","names":["createEmitter"]}
|
package/dist/fastify.cjs
CHANGED
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
var
|
|
6
|
-
require('./chunk-
|
|
5
|
+
var _chunk55YD27PVcjs = require('./chunk-55YD27PV.cjs');
|
|
6
|
+
require('./chunk-UJWD5CFA.cjs');
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
var
|
|
10
|
-
require('./chunk-
|
|
9
|
+
var _chunkCPHFCOA5cjs = require('./chunk-CPHFCOA5.cjs');
|
|
10
|
+
require('./chunk-DNBARLGB.cjs');
|
|
11
11
|
|
|
12
12
|
// src/fastify/fastify.ts
|
|
13
13
|
function createEmitter2(config, options) {
|
|
14
|
-
const emitter =
|
|
14
|
+
const emitter = _chunk55YD27PVcjs.createEmitter.call(void 0, config);
|
|
15
15
|
const register = ((instance) => {
|
|
16
16
|
addFastifyHooks(instance, emitter, options);
|
|
17
17
|
});
|
|
@@ -20,7 +20,7 @@ function createEmitter2(config, options) {
|
|
|
20
20
|
return register;
|
|
21
21
|
}
|
|
22
22
|
function addFastifyHooks(instance, xray, options) {
|
|
23
|
-
const nodeHandler =
|
|
23
|
+
const nodeHandler = _chunk55YD27PVcjs.wrapHttpHandler.call(void 0, () => {
|
|
24
24
|
}, xray, {
|
|
25
25
|
...options,
|
|
26
26
|
onRequest: (ctx) => {
|
|
@@ -37,7 +37,7 @@ function addFastifyHooks(instance, xray, options) {
|
|
|
37
37
|
return;
|
|
38
38
|
}
|
|
39
39
|
nodeHandler(req.raw, res.raw);
|
|
40
|
-
req.xray =
|
|
40
|
+
req.xray = _chunk55YD27PVcjs.getXrayContext.call(void 0, req.raw);
|
|
41
41
|
next();
|
|
42
42
|
}
|
|
43
43
|
);
|
|
@@ -47,9 +47,9 @@ function addFastifyHooks(instance, xray, options) {
|
|
|
47
47
|
const anyReq = request;
|
|
48
48
|
const route = _optionalChain([anyReq, 'access', _3 => _3.routeOptions, 'optionalAccess', _4 => _4.url]);
|
|
49
49
|
if (route && anyReq.raw) {
|
|
50
|
-
const ctx =
|
|
50
|
+
const ctx = _chunk55YD27PVcjs.getXrayContext.call(void 0, anyReq.raw);
|
|
51
51
|
if (ctx) {
|
|
52
|
-
|
|
52
|
+
_chunkCPHFCOA5cjs.setContextRoute.call(void 0, ctx, route);
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
next();
|
|
@@ -60,5 +60,5 @@ function addFastifyHooks(instance, xray, options) {
|
|
|
60
60
|
|
|
61
61
|
|
|
62
62
|
|
|
63
|
-
exports.addFastifyHooks = addFastifyHooks; exports.createCoreEmitter =
|
|
63
|
+
exports.addFastifyHooks = addFastifyHooks; exports.createCoreEmitter = _chunk55YD27PVcjs.createEmitter; exports.createEmitter = createEmitter2;
|
|
64
64
|
//# sourceMappingURL=fastify.cjs.map
|
package/dist/fastify.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/xray-emitter-js/xray-emitter-js/dist/fastify.cjs","../src/fastify/fastify.ts"],"names":["createEmitter"],"mappings":"AAAA;AACE;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACA;
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/xray-emitter-js/xray-emitter-js/dist/fastify.cjs","../src/fastify/fastify.ts"],"names":["createEmitter"],"mappings":"AAAA;AACE;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACA;AC2BO,SAASA,cAAAA,CAAc,MAAA,EAA2B,OAAA,EAAuC;AAC9F,EAAA,MAAM,QAAA,EAAU,6CAAA,MAAwB,CAAA;AACxC,EAAA,MAAM,SAAA,EAAA,CAAY,CAAC,QAAA,EAAA,GAA8B;AAC/C,IAAA,eAAA,CAAgB,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC5C,CAAA,CAAA;AACA,EAAA,QAAA,CAAS,MAAA,EAAQ,OAAA,CAAQ,KAAA;AACzB,EAAA,QAAA,CAAS,SAAA,EAAW,OAAA,CAAQ,QAAA;AAC5B,EAAA,OAAO,QAAA;AACT;AAKO,SAAS,eAAA,CACd,QAAA,EACA,IAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,YAAA,EAAc,+CAAA,CAAgB,EAAA,GAAM;AAAA,EAAC,CAAA,EAAG,IAAA,EAAM;AAAA,IAClD,GAAG,OAAA;AAAA,IACH,SAAA,EAAW,CAAC,GAAA,EAAA,GAAqB;AAC/B,sBAAA,OAAA,2BAAS,SAAA,0BAAA,CAAY,GAAG,GAAA;AAAA,IAC1B;AAAA,EACF,CAAC,CAAA;AAED,EAAA,QAAA,CAAS,OAAA;AAAA,IACP,WAAA;AAAA,IACA,CAAC,OAAA,EAAkB,KAAA,EAAgB,IAAA,EAAA,GAAkC;AACnE,MAAA,MAAM,IAAA,EAAM,OAAA;AAIZ,MAAA,MAAM,IAAA,EAAM,KAAA;AACZ,MAAA,GAAA,CAAI,CAAC,GAAA,CAAI,IAAA,GAAO,CAAC,GAAA,CAAI,GAAA,EAAK;AACxB,QAAA,IAAA,CAAK,CAAA;AACL,QAAA,MAAA;AAAA,MACF;AACA,MAAA,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,GAAA,CAAI,GAAG,CAAA;AAC5B,MAAA,GAAA,CAAI,KAAA,EAAO,8CAAA,GAAe,CAAI,GAAG,CAAA;AACjC,MAAA,IAAA,CAAK,CAAA;AAAA,IACP;AAAA,EACF,CAAA;AAEA,EAAA,QAAA,CAAS,OAAA;AAAA,IACP,YAAA;AAAA,IACA,CAAC,OAAA,EAAkB,MAAA,EAAiB,IAAA,EAAA,GAAkC;AACpE,MAAA,MAAM,OAAA,EAAS,OAAA;AAIf,MAAA,MAAM,MAAA,kBAAQ,MAAA,qBAAO,YAAA,6BAAc,KAAA;AACnC,MAAA,GAAA,CAAI,MAAA,GAAS,MAAA,CAAO,GAAA,EAAK;AACvB,QAAA,MAAM,IAAA,EAAM,8CAAA,MAAe,CAAO,GAAG,CAAA;AACrC,QAAA,GAAA,CAAI,GAAA,EAAK;AACP,UAAA,+CAAA,GAAgB,EAAK,KAAK,CAAA;AAAA,QAC5B;AAAA,MACF;AACA,MAAA,IAAA,CAAK,CAAA;AAAA,IACP;AAAA,EACF,CAAA;AACF;ADxCA;AACE;AACA;AACA;AACF,+IAAC","file":"/home/runner/work/xray-emitter-js/xray-emitter-js/dist/fastify.cjs","sourcesContent":[null,"import type { XrayEmitter, XrayContext, XrayRuntimeConfig } from '../core/index';\nimport { setContextRoute } from '../core/internal';\nimport {\n createEmitter as createNodeEmitter,\n wrapHttpHandler,\n getXrayContext,\n type WrapOptions,\n} from '../node/node';\n\nexport { createNodeEmitter as createCoreEmitter };\nexport type {\n CaptureConfig,\n RedactionConfig,\n RequestLog,\n XrayConfig,\n XrayContext,\n XrayEmitter,\n XrayRuntimeConfig,\n} from '../core/index';\nexport type { WrapOptions } from '../node/node';\n\n// copy types from Fastify to avoid a package dependency\ntype FastifyInstance = {\n addHook: {\n (name: 'onRequest', hook: (...args: any[]) => unknown): void;\n (name: 'preHandler', hook: (...args: any[]) => unknown): void;\n };\n};\n\ntype FastifyEmitter = ((instance: FastifyInstance) => void) & {\n flush: XrayEmitter['flush'];\n shutdown: XrayEmitter['shutdown'];\n};\n\n/**\n * Create a Fastify plugin-style registrar that installs X-ray hooks and\n * exposes `flush()`/`shutdown()`.\n */\nexport function createEmitter(config: XrayRuntimeConfig, options?: WrapOptions): FastifyEmitter {\n const emitter = createNodeEmitter(config);\n const register = ((instance: FastifyInstance) => {\n addFastifyHooks(instance, emitter, options);\n }) as FastifyEmitter;\n register.flush = emitter.flush;\n register.shutdown = emitter.shutdown;\n return register;\n}\n\n/**\n * Add X-ray request lifecycle hooks to an existing Fastify instance.\n */\nexport function addFastifyHooks(\n instance: FastifyInstance,\n xray: XrayEmitter,\n options?: WrapOptions,\n): void {\n const nodeHandler = wrapHttpHandler(() => {}, xray, {\n ...options,\n onRequest: (ctx: XrayContext) => {\n options?.onRequest?.(ctx);\n },\n });\n\n instance.addHook(\n 'onRequest',\n (request: unknown, reply: unknown, next: (err?: unknown) => void) => {\n const req = request as {\n raw?: Parameters<typeof nodeHandler>[0];\n xray?: XrayContext;\n };\n const res = reply as { raw?: Parameters<typeof nodeHandler>[1] };\n if (!req.raw || !res.raw) {\n next();\n return;\n }\n nodeHandler(req.raw, res.raw);\n req.xray = getXrayContext(req.raw);\n next();\n },\n );\n\n instance.addHook(\n 'preHandler',\n (request: unknown, _reply: unknown, next: (err?: unknown) => void) => {\n const anyReq = request as {\n routeOptions?: { url?: string };\n raw?: Parameters<typeof nodeHandler>[0];\n };\n const route = anyReq.routeOptions?.url;\n if (route && anyReq.raw) {\n const ctx = getXrayContext(anyReq.raw);\n if (ctx) {\n setContextRoute(ctx, route);\n }\n }\n next();\n },\n );\n}\n"]}
|
package/dist/fastify.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { j as XrayRuntimeConfig, a as XrayEmitter } from './types-
|
|
2
|
-
export { e as CaptureConfig, f as RedactionConfig, R as RequestLog, X as XrayConfig, d as XrayContext } from './types-
|
|
1
|
+
import { j as XrayRuntimeConfig, a as XrayEmitter } from './types-BrKvhHbn.cjs';
|
|
2
|
+
export { e as CaptureConfig, f as RedactionConfig, R as RequestLog, X as XrayConfig, d as XrayContext } from './types-BrKvhHbn.cjs';
|
|
3
3
|
import { WrapOptions } from './node.cjs';
|
|
4
4
|
export { createEmitter as createCoreEmitter } from './node.cjs';
|
|
5
5
|
import '@opentelemetry/sdk-trace-base';
|
|
@@ -15,7 +15,14 @@ type FastifyEmitter = ((instance: FastifyInstance) => void) & {
|
|
|
15
15
|
flush: XrayEmitter['flush'];
|
|
16
16
|
shutdown: XrayEmitter['shutdown'];
|
|
17
17
|
};
|
|
18
|
+
/**
|
|
19
|
+
* Create a Fastify plugin-style registrar that installs X-ray hooks and
|
|
20
|
+
* exposes `flush()`/`shutdown()`.
|
|
21
|
+
*/
|
|
18
22
|
declare function createEmitter(config: XrayRuntimeConfig, options?: WrapOptions): FastifyEmitter;
|
|
23
|
+
/**
|
|
24
|
+
* Add X-ray request lifecycle hooks to an existing Fastify instance.
|
|
25
|
+
*/
|
|
19
26
|
declare function addFastifyHooks(instance: FastifyInstance, xray: XrayEmitter, options?: WrapOptions): void;
|
|
20
27
|
|
|
21
28
|
export { WrapOptions, XrayEmitter, XrayRuntimeConfig, addFastifyHooks, createEmitter };
|
package/dist/fastify.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { j as XrayRuntimeConfig, a as XrayEmitter } from './types-
|
|
2
|
-
export { e as CaptureConfig, f as RedactionConfig, R as RequestLog, X as XrayConfig, d as XrayContext } from './types-
|
|
1
|
+
import { j as XrayRuntimeConfig, a as XrayEmitter } from './types-BrKvhHbn.js';
|
|
2
|
+
export { e as CaptureConfig, f as RedactionConfig, R as RequestLog, X as XrayConfig, d as XrayContext } from './types-BrKvhHbn.js';
|
|
3
3
|
import { WrapOptions } from './node.js';
|
|
4
4
|
export { createEmitter as createCoreEmitter } from './node.js';
|
|
5
5
|
import '@opentelemetry/sdk-trace-base';
|
|
@@ -15,7 +15,14 @@ type FastifyEmitter = ((instance: FastifyInstance) => void) & {
|
|
|
15
15
|
flush: XrayEmitter['flush'];
|
|
16
16
|
shutdown: XrayEmitter['shutdown'];
|
|
17
17
|
};
|
|
18
|
+
/**
|
|
19
|
+
* Create a Fastify plugin-style registrar that installs X-ray hooks and
|
|
20
|
+
* exposes `flush()`/`shutdown()`.
|
|
21
|
+
*/
|
|
18
22
|
declare function createEmitter(config: XrayRuntimeConfig, options?: WrapOptions): FastifyEmitter;
|
|
23
|
+
/**
|
|
24
|
+
* Add X-ray request lifecycle hooks to an existing Fastify instance.
|
|
25
|
+
*/
|
|
19
26
|
declare function addFastifyHooks(instance: FastifyInstance, xray: XrayEmitter, options?: WrapOptions): void;
|
|
20
27
|
|
|
21
28
|
export { WrapOptions, XrayEmitter, XrayRuntimeConfig, addFastifyHooks, createEmitter };
|
package/dist/fastify.js
CHANGED
|
@@ -2,12 +2,12 @@ import {
|
|
|
2
2
|
createEmitter,
|
|
3
3
|
getXrayContext,
|
|
4
4
|
wrapHttpHandler
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-FGXXKIF7.js";
|
|
6
|
+
import "./chunk-GYXI3DWB.js";
|
|
7
7
|
import {
|
|
8
8
|
setContextRoute
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-NTIUR3OC.js";
|
|
10
|
+
import "./chunk-7KT6EPVZ.js";
|
|
11
11
|
|
|
12
12
|
// src/fastify/fastify.ts
|
|
13
13
|
function createEmitter2(config, options) {
|
package/dist/fastify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/fastify/fastify.ts"],"sourcesContent":["import type { XrayEmitter, XrayContext, XrayRuntimeConfig } from '../core/index';\nimport { setContextRoute } from '../core/internal';\nimport {\n createEmitter as createNodeEmitter,\n wrapHttpHandler,\n getXrayContext,\n type WrapOptions,\n} from '../node/node';\n\nexport { createNodeEmitter as createCoreEmitter };\nexport type {\n CaptureConfig,\n RedactionConfig,\n RequestLog,\n XrayConfig,\n XrayContext,\n XrayEmitter,\n XrayRuntimeConfig,\n} from '../core/index';\nexport type { WrapOptions } from '../node/node';\n\n// copy types from Fastify to avoid a package dependency\ntype FastifyInstance = {\n addHook: {\n (name: 'onRequest', hook: (...args: any[]) => unknown): void;\n (name: 'preHandler', hook: (...args: any[]) => unknown): void;\n };\n};\n\ntype FastifyEmitter = ((instance: FastifyInstance) => void) & {\n flush: XrayEmitter['flush'];\n shutdown: XrayEmitter['shutdown'];\n};\n\nexport function createEmitter(config: XrayRuntimeConfig, options?: WrapOptions): FastifyEmitter {\n const emitter = createNodeEmitter(config);\n const register = ((instance: FastifyInstance) => {\n addFastifyHooks(instance, emitter, options);\n }) as FastifyEmitter;\n register.flush = emitter.flush;\n register.shutdown = emitter.shutdown;\n return register;\n}\n\nexport function addFastifyHooks(\n instance: FastifyInstance,\n xray: XrayEmitter,\n options?: WrapOptions,\n): void {\n const nodeHandler = wrapHttpHandler(() => {}, xray, {\n ...options,\n onRequest: (ctx: XrayContext) => {\n options?.onRequest?.(ctx);\n },\n });\n\n instance.addHook(\n 'onRequest',\n (request: unknown, reply: unknown, next: (err?: unknown) => void) => {\n const req = request as {\n raw?: Parameters<typeof nodeHandler>[0];\n xray?: XrayContext;\n };\n const res = reply as { raw?: Parameters<typeof nodeHandler>[1] };\n if (!req.raw || !res.raw) {\n next();\n return;\n }\n nodeHandler(req.raw, res.raw);\n req.xray = getXrayContext(req.raw);\n next();\n },\n );\n\n instance.addHook(\n 'preHandler',\n (request: unknown, _reply: unknown, next: (err?: unknown) => void) => {\n const anyReq = request as {\n routeOptions?: { url?: string };\n raw?: Parameters<typeof nodeHandler>[0];\n };\n const route = anyReq.routeOptions?.url;\n if (route && anyReq.raw) {\n const ctx = getXrayContext(anyReq.raw);\n if (ctx) {\n setContextRoute(ctx, route);\n }\n }\n next();\n },\n );\n}\n"],"mappings":";;;;;;;;;;;;
|
|
1
|
+
{"version":3,"sources":["../src/fastify/fastify.ts"],"sourcesContent":["import type { XrayEmitter, XrayContext, XrayRuntimeConfig } from '../core/index';\nimport { setContextRoute } from '../core/internal';\nimport {\n createEmitter as createNodeEmitter,\n wrapHttpHandler,\n getXrayContext,\n type WrapOptions,\n} from '../node/node';\n\nexport { createNodeEmitter as createCoreEmitter };\nexport type {\n CaptureConfig,\n RedactionConfig,\n RequestLog,\n XrayConfig,\n XrayContext,\n XrayEmitter,\n XrayRuntimeConfig,\n} from '../core/index';\nexport type { WrapOptions } from '../node/node';\n\n// copy types from Fastify to avoid a package dependency\ntype FastifyInstance = {\n addHook: {\n (name: 'onRequest', hook: (...args: any[]) => unknown): void;\n (name: 'preHandler', hook: (...args: any[]) => unknown): void;\n };\n};\n\ntype FastifyEmitter = ((instance: FastifyInstance) => void) & {\n flush: XrayEmitter['flush'];\n shutdown: XrayEmitter['shutdown'];\n};\n\n/**\n * Create a Fastify plugin-style registrar that installs X-ray hooks and\n * exposes `flush()`/`shutdown()`.\n */\nexport function createEmitter(config: XrayRuntimeConfig, options?: WrapOptions): FastifyEmitter {\n const emitter = createNodeEmitter(config);\n const register = ((instance: FastifyInstance) => {\n addFastifyHooks(instance, emitter, options);\n }) as FastifyEmitter;\n register.flush = emitter.flush;\n register.shutdown = emitter.shutdown;\n return register;\n}\n\n/**\n * Add X-ray request lifecycle hooks to an existing Fastify instance.\n */\nexport function addFastifyHooks(\n instance: FastifyInstance,\n xray: XrayEmitter,\n options?: WrapOptions,\n): void {\n const nodeHandler = wrapHttpHandler(() => {}, xray, {\n ...options,\n onRequest: (ctx: XrayContext) => {\n options?.onRequest?.(ctx);\n },\n });\n\n instance.addHook(\n 'onRequest',\n (request: unknown, reply: unknown, next: (err?: unknown) => void) => {\n const req = request as {\n raw?: Parameters<typeof nodeHandler>[0];\n xray?: XrayContext;\n };\n const res = reply as { raw?: Parameters<typeof nodeHandler>[1] };\n if (!req.raw || !res.raw) {\n next();\n return;\n }\n nodeHandler(req.raw, res.raw);\n req.xray = getXrayContext(req.raw);\n next();\n },\n );\n\n instance.addHook(\n 'preHandler',\n (request: unknown, _reply: unknown, next: (err?: unknown) => void) => {\n const anyReq = request as {\n routeOptions?: { url?: string };\n raw?: Parameters<typeof nodeHandler>[0];\n };\n const route = anyReq.routeOptions?.url;\n if (route && anyReq.raw) {\n const ctx = getXrayContext(anyReq.raw);\n if (ctx) {\n setContextRoute(ctx, route);\n }\n }\n next();\n },\n );\n}\n"],"mappings":";;;;;;;;;;;;AAsCO,SAASA,eAAc,QAA2B,SAAuC;AAC9F,QAAM,UAAU,cAAkB,MAAM;AACxC,QAAM,YAAY,CAAC,aAA8B;AAC/C,oBAAgB,UAAU,SAAS,OAAO;AAAA,EAC5C;AACA,WAAS,QAAQ,QAAQ;AACzB,WAAS,WAAW,QAAQ;AAC5B,SAAO;AACT;AAKO,SAAS,gBACd,UACA,MACA,SACM;AACN,QAAM,cAAc,gBAAgB,MAAM;AAAA,EAAC,GAAG,MAAM;AAAA,IAClD,GAAG;AAAA,IACH,WAAW,CAAC,QAAqB;AAC/B,eAAS,YAAY,GAAG;AAAA,IAC1B;AAAA,EACF,CAAC;AAED,WAAS;AAAA,IACP;AAAA,IACA,CAAC,SAAkB,OAAgB,SAAkC;AACnE,YAAM,MAAM;AAIZ,YAAM,MAAM;AACZ,UAAI,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK;AACxB,aAAK;AACL;AAAA,MACF;AACA,kBAAY,IAAI,KAAK,IAAI,GAAG;AAC5B,UAAI,OAAO,eAAe,IAAI,GAAG;AACjC,WAAK;AAAA,IACP;AAAA,EACF;AAEA,WAAS;AAAA,IACP;AAAA,IACA,CAAC,SAAkB,QAAiB,SAAkC;AACpE,YAAM,SAAS;AAIf,YAAM,QAAQ,OAAO,cAAc;AACnC,UAAI,SAAS,OAAO,KAAK;AACvB,cAAM,MAAM,eAAe,OAAO,GAAG;AACrC,YAAI,KAAK;AACP,0BAAgB,KAAK,KAAK;AAAA,QAC5B;AAAA,MACF;AACA,WAAK;AAAA,IACP;AAAA,EACF;AACF;","names":["createEmitter"]}
|