ml-cache 1.0.0
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/LICENSE +21 -0
- package/README.md +599 -0
- package/dist/client.d.ts +175 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +411 -0
- package/dist/client.js.map +1 -0
- package/dist/constants.d.ts +184 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +236 -0
- package/dist/constants.js.map +1 -0
- package/dist/esm/client.d.ts +175 -0
- package/dist/esm/client.d.ts.map +1 -0
- package/dist/esm/client.js +407 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/constants.d.ts +184 -0
- package/dist/esm/constants.d.ts.map +1 -0
- package/dist/esm/constants.js +233 -0
- package/dist/esm/constants.js.map +1 -0
- package/dist/esm/index.d.ts +58 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/queue.d.ts +106 -0
- package/dist/esm/queue.d.ts.map +1 -0
- package/dist/esm/queue.js +207 -0
- package/dist/esm/queue.js.map +1 -0
- package/dist/esm/storage/glacier-storage.d.ts +77 -0
- package/dist/esm/storage/glacier-storage.d.ts.map +1 -0
- package/dist/esm/storage/glacier-storage.js +133 -0
- package/dist/esm/storage/glacier-storage.js.map +1 -0
- package/dist/esm/storage/index.d.ts +7 -0
- package/dist/esm/storage/index.d.ts.map +1 -0
- package/dist/esm/storage/index.js +7 -0
- package/dist/esm/storage/index.js.map +1 -0
- package/dist/esm/storage/s3-storage.d.ts +89 -0
- package/dist/esm/storage/s3-storage.d.ts.map +1 -0
- package/dist/esm/storage/s3-storage.js +161 -0
- package/dist/esm/storage/s3-storage.js.map +1 -0
- package/dist/esm/types/index.d.ts +337 -0
- package/dist/esm/types/index.d.ts.map +1 -0
- package/dist/esm/types/index.js +6 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/utils/helpers.d.ts +132 -0
- package/dist/esm/utils/helpers.d.ts.map +1 -0
- package/dist/esm/utils/helpers.js +198 -0
- package/dist/esm/utils/helpers.js.map +1 -0
- package/dist/esm/utils/index.d.ts +8 -0
- package/dist/esm/utils/index.d.ts.map +1 -0
- package/dist/esm/utils/index.js +8 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/dist/esm/utils/logger.d.ts +110 -0
- package/dist/esm/utils/logger.d.ts.map +1 -0
- package/dist/esm/utils/logger.js +177 -0
- package/dist/esm/utils/logger.js.map +1 -0
- package/dist/esm/utils/validator.d.ts +77 -0
- package/dist/esm/utils/validator.d.ts.map +1 -0
- package/dist/esm/utils/validator.js +208 -0
- package/dist/esm/utils/validator.js.map +1 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +100 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +72 -0
- package/dist/queue.d.ts +106 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +211 -0
- package/dist/queue.js.map +1 -0
- package/dist/storage/glacier-storage.d.ts +77 -0
- package/dist/storage/glacier-storage.d.ts.map +1 -0
- package/dist/storage/glacier-storage.js +137 -0
- package/dist/storage/glacier-storage.js.map +1 -0
- package/dist/storage/index.d.ts +7 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +12 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/s3-storage.d.ts +89 -0
- package/dist/storage/s3-storage.d.ts.map +1 -0
- package/dist/storage/s3-storage.js +165 -0
- package/dist/storage/s3-storage.js.map +1 -0
- package/dist/types/index.d.ts +337 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/helpers.d.ts +132 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +215 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +35 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +110 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +181 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/validator.d.ts +77 -0
- package/dist/utils/validator.d.ts.map +1 -0
- package/dist/utils/validator.js +221 -0
- package/dist/utils/validator.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Type definitions and interfaces for ml-cache SDK
|
|
3
|
+
* @module ml-cache/types
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* AWS credentials configuration
|
|
7
|
+
* @interface AWSCredentials
|
|
8
|
+
*/
|
|
9
|
+
export interface AWSCredentials {
|
|
10
|
+
/** AWS access key ID */
|
|
11
|
+
accessKeyId: string;
|
|
12
|
+
/** AWS secret access key */
|
|
13
|
+
secretAccessKey: string;
|
|
14
|
+
/** Optional AWS session token for temporary credentials */
|
|
15
|
+
sessionToken?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* S3 storage configuration
|
|
19
|
+
* @interface S3Config
|
|
20
|
+
*/
|
|
21
|
+
export interface S3Config {
|
|
22
|
+
/** S3 bucket name for event storage */
|
|
23
|
+
bucket: string;
|
|
24
|
+
/** AWS region (e.g., 'us-east-1', 'eu-west-1') */
|
|
25
|
+
region: string;
|
|
26
|
+
/** Optional prefix/folder path for stored objects */
|
|
27
|
+
prefix?: string;
|
|
28
|
+
/** Optional S3 storage class (defaults to GLACIER) */
|
|
29
|
+
storageClass?: S3StorageClass;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Glacier storage configuration
|
|
33
|
+
* @interface GlacierConfig
|
|
34
|
+
*/
|
|
35
|
+
export interface GlacierConfig {
|
|
36
|
+
/** Glacier vault name */
|
|
37
|
+
vaultName: string;
|
|
38
|
+
/** AWS region for Glacier vault */
|
|
39
|
+
region: string;
|
|
40
|
+
/** Account ID (use '-' for current account) */
|
|
41
|
+
accountId?: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* S3 storage class options
|
|
45
|
+
* @typedef S3StorageClass
|
|
46
|
+
*/
|
|
47
|
+
export type S3StorageClass = 'STANDARD' | 'REDUCED_REDUNDANCY' | 'STANDARD_IA' | 'ONEZONE_IA' | 'INTELLIGENT_TIERING' | 'GLACIER' | 'DEEP_ARCHIVE' | 'GLACIER_IR';
|
|
48
|
+
/**
|
|
49
|
+
* Base event properties that all events must have
|
|
50
|
+
* @interface BaseEvent
|
|
51
|
+
*/
|
|
52
|
+
export interface BaseEvent {
|
|
53
|
+
/** Unique event identifier (auto-generated if not provided) */
|
|
54
|
+
eventId?: string;
|
|
55
|
+
/** Event timestamp (auto-generated if not provided) */
|
|
56
|
+
timestamp?: string;
|
|
57
|
+
/** Event type/name (e.g., 'page_view', 'purchase', 'signup') */
|
|
58
|
+
eventType: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* User context information
|
|
62
|
+
* @interface UserContext
|
|
63
|
+
*/
|
|
64
|
+
export interface UserContext {
|
|
65
|
+
/** Unique user identifier */
|
|
66
|
+
userId?: string;
|
|
67
|
+
/** Anonymous/session identifier */
|
|
68
|
+
anonymousId?: string;
|
|
69
|
+
/** User traits/attributes */
|
|
70
|
+
traits?: Record<string, unknown>;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Device and browser context
|
|
74
|
+
* @interface DeviceContext
|
|
75
|
+
*/
|
|
76
|
+
export interface DeviceContext {
|
|
77
|
+
/** User agent string */
|
|
78
|
+
userAgent?: string;
|
|
79
|
+
/** IP address */
|
|
80
|
+
ip?: string;
|
|
81
|
+
/** Device type (mobile, desktop, tablet) */
|
|
82
|
+
deviceType?: string;
|
|
83
|
+
/** Operating system */
|
|
84
|
+
os?: string;
|
|
85
|
+
/** Browser name */
|
|
86
|
+
browser?: string;
|
|
87
|
+
/** Screen resolution */
|
|
88
|
+
screenResolution?: string;
|
|
89
|
+
/** Viewport size */
|
|
90
|
+
viewport?: string;
|
|
91
|
+
/** Device locale/language */
|
|
92
|
+
locale?: string;
|
|
93
|
+
/** Timezone */
|
|
94
|
+
timezone?: string;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Page/screen context
|
|
98
|
+
* @interface PageContext
|
|
99
|
+
*/
|
|
100
|
+
export interface PageContext {
|
|
101
|
+
/** Current page URL */
|
|
102
|
+
url?: string;
|
|
103
|
+
/** Page path */
|
|
104
|
+
path?: string;
|
|
105
|
+
/** Page title */
|
|
106
|
+
title?: string;
|
|
107
|
+
/** Referrer URL */
|
|
108
|
+
referrer?: string;
|
|
109
|
+
/** Search/query string */
|
|
110
|
+
search?: string;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Campaign/UTM tracking context
|
|
114
|
+
* @interface CampaignContext
|
|
115
|
+
*/
|
|
116
|
+
export interface CampaignContext {
|
|
117
|
+
/** Campaign name (utm_campaign) */
|
|
118
|
+
name?: string;
|
|
119
|
+
/** Campaign source (utm_source) */
|
|
120
|
+
source?: string;
|
|
121
|
+
/** Campaign medium (utm_medium) */
|
|
122
|
+
medium?: string;
|
|
123
|
+
/** Campaign term (utm_term) */
|
|
124
|
+
term?: string;
|
|
125
|
+
/** Campaign content (utm_content) */
|
|
126
|
+
content?: string;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Complete event context
|
|
130
|
+
* @interface EventContext
|
|
131
|
+
*/
|
|
132
|
+
export interface EventContext {
|
|
133
|
+
/** User information */
|
|
134
|
+
user?: UserContext;
|
|
135
|
+
/** Device/browser information */
|
|
136
|
+
device?: DeviceContext;
|
|
137
|
+
/** Page/screen information */
|
|
138
|
+
page?: PageContext;
|
|
139
|
+
/** Campaign/marketing information */
|
|
140
|
+
campaign?: CampaignContext;
|
|
141
|
+
/** Application information */
|
|
142
|
+
app?: {
|
|
143
|
+
/** Application name */
|
|
144
|
+
name?: string;
|
|
145
|
+
/** Application version */
|
|
146
|
+
version?: string;
|
|
147
|
+
/** Build number */
|
|
148
|
+
build?: string;
|
|
149
|
+
};
|
|
150
|
+
/** Custom context properties */
|
|
151
|
+
custom?: Record<string, unknown>;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Complete ML Cache event
|
|
155
|
+
* @interface MLCacheEvent
|
|
156
|
+
*/
|
|
157
|
+
export interface MLCacheEvent extends BaseEvent {
|
|
158
|
+
/** Event context (user, device, page, etc.) */
|
|
159
|
+
context?: EventContext;
|
|
160
|
+
/** Event properties/payload (business data) */
|
|
161
|
+
properties?: Record<string, unknown>;
|
|
162
|
+
/** Event metadata */
|
|
163
|
+
metadata?: EventMetadata;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Event metadata for internal tracking
|
|
167
|
+
* @interface EventMetadata
|
|
168
|
+
*/
|
|
169
|
+
export interface EventMetadata {
|
|
170
|
+
/** SDK version that generated the event */
|
|
171
|
+
sdkVersion: string;
|
|
172
|
+
/** Event batch ID (if batched) */
|
|
173
|
+
batchId?: string;
|
|
174
|
+
/** Number of retry attempts */
|
|
175
|
+
retryCount?: number;
|
|
176
|
+
/** Source application identifier */
|
|
177
|
+
sourceApp?: string;
|
|
178
|
+
/** Environment (production, staging, development) */
|
|
179
|
+
environment?: string;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Stored event with additional storage metadata
|
|
183
|
+
* @interface StoredEvent
|
|
184
|
+
*/
|
|
185
|
+
export interface StoredEvent extends MLCacheEvent {
|
|
186
|
+
/** Storage location (S3 key or Glacier archive ID) */
|
|
187
|
+
storageLocation: string;
|
|
188
|
+
/** Storage timestamp */
|
|
189
|
+
storedAt: string;
|
|
190
|
+
/** Storage type used */
|
|
191
|
+
storageType: 'S3' | 'GLACIER';
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Batching configuration for event collection
|
|
195
|
+
* @interface BatchConfig
|
|
196
|
+
*/
|
|
197
|
+
export interface BatchConfig {
|
|
198
|
+
/** Maximum number of events per batch */
|
|
199
|
+
maxSize: number;
|
|
200
|
+
/** Maximum time (ms) to wait before flushing batch */
|
|
201
|
+
maxWaitMs: number;
|
|
202
|
+
/** Enable/disable batching */
|
|
203
|
+
enabled: boolean;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Retry configuration for failed requests
|
|
207
|
+
* @interface RetryConfig
|
|
208
|
+
*/
|
|
209
|
+
export interface RetryConfig {
|
|
210
|
+
/** Maximum number of retry attempts */
|
|
211
|
+
maxRetries: number;
|
|
212
|
+
/** Initial delay between retries (ms) */
|
|
213
|
+
initialDelayMs: number;
|
|
214
|
+
/** Maximum delay between retries (ms) */
|
|
215
|
+
maxDelayMs: number;
|
|
216
|
+
/** Enable exponential backoff */
|
|
217
|
+
exponentialBackoff: boolean;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Logging configuration
|
|
221
|
+
* @interface LogConfig
|
|
222
|
+
*/
|
|
223
|
+
export interface LogConfig {
|
|
224
|
+
/** Log level */
|
|
225
|
+
level: LogLevel;
|
|
226
|
+
/** Enable/disable logging */
|
|
227
|
+
enabled: boolean;
|
|
228
|
+
/** Custom logger function */
|
|
229
|
+
customLogger?: LoggerFunction;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Log levels
|
|
233
|
+
* @typedef LogLevel
|
|
234
|
+
*/
|
|
235
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent';
|
|
236
|
+
/**
|
|
237
|
+
* Custom logger function type
|
|
238
|
+
* @typedef LoggerFunction
|
|
239
|
+
*/
|
|
240
|
+
export type LoggerFunction = (level: LogLevel, message: string, data?: Record<string, unknown>) => void;
|
|
241
|
+
/**
|
|
242
|
+
* Storage mode configuration
|
|
243
|
+
* @typedef StorageMode
|
|
244
|
+
*/
|
|
245
|
+
export type StorageMode = 'S3' | 'GLACIER' | 'S3_TO_GLACIER';
|
|
246
|
+
/**
|
|
247
|
+
* Complete SDK configuration
|
|
248
|
+
* @interface MLCacheConfig
|
|
249
|
+
*/
|
|
250
|
+
export interface MLCacheConfig {
|
|
251
|
+
/** AWS credentials */
|
|
252
|
+
credentials: AWSCredentials;
|
|
253
|
+
/** S3 configuration (required if using S3 or S3_TO_GLACIER mode) */
|
|
254
|
+
s3?: S3Config;
|
|
255
|
+
/** Glacier configuration (required if using GLACIER mode) */
|
|
256
|
+
glacier?: GlacierConfig;
|
|
257
|
+
/** Storage mode */
|
|
258
|
+
storageMode: StorageMode;
|
|
259
|
+
/** Batching configuration */
|
|
260
|
+
batch?: Partial<BatchConfig>;
|
|
261
|
+
/** Retry configuration */
|
|
262
|
+
retry?: Partial<RetryConfig>;
|
|
263
|
+
/** Logging configuration */
|
|
264
|
+
log?: Partial<LogConfig>;
|
|
265
|
+
/** Source application identifier */
|
|
266
|
+
sourceApp?: string;
|
|
267
|
+
/** Environment name */
|
|
268
|
+
environment?: string;
|
|
269
|
+
/** Enable debug mode */
|
|
270
|
+
debug?: boolean;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Result of a track operation
|
|
274
|
+
* @interface TrackResult
|
|
275
|
+
*/
|
|
276
|
+
export interface TrackResult {
|
|
277
|
+
/** Whether the operation was successful */
|
|
278
|
+
success: boolean;
|
|
279
|
+
/** Event ID */
|
|
280
|
+
eventId: string;
|
|
281
|
+
/** Storage location (if immediately stored) */
|
|
282
|
+
storageLocation?: string;
|
|
283
|
+
/** Whether event was queued for batching */
|
|
284
|
+
queued: boolean;
|
|
285
|
+
/** Error message if failed */
|
|
286
|
+
error?: string;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Result of a flush operation
|
|
290
|
+
* @interface FlushResult
|
|
291
|
+
*/
|
|
292
|
+
export interface FlushResult {
|
|
293
|
+
/** Whether the flush was successful */
|
|
294
|
+
success: boolean;
|
|
295
|
+
/** Number of events flushed */
|
|
296
|
+
eventCount: number;
|
|
297
|
+
/** Storage locations of flushed events */
|
|
298
|
+
storageLocations: string[];
|
|
299
|
+
/** Failed event IDs */
|
|
300
|
+
failedEventIds: string[];
|
|
301
|
+
/** Errors encountered */
|
|
302
|
+
errors: string[];
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* SDK health status
|
|
306
|
+
* @interface HealthStatus
|
|
307
|
+
*/
|
|
308
|
+
export interface HealthStatus {
|
|
309
|
+
/** Overall health status */
|
|
310
|
+
healthy: boolean;
|
|
311
|
+
/** S3 connection status */
|
|
312
|
+
s3Connected: boolean;
|
|
313
|
+
/** Glacier connection status */
|
|
314
|
+
glacierConnected: boolean;
|
|
315
|
+
/** Number of events in queue */
|
|
316
|
+
queueSize: number;
|
|
317
|
+
/** Last successful flush timestamp */
|
|
318
|
+
lastFlush?: string;
|
|
319
|
+
/** Last error message */
|
|
320
|
+
lastError?: string;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Event callback function type
|
|
324
|
+
* @typedef EventCallback
|
|
325
|
+
*/
|
|
326
|
+
export type EventCallback = (event: MLCacheEvent) => void;
|
|
327
|
+
/**
|
|
328
|
+
* Error callback function type
|
|
329
|
+
* @typedef ErrorCallback
|
|
330
|
+
*/
|
|
331
|
+
export type ErrorCallback = (error: Error, event?: MLCacheEvent) => void;
|
|
332
|
+
/**
|
|
333
|
+
* Flush callback function type
|
|
334
|
+
* @typedef FlushCallback
|
|
335
|
+
*/
|
|
336
|
+
export type FlushCallback = (result: FlushResult) => void;
|
|
337
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Helper utilities for ml-cache SDK
|
|
3
|
+
* @module ml-cache/utils/helpers
|
|
4
|
+
*/
|
|
5
|
+
import type { MLCacheEvent, EventMetadata } from '../types';
|
|
6
|
+
/**
|
|
7
|
+
* Generates a unique event ID using UUID v4
|
|
8
|
+
* @returns {string} Unique event ID
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateEventId(): string;
|
|
11
|
+
/**
|
|
12
|
+
* Generates an ISO 8601 timestamp for the current time
|
|
13
|
+
* @returns {string} ISO 8601 timestamp
|
|
14
|
+
*/
|
|
15
|
+
export declare function generateTimestamp(): string;
|
|
16
|
+
/**
|
|
17
|
+
* Generates a unique batch ID
|
|
18
|
+
* @returns {string} Unique batch ID
|
|
19
|
+
*/
|
|
20
|
+
export declare function generateBatchId(): string;
|
|
21
|
+
/**
|
|
22
|
+
* Creates event metadata
|
|
23
|
+
* @param {Object} options - Metadata options
|
|
24
|
+
* @param {string} [options.sourceApp] - Source application name
|
|
25
|
+
* @param {string} [options.environment] - Environment name
|
|
26
|
+
* @param {string} [options.batchId] - Batch ID
|
|
27
|
+
* @param {number} [options.retryCount] - Retry attempt count
|
|
28
|
+
* @returns {EventMetadata} Event metadata object
|
|
29
|
+
*/
|
|
30
|
+
export declare function createEventMetadata(options: {
|
|
31
|
+
sourceApp?: string;
|
|
32
|
+
environment?: string;
|
|
33
|
+
batchId?: string;
|
|
34
|
+
retryCount?: number;
|
|
35
|
+
}): EventMetadata;
|
|
36
|
+
/**
|
|
37
|
+
* Enriches an event with auto-generated fields
|
|
38
|
+
* @param {MLCacheEvent} event - Event to enrich
|
|
39
|
+
* @param {Object} options - Enrichment options
|
|
40
|
+
* @param {string} [options.sourceApp] - Source application name
|
|
41
|
+
* @param {string} [options.environment] - Environment name
|
|
42
|
+
* @returns {MLCacheEvent} Enriched event
|
|
43
|
+
*/
|
|
44
|
+
export declare function enrichEvent(event: MLCacheEvent, options?: {
|
|
45
|
+
sourceApp?: string;
|
|
46
|
+
environment?: string;
|
|
47
|
+
}): MLCacheEvent;
|
|
48
|
+
/**
|
|
49
|
+
* Generates an S3 object key for an event or batch
|
|
50
|
+
* @param {Object} options - Key generation options
|
|
51
|
+
* @param {string} [options.prefix] - S3 prefix
|
|
52
|
+
* @param {Date} [options.date] - Date for partitioning
|
|
53
|
+
* @param {string} [options.eventId] - Event ID
|
|
54
|
+
* @param {string} [options.batchId] - Batch ID
|
|
55
|
+
* @param {string} [options.extension] - File extension
|
|
56
|
+
* @returns {string} S3 object key
|
|
57
|
+
*/
|
|
58
|
+
export declare function generateS3Key(options: {
|
|
59
|
+
prefix?: string;
|
|
60
|
+
date?: Date;
|
|
61
|
+
eventId?: string;
|
|
62
|
+
batchId?: string;
|
|
63
|
+
extension?: string;
|
|
64
|
+
}): string;
|
|
65
|
+
/**
|
|
66
|
+
* Generates a Glacier archive description
|
|
67
|
+
* @param {Object} options - Description options
|
|
68
|
+
* @param {string} [options.batchId] - Batch ID
|
|
69
|
+
* @param {number} [options.eventCount] - Number of events in archive
|
|
70
|
+
* @param {Date} [options.date] - Archive date
|
|
71
|
+
* @returns {string} Archive description
|
|
72
|
+
*/
|
|
73
|
+
export declare function generateGlacierDescription(options: {
|
|
74
|
+
batchId?: string;
|
|
75
|
+
eventCount?: number;
|
|
76
|
+
date?: Date;
|
|
77
|
+
}): string;
|
|
78
|
+
/**
|
|
79
|
+
* Serializes events to NDJSON format
|
|
80
|
+
* @param {MLCacheEvent[]} events - Events to serialize
|
|
81
|
+
* @returns {string} NDJSON string
|
|
82
|
+
*/
|
|
83
|
+
export declare function serializeEventsToNDJSON(events: MLCacheEvent[]): string;
|
|
84
|
+
/**
|
|
85
|
+
* Deserializes events from NDJSON format
|
|
86
|
+
* @param {string} ndjson - NDJSON string
|
|
87
|
+
* @returns {MLCacheEvent[]} Parsed events
|
|
88
|
+
*/
|
|
89
|
+
export declare function deserializeEventsFromNDJSON(ndjson: string): MLCacheEvent[];
|
|
90
|
+
/**
|
|
91
|
+
* Calculates the size of serialized events in bytes
|
|
92
|
+
* @param {MLCacheEvent[]} events - Events to measure
|
|
93
|
+
* @returns {number} Size in bytes
|
|
94
|
+
*/
|
|
95
|
+
export declare function calculateEventsSize(events: MLCacheEvent[]): number;
|
|
96
|
+
/**
|
|
97
|
+
* Calculates retry delay with optional exponential backoff
|
|
98
|
+
* @param {number} attempt - Current attempt number (0-indexed)
|
|
99
|
+
* @param {number} initialDelayMs - Initial delay in milliseconds
|
|
100
|
+
* @param {number} maxDelayMs - Maximum delay in milliseconds
|
|
101
|
+
* @param {boolean} exponential - Use exponential backoff
|
|
102
|
+
* @returns {number} Delay in milliseconds
|
|
103
|
+
*/
|
|
104
|
+
export declare function calculateRetryDelay(attempt: number, initialDelayMs: number, maxDelayMs: number, exponential: boolean): number;
|
|
105
|
+
/**
|
|
106
|
+
* Sleeps for a specified duration
|
|
107
|
+
* @param {number} ms - Duration in milliseconds
|
|
108
|
+
* @returns {Promise<void>} Promise that resolves after the delay
|
|
109
|
+
*/
|
|
110
|
+
export declare function sleep(ms: number): Promise<void>;
|
|
111
|
+
/**
|
|
112
|
+
* Chunks an array into smaller arrays
|
|
113
|
+
* @template T
|
|
114
|
+
* @param {T[]} array - Array to chunk
|
|
115
|
+
* @param {number} size - Chunk size
|
|
116
|
+
* @returns {T[][]} Array of chunks
|
|
117
|
+
*/
|
|
118
|
+
export declare function chunk<T>(array: T[], size: number): T[][];
|
|
119
|
+
/**
|
|
120
|
+
* Deep clones an object
|
|
121
|
+
* @template T
|
|
122
|
+
* @param {T} obj - Object to clone
|
|
123
|
+
* @returns {T} Cloned object
|
|
124
|
+
*/
|
|
125
|
+
export declare function deepClone<T>(obj: T): T;
|
|
126
|
+
/**
|
|
127
|
+
* Safely stringifies an object, handling circular references
|
|
128
|
+
* @param {unknown} obj - Object to stringify
|
|
129
|
+
* @returns {string} JSON string
|
|
130
|
+
*/
|
|
131
|
+
export declare function safeStringify(obj: unknown): string;
|
|
132
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/utils/helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAG5D;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,aAAa,CAQhB;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,YAAY,EACnB,OAAO,GAAE;IACP,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACjB,GACL,YAAY,CAUd;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAaT;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,IAAI,CAAC;CACb,GAAG,MAAM,CAaT;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,CAEtE;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE,CAK1E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,CAGlE;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,OAAO,GACnB,MAAM,CAQR;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,EAAE,CAMxD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAEtC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAWlD"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Helper utilities for ml-cache SDK
|
|
3
|
+
* @module ml-cache/utils/helpers
|
|
4
|
+
*/
|
|
5
|
+
import { randomUUID } from 'crypto';
|
|
6
|
+
import { SDK_VERSION, DEFAULT_S3_PREFIX } from '../constants';
|
|
7
|
+
/**
|
|
8
|
+
* Generates a unique event ID using UUID v4
|
|
9
|
+
* @returns {string} Unique event ID
|
|
10
|
+
*/
|
|
11
|
+
export function generateEventId() {
|
|
12
|
+
return randomUUID();
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Generates an ISO 8601 timestamp for the current time
|
|
16
|
+
* @returns {string} ISO 8601 timestamp
|
|
17
|
+
*/
|
|
18
|
+
export function generateTimestamp() {
|
|
19
|
+
return new Date().toISOString();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Generates a unique batch ID
|
|
23
|
+
* @returns {string} Unique batch ID
|
|
24
|
+
*/
|
|
25
|
+
export function generateBatchId() {
|
|
26
|
+
return `batch_${Date.now()}_${randomUUID().slice(0, 8)}`;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Creates event metadata
|
|
30
|
+
* @param {Object} options - Metadata options
|
|
31
|
+
* @param {string} [options.sourceApp] - Source application name
|
|
32
|
+
* @param {string} [options.environment] - Environment name
|
|
33
|
+
* @param {string} [options.batchId] - Batch ID
|
|
34
|
+
* @param {number} [options.retryCount] - Retry attempt count
|
|
35
|
+
* @returns {EventMetadata} Event metadata object
|
|
36
|
+
*/
|
|
37
|
+
export function createEventMetadata(options) {
|
|
38
|
+
return {
|
|
39
|
+
sdkVersion: SDK_VERSION,
|
|
40
|
+
sourceApp: options.sourceApp,
|
|
41
|
+
environment: options.environment,
|
|
42
|
+
batchId: options.batchId,
|
|
43
|
+
retryCount: options.retryCount,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Enriches an event with auto-generated fields
|
|
48
|
+
* @param {MLCacheEvent} event - Event to enrich
|
|
49
|
+
* @param {Object} options - Enrichment options
|
|
50
|
+
* @param {string} [options.sourceApp] - Source application name
|
|
51
|
+
* @param {string} [options.environment] - Environment name
|
|
52
|
+
* @returns {MLCacheEvent} Enriched event
|
|
53
|
+
*/
|
|
54
|
+
export function enrichEvent(event, options = {}) {
|
|
55
|
+
return {
|
|
56
|
+
...event,
|
|
57
|
+
eventId: event.eventId || generateEventId(),
|
|
58
|
+
timestamp: event.timestamp || generateTimestamp(),
|
|
59
|
+
metadata: {
|
|
60
|
+
...createEventMetadata(options),
|
|
61
|
+
...event.metadata,
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Generates an S3 object key for an event or batch
|
|
67
|
+
* @param {Object} options - Key generation options
|
|
68
|
+
* @param {string} [options.prefix] - S3 prefix
|
|
69
|
+
* @param {Date} [options.date] - Date for partitioning
|
|
70
|
+
* @param {string} [options.eventId] - Event ID
|
|
71
|
+
* @param {string} [options.batchId] - Batch ID
|
|
72
|
+
* @param {string} [options.extension] - File extension
|
|
73
|
+
* @returns {string} S3 object key
|
|
74
|
+
*/
|
|
75
|
+
export function generateS3Key(options) {
|
|
76
|
+
const prefix = options.prefix || DEFAULT_S3_PREFIX;
|
|
77
|
+
const date = options.date || new Date();
|
|
78
|
+
const extension = options.extension || 'ndjson';
|
|
79
|
+
const year = date.getUTCFullYear();
|
|
80
|
+
const month = String(date.getUTCMonth() + 1).padStart(2, '0');
|
|
81
|
+
const day = String(date.getUTCDate()).padStart(2, '0');
|
|
82
|
+
const hour = String(date.getUTCHours()).padStart(2, '0');
|
|
83
|
+
const identifier = options.batchId || options.eventId || generateEventId();
|
|
84
|
+
return `${prefix}/${year}/${month}/${day}/${hour}/${identifier}.${extension}`;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Generates a Glacier archive description
|
|
88
|
+
* @param {Object} options - Description options
|
|
89
|
+
* @param {string} [options.batchId] - Batch ID
|
|
90
|
+
* @param {number} [options.eventCount] - Number of events in archive
|
|
91
|
+
* @param {Date} [options.date] - Archive date
|
|
92
|
+
* @returns {string} Archive description
|
|
93
|
+
*/
|
|
94
|
+
export function generateGlacierDescription(options) {
|
|
95
|
+
const date = options.date || new Date();
|
|
96
|
+
const parts = [
|
|
97
|
+
'ml-cache-events',
|
|
98
|
+
date.toISOString().slice(0, 10),
|
|
99
|
+
options.batchId || generateBatchId(),
|
|
100
|
+
];
|
|
101
|
+
if (options.eventCount !== undefined) {
|
|
102
|
+
parts.push(`count:${options.eventCount}`);
|
|
103
|
+
}
|
|
104
|
+
return parts.join('_');
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Serializes events to NDJSON format
|
|
108
|
+
* @param {MLCacheEvent[]} events - Events to serialize
|
|
109
|
+
* @returns {string} NDJSON string
|
|
110
|
+
*/
|
|
111
|
+
export function serializeEventsToNDJSON(events) {
|
|
112
|
+
return events.map((event) => JSON.stringify(event)).join('\n');
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Deserializes events from NDJSON format
|
|
116
|
+
* @param {string} ndjson - NDJSON string
|
|
117
|
+
* @returns {MLCacheEvent[]} Parsed events
|
|
118
|
+
*/
|
|
119
|
+
export function deserializeEventsFromNDJSON(ndjson) {
|
|
120
|
+
return ndjson
|
|
121
|
+
.split('\n')
|
|
122
|
+
.filter((line) => line.trim())
|
|
123
|
+
.map((line) => JSON.parse(line));
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Calculates the size of serialized events in bytes
|
|
127
|
+
* @param {MLCacheEvent[]} events - Events to measure
|
|
128
|
+
* @returns {number} Size in bytes
|
|
129
|
+
*/
|
|
130
|
+
export function calculateEventsSize(events) {
|
|
131
|
+
const serialized = serializeEventsToNDJSON(events);
|
|
132
|
+
return Buffer.byteLength(serialized, 'utf8');
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Calculates retry delay with optional exponential backoff
|
|
136
|
+
* @param {number} attempt - Current attempt number (0-indexed)
|
|
137
|
+
* @param {number} initialDelayMs - Initial delay in milliseconds
|
|
138
|
+
* @param {number} maxDelayMs - Maximum delay in milliseconds
|
|
139
|
+
* @param {boolean} exponential - Use exponential backoff
|
|
140
|
+
* @returns {number} Delay in milliseconds
|
|
141
|
+
*/
|
|
142
|
+
export function calculateRetryDelay(attempt, initialDelayMs, maxDelayMs, exponential) {
|
|
143
|
+
if (!exponential) {
|
|
144
|
+
return Math.min(initialDelayMs, maxDelayMs);
|
|
145
|
+
}
|
|
146
|
+
const delay = initialDelayMs * Math.pow(2, attempt);
|
|
147
|
+
const jitter = Math.random() * 0.1 * delay;
|
|
148
|
+
return Math.min(delay + jitter, maxDelayMs);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Sleeps for a specified duration
|
|
152
|
+
* @param {number} ms - Duration in milliseconds
|
|
153
|
+
* @returns {Promise<void>} Promise that resolves after the delay
|
|
154
|
+
*/
|
|
155
|
+
export function sleep(ms) {
|
|
156
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Chunks an array into smaller arrays
|
|
160
|
+
* @template T
|
|
161
|
+
* @param {T[]} array - Array to chunk
|
|
162
|
+
* @param {number} size - Chunk size
|
|
163
|
+
* @returns {T[][]} Array of chunks
|
|
164
|
+
*/
|
|
165
|
+
export function chunk(array, size) {
|
|
166
|
+
const chunks = [];
|
|
167
|
+
for (let i = 0; i < array.length; i += size) {
|
|
168
|
+
chunks.push(array.slice(i, i + size));
|
|
169
|
+
}
|
|
170
|
+
return chunks;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Deep clones an object
|
|
174
|
+
* @template T
|
|
175
|
+
* @param {T} obj - Object to clone
|
|
176
|
+
* @returns {T} Cloned object
|
|
177
|
+
*/
|
|
178
|
+
export function deepClone(obj) {
|
|
179
|
+
return JSON.parse(JSON.stringify(obj));
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Safely stringifies an object, handling circular references
|
|
183
|
+
* @param {unknown} obj - Object to stringify
|
|
184
|
+
* @returns {string} JSON string
|
|
185
|
+
*/
|
|
186
|
+
export function safeStringify(obj) {
|
|
187
|
+
const seen = new WeakSet();
|
|
188
|
+
return JSON.stringify(obj, (_key, value) => {
|
|
189
|
+
if (typeof value === 'object' && value !== null) {
|
|
190
|
+
if (seen.has(value)) {
|
|
191
|
+
return '[Circular]';
|
|
192
|
+
}
|
|
193
|
+
seen.add(value);
|
|
194
|
+
}
|
|
195
|
+
return value;
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=helpers.js.map
|