{"version":3,"file":"index.cjs","names":["HttpTransport"],"sources":["../src/VictoriaLogsTransport.ts"],"sourcesContent":["import type { HttpTransportConfig } from \"@loglayer/transport-http\";\nimport { HttpTransport } from \"@loglayer/transport-http\";\n\n/**\n * Configuration options for the VictoriaLogs transport.\n * This is essentially a wrapper around HttpTransport with VictoriaLogs specific defaults.\n */\nexport interface VictoriaLogsTransportConfig extends Omit<HttpTransportConfig, \"url\" | \"payloadTemplate\"> {\n  /**\n   * The VictoriaLogs host URL (e.g., http://localhost:9428)\n   * The /insert/jsonline path will be automatically appended\n   * @default \"http://localhost:9428\"\n   */\n  url?: string;\n  /**\n   * Function to transform log data into the payload format (optional, defaults to VictoriaLogs format)\n   */\n  payloadTemplate?: (data: { logLevel: string; message: string; data?: Record<string, any> }) => string;\n  /**\n   * Function to generate stream-level fields for VictoriaLogs\n   * The keys of the returned object will be used as the values for the _stream_fields parameter\n   * @default () => ({})\n   */\n  streamFields?: () => Record<string, string>;\n  /**\n   * Function to generate the timestamp for the _time field\n   * @default () => new Date().toISOString()\n   */\n  timestamp?: () => string;\n  /**\n   * Custom HTTP query parameters for VictoriaLogs ingestion\n   * @see https://docs.victoriametrics.com/victorialogs/data-ingestion/#http-parameters\n   */\n  httpParameters?: Record<string, string>;\n}\n\n/**\n * VictoriaLogs transport for LogLayer.\n *\n * This transport is a thin wrapper around the HttpTransport that provides\n * VictoriaLogs specific defaults and configuration. It uses the VictoriaLogs\n * JSON stream API to send logs.\n *\n * @see https://docs.victoriametrics.com/victorialogs/data-ingestion/#json-stream-api\n */\nexport class VictoriaLogsTransport extends HttpTransport {\n  constructor(config: VictoriaLogsTransportConfig = {}) {\n    const {\n      url = \"http://localhost:9428\",\n      method = \"POST\",\n      headers = {\n        \"Content-Type\": \"application/stream+json\",\n      },\n      contentType = \"application/stream+json\",\n      batchContentType = \"application/stream+json\",\n      streamFields = () => ({}),\n      timestamp = () => new Date().toISOString(),\n      httpParameters = {},\n      payloadTemplate = ({ logLevel, message, data }) => {\n        const streamFieldsData = streamFields();\n        const timeValue = timestamp();\n\n        // Determine field names based on HTTP parameters\n        const msgField = httpParameters._msg_field || \"_msg\";\n        const timeField = httpParameters._time_field || \"_time\";\n\n        return JSON.stringify({\n          [msgField]: message || \"(no message)\",\n          [timeField]: timeValue,\n          level: logLevel,\n          ...streamFieldsData,\n          ...data,\n        });\n      },\n      compression = false,\n      maxRetries = 3,\n      retryDelay = 1000,\n      respectRateLimit = true,\n      enableBatchSend = true,\n      batchSize = 100,\n      batchSendTimeout = 5000,\n      batchSendDelimiter = \"\\n\",\n      maxLogSize = 1048576, // 1MB\n      maxPayloadSize = 5242880, // 5MB\n      enableNextJsEdgeCompat = false,\n      onError,\n      onDebug,\n      ...restConfig\n    } = config;\n\n    // Get stream fields and use their keys as _stream_fields parameter\n    const streamFieldsData = streamFields();\n    const streamFieldsKeys = Object.keys(streamFieldsData);\n\n    // Merge HTTP parameters, adding _stream_fields if streamFields has keys\n    const finalHttpParameters = {\n      ...httpParameters,\n      ...(streamFieldsKeys.length > 0 && { _stream_fields: streamFieldsKeys.join(\",\") }),\n    };\n\n    // Construct the full URL with the VictoriaLogs JSON stream API endpoint and query parameters\n    const baseUrl = `${url.replace(/\\/$/, \"\")}/insert/jsonline`;\n    const queryParams = new URLSearchParams(finalHttpParameters);\n    const fullUrl = queryParams.toString() ? `${baseUrl}?${queryParams.toString()}` : baseUrl;\n\n    super({\n      url: fullUrl,\n      method,\n      headers,\n      contentType,\n      batchContentType,\n      payloadTemplate,\n      compression,\n      maxRetries,\n      retryDelay,\n      respectRateLimit,\n      enableBatchSend,\n      batchSize,\n      batchSendTimeout,\n      batchSendDelimiter,\n      maxLogSize,\n      maxPayloadSize,\n      enableNextJsEdgeCompat,\n      onError,\n      onDebug,\n      ...restConfig,\n    });\n  }\n}\n"],"mappings":";;;;;;;;;;;;;AA6CA,IAAa,wBAAb,cAA2CA,uCAAc;CACvD,YAAY,SAAsC,EAAE,EAAE;EACpD,MAAM,EACJ,MAAM,yBACN,SAAS,QACT,UAAU,EACR,gBAAgB,2BACjB,EACD,cAAc,2BACd,mBAAmB,2BACnB,sBAAsB,EAAE,GACxB,mCAAkB,IAAI,MAAM,EAAC,aAAa,EAC1C,iBAAiB,EAAE,EACnB,mBAAmB,EAAE,UAAU,SAAS,WAAW;GACjD,MAAM,mBAAmB,cAAc;GACvC,MAAM,YAAY,WAAW;GAG7B,MAAM,WAAW,eAAe,cAAc;GAC9C,MAAM,YAAY,eAAe,eAAe;AAEhD,UAAO,KAAK,UAAU;KACnB,WAAW,WAAW;KACtB,YAAY;IACb,OAAO;IACP,GAAG;IACH,GAAG;IACJ,CAAC;KAEJ,cAAc,OACd,aAAa,GACb,aAAa,KACb,mBAAmB,MACnB,kBAAkB,MAClB,YAAY,KACZ,mBAAmB,KACnB,qBAAqB,MACrB,aAAa,SACb,iBAAiB,SACjB,yBAAyB,OACzB,SACA,SACA,GAAG,eACD;EAGJ,MAAM,mBAAmB,cAAc;EACvC,MAAM,mBAAmB,OAAO,KAAK,iBAAiB;EAGtD,MAAM,sBAAsB;GAC1B,GAAG;GACH,GAAI,iBAAiB,SAAS,KAAK,EAAE,gBAAgB,iBAAiB,KAAK,IAAI,EAAE;GAClF;EAGD,MAAM,UAAU,GAAG,IAAI,QAAQ,OAAO,GAAG,CAAC;EAC1C,MAAM,cAAc,IAAI,gBAAgB,oBAAoB;EAC5D,MAAM,UAAU,YAAY,UAAU,GAAG,GAAG,QAAQ,GAAG,YAAY,UAAU,KAAK;AAElF,QAAM;GACJ,KAAK;GACL;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,GAAG;GACJ,CAAC"}