ml-cache 1.0.0 → 1.2.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/README.md +99 -128
- package/dist/client.d.ts +23 -41
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +26 -66
- package/dist/client.js.map +1 -1
- package/dist/constants.d.ts +2 -12
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +3 -14
- package/dist/constants.js.map +1 -1
- package/dist/esm/client.d.ts +23 -41
- package/dist/esm/client.d.ts.map +1 -1
- package/dist/esm/client.js +26 -66
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/constants.d.ts +2 -12
- package/dist/esm/constants.d.ts.map +1 -1
- package/dist/esm/constants.js +2 -13
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/index.d.ts +3 -4
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/queue.d.ts.map +1 -1
- package/dist/esm/queue.js.map +1 -1
- package/dist/esm/storage/glacier-storage.d.ts.map +1 -1
- package/dist/esm/storage/glacier-storage.js +1 -1
- package/dist/esm/storage/glacier-storage.js.map +1 -1
- package/dist/esm/storage/s3-storage.d.ts.map +1 -1
- package/dist/esm/storage/s3-storage.js +1 -1
- package/dist/esm/storage/s3-storage.js.map +1 -1
- package/dist/esm/types/index.d.ts +2 -4
- package/dist/esm/types/index.d.ts.map +1 -1
- package/dist/esm/utils/index.d.ts +1 -1
- package/dist/esm/utils/index.d.ts.map +1 -1
- package/dist/esm/utils/index.js +1 -1
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/utils/logger.d.ts.map +1 -1
- package/dist/esm/utils/logger.js.map +1 -1
- package/dist/esm/utils/validator.d.ts +4 -10
- package/dist/esm/utils/validator.d.ts.map +1 -1
- package/dist/esm/utils/validator.js +18 -40
- package/dist/esm/utils/validator.js.map +1 -1
- package/dist/index.d.ts +3 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3 -4
- package/dist/queue.d.ts.map +1 -1
- package/dist/queue.js.map +1 -1
- package/dist/storage/glacier-storage.d.ts.map +1 -1
- package/dist/storage/glacier-storage.js.map +1 -1
- package/dist/storage/s3-storage.d.ts.map +1 -1
- package/dist/storage/s3-storage.js.map +1 -1
- package/dist/types/index.d.ts +2 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -3
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/validator.d.ts +4 -10
- package/dist/utils/validator.d.ts.map +1 -1
- package/dist/utils/validator.js +18 -41
- package/dist/utils/validator.js.map +1 -1
- package/package.json +4 -1
package/dist/utils/validator.js
CHANGED
|
@@ -9,8 +9,7 @@ exports.validateCredentials = validateCredentials;
|
|
|
9
9
|
exports.validateS3Config = validateS3Config;
|
|
10
10
|
exports.validateGlacierConfig = validateGlacierConfig;
|
|
11
11
|
exports.validateConfig = validateConfig;
|
|
12
|
-
exports.
|
|
13
|
-
exports.validateEventProperties = validateEventProperties;
|
|
12
|
+
exports.validateEventData = validateEventData;
|
|
14
13
|
exports.validateEvent = validateEvent;
|
|
15
14
|
exports.isValidTimestamp = isValidTimestamp;
|
|
16
15
|
exports.isValidUUID = isValidUUID;
|
|
@@ -46,12 +45,10 @@ function validateCredentials(credentials) {
|
|
|
46
45
|
if (!credentials.accessKeyId || typeof credentials.accessKeyId !== 'string') {
|
|
47
46
|
throw new ValidationError('AWS access key ID is required and must be a string', 'credentials.accessKeyId');
|
|
48
47
|
}
|
|
49
|
-
if (!credentials.secretAccessKey ||
|
|
50
|
-
typeof credentials.secretAccessKey !== 'string') {
|
|
48
|
+
if (!credentials.secretAccessKey || typeof credentials.secretAccessKey !== 'string') {
|
|
51
49
|
throw new ValidationError('AWS secret access key is required and must be a string', 'credentials.secretAccessKey');
|
|
52
50
|
}
|
|
53
|
-
if (credentials.sessionToken !== undefined &&
|
|
54
|
-
typeof credentials.sessionToken !== 'string') {
|
|
51
|
+
if (credentials.sessionToken !== undefined && typeof credentials.sessionToken !== 'string') {
|
|
55
52
|
throw new ValidationError('AWS session token must be a string', 'credentials.sessionToken');
|
|
56
53
|
}
|
|
57
54
|
}
|
|
@@ -121,58 +118,39 @@ function validateConfig(config) {
|
|
|
121
118
|
}
|
|
122
119
|
if (config.batch) {
|
|
123
120
|
if (config.batch.maxSize !== undefined) {
|
|
124
|
-
if (typeof config.batch.maxSize !== 'number' ||
|
|
125
|
-
config.batch.maxSize < 1) {
|
|
121
|
+
if (typeof config.batch.maxSize !== 'number' || config.batch.maxSize < 1) {
|
|
126
122
|
throw new ValidationError('Batch max size must be a positive number', 'batch.maxSize');
|
|
127
123
|
}
|
|
128
124
|
}
|
|
129
125
|
if (config.batch.maxWaitMs !== undefined) {
|
|
130
|
-
if (typeof config.batch.maxWaitMs !== 'number' ||
|
|
131
|
-
config.batch.maxWaitMs < 0) {
|
|
126
|
+
if (typeof config.batch.maxWaitMs !== 'number' || config.batch.maxWaitMs < 0) {
|
|
132
127
|
throw new ValidationError('Batch max wait must be a non-negative number', 'batch.maxWaitMs');
|
|
133
128
|
}
|
|
134
129
|
}
|
|
135
130
|
}
|
|
136
131
|
if (config.retry) {
|
|
137
132
|
if (config.retry.maxRetries !== undefined) {
|
|
138
|
-
if (typeof config.retry.maxRetries !== 'number' ||
|
|
139
|
-
config.retry.maxRetries < 0) {
|
|
133
|
+
if (typeof config.retry.maxRetries !== 'number' || config.retry.maxRetries < 0) {
|
|
140
134
|
throw new ValidationError('Max retries must be a non-negative number', 'retry.maxRetries');
|
|
141
135
|
}
|
|
142
136
|
}
|
|
143
137
|
}
|
|
144
138
|
}
|
|
145
139
|
/**
|
|
146
|
-
* Validates
|
|
147
|
-
* @param {string}
|
|
148
|
-
* @throws {ValidationError} If
|
|
140
|
+
* Validates event data
|
|
141
|
+
* @param {Record<string, unknown>} data - Data to validate
|
|
142
|
+
* @throws {ValidationError} If data is invalid
|
|
149
143
|
*/
|
|
150
|
-
function
|
|
151
|
-
if (
|
|
152
|
-
throw new ValidationError('Event type is required and must be a string', 'eventType');
|
|
153
|
-
}
|
|
154
|
-
if (eventType.length > constants_1.MAX_EVENT_TYPE_LENGTH) {
|
|
155
|
-
throw new ValidationError(`Event type must be at most ${constants_1.MAX_EVENT_TYPE_LENGTH} characters`, 'eventType');
|
|
156
|
-
}
|
|
157
|
-
if (!constants_1.EVENT_TYPE_PATTERN.test(eventType)) {
|
|
158
|
-
throw new ValidationError('Event type must start with a letter and contain only alphanumeric characters and underscores', 'eventType');
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Validates event properties
|
|
163
|
-
* @param {Record<string, unknown>} properties - Properties to validate
|
|
164
|
-
* @throws {ValidationError} If properties are invalid
|
|
165
|
-
*/
|
|
166
|
-
function validateEventProperties(properties) {
|
|
167
|
-
if (properties === undefined || properties === null) {
|
|
144
|
+
function validateEventData(data) {
|
|
145
|
+
if (data === undefined || data === null) {
|
|
168
146
|
return;
|
|
169
147
|
}
|
|
170
|
-
if (typeof
|
|
171
|
-
throw new ValidationError('Event
|
|
148
|
+
if (typeof data !== 'object' || Array.isArray(data)) {
|
|
149
|
+
throw new ValidationError('Event data must be an object', 'data');
|
|
172
150
|
}
|
|
173
|
-
for (const key of Object.keys(
|
|
174
|
-
if (key.length > constants_1.
|
|
175
|
-
throw new ValidationError(`
|
|
151
|
+
for (const key of Object.keys(data)) {
|
|
152
|
+
if (key.length > constants_1.MAX_DATA_KEY_LENGTH) {
|
|
153
|
+
throw new ValidationError(`Data key "${key}" exceeds maximum length of ${constants_1.MAX_DATA_KEY_LENGTH}`, `data.${key}`);
|
|
176
154
|
}
|
|
177
155
|
}
|
|
178
156
|
}
|
|
@@ -185,9 +163,8 @@ function validateEvent(event) {
|
|
|
185
163
|
if (!event) {
|
|
186
164
|
throw new ValidationError('Event is required', 'event');
|
|
187
165
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
validateEventProperties(event.properties);
|
|
166
|
+
if (event.data !== undefined) {
|
|
167
|
+
validateEventData(event.data);
|
|
191
168
|
}
|
|
192
169
|
const eventSize = Buffer.byteLength(JSON.stringify(event), 'utf8');
|
|
193
170
|
if (eventSize > constants_1.MAX_EVENT_SIZE_BYTES) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ml-cache",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "SDK to collect and store business/product events for future ML training. Store now, train later when AI becomes affordable.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -22,6 +22,8 @@
|
|
|
22
22
|
"test:watch": "vitest",
|
|
23
23
|
"test:coverage": "vitest run --coverage",
|
|
24
24
|
"lint": "tsc --noEmit",
|
|
25
|
+
"format": "prettier --write .",
|
|
26
|
+
"format:check": "prettier --check .",
|
|
25
27
|
"prepublishOnly": "npm run build && npm run test"
|
|
26
28
|
},
|
|
27
29
|
"repository": {
|
|
@@ -54,6 +56,7 @@
|
|
|
54
56
|
"devDependencies": {
|
|
55
57
|
"@types/node": "^25.0.3",
|
|
56
58
|
"@vitest/coverage-v8": "^4.0.16",
|
|
59
|
+
"prettier": "^3.4.2",
|
|
57
60
|
"typescript": "^5.9.3",
|
|
58
61
|
"vitest": "^4.0.16"
|
|
59
62
|
},
|