stelo 1.0.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/LICENSE +184 -0
- package/README.md +853 -0
- package/dist/accessibility.d.ts +227 -0
- package/dist/accessibility.d.ts.map +1 -0
- package/dist/accessibility.js +602 -0
- package/dist/accessibility.js.map +1 -0
- package/dist/agent.d.ts +870 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +1107 -0
- package/dist/agent.js.map +1 -0
- package/dist/audio-stream.d.ts +114 -0
- package/dist/audio-stream.d.ts.map +1 -0
- package/dist/audio-stream.js +167 -0
- package/dist/audio-stream.js.map +1 -0
- package/dist/clipboard.d.ts +99 -0
- package/dist/clipboard.d.ts.map +1 -0
- package/dist/clipboard.js +352 -0
- package/dist/clipboard.js.map +1 -0
- package/dist/config.d.ts +183 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +477 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +213 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +387 -0
- package/dist/context.js.map +1 -0
- package/dist/cortex.d.ts +548 -0
- package/dist/cortex.d.ts.map +1 -0
- package/dist/cortex.js +1479 -0
- package/dist/cortex.js.map +1 -0
- package/dist/errors.d.ts +133 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +278 -0
- package/dist/errors.js.map +1 -0
- package/dist/events.d.ts +227 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +429 -0
- package/dist/events.js.map +1 -0
- package/dist/executor.d.ts +212 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +545 -0
- package/dist/executor.js.map +1 -0
- package/dist/index.d.ts +69 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +167 -0
- package/dist/index.js.map +1 -0
- package/dist/integration.d.ts +159 -0
- package/dist/integration.d.ts.map +1 -0
- package/dist/integration.js +533 -0
- package/dist/integration.js.map +1 -0
- package/dist/keyboard.d.ts +276 -0
- package/dist/keyboard.d.ts.map +1 -0
- package/dist/keyboard.js +404 -0
- package/dist/keyboard.js.map +1 -0
- package/dist/logger.d.ts +198 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +516 -0
- package/dist/logger.js.map +1 -0
- package/dist/middleware.d.ts +183 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +493 -0
- package/dist/middleware.js.map +1 -0
- package/dist/monitor.d.ts +136 -0
- package/dist/monitor.d.ts.map +1 -0
- package/dist/monitor.js +341 -0
- package/dist/monitor.js.map +1 -0
- package/dist/mouse.d.ts +290 -0
- package/dist/mouse.d.ts.map +1 -0
- package/dist/mouse.js +466 -0
- package/dist/mouse.js.map +1 -0
- package/dist/plugin.d.ts +157 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +409 -0
- package/dist/plugin.js.map +1 -0
- package/dist/process.d.ts +106 -0
- package/dist/process.d.ts.map +1 -0
- package/dist/process.js +326 -0
- package/dist/process.js.map +1 -0
- package/dist/recorder.d.ts +100 -0
- package/dist/recorder.d.ts.map +1 -0
- package/dist/recorder.js +258 -0
- package/dist/recorder.js.map +1 -0
- package/dist/safety.d.ts +59 -0
- package/dist/safety.d.ts.map +1 -0
- package/dist/safety.js +98 -0
- package/dist/safety.js.map +1 -0
- package/dist/scheduler.d.ts +152 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +615 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/screen.d.ts +96 -0
- package/dist/screen.d.ts.map +1 -0
- package/dist/screen.js +154 -0
- package/dist/screen.js.map +1 -0
- package/dist/session.d.ts +209 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +479 -0
- package/dist/session.js.map +1 -0
- package/dist/stream.d.ts +168 -0
- package/dist/stream.d.ts.map +1 -0
- package/dist/stream.js +298 -0
- package/dist/stream.js.map +1 -0
- package/dist/telemetry.d.ts +223 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +433 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/types.d.ts +165 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/bezier.d.ts +51 -0
- package/dist/utils/bezier.d.ts.map +1 -0
- package/dist/utils/bezier.js +117 -0
- package/dist/utils/bezier.js.map +1 -0
- package/dist/utils/helpers.d.ts +90 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +143 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +18 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/validation.d.ts +254 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +478 -0
- package/dist/validation.js.map +1 -0
- package/dist/vision.d.ts +719 -0
- package/dist/vision.d.ts.map +1 -0
- package/dist/vision.js +1197 -0
- package/dist/vision.js.map +1 -0
- package/dist/window.d.ts +80 -0
- package/dist/window.d.ts.map +1 -0
- package/dist/window.js +170 -0
- package/dist/window.js.map +1 -0
- package/dist/workflow.d.ts +224 -0
- package/dist/workflow.d.ts.map +1 -0
- package/dist/workflow.js +578 -0
- package/dist/workflow.js.map +1 -0
- package/index.d.ts +840 -0
- package/index.js +495 -0
- package/package.json +91 -0
|
@@ -0,0 +1,478 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// Stelo — Validation & Security Utilities
|
|
4
|
+
// ============================================================================
|
|
5
|
+
// Enterprise-grade input validation, bounds checking, and security primitives.
|
|
6
|
+
// ============================================================================
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.RateLimiter = exports.security = exports.validate = exports.ValidationError = void 0;
|
|
9
|
+
exports.ok = ok;
|
|
10
|
+
exports.err = err;
|
|
11
|
+
exports.unwrap = unwrap;
|
|
12
|
+
/**
|
|
13
|
+
* Validation error with details
|
|
14
|
+
*/
|
|
15
|
+
class ValidationError extends Error {
|
|
16
|
+
code;
|
|
17
|
+
field;
|
|
18
|
+
value;
|
|
19
|
+
constraint;
|
|
20
|
+
constructor(field, value, constraint, code = 'VALIDATION_ERROR') {
|
|
21
|
+
super(`Validation failed for '${field}': ${constraint}`);
|
|
22
|
+
this.name = 'ValidationError';
|
|
23
|
+
this.code = code;
|
|
24
|
+
this.field = field;
|
|
25
|
+
this.value = value;
|
|
26
|
+
this.constraint = constraint;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.ValidationError = ValidationError;
|
|
30
|
+
/**
|
|
31
|
+
* Create a successful result
|
|
32
|
+
*/
|
|
33
|
+
function ok(value) {
|
|
34
|
+
return { ok: true, value };
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Create a failed result
|
|
38
|
+
*/
|
|
39
|
+
function err(error) {
|
|
40
|
+
return { ok: false, error };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Unwrap a result, throwing if it's an error
|
|
44
|
+
*/
|
|
45
|
+
function unwrap(result) {
|
|
46
|
+
if (result.ok)
|
|
47
|
+
return result.value;
|
|
48
|
+
throw result.error;
|
|
49
|
+
}
|
|
50
|
+
// ── Standalone Validation Functions ─────────────────────────────────────────
|
|
51
|
+
/**
|
|
52
|
+
* Validate that a value is a finite number
|
|
53
|
+
* @throws ValidationError if validation fails
|
|
54
|
+
*/
|
|
55
|
+
function validateNumber(value, field) {
|
|
56
|
+
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
57
|
+
throw new ValidationError(field, value, 'must be a finite number', 'INVALID_NUMBER');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Validate that a value is an integer
|
|
62
|
+
* @throws ValidationError if validation fails
|
|
63
|
+
*/
|
|
64
|
+
function validateInteger(value, field) {
|
|
65
|
+
validateNumber(value, field);
|
|
66
|
+
if (!Number.isInteger(value)) {
|
|
67
|
+
throw new ValidationError(field, value, 'must be an integer', 'INVALID_INTEGER');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Validate that a value is a positive integer
|
|
72
|
+
* @throws ValidationError if validation fails
|
|
73
|
+
*/
|
|
74
|
+
function validatePositiveInteger(value, field) {
|
|
75
|
+
validateInteger(value, field);
|
|
76
|
+
if (value < 0) {
|
|
77
|
+
throw new ValidationError(field, value, 'must be a positive integer', 'NEGATIVE_VALUE');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Validate a coordinate value (integer, reasonable range)
|
|
82
|
+
* @throws ValidationError if validation fails
|
|
83
|
+
*/
|
|
84
|
+
function validateCoordinate(value, field) {
|
|
85
|
+
validateInteger(value, field);
|
|
86
|
+
const v = value;
|
|
87
|
+
// Reasonable coordinate range: -100000 to 100000 (covers multi-monitor setups)
|
|
88
|
+
if (v < -100_000 || v > 100_000) {
|
|
89
|
+
throw new ValidationError(field, value, 'coordinate out of reasonable range (-100000 to 100000)', 'COORDINATE_OUT_OF_RANGE');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Validate that coordinates are within screen bounds
|
|
94
|
+
* @throws ValidationError if validation fails
|
|
95
|
+
*/
|
|
96
|
+
function validateInBounds(point, screenSize, field = 'point') {
|
|
97
|
+
validateCoordinate(point.x, `${field}.x`);
|
|
98
|
+
validateCoordinate(point.y, `${field}.y`);
|
|
99
|
+
const x = point.x;
|
|
100
|
+
const y = point.y;
|
|
101
|
+
if (x < 0 || x >= screenSize.width) {
|
|
102
|
+
throw new ValidationError(`${field}.x`, x, `must be within screen width (0 to ${screenSize.width - 1})`, 'X_OUT_OF_BOUNDS');
|
|
103
|
+
}
|
|
104
|
+
if (y < 0 || y >= screenSize.height) {
|
|
105
|
+
throw new ValidationError(`${field}.y`, y, `must be within screen height (0 to ${screenSize.height - 1})`, 'Y_OUT_OF_BOUNDS');
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Validate a region has valid dimensions
|
|
110
|
+
* @throws ValidationError if validation fails
|
|
111
|
+
*/
|
|
112
|
+
function validateRegion(region, field = 'region') {
|
|
113
|
+
if (typeof region !== 'object' || region === null) {
|
|
114
|
+
throw new ValidationError(field, region, 'must be an object', 'INVALID_REGION');
|
|
115
|
+
}
|
|
116
|
+
const r = region;
|
|
117
|
+
validateCoordinate(r.x, `${field}.x`);
|
|
118
|
+
validateCoordinate(r.y, `${field}.y`);
|
|
119
|
+
validatePositiveInteger(r.width, `${field}.width`);
|
|
120
|
+
validatePositiveInteger(r.height, `${field}.height`);
|
|
121
|
+
if (r.width === 0) {
|
|
122
|
+
throw new ValidationError(`${field}.width`, r.width, 'must be greater than 0', 'ZERO_WIDTH');
|
|
123
|
+
}
|
|
124
|
+
if (r.height === 0) {
|
|
125
|
+
throw new ValidationError(`${field}.height`, r.height, 'must be greater than 0', 'ZERO_HEIGHT');
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Validate a string is non-empty
|
|
130
|
+
* @throws ValidationError if validation fails
|
|
131
|
+
*/
|
|
132
|
+
function validateNonEmptyString(value, field) {
|
|
133
|
+
if (typeof value !== 'string') {
|
|
134
|
+
throw new ValidationError(field, value, 'must be a string', 'INVALID_STRING');
|
|
135
|
+
}
|
|
136
|
+
if (value.length === 0) {
|
|
137
|
+
throw new ValidationError(field, value, 'must not be empty', 'EMPTY_STRING');
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Validate a string has max length
|
|
142
|
+
* @throws ValidationError if validation fails
|
|
143
|
+
*/
|
|
144
|
+
function validateMaxLength(value, maxLen, field) {
|
|
145
|
+
if (value.length > maxLen) {
|
|
146
|
+
throw new ValidationError(field, value, `must be at most ${maxLen} characters (got ${value.length})`, 'STRING_TOO_LONG');
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Validate duration in milliseconds
|
|
151
|
+
* @throws ValidationError if validation fails
|
|
152
|
+
*/
|
|
153
|
+
function validateDuration(value, field, maxMs = 300_000) {
|
|
154
|
+
validatePositiveInteger(value, field);
|
|
155
|
+
if (value > maxMs) {
|
|
156
|
+
throw new ValidationError(field, value, `must be at most ${maxMs}ms`, 'DURATION_TOO_LONG');
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Validate a value is within a range
|
|
161
|
+
* @throws ValidationError if validation fails
|
|
162
|
+
*/
|
|
163
|
+
function validateRange(value, min, max, field) {
|
|
164
|
+
if (value < min || value > max) {
|
|
165
|
+
throw new ValidationError(field, value, `must be between ${min} and ${max}`, 'OUT_OF_RANGE');
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Validate a key name is valid
|
|
170
|
+
* @throws ValidationError if validation fails
|
|
171
|
+
*/
|
|
172
|
+
function validateKeyName(value, field) {
|
|
173
|
+
validateNonEmptyString(value, field);
|
|
174
|
+
const v = value;
|
|
175
|
+
// Max key name length: 32 chars
|
|
176
|
+
if (v.length > 32) {
|
|
177
|
+
throw new ValidationError(field, value, 'key name too long (max 32 chars)', 'KEY_NAME_TOO_LONG');
|
|
178
|
+
}
|
|
179
|
+
// Only allow safe characters
|
|
180
|
+
if (!/^[a-zA-Z0-9_+-]+$/.test(v)) {
|
|
181
|
+
throw new ValidationError(field, value, 'key name contains invalid characters', 'INVALID_KEY_NAME');
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// ── Safe Validation (Result-based) ──────────────────────────────────────────
|
|
185
|
+
function safeCoordinate(value, field) {
|
|
186
|
+
try {
|
|
187
|
+
validateCoordinate(value, field);
|
|
188
|
+
return ok(value);
|
|
189
|
+
}
|
|
190
|
+
catch (e) {
|
|
191
|
+
return err(e);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
function safeInBounds(point, screenSize, field) {
|
|
195
|
+
try {
|
|
196
|
+
validateInBounds(point, screenSize, field);
|
|
197
|
+
return ok(point);
|
|
198
|
+
}
|
|
199
|
+
catch (e) {
|
|
200
|
+
return err(e);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
function safeRegion(region, field) {
|
|
204
|
+
try {
|
|
205
|
+
validateRegion(region, field);
|
|
206
|
+
return ok(region);
|
|
207
|
+
}
|
|
208
|
+
catch (e) {
|
|
209
|
+
return err(e);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
function safeNumber(value, field) {
|
|
213
|
+
try {
|
|
214
|
+
validateNumber(value, field);
|
|
215
|
+
return ok(value);
|
|
216
|
+
}
|
|
217
|
+
catch (e) {
|
|
218
|
+
return err(e);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Validation utilities for enterprise-grade input checking
|
|
223
|
+
*
|
|
224
|
+
* @example
|
|
225
|
+
* ```typescript
|
|
226
|
+
* import { validate } from 'stelo';
|
|
227
|
+
*
|
|
228
|
+
* // Validate coordinates
|
|
229
|
+
* validate.coordinate(x, 'x');
|
|
230
|
+
* validate.coordinate(y, 'y');
|
|
231
|
+
*
|
|
232
|
+
* // Validate within screen bounds
|
|
233
|
+
* validate.inBounds({ x, y }, screenSize);
|
|
234
|
+
*
|
|
235
|
+
* // Validate region
|
|
236
|
+
* validate.region(region);
|
|
237
|
+
*
|
|
238
|
+
* // Safe validation (returns Result)
|
|
239
|
+
* const result = validate.safe.coordinate(x, 'x');
|
|
240
|
+
* if (!result.ok) console.error(result.error);
|
|
241
|
+
* ```
|
|
242
|
+
*/
|
|
243
|
+
exports.validate = {
|
|
244
|
+
number: validateNumber,
|
|
245
|
+
integer: validateInteger,
|
|
246
|
+
positiveInteger: validatePositiveInteger,
|
|
247
|
+
coordinate: validateCoordinate,
|
|
248
|
+
inBounds: validateInBounds,
|
|
249
|
+
region: validateRegion,
|
|
250
|
+
nonEmptyString: validateNonEmptyString,
|
|
251
|
+
maxLength: validateMaxLength,
|
|
252
|
+
duration: validateDuration,
|
|
253
|
+
range: validateRange,
|
|
254
|
+
keyName: validateKeyName,
|
|
255
|
+
safe: {
|
|
256
|
+
coordinate: safeCoordinate,
|
|
257
|
+
inBounds: safeInBounds,
|
|
258
|
+
region: safeRegion,
|
|
259
|
+
number: safeNumber,
|
|
260
|
+
},
|
|
261
|
+
};
|
|
262
|
+
const auditLog = [];
|
|
263
|
+
let auditEnabled = false;
|
|
264
|
+
let auditMaxEntries = 10_000;
|
|
265
|
+
const auditHandlers = [];
|
|
266
|
+
/**
|
|
267
|
+
* Security utilities for enterprise deployments
|
|
268
|
+
*
|
|
269
|
+
* @example
|
|
270
|
+
* ```typescript
|
|
271
|
+
* import { security } from 'stelo';
|
|
272
|
+
*
|
|
273
|
+
* // Enable audit logging
|
|
274
|
+
* security.enableAudit();
|
|
275
|
+
*
|
|
276
|
+
* // Subscribe to audit events
|
|
277
|
+
* security.onAudit((entry) => {
|
|
278
|
+
* console.log(`[AUDIT] ${entry.operation}: ${entry.success}`);
|
|
279
|
+
* });
|
|
280
|
+
*
|
|
281
|
+
* // Get audit log
|
|
282
|
+
* const log = security.getAuditLog();
|
|
283
|
+
*
|
|
284
|
+
* // Sanitize text for typing (remove control characters)
|
|
285
|
+
* const safeText = security.sanitizeText(userInput);
|
|
286
|
+
* ```
|
|
287
|
+
*/
|
|
288
|
+
exports.security = {
|
|
289
|
+
/**
|
|
290
|
+
* Enable audit logging
|
|
291
|
+
*/
|
|
292
|
+
enableAudit(maxEntries = 10_000) {
|
|
293
|
+
auditEnabled = true;
|
|
294
|
+
auditMaxEntries = maxEntries;
|
|
295
|
+
},
|
|
296
|
+
/**
|
|
297
|
+
* Disable audit logging
|
|
298
|
+
*/
|
|
299
|
+
disableAudit() {
|
|
300
|
+
auditEnabled = false;
|
|
301
|
+
},
|
|
302
|
+
/**
|
|
303
|
+
* Check if audit logging is enabled
|
|
304
|
+
*/
|
|
305
|
+
isAuditEnabled() {
|
|
306
|
+
return auditEnabled;
|
|
307
|
+
},
|
|
308
|
+
/**
|
|
309
|
+
* Subscribe to audit events
|
|
310
|
+
*/
|
|
311
|
+
onAudit(handler) {
|
|
312
|
+
auditHandlers.push(handler);
|
|
313
|
+
return () => {
|
|
314
|
+
const idx = auditHandlers.indexOf(handler);
|
|
315
|
+
if (idx >= 0)
|
|
316
|
+
auditHandlers.splice(idx, 1);
|
|
317
|
+
};
|
|
318
|
+
},
|
|
319
|
+
/**
|
|
320
|
+
* Log an audit entry
|
|
321
|
+
* @internal Used by Stelo internals
|
|
322
|
+
*/
|
|
323
|
+
logAudit(operation, args, success, durationMs, error) {
|
|
324
|
+
if (!auditEnabled)
|
|
325
|
+
return;
|
|
326
|
+
const entry = {
|
|
327
|
+
timestamp: new Date().toISOString(),
|
|
328
|
+
operation,
|
|
329
|
+
args: this.redactSensitive(args),
|
|
330
|
+
success,
|
|
331
|
+
durationMs,
|
|
332
|
+
error,
|
|
333
|
+
};
|
|
334
|
+
auditLog.push(entry);
|
|
335
|
+
if (auditLog.length > auditMaxEntries) {
|
|
336
|
+
auditLog.shift();
|
|
337
|
+
}
|
|
338
|
+
for (const handler of auditHandlers) {
|
|
339
|
+
try {
|
|
340
|
+
handler(entry);
|
|
341
|
+
}
|
|
342
|
+
catch {
|
|
343
|
+
// Audit handlers should not throw
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
},
|
|
347
|
+
/**
|
|
348
|
+
* Get the audit log
|
|
349
|
+
*/
|
|
350
|
+
getAuditLog(limit) {
|
|
351
|
+
if (limit === undefined)
|
|
352
|
+
return [...auditLog];
|
|
353
|
+
return auditLog.slice(-limit);
|
|
354
|
+
},
|
|
355
|
+
/**
|
|
356
|
+
* Clear the audit log
|
|
357
|
+
*/
|
|
358
|
+
clearAuditLog() {
|
|
359
|
+
auditLog.length = 0;
|
|
360
|
+
},
|
|
361
|
+
/**
|
|
362
|
+
* Sanitize text for safe typing (remove control characters)
|
|
363
|
+
*/
|
|
364
|
+
sanitizeText(text) {
|
|
365
|
+
// Remove control characters except newline, tab, carriage return
|
|
366
|
+
// eslint-disable-next-line no-control-regex
|
|
367
|
+
return text.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '');
|
|
368
|
+
},
|
|
369
|
+
/**
|
|
370
|
+
* Redact potentially sensitive values from an object
|
|
371
|
+
*/
|
|
372
|
+
redactSensitive(obj) {
|
|
373
|
+
const sensitiveKeys = ['password', 'secret', 'token', 'key', 'credential', 'auth'];
|
|
374
|
+
const result = {};
|
|
375
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
376
|
+
const lowerKey = key.toLowerCase();
|
|
377
|
+
if (sensitiveKeys.some((sk) => lowerKey.includes(sk))) {
|
|
378
|
+
result[key] = '[REDACTED]';
|
|
379
|
+
}
|
|
380
|
+
else if (typeof value === 'string' && value.length > 1000) {
|
|
381
|
+
result[key] = `[STRING: ${value.length} chars]`;
|
|
382
|
+
}
|
|
383
|
+
else if (value instanceof Buffer || ArrayBuffer.isView(value)) {
|
|
384
|
+
result[key] = `[BUFFER: ${value.length} bytes]`;
|
|
385
|
+
}
|
|
386
|
+
else {
|
|
387
|
+
result[key] = value;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
return result;
|
|
391
|
+
},
|
|
392
|
+
/**
|
|
393
|
+
* Check if running in a sandboxed environment (best effort detection)
|
|
394
|
+
*/
|
|
395
|
+
detectSandbox() {
|
|
396
|
+
const indicators = [];
|
|
397
|
+
// Check for common sandbox indicators
|
|
398
|
+
if (process.env.CONTAINER)
|
|
399
|
+
indicators.push('CONTAINER env var');
|
|
400
|
+
if (process.env.DOCKER_CONTAINER)
|
|
401
|
+
indicators.push('DOCKER_CONTAINER env var');
|
|
402
|
+
if (process.env.KUBERNETES_SERVICE_HOST)
|
|
403
|
+
indicators.push('Kubernetes');
|
|
404
|
+
if (process.env.AWS_LAMBDA_FUNCTION_NAME)
|
|
405
|
+
indicators.push('AWS Lambda');
|
|
406
|
+
if (process.env.FUNCTIONS_WORKER_RUNTIME)
|
|
407
|
+
indicators.push('Azure Functions');
|
|
408
|
+
if (process.env.GCP_PROJECT)
|
|
409
|
+
indicators.push('Google Cloud');
|
|
410
|
+
return {
|
|
411
|
+
sandboxed: indicators.length > 0,
|
|
412
|
+
indicators,
|
|
413
|
+
};
|
|
414
|
+
},
|
|
415
|
+
/**
|
|
416
|
+
* Generate a secure operation ID
|
|
417
|
+
*/
|
|
418
|
+
generateOperationId() {
|
|
419
|
+
const timestamp = Date.now().toString(36);
|
|
420
|
+
const random = Math.random().toString(36).slice(2, 10);
|
|
421
|
+
return `op-${timestamp}-${random}`;
|
|
422
|
+
},
|
|
423
|
+
};
|
|
424
|
+
// ── Rate Limiting Utilities ─────────────────────────────────────────────────
|
|
425
|
+
/**
|
|
426
|
+
* Token bucket rate limiter
|
|
427
|
+
*/
|
|
428
|
+
class RateLimiter {
|
|
429
|
+
tokens;
|
|
430
|
+
lastRefill;
|
|
431
|
+
maxTokens;
|
|
432
|
+
refillRate; // tokens per second
|
|
433
|
+
/**
|
|
434
|
+
* Create a rate limiter
|
|
435
|
+
* @param maxTokens Maximum tokens in the bucket
|
|
436
|
+
* @param refillRate Tokens added per second
|
|
437
|
+
*/
|
|
438
|
+
constructor(maxTokens, refillRate) {
|
|
439
|
+
this.maxTokens = maxTokens;
|
|
440
|
+
this.refillRate = refillRate;
|
|
441
|
+
this.tokens = maxTokens;
|
|
442
|
+
this.lastRefill = Date.now();
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Try to consume tokens
|
|
446
|
+
* @returns true if tokens were available, false if rate limited
|
|
447
|
+
*/
|
|
448
|
+
tryConsume(count = 1) {
|
|
449
|
+
this.refill();
|
|
450
|
+
if (this.tokens >= count) {
|
|
451
|
+
this.tokens -= count;
|
|
452
|
+
return true;
|
|
453
|
+
}
|
|
454
|
+
return false;
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Get current token count
|
|
458
|
+
*/
|
|
459
|
+
getTokens() {
|
|
460
|
+
this.refill();
|
|
461
|
+
return this.tokens;
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Check if rate limited (without consuming)
|
|
465
|
+
*/
|
|
466
|
+
isLimited() {
|
|
467
|
+
this.refill();
|
|
468
|
+
return this.tokens < 1;
|
|
469
|
+
}
|
|
470
|
+
refill() {
|
|
471
|
+
const now = Date.now();
|
|
472
|
+
const elapsed = (now - this.lastRefill) / 1000;
|
|
473
|
+
this.tokens = Math.min(this.maxTokens, this.tokens + elapsed * this.refillRate);
|
|
474
|
+
this.lastRefill = now;
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
exports.RateLimiter = RateLimiter;
|
|
478
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../ts/validation.ts"],"names":[],"mappings":"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"}
|