@klime/node 1.0.3 → 1.2.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 +233 -25
- package/dist/index.cjs +545 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +110 -0
- package/dist/index.d.ts +86 -4
- package/dist/index.js +483 -393
- package/dist/index.js.map +1 -0
- package/package.json +18 -3
- package/dist/types.d.ts +0 -54
- package/dist/types.js +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/types.ts"],"sourcesContent":["import * as https from \"https\";\nimport * as http from \"http\";\nimport * as url from \"url\";\nimport {\n KlimeConfig,\n TrackOptions,\n IdentifyOptions,\n GroupOptions,\n Event,\n BatchRequest,\n BatchResponse,\n EventContext,\n Logger,\n SendError,\n} from \"./types\";\n\n// Re-export types for users\nexport { SendError, BatchResponse, Logger } from \"./types\";\nexport type { KlimeConfig, TrackOptions, IdentifyOptions, GroupOptions, Event } from \"./types\";\n\nconst DEFAULT_ENDPOINT = \"https://i.klime.com\";\nconst DEFAULT_FLUSH_INTERVAL = 2000;\nconst DEFAULT_MAX_BATCH_SIZE = 20;\nconst DEFAULT_MAX_QUEUE_SIZE = 1000;\nconst DEFAULT_RETRY_MAX_ATTEMPTS = 5;\nconst DEFAULT_RETRY_INITIAL_DELAY = 1000;\nconst MAX_BATCH_SIZE = 100;\nconst MAX_EVENT_SIZE_BYTES = 200 * 1024; // 200KB\nconst MAX_BATCH_SIZE_BYTES = 10 * 1024 * 1024; // 10MB\nconst SDK_VERSION = \"1.1.0\";\n\n// Check if fetch is available (Node 18+)\nconst hasNativeFetch = typeof fetch !== \"undefined\";\n\n// Default logger that wraps console with [Klime] prefix\nconst createDefaultLogger = (): Logger => ({\n debug: (message: string, ...args: any[]) =>\n console.debug(`[Klime] ${message}`, ...args),\n info: (message: string, ...args: any[]) =>\n console.info(`[Klime] ${message}`, ...args),\n warn: (message: string, ...args: any[]) =>\n console.warn(`[Klime] ${message}`, ...args),\n error: (message: string, ...args: any[]) =>\n console.error(`[Klime] ${message}`, ...args),\n});\n\n// Internal config type with required fields and optional callbacks/logger\ninterface InternalConfig {\n writeKey: string;\n endpoint: string;\n flushInterval: number;\n maxBatchSize: number;\n maxQueueSize: number;\n retryMaxAttempts: number;\n retryInitialDelay: number;\n flushOnShutdown: boolean;\n logger: Logger;\n onError?: (error: Error, events: Event[]) => void;\n onSuccess?: (response: BatchResponse) => void;\n}\n\nexport class KlimeClient {\n private config: InternalConfig;\n private queue: Event[] = [];\n private flushTimer: NodeJS.Timeout | null = null;\n private isShutdown = false;\n private flushPromise: Promise<void> | null = null;\n private shutdownHandlers: (() => void)[] = [];\n\n constructor(config: KlimeConfig) {\n if (!config.writeKey) {\n throw new Error(\"writeKey is required\");\n }\n\n this.config = {\n writeKey: config.writeKey,\n endpoint: config.endpoint || DEFAULT_ENDPOINT,\n flushInterval: config.flushInterval ?? DEFAULT_FLUSH_INTERVAL,\n maxBatchSize: Math.min(\n config.maxBatchSize ?? DEFAULT_MAX_BATCH_SIZE,\n MAX_BATCH_SIZE\n ),\n maxQueueSize: config.maxQueueSize ?? DEFAULT_MAX_QUEUE_SIZE,\n retryMaxAttempts: config.retryMaxAttempts ?? DEFAULT_RETRY_MAX_ATTEMPTS,\n retryInitialDelay:\n config.retryInitialDelay ?? DEFAULT_RETRY_INITIAL_DELAY,\n flushOnShutdown: config.flushOnShutdown ?? true,\n logger: config.logger ?? createDefaultLogger(),\n onError: config.onError,\n onSuccess: config.onSuccess,\n };\n\n if (this.config.flushOnShutdown) {\n const shutdownHandler = async () => {\n await this.shutdown();\n };\n process.on(\"SIGTERM\", shutdownHandler);\n process.on(\"SIGINT\", shutdownHandler);\n this.shutdownHandlers.push(() => {\n process.removeListener(\"SIGTERM\", shutdownHandler);\n process.removeListener(\"SIGINT\", shutdownHandler);\n });\n }\n\n this.scheduleFlush();\n }\n\n track(\n event: string,\n properties?: Record<string, any>,\n options?: TrackOptions\n ): void {\n if (this.isShutdown) {\n return;\n }\n\n const eventObj: Event = {\n type: \"track\",\n messageId: this.generateUUID(),\n event,\n timestamp: this.generateTimestamp(),\n properties: properties || {},\n context: this.getContext(),\n };\n\n if (options?.userId) {\n eventObj.userId = options.userId;\n }\n if (options?.groupId) {\n eventObj.groupId = options.groupId;\n }\n\n this.enqueue(eventObj);\n }\n\n identify(\n userId: string,\n traits?: Record<string, any>,\n options?: IdentifyOptions\n ): void {\n if (this.isShutdown) {\n return;\n }\n\n const eventObj: Event = {\n type: \"identify\",\n messageId: this.generateUUID(),\n userId,\n timestamp: this.generateTimestamp(),\n traits: traits || {},\n context: this.getContext(),\n };\n\n this.enqueue(eventObj);\n }\n\n group(\n groupId: string,\n traits?: Record<string, any>,\n options?: GroupOptions\n ): void {\n if (this.isShutdown) {\n return;\n }\n\n const eventObj: Event = {\n type: \"group\",\n messageId: this.generateUUID(),\n groupId,\n timestamp: this.generateTimestamp(),\n traits: traits || {},\n context: this.getContext(),\n };\n\n if (options?.userId) {\n eventObj.userId = options.userId;\n }\n\n this.enqueue(eventObj);\n }\n\n /**\n * Track an event synchronously. Returns BatchResponse or throws SendError.\n */\n async trackSync(\n event: string,\n properties?: Record<string, any>,\n options?: TrackOptions\n ): Promise<BatchResponse> {\n if (this.isShutdown) {\n throw new SendError(\"Client is shutdown\", []);\n }\n\n const eventObj: Event = {\n type: \"track\",\n messageId: this.generateUUID(),\n event,\n timestamp: this.generateTimestamp(),\n properties: properties || {},\n context: this.getContext(),\n };\n\n if (options?.userId) {\n eventObj.userId = options.userId;\n }\n if (options?.groupId) {\n eventObj.groupId = options.groupId;\n }\n\n return this.sendSync([eventObj]);\n }\n\n /**\n * Identify a user synchronously. Returns BatchResponse or throws SendError.\n */\n async identifySync(\n userId: string,\n traits?: Record<string, any>,\n options?: IdentifyOptions\n ): Promise<BatchResponse> {\n if (this.isShutdown) {\n throw new SendError(\"Client is shutdown\", []);\n }\n\n const eventObj: Event = {\n type: \"identify\",\n messageId: this.generateUUID(),\n userId,\n timestamp: this.generateTimestamp(),\n traits: traits || {},\n context: this.getContext(),\n };\n\n return this.sendSync([eventObj]);\n }\n\n /**\n * Associate a user with a group synchronously. Returns BatchResponse or throws SendError.\n */\n async groupSync(\n groupId: string,\n traits?: Record<string, any>,\n options?: GroupOptions\n ): Promise<BatchResponse> {\n if (this.isShutdown) {\n throw new SendError(\"Client is shutdown\", []);\n }\n\n const eventObj: Event = {\n type: \"group\",\n messageId: this.generateUUID(),\n groupId,\n timestamp: this.generateTimestamp(),\n traits: traits || {},\n context: this.getContext(),\n };\n\n if (options?.userId) {\n eventObj.userId = options.userId;\n }\n\n return this.sendSync([eventObj]);\n }\n\n /**\n * Return the number of events currently in the queue.\n */\n getQueueSize(): number {\n return this.queue.length;\n }\n\n async flush(): Promise<void> {\n if (this.flushPromise) {\n return this.flushPromise;\n }\n\n this.flushPromise = this.doFlush();\n try {\n await this.flushPromise;\n } finally {\n this.flushPromise = null;\n }\n }\n\n async shutdown(): Promise<void> {\n if (this.isShutdown) {\n return;\n }\n\n this.isShutdown = true;\n\n // Remove shutdown handlers\n this.shutdownHandlers.forEach((handler) => handler());\n this.shutdownHandlers = [];\n\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n\n await this.flush();\n }\n\n private enqueue(event: Event): void {\n // Check event size\n const eventSize = this.estimateEventSize(event);\n if (eventSize > MAX_EVENT_SIZE_BYTES) {\n this.config.logger.warn(\n `Event size (${eventSize} bytes) exceeds ${MAX_EVENT_SIZE_BYTES} bytes limit`\n );\n return;\n }\n\n // Drop oldest if queue is full\n if (this.queue.length >= this.config.maxQueueSize) {\n const dropped = this.queue.shift();\n this.config.logger.warn(`Queue full, dropping oldest event: ${dropped?.type}`);\n }\n\n this.queue.push(event);\n this.config.logger.debug(`Enqueued ${event.type} event, queue size: ${this.queue.length}`);\n\n // Check if we should flush immediately\n if (this.queue.length >= this.config.maxBatchSize) {\n this.flush();\n }\n }\n\n private async doFlush(): Promise<void> {\n if (this.queue.length === 0) {\n return;\n }\n\n // Clear the flush timer\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n\n // Process batches\n while (this.queue.length > 0) {\n const batch = this.extractBatch();\n if (batch.length === 0) {\n break;\n }\n\n await this.sendBatch(batch);\n }\n\n // Schedule next flush\n this.scheduleFlush();\n }\n\n private extractBatch(): Event[] {\n const batch: Event[] = [];\n let batchSize = 0;\n\n while (this.queue.length > 0 && batch.length < MAX_BATCH_SIZE) {\n const event = this.queue[0];\n const eventSize = this.estimateEventSize(event);\n\n // Check if adding this event would exceed batch size limit\n if (batchSize + eventSize > MAX_BATCH_SIZE_BYTES) {\n break;\n }\n\n batch.push(this.queue.shift()!);\n batchSize += eventSize;\n }\n\n return batch;\n }\n\n private async sendBatch(batch: Event[]): Promise<void> {\n if (batch.length === 0) {\n return;\n }\n\n this.config.logger.debug(`Sending batch of ${batch.length} events`);\n const result = await this.doSend(batch);\n\n if (result === null) {\n // Send failed after all retries\n const error = new Error(`Failed to send batch of ${batch.length} events after retries`);\n this.invokeOnError(error, batch);\n } else if (result.failed > 0 && result.errors) {\n this.config.logger.warn(\n `Batch partially failed. Accepted: ${result.accepted}, Failed: ${result.failed}`,\n result.errors\n );\n // Still invoke success callback since some events were accepted\n this.invokeOnSuccess(result);\n } else {\n this.config.logger.debug(`Batch sent successfully. Accepted: ${result.accepted}`);\n this.invokeOnSuccess(result);\n }\n }\n\n private async sendSync(events: Event[]): Promise<BatchResponse> {\n this.config.logger.debug(`Sending ${events.length} events synchronously`);\n const result = await this.doSend(events);\n\n if (result === null) {\n throw new SendError(`Failed to send ${events.length} events after retries`, events);\n }\n\n return result;\n }\n\n private async doSend(batch: Event[]): Promise<BatchResponse | null> {\n const request: BatchRequest = { batch };\n const requestBody = JSON.stringify(request);\n\n if (hasNativeFetch) {\n return this.doSendWithFetch(batch, requestBody);\n } else {\n return this.doSendWithHttps(batch, requestBody);\n }\n }\n\n private async doSendWithFetch(\n batch: Event[],\n requestBody: string\n ): Promise<BatchResponse | null> {\n const requestUrl = `${this.config.endpoint}/v1/batch`;\n let attempt = 0;\n let delay = this.config.retryInitialDelay;\n\n while (attempt < this.config.retryMaxAttempts) {\n try {\n const response = await fetch(requestUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.writeKey}`,\n },\n body: requestBody,\n });\n\n const data = (await response.json()) as BatchResponse;\n\n if (response.ok) {\n return data;\n }\n\n if (response.status === 400 || response.status === 401) {\n this.config.logger.error(`Permanent error (${response.status}):`, data);\n return null;\n }\n\n if (response.status === 429 || response.status === 503) {\n const retryAfter = response.headers.get(\"Retry-After\");\n if (retryAfter) {\n delay = parseInt(retryAfter, 10) * 1000;\n }\n\n attempt++;\n if (attempt < this.config.retryMaxAttempts) {\n this.config.logger.debug(`Retrying after ${delay}ms (attempt ${attempt})`);\n await this.sleep(delay);\n delay = Math.min(delay * 2, 16000);\n continue;\n }\n }\n\n attempt++;\n if (attempt < this.config.retryMaxAttempts) {\n this.config.logger.debug(`Retrying after ${delay}ms (attempt ${attempt})`);\n await this.sleep(delay);\n delay = Math.min(delay * 2, 16000);\n }\n } catch (error) {\n attempt++;\n if (attempt < this.config.retryMaxAttempts) {\n this.config.logger.debug(`Retrying after ${delay}ms (attempt ${attempt})`);\n await this.sleep(delay);\n delay = Math.min(delay * 2, 16000);\n } else {\n this.config.logger.error(\"Failed to send batch after retries:\", error);\n }\n }\n }\n\n return null;\n }\n\n private async doSendWithHttps(\n batch: Event[],\n requestBody: string\n ): Promise<BatchResponse | null> {\n const parsedUrl = url.parse(this.config.endpoint);\n const isHttps = parsedUrl.protocol === \"https:\";\n const client = isHttps ? https : http;\n const port = parsedUrl.port\n ? parseInt(parsedUrl.port, 10)\n : isHttps\n ? 443\n : 80;\n const hostname = parsedUrl.hostname || \"\";\n\n let attempt = 0;\n let delay = this.config.retryInitialDelay;\n\n while (attempt < this.config.retryMaxAttempts) {\n try {\n const result = await this.makeRequest(\n client,\n hostname,\n port,\n \"/v1/batch\",\n requestBody\n );\n\n if (result.statusCode === 200) {\n const data: BatchResponse = JSON.parse(result.body);\n return data;\n }\n\n if (result.statusCode === 400 || result.statusCode === 401) {\n const data = JSON.parse(result.body);\n this.config.logger.error(`Permanent error (${result.statusCode}):`, data);\n return null;\n }\n\n if (result.statusCode === 429 || result.statusCode === 503) {\n const retryAfter = result.headers[\"retry-after\"];\n if (retryAfter) {\n delay =\n parseInt(\n Array.isArray(retryAfter) ? retryAfter[0] : retryAfter,\n 10\n ) * 1000;\n }\n\n attempt++;\n if (attempt < this.config.retryMaxAttempts) {\n this.config.logger.debug(`Retrying after ${delay}ms (attempt ${attempt})`);\n await this.sleep(delay);\n delay = Math.min(delay * 2, 16000);\n continue;\n }\n }\n\n attempt++;\n if (attempt < this.config.retryMaxAttempts) {\n this.config.logger.debug(`Retrying after ${delay}ms (attempt ${attempt})`);\n await this.sleep(delay);\n delay = Math.min(delay * 2, 16000);\n }\n } catch (error) {\n attempt++;\n if (attempt < this.config.retryMaxAttempts) {\n this.config.logger.debug(`Retrying after ${delay}ms (attempt ${attempt})`);\n await this.sleep(delay);\n delay = Math.min(delay * 2, 16000);\n } else {\n this.config.logger.error(\"Failed to send batch after retries:\", error);\n }\n }\n }\n\n return null;\n }\n\n private invokeOnError(error: Error, batch: Event[]): void {\n if (this.config.onError) {\n try {\n this.config.onError(error, batch);\n } catch (e) {\n this.config.logger.error(\"Error in onError callback:\", e);\n }\n }\n }\n\n private invokeOnSuccess(response: BatchResponse): void {\n if (this.config.onSuccess) {\n try {\n this.config.onSuccess(response);\n } catch (e) {\n this.config.logger.error(\"Error in onSuccess callback:\", e);\n }\n }\n }\n\n private makeRequest(\n client: typeof https | typeof http,\n hostname: string,\n port: number,\n path: string,\n body: string\n ): Promise<{\n statusCode: number;\n body: string;\n headers: Record<string, string | string[] | undefined>;\n }> {\n return new Promise((resolve, reject) => {\n const options = {\n hostname,\n port,\n path,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.writeKey}`,\n \"Content-Length\": Buffer.byteLength(body),\n },\n };\n\n const req = client.request(options, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk) => {\n data += chunk;\n });\n\n res.on(\"end\", () => {\n resolve({\n statusCode: res.statusCode || 500,\n body: data,\n headers: res.headers as Record<string, string | string[] | undefined>,\n });\n });\n });\n\n req.on(\"error\", (error) => {\n reject(error);\n });\n\n req.write(body);\n req.end();\n });\n }\n\n private scheduleFlush(): void {\n if (this.isShutdown || this.flushTimer) {\n return;\n }\n\n this.flushTimer = setTimeout(() => {\n this.flush();\n }, this.config.flushInterval);\n }\n\n private generateUUID(): string {\n if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n // Fallback for Node < 15\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n\n private generateTimestamp(): string {\n return new Date().toISOString();\n }\n\n private getContext(): EventContext {\n return {\n library: {\n name: \"node-sdk\",\n version: SDK_VERSION,\n },\n };\n }\n\n private estimateEventSize(event: Event): number {\n try {\n return JSON.stringify(event).length;\n } catch {\n return 500;\n }\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","export interface Logger {\n debug(message: string, ...args: any[]): void;\n info(message: string, ...args: any[]): void;\n warn(message: string, ...args: any[]): void;\n error(message: string, ...args: any[]): void;\n}\n\nexport interface KlimeConfig {\n writeKey: string;\n endpoint?: string;\n flushInterval?: number; // milliseconds, default 2000\n maxBatchSize?: number; // default 20, max 100\n maxQueueSize?: number; // default 1000\n retryMaxAttempts?: number; // default 5\n retryInitialDelay?: number; // milliseconds, default 1000\n flushOnShutdown?: boolean; // default true\n logger?: Logger; // optional custom logger\n onError?: (error: Error, events: Event[]) => void; // callback for batch failures\n onSuccess?: (response: BatchResponse) => void; // callback for successful sends\n}\n\nexport interface TrackOptions {\n userId?: string;\n groupId?: string;\n}\n\nexport interface IdentifyOptions {}\n\nexport interface GroupOptions {\n userId?: string;\n}\n\nexport interface Event {\n type: 'track' | 'identify' | 'group';\n messageId: string;\n event?: string; // required for track\n userId?: string; // required for identify\n groupId?: string; // required for group\n timestamp: string; // ISO 8601\n properties?: Record<string, any>; // for track\n traits?: Record<string, any>; // for identify/group\n context?: EventContext;\n}\n\nexport interface EventContext {\n library?: {\n name: string;\n version: string;\n };\n}\n\nexport interface BatchRequest {\n batch: Event[];\n}\n\nexport interface BatchResponse {\n status: string;\n accepted: number;\n failed: number;\n errors?: ValidationError[];\n}\n\nexport interface ValidationError {\n index: number;\n message: string;\n code: string;\n}\n\nexport class SendError extends Error {\n events: Event[];\n\n constructor(message: string, events: Event[]) {\n super(message);\n this.name = 'SendError';\n this.events = events;\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,11 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@klime/node",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.1",
|
|
4
|
+
"type": "module",
|
|
4
5
|
"description": "Klime SDK for Node.js",
|
|
5
|
-
"main": "dist/index.
|
|
6
|
+
"main": "dist/index.cjs",
|
|
7
|
+
"module": "dist/index.js",
|
|
6
8
|
"types": "dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"default": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"require": {
|
|
16
|
+
"types": "./dist/index.d.cts",
|
|
17
|
+
"default": "./dist/index.cjs"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
},
|
|
7
21
|
"scripts": {
|
|
8
|
-
"build": "
|
|
22
|
+
"build": "tsup",
|
|
9
23
|
"clean": "rm -rf dist",
|
|
10
24
|
"test": "vitest run",
|
|
11
25
|
"test:watch": "vitest",
|
|
@@ -22,6 +36,7 @@
|
|
|
22
36
|
"license": "MIT",
|
|
23
37
|
"devDependencies": {
|
|
24
38
|
"@types/node": "^20.0.0",
|
|
39
|
+
"tsup": "^8.0.0",
|
|
25
40
|
"typescript": "^5.0.0",
|
|
26
41
|
"vitest": "^2.0.0"
|
|
27
42
|
},
|
package/dist/types.d.ts
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
export interface KlimeConfig {
|
|
2
|
-
writeKey: string;
|
|
3
|
-
endpoint?: string;
|
|
4
|
-
flushInterval?: number;
|
|
5
|
-
maxBatchSize?: number;
|
|
6
|
-
maxQueueSize?: number;
|
|
7
|
-
retryMaxAttempts?: number;
|
|
8
|
-
retryInitialDelay?: number;
|
|
9
|
-
flushOnShutdown?: boolean;
|
|
10
|
-
}
|
|
11
|
-
export interface TrackOptions {
|
|
12
|
-
userId?: string;
|
|
13
|
-
groupId?: string;
|
|
14
|
-
ip?: string;
|
|
15
|
-
}
|
|
16
|
-
export interface IdentifyOptions {
|
|
17
|
-
ip?: string;
|
|
18
|
-
}
|
|
19
|
-
export interface GroupOptions {
|
|
20
|
-
userId?: string;
|
|
21
|
-
ip?: string;
|
|
22
|
-
}
|
|
23
|
-
export interface Event {
|
|
24
|
-
type: 'track' | 'identify' | 'group';
|
|
25
|
-
messageId: string;
|
|
26
|
-
event?: string;
|
|
27
|
-
userId?: string;
|
|
28
|
-
groupId?: string;
|
|
29
|
-
timestamp: string;
|
|
30
|
-
properties?: Record<string, any>;
|
|
31
|
-
traits?: Record<string, any>;
|
|
32
|
-
context?: EventContext;
|
|
33
|
-
}
|
|
34
|
-
export interface EventContext {
|
|
35
|
-
library?: {
|
|
36
|
-
name: string;
|
|
37
|
-
version: string;
|
|
38
|
-
};
|
|
39
|
-
ip?: string;
|
|
40
|
-
}
|
|
41
|
-
export interface BatchRequest {
|
|
42
|
-
batch: Event[];
|
|
43
|
-
}
|
|
44
|
-
export interface BatchResponse {
|
|
45
|
-
status: string;
|
|
46
|
-
accepted: number;
|
|
47
|
-
failed: number;
|
|
48
|
-
errors?: ValidationError[];
|
|
49
|
-
}
|
|
50
|
-
export interface ValidationError {
|
|
51
|
-
index: number;
|
|
52
|
-
message: string;
|
|
53
|
-
code: string;
|
|
54
|
-
}
|
package/dist/types.js
DELETED