@gunsole/core 0.1.0 → 0.1.1
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 +2 -2
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -98,8 +98,8 @@ await gunsole.flush();
|
|
|
98
98
|
### Modes
|
|
99
99
|
|
|
100
100
|
- `cloud`: Sends logs to `https://api.gunsole.com` (default for SaaS)
|
|
101
|
-
- `desktop`: Sends logs to `http://localhost:
|
|
102
|
-
- `local`: Sends logs to `
|
|
101
|
+
- `desktop`: Sends logs to `http://localhost:17655` (Gunsole Desktop app)
|
|
102
|
+
- `local`: Sends logs to `https://local.gunsole.com`
|
|
103
103
|
|
|
104
104
|
### Options
|
|
105
105
|
|
package/dist/index.cjs
CHANGED
|
@@ -45,8 +45,8 @@ function attachBuckets(client, buckets) {
|
|
|
45
45
|
|
|
46
46
|
// src/config.ts
|
|
47
47
|
var DEFAULT_ENDPOINTS = {
|
|
48
|
-
desktop: "http://localhost:
|
|
49
|
-
local: "
|
|
48
|
+
desktop: "http://localhost:17655",
|
|
49
|
+
local: "https://local.gunsole.com",
|
|
50
50
|
cloud: "https://api.gunsole.com"
|
|
51
51
|
};
|
|
52
52
|
var DEFAULT_CONFIG = {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/buckets.ts","../src/config.ts","../src/utils/env.ts","../src/transport.ts","../src/client.ts","../src/factory.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type { GunsoleClient } from \"./client\";\nimport type { LogLevel, LogOptions } from \"./types\";\n\n/**\n * Log options for bucket methods (message is positional, bucket is implied)\n */\nexport type BucketLogOptions<\n Tags extends Record<string, string> = Record<string, string>,\n> = Omit<LogOptions<Tags>, \"bucket\" | \"message\">;\n\n/**\n * A callable bucket logger with level sub-methods\n */\nexport interface BucketLogger<\n Tags extends Record<string, string> = Record<string, string>,\n> {\n (message: string, options?: BucketLogOptions<Tags>): void;\n info(message: string, options?: BucketLogOptions<Tags>): void;\n debug(message: string, options?: BucketLogOptions<Tags>): void;\n warn(message: string, options?: BucketLogOptions<Tags>): void;\n error(message: string, options?: BucketLogOptions<Tags>): void;\n}\n\n/**\n * Mapped type that adds bucket accessors to a client\n */\nexport type WithBuckets<\n Tags extends Record<string, string> = Record<string, string>,\n Buckets extends string = string,\n> = { [K in Buckets]: BucketLogger<Tags> };\n\n/**\n * Bucket names that conflict with GunsoleClient methods\n */\nexport type ReservedBucketName =\n | \"log\"\n | \"info\"\n | \"debug\"\n | \"warn\"\n | \"error\"\n | \"setUser\"\n | \"setSessionId\"\n | \"flush\"\n | \"destroy\"\n | \"attachGlobalErrorHandlers\"\n | \"detachGlobalErrorHandlers\";\n\n/**\n * Validates a buckets tuple at the type level — reserved names become `never`\n */\nexport type ValidateBuckets<T extends readonly string[]> = {\n [K in keyof T]: T[K] extends ReservedBucketName ? never : T[K];\n};\n\nconst RESERVED_NAMES: Set<string> = new Set<ReservedBucketName>([\n \"log\",\n \"info\",\n \"debug\",\n \"warn\",\n \"error\",\n \"setUser\",\n \"setSessionId\",\n \"flush\",\n \"destroy\",\n \"attachGlobalErrorHandlers\",\n \"detachGlobalErrorHandlers\",\n]);\n\n/**\n * Create a BucketLogger for a specific bucket name\n */\nfunction createBucketLogger<\n Tags extends Record<string, string> = Record<string, string>,\n>(client: GunsoleClient<Tags>, bucketName: string): BucketLogger<Tags> {\n const logAtLevel = (\n level: LogLevel,\n message: string,\n options?: BucketLogOptions<Tags>\n ): void => {\n client.log(level, {\n ...options,\n message,\n bucket: bucketName,\n } as LogOptions<Tags>);\n };\n\n const logger = ((message: string, options?: BucketLogOptions<Tags>): void => {\n logAtLevel(\"info\", message, options);\n }) as BucketLogger<Tags>;\n\n logger.info = (message, options?) => logAtLevel(\"info\", message, options);\n logger.debug = (message, options?) => logAtLevel(\"debug\", message, options);\n logger.warn = (message, options?) => logAtLevel(\"warn\", message, options);\n logger.error = (message, options?) => logAtLevel(\"error\", message, options);\n\n return logger;\n}\n\n/**\n * Attach bucket accessors to a client instance\n */\nexport function attachBuckets<\n Tags extends Record<string, string> = Record<string, string>,\n Buckets extends string = string,\n>(\n client: GunsoleClient<Tags>,\n buckets: readonly string[]\n): GunsoleClient<Tags> & WithBuckets<Tags, Buckets> {\n for (const name of buckets) {\n if (RESERVED_NAMES.has(name)) {\n throw new Error(\n `Bucket name \"${name}\" conflicts with a reserved GunsoleClient method`\n );\n }\n (client as unknown as Record<string, unknown>)[name] =\n createBucketLogger(client, name);\n }\n return client as GunsoleClient<Tags> & WithBuckets<Tags, Buckets>;\n}\n","import type { ClientMode, GunsoleClientConfig } from \"./types\";\n\n/**\n * Default endpoints for each mode\n */\nconst DEFAULT_ENDPOINTS: Record<ClientMode, string> = {\n desktop: \"http://localhost:8787\",\n local: \"http://localhost:17655\",\n cloud: \"https://api.gunsole.com\",\n};\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG = {\n batchSize: 10,\n flushInterval: 5000,\n};\n\n/**\n * Resolve the endpoint URL based on mode and custom endpoint\n */\nexport function resolveEndpoint(\n mode: ClientMode,\n customEndpoint?: string\n): string {\n if (customEndpoint) {\n return customEndpoint;\n }\n return DEFAULT_ENDPOINTS[mode];\n}\n\n/**\n * Normalize and validate client configuration\n */\nexport function normalizeConfig(config: GunsoleClientConfig): Omit<\n Required<GunsoleClientConfig>,\n \"fetch\"\n> & {\n endpoint: string;\n fetch?: GunsoleClientConfig[\"fetch\"];\n} {\n if (!config.projectId) {\n throw new Error(\"projectId is required\");\n }\n return {\n projectId: config.projectId,\n apiKey: config.apiKey ?? \"\",\n mode: config.mode,\n endpoint: resolveEndpoint(config.mode, config.endpoint),\n env: config.env ?? \"\",\n appName: config.appName ?? \"\",\n appVersion: config.appVersion ?? \"\",\n defaultTags: config.defaultTags ?? {},\n batchSize: config.batchSize ?? DEFAULT_CONFIG.batchSize,\n flushInterval: config.flushInterval ?? DEFAULT_CONFIG.flushInterval,\n fetch: config.fetch,\n isDebug: config.isDebug ?? false,\n isDisabled: config.isDisabled ?? false,\n buckets: config.buckets ?? [],\n };\n}\n","import type { FetchFunction } from \"../types\";\n\n/**\n * Check if running in a browser environment\n */\nexport function isBrowser(): boolean {\n return (\n typeof window !== \"undefined\" && typeof window.document !== \"undefined\"\n );\n}\n\n/**\n * Check if running in Node.js environment\n */\nexport function isNode(): boolean {\n return (\n typeof process !== \"undefined\" &&\n typeof process.versions !== \"undefined\" &&\n typeof process.versions.node !== \"undefined\"\n );\n}\n\n/**\n * Get fetch implementation (browser or Node.js)\n * If a custom fetch is provided, it will be used instead.\n */\nexport function getFetch(customFetch?: FetchFunction): FetchFunction {\n if (customFetch) {\n return customFetch;\n }\n\n if (isBrowser()) {\n return window.fetch.bind(window);\n }\n if (isNode()) {\n // In Node.js 18+, fetch is available globally\n if (typeof globalThis.fetch !== \"undefined\") {\n return globalThis.fetch;\n }\n // For older Node.js versions, user must provide their own fetch\n throw new Error(\n \"fetch is not available. Please use Node.js 18+ or provide a custom fetch implementation in the config\"\n );\n }\n throw new Error(\"Unsupported environment: neither browser nor Node.js\");\n}\n","import type { BatchPayload, FetchFunction, InternalLogEntry } from \"./types.js\";\nimport { getFetch } from \"./utils/env.js\";\n\n/**\n * Maximum number of retry attempts\n */\nconst MAX_RETRIES = 3;\n\n/**\n * Base delay for exponential backoff (milliseconds)\n */\nconst BASE_DELAY_MS = 1000;\n\n/**\n * Calculate exponential backoff delay\n */\nfunction calculateBackoffDelay(attempt: number): number {\n return BASE_DELAY_MS * 2 ** attempt;\n}\n\n/**\n * Sleep utility for retry delays\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Gzip compress a string using the native Compression Streams API\n */\nasync function gzipCompress(input: string): Promise<Uint8Array> {\n const encoder = new TextEncoder();\n const stream = new Blob([encoder.encode(input)])\n .stream()\n .pipeThrough(new CompressionStream(\"gzip\"));\n return new Uint8Array(await new Response(stream).arrayBuffer());\n}\n\n/**\n * Minify and optionally compress payload\n */\nasync function compressPayload(\n payload: BatchPayload,\n isDebug: boolean\n): Promise<string | Uint8Array> {\n const minified = JSON.stringify(payload);\n\n if (isDebug) {\n return minified;\n }\n\n return gzipCompress(minified);\n}\n\n/**\n * Transport layer for sending logs to the Gunsole API\n */\nexport class Transport {\n private endpoint: string;\n private apiKey: string;\n private projectId: string;\n private fetch: FetchFunction;\n private isDebug: boolean;\n\n constructor(\n endpoint: string,\n apiKey: string,\n projectId: string,\n fetch?: FetchFunction,\n isDebug = false\n ) {\n this.endpoint = endpoint;\n this.apiKey = apiKey;\n this.projectId = projectId;\n this.fetch = fetch ?? getFetch();\n this.isDebug = isDebug;\n }\n\n /**\n * Send a batch of logs to the API\n * Implements retry logic with exponential backoff\n */\n async sendBatch(logs: InternalLogEntry[]): Promise<void> {\n if (logs.length === 0) {\n return;\n }\n\n const payload: BatchPayload = {\n projectId: this.projectId,\n logs,\n };\n\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n try {\n const body = await compressPayload(payload, this.isDebug);\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (this.apiKey) {\n headers[\"Authorization\"] = `Bearer ${this.apiKey}`;\n }\n\n // Only set Content-Encoding if not in debug mode\n if (!this.isDebug) {\n headers[\"Content-Encoding\"] = \"gzip\";\n }\n\n const response = await this.fetch(`${this.endpoint}/logs`, {\n method: \"POST\",\n headers,\n body: body as BodyInit,\n });\n\n if (response.ok) {\n return; // Success\n }\n\n // Non-2xx response\n const errorText = await response.text().catch(() => \"Unknown error\");\n lastError = new Error(`HTTP ${response.status}: ${errorText}`);\n\n // Don't retry client errors (4xx) except 429 (rate limited)\n if (response.status >= 400 && response.status < 500 && response.status !== 429) {\n break;\n }\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n }\n\n // If not the last attempt, wait before retrying\n if (attempt < MAX_RETRIES - 1) {\n const delay = calculateBackoffDelay(attempt);\n await sleep(delay);\n }\n }\n\n // All retries failed - silently swallow the error\n // This ensures the SDK never crashes the host application\n // In production, you might want to log this to console in debug mode\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Failed to send logs after retries:\", lastError);\n }\n }\n}\n","import { normalizeConfig } from \"./config\";\nimport { Transport } from \"./transport\";\nimport type {\n GunsoleClientConfig,\n InternalLogEntry,\n LogLevel,\n LogOptions,\n UserInfo,\n ValidTagSchema,\n} from \"./types\";\n\n/**\n * Global error handler state\n */\ninterface GlobalErrorHandlers {\n unhandledRejection?: (event: PromiseRejectionEvent) => void;\n unhandledRejectionNode?: (reason: unknown, promise: Promise<unknown>) => void;\n error?: (event: ErrorEvent) => void;\n uncaughtException?: (error: Error) => void;\n attached: boolean;\n}\n\n/**\n * Gunsole client for sending logs and events\n */\nexport class GunsoleClient<\n Tags extends Record<string, string> & ValidTagSchema = Record<\n string,\n string\n >,\n> {\n private config: ReturnType<typeof normalizeConfig>;\n private transport: Transport;\n private batch: InternalLogEntry[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private user: UserInfo | null = null;\n private sessionId: string | null = null;\n private globalHandlers: GlobalErrorHandlers = { attached: false };\n private readonly disabled: boolean;\n\n constructor(config: GunsoleClientConfig) {\n this.config = normalizeConfig(config);\n this.disabled = config.isDisabled ?? false;\n this.transport = new Transport(\n this.config.endpoint,\n this.config.apiKey,\n this.config.projectId,\n this.config.fetch,\n config.isDebug ?? false\n );\n\n if (this.disabled) {\n return;\n }\n\n this.startFlushTimer();\n }\n\n /**\n * Log a message. Defaults to info level.\n */\n log(options: LogOptions<Tags>): void;\n log(level: LogLevel, options: LogOptions<Tags>): void;\n log(\n levelOrOptions: LogLevel | LogOptions<Tags>,\n maybeOptions?: LogOptions<Tags>\n ): void {\n if (this.disabled) {\n return;\n }\n const level: LogLevel =\n typeof levelOrOptions === \"string\" ? levelOrOptions : \"info\";\n const options: LogOptions<Tags> =\n typeof levelOrOptions === \"string\" ? maybeOptions! : levelOrOptions;\n try {\n const internalEntry: InternalLogEntry = {\n level,\n bucket: options.bucket,\n message: options.message,\n context: options.context,\n timestamp: Date.now(),\n traceId: options.traceId,\n userId: this.user?.id,\n sessionId: this.sessionId ?? undefined,\n env: this.config.env || undefined,\n appName: this.config.appName || undefined,\n appVersion: this.config.appVersion || undefined,\n tags: {\n ...this.config.defaultTags,\n ...(Array.isArray(options.tags)\n ? Object.assign({}, ...options.tags)\n : options.tags),\n },\n };\n\n this.batch.push(internalEntry);\n\n // Flush if batch is full\n if (this.batch.length >= this.config.batchSize) {\n this.flush();\n }\n } catch (error) {\n // Silently swallow errors - never crash the host app\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Error in log():\", error);\n }\n }\n }\n\n /**\n * Log an info-level message\n */\n info(options: LogOptions<Tags>): void {\n this.log(\"info\", options);\n }\n\n debug(options: LogOptions<Tags>): void {\n this.log(\"debug\", options);\n }\n\n warn(options: LogOptions<Tags>): void {\n this.log(\"warn\", options);\n }\n\n error(options: LogOptions<Tags>): void {\n this.log(\"error\", options);\n }\n\n /**\n * Set user information\n */\n setUser(user: UserInfo): void {\n if (this.disabled) {\n return;\n }\n try {\n this.user = user;\n } catch (error) {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Error in setUser():\", error);\n }\n }\n }\n\n /**\n * Set session ID\n */\n setSessionId(sessionId: string): void {\n if (this.disabled) {\n return;\n }\n try {\n this.sessionId = sessionId;\n } catch (error) {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Error in setSessionId():\", error);\n }\n }\n }\n\n /**\n * Flush pending logs to the API\n */\n async flush(): Promise<void> {\n if (this.disabled) {\n return;\n }\n try {\n if (this.batch.length === 0) {\n return;\n }\n\n const logsToSend = [...this.batch];\n this.batch = [];\n\n await this.transport.sendBatch(logsToSend);\n } catch (error) {\n // Silently swallow errors\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Error in flush():\", error);\n }\n }\n }\n\n /**\n * Attach global error handlers\n */\n attachGlobalErrorHandlers(): void {\n if (this.disabled) {\n return;\n }\n try {\n if (this.globalHandlers.attached) {\n return;\n }\n\n // Unhandled promise rejections\n this.globalHandlers.unhandledRejection = (\n event: PromiseRejectionEvent\n ) => {\n this.error({\n message: \"Unhandled promise rejection\",\n bucket: \"unhandled_rejection\",\n context: {\n reason: String(event.reason),\n error:\n event.reason instanceof Error\n ? {\n name: event.reason.name,\n message: event.reason.message,\n stack: event.reason.stack,\n }\n : event.reason,\n },\n });\n };\n\n // Global errors\n this.globalHandlers.error = (event: ErrorEvent) => {\n this.error({\n message: event.message || \"Global error\",\n bucket: \"global_error\",\n context: {\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n error: event.error\n ? {\n name: event.error.name,\n message: event.error.message,\n stack: event.error.stack,\n }\n : undefined,\n },\n });\n };\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\n \"unhandledrejection\",\n this.globalHandlers.unhandledRejection\n );\n window.addEventListener(\"error\", this.globalHandlers.error);\n }\n\n if (typeof process !== \"undefined\") {\n this.globalHandlers.unhandledRejectionNode = (\n reason: unknown,\n _promise: Promise<unknown>\n ) => {\n this.error({\n message: \"Unhandled promise rejection\",\n bucket: \"unhandled_rejection\",\n context: {\n reason: String(reason),\n error:\n reason instanceof Error\n ? {\n name: reason.name,\n message: reason.message,\n stack: reason.stack,\n }\n : reason,\n },\n });\n };\n\n this.globalHandlers.uncaughtException = (error: Error) => {\n this.error({\n message: error.message,\n bucket: \"uncaught_exception\",\n context: {\n name: error.name,\n stack: error.stack,\n },\n });\n };\n\n process.on(\n \"unhandledRejection\",\n this.globalHandlers.unhandledRejectionNode\n );\n process.on(\"uncaughtException\", this.globalHandlers.uncaughtException);\n }\n\n this.globalHandlers.attached = true;\n } catch (error) {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Error in attachGlobalErrorHandlers():\", error);\n }\n }\n }\n\n /**\n * Detach global error handlers\n */\n detachGlobalErrorHandlers(): void {\n try {\n if (!this.globalHandlers.attached) {\n return;\n }\n\n if (typeof window !== \"undefined\") {\n if (this.globalHandlers.unhandledRejection) {\n window.removeEventListener(\n \"unhandledrejection\",\n this.globalHandlers.unhandledRejection\n );\n }\n if (this.globalHandlers.error) {\n window.removeEventListener(\"error\", this.globalHandlers.error);\n }\n }\n\n if (typeof process !== \"undefined\") {\n if (this.globalHandlers.unhandledRejectionNode) {\n process.removeListener(\n \"unhandledRejection\",\n this.globalHandlers.unhandledRejectionNode\n );\n }\n if (this.globalHandlers.uncaughtException) {\n process.removeListener(\n \"uncaughtException\",\n this.globalHandlers.uncaughtException\n );\n }\n }\n\n this.globalHandlers = { attached: false };\n } catch (error) {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Error in detachGlobalErrorHandlers():\", error);\n }\n }\n }\n\n /**\n * Start the automatic flush timer\n */\n private startFlushTimer(): void {\n if (this.flushTimer) {\n return;\n }\n\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.config.flushInterval);\n }\n\n /**\n * Stop the automatic flush timer\n */\n private stopFlushTimer(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n }\n\n /**\n * Cleanup resources. Awaiting ensures remaining logs are flushed.\n */\n async destroy(): Promise<void> {\n this.stopFlushTimer();\n this.detachGlobalErrorHandlers();\n await this.flush();\n }\n}\n","import {\n type ValidateBuckets,\n type WithBuckets,\n attachBuckets,\n} from \"./buckets\";\nimport { GunsoleClient } from \"./client\";\nimport type { GunsoleClientConfig, ValidTagSchema } from \"./types\";\n\n/**\n * Config without buckets — used for overload resolution so that\n * a config with `buckets` falls through to the validated overload.\n */\ntype BaseConfig = Omit<GunsoleClientConfig, \"buckets\">;\n\n/**\n * Create a new Gunsole client instance\n *\n * @param config - Client configuration\n * @returns Gunsole client instance\n *\n * @example\n * ```ts\n * const gunsole = createGunsoleClient({\n * projectId: \"my-project\",\n * apiKey: \"my-api-key\",\n * mode: \"cloud\",\n * buckets: [\"payment\", \"auth\"],\n * });\n *\n * gunsole.payment(\"User paid\");\n * gunsole.auth.error(\"Login failed\");\n * ```\n */\nexport function createGunsoleClient<\n Tags extends Record<string, string> & ValidTagSchema = Record<\n string,\n string\n >,\n>(config: BaseConfig): GunsoleClient<Tags>;\nexport function createGunsoleClient<\n Tags extends Record<string, string> & ValidTagSchema = Record<\n string,\n string\n >,\n const Buckets extends readonly string[] = readonly string[],\n>(\n config: BaseConfig & {\n buckets: Buckets & NoInfer<ValidateBuckets<Buckets>>;\n }\n): GunsoleClient<Tags> & WithBuckets<Tags, Buckets[number]>;\nexport function createGunsoleClient<\n Tags extends Record<string, string> & ValidTagSchema = Record<\n string,\n string\n >,\n const Buckets extends readonly string[] = readonly string[],\n>(\n config: GunsoleClientConfig & { buckets?: Buckets }\n): GunsoleClient<Tags> & WithBuckets<Tags, Buckets[number]> {\n const client = new GunsoleClient<Tags>(config);\n const buckets = config.buckets ?? [];\n if (buckets.length > 0) {\n return attachBuckets<Tags, Buckets[number]>(client, buckets);\n }\n return client as GunsoleClient<Tags> &\n WithBuckets<Tags, Buckets[number]>;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/buckets.ts","../src/config.ts","../src/utils/env.ts","../src/transport.ts","../src/client.ts","../src/factory.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type { GunsoleClient } from \"./client\";\nimport type { LogLevel, LogOptions } from \"./types\";\n\n/**\n * Log options for bucket methods (message is positional, bucket is implied)\n */\nexport type BucketLogOptions<\n Tags extends Record<string, string> = Record<string, string>,\n> = Omit<LogOptions<Tags>, \"bucket\" | \"message\">;\n\n/**\n * A callable bucket logger with level sub-methods\n */\nexport interface BucketLogger<\n Tags extends Record<string, string> = Record<string, string>,\n> {\n (message: string, options?: BucketLogOptions<Tags>): void;\n info(message: string, options?: BucketLogOptions<Tags>): void;\n debug(message: string, options?: BucketLogOptions<Tags>): void;\n warn(message: string, options?: BucketLogOptions<Tags>): void;\n error(message: string, options?: BucketLogOptions<Tags>): void;\n}\n\n/**\n * Mapped type that adds bucket accessors to a client\n */\nexport type WithBuckets<\n Tags extends Record<string, string> = Record<string, string>,\n Buckets extends string = string,\n> = { [K in Buckets]: BucketLogger<Tags> };\n\n/**\n * Bucket names that conflict with GunsoleClient methods\n */\nexport type ReservedBucketName =\n | \"log\"\n | \"info\"\n | \"debug\"\n | \"warn\"\n | \"error\"\n | \"setUser\"\n | \"setSessionId\"\n | \"flush\"\n | \"destroy\"\n | \"attachGlobalErrorHandlers\"\n | \"detachGlobalErrorHandlers\";\n\n/**\n * Validates a buckets tuple at the type level — reserved names become `never`\n */\nexport type ValidateBuckets<T extends readonly string[]> = {\n [K in keyof T]: T[K] extends ReservedBucketName ? never : T[K];\n};\n\nconst RESERVED_NAMES: Set<string> = new Set<ReservedBucketName>([\n \"log\",\n \"info\",\n \"debug\",\n \"warn\",\n \"error\",\n \"setUser\",\n \"setSessionId\",\n \"flush\",\n \"destroy\",\n \"attachGlobalErrorHandlers\",\n \"detachGlobalErrorHandlers\",\n]);\n\n/**\n * Create a BucketLogger for a specific bucket name\n */\nfunction createBucketLogger<\n Tags extends Record<string, string> = Record<string, string>,\n>(client: GunsoleClient<Tags>, bucketName: string): BucketLogger<Tags> {\n const logAtLevel = (\n level: LogLevel,\n message: string,\n options?: BucketLogOptions<Tags>\n ): void => {\n client.log(level, {\n ...options,\n message,\n bucket: bucketName,\n } as LogOptions<Tags>);\n };\n\n const logger = ((message: string, options?: BucketLogOptions<Tags>): void => {\n logAtLevel(\"info\", message, options);\n }) as BucketLogger<Tags>;\n\n logger.info = (message, options?) => logAtLevel(\"info\", message, options);\n logger.debug = (message, options?) => logAtLevel(\"debug\", message, options);\n logger.warn = (message, options?) => logAtLevel(\"warn\", message, options);\n logger.error = (message, options?) => logAtLevel(\"error\", message, options);\n\n return logger;\n}\n\n/**\n * Attach bucket accessors to a client instance\n */\nexport function attachBuckets<\n Tags extends Record<string, string> = Record<string, string>,\n Buckets extends string = string,\n>(\n client: GunsoleClient<Tags>,\n buckets: readonly string[]\n): GunsoleClient<Tags> & WithBuckets<Tags, Buckets> {\n for (const name of buckets) {\n if (RESERVED_NAMES.has(name)) {\n throw new Error(\n `Bucket name \"${name}\" conflicts with a reserved GunsoleClient method`\n );\n }\n (client as unknown as Record<string, unknown>)[name] =\n createBucketLogger(client, name);\n }\n return client as GunsoleClient<Tags> & WithBuckets<Tags, Buckets>;\n}\n","import type { ClientMode, GunsoleClientConfig } from \"./types\";\n\n/**\n * Default endpoints for each mode\n */\nconst DEFAULT_ENDPOINTS: Record<ClientMode, string> = {\n desktop: \"http://localhost:17655\",\n local: \"https://local.gunsole.com\",\n cloud: \"https://api.gunsole.com\",\n};\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG = {\n batchSize: 10,\n flushInterval: 5000,\n};\n\n/**\n * Resolve the endpoint URL based on mode and custom endpoint\n */\nexport function resolveEndpoint(\n mode: ClientMode,\n customEndpoint?: string\n): string {\n if (customEndpoint) {\n return customEndpoint;\n }\n return DEFAULT_ENDPOINTS[mode];\n}\n\n/**\n * Normalize and validate client configuration\n */\nexport function normalizeConfig(config: GunsoleClientConfig): Omit<\n Required<GunsoleClientConfig>,\n \"fetch\"\n> & {\n endpoint: string;\n fetch?: GunsoleClientConfig[\"fetch\"];\n} {\n if (!config.projectId) {\n throw new Error(\"projectId is required\");\n }\n return {\n projectId: config.projectId,\n apiKey: config.apiKey ?? \"\",\n mode: config.mode,\n endpoint: resolveEndpoint(config.mode, config.endpoint),\n env: config.env ?? \"\",\n appName: config.appName ?? \"\",\n appVersion: config.appVersion ?? \"\",\n defaultTags: config.defaultTags ?? {},\n batchSize: config.batchSize ?? DEFAULT_CONFIG.batchSize,\n flushInterval: config.flushInterval ?? DEFAULT_CONFIG.flushInterval,\n fetch: config.fetch,\n isDebug: config.isDebug ?? false,\n isDisabled: config.isDisabled ?? false,\n buckets: config.buckets ?? [],\n };\n}\n","import type { FetchFunction } from \"../types\";\n\n/**\n * Check if running in a browser environment\n */\nexport function isBrowser(): boolean {\n return (\n typeof window !== \"undefined\" && typeof window.document !== \"undefined\"\n );\n}\n\n/**\n * Check if running in Node.js environment\n */\nexport function isNode(): boolean {\n return (\n typeof process !== \"undefined\" &&\n typeof process.versions !== \"undefined\" &&\n typeof process.versions.node !== \"undefined\"\n );\n}\n\n/**\n * Get fetch implementation (browser or Node.js)\n * If a custom fetch is provided, it will be used instead.\n */\nexport function getFetch(customFetch?: FetchFunction): FetchFunction {\n if (customFetch) {\n return customFetch;\n }\n\n if (isBrowser()) {\n return window.fetch.bind(window);\n }\n if (isNode()) {\n // In Node.js 18+, fetch is available globally\n if (typeof globalThis.fetch !== \"undefined\") {\n return globalThis.fetch;\n }\n // For older Node.js versions, user must provide their own fetch\n throw new Error(\n \"fetch is not available. Please use Node.js 18+ or provide a custom fetch implementation in the config\"\n );\n }\n throw new Error(\"Unsupported environment: neither browser nor Node.js\");\n}\n","import type { BatchPayload, FetchFunction, InternalLogEntry } from \"./types.js\";\nimport { getFetch } from \"./utils/env.js\";\n\n/**\n * Maximum number of retry attempts\n */\nconst MAX_RETRIES = 3;\n\n/**\n * Base delay for exponential backoff (milliseconds)\n */\nconst BASE_DELAY_MS = 1000;\n\n/**\n * Calculate exponential backoff delay\n */\nfunction calculateBackoffDelay(attempt: number): number {\n return BASE_DELAY_MS * 2 ** attempt;\n}\n\n/**\n * Sleep utility for retry delays\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Gzip compress a string using the native Compression Streams API\n */\nasync function gzipCompress(input: string): Promise<Uint8Array> {\n const encoder = new TextEncoder();\n const stream = new Blob([encoder.encode(input)])\n .stream()\n .pipeThrough(new CompressionStream(\"gzip\"));\n return new Uint8Array(await new Response(stream).arrayBuffer());\n}\n\n/**\n * Minify and optionally compress payload\n */\nasync function compressPayload(\n payload: BatchPayload,\n isDebug: boolean\n): Promise<string | Uint8Array> {\n const minified = JSON.stringify(payload);\n\n if (isDebug) {\n return minified;\n }\n\n return gzipCompress(minified);\n}\n\n/**\n * Transport layer for sending logs to the Gunsole API\n */\nexport class Transport {\n private endpoint: string;\n private apiKey: string;\n private projectId: string;\n private fetch: FetchFunction;\n private isDebug: boolean;\n\n constructor(\n endpoint: string,\n apiKey: string,\n projectId: string,\n fetch?: FetchFunction,\n isDebug = false\n ) {\n this.endpoint = endpoint;\n this.apiKey = apiKey;\n this.projectId = projectId;\n this.fetch = fetch ?? getFetch();\n this.isDebug = isDebug;\n }\n\n /**\n * Send a batch of logs to the API\n * Implements retry logic with exponential backoff\n */\n async sendBatch(logs: InternalLogEntry[]): Promise<void> {\n if (logs.length === 0) {\n return;\n }\n\n const payload: BatchPayload = {\n projectId: this.projectId,\n logs,\n };\n\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n try {\n const body = await compressPayload(payload, this.isDebug);\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (this.apiKey) {\n headers[\"Authorization\"] = `Bearer ${this.apiKey}`;\n }\n\n // Only set Content-Encoding if not in debug mode\n if (!this.isDebug) {\n headers[\"Content-Encoding\"] = \"gzip\";\n }\n\n const response = await this.fetch(`${this.endpoint}/logs`, {\n method: \"POST\",\n headers,\n body: body as BodyInit,\n });\n\n if (response.ok) {\n return; // Success\n }\n\n // Non-2xx response\n const errorText = await response.text().catch(() => \"Unknown error\");\n lastError = new Error(`HTTP ${response.status}: ${errorText}`);\n\n // Don't retry client errors (4xx) except 429 (rate limited)\n if (response.status >= 400 && response.status < 500 && response.status !== 429) {\n break;\n }\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n }\n\n // If not the last attempt, wait before retrying\n if (attempt < MAX_RETRIES - 1) {\n const delay = calculateBackoffDelay(attempt);\n await sleep(delay);\n }\n }\n\n // All retries failed - silently swallow the error\n // This ensures the SDK never crashes the host application\n // In production, you might want to log this to console in debug mode\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Failed to send logs after retries:\", lastError);\n }\n }\n}\n","import { normalizeConfig } from \"./config\";\nimport { Transport } from \"./transport\";\nimport type {\n GunsoleClientConfig,\n InternalLogEntry,\n LogLevel,\n LogOptions,\n UserInfo,\n ValidTagSchema,\n} from \"./types\";\n\n/**\n * Global error handler state\n */\ninterface GlobalErrorHandlers {\n unhandledRejection?: (event: PromiseRejectionEvent) => void;\n unhandledRejectionNode?: (reason: unknown, promise: Promise<unknown>) => void;\n error?: (event: ErrorEvent) => void;\n uncaughtException?: (error: Error) => void;\n attached: boolean;\n}\n\n/**\n * Gunsole client for sending logs and events\n */\nexport class GunsoleClient<\n Tags extends Record<string, string> & ValidTagSchema = Record<\n string,\n string\n >,\n> {\n private config: ReturnType<typeof normalizeConfig>;\n private transport: Transport;\n private batch: InternalLogEntry[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private user: UserInfo | null = null;\n private sessionId: string | null = null;\n private globalHandlers: GlobalErrorHandlers = { attached: false };\n private readonly disabled: boolean;\n\n constructor(config: GunsoleClientConfig) {\n this.config = normalizeConfig(config);\n this.disabled = config.isDisabled ?? false;\n this.transport = new Transport(\n this.config.endpoint,\n this.config.apiKey,\n this.config.projectId,\n this.config.fetch,\n config.isDebug ?? false\n );\n\n if (this.disabled) {\n return;\n }\n\n this.startFlushTimer();\n }\n\n /**\n * Log a message. Defaults to info level.\n */\n log(options: LogOptions<Tags>): void;\n log(level: LogLevel, options: LogOptions<Tags>): void;\n log(\n levelOrOptions: LogLevel | LogOptions<Tags>,\n maybeOptions?: LogOptions<Tags>\n ): void {\n if (this.disabled) {\n return;\n }\n const level: LogLevel =\n typeof levelOrOptions === \"string\" ? levelOrOptions : \"info\";\n const options: LogOptions<Tags> =\n typeof levelOrOptions === \"string\" ? maybeOptions! : levelOrOptions;\n try {\n const internalEntry: InternalLogEntry = {\n level,\n bucket: options.bucket,\n message: options.message,\n context: options.context,\n timestamp: Date.now(),\n traceId: options.traceId,\n userId: this.user?.id,\n sessionId: this.sessionId ?? undefined,\n env: this.config.env || undefined,\n appName: this.config.appName || undefined,\n appVersion: this.config.appVersion || undefined,\n tags: {\n ...this.config.defaultTags,\n ...(Array.isArray(options.tags)\n ? Object.assign({}, ...options.tags)\n : options.tags),\n },\n };\n\n this.batch.push(internalEntry);\n\n // Flush if batch is full\n if (this.batch.length >= this.config.batchSize) {\n this.flush();\n }\n } catch (error) {\n // Silently swallow errors - never crash the host app\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Error in log():\", error);\n }\n }\n }\n\n /**\n * Log an info-level message\n */\n info(options: LogOptions<Tags>): void {\n this.log(\"info\", options);\n }\n\n debug(options: LogOptions<Tags>): void {\n this.log(\"debug\", options);\n }\n\n warn(options: LogOptions<Tags>): void {\n this.log(\"warn\", options);\n }\n\n error(options: LogOptions<Tags>): void {\n this.log(\"error\", options);\n }\n\n /**\n * Set user information\n */\n setUser(user: UserInfo): void {\n if (this.disabled) {\n return;\n }\n try {\n this.user = user;\n } catch (error) {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Error in setUser():\", error);\n }\n }\n }\n\n /**\n * Set session ID\n */\n setSessionId(sessionId: string): void {\n if (this.disabled) {\n return;\n }\n try {\n this.sessionId = sessionId;\n } catch (error) {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Error in setSessionId():\", error);\n }\n }\n }\n\n /**\n * Flush pending logs to the API\n */\n async flush(): Promise<void> {\n if (this.disabled) {\n return;\n }\n try {\n if (this.batch.length === 0) {\n return;\n }\n\n const logsToSend = [...this.batch];\n this.batch = [];\n\n await this.transport.sendBatch(logsToSend);\n } catch (error) {\n // Silently swallow errors\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Error in flush():\", error);\n }\n }\n }\n\n /**\n * Attach global error handlers\n */\n attachGlobalErrorHandlers(): void {\n if (this.disabled) {\n return;\n }\n try {\n if (this.globalHandlers.attached) {\n return;\n }\n\n // Unhandled promise rejections\n this.globalHandlers.unhandledRejection = (\n event: PromiseRejectionEvent\n ) => {\n this.error({\n message: \"Unhandled promise rejection\",\n bucket: \"unhandled_rejection\",\n context: {\n reason: String(event.reason),\n error:\n event.reason instanceof Error\n ? {\n name: event.reason.name,\n message: event.reason.message,\n stack: event.reason.stack,\n }\n : event.reason,\n },\n });\n };\n\n // Global errors\n this.globalHandlers.error = (event: ErrorEvent) => {\n this.error({\n message: event.message || \"Global error\",\n bucket: \"global_error\",\n context: {\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n error: event.error\n ? {\n name: event.error.name,\n message: event.error.message,\n stack: event.error.stack,\n }\n : undefined,\n },\n });\n };\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\n \"unhandledrejection\",\n this.globalHandlers.unhandledRejection\n );\n window.addEventListener(\"error\", this.globalHandlers.error);\n }\n\n if (typeof process !== \"undefined\") {\n this.globalHandlers.unhandledRejectionNode = (\n reason: unknown,\n _promise: Promise<unknown>\n ) => {\n this.error({\n message: \"Unhandled promise rejection\",\n bucket: \"unhandled_rejection\",\n context: {\n reason: String(reason),\n error:\n reason instanceof Error\n ? {\n name: reason.name,\n message: reason.message,\n stack: reason.stack,\n }\n : reason,\n },\n });\n };\n\n this.globalHandlers.uncaughtException = (error: Error) => {\n this.error({\n message: error.message,\n bucket: \"uncaught_exception\",\n context: {\n name: error.name,\n stack: error.stack,\n },\n });\n };\n\n process.on(\n \"unhandledRejection\",\n this.globalHandlers.unhandledRejectionNode\n );\n process.on(\"uncaughtException\", this.globalHandlers.uncaughtException);\n }\n\n this.globalHandlers.attached = true;\n } catch (error) {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Error in attachGlobalErrorHandlers():\", error);\n }\n }\n }\n\n /**\n * Detach global error handlers\n */\n detachGlobalErrorHandlers(): void {\n try {\n if (!this.globalHandlers.attached) {\n return;\n }\n\n if (typeof window !== \"undefined\") {\n if (this.globalHandlers.unhandledRejection) {\n window.removeEventListener(\n \"unhandledrejection\",\n this.globalHandlers.unhandledRejection\n );\n }\n if (this.globalHandlers.error) {\n window.removeEventListener(\"error\", this.globalHandlers.error);\n }\n }\n\n if (typeof process !== \"undefined\") {\n if (this.globalHandlers.unhandledRejectionNode) {\n process.removeListener(\n \"unhandledRejection\",\n this.globalHandlers.unhandledRejectionNode\n );\n }\n if (this.globalHandlers.uncaughtException) {\n process.removeListener(\n \"uncaughtException\",\n this.globalHandlers.uncaughtException\n );\n }\n }\n\n this.globalHandlers = { attached: false };\n } catch (error) {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Error in detachGlobalErrorHandlers():\", error);\n }\n }\n }\n\n /**\n * Start the automatic flush timer\n */\n private startFlushTimer(): void {\n if (this.flushTimer) {\n return;\n }\n\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.config.flushInterval);\n }\n\n /**\n * Stop the automatic flush timer\n */\n private stopFlushTimer(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n }\n\n /**\n * Cleanup resources. Awaiting ensures remaining logs are flushed.\n */\n async destroy(): Promise<void> {\n this.stopFlushTimer();\n this.detachGlobalErrorHandlers();\n await this.flush();\n }\n}\n","import {\n type ValidateBuckets,\n type WithBuckets,\n attachBuckets,\n} from \"./buckets\";\nimport { GunsoleClient } from \"./client\";\nimport type { GunsoleClientConfig, ValidTagSchema } from \"./types\";\n\n/**\n * Config without buckets — used for overload resolution so that\n * a config with `buckets` falls through to the validated overload.\n */\ntype BaseConfig = Omit<GunsoleClientConfig, \"buckets\">;\n\n/**\n * Create a new Gunsole client instance\n *\n * @param config - Client configuration\n * @returns Gunsole client instance\n *\n * @example\n * ```ts\n * const gunsole = createGunsoleClient({\n * projectId: \"my-project\",\n * apiKey: \"my-api-key\",\n * mode: \"cloud\",\n * buckets: [\"payment\", \"auth\"],\n * });\n *\n * gunsole.payment(\"User paid\");\n * gunsole.auth.error(\"Login failed\");\n * ```\n */\nexport function createGunsoleClient<\n Tags extends Record<string, string> & ValidTagSchema = Record<\n string,\n string\n >,\n>(config: BaseConfig): GunsoleClient<Tags>;\nexport function createGunsoleClient<\n Tags extends Record<string, string> & ValidTagSchema = Record<\n string,\n string\n >,\n const Buckets extends readonly string[] = readonly string[],\n>(\n config: BaseConfig & {\n buckets: Buckets & NoInfer<ValidateBuckets<Buckets>>;\n }\n): GunsoleClient<Tags> & WithBuckets<Tags, Buckets[number]>;\nexport function createGunsoleClient<\n Tags extends Record<string, string> & ValidTagSchema = Record<\n string,\n string\n >,\n const Buckets extends readonly string[] = readonly string[],\n>(\n config: GunsoleClientConfig & { buckets?: Buckets }\n): GunsoleClient<Tags> & WithBuckets<Tags, Buckets[number]> {\n const client = new GunsoleClient<Tags>(config);\n const buckets = config.buckets ?? [];\n if (buckets.length > 0) {\n return attachBuckets<Tags, Buckets[number]>(client, buckets);\n }\n return client as GunsoleClient<Tags> &\n WithBuckets<Tags, Buckets[number]>;\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -43,8 +43,8 @@ function attachBuckets(client, buckets) {
|
|
|
43
43
|
|
|
44
44
|
// src/config.ts
|
|
45
45
|
var DEFAULT_ENDPOINTS = {
|
|
46
|
-
desktop: "http://localhost:
|
|
47
|
-
local: "
|
|
46
|
+
desktop: "http://localhost:17655",
|
|
47
|
+
local: "https://local.gunsole.com",
|
|
48
48
|
cloud: "https://api.gunsole.com"
|
|
49
49
|
};
|
|
50
50
|
var DEFAULT_CONFIG = {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/buckets.ts","../src/config.ts","../src/utils/env.ts","../src/transport.ts","../src/client.ts","../src/factory.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { GunsoleClient } from \"./client\";\nimport type { LogLevel, LogOptions } from \"./types\";\n\n/**\n * Log options for bucket methods (message is positional, bucket is implied)\n */\nexport type BucketLogOptions<\n Tags extends Record<string, string> = Record<string, string>,\n> = Omit<LogOptions<Tags>, \"bucket\" | \"message\">;\n\n/**\n * A callable bucket logger with level sub-methods\n */\nexport interface BucketLogger<\n Tags extends Record<string, string> = Record<string, string>,\n> {\n (message: string, options?: BucketLogOptions<Tags>): void;\n info(message: string, options?: BucketLogOptions<Tags>): void;\n debug(message: string, options?: BucketLogOptions<Tags>): void;\n warn(message: string, options?: BucketLogOptions<Tags>): void;\n error(message: string, options?: BucketLogOptions<Tags>): void;\n}\n\n/**\n * Mapped type that adds bucket accessors to a client\n */\nexport type WithBuckets<\n Tags extends Record<string, string> = Record<string, string>,\n Buckets extends string = string,\n> = { [K in Buckets]: BucketLogger<Tags> };\n\n/**\n * Bucket names that conflict with GunsoleClient methods\n */\nexport type ReservedBucketName =\n | \"log\"\n | \"info\"\n | \"debug\"\n | \"warn\"\n | \"error\"\n | \"setUser\"\n | \"setSessionId\"\n | \"flush\"\n | \"destroy\"\n | \"attachGlobalErrorHandlers\"\n | \"detachGlobalErrorHandlers\";\n\n/**\n * Validates a buckets tuple at the type level — reserved names become `never`\n */\nexport type ValidateBuckets<T extends readonly string[]> = {\n [K in keyof T]: T[K] extends ReservedBucketName ? never : T[K];\n};\n\nconst RESERVED_NAMES: Set<string> = new Set<ReservedBucketName>([\n \"log\",\n \"info\",\n \"debug\",\n \"warn\",\n \"error\",\n \"setUser\",\n \"setSessionId\",\n \"flush\",\n \"destroy\",\n \"attachGlobalErrorHandlers\",\n \"detachGlobalErrorHandlers\",\n]);\n\n/**\n * Create a BucketLogger for a specific bucket name\n */\nfunction createBucketLogger<\n Tags extends Record<string, string> = Record<string, string>,\n>(client: GunsoleClient<Tags>, bucketName: string): BucketLogger<Tags> {\n const logAtLevel = (\n level: LogLevel,\n message: string,\n options?: BucketLogOptions<Tags>\n ): void => {\n client.log(level, {\n ...options,\n message,\n bucket: bucketName,\n } as LogOptions<Tags>);\n };\n\n const logger = ((message: string, options?: BucketLogOptions<Tags>): void => {\n logAtLevel(\"info\", message, options);\n }) as BucketLogger<Tags>;\n\n logger.info = (message, options?) => logAtLevel(\"info\", message, options);\n logger.debug = (message, options?) => logAtLevel(\"debug\", message, options);\n logger.warn = (message, options?) => logAtLevel(\"warn\", message, options);\n logger.error = (message, options?) => logAtLevel(\"error\", message, options);\n\n return logger;\n}\n\n/**\n * Attach bucket accessors to a client instance\n */\nexport function attachBuckets<\n Tags extends Record<string, string> = Record<string, string>,\n Buckets extends string = string,\n>(\n client: GunsoleClient<Tags>,\n buckets: readonly string[]\n): GunsoleClient<Tags> & WithBuckets<Tags, Buckets> {\n for (const name of buckets) {\n if (RESERVED_NAMES.has(name)) {\n throw new Error(\n `Bucket name \"${name}\" conflicts with a reserved GunsoleClient method`\n );\n }\n (client as unknown as Record<string, unknown>)[name] =\n createBucketLogger(client, name);\n }\n return client as GunsoleClient<Tags> & WithBuckets<Tags, Buckets>;\n}\n","import type { ClientMode, GunsoleClientConfig } from \"./types\";\n\n/**\n * Default endpoints for each mode\n */\nconst DEFAULT_ENDPOINTS: Record<ClientMode, string> = {\n desktop: \"http://localhost:8787\",\n local: \"http://localhost:17655\",\n cloud: \"https://api.gunsole.com\",\n};\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG = {\n batchSize: 10,\n flushInterval: 5000,\n};\n\n/**\n * Resolve the endpoint URL based on mode and custom endpoint\n */\nexport function resolveEndpoint(\n mode: ClientMode,\n customEndpoint?: string\n): string {\n if (customEndpoint) {\n return customEndpoint;\n }\n return DEFAULT_ENDPOINTS[mode];\n}\n\n/**\n * Normalize and validate client configuration\n */\nexport function normalizeConfig(config: GunsoleClientConfig): Omit<\n Required<GunsoleClientConfig>,\n \"fetch\"\n> & {\n endpoint: string;\n fetch?: GunsoleClientConfig[\"fetch\"];\n} {\n if (!config.projectId) {\n throw new Error(\"projectId is required\");\n }\n return {\n projectId: config.projectId,\n apiKey: config.apiKey ?? \"\",\n mode: config.mode,\n endpoint: resolveEndpoint(config.mode, config.endpoint),\n env: config.env ?? \"\",\n appName: config.appName ?? \"\",\n appVersion: config.appVersion ?? \"\",\n defaultTags: config.defaultTags ?? {},\n batchSize: config.batchSize ?? DEFAULT_CONFIG.batchSize,\n flushInterval: config.flushInterval ?? DEFAULT_CONFIG.flushInterval,\n fetch: config.fetch,\n isDebug: config.isDebug ?? false,\n isDisabled: config.isDisabled ?? false,\n buckets: config.buckets ?? [],\n };\n}\n","import type { FetchFunction } from \"../types\";\n\n/**\n * Check if running in a browser environment\n */\nexport function isBrowser(): boolean {\n return (\n typeof window !== \"undefined\" && typeof window.document !== \"undefined\"\n );\n}\n\n/**\n * Check if running in Node.js environment\n */\nexport function isNode(): boolean {\n return (\n typeof process !== \"undefined\" &&\n typeof process.versions !== \"undefined\" &&\n typeof process.versions.node !== \"undefined\"\n );\n}\n\n/**\n * Get fetch implementation (browser or Node.js)\n * If a custom fetch is provided, it will be used instead.\n */\nexport function getFetch(customFetch?: FetchFunction): FetchFunction {\n if (customFetch) {\n return customFetch;\n }\n\n if (isBrowser()) {\n return window.fetch.bind(window);\n }\n if (isNode()) {\n // In Node.js 18+, fetch is available globally\n if (typeof globalThis.fetch !== \"undefined\") {\n return globalThis.fetch;\n }\n // For older Node.js versions, user must provide their own fetch\n throw new Error(\n \"fetch is not available. Please use Node.js 18+ or provide a custom fetch implementation in the config\"\n );\n }\n throw new Error(\"Unsupported environment: neither browser nor Node.js\");\n}\n","import type { BatchPayload, FetchFunction, InternalLogEntry } from \"./types.js\";\nimport { getFetch } from \"./utils/env.js\";\n\n/**\n * Maximum number of retry attempts\n */\nconst MAX_RETRIES = 3;\n\n/**\n * Base delay for exponential backoff (milliseconds)\n */\nconst BASE_DELAY_MS = 1000;\n\n/**\n * Calculate exponential backoff delay\n */\nfunction calculateBackoffDelay(attempt: number): number {\n return BASE_DELAY_MS * 2 ** attempt;\n}\n\n/**\n * Sleep utility for retry delays\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Gzip compress a string using the native Compression Streams API\n */\nasync function gzipCompress(input: string): Promise<Uint8Array> {\n const encoder = new TextEncoder();\n const stream = new Blob([encoder.encode(input)])\n .stream()\n .pipeThrough(new CompressionStream(\"gzip\"));\n return new Uint8Array(await new Response(stream).arrayBuffer());\n}\n\n/**\n * Minify and optionally compress payload\n */\nasync function compressPayload(\n payload: BatchPayload,\n isDebug: boolean\n): Promise<string | Uint8Array> {\n const minified = JSON.stringify(payload);\n\n if (isDebug) {\n return minified;\n }\n\n return gzipCompress(minified);\n}\n\n/**\n * Transport layer for sending logs to the Gunsole API\n */\nexport class Transport {\n private endpoint: string;\n private apiKey: string;\n private projectId: string;\n private fetch: FetchFunction;\n private isDebug: boolean;\n\n constructor(\n endpoint: string,\n apiKey: string,\n projectId: string,\n fetch?: FetchFunction,\n isDebug = false\n ) {\n this.endpoint = endpoint;\n this.apiKey = apiKey;\n this.projectId = projectId;\n this.fetch = fetch ?? getFetch();\n this.isDebug = isDebug;\n }\n\n /**\n * Send a batch of logs to the API\n * Implements retry logic with exponential backoff\n */\n async sendBatch(logs: InternalLogEntry[]): Promise<void> {\n if (logs.length === 0) {\n return;\n }\n\n const payload: BatchPayload = {\n projectId: this.projectId,\n logs,\n };\n\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n try {\n const body = await compressPayload(payload, this.isDebug);\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (this.apiKey) {\n headers[\"Authorization\"] = `Bearer ${this.apiKey}`;\n }\n\n // Only set Content-Encoding if not in debug mode\n if (!this.isDebug) {\n headers[\"Content-Encoding\"] = \"gzip\";\n }\n\n const response = await this.fetch(`${this.endpoint}/logs`, {\n method: \"POST\",\n headers,\n body: body as BodyInit,\n });\n\n if (response.ok) {\n return; // Success\n }\n\n // Non-2xx response\n const errorText = await response.text().catch(() => \"Unknown error\");\n lastError = new Error(`HTTP ${response.status}: ${errorText}`);\n\n // Don't retry client errors (4xx) except 429 (rate limited)\n if (response.status >= 400 && response.status < 500 && response.status !== 429) {\n break;\n }\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n }\n\n // If not the last attempt, wait before retrying\n if (attempt < MAX_RETRIES - 1) {\n const delay = calculateBackoffDelay(attempt);\n await sleep(delay);\n }\n }\n\n // All retries failed - silently swallow the error\n // This ensures the SDK never crashes the host application\n // In production, you might want to log this to console in debug mode\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Failed to send logs after retries:\", lastError);\n }\n }\n}\n","import { normalizeConfig } from \"./config\";\nimport { Transport } from \"./transport\";\nimport type {\n GunsoleClientConfig,\n InternalLogEntry,\n LogLevel,\n LogOptions,\n UserInfo,\n ValidTagSchema,\n} from \"./types\";\n\n/**\n * Global error handler state\n */\ninterface GlobalErrorHandlers {\n unhandledRejection?: (event: PromiseRejectionEvent) => void;\n unhandledRejectionNode?: (reason: unknown, promise: Promise<unknown>) => void;\n error?: (event: ErrorEvent) => void;\n uncaughtException?: (error: Error) => void;\n attached: boolean;\n}\n\n/**\n * Gunsole client for sending logs and events\n */\nexport class GunsoleClient<\n Tags extends Record<string, string> & ValidTagSchema = Record<\n string,\n string\n >,\n> {\n private config: ReturnType<typeof normalizeConfig>;\n private transport: Transport;\n private batch: InternalLogEntry[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private user: UserInfo | null = null;\n private sessionId: string | null = null;\n private globalHandlers: GlobalErrorHandlers = { attached: false };\n private readonly disabled: boolean;\n\n constructor(config: GunsoleClientConfig) {\n this.config = normalizeConfig(config);\n this.disabled = config.isDisabled ?? false;\n this.transport = new Transport(\n this.config.endpoint,\n this.config.apiKey,\n this.config.projectId,\n this.config.fetch,\n config.isDebug ?? false\n );\n\n if (this.disabled) {\n return;\n }\n\n this.startFlushTimer();\n }\n\n /**\n * Log a message. Defaults to info level.\n */\n log(options: LogOptions<Tags>): void;\n log(level: LogLevel, options: LogOptions<Tags>): void;\n log(\n levelOrOptions: LogLevel | LogOptions<Tags>,\n maybeOptions?: LogOptions<Tags>\n ): void {\n if (this.disabled) {\n return;\n }\n const level: LogLevel =\n typeof levelOrOptions === \"string\" ? levelOrOptions : \"info\";\n const options: LogOptions<Tags> =\n typeof levelOrOptions === \"string\" ? maybeOptions! : levelOrOptions;\n try {\n const internalEntry: InternalLogEntry = {\n level,\n bucket: options.bucket,\n message: options.message,\n context: options.context,\n timestamp: Date.now(),\n traceId: options.traceId,\n userId: this.user?.id,\n sessionId: this.sessionId ?? undefined,\n env: this.config.env || undefined,\n appName: this.config.appName || undefined,\n appVersion: this.config.appVersion || undefined,\n tags: {\n ...this.config.defaultTags,\n ...(Array.isArray(options.tags)\n ? Object.assign({}, ...options.tags)\n : options.tags),\n },\n };\n\n this.batch.push(internalEntry);\n\n // Flush if batch is full\n if (this.batch.length >= this.config.batchSize) {\n this.flush();\n }\n } catch (error) {\n // Silently swallow errors - never crash the host app\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Error in log():\", error);\n }\n }\n }\n\n /**\n * Log an info-level message\n */\n info(options: LogOptions<Tags>): void {\n this.log(\"info\", options);\n }\n\n debug(options: LogOptions<Tags>): void {\n this.log(\"debug\", options);\n }\n\n warn(options: LogOptions<Tags>): void {\n this.log(\"warn\", options);\n }\n\n error(options: LogOptions<Tags>): void {\n this.log(\"error\", options);\n }\n\n /**\n * Set user information\n */\n setUser(user: UserInfo): void {\n if (this.disabled) {\n return;\n }\n try {\n this.user = user;\n } catch (error) {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Error in setUser():\", error);\n }\n }\n }\n\n /**\n * Set session ID\n */\n setSessionId(sessionId: string): void {\n if (this.disabled) {\n return;\n }\n try {\n this.sessionId = sessionId;\n } catch (error) {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Error in setSessionId():\", error);\n }\n }\n }\n\n /**\n * Flush pending logs to the API\n */\n async flush(): Promise<void> {\n if (this.disabled) {\n return;\n }\n try {\n if (this.batch.length === 0) {\n return;\n }\n\n const logsToSend = [...this.batch];\n this.batch = [];\n\n await this.transport.sendBatch(logsToSend);\n } catch (error) {\n // Silently swallow errors\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Error in flush():\", error);\n }\n }\n }\n\n /**\n * Attach global error handlers\n */\n attachGlobalErrorHandlers(): void {\n if (this.disabled) {\n return;\n }\n try {\n if (this.globalHandlers.attached) {\n return;\n }\n\n // Unhandled promise rejections\n this.globalHandlers.unhandledRejection = (\n event: PromiseRejectionEvent\n ) => {\n this.error({\n message: \"Unhandled promise rejection\",\n bucket: \"unhandled_rejection\",\n context: {\n reason: String(event.reason),\n error:\n event.reason instanceof Error\n ? {\n name: event.reason.name,\n message: event.reason.message,\n stack: event.reason.stack,\n }\n : event.reason,\n },\n });\n };\n\n // Global errors\n this.globalHandlers.error = (event: ErrorEvent) => {\n this.error({\n message: event.message || \"Global error\",\n bucket: \"global_error\",\n context: {\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n error: event.error\n ? {\n name: event.error.name,\n message: event.error.message,\n stack: event.error.stack,\n }\n : undefined,\n },\n });\n };\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\n \"unhandledrejection\",\n this.globalHandlers.unhandledRejection\n );\n window.addEventListener(\"error\", this.globalHandlers.error);\n }\n\n if (typeof process !== \"undefined\") {\n this.globalHandlers.unhandledRejectionNode = (\n reason: unknown,\n _promise: Promise<unknown>\n ) => {\n this.error({\n message: \"Unhandled promise rejection\",\n bucket: \"unhandled_rejection\",\n context: {\n reason: String(reason),\n error:\n reason instanceof Error\n ? {\n name: reason.name,\n message: reason.message,\n stack: reason.stack,\n }\n : reason,\n },\n });\n };\n\n this.globalHandlers.uncaughtException = (error: Error) => {\n this.error({\n message: error.message,\n bucket: \"uncaught_exception\",\n context: {\n name: error.name,\n stack: error.stack,\n },\n });\n };\n\n process.on(\n \"unhandledRejection\",\n this.globalHandlers.unhandledRejectionNode\n );\n process.on(\"uncaughtException\", this.globalHandlers.uncaughtException);\n }\n\n this.globalHandlers.attached = true;\n } catch (error) {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Error in attachGlobalErrorHandlers():\", error);\n }\n }\n }\n\n /**\n * Detach global error handlers\n */\n detachGlobalErrorHandlers(): void {\n try {\n if (!this.globalHandlers.attached) {\n return;\n }\n\n if (typeof window !== \"undefined\") {\n if (this.globalHandlers.unhandledRejection) {\n window.removeEventListener(\n \"unhandledrejection\",\n this.globalHandlers.unhandledRejection\n );\n }\n if (this.globalHandlers.error) {\n window.removeEventListener(\"error\", this.globalHandlers.error);\n }\n }\n\n if (typeof process !== \"undefined\") {\n if (this.globalHandlers.unhandledRejectionNode) {\n process.removeListener(\n \"unhandledRejection\",\n this.globalHandlers.unhandledRejectionNode\n );\n }\n if (this.globalHandlers.uncaughtException) {\n process.removeListener(\n \"uncaughtException\",\n this.globalHandlers.uncaughtException\n );\n }\n }\n\n this.globalHandlers = { attached: false };\n } catch (error) {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Error in detachGlobalErrorHandlers():\", error);\n }\n }\n }\n\n /**\n * Start the automatic flush timer\n */\n private startFlushTimer(): void {\n if (this.flushTimer) {\n return;\n }\n\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.config.flushInterval);\n }\n\n /**\n * Stop the automatic flush timer\n */\n private stopFlushTimer(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n }\n\n /**\n * Cleanup resources. Awaiting ensures remaining logs are flushed.\n */\n async destroy(): Promise<void> {\n this.stopFlushTimer();\n this.detachGlobalErrorHandlers();\n await this.flush();\n }\n}\n","import {\n type ValidateBuckets,\n type WithBuckets,\n attachBuckets,\n} from \"./buckets\";\nimport { GunsoleClient } from \"./client\";\nimport type { GunsoleClientConfig, ValidTagSchema } from \"./types\";\n\n/**\n * Config without buckets — used for overload resolution so that\n * a config with `buckets` falls through to the validated overload.\n */\ntype BaseConfig = Omit<GunsoleClientConfig, \"buckets\">;\n\n/**\n * Create a new Gunsole client instance\n *\n * @param config - Client configuration\n * @returns Gunsole client instance\n *\n * @example\n * ```ts\n * const gunsole = createGunsoleClient({\n * projectId: \"my-project\",\n * apiKey: \"my-api-key\",\n * mode: \"cloud\",\n * buckets: [\"payment\", \"auth\"],\n * });\n *\n * gunsole.payment(\"User paid\");\n * gunsole.auth.error(\"Login failed\");\n * ```\n */\nexport function createGunsoleClient<\n Tags extends Record<string, string> & ValidTagSchema = Record<\n string,\n string\n >,\n>(config: BaseConfig): GunsoleClient<Tags>;\nexport function createGunsoleClient<\n Tags extends Record<string, string> & ValidTagSchema = Record<\n string,\n string\n >,\n const Buckets extends readonly string[] = readonly string[],\n>(\n config: BaseConfig & {\n buckets: Buckets & NoInfer<ValidateBuckets<Buckets>>;\n }\n): GunsoleClient<Tags> & WithBuckets<Tags, Buckets[number]>;\nexport function createGunsoleClient<\n Tags extends Record<string, string> & ValidTagSchema = Record<\n string,\n string\n >,\n const Buckets extends readonly string[] = readonly string[],\n>(\n config: GunsoleClientConfig & { buckets?: Buckets }\n): GunsoleClient<Tags> & WithBuckets<Tags, Buckets[number]> {\n const client = new GunsoleClient<Tags>(config);\n const buckets = config.buckets ?? [];\n if (buckets.length > 0) {\n return attachBuckets<Tags, Buckets[number]>(client, buckets);\n }\n return client as GunsoleClient<Tags> &\n WithBuckets<Tags, Buckets[number]>;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/buckets.ts","../src/config.ts","../src/utils/env.ts","../src/transport.ts","../src/client.ts","../src/factory.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { GunsoleClient } from \"./client\";\nimport type { LogLevel, LogOptions } from \"./types\";\n\n/**\n * Log options for bucket methods (message is positional, bucket is implied)\n */\nexport type BucketLogOptions<\n Tags extends Record<string, string> = Record<string, string>,\n> = Omit<LogOptions<Tags>, \"bucket\" | \"message\">;\n\n/**\n * A callable bucket logger with level sub-methods\n */\nexport interface BucketLogger<\n Tags extends Record<string, string> = Record<string, string>,\n> {\n (message: string, options?: BucketLogOptions<Tags>): void;\n info(message: string, options?: BucketLogOptions<Tags>): void;\n debug(message: string, options?: BucketLogOptions<Tags>): void;\n warn(message: string, options?: BucketLogOptions<Tags>): void;\n error(message: string, options?: BucketLogOptions<Tags>): void;\n}\n\n/**\n * Mapped type that adds bucket accessors to a client\n */\nexport type WithBuckets<\n Tags extends Record<string, string> = Record<string, string>,\n Buckets extends string = string,\n> = { [K in Buckets]: BucketLogger<Tags> };\n\n/**\n * Bucket names that conflict with GunsoleClient methods\n */\nexport type ReservedBucketName =\n | \"log\"\n | \"info\"\n | \"debug\"\n | \"warn\"\n | \"error\"\n | \"setUser\"\n | \"setSessionId\"\n | \"flush\"\n | \"destroy\"\n | \"attachGlobalErrorHandlers\"\n | \"detachGlobalErrorHandlers\";\n\n/**\n * Validates a buckets tuple at the type level — reserved names become `never`\n */\nexport type ValidateBuckets<T extends readonly string[]> = {\n [K in keyof T]: T[K] extends ReservedBucketName ? never : T[K];\n};\n\nconst RESERVED_NAMES: Set<string> = new Set<ReservedBucketName>([\n \"log\",\n \"info\",\n \"debug\",\n \"warn\",\n \"error\",\n \"setUser\",\n \"setSessionId\",\n \"flush\",\n \"destroy\",\n \"attachGlobalErrorHandlers\",\n \"detachGlobalErrorHandlers\",\n]);\n\n/**\n * Create a BucketLogger for a specific bucket name\n */\nfunction createBucketLogger<\n Tags extends Record<string, string> = Record<string, string>,\n>(client: GunsoleClient<Tags>, bucketName: string): BucketLogger<Tags> {\n const logAtLevel = (\n level: LogLevel,\n message: string,\n options?: BucketLogOptions<Tags>\n ): void => {\n client.log(level, {\n ...options,\n message,\n bucket: bucketName,\n } as LogOptions<Tags>);\n };\n\n const logger = ((message: string, options?: BucketLogOptions<Tags>): void => {\n logAtLevel(\"info\", message, options);\n }) as BucketLogger<Tags>;\n\n logger.info = (message, options?) => logAtLevel(\"info\", message, options);\n logger.debug = (message, options?) => logAtLevel(\"debug\", message, options);\n logger.warn = (message, options?) => logAtLevel(\"warn\", message, options);\n logger.error = (message, options?) => logAtLevel(\"error\", message, options);\n\n return logger;\n}\n\n/**\n * Attach bucket accessors to a client instance\n */\nexport function attachBuckets<\n Tags extends Record<string, string> = Record<string, string>,\n Buckets extends string = string,\n>(\n client: GunsoleClient<Tags>,\n buckets: readonly string[]\n): GunsoleClient<Tags> & WithBuckets<Tags, Buckets> {\n for (const name of buckets) {\n if (RESERVED_NAMES.has(name)) {\n throw new Error(\n `Bucket name \"${name}\" conflicts with a reserved GunsoleClient method`\n );\n }\n (client as unknown as Record<string, unknown>)[name] =\n createBucketLogger(client, name);\n }\n return client as GunsoleClient<Tags> & WithBuckets<Tags, Buckets>;\n}\n","import type { ClientMode, GunsoleClientConfig } from \"./types\";\n\n/**\n * Default endpoints for each mode\n */\nconst DEFAULT_ENDPOINTS: Record<ClientMode, string> = {\n desktop: \"http://localhost:17655\",\n local: \"https://local.gunsole.com\",\n cloud: \"https://api.gunsole.com\",\n};\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG = {\n batchSize: 10,\n flushInterval: 5000,\n};\n\n/**\n * Resolve the endpoint URL based on mode and custom endpoint\n */\nexport function resolveEndpoint(\n mode: ClientMode,\n customEndpoint?: string\n): string {\n if (customEndpoint) {\n return customEndpoint;\n }\n return DEFAULT_ENDPOINTS[mode];\n}\n\n/**\n * Normalize and validate client configuration\n */\nexport function normalizeConfig(config: GunsoleClientConfig): Omit<\n Required<GunsoleClientConfig>,\n \"fetch\"\n> & {\n endpoint: string;\n fetch?: GunsoleClientConfig[\"fetch\"];\n} {\n if (!config.projectId) {\n throw new Error(\"projectId is required\");\n }\n return {\n projectId: config.projectId,\n apiKey: config.apiKey ?? \"\",\n mode: config.mode,\n endpoint: resolveEndpoint(config.mode, config.endpoint),\n env: config.env ?? \"\",\n appName: config.appName ?? \"\",\n appVersion: config.appVersion ?? \"\",\n defaultTags: config.defaultTags ?? {},\n batchSize: config.batchSize ?? DEFAULT_CONFIG.batchSize,\n flushInterval: config.flushInterval ?? DEFAULT_CONFIG.flushInterval,\n fetch: config.fetch,\n isDebug: config.isDebug ?? false,\n isDisabled: config.isDisabled ?? false,\n buckets: config.buckets ?? [],\n };\n}\n","import type { FetchFunction } from \"../types\";\n\n/**\n * Check if running in a browser environment\n */\nexport function isBrowser(): boolean {\n return (\n typeof window !== \"undefined\" && typeof window.document !== \"undefined\"\n );\n}\n\n/**\n * Check if running in Node.js environment\n */\nexport function isNode(): boolean {\n return (\n typeof process !== \"undefined\" &&\n typeof process.versions !== \"undefined\" &&\n typeof process.versions.node !== \"undefined\"\n );\n}\n\n/**\n * Get fetch implementation (browser or Node.js)\n * If a custom fetch is provided, it will be used instead.\n */\nexport function getFetch(customFetch?: FetchFunction): FetchFunction {\n if (customFetch) {\n return customFetch;\n }\n\n if (isBrowser()) {\n return window.fetch.bind(window);\n }\n if (isNode()) {\n // In Node.js 18+, fetch is available globally\n if (typeof globalThis.fetch !== \"undefined\") {\n return globalThis.fetch;\n }\n // For older Node.js versions, user must provide their own fetch\n throw new Error(\n \"fetch is not available. Please use Node.js 18+ or provide a custom fetch implementation in the config\"\n );\n }\n throw new Error(\"Unsupported environment: neither browser nor Node.js\");\n}\n","import type { BatchPayload, FetchFunction, InternalLogEntry } from \"./types.js\";\nimport { getFetch } from \"./utils/env.js\";\n\n/**\n * Maximum number of retry attempts\n */\nconst MAX_RETRIES = 3;\n\n/**\n * Base delay for exponential backoff (milliseconds)\n */\nconst BASE_DELAY_MS = 1000;\n\n/**\n * Calculate exponential backoff delay\n */\nfunction calculateBackoffDelay(attempt: number): number {\n return BASE_DELAY_MS * 2 ** attempt;\n}\n\n/**\n * Sleep utility for retry delays\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Gzip compress a string using the native Compression Streams API\n */\nasync function gzipCompress(input: string): Promise<Uint8Array> {\n const encoder = new TextEncoder();\n const stream = new Blob([encoder.encode(input)])\n .stream()\n .pipeThrough(new CompressionStream(\"gzip\"));\n return new Uint8Array(await new Response(stream).arrayBuffer());\n}\n\n/**\n * Minify and optionally compress payload\n */\nasync function compressPayload(\n payload: BatchPayload,\n isDebug: boolean\n): Promise<string | Uint8Array> {\n const minified = JSON.stringify(payload);\n\n if (isDebug) {\n return minified;\n }\n\n return gzipCompress(minified);\n}\n\n/**\n * Transport layer for sending logs to the Gunsole API\n */\nexport class Transport {\n private endpoint: string;\n private apiKey: string;\n private projectId: string;\n private fetch: FetchFunction;\n private isDebug: boolean;\n\n constructor(\n endpoint: string,\n apiKey: string,\n projectId: string,\n fetch?: FetchFunction,\n isDebug = false\n ) {\n this.endpoint = endpoint;\n this.apiKey = apiKey;\n this.projectId = projectId;\n this.fetch = fetch ?? getFetch();\n this.isDebug = isDebug;\n }\n\n /**\n * Send a batch of logs to the API\n * Implements retry logic with exponential backoff\n */\n async sendBatch(logs: InternalLogEntry[]): Promise<void> {\n if (logs.length === 0) {\n return;\n }\n\n const payload: BatchPayload = {\n projectId: this.projectId,\n logs,\n };\n\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n try {\n const body = await compressPayload(payload, this.isDebug);\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (this.apiKey) {\n headers[\"Authorization\"] = `Bearer ${this.apiKey}`;\n }\n\n // Only set Content-Encoding if not in debug mode\n if (!this.isDebug) {\n headers[\"Content-Encoding\"] = \"gzip\";\n }\n\n const response = await this.fetch(`${this.endpoint}/logs`, {\n method: \"POST\",\n headers,\n body: body as BodyInit,\n });\n\n if (response.ok) {\n return; // Success\n }\n\n // Non-2xx response\n const errorText = await response.text().catch(() => \"Unknown error\");\n lastError = new Error(`HTTP ${response.status}: ${errorText}`);\n\n // Don't retry client errors (4xx) except 429 (rate limited)\n if (response.status >= 400 && response.status < 500 && response.status !== 429) {\n break;\n }\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n }\n\n // If not the last attempt, wait before retrying\n if (attempt < MAX_RETRIES - 1) {\n const delay = calculateBackoffDelay(attempt);\n await sleep(delay);\n }\n }\n\n // All retries failed - silently swallow the error\n // This ensures the SDK never crashes the host application\n // In production, you might want to log this to console in debug mode\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Failed to send logs after retries:\", lastError);\n }\n }\n}\n","import { normalizeConfig } from \"./config\";\nimport { Transport } from \"./transport\";\nimport type {\n GunsoleClientConfig,\n InternalLogEntry,\n LogLevel,\n LogOptions,\n UserInfo,\n ValidTagSchema,\n} from \"./types\";\n\n/**\n * Global error handler state\n */\ninterface GlobalErrorHandlers {\n unhandledRejection?: (event: PromiseRejectionEvent) => void;\n unhandledRejectionNode?: (reason: unknown, promise: Promise<unknown>) => void;\n error?: (event: ErrorEvent) => void;\n uncaughtException?: (error: Error) => void;\n attached: boolean;\n}\n\n/**\n * Gunsole client for sending logs and events\n */\nexport class GunsoleClient<\n Tags extends Record<string, string> & ValidTagSchema = Record<\n string,\n string\n >,\n> {\n private config: ReturnType<typeof normalizeConfig>;\n private transport: Transport;\n private batch: InternalLogEntry[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private user: UserInfo | null = null;\n private sessionId: string | null = null;\n private globalHandlers: GlobalErrorHandlers = { attached: false };\n private readonly disabled: boolean;\n\n constructor(config: GunsoleClientConfig) {\n this.config = normalizeConfig(config);\n this.disabled = config.isDisabled ?? false;\n this.transport = new Transport(\n this.config.endpoint,\n this.config.apiKey,\n this.config.projectId,\n this.config.fetch,\n config.isDebug ?? false\n );\n\n if (this.disabled) {\n return;\n }\n\n this.startFlushTimer();\n }\n\n /**\n * Log a message. Defaults to info level.\n */\n log(options: LogOptions<Tags>): void;\n log(level: LogLevel, options: LogOptions<Tags>): void;\n log(\n levelOrOptions: LogLevel | LogOptions<Tags>,\n maybeOptions?: LogOptions<Tags>\n ): void {\n if (this.disabled) {\n return;\n }\n const level: LogLevel =\n typeof levelOrOptions === \"string\" ? levelOrOptions : \"info\";\n const options: LogOptions<Tags> =\n typeof levelOrOptions === \"string\" ? maybeOptions! : levelOrOptions;\n try {\n const internalEntry: InternalLogEntry = {\n level,\n bucket: options.bucket,\n message: options.message,\n context: options.context,\n timestamp: Date.now(),\n traceId: options.traceId,\n userId: this.user?.id,\n sessionId: this.sessionId ?? undefined,\n env: this.config.env || undefined,\n appName: this.config.appName || undefined,\n appVersion: this.config.appVersion || undefined,\n tags: {\n ...this.config.defaultTags,\n ...(Array.isArray(options.tags)\n ? Object.assign({}, ...options.tags)\n : options.tags),\n },\n };\n\n this.batch.push(internalEntry);\n\n // Flush if batch is full\n if (this.batch.length >= this.config.batchSize) {\n this.flush();\n }\n } catch (error) {\n // Silently swallow errors - never crash the host app\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Error in log():\", error);\n }\n }\n }\n\n /**\n * Log an info-level message\n */\n info(options: LogOptions<Tags>): void {\n this.log(\"info\", options);\n }\n\n debug(options: LogOptions<Tags>): void {\n this.log(\"debug\", options);\n }\n\n warn(options: LogOptions<Tags>): void {\n this.log(\"warn\", options);\n }\n\n error(options: LogOptions<Tags>): void {\n this.log(\"error\", options);\n }\n\n /**\n * Set user information\n */\n setUser(user: UserInfo): void {\n if (this.disabled) {\n return;\n }\n try {\n this.user = user;\n } catch (error) {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Error in setUser():\", error);\n }\n }\n }\n\n /**\n * Set session ID\n */\n setSessionId(sessionId: string): void {\n if (this.disabled) {\n return;\n }\n try {\n this.sessionId = sessionId;\n } catch (error) {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Error in setSessionId():\", error);\n }\n }\n }\n\n /**\n * Flush pending logs to the API\n */\n async flush(): Promise<void> {\n if (this.disabled) {\n return;\n }\n try {\n if (this.batch.length === 0) {\n return;\n }\n\n const logsToSend = [...this.batch];\n this.batch = [];\n\n await this.transport.sendBatch(logsToSend);\n } catch (error) {\n // Silently swallow errors\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Error in flush():\", error);\n }\n }\n }\n\n /**\n * Attach global error handlers\n */\n attachGlobalErrorHandlers(): void {\n if (this.disabled) {\n return;\n }\n try {\n if (this.globalHandlers.attached) {\n return;\n }\n\n // Unhandled promise rejections\n this.globalHandlers.unhandledRejection = (\n event: PromiseRejectionEvent\n ) => {\n this.error({\n message: \"Unhandled promise rejection\",\n bucket: \"unhandled_rejection\",\n context: {\n reason: String(event.reason),\n error:\n event.reason instanceof Error\n ? {\n name: event.reason.name,\n message: event.reason.message,\n stack: event.reason.stack,\n }\n : event.reason,\n },\n });\n };\n\n // Global errors\n this.globalHandlers.error = (event: ErrorEvent) => {\n this.error({\n message: event.message || \"Global error\",\n bucket: \"global_error\",\n context: {\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n error: event.error\n ? {\n name: event.error.name,\n message: event.error.message,\n stack: event.error.stack,\n }\n : undefined,\n },\n });\n };\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\n \"unhandledrejection\",\n this.globalHandlers.unhandledRejection\n );\n window.addEventListener(\"error\", this.globalHandlers.error);\n }\n\n if (typeof process !== \"undefined\") {\n this.globalHandlers.unhandledRejectionNode = (\n reason: unknown,\n _promise: Promise<unknown>\n ) => {\n this.error({\n message: \"Unhandled promise rejection\",\n bucket: \"unhandled_rejection\",\n context: {\n reason: String(reason),\n error:\n reason instanceof Error\n ? {\n name: reason.name,\n message: reason.message,\n stack: reason.stack,\n }\n : reason,\n },\n });\n };\n\n this.globalHandlers.uncaughtException = (error: Error) => {\n this.error({\n message: error.message,\n bucket: \"uncaught_exception\",\n context: {\n name: error.name,\n stack: error.stack,\n },\n });\n };\n\n process.on(\n \"unhandledRejection\",\n this.globalHandlers.unhandledRejectionNode\n );\n process.on(\"uncaughtException\", this.globalHandlers.uncaughtException);\n }\n\n this.globalHandlers.attached = true;\n } catch (error) {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Error in attachGlobalErrorHandlers():\", error);\n }\n }\n }\n\n /**\n * Detach global error handlers\n */\n detachGlobalErrorHandlers(): void {\n try {\n if (!this.globalHandlers.attached) {\n return;\n }\n\n if (typeof window !== \"undefined\") {\n if (this.globalHandlers.unhandledRejection) {\n window.removeEventListener(\n \"unhandledrejection\",\n this.globalHandlers.unhandledRejection\n );\n }\n if (this.globalHandlers.error) {\n window.removeEventListener(\"error\", this.globalHandlers.error);\n }\n }\n\n if (typeof process !== \"undefined\") {\n if (this.globalHandlers.unhandledRejectionNode) {\n process.removeListener(\n \"unhandledRejection\",\n this.globalHandlers.unhandledRejectionNode\n );\n }\n if (this.globalHandlers.uncaughtException) {\n process.removeListener(\n \"uncaughtException\",\n this.globalHandlers.uncaughtException\n );\n }\n }\n\n this.globalHandlers = { attached: false };\n } catch (error) {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\"[Gunsole] Error in detachGlobalErrorHandlers():\", error);\n }\n }\n }\n\n /**\n * Start the automatic flush timer\n */\n private startFlushTimer(): void {\n if (this.flushTimer) {\n return;\n }\n\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.config.flushInterval);\n }\n\n /**\n * Stop the automatic flush timer\n */\n private stopFlushTimer(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n }\n\n /**\n * Cleanup resources. Awaiting ensures remaining logs are flushed.\n */\n async destroy(): Promise<void> {\n this.stopFlushTimer();\n this.detachGlobalErrorHandlers();\n await this.flush();\n }\n}\n","import {\n type ValidateBuckets,\n type WithBuckets,\n attachBuckets,\n} from \"./buckets\";\nimport { GunsoleClient } from \"./client\";\nimport type { GunsoleClientConfig, ValidTagSchema } from \"./types\";\n\n/**\n * Config without buckets — used for overload resolution so that\n * a config with `buckets` falls through to the validated overload.\n */\ntype BaseConfig = Omit<GunsoleClientConfig, \"buckets\">;\n\n/**\n * Create a new Gunsole client instance\n *\n * @param config - Client configuration\n * @returns Gunsole client instance\n *\n * @example\n * ```ts\n * const gunsole = createGunsoleClient({\n * projectId: \"my-project\",\n * apiKey: \"my-api-key\",\n * mode: \"cloud\",\n * buckets: [\"payment\", \"auth\"],\n * });\n *\n * gunsole.payment(\"User paid\");\n * gunsole.auth.error(\"Login failed\");\n * ```\n */\nexport function createGunsoleClient<\n Tags extends Record<string, string> & ValidTagSchema = Record<\n string,\n string\n >,\n>(config: BaseConfig): GunsoleClient<Tags>;\nexport function createGunsoleClient<\n Tags extends Record<string, string> & ValidTagSchema = Record<\n string,\n string\n >,\n const Buckets extends readonly string[] = readonly string[],\n>(\n config: BaseConfig & {\n buckets: Buckets & NoInfer<ValidateBuckets<Buckets>>;\n }\n): GunsoleClient<Tags> & WithBuckets<Tags, Buckets[number]>;\nexport function createGunsoleClient<\n Tags extends Record<string, string> & ValidTagSchema = Record<\n string,\n string\n >,\n const Buckets extends readonly string[] = readonly string[],\n>(\n config: GunsoleClientConfig & { buckets?: Buckets }\n): GunsoleClient<Tags> & WithBuckets<Tags, Buckets[number]> {\n const client = new GunsoleClient<Tags>(config);\n const buckets = config.buckets ?? [];\n if (buckets.length > 0) {\n return attachBuckets<Tags, Buckets[number]>(client, buckets);\n }\n return client as GunsoleClient<Tags> &\n WithBuckets<Tags, Buckets[number]>;\n}\n"]}
|