@loglayer/transport-sumo-logic 3.0.0 → 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,3 +1,4 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
1
2
  let _loglayer_transport = require("@loglayer/transport");
2
3
 
3
4
  //#region src/SumoLogicTransport.ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["LoggerlessTransport"],"sources":["../src/SumoLogicTransport.ts"],"sourcesContent":["import { LoggerlessTransport, type LoggerlessTransportConfig, type LogLayerTransportParams } from \"@loglayer/transport\";\n\ninterface SumoLogicTransportConfig extends LoggerlessTransportConfig {\n /**\n * The URL of your HTTP Source endpoint\n */\n url: string;\n\n /**\n * Whether to use gzip compression (defaults to true)\n */\n useCompression?: boolean;\n\n /**\n * Source category to assign to the logs (optional)\n */\n sourceCategory?: string;\n\n /**\n * Source name to assign to the logs (optional)\n */\n sourceName?: string;\n\n /**\n * Source host to assign to the logs (optional)\n */\n sourceHost?: string;\n\n /**\n * Fields to be added as X-Sumo-Fields header (optional)\n * Will be formatted as a comma-separated list of key=value pairs\n */\n fields?: Record<string, string>;\n\n /**\n * Custom headers to be added to the request (optional)\n */\n headers?: Record<string, string>;\n\n /**\n * Retry configuration (optional)\n */\n retryConfig?: {\n maxRetries?: number;\n initialRetryMs?: number;\n };\n\n /**\n * Optional callback for error handling\n */\n onError?: (error: Error | string) => void;\n\n /**\n * Field name to use for the message (defaults to \"message\")\n */\n messageField?: string;\n}\n\nconst MAX_PAYLOAD_SIZE = 1000000; // 1MB limit as per SumoLogic docs\n\nexport class SumoLogicTransport extends LoggerlessTransport {\n private url: string;\n private useCompression: boolean;\n private sourceCategory?: string;\n private sourceName?: string;\n private sourceHost?: string;\n private fields: Record<string, string>;\n private headers: Record<string, string>;\n private maxRetries: number;\n private initialRetryMs: number;\n private onError?: (error: Error | string) => void;\n private messageField: string;\n\n constructor(config: SumoLogicTransportConfig) {\n super(config);\n this.url = config.url;\n this.useCompression = config.useCompression ?? true;\n this.sourceCategory = config.sourceCategory;\n this.sourceName = config.sourceName;\n this.sourceHost = config.sourceHost;\n this.fields = config.fields ?? {};\n this.headers = config.headers ?? {};\n this.maxRetries = config.retryConfig?.maxRetries ?? 3;\n this.initialRetryMs = config.retryConfig?.initialRetryMs ?? 1000;\n this.onError = config.onError;\n this.messageField = config.messageField ?? \"message\";\n }\n\n /**\n * Compresses data using gzip compression.\n */\n private async compressData(data: string): Promise<Uint8Array> {\n const stream = new CompressionStream(\"gzip\");\n const writer = stream.writable.getWriter();\n const textEncoder = new TextEncoder();\n const chunks: Uint8Array[] = [];\n\n await writer.write(textEncoder.encode(data));\n await writer.close();\n\n const reader = stream.readable.getReader();\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result;\n }\n\n /**\n * Handles errors by calling the onError callback if defined\n */\n private handleError(error: Error | string): void {\n if (this.onError) {\n this.onError(error);\n }\n }\n\n /**\n * Sends logs to SumoLogic with retry logic, compression, and size validation.\n */\n private async sendToSumoLogic(payload: string, retryCount = 0): Promise<void> {\n try {\n // Check payload size before compression\n const rawSize = new TextEncoder().encode(payload).length;\n if (rawSize > MAX_PAYLOAD_SIZE) {\n const error = `Payload size exceeds maximum of ${MAX_PAYLOAD_SIZE} bytes. Size: ${rawSize} bytes`;\n this.handleError(error);\n return;\n }\n\n let compressedPayload: Uint8Array | undefined;\n if (this.useCompression) {\n compressedPayload = await this.compressData(payload);\n if (compressedPayload.length > MAX_PAYLOAD_SIZE) {\n const error = `Compressed payload size exceeds maximum of ${MAX_PAYLOAD_SIZE} bytes. Size: ${compressedPayload.length} bytes`;\n this.handleError(error);\n return;\n }\n }\n\n const headers: Record<string, string> = {\n ...this.headers,\n \"Content-Type\": \"application/json\",\n };\n\n if (this.sourceCategory) {\n headers[\"X-Sumo-Category\"] = this.sourceCategory;\n }\n if (this.sourceName) {\n headers[\"X-Sumo-Name\"] = this.sourceName;\n }\n if (this.sourceHost) {\n headers[\"X-Sumo-Host\"] = this.sourceHost;\n }\n if (this.useCompression) {\n headers[\"Content-Encoding\"] = \"gzip\";\n }\n if (Object.keys(this.fields).length > 0) {\n headers[\"X-Sumo-Fields\"] = Object.entries(this.fields)\n .map(([key, value]) => `${key}=${value}`)\n .join(\",\");\n }\n\n const response = (await fetch(this.url, {\n method: \"POST\",\n headers,\n body: this.useCompression ? compressedPayload : payload,\n })) as Response;\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n } catch (error) {\n if (retryCount < this.maxRetries) {\n const delay = this.initialRetryMs * 2 ** retryCount;\n await new Promise((resolve) => setTimeout(resolve, delay));\n return this.sendToSumoLogic(payload, retryCount + 1);\n }\n this.handleError(error instanceof Error ? error : String(error));\n }\n }\n\n shipToLogger({ logLevel, messages, data, hasData }: LogLayerTransportParams): any[] {\n // Only use the string messages for content\n const stringMessages = messages.filter((msg) => typeof msg === \"string\");\n const message = stringMessages.join(\" \");\n\n const payload = {\n severity: logLevel,\n timestamp: new Date().toISOString(),\n ...(data && hasData ? data : {}),\n };\n\n if (message) {\n payload[this.messageField] = message;\n }\n\n this.sendToSumoLogic(JSON.stringify(payload));\n\n return messages;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["LoggerlessTransport"],"sources":["../src/SumoLogicTransport.ts"],"sourcesContent":["import { LoggerlessTransport, type LoggerlessTransportConfig, type LogLayerTransportParams } from \"@loglayer/transport\";\n\ninterface SumoLogicTransportConfig extends LoggerlessTransportConfig {\n /**\n * The URL of your HTTP Source endpoint\n */\n url: string;\n\n /**\n * Whether to use gzip compression (defaults to true)\n */\n useCompression?: boolean;\n\n /**\n * Source category to assign to the logs (optional)\n */\n sourceCategory?: string;\n\n /**\n * Source name to assign to the logs (optional)\n */\n sourceName?: string;\n\n /**\n * Source host to assign to the logs (optional)\n */\n sourceHost?: string;\n\n /**\n * Fields to be added as X-Sumo-Fields header (optional)\n * Will be formatted as a comma-separated list of key=value pairs\n */\n fields?: Record<string, string>;\n\n /**\n * Custom headers to be added to the request (optional)\n */\n headers?: Record<string, string>;\n\n /**\n * Retry configuration (optional)\n */\n retryConfig?: {\n maxRetries?: number;\n initialRetryMs?: number;\n };\n\n /**\n * Optional callback for error handling\n */\n onError?: (error: Error | string) => void;\n\n /**\n * Field name to use for the message (defaults to \"message\")\n */\n messageField?: string;\n}\n\nconst MAX_PAYLOAD_SIZE = 1000000; // 1MB limit as per SumoLogic docs\n\nexport class SumoLogicTransport extends LoggerlessTransport {\n private url: string;\n private useCompression: boolean;\n private sourceCategory?: string;\n private sourceName?: string;\n private sourceHost?: string;\n private fields: Record<string, string>;\n private headers: Record<string, string>;\n private maxRetries: number;\n private initialRetryMs: number;\n private onError?: (error: Error | string) => void;\n private messageField: string;\n\n constructor(config: SumoLogicTransportConfig) {\n super(config);\n this.url = config.url;\n this.useCompression = config.useCompression ?? true;\n this.sourceCategory = config.sourceCategory;\n this.sourceName = config.sourceName;\n this.sourceHost = config.sourceHost;\n this.fields = config.fields ?? {};\n this.headers = config.headers ?? {};\n this.maxRetries = config.retryConfig?.maxRetries ?? 3;\n this.initialRetryMs = config.retryConfig?.initialRetryMs ?? 1000;\n this.onError = config.onError;\n this.messageField = config.messageField ?? \"message\";\n }\n\n /**\n * Compresses data using gzip compression.\n */\n private async compressData(data: string): Promise<Uint8Array> {\n const stream = new CompressionStream(\"gzip\");\n const writer = stream.writable.getWriter();\n const textEncoder = new TextEncoder();\n const chunks: Uint8Array[] = [];\n\n await writer.write(textEncoder.encode(data));\n await writer.close();\n\n const reader = stream.readable.getReader();\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result;\n }\n\n /**\n * Handles errors by calling the onError callback if defined\n */\n private handleError(error: Error | string): void {\n if (this.onError) {\n this.onError(error);\n }\n }\n\n /**\n * Sends logs to SumoLogic with retry logic, compression, and size validation.\n */\n private async sendToSumoLogic(payload: string, retryCount = 0): Promise<void> {\n try {\n // Check payload size before compression\n const rawSize = new TextEncoder().encode(payload).length;\n if (rawSize > MAX_PAYLOAD_SIZE) {\n const error = `Payload size exceeds maximum of ${MAX_PAYLOAD_SIZE} bytes. Size: ${rawSize} bytes`;\n this.handleError(error);\n return;\n }\n\n let compressedPayload: Uint8Array | undefined;\n if (this.useCompression) {\n compressedPayload = await this.compressData(payload);\n if (compressedPayload.length > MAX_PAYLOAD_SIZE) {\n const error = `Compressed payload size exceeds maximum of ${MAX_PAYLOAD_SIZE} bytes. Size: ${compressedPayload.length} bytes`;\n this.handleError(error);\n return;\n }\n }\n\n const headers: Record<string, string> = {\n ...this.headers,\n \"Content-Type\": \"application/json\",\n };\n\n if (this.sourceCategory) {\n headers[\"X-Sumo-Category\"] = this.sourceCategory;\n }\n if (this.sourceName) {\n headers[\"X-Sumo-Name\"] = this.sourceName;\n }\n if (this.sourceHost) {\n headers[\"X-Sumo-Host\"] = this.sourceHost;\n }\n if (this.useCompression) {\n headers[\"Content-Encoding\"] = \"gzip\";\n }\n if (Object.keys(this.fields).length > 0) {\n headers[\"X-Sumo-Fields\"] = Object.entries(this.fields)\n .map(([key, value]) => `${key}=${value}`)\n .join(\",\");\n }\n\n const response = (await fetch(this.url, {\n method: \"POST\",\n headers,\n body: this.useCompression ? compressedPayload : payload,\n })) as Response;\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n } catch (error) {\n if (retryCount < this.maxRetries) {\n const delay = this.initialRetryMs * 2 ** retryCount;\n await new Promise((resolve) => setTimeout(resolve, delay));\n return this.sendToSumoLogic(payload, retryCount + 1);\n }\n this.handleError(error instanceof Error ? error : String(error));\n }\n }\n\n shipToLogger({ logLevel, messages, data, hasData }: LogLayerTransportParams): any[] {\n // Only use the string messages for content\n const stringMessages = messages.filter((msg) => typeof msg === \"string\");\n const message = stringMessages.join(\" \");\n\n const payload = {\n severity: logLevel,\n timestamp: new Date().toISOString(),\n ...(data && hasData ? data : {}),\n };\n\n if (message) {\n payload[this.messageField] = message;\n }\n\n this.sendToSumoLogic(JSON.stringify(payload));\n\n return messages;\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@loglayer/transport-sumo-logic",
3
3
  "description": "Sumo Logic transport for the LogLayer logging library.",
4
- "version": "3.0.0",
4
+ "version": "3.0.2",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
7
7
  "module": "./dist/index.mjs",
@@ -32,17 +32,17 @@
32
32
  "transport"
33
33
  ],
34
34
  "dependencies": {
35
- "@loglayer/transport": "3.0.0"
35
+ "@loglayer/transport": "3.0.2"
36
36
  },
37
37
  "devDependencies": {
38
- "@types/node": "25.2.0",
38
+ "@types/node": "25.2.3",
39
39
  "serialize-error": "13.0.1",
40
- "tsdown": "0.20.1",
40
+ "tsdown": "0.20.3",
41
41
  "tsx": "4.21.0",
42
42
  "typescript": "5.9.3",
43
43
  "vitest": "4.0.18",
44
44
  "@internal/tsconfig": "2.1.0",
45
- "loglayer": "9.0.0"
45
+ "loglayer": "9.1.0"
46
46
  },
47
47
  "bugs": "https://github.com/loglayer/loglayer/issues",
48
48
  "engines": {