veto-sdk 2.2.0 → 2.3.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 +933 -57
- package/dist/admin/client.d.ts +93 -0
- package/dist/admin/client.d.ts.map +1 -0
- package/dist/admin/client.js +365 -0
- package/dist/admin/client.js.map +1 -0
- package/dist/admin/types.d.ts +205 -0
- package/dist/admin/types.d.ts.map +1 -0
- package/dist/admin/types.js +2 -0
- package/dist/admin/types.js.map +1 -0
- package/dist/audit/chain.d.ts +13 -0
- package/dist/audit/chain.d.ts.map +1 -0
- package/dist/audit/chain.js +32 -0
- package/dist/audit/chain.js.map +1 -0
- package/dist/browser/protect.d.ts.map +1 -1
- package/dist/browser/protect.js +9 -1
- package/dist/browser/protect.js.map +1 -1
- package/dist/browser/types.d.ts +4 -1
- package/dist/browser/types.d.ts.map +1 -1
- package/dist/browser/veto.d.ts.map +1 -1
- package/dist/browser/veto.js +33 -2
- package/dist/browser/veto.js.map +1 -1
- package/dist/cli/bin.js +0 -0
- package/dist/cli/compile.js +2 -2
- package/dist/cli/compile.js.map +1 -1
- package/dist/cli/repl-generate.js +1 -1
- package/dist/cli/repl-generate.js.map +1 -1
- package/dist/cli/runner.d.ts.map +1 -1
- package/dist/cli/runner.js +129 -8
- package/dist/cli/runner.js.map +1 -1
- package/dist/cli/templates.d.ts +1 -1
- package/dist/cli/templates.d.ts.map +1 -1
- package/dist/cli/templates.js +1 -1
- package/dist/compiler/evaluator.d.ts.map +1 -1
- package/dist/compiler/evaluator.js +6 -0
- package/dist/compiler/evaluator.js.map +1 -1
- package/dist/core/events.d.ts +2 -0
- package/dist/core/events.d.ts.map +1 -1
- package/dist/core/events.js +33 -4
- package/dist/core/events.js.map +1 -1
- package/dist/core/history.d.ts +14 -0
- package/dist/core/history.d.ts.map +1 -1
- package/dist/core/history.js +73 -13
- package/dist/core/history.js.map +1 -1
- package/dist/core/protect.d.ts +4 -0
- package/dist/core/protect.d.ts.map +1 -1
- package/dist/core/protect.js +9 -1
- package/dist/core/protect.js.map +1 -1
- package/dist/core/validator.d.ts +4 -0
- package/dist/core/validator.d.ts.map +1 -1
- package/dist/core/validator.js +119 -97
- package/dist/core/validator.js.map +1 -1
- package/dist/core/veto.d.ts +35 -1
- package/dist/core/veto.d.ts.map +1 -1
- package/dist/core/veto.js +106 -6
- package/dist/core/veto.js.map +1 -1
- package/dist/custom/types.d.ts +1 -1
- package/dist/custom/types.d.ts.map +1 -1
- package/dist/deterministic/regex-safety.d.ts.map +1 -1
- package/dist/deterministic/regex-safety.js +42 -1
- package/dist/deterministic/regex-safety.js.map +1 -1
- package/dist/extractors/content.d.ts.map +1 -1
- package/dist/extractors/content.js +40 -23
- package/dist/extractors/content.js.map +1 -1
- package/dist/index.d.ts +11 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/integrations/langchain/middleware.d.ts +1 -1
- package/dist/integrations/langchain/middleware.js +1 -1
- package/dist/integrations/vercel-ai/middleware.d.ts +1 -1
- package/dist/integrations/vercel-ai/middleware.js +1 -1
- package/dist/observability/otel.d.ts +29 -0
- package/dist/observability/otel.d.ts.map +1 -0
- package/dist/observability/otel.js +43 -0
- package/dist/observability/otel.js.map +1 -0
- package/dist/policy/generator.d.ts.map +1 -1
- package/dist/policy/generator.js +4 -2
- package/dist/policy/generator.js.map +1 -1
- package/dist/proxy/anthropic-interceptor.d.ts +51 -0
- package/dist/proxy/anthropic-interceptor.d.ts.map +1 -0
- package/dist/proxy/anthropic-interceptor.js +132 -0
- package/dist/proxy/anthropic-interceptor.js.map +1 -0
- package/dist/proxy/interceptor.d.ts +55 -0
- package/dist/proxy/interceptor.d.ts.map +1 -0
- package/dist/proxy/interceptor.js +111 -0
- package/dist/proxy/interceptor.js.map +1 -0
- package/dist/proxy/server.d.ts +21 -0
- package/dist/proxy/server.d.ts.map +1 -0
- package/dist/proxy/server.js +545 -0
- package/dist/proxy/server.js.map +1 -0
- package/dist/proxy/types.d.ts +18 -0
- package/dist/proxy/types.d.ts.map +1 -0
- package/dist/proxy/types.js +7 -0
- package/dist/proxy/types.js.map +1 -0
- package/dist/rate-limiting/evaluator.d.ts +17 -0
- package/dist/rate-limiting/evaluator.d.ts.map +1 -0
- package/dist/rate-limiting/evaluator.js +48 -0
- package/dist/rate-limiting/evaluator.js.map +1 -0
- package/dist/rate-limiting/redis-store.d.ts +36 -0
- package/dist/rate-limiting/redis-store.d.ts.map +1 -0
- package/dist/rate-limiting/redis-store.js +68 -0
- package/dist/rate-limiting/redis-store.js.map +1 -0
- package/dist/rate-limiting/store.d.ts +8 -0
- package/dist/rate-limiting/store.d.ts.map +1 -0
- package/dist/rate-limiting/store.js +60 -0
- package/dist/rate-limiting/store.js.map +1 -0
- package/dist/rate-limiting/types.d.ts +9 -0
- package/dist/rate-limiting/types.d.ts.map +1 -0
- package/dist/rate-limiting/types.js +2 -0
- package/dist/rate-limiting/types.js.map +1 -0
- package/dist/rules/condition-evaluator.d.ts +6 -0
- package/dist/rules/condition-evaluator.d.ts.map +1 -1
- package/dist/rules/condition-evaluator.js +60 -18
- package/dist/rules/condition-evaluator.js.map +1 -1
- package/dist/rules/expression-validator.d.ts.map +1 -1
- package/dist/rules/expression-validator.js +5 -0
- package/dist/rules/expression-validator.js.map +1 -1
- package/dist/rules/loader.d.ts.map +1 -1
- package/dist/rules/loader.js +2 -0
- package/dist/rules/loader.js.map +1 -1
- package/dist/rules/local-evaluator.d.ts +11 -15
- package/dist/rules/local-evaluator.d.ts.map +1 -1
- package/dist/rules/local-evaluator.js +62 -29
- package/dist/rules/local-evaluator.js.map +1 -1
- package/dist/rules/policy-ir-schema.d.ts +43 -1
- package/dist/rules/policy-ir-schema.d.ts.map +1 -1
- package/dist/rules/policy-ir-schema.js +27 -1
- package/dist/rules/policy-ir-schema.js.map +1 -1
- package/dist/rules/types.d.ts +20 -1
- package/dist/rules/types.d.ts.map +1 -1
- package/dist/rules/types.js.map +1 -1
- package/dist/testing/runner.d.ts +21 -0
- package/dist/testing/runner.d.ts.map +1 -0
- package/dist/testing/runner.js +239 -0
- package/dist/testing/runner.js.map +1 -0
- package/dist/testing/types.d.ts +39 -0
- package/dist/testing/types.d.ts.map +1 -0
- package/dist/testing/types.js +7 -0
- package/dist/testing/types.js.map +1 -0
- package/dist/types/config.d.ts +1 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js.map +1 -1
- package/package.json +30 -17
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/proxy/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for veto intercept proxy.
|
|
3
|
+
*
|
|
4
|
+
* @module proxy/types
|
|
5
|
+
*/
|
|
6
|
+
export interface ProxyConfig {
|
|
7
|
+
/** Port for the local proxy to listen on. Default: 8080 */
|
|
8
|
+
port: number;
|
|
9
|
+
/** Upstream target URL. Default: https://api.openai.com */
|
|
10
|
+
target: string;
|
|
11
|
+
/** Max bytes to buffer before giving up and flushing. Default: 1MB */
|
|
12
|
+
maxBufferBytes: number;
|
|
13
|
+
/** Path to veto config directory. Default: ./veto */
|
|
14
|
+
configDir: string;
|
|
15
|
+
/** SSE format to intercept. 'auto' detects from target URL. Default: 'auto' */
|
|
16
|
+
format?: 'openai' | 'anthropic' | 'auto';
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/proxy/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,WAAW;IAC1B,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,cAAc,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;CAC1C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/proxy/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { RateLimitEntry } from './types.js';
|
|
2
|
+
import type { ValidationContext } from '../types/config.js';
|
|
3
|
+
import type { Logger } from '../utils/logger.js';
|
|
4
|
+
export interface RateLimitStore {
|
|
5
|
+
checkAndRecord(key: string, maxCalls: number, windowMs: number): boolean | Promise<boolean>;
|
|
6
|
+
clear(): void | Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export declare function buildScopeKey(entry: RateLimitEntry, ctx: Pick<ValidationContext, 'agentId' | 'userId' | 'sessionId'>, toolName: string, logger: Logger, ruleId?: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Evaluate rate limits for a tool call.
|
|
11
|
+
* Returns null if all limits pass, or a denial reason string if any limit is exceeded.
|
|
12
|
+
*
|
|
13
|
+
* When no store is provided, falls back to the built-in in-memory sliding window store.
|
|
14
|
+
* Accepts async stores (e.g. Redis) — callers must await the result.
|
|
15
|
+
*/
|
|
16
|
+
export declare function evaluateRateLimits(rateLimits: RateLimitEntry[], ctx: Pick<ValidationContext, 'agentId' | 'userId' | 'sessionId'>, toolName: string, logger: Logger, ruleId?: string, store?: RateLimitStore): Promise<string | null>;
|
|
17
|
+
//# sourceMappingURL=evaluator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../src/rate-limiting/evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5F,KAAK,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,cAAc,EACrB,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAC,EAChE,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAgBR;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,cAAc,EAAE,EAC5B,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAC,EAChE,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,cAAc,GACrB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgBxB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { checkAndRecord as memoryCheckAndRecord } from './store.js';
|
|
2
|
+
export function buildScopeKey(entry, ctx, toolName, logger, ruleId) {
|
|
3
|
+
let scopeId;
|
|
4
|
+
switch (entry.scope) {
|
|
5
|
+
case 'agent':
|
|
6
|
+
scopeId = ctx.agentId ?? null;
|
|
7
|
+
break;
|
|
8
|
+
case 'user':
|
|
9
|
+
scopeId = ctx.userId ?? null;
|
|
10
|
+
break;
|
|
11
|
+
case 'session':
|
|
12
|
+
scopeId = ctx.sessionId ?? null;
|
|
13
|
+
break;
|
|
14
|
+
default: scopeId = 'global';
|
|
15
|
+
}
|
|
16
|
+
if (scopeId === null) {
|
|
17
|
+
logger.warn(`[veto] rate_limit scope '${entry.scope}' requires ${entry.scope}Id in context. Falling back to global.`);
|
|
18
|
+
scopeId = 'global';
|
|
19
|
+
}
|
|
20
|
+
const prefix = ruleId ? `${ruleId}:` : '';
|
|
21
|
+
return `${prefix}${entry.scope}:${scopeId}:${toolName}`;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Evaluate rate limits for a tool call.
|
|
25
|
+
* Returns null if all limits pass, or a denial reason string if any limit is exceeded.
|
|
26
|
+
*
|
|
27
|
+
* When no store is provided, falls back to the built-in in-memory sliding window store.
|
|
28
|
+
* Accepts async stores (e.g. Redis) — callers must await the result.
|
|
29
|
+
*/
|
|
30
|
+
export async function evaluateRateLimits(rateLimits, ctx, toolName, logger, ruleId, store) {
|
|
31
|
+
const check = store ? store.checkAndRecord.bind(store) : memoryCheckAndRecord;
|
|
32
|
+
for (const entry of rateLimits) {
|
|
33
|
+
const key = buildScopeKey(entry, ctx, toolName, logger, ruleId);
|
|
34
|
+
const windowMs = entry.window_seconds * 1000;
|
|
35
|
+
try {
|
|
36
|
+
const allowed = await check(key, entry.max_calls, windowMs);
|
|
37
|
+
if (!allowed) {
|
|
38
|
+
return `Rate limit exceeded: max ${entry.max_calls} calls per ${entry.window_seconds}s (scope: ${entry.scope})`;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
logger.error('[veto] rate limit store error, failing closed', { err: String(err) });
|
|
43
|
+
return 'Rate limit check failed (fail-closed)';
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=evaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../src/rate-limiting/evaluator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,IAAI,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAQpE,MAAM,UAAU,aAAa,CAC3B,KAAqB,EACrB,GAAgE,EAChE,QAAgB,EAChB,MAAc,EACd,MAAe;IAEf,IAAI,OAAsB,CAAC;IAC3B,QAAQ,KAAK,CAAC,KAAK,EAAE,CAAC;QACpB,KAAK,OAAO;YAAE,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC;YAAC,MAAM;QACnD,KAAK,MAAM;YAAE,OAAO,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC;YAAC,MAAM;QACjD,KAAK,SAAS;YAAE,OAAO,GAAG,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC;YAAC,MAAM;QACvD,OAAO,CAAC,CAAC,OAAO,GAAG,QAAQ,CAAC;IAC9B,CAAC;IACD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CACT,4BAA4B,KAAK,CAAC,KAAK,cAAc,KAAK,CAAC,KAAK,wCAAwC,CACzG,CAAC;QACF,OAAO,GAAG,QAAQ,CAAC;IACrB,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1C,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC,KAAK,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;AAC1D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAA4B,EAC5B,GAAgE,EAChE,QAAgB,EAChB,MAAc,EACd,MAAe,EACf,KAAsB;IAEtB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;IAC9E,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC5D,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,4BAA4B,KAAK,CAAC,SAAS,cAAc,KAAK,CAAC,cAAc,aAAa,KAAK,CAAC,KAAK,GAAG,CAAC;YAClH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,+CAA+C,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACpF,OAAO,uCAAuC,CAAC;QACjD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redis/Valkey-backed sliding window rate limit store.
|
|
3
|
+
*
|
|
4
|
+
* Uses a sorted set per key with timestamps as scores. A Lua script
|
|
5
|
+
* atomically prunes expired entries, checks the count, and records
|
|
6
|
+
* the new call — no TOCTOU race across cluster nodes.
|
|
7
|
+
*
|
|
8
|
+
* Requires the `redis` npm package (^4.0.0) as an optional peer dependency.
|
|
9
|
+
*/
|
|
10
|
+
type RedisClient = {
|
|
11
|
+
scriptLoad(script: string): Promise<string>;
|
|
12
|
+
evalSha(sha: string, options: {
|
|
13
|
+
keys: string[];
|
|
14
|
+
arguments: string[];
|
|
15
|
+
}): Promise<unknown>;
|
|
16
|
+
scan(cursor: number, options: {
|
|
17
|
+
MATCH: string;
|
|
18
|
+
COUNT: number;
|
|
19
|
+
}): Promise<{
|
|
20
|
+
cursor: number;
|
|
21
|
+
keys: string[];
|
|
22
|
+
}>;
|
|
23
|
+
del(keys: string | string[]): Promise<number>;
|
|
24
|
+
};
|
|
25
|
+
import type { RateLimitStore } from './evaluator.js';
|
|
26
|
+
export declare class RedisRateLimitStore implements RateLimitStore {
|
|
27
|
+
private client;
|
|
28
|
+
private scriptSha;
|
|
29
|
+
private keyPrefix;
|
|
30
|
+
constructor(client: RedisClient, keyPrefix?: string);
|
|
31
|
+
checkAndRecord(key: string, maxCalls: number, windowMs: number): Promise<boolean>;
|
|
32
|
+
private _checkAndRecord;
|
|
33
|
+
clear(): Promise<void>;
|
|
34
|
+
}
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=redis-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-store.d.ts","sourceRoot":"","sources":["../../src/rate-limiting/redis-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,KAAK,WAAW,GAAG;IACjB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzF,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAC7G,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC/C,CAAC;AAkBF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,qBAAa,mBAAoB,YAAW,cAAc;IACxD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,WAAW,EAAE,SAAS,SAAa;IAKjD,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAIzE,eAAe;IA0BvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAU7B"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redis/Valkey-backed sliding window rate limit store.
|
|
3
|
+
*
|
|
4
|
+
* Uses a sorted set per key with timestamps as scores. A Lua script
|
|
5
|
+
* atomically prunes expired entries, checks the count, and records
|
|
6
|
+
* the new call — no TOCTOU race across cluster nodes.
|
|
7
|
+
*
|
|
8
|
+
* Requires the `redis` npm package (^4.0.0) as an optional peer dependency.
|
|
9
|
+
*/
|
|
10
|
+
const SLIDING_WINDOW_SCRIPT = `
|
|
11
|
+
local key = KEYS[1]
|
|
12
|
+
local windowMs = tonumber(ARGV[1])
|
|
13
|
+
local maxCalls = tonumber(ARGV[2])
|
|
14
|
+
local now = tonumber(ARGV[3])
|
|
15
|
+
local cutoff = now - windowMs
|
|
16
|
+
redis.call('ZREMRANGEBYSCORE', key, '-inf', cutoff)
|
|
17
|
+
local count = redis.call('ZCARD', key)
|
|
18
|
+
if count >= maxCalls then
|
|
19
|
+
return 0
|
|
20
|
+
end
|
|
21
|
+
redis.call('ZADD', key, now, now .. '-' .. math.random(1000000))
|
|
22
|
+
redis.call('PEXPIRE', key, windowMs)
|
|
23
|
+
return 1
|
|
24
|
+
`;
|
|
25
|
+
export class RedisRateLimitStore {
|
|
26
|
+
client;
|
|
27
|
+
scriptSha = null;
|
|
28
|
+
keyPrefix;
|
|
29
|
+
constructor(client, keyPrefix = 'veto:rl:') {
|
|
30
|
+
this.client = client;
|
|
31
|
+
this.keyPrefix = keyPrefix;
|
|
32
|
+
}
|
|
33
|
+
async checkAndRecord(key, maxCalls, windowMs) {
|
|
34
|
+
return this._checkAndRecord(key, maxCalls, windowMs, false);
|
|
35
|
+
}
|
|
36
|
+
async _checkAndRecord(key, maxCalls, windowMs, retried) {
|
|
37
|
+
const fullKey = this.keyPrefix + key;
|
|
38
|
+
const now = Date.now();
|
|
39
|
+
try {
|
|
40
|
+
if (!this.scriptSha) {
|
|
41
|
+
this.scriptSha = await this.client.scriptLoad(SLIDING_WINDOW_SCRIPT);
|
|
42
|
+
}
|
|
43
|
+
const result = await this.client.evalSha(this.scriptSha, {
|
|
44
|
+
keys: [fullKey],
|
|
45
|
+
arguments: [windowMs.toString(), maxCalls.toString(), now.toString()],
|
|
46
|
+
});
|
|
47
|
+
return result === 1;
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
if (!retried && err instanceof Error && err.message.includes('NOSCRIPT')) {
|
|
51
|
+
this.scriptSha = null;
|
|
52
|
+
return this._checkAndRecord(key, maxCalls, windowMs, true);
|
|
53
|
+
}
|
|
54
|
+
throw err;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async clear() {
|
|
58
|
+
let cursor = 0;
|
|
59
|
+
do {
|
|
60
|
+
const result = await this.client.scan(cursor, { MATCH: this.keyPrefix + '*', COUNT: 100 });
|
|
61
|
+
cursor = result.cursor;
|
|
62
|
+
if (result.keys.length > 0) {
|
|
63
|
+
await this.client.del(result.keys);
|
|
64
|
+
}
|
|
65
|
+
} while (cursor !== 0);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=redis-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-store.js","sourceRoot":"","sources":["../../src/rate-limiting/redis-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;CAc7B,CAAC;AAIF,MAAM,OAAO,mBAAmB;IACtB,MAAM,CAAc;IACpB,SAAS,GAAkB,IAAI,CAAC;IAChC,SAAS,CAAS;IAE1B,YAAY,MAAmB,EAAE,SAAS,GAAG,UAAU;QACrD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,GAAW,EAAE,QAAgB,EAAE,QAAgB;QAClE,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC9D,CAAC;IAEO,KAAK,CAAC,eAAe,CAC3B,GAAW,EAAE,QAAgB,EAAE,QAAgB,EAAE,OAAgB;QAEjE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACpB,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;YACvE,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE;gBACvD,IAAI,EAAE,CAAC,OAAO,CAAC;gBACf,SAAS,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;aACtE,CAAC,CAAC;YAEH,OAAO,MAAM,KAAK,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAI,CAAC,OAAO,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACzE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC7D,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,GAAG,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAC3F,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YACvB,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;QACH,CAAC,QAAQ,MAAM,KAAK,CAAC,EAAE;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if a call is allowed, and record it if so.
|
|
3
|
+
* Returns true if allowed, false if rate limited.
|
|
4
|
+
*/
|
|
5
|
+
export declare function checkAndRecord(key: string, maxCalls: number, windowMs: number): boolean;
|
|
6
|
+
/** Clear all rate limit state (used in tests) */
|
|
7
|
+
export declare function clearStore(): void;
|
|
8
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/rate-limiting/store.ts"],"names":[],"mappings":"AAcA;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAYvF;AAsBD,iDAAiD;AACjD,wBAAgB,UAAU,IAAI,IAAI,CAOjC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-process sliding window rate limit store.
|
|
3
|
+
*
|
|
4
|
+
* Stores call timestamps per key. Checks are synchronous — safe in Node.js
|
|
5
|
+
* single-threaded event loop (no race conditions on Map reads/writes).
|
|
6
|
+
*
|
|
7
|
+
* Limitations: process-local only. Resets on restart. For multi-process
|
|
8
|
+
* deployments, use cloud mode with stateful counters.
|
|
9
|
+
*/
|
|
10
|
+
const store = new Map();
|
|
11
|
+
let sweepInterval = null;
|
|
12
|
+
let maxWindowMs = 0;
|
|
13
|
+
/**
|
|
14
|
+
* Check if a call is allowed, and record it if so.
|
|
15
|
+
* Returns true if allowed, false if rate limited.
|
|
16
|
+
*/
|
|
17
|
+
export function checkAndRecord(key, maxCalls, windowMs) {
|
|
18
|
+
const now = Date.now();
|
|
19
|
+
const prev = store.get(key) ?? [];
|
|
20
|
+
const valid = prev.filter(t => now - t < windowMs);
|
|
21
|
+
if (valid.length >= maxCalls)
|
|
22
|
+
return false;
|
|
23
|
+
valid.push(now);
|
|
24
|
+
store.set(key, valid);
|
|
25
|
+
// Track the largest window for sweep purposes
|
|
26
|
+
if (windowMs > maxWindowMs)
|
|
27
|
+
maxWindowMs = windowMs;
|
|
28
|
+
ensureSweep();
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
/** Remove keys whose newest timestamp is older than the largest configured window. */
|
|
32
|
+
function sweep() {
|
|
33
|
+
if (store.size === 0)
|
|
34
|
+
return;
|
|
35
|
+
const now = Date.now();
|
|
36
|
+
const cutoff = maxWindowMs || 60_000;
|
|
37
|
+
for (const [key, timestamps] of store) {
|
|
38
|
+
if (timestamps.length === 0 || now - timestamps[timestamps.length - 1] >= cutoff) {
|
|
39
|
+
store.delete(key);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function ensureSweep() {
|
|
44
|
+
if (sweepInterval !== null)
|
|
45
|
+
return;
|
|
46
|
+
sweepInterval = setInterval(sweep, 60_000);
|
|
47
|
+
if (typeof sweepInterval === 'object' && sweepInterval !== null && 'unref' in sweepInterval) {
|
|
48
|
+
sweepInterval.unref();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** Clear all rate limit state (used in tests) */
|
|
52
|
+
export function clearStore() {
|
|
53
|
+
store.clear();
|
|
54
|
+
if (sweepInterval !== null) {
|
|
55
|
+
clearInterval(sweepInterval);
|
|
56
|
+
sweepInterval = null;
|
|
57
|
+
}
|
|
58
|
+
maxWindowMs = 0;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/rate-limiting/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;AAE1C,IAAI,aAAa,GAA0C,IAAI,CAAC;AAChE,IAAI,WAAW,GAAG,CAAC,CAAC;AAEpB;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,QAAgB,EAAE,QAAgB;IAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IACnD,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAEtB,8CAA8C;IAC9C,IAAI,QAAQ,GAAG,WAAW;QAAE,WAAW,GAAG,QAAQ,CAAC;IACnD,WAAW,EAAE,CAAC;IACd,OAAO,IAAI,CAAC;AACd,CAAC;AAED,sFAAsF;AACtF,SAAS,KAAK;IACZ,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO;IAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,WAAW,IAAI,MAAM,CAAC;IACrC,KAAK,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,KAAK,EAAE,CAAC;QACtC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC;YACjF,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,WAAW;IAClB,IAAI,aAAa,KAAK,IAAI;QAAE,OAAO;IACnC,aAAa,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC3C,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,KAAK,IAAI,IAAI,OAAO,IAAI,aAAa,EAAE,CAAC;QAC3F,aAAgC,CAAC,KAAK,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,UAAU;IACxB,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC3B,aAAa,CAAC,aAAa,CAAC,CAAC;QAC7B,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;IACD,WAAW,GAAG,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface RateLimitEntry {
|
|
2
|
+
/** Scope of the rate limit */
|
|
3
|
+
scope: 'agent' | 'user' | 'session' | 'global';
|
|
4
|
+
/** Maximum calls allowed in the window */
|
|
5
|
+
max_calls: number;
|
|
6
|
+
/** Window size in seconds */
|
|
7
|
+
window_seconds: number;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/rate-limiting/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,8BAA8B;IAC9B,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC/C,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,cAAc,EAAE,MAAM,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/rate-limiting/types.ts"],"names":[],"mappings":""}
|
|
@@ -4,6 +4,10 @@ export interface ConditionEvaluationOptions {
|
|
|
4
4
|
allowNestedObjectStringSearch?: boolean;
|
|
5
5
|
now?: Date;
|
|
6
6
|
}
|
|
7
|
+
interface TimeWindowEvaluation {
|
|
8
|
+
inScope: boolean;
|
|
9
|
+
withinWindow: boolean;
|
|
10
|
+
}
|
|
7
11
|
/**
|
|
8
12
|
* Resolve a dot-notation field path from an evaluation context.
|
|
9
13
|
*/
|
|
@@ -12,6 +16,7 @@ export declare function resolveFieldPath(field: string, context: Record<string,
|
|
|
12
16
|
* Compile a regex pattern only if it passes safety checks.
|
|
13
17
|
*/
|
|
14
18
|
export declare function createSafeRegex(pattern: string, flags?: string): RegExp | null;
|
|
19
|
+
export declare function evaluateTimeWindow(fieldValue: unknown, expected: unknown): TimeWindowEvaluation | null;
|
|
15
20
|
/**
|
|
16
21
|
* Evaluate a single legacy field/operator/value condition.
|
|
17
22
|
*/
|
|
@@ -26,4 +31,5 @@ export declare function evaluateCondition(condition: RuleCondition, context: Rec
|
|
|
26
31
|
* - `conditionGroups`: OR semantics, each group is AND
|
|
27
32
|
*/
|
|
28
33
|
export declare function evaluateConditionCollections(conditions: RuleCondition[] | undefined, conditionGroups: RuleCondition[][] | undefined, context: Record<string, unknown>, options?: ConditionEvaluationOptions): boolean;
|
|
34
|
+
export {};
|
|
29
35
|
//# sourceMappingURL=condition-evaluator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"condition-evaluator.d.ts","sourceRoot":"","sources":["../../src/rules/condition-evaluator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,aAAa,EAEd,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,0BAA0B;IACzC,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;IACvF,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;
|
|
1
|
+
{"version":3,"file":"condition-evaluator.d.ts","sourceRoot":"","sources":["../../src/rules/condition-evaluator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,aAAa,EAEd,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,0BAA0B;IACzC,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;IACvF,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AASD,UAAU,oBAAoB;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;CACvB;AA6CD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,cAAc,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAoC,GACzE,OAAO,CAWT;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CAef;AAqMD,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,OAAO,EACnB,QAAQ,EAAE,OAAO,GAChB,oBAAoB,GAAG,IAAI,CAmD7B;AAgED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,OAAO,EACnB,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EAAE,OAAO,EACjB,OAAO,GAAE,IAAI,CAAC,0BAA0B,EAAE,+BAA+B,CAAM,GAC9E,OAAO,CAwHT;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAwCT;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,aAAa,EAAE,GAAG,SAAS,EACvC,eAAe,EAAE,aAAa,EAAE,EAAE,GAAG,SAAS,EAC9C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAiBT"}
|
|
@@ -31,6 +31,8 @@ function resolveDotPath(path, source) {
|
|
|
31
31
|
if (typeof current !== 'object') {
|
|
32
32
|
return undefined;
|
|
33
33
|
}
|
|
34
|
+
if (!Object.prototype.hasOwnProperty.call(current, part))
|
|
35
|
+
return undefined;
|
|
34
36
|
current = current[part];
|
|
35
37
|
}
|
|
36
38
|
return current;
|
|
@@ -178,6 +180,11 @@ function getTimeZoneFormatter(timezone) {
|
|
|
178
180
|
minute: '2-digit',
|
|
179
181
|
hour12: false,
|
|
180
182
|
});
|
|
183
|
+
if (TIMEZONE_FORMATTER_CACHE.size >= 1000) {
|
|
184
|
+
const firstKey = TIMEZONE_FORMATTER_CACHE.keys().next().value;
|
|
185
|
+
if (firstKey !== undefined)
|
|
186
|
+
TIMEZONE_FORMATTER_CACHE.delete(firstKey);
|
|
187
|
+
}
|
|
181
188
|
TIMEZONE_FORMATTER_CACHE.set(timezone, formatter);
|
|
182
189
|
return formatter;
|
|
183
190
|
}
|
|
@@ -224,7 +231,7 @@ function previousDay(day) {
|
|
|
224
231
|
function isDayAllowed(day, allowedDays) {
|
|
225
232
|
return allowedDays === null || allowedDays.has(day);
|
|
226
233
|
}
|
|
227
|
-
function evaluateTimeWindow(fieldValue, expected) {
|
|
234
|
+
export function evaluateTimeWindow(fieldValue, expected) {
|
|
228
235
|
const parsedWindow = normalizeTimeWindowValue(expected);
|
|
229
236
|
if (!parsedWindow) {
|
|
230
237
|
return null;
|
|
@@ -321,60 +328,82 @@ export function evaluateLegacyCondition(fieldValue, operator, expected, options
|
|
|
321
328
|
const allowNestedObjectStringSearch = options.allowNestedObjectStringSearch === true;
|
|
322
329
|
switch (operator) {
|
|
323
330
|
case 'equals':
|
|
331
|
+
if (typeof fieldValue === 'string' && typeof expected === 'string') {
|
|
332
|
+
return fieldValue.toLowerCase() === expected.toLowerCase();
|
|
333
|
+
}
|
|
324
334
|
return fieldValue === expected;
|
|
325
335
|
case 'not_equals':
|
|
336
|
+
if (typeof fieldValue === 'string' && typeof expected === 'string') {
|
|
337
|
+
return fieldValue.toLowerCase() !== expected.toLowerCase();
|
|
338
|
+
}
|
|
326
339
|
return fieldValue !== expected;
|
|
327
340
|
case 'contains':
|
|
328
341
|
if (typeof fieldValue === 'string' && typeof expected === 'string') {
|
|
329
|
-
return fieldValue.includes(expected);
|
|
342
|
+
return fieldValue.toLowerCase().includes(expected.toLowerCase());
|
|
330
343
|
}
|
|
331
344
|
if (Array.isArray(fieldValue)) {
|
|
345
|
+
if (typeof expected === 'string') {
|
|
346
|
+
const lower = expected.toLowerCase();
|
|
347
|
+
return fieldValue.some((e) => typeof e === 'string' ? e.toLowerCase() === lower : e === expected);
|
|
348
|
+
}
|
|
332
349
|
return fieldValue.includes(expected);
|
|
333
350
|
}
|
|
334
351
|
if (allowNestedObjectStringSearch && typeof expected === 'string') {
|
|
352
|
+
const lower = expected.toLowerCase();
|
|
335
353
|
return collectNestedStrings(fieldValue)
|
|
336
|
-
.some((value) => value.includes(
|
|
354
|
+
.some((value) => value.toLowerCase().includes(lower));
|
|
337
355
|
}
|
|
338
356
|
return false;
|
|
339
357
|
case 'not_contains':
|
|
340
358
|
if (typeof fieldValue === 'string' && typeof expected === 'string') {
|
|
341
|
-
return !fieldValue.includes(expected);
|
|
359
|
+
return !fieldValue.toLowerCase().includes(expected.toLowerCase());
|
|
342
360
|
}
|
|
343
361
|
if (Array.isArray(fieldValue)) {
|
|
362
|
+
if (typeof expected === 'string') {
|
|
363
|
+
const lower = expected.toLowerCase();
|
|
364
|
+
return !fieldValue.some((e) => typeof e === 'string' ? e.toLowerCase() === lower : e === expected);
|
|
365
|
+
}
|
|
344
366
|
return !fieldValue.includes(expected);
|
|
345
367
|
}
|
|
346
368
|
if (allowNestedObjectStringSearch && typeof expected === 'string') {
|
|
369
|
+
const lower = expected.toLowerCase();
|
|
347
370
|
return collectNestedStrings(fieldValue)
|
|
348
|
-
.every((value) => !value.includes(
|
|
371
|
+
.every((value) => !value.toLowerCase().includes(lower));
|
|
349
372
|
}
|
|
350
|
-
return
|
|
373
|
+
return false;
|
|
351
374
|
case 'starts_with':
|
|
352
375
|
return typeof fieldValue === 'string' && typeof expected === 'string'
|
|
353
|
-
&& fieldValue.startsWith(expected);
|
|
376
|
+
&& fieldValue.toLowerCase().startsWith(expected.toLowerCase());
|
|
354
377
|
case 'ends_with':
|
|
355
378
|
return typeof fieldValue === 'string' && typeof expected === 'string'
|
|
356
|
-
&& fieldValue.endsWith(expected);
|
|
379
|
+
&& fieldValue.toLowerCase().endsWith(expected.toLowerCase());
|
|
357
380
|
case 'matches': {
|
|
358
381
|
if (typeof expected !== 'string') {
|
|
359
382
|
return false;
|
|
360
383
|
}
|
|
361
384
|
if (typeof fieldValue === 'string') {
|
|
362
|
-
return createSafeRegex(expected)?.test(fieldValue) ?? false;
|
|
385
|
+
return createSafeRegex(expected, 'i')?.test(fieldValue) ?? false;
|
|
363
386
|
}
|
|
364
387
|
if (!allowNestedObjectStringSearch) {
|
|
365
388
|
return false;
|
|
366
389
|
}
|
|
367
|
-
const regex = createSafeRegex(expected);
|
|
390
|
+
const regex = createSafeRegex(expected, 'i');
|
|
368
391
|
if (!regex) {
|
|
369
392
|
return false;
|
|
370
393
|
}
|
|
371
394
|
return collectNestedStrings(fieldValue)
|
|
372
395
|
.some((value) => regex.test(value));
|
|
373
396
|
}
|
|
374
|
-
case 'greater_than':
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
return Number(fieldValue)
|
|
397
|
+
case 'greater_than': {
|
|
398
|
+
if (typeof fieldValue !== 'number' || typeof expected !== 'number')
|
|
399
|
+
return false;
|
|
400
|
+
return Number.isFinite(fieldValue) && Number.isFinite(expected) && fieldValue > expected;
|
|
401
|
+
}
|
|
402
|
+
case 'less_than': {
|
|
403
|
+
if (typeof fieldValue !== 'number' || typeof expected !== 'number')
|
|
404
|
+
return false;
|
|
405
|
+
return Number.isFinite(fieldValue) && Number.isFinite(expected) && fieldValue < expected;
|
|
406
|
+
}
|
|
378
407
|
case 'length_greater_than': {
|
|
379
408
|
const fieldLength = getLengthComparableValue(fieldValue);
|
|
380
409
|
if (fieldLength === null) {
|
|
@@ -387,9 +416,21 @@ export function evaluateLegacyCondition(fieldValue, operator, expected, options
|
|
|
387
416
|
return fieldLength > expectedLength;
|
|
388
417
|
}
|
|
389
418
|
case 'in':
|
|
390
|
-
|
|
419
|
+
if (!Array.isArray(expected))
|
|
420
|
+
return false;
|
|
421
|
+
if (typeof fieldValue === 'string') {
|
|
422
|
+
const lower = fieldValue.toLowerCase();
|
|
423
|
+
return expected.some((e) => typeof e === 'string' ? e.toLowerCase() === lower : e === fieldValue);
|
|
424
|
+
}
|
|
425
|
+
return expected.includes(fieldValue);
|
|
391
426
|
case 'not_in':
|
|
392
|
-
|
|
427
|
+
if (!Array.isArray(expected))
|
|
428
|
+
return false;
|
|
429
|
+
if (typeof fieldValue === 'string') {
|
|
430
|
+
const lower = fieldValue.toLowerCase();
|
|
431
|
+
return !expected.some((e) => typeof e === 'string' ? e.toLowerCase() === lower : e === fieldValue);
|
|
432
|
+
}
|
|
433
|
+
return !expected.includes(fieldValue);
|
|
393
434
|
case 'within_hours': {
|
|
394
435
|
const result = evaluateTimeWindow(fieldValue, expected);
|
|
395
436
|
return result !== null && result.inScope && result.withinWindow;
|
|
@@ -425,7 +466,8 @@ export function evaluateCondition(condition, context, options = {}) {
|
|
|
425
466
|
const resolvedReferenceValue = Number(referenceValue);
|
|
426
467
|
if (Number.isNaN(resolvedFieldValue)
|
|
427
468
|
|| Number.isNaN(resolvedExpectedValue)
|
|
428
|
-
|| Number.isNaN(resolvedReferenceValue)
|
|
469
|
+
|| Number.isNaN(resolvedReferenceValue)
|
|
470
|
+
|| resolvedReferenceValue === 0) {
|
|
429
471
|
return false;
|
|
430
472
|
}
|
|
431
473
|
return resolvedFieldValue > (resolvedReferenceValue * resolvedExpectedValue / 100);
|
|
@@ -434,7 +476,7 @@ export function evaluateCondition(condition, context, options = {}) {
|
|
|
434
476
|
allowNestedObjectStringSearch: options.allowNestedObjectStringSearch,
|
|
435
477
|
});
|
|
436
478
|
}
|
|
437
|
-
return
|
|
479
|
+
return false;
|
|
438
480
|
}
|
|
439
481
|
/**
|
|
440
482
|
* Evaluate a rule-like condition collection:
|