{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { XrayEmitter, XrayContext, XrayRuntimeConfig } from '@stainlessdev/xray-core';\nimport {\n  createEmitter as createNodeEmitter,\n  wrapHttpHandler,\n  getXrayContext,\n  type WrapOptions,\n} from '@stainlessdev/xray-node';\nimport { setContextRoute } from '@stainlessdev/xray-core/internal';\n\nexport { createNodeEmitter as createCoreEmitter };\nexport type {\n  CaptureConfig,\n  RedactionConfig,\n  RequestLog,\n  XrayConfig,\n  XrayContext,\n  XrayEmitter,\n  XrayRuntimeConfig,\n} from '@stainlessdev/xray-core';\nexport type { WrapOptions } from '@stainlessdev/xray-node';\n\nexport type FastifyInstance = {\n  addHook: {\n    (name: 'onRequest', hook: (...args: any[]) => unknown): void;\n    (name: 'preHandler', hook: (...args: any[]) => unknown): void;\n  };\n};\n\nexport type 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 { raw?: Parameters<typeof nodeHandler>[0]; xray?: XrayContext };\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":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA,4CAAAA;AAAA,EAAA;AAAA;AAAA;AACA,uBAKO;AACP,sBAAgC;AA0BzB,SAAS,cAAc,QAA2B,SAAuC;AAC9F,QAAM,cAAU,iBAAAC,eAAkB,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;AAEO,SAAS,gBACd,UACA,MACA,SACM;AACN,QAAM,kBAAc,kCAAgB,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;AACZ,YAAM,MAAM;AACZ,UAAI,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK;AACxB,aAAK;AACL;AAAA,MACF;AACA,kBAAY,IAAI,KAAK,IAAI,GAAG;AAC5B,UAAI,WAAO,iCAAe,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,UAAM,iCAAe,OAAO,GAAG;AACrC,YAAI,KAAK;AACP,+CAAgB,KAAK,KAAK;AAAA,QAC5B;AAAA,MACF;AACA,WAAK;AAAA,IACP;AAAA,EACF;AACF;","names":["createNodeEmitter","createNodeEmitter"]}