observability-toolkit 1.8.2 → 1.8.5
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 +60 -0
- package/dist/backends/index.d.ts +43 -0
- package/dist/backends/index.d.ts.map +1 -1
- package/dist/backends/index.js +41 -0
- package/dist/backends/index.js.map +1 -1
- package/dist/backends/index.test.d.ts +5 -0
- package/dist/backends/index.test.d.ts.map +1 -0
- package/dist/backends/index.test.js +156 -0
- package/dist/backends/index.test.js.map +1 -0
- package/dist/backends/local-jsonl-boolean-search.test.js +15 -12
- package/dist/backends/local-jsonl-boolean-search.test.js.map +1 -1
- package/dist/backends/local-jsonl-cache.test.d.ts +2 -0
- package/dist/backends/local-jsonl-cache.test.d.ts.map +1 -0
- package/dist/backends/local-jsonl-cache.test.js +295 -0
- package/dist/backends/local-jsonl-cache.test.js.map +1 -0
- package/dist/backends/local-jsonl-circuit-breaker.test.d.ts +2 -0
- package/dist/backends/local-jsonl-circuit-breaker.test.d.ts.map +1 -0
- package/dist/backends/local-jsonl-circuit-breaker.test.js +180 -0
- package/dist/backends/local-jsonl-circuit-breaker.test.js.map +1 -0
- package/dist/backends/local-jsonl-export.test.d.ts +2 -0
- package/dist/backends/local-jsonl-export.test.d.ts.map +1 -0
- package/dist/backends/local-jsonl-export.test.js +704 -0
- package/dist/backends/local-jsonl-export.test.js.map +1 -0
- package/dist/backends/local-jsonl-index.test.d.ts +2 -0
- package/dist/backends/local-jsonl-index.test.d.ts.map +1 -0
- package/dist/backends/local-jsonl-index.test.js +554 -0
- package/dist/backends/local-jsonl-index.test.js.map +1 -0
- package/dist/backends/local-jsonl-logs.test.d.ts +2 -0
- package/dist/backends/local-jsonl-logs.test.d.ts.map +1 -0
- package/dist/backends/local-jsonl-logs.test.js +612 -0
- package/dist/backends/local-jsonl-logs.test.js.map +1 -0
- package/dist/backends/local-jsonl-metrics.test.d.ts +2 -0
- package/dist/backends/local-jsonl-metrics.test.d.ts.map +1 -0
- package/dist/backends/local-jsonl-metrics.test.js +876 -0
- package/dist/backends/local-jsonl-metrics.test.js.map +1 -0
- package/dist/backends/local-jsonl-traces.test.d.ts +2 -0
- package/dist/backends/local-jsonl-traces.test.d.ts.map +1 -0
- package/dist/backends/local-jsonl-traces.test.js +1729 -0
- package/dist/backends/local-jsonl-traces.test.js.map +1 -0
- package/dist/backends/local-jsonl.d.ts +9 -0
- package/dist/backends/local-jsonl.d.ts.map +1 -1
- package/dist/backends/local-jsonl.js +348 -227
- package/dist/backends/local-jsonl.js.map +1 -1
- package/dist/backends/local-jsonl.test.js +290 -21
- package/dist/backends/local-jsonl.test.js.map +1 -1
- package/dist/backends/signoz-api-circuit-breaker.test.d.ts +6 -0
- package/dist/backends/signoz-api-circuit-breaker.test.d.ts.map +1 -0
- package/dist/backends/signoz-api-circuit-breaker.test.js +548 -0
- package/dist/backends/signoz-api-circuit-breaker.test.js.map +1 -0
- package/dist/backends/signoz-api-rate-limiter.test.d.ts +6 -0
- package/dist/backends/signoz-api-rate-limiter.test.d.ts.map +1 -0
- package/dist/backends/signoz-api-rate-limiter.test.js +389 -0
- package/dist/backends/signoz-api-rate-limiter.test.js.map +1 -0
- package/dist/backends/signoz-api-ssrf.test.d.ts +6 -0
- package/dist/backends/signoz-api-ssrf.test.d.ts.map +1 -0
- package/dist/backends/signoz-api-ssrf.test.js +216 -0
- package/dist/backends/signoz-api-ssrf.test.js.map +1 -0
- package/dist/backends/signoz-api-test-helpers.d.ts +80 -0
- package/dist/backends/signoz-api-test-helpers.d.ts.map +1 -0
- package/dist/backends/signoz-api-test-helpers.js +79 -0
- package/dist/backends/signoz-api-test-helpers.js.map +1 -0
- package/dist/backends/signoz-api.d.ts +16 -0
- package/dist/backends/signoz-api.d.ts.map +1 -1
- package/dist/backends/signoz-api.js +71 -9
- package/dist/backends/signoz-api.js.map +1 -1
- package/dist/backends/signoz-api.test.d.ts +9 -0
- package/dist/backends/signoz-api.test.d.ts.map +1 -1
- package/dist/backends/signoz-api.test.js +14 -1027
- package/dist/backends/signoz-api.test.js.map +1 -1
- package/dist/lib/cache.d.ts +47 -1
- package/dist/lib/cache.d.ts.map +1 -1
- package/dist/lib/cache.js +40 -3
- package/dist/lib/cache.js.map +1 -1
- package/dist/lib/circuit-breaker.d.ts +83 -0
- package/dist/lib/circuit-breaker.d.ts.map +1 -0
- package/dist/lib/circuit-breaker.js +125 -0
- package/dist/lib/circuit-breaker.js.map +1 -0
- package/dist/lib/circuit-breaker.test.d.ts +2 -0
- package/dist/lib/circuit-breaker.test.d.ts.map +1 -0
- package/dist/lib/circuit-breaker.test.js +263 -0
- package/dist/lib/circuit-breaker.test.js.map +1 -0
- package/dist/lib/constants-symlink.test.d.ts +12 -0
- package/dist/lib/constants-symlink.test.d.ts.map +1 -0
- package/dist/lib/constants-symlink.test.js +357 -0
- package/dist/lib/constants-symlink.test.js.map +1 -0
- package/dist/lib/constants.d.ts +43 -0
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +154 -24
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/constants.test.js +156 -7
- package/dist/lib/constants.test.js.map +1 -1
- package/dist/lib/edge-cases.test.d.ts +11 -0
- package/dist/lib/edge-cases.test.d.ts.map +1 -0
- package/dist/lib/edge-cases.test.js +634 -0
- package/dist/lib/edge-cases.test.js.map +1 -0
- package/dist/lib/error-sanitizer.d.ts.map +1 -1
- package/dist/lib/error-sanitizer.js +62 -26
- package/dist/lib/error-sanitizer.js.map +1 -1
- package/dist/lib/error-sanitizer.test.js +186 -0
- package/dist/lib/error-sanitizer.test.js.map +1 -1
- package/dist/lib/error-types.d.ts +54 -0
- package/dist/lib/error-types.d.ts.map +1 -0
- package/dist/lib/error-types.js +154 -0
- package/dist/lib/error-types.js.map +1 -0
- package/dist/lib/error-types.test.d.ts +2 -0
- package/dist/lib/error-types.test.d.ts.map +1 -0
- package/dist/lib/error-types.test.js +196 -0
- package/dist/lib/error-types.test.js.map +1 -0
- package/dist/lib/file-utils.test.js +3 -3
- package/dist/lib/file-utils.test.js.map +1 -1
- package/dist/lib/indexer.test.js +157 -24
- package/dist/lib/indexer.test.js.map +1 -1
- package/dist/lib/input-validator.d.ts +17 -0
- package/dist/lib/input-validator.d.ts.map +1 -1
- package/dist/lib/input-validator.fuzz.test.d.ts +12 -0
- package/dist/lib/input-validator.fuzz.test.d.ts.map +1 -0
- package/dist/lib/input-validator.fuzz.test.js +290 -0
- package/dist/lib/input-validator.fuzz.test.js.map +1 -0
- package/dist/lib/input-validator.js +62 -3
- package/dist/lib/input-validator.js.map +1 -1
- package/dist/lib/input-validator.test.js +129 -1
- package/dist/lib/input-validator.test.js.map +1 -1
- package/dist/lib/logger.d.ts +46 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +81 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/logger.test.d.ts +2 -0
- package/dist/lib/logger.test.d.ts.map +1 -0
- package/dist/lib/logger.test.js +122 -0
- package/dist/lib/logger.test.js.map +1 -0
- package/dist/lib/query-sanitizer.d.ts +51 -3
- package/dist/lib/query-sanitizer.d.ts.map +1 -1
- package/dist/lib/query-sanitizer.js +105 -31
- package/dist/lib/query-sanitizer.js.map +1 -1
- package/dist/lib/query-sanitizer.test.js +102 -1
- package/dist/lib/query-sanitizer.test.js.map +1 -1
- package/dist/lib/server-utils.d.ts +88 -0
- package/dist/lib/server-utils.d.ts.map +1 -0
- package/dist/lib/server-utils.js +173 -0
- package/dist/lib/server-utils.js.map +1 -0
- package/dist/lib/shared-schemas.d.ts +81 -0
- package/dist/lib/shared-schemas.d.ts.map +1 -0
- package/dist/lib/shared-schemas.js +80 -0
- package/dist/lib/shared-schemas.js.map +1 -0
- package/dist/lib/shared-schemas.test.d.ts +5 -0
- package/dist/lib/shared-schemas.test.d.ts.map +1 -0
- package/dist/lib/shared-schemas.test.js +106 -0
- package/dist/lib/shared-schemas.test.js.map +1 -0
- package/dist/lib/toon-encoder.d.ts +26 -0
- package/dist/lib/toon-encoder.d.ts.map +1 -0
- package/dist/lib/toon-encoder.js +61 -0
- package/dist/lib/toon-encoder.js.map +1 -0
- package/dist/lib/toon-encoder.test.d.ts +5 -0
- package/dist/lib/toon-encoder.test.d.ts.map +1 -0
- package/dist/lib/toon-encoder.test.js +85 -0
- package/dist/lib/toon-encoder.test.js.map +1 -0
- package/dist/server.d.ts +1 -49
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +154 -162
- package/dist/server.js.map +1 -1
- package/dist/server.test.js +198 -7
- package/dist/server.test.js.map +1 -1
- package/dist/test-helpers/env-utils.d.ts +87 -0
- package/dist/test-helpers/env-utils.d.ts.map +1 -0
- package/dist/test-helpers/env-utils.js +132 -0
- package/dist/test-helpers/env-utils.js.map +1 -0
- package/dist/test-helpers/file-utils.d.ts +67 -0
- package/dist/test-helpers/file-utils.d.ts.map +1 -1
- package/dist/test-helpers/file-utils.js +165 -2
- package/dist/test-helpers/file-utils.js.map +1 -1
- package/dist/test-helpers/fuzz-generators.d.ts +58 -0
- package/dist/test-helpers/fuzz-generators.d.ts.map +1 -0
- package/dist/test-helpers/fuzz-generators.js +216 -0
- package/dist/test-helpers/fuzz-generators.js.map +1 -0
- package/dist/test-helpers/index.d.ts +11 -0
- package/dist/test-helpers/index.d.ts.map +1 -0
- package/dist/test-helpers/index.js +30 -0
- package/dist/test-helpers/index.js.map +1 -0
- package/dist/test-helpers/memfs-utils.d.ts +181 -0
- package/dist/test-helpers/memfs-utils.d.ts.map +1 -0
- package/dist/test-helpers/memfs-utils.js +292 -0
- package/dist/test-helpers/memfs-utils.js.map +1 -0
- package/dist/test-helpers/memfs-utils.test.d.ts +5 -0
- package/dist/test-helpers/memfs-utils.test.d.ts.map +1 -0
- package/dist/test-helpers/memfs-utils.test.js +338 -0
- package/dist/test-helpers/memfs-utils.test.js.map +1 -0
- package/dist/test-helpers/mock-backends.d.ts +113 -2
- package/dist/test-helpers/mock-backends.d.ts.map +1 -1
- package/dist/test-helpers/mock-backends.js +199 -3
- package/dist/test-helpers/mock-backends.js.map +1 -1
- package/dist/test-helpers/mock-backends.test.d.ts +5 -0
- package/dist/test-helpers/mock-backends.test.d.ts.map +1 -0
- package/dist/test-helpers/mock-backends.test.js +368 -0
- package/dist/test-helpers/mock-backends.test.js.map +1 -0
- package/dist/test-helpers/race-condition-helpers.d.ts +85 -0
- package/dist/test-helpers/race-condition-helpers.d.ts.map +1 -0
- package/dist/test-helpers/race-condition-helpers.js +279 -0
- package/dist/test-helpers/race-condition-helpers.js.map +1 -0
- package/dist/test-helpers/schema-validators.d.ts +32 -0
- package/dist/test-helpers/schema-validators.d.ts.map +1 -0
- package/dist/test-helpers/schema-validators.js +125 -0
- package/dist/test-helpers/schema-validators.js.map +1 -0
- package/dist/test-helpers/test-data-builders.d.ts +260 -0
- package/dist/test-helpers/test-data-builders.d.ts.map +1 -0
- package/dist/test-helpers/test-data-builders.js +337 -0
- package/dist/test-helpers/test-data-builders.js.map +1 -0
- package/dist/test-helpers/test-data-builders.test.d.ts +2 -0
- package/dist/test-helpers/test-data-builders.test.d.ts.map +1 -0
- package/dist/test-helpers/test-data-builders.test.js +306 -0
- package/dist/test-helpers/test-data-builders.test.js.map +1 -0
- package/dist/test-helpers/tool-validators.d.ts +28 -0
- package/dist/test-helpers/tool-validators.d.ts.map +1 -0
- package/dist/test-helpers/tool-validators.js +71 -0
- package/dist/test-helpers/tool-validators.js.map +1 -0
- package/dist/tools/context-stats.d.ts +1 -0
- package/dist/tools/context-stats.d.ts.map +1 -1
- package/dist/tools/context-stats.js +9 -5
- package/dist/tools/context-stats.js.map +1 -1
- package/dist/tools/context-stats.test.js +24 -10
- package/dist/tools/context-stats.test.js.map +1 -1
- package/dist/tools/get-trace-url.js +2 -2
- package/dist/tools/get-trace-url.js.map +1 -1
- package/dist/tools/health-check.js +2 -2
- package/dist/tools/health-check.js.map +1 -1
- package/dist/tools/query-evaluations.d.ts +21 -18
- package/dist/tools/query-evaluations.d.ts.map +1 -1
- package/dist/tools/query-evaluations.js +33 -19
- package/dist/tools/query-evaluations.js.map +1 -1
- package/dist/tools/query-evaluations.test.js +60 -63
- package/dist/tools/query-evaluations.test.js.map +1 -1
- package/dist/tools/query-llm-events.d.ts +19 -15
- package/dist/tools/query-llm-events.d.ts.map +1 -1
- package/dist/tools/query-llm-events.js +31 -15
- package/dist/tools/query-llm-events.js.map +1 -1
- package/dist/tools/query-llm-events.test.js +277 -12
- package/dist/tools/query-llm-events.test.js.map +1 -1
- package/dist/tools/query-logs.d.ts +22 -22
- package/dist/tools/query-logs.d.ts.map +1 -1
- package/dist/tools/query-logs.js +9 -9
- package/dist/tools/query-logs.js.map +1 -1
- package/dist/tools/query-logs.test.js +19 -72
- package/dist/tools/query-logs.test.js.map +1 -1
- package/dist/tools/query-metrics.d.ts +14 -14
- package/dist/tools/query-metrics.d.ts.map +1 -1
- package/dist/tools/query-metrics.js +9 -9
- package/dist/tools/query-metrics.js.map +1 -1
- package/dist/tools/query-metrics.test.js +12 -25
- package/dist/tools/query-metrics.test.js.map +1 -1
- package/dist/tools/query-traces.d.ts +28 -28
- package/dist/tools/query-traces.d.ts.map +1 -1
- package/dist/tools/query-traces.js +18 -18
- package/dist/tools/query-traces.js.map +1 -1
- package/dist/tools/query-traces.test.js +58 -54
- package/dist/tools/query-traces.test.js.map +1 -1
- package/dist/tools/setup-claudeignore.js +7 -7
- package/dist/tools/setup-claudeignore.js.map +1 -1
- package/dist/tools/setup-claudeignore.test.js +4 -25
- package/dist/tools/setup-claudeignore.test.js.map +1 -1
- package/package.json +4 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-schemas.js","sourceRoot":"","sources":["../../src/lib/shared-schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IAC/D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;CAC5D,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;CAChE,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;CACjE,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC;CACjG,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;CACjE,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;CAC5D,CAAC;AAGF;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,GAAG,aAAa;IAChB,GAAG,aAAa;IAChB,GAAG,eAAe;IAClB,GAAG,gBAAgB;CACpB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;CACrH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-schemas.test.d.ts","sourceRoot":"","sources":["../../src/lib/shared-schemas.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for shared Zod schemas
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it } from 'node:test';
|
|
5
|
+
import assert from 'node:assert';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { traceIdSchema, sessionSchema, dateRangeSchema, paginationSchema, backendSchema, } from './shared-schemas.js';
|
|
8
|
+
describe('shared-schemas', () => {
|
|
9
|
+
describe('traceIdSchema', () => {
|
|
10
|
+
const schema = z.object(traceIdSchema);
|
|
11
|
+
it('should accept valid traceId', () => {
|
|
12
|
+
const result = schema.safeParse({ traceId: 'abc123' });
|
|
13
|
+
assert.strictEqual(result.success, true);
|
|
14
|
+
});
|
|
15
|
+
it('should accept traceId at max length (64)', () => {
|
|
16
|
+
const result = schema.safeParse({ traceId: 'a'.repeat(64) });
|
|
17
|
+
assert.strictEqual(result.success, true);
|
|
18
|
+
});
|
|
19
|
+
it('should reject traceId exceeding 64 characters', () => {
|
|
20
|
+
const result = schema.safeParse({ traceId: 'a'.repeat(65) });
|
|
21
|
+
assert.strictEqual(result.success, false);
|
|
22
|
+
});
|
|
23
|
+
it('should accept undefined traceId', () => {
|
|
24
|
+
const result = schema.safeParse({});
|
|
25
|
+
assert.strictEqual(result.success, true);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
describe('sessionSchema', () => {
|
|
29
|
+
const schema = z.object(sessionSchema);
|
|
30
|
+
it('should accept valid sessionId', () => {
|
|
31
|
+
const result = schema.safeParse({ sessionId: 'session-123' });
|
|
32
|
+
assert.strictEqual(result.success, true);
|
|
33
|
+
});
|
|
34
|
+
it('should accept sessionId at max length (128)', () => {
|
|
35
|
+
const result = schema.safeParse({ sessionId: 'a'.repeat(128) });
|
|
36
|
+
assert.strictEqual(result.success, true);
|
|
37
|
+
});
|
|
38
|
+
it('should reject sessionId exceeding 128 characters', () => {
|
|
39
|
+
const result = schema.safeParse({ sessionId: 'a'.repeat(129) });
|
|
40
|
+
assert.strictEqual(result.success, false);
|
|
41
|
+
});
|
|
42
|
+
it('should accept undefined sessionId', () => {
|
|
43
|
+
const result = schema.safeParse({});
|
|
44
|
+
assert.strictEqual(result.success, true);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
describe('dateRangeSchema', () => {
|
|
48
|
+
const schema = z.object(dateRangeSchema);
|
|
49
|
+
it('should accept valid date range', () => {
|
|
50
|
+
const result = schema.safeParse({
|
|
51
|
+
startDate: '2026-01-01',
|
|
52
|
+
endDate: '2026-01-31',
|
|
53
|
+
});
|
|
54
|
+
assert.strictEqual(result.success, true);
|
|
55
|
+
});
|
|
56
|
+
it('should accept partial date range', () => {
|
|
57
|
+
const result = schema.safeParse({ startDate: '2026-01-01' });
|
|
58
|
+
assert.strictEqual(result.success, true);
|
|
59
|
+
});
|
|
60
|
+
it('should accept empty object', () => {
|
|
61
|
+
const result = schema.safeParse({});
|
|
62
|
+
assert.strictEqual(result.success, true);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe('paginationSchema', () => {
|
|
66
|
+
const schema = z.object(paginationSchema);
|
|
67
|
+
it('should default limit to 50', () => {
|
|
68
|
+
const result = schema.safeParse({});
|
|
69
|
+
assert.strictEqual(result.success, true);
|
|
70
|
+
if (result.success) {
|
|
71
|
+
assert.strictEqual(result.data.limit, 50);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
it('should accept valid limit', () => {
|
|
75
|
+
const result = schema.safeParse({ limit: 100 });
|
|
76
|
+
assert.strictEqual(result.success, true);
|
|
77
|
+
});
|
|
78
|
+
it('should reject limit exceeding 1000', () => {
|
|
79
|
+
const result = schema.safeParse({ limit: 1001 });
|
|
80
|
+
assert.strictEqual(result.success, false);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe('backendSchema', () => {
|
|
84
|
+
const schema = z.object(backendSchema);
|
|
85
|
+
it('should default backend to auto', () => {
|
|
86
|
+
const result = schema.safeParse({});
|
|
87
|
+
assert.strictEqual(result.success, true);
|
|
88
|
+
if (result.success) {
|
|
89
|
+
assert.strictEqual(result.data.backend, 'auto');
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
it('should accept local backend', () => {
|
|
93
|
+
const result = schema.safeParse({ backend: 'local' });
|
|
94
|
+
assert.strictEqual(result.success, true);
|
|
95
|
+
});
|
|
96
|
+
it('should accept signoz backend', () => {
|
|
97
|
+
const result = schema.safeParse({ backend: 'signoz' });
|
|
98
|
+
assert.strictEqual(result.success, true);
|
|
99
|
+
});
|
|
100
|
+
it('should reject invalid backend', () => {
|
|
101
|
+
const result = schema.safeParse({ backend: 'invalid' });
|
|
102
|
+
assert.strictEqual(result.success, false);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
//# sourceMappingURL=shared-schemas.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-schemas.test.js","sourceRoot":"","sources":["../../src/lib/shared-schemas.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TOON (Token-Oriented Object Notation) encoding utilities
|
|
3
|
+
* Provides 40-60% token reduction for uniform array responses
|
|
4
|
+
*/
|
|
5
|
+
export type ResponseFormat = 'json' | 'toon';
|
|
6
|
+
/** Maximum elements to encode in toToon (prevents process freezing on large arrays) */
|
|
7
|
+
export declare const MAX_TOON_ELEMENTS = 10000;
|
|
8
|
+
/**
|
|
9
|
+
* Encode data to TOON format
|
|
10
|
+
* @param data - Data to encode (typically an array of objects)
|
|
11
|
+
* @param maxElements - Maximum elements to encode (default: 10000)
|
|
12
|
+
* @returns TOON-encoded string
|
|
13
|
+
* @throws Error if data exceeds maxElements (prevents process freezing)
|
|
14
|
+
*
|
|
15
|
+
* Security: Logs encoding failures for debugging instead of silently falling back
|
|
16
|
+
*/
|
|
17
|
+
export declare function toToon<T>(data: T[], maxElements?: number): string;
|
|
18
|
+
/**
|
|
19
|
+
* Check if TOON format is beneficial for the given data
|
|
20
|
+
* TOON works best with uniform arrays of objects
|
|
21
|
+
* @param data - Data to check
|
|
22
|
+
* @param maxElements - Maximum elements to consider (default: MAX_TOON_ELEMENTS)
|
|
23
|
+
* @returns true if TOON would be beneficial
|
|
24
|
+
*/
|
|
25
|
+
export declare function isToonBeneficial(data: unknown[], maxElements?: number): boolean;
|
|
26
|
+
//# sourceMappingURL=toon-encoder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toon-encoder.d.ts","sourceRoot":"","sources":["../../src/lib/toon-encoder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC;AAE7C,uFAAuF;AACvF,eAAO,MAAM,iBAAiB,QAAQ,CAAC;AAEvC;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,WAAW,GAAE,MAA0B,GAAG,MAAM,CAkBpF;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,WAAW,GAAE,MAA0B,GAAG,OAAO,CAkBlG"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TOON (Token-Oriented Object Notation) encoding utilities
|
|
3
|
+
* Provides 40-60% token reduction for uniform array responses
|
|
4
|
+
*/
|
|
5
|
+
import { encode as toonEncode } from '@toon-format/toon';
|
|
6
|
+
/** Maximum elements to encode in toToon (prevents process freezing on large arrays) */
|
|
7
|
+
export const MAX_TOON_ELEMENTS = 10000;
|
|
8
|
+
/**
|
|
9
|
+
* Encode data to TOON format
|
|
10
|
+
* @param data - Data to encode (typically an array of objects)
|
|
11
|
+
* @param maxElements - Maximum elements to encode (default: 10000)
|
|
12
|
+
* @returns TOON-encoded string
|
|
13
|
+
* @throws Error if data exceeds maxElements (prevents process freezing)
|
|
14
|
+
*
|
|
15
|
+
* Security: Logs encoding failures for debugging instead of silently falling back
|
|
16
|
+
*/
|
|
17
|
+
export function toToon(data, maxElements = MAX_TOON_ELEMENTS) {
|
|
18
|
+
if (Array.isArray(data) && data.length > 0) {
|
|
19
|
+
// M4: Prevent process freezing on million-element arrays
|
|
20
|
+
if (data.length > maxElements) {
|
|
21
|
+
throw new Error(`TOON encoding limit exceeded: ${data.length} elements > ${maxElements} max`);
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
return toonEncode(data);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
// Log warning for debugging - silent fallback makes issues hard to diagnose
|
|
28
|
+
console.warn('[TOON] Encoding failed, falling back to JSON:', error instanceof Error ? error.message : String(error));
|
|
29
|
+
return JSON.stringify(data);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return JSON.stringify(data);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Check if TOON format is beneficial for the given data
|
|
36
|
+
* TOON works best with uniform arrays of objects
|
|
37
|
+
* @param data - Data to check
|
|
38
|
+
* @param maxElements - Maximum elements to consider (default: MAX_TOON_ELEMENTS)
|
|
39
|
+
* @returns true if TOON would be beneficial
|
|
40
|
+
*/
|
|
41
|
+
export function isToonBeneficial(data, maxElements = MAX_TOON_ELEMENTS) {
|
|
42
|
+
// M4: Early exit for oversized arrays to avoid expensive key comparisons
|
|
43
|
+
if (!Array.isArray(data) || data.length < 2 || data.length > maxElements)
|
|
44
|
+
return false;
|
|
45
|
+
// Check if all items are objects with same keys
|
|
46
|
+
const firstItem = data[0];
|
|
47
|
+
if (typeof firstItem !== 'object' || firstItem === null)
|
|
48
|
+
return false;
|
|
49
|
+
// M8: Cache first keys string to avoid repeated Object.keys() calls
|
|
50
|
+
const firstKeys = Object.keys(firstItem).sort().join(',');
|
|
51
|
+
// Use for loop with early exit instead of .every() for better performance
|
|
52
|
+
for (let i = 1; i < data.length; i++) {
|
|
53
|
+
const item = data[i];
|
|
54
|
+
if (typeof item !== 'object' || item === null)
|
|
55
|
+
return false;
|
|
56
|
+
if (Object.keys(item).sort().join(',') !== firstKeys)
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=toon-encoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toon-encoder.js","sourceRoot":"","sources":["../../src/lib/toon-encoder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIzD,uFAAuF;AACvF,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAEvC;;;;;;;;GAQG;AACH,MAAM,UAAU,MAAM,CAAI,IAAS,EAAE,cAAsB,iBAAiB;IAC1E,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,yDAAyD;QACzD,IAAI,IAAI,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,MAAM,eAAe,WAAW,MAAM,CAAC,CAAC;QAChG,CAAC;QACD,IAAI,CAAC;YACH,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,4EAA4E;YAC5E,OAAO,CAAC,IAAI,CACV,+CAA+C,EAC/C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;YACF,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAe,EAAE,cAAsB,iBAAiB;IACvF,yEAAyE;IACzE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,WAAW;QAAE,OAAO,KAAK,CAAC;IAEvF,gDAAgD;IAChD,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAEtE,oEAAoE;IACpE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE1D,0EAA0E;IAC1E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QAC5D,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;IACrE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toon-encoder.test.d.ts","sourceRoot":"","sources":["../../src/lib/toon-encoder.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for TOON encoder utilities
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it } from 'node:test';
|
|
5
|
+
import assert from 'node:assert';
|
|
6
|
+
import { toToon, isToonBeneficial, MAX_TOON_ELEMENTS } from './toon-encoder.js';
|
|
7
|
+
describe('toToon', () => {
|
|
8
|
+
it('should encode array of objects', () => {
|
|
9
|
+
const data = [
|
|
10
|
+
{ name: 'Alice', age: 30 },
|
|
11
|
+
{ name: 'Bob', age: 25 },
|
|
12
|
+
];
|
|
13
|
+
const result = toToon(data);
|
|
14
|
+
// TOON format should be different from JSON
|
|
15
|
+
assert.ok(typeof result === 'string');
|
|
16
|
+
});
|
|
17
|
+
it('should throw for arrays exceeding MAX_TOON_ELEMENTS', () => {
|
|
18
|
+
const data = new Array(MAX_TOON_ELEMENTS + 1).fill({ id: 1 });
|
|
19
|
+
assert.throws(() => toToon(data), /TOON encoding limit exceeded/);
|
|
20
|
+
});
|
|
21
|
+
it('should allow arrays at exactly MAX_TOON_ELEMENTS', () => {
|
|
22
|
+
const data = new Array(MAX_TOON_ELEMENTS).fill({ id: 1 });
|
|
23
|
+
// Should not throw
|
|
24
|
+
const result = toToon(data);
|
|
25
|
+
assert.ok(typeof result === 'string');
|
|
26
|
+
});
|
|
27
|
+
it('should fall back to JSON for empty arrays', () => {
|
|
28
|
+
const result = toToon([]);
|
|
29
|
+
assert.strictEqual(result, '[]');
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
describe('isToonBeneficial', () => {
|
|
33
|
+
it('should return false for arrays with less than 2 items', () => {
|
|
34
|
+
assert.strictEqual(isToonBeneficial([]), false);
|
|
35
|
+
assert.strictEqual(isToonBeneficial([{ a: 1 }]), false);
|
|
36
|
+
});
|
|
37
|
+
it('should return true for uniform arrays of objects', () => {
|
|
38
|
+
const data = [
|
|
39
|
+
{ name: 'Alice', age: 30 },
|
|
40
|
+
{ name: 'Bob', age: 25 },
|
|
41
|
+
];
|
|
42
|
+
assert.strictEqual(isToonBeneficial(data), true);
|
|
43
|
+
});
|
|
44
|
+
it('should return false for non-uniform arrays', () => {
|
|
45
|
+
const data = [
|
|
46
|
+
{ name: 'Alice', age: 30 },
|
|
47
|
+
{ name: 'Bob' }, // missing 'age'
|
|
48
|
+
];
|
|
49
|
+
assert.strictEqual(isToonBeneficial(data), false);
|
|
50
|
+
});
|
|
51
|
+
it('should return false for arrays with non-objects', () => {
|
|
52
|
+
assert.strictEqual(isToonBeneficial([1, 2, 3]), false);
|
|
53
|
+
assert.strictEqual(isToonBeneficial(['a', 'b']), false);
|
|
54
|
+
});
|
|
55
|
+
describe('M4: early exit for oversized arrays', () => {
|
|
56
|
+
it('should return false for arrays exceeding maxElements', () => {
|
|
57
|
+
const data = new Array(MAX_TOON_ELEMENTS + 1).fill({ id: 1, name: 'test' });
|
|
58
|
+
assert.strictEqual(isToonBeneficial(data), false);
|
|
59
|
+
});
|
|
60
|
+
it('should accept custom maxElements parameter', () => {
|
|
61
|
+
const data = [
|
|
62
|
+
{ id: 1, name: 'test' },
|
|
63
|
+
{ id: 2, name: 'test' },
|
|
64
|
+
{ id: 3, name: 'test' },
|
|
65
|
+
];
|
|
66
|
+
// Should return false when maxElements is 2
|
|
67
|
+
assert.strictEqual(isToonBeneficial(data, 2), false);
|
|
68
|
+
// Should return true when maxElements is 3 or more
|
|
69
|
+
assert.strictEqual(isToonBeneficial(data, 3), true);
|
|
70
|
+
});
|
|
71
|
+
it('should not perform expensive key comparisons on oversized arrays', () => {
|
|
72
|
+
// Create a large array where key comparison would be slow
|
|
73
|
+
const data = new Array(MAX_TOON_ELEMENTS + 100).fill(null).map((_, i) => ({
|
|
74
|
+
[`key_${i}`]: i, // Each object has a unique key - would fail uniformity check
|
|
75
|
+
}));
|
|
76
|
+
const start = performance.now();
|
|
77
|
+
const result = isToonBeneficial(data);
|
|
78
|
+
const elapsed = performance.now() - start;
|
|
79
|
+
assert.strictEqual(result, false);
|
|
80
|
+
// Should return almost instantly (< 10ms) due to early exit
|
|
81
|
+
assert.ok(elapsed < 10, `Should exit early, took ${elapsed.toFixed(2)}ms`);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
//# sourceMappingURL=toon-encoder.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toon-encoder.test.js","sourceRoot":"","sources":["../../src/lib/toon-encoder.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEhF,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,IAAI,GAAG;YACX,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE;YAC1B,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;SACzB,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5B,4CAA4C;QAC5C,MAAM,CAAC,EAAE,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAClB,8BAA8B,CAC/B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1D,mBAAmB;QACnB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,CAAC,EAAE,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1B,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,IAAI,GAAG;YACX,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE;YAC1B,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;SACzB,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,IAAI,GAAG;YACX,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE;YAC1B,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,gBAAgB;SAClC,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACvD,MAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;QACnD,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5E,MAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,IAAI,GAAG;gBACX,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;gBACvB,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;gBACvB,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;aACxB,CAAC;YACF,4CAA4C;YAC5C,MAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACrD,mDAAmD;YACnD,MAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;YAC1E,0DAA0D;YAC1D,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,iBAAiB,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBACxE,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,6DAA6D;aAC/E,CAAC,CAAC,CAAC;YAEJ,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YAE1C,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAClC,4DAA4D;YAC5D,MAAM,CAAC,EAAE,CAAC,OAAO,GAAG,EAAE,EAAE,2BAA2B,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/server.d.ts
CHANGED
|
@@ -7,53 +7,5 @@
|
|
|
7
7
|
*
|
|
8
8
|
* Install: claude mcp add observability-toolkit -- npx -y @alyshia/observability-toolkit
|
|
9
9
|
*/
|
|
10
|
-
|
|
11
|
-
* Sliding window counter rate limiter with O(1) operations and bounded memory.
|
|
12
|
-
* Uses fixed-size bucket array to track request counts per time slice.
|
|
13
|
-
*
|
|
14
|
-
* Memory usage: O(bucketCount) - fixed regardless of request volume
|
|
15
|
-
* Time complexity: O(bucketCount) for sum, but bucketCount is constant (60)
|
|
16
|
-
*
|
|
17
|
-
* @exported for testing
|
|
18
|
-
*/
|
|
19
|
-
export declare class RateLimiter {
|
|
20
|
-
private buckets;
|
|
21
|
-
private bucketTimestamps;
|
|
22
|
-
private readonly bucketMs;
|
|
23
|
-
private readonly windowMs;
|
|
24
|
-
private readonly maxRequests;
|
|
25
|
-
private readonly bucketCount;
|
|
26
|
-
constructor(windowMs?: number, maxRequests?: number, bucketCount?: number);
|
|
27
|
-
/**
|
|
28
|
-
* Get the bucket index for a given timestamp.
|
|
29
|
-
* Uses modulo to create circular buffer behavior.
|
|
30
|
-
*/
|
|
31
|
-
private getBucketIndex;
|
|
32
|
-
/**
|
|
33
|
-
* Clear expired buckets and return the current valid count.
|
|
34
|
-
* A bucket is expired if its timestamp is older than windowMs ago.
|
|
35
|
-
*/
|
|
36
|
-
private cleanAndCount;
|
|
37
|
-
/**
|
|
38
|
-
* Check if a request is allowed and record it if so.
|
|
39
|
-
* O(bucketCount) time complexity where bucketCount is constant.
|
|
40
|
-
*/
|
|
41
|
-
isAllowed(): boolean;
|
|
42
|
-
/**
|
|
43
|
-
* Get the number of remaining allowed requests in the current window.
|
|
44
|
-
*/
|
|
45
|
-
getRemainingRequests(): number;
|
|
46
|
-
/**
|
|
47
|
-
* Get the current memory footprint (for testing).
|
|
48
|
-
* Returns the fixed size of internal arrays.
|
|
49
|
-
*/
|
|
50
|
-
getMemoryFootprint(): {
|
|
51
|
-
bucketCount: number;
|
|
52
|
-
arraySize: number;
|
|
53
|
-
};
|
|
54
|
-
/**
|
|
55
|
-
* Reset the rate limiter state (for testing).
|
|
56
|
-
*/
|
|
57
|
-
reset(): void;
|
|
58
|
-
}
|
|
10
|
+
export { RateLimiter, ServerInitError } from './lib/server-utils.js';
|
|
59
11
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AA8BH
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AA8BH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
|