{"version":3,"file":"workers.mjs","names":[],"sources":["../src/workers/index.ts"],"sourcesContent":["import { initLogger, createRequestLogger } from '../logger'\nimport type { LoggerConfig, RequestLogger } from '../types'\n\n/**\n * Options for createWorkersLogger\n */\nexport interface WorkersLoggerOptions {\n  /** Override the request ID (default: cf-ray header) */\n  requestId?: string\n  /** Headers to include in logs (default: none) */\n  headers?: string[]\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction collectHeaders(headers: Headers, include: string[] | undefined): Record<string, string> | undefined {\n  if (!include || include.length === 0) return undefined\n\n  const normalized = new Set(include.map(h => h.toLowerCase()))\n  const result: Record<string, string> = {}\n\n  headers.forEach((value, key) => {\n    if (normalized.has(key.toLowerCase())) {\n      result[key] = value\n    }\n  })\n\n  return Object.keys(result).length > 0 ? result : undefined\n}\n\n/**\n * Initialize mxllog for Cloudflare Workers.\n * Call once at module scope.\n *\n * @example\n * ```ts\n * initWorkersLogger({\n *   env: { service: 'my-api' },\n * })\n * ```\n */\nexport function initWorkersLogger(options: LoggerConfig = {}): void {\n  initLogger({\n    ...options,\n    pretty: false,\n    stringify: false,\n  })\n}\n\nfunction pickCfContext(request: Request): Record<string, unknown> {\n  const cf = Reflect.get(request, 'cf')\n  if (!isRecord(cf)) return {}\n\n  const out: Record<string, unknown> = {}\n  if (typeof cf.colo === 'string') out.colo = cf.colo\n  if (typeof cf.country === 'string') out.country = cf.country\n  if (typeof cf.asn === 'number') out.asn = cf.asn\n  return out\n}\n\n/**\n * Create a request-scoped logger for Cloudflare Workers.\n * Auto-extracts cf-ray, request.cf context, method, and path.\n *\n * @example\n * ```ts\n * export default {\n *   async fetch(request: Request) {\n *     const log = createWorkersLogger(request)\n *\n *     log.set({ user: { id: '123' } })\n *     log.emit({ status: 200 })\n *\n *     return new Response('ok')\n *   }\n * }\n * ```\n */\nexport function createWorkersLogger<T extends object = Record<string, unknown>>(request: Request, options: WorkersLoggerOptions = {}): RequestLogger<T> {\n  const url = new URL(request.url)\n  const cfRay = request.headers.get('cf-ray') ?? undefined\n  const traceparent = request.headers.get('traceparent') ?? undefined\n\n  const log = createRequestLogger<T>({\n    method: request.method,\n    path: url.pathname,\n    requestId: options.requestId ?? cfRay,\n  })\n\n  // Cast needed: CF-specific enrichment fields (cfRay, traceparent, etc.) aren't in user's T\n  const untyped = log as unknown as RequestLogger\n  untyped.set({\n    cfRay,\n    traceparent,\n    ...pickCfContext(request),\n    ...(options.headers ? { requestHeaders: collectHeaders(request.headers, options.headers) } : {}),\n  })\n\n  return log\n}\n"],"mappings":";;AAaA,SAAS,SAAS,OAAkD;AAClE,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM;;AAG7E,SAAS,eAAe,SAAkB,SAAmE;AAC3G,KAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO,KAAA;CAE7C,MAAM,aAAa,IAAI,IAAI,QAAQ,KAAI,MAAK,EAAE,aAAa,CAAC,CAAC;CAC7D,MAAM,SAAiC,EAAE;AAEzC,SAAQ,SAAS,OAAO,QAAQ;AAC9B,MAAI,WAAW,IAAI,IAAI,aAAa,CAAC,CACnC,QAAO,OAAO;GAEhB;AAEF,QAAO,OAAO,KAAK,OAAO,CAAC,SAAS,IAAI,SAAS,KAAA;;;;;;;;;;;;;AAcnD,SAAgB,kBAAkB,UAAwB,EAAE,EAAQ;AAClE,YAAW;EACT,GAAG;EACH,QAAQ;EACR,WAAW;EACZ,CAAC;;AAGJ,SAAS,cAAc,SAA2C;CAChE,MAAM,KAAK,QAAQ,IAAI,SAAS,KAAK;AACrC,KAAI,CAAC,SAAS,GAAG,CAAE,QAAO,EAAE;CAE5B,MAAM,MAA+B,EAAE;AACvC,KAAI,OAAO,GAAG,SAAS,SAAU,KAAI,OAAO,GAAG;AAC/C,KAAI,OAAO,GAAG,YAAY,SAAU,KAAI,UAAU,GAAG;AACrD,KAAI,OAAO,GAAG,QAAQ,SAAU,KAAI,MAAM,GAAG;AAC7C,QAAO;;;;;;;;;;;;;;;;;;;;AAqBT,SAAgB,oBAAgE,SAAkB,UAAgC,EAAE,EAAoB;CACtJ,MAAM,MAAM,IAAI,IAAI,QAAQ,IAAI;CAChC,MAAM,QAAQ,QAAQ,QAAQ,IAAI,SAAS,IAAI,KAAA;CAC/C,MAAM,cAAc,QAAQ,QAAQ,IAAI,cAAc,IAAI,KAAA;CAE1D,MAAM,MAAM,oBAAuB;EACjC,QAAQ,QAAQ;EAChB,MAAM,IAAI;EACV,WAAW,QAAQ,aAAa;EACjC,CAAC;AAGc,KACR,IAAI;EACV;EACA;EACA,GAAG,cAAc,QAAQ;EACzB,GAAI,QAAQ,UAAU,EAAE,gBAAgB,eAAe,QAAQ,SAAS,QAAQ,QAAQ,EAAE,GAAG,EAAE;EAChG,CAAC;AAEF,QAAO"}