@selvajs/server 0.2.0-beta.2 → 0.2.0-beta.3

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.
Files changed (72) hide show
  1. package/dist/compute/__tests__/client-cache.test.js +18 -0
  2. package/dist/compute/__tests__/client-cache.test.js.map +1 -1
  3. package/dist/compute/__tests__/definition-byte-cache.test.d.ts +2 -0
  4. package/dist/compute/__tests__/definition-byte-cache.test.d.ts.map +1 -0
  5. package/dist/compute/__tests__/definition-byte-cache.test.js +107 -0
  6. package/dist/compute/__tests__/definition-byte-cache.test.js.map +1 -0
  7. package/dist/compute/__tests__/solve-cache.test.d.ts +13 -0
  8. package/dist/compute/__tests__/solve-cache.test.d.ts.map +1 -0
  9. package/dist/compute/__tests__/solve-cache.test.js +234 -0
  10. package/dist/compute/__tests__/solve-cache.test.js.map +1 -0
  11. package/dist/compute/__tests__/solve-pipeline.test.js +267 -2
  12. package/dist/compute/__tests__/solve-pipeline.test.js.map +1 -1
  13. package/dist/compute/client-cache.d.ts +12 -0
  14. package/dist/compute/client-cache.d.ts.map +1 -1
  15. package/dist/compute/client-cache.js +12 -3
  16. package/dist/compute/client-cache.js.map +1 -1
  17. package/dist/compute/definition-byte-cache.d.ts +85 -0
  18. package/dist/compute/definition-byte-cache.d.ts.map +1 -0
  19. package/dist/compute/definition-byte-cache.js +110 -0
  20. package/dist/compute/definition-byte-cache.js.map +1 -0
  21. package/dist/compute/index.d.ts +7 -2
  22. package/dist/compute/index.d.ts.map +1 -1
  23. package/dist/compute/index.js +6 -1
  24. package/dist/compute/index.js.map +1 -1
  25. package/dist/compute/limits.d.ts +52 -0
  26. package/dist/compute/limits.d.ts.map +1 -1
  27. package/dist/compute/limits.js +33 -1
  28. package/dist/compute/limits.js.map +1 -1
  29. package/dist/compute/memory-solve-cache.d.ts +58 -0
  30. package/dist/compute/memory-solve-cache.d.ts.map +1 -0
  31. package/dist/compute/memory-solve-cache.js +0 -0
  32. package/dist/compute/memory-solve-cache.js.map +1 -0
  33. package/dist/compute/solve-cache-envelope.d.ts +53 -0
  34. package/dist/compute/solve-cache-envelope.d.ts.map +1 -0
  35. package/dist/compute/solve-cache-envelope.js +66 -0
  36. package/dist/compute/solve-cache-envelope.js.map +1 -0
  37. package/dist/compute/solve-cache-key.d.ts +65 -0
  38. package/dist/compute/solve-cache-key.d.ts.map +1 -0
  39. package/dist/compute/solve-cache-key.js +50 -0
  40. package/dist/compute/solve-cache-key.js.map +1 -0
  41. package/dist/compute/solve-cache-single-flight.d.ts +35 -0
  42. package/dist/compute/solve-cache-single-flight.d.ts.map +1 -0
  43. package/dist/compute/solve-cache-single-flight.js +48 -0
  44. package/dist/compute/solve-cache-single-flight.js.map +1 -0
  45. package/dist/compute/solve-pipeline.d.ts +71 -8
  46. package/dist/compute/solve-pipeline.d.ts.map +1 -1
  47. package/dist/compute/solve-pipeline.js +178 -8
  48. package/dist/compute/solve-pipeline.js.map +1 -1
  49. package/dist/definitions/__tests__/definition-service.test.d.ts +14 -0
  50. package/dist/definitions/__tests__/definition-service.test.d.ts.map +1 -0
  51. package/dist/definitions/__tests__/definition-service.test.js +95 -0
  52. package/dist/definitions/__tests__/definition-service.test.js.map +1 -0
  53. package/dist/definitions/definition-service.d.ts +1 -1
  54. package/dist/definitions/definition-service.d.ts.map +1 -1
  55. package/dist/definitions/definition-service.js +8 -4
  56. package/dist/definitions/definition-service.js.map +1 -1
  57. package/package.json +2 -2
  58. package/src/compute/__tests__/client-cache.test.ts +20 -0
  59. package/src/compute/__tests__/definition-byte-cache.test.ts +129 -0
  60. package/src/compute/__tests__/solve-cache.test.ts +268 -0
  61. package/src/compute/__tests__/solve-pipeline.test.ts +320 -1
  62. package/src/compute/client-cache.ts +24 -3
  63. package/src/compute/definition-byte-cache.ts +168 -0
  64. package/src/compute/index.ts +34 -0
  65. package/src/compute/limits.ts +79 -1
  66. package/src/compute/memory-solve-cache.ts +0 -0
  67. package/src/compute/solve-cache-envelope.ts +98 -0
  68. package/src/compute/solve-cache-key.ts +85 -0
  69. package/src/compute/solve-cache-single-flight.ts +59 -0
  70. package/src/compute/solve-pipeline.ts +279 -15
  71. package/src/definitions/__tests__/definition-service.test.ts +131 -0
  72. package/src/definitions/definition-service.ts +8 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition-service.test.js","sourceRoot":"","sources":["../../../src/definitions/__tests__/definition-service.test.ts"],"names":[],"mappings":"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"}
@@ -39,7 +39,7 @@ export interface CreateDefinitionRecord {
39
39
  * blob and is filtered out of list endpoints by default.
40
40
  *
41
41
  * uploadVersion — append-only:
42
- * 1. Resolve next versionNumber from the version list
42
+ * 1. Reserve next versionNumber from the record's monotonic counter
43
43
  * 2. Upload blob to versions/v{N}.{ext}
44
44
  * 3. Insert DefinitionVersion row
45
45
  * 4. Advance draft pointer (live unchanged)
@@ -1 +1 @@
1
- {"version":3,"file":"definition-service.d.ts","sourceRoot":"","sources":["../../src/definitions/definition-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,QAAQ,EACR,MAAM,mBAAmB,CAAC;AAG3B;;;;;;;GAOG;AACH,MAAM,WAAW,sBAAsB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,iBAAiB;IAE5B,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,OAAO;gBADP,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,gBAAgB;IAG5B,MAAM,CACX,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,sBAAsB,EAC7B,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,QAAQ,GACd,OAAO,CAAC;QAAE,MAAM,EAAE,gBAAgB,CAAC;QAAC,OAAO,EAAE,iBAAiB,CAAA;KAAE,CAAC;IA4DpE;;;;OAIG;IACG,aAAa,CAClB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,iBAAiB,EACtB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,QAAQ,EAChB,UAAU,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,CAAC;IAiC7B;;;;OAIG;IACG,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAoB1F,aAAa,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUlF,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxF,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAQzF,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAc9D"}
1
+ {"version":3,"file":"definition-service.d.ts","sourceRoot":"","sources":["../../src/definitions/definition-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,QAAQ,EACR,MAAM,mBAAmB,CAAC;AAG3B;;;;;;;GAOG;AACH,MAAM,WAAW,sBAAsB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,iBAAiB;IAE5B,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,OAAO;gBADP,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,gBAAgB;IAG5B,MAAM,CACX,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,sBAAsB,EAC7B,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,QAAQ,GACd,OAAO,CAAC;QAAE,MAAM,EAAE,gBAAgB,CAAC;QAAC,OAAO,EAAE,iBAAiB,CAAA;KAAE,CAAC;IA8DpE;;;;OAIG;IACG,aAAa,CAClB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,iBAAiB,EACtB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,QAAQ,EAChB,UAAU,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,CAAC;IAmC7B;;;;OAIG;IACG,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAoB1F,aAAa,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUlF,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxF,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAQzF,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAc9D"}
@@ -19,7 +19,7 @@ import { ProviderError, definitionPaths } from '@selvajs/platform';
19
19
  * blob and is filtered out of list endpoints by default.
20
20
  *
21
21
  * uploadVersion — append-only:
22
- * 1. Resolve next versionNumber from the version list
22
+ * 1. Reserve next versionNumber from the record's monotonic counter
23
23
  * 2. Upload blob to versions/v{N}.{ext}
24
24
  * 3. Insert DefinitionVersion row
25
25
  * 4. Advance draft pointer (live unchanged)
@@ -53,6 +53,8 @@ export class DefinitionService {
53
53
  computeServerId: input.computeServerId,
54
54
  status: 'pending',
55
55
  solveCount: 0,
56
+ // v1 is created below with versionNumber 1, so the next upload reserves 2.
57
+ nextVersionNumber: 2,
56
58
  liveVersionId: null,
57
59
  draftVersionId: null,
58
60
  createdAt: now,
@@ -99,9 +101,11 @@ export class DefinitionService {
99
101
  const existing = await this.data.definitions.get(ctx, guid);
100
102
  if (!existing)
101
103
  throw new ProviderError(`Definition not found: ${guid}`, 404);
102
- // Highest existing versionNumber + 1; covers gaps from deletions.
103
- const versions = await this.data.definitions.listVersions(ctx, guid, { limit: 1 });
104
- const next = (versions.items[0]?.versionNumber ?? 0) + 1;
104
+ // Reserve the next version number from the record's monotonic counter — NOT
105
+ // max(existing)+1, which reused a number after delete-latest and collided
106
+ // the `fileKey` (stale blob served for new content). The counter only ever
107
+ // advances, so a delete-then-reupload gets a fresh number and fresh key.
108
+ const next = await this.data.definitions.reserveNextVersionNumber(ctx, guid);
105
109
  const versionId = randomUUID();
106
110
  const fileKey = definitionPaths.version(guid, next, ext);
107
111
  await this.storage.put(fileKey, file, 'application/octet-stream');
@@ -1 +1 @@
1
- {"version":3,"file":"definition-service.js","sourceRoot":"","sources":["../../src/definitions/definition-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"definition-service.js","sourceRoot":"","sources":["../../src/definitions/definition-service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@selvajs/server",
3
- "version": "0.2.0-beta.2",
3
+ "version": "0.2.0-beta.3",
4
4
  "description": "Transport-agnostic compute/solve/definitions server building blocks for apps built on the Selva engine (limits, rate limiting, SSRF guard, input transform, solve pipeline, definition service + render loader)",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -66,7 +66,7 @@
66
66
  "src"
67
67
  ],
68
68
  "dependencies": {
69
- "@selvajs/compute": "^3.1.0-beta.5",
69
+ "@selvajs/compute": "^3.1.0-beta.6",
70
70
  "@selvajs/platform": "0.14.3-beta.0",
71
71
  "@selvajs/schemas": "4.7.0-beta.0"
72
72
  },
@@ -43,6 +43,8 @@ function baseConfig() {
43
43
  return {
44
44
  maxSolveDurationMs: 30_000,
45
45
  maxConcurrentSolves: 4,
46
+ maxQueueDepth: 0,
47
+ queueWaitMs: 0,
46
48
  cachesolve: true,
47
49
  cacheerroredsolves: false,
48
50
  reuseServerDefinitionCache: true,
@@ -173,6 +175,24 @@ describe('createClientCache — scheduler concurrency (audit B6)', () => {
173
175
  });
174
176
  });
175
177
 
178
+ describe('createClientCache — scheduler backpressure (audit B7)', () => {
179
+ it('forwards non-zero queue bounds to the scheduler', async () => {
180
+ const cache = createClientCache({ ...baseConfig(), maxQueueDepth: 12, queueWaitMs: 90_000 });
181
+ await cache.getClient(server('s1'));
182
+ expect(createdSchedulerOptions[0].maxQueueDepth).toBe(12);
183
+ expect(createdSchedulerOptions[0].queueWaitMs).toBe(90_000);
184
+ });
185
+
186
+ it('maps a 0 (disabled) queue bound to undefined so the scheduler stays unbounded', async () => {
187
+ // The scheduler treats undefined as unbounded/no-deadline; passing 0 would
188
+ // shed EVERY queued solve. Our `0 = off` convention must become undefined.
189
+ const cache = createClientCache({ ...baseConfig(), maxQueueDepth: 0, queueWaitMs: 0 });
190
+ await cache.getClient(server('s1'));
191
+ expect(createdSchedulerOptions[0].maxQueueDepth).toBeUndefined();
192
+ expect(createdSchedulerOptions[0].queueWaitMs).toBeUndefined();
193
+ });
194
+ });
195
+
176
196
  describe('createClientCache — per-request telemetry sequence counters', () => {
177
197
  it('onServerTiming bumps rhinoTiming.seq on every write', async () => {
178
198
  const cache = createClientCache(baseConfig());
@@ -0,0 +1,129 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { createDefinitionByteCache } from '../definition-byte-cache.js';
3
+
4
+ /** A `Uint8Array` of `n` bytes filled with a marker so equality is checkable. */
5
+ function bytes(n: number, marker = 0): Uint8Array {
6
+ return new Uint8Array(n).fill(marker);
7
+ }
8
+
9
+ describe('createDefinitionByteCache', () => {
10
+ it('serves a warm entry without re-invoking the loader (hit) and reports it', async () => {
11
+ const cache = createDefinitionByteCache(10 * 1024 * 1024);
12
+ const load = vi.fn(async () => bytes(1024, 7));
13
+
14
+ const first = await cache.getOrLoad('v-1', load).load();
15
+ const second = await cache.getOrLoad('v-1', load).load();
16
+
17
+ expect(first).toEqual(second);
18
+ expect(load).toHaveBeenCalledTimes(1); // second call served from cache
19
+ const s = cache.stats();
20
+ expect(s.hits).toBe(1);
21
+ expect(s.misses).toBe(1);
22
+ expect(s.entries).toBe(1);
23
+ expect(s.bytes).toBe(1024);
24
+ });
25
+
26
+ it('per-ref outcome distinguishes miss (loader) from hit (warm)', async () => {
27
+ const cache = createDefinitionByteCache(10 * 1024 * 1024);
28
+ const load = async () => bytes(512);
29
+
30
+ const refMiss = cache.getOrLoad('v-1', load);
31
+ await refMiss.load();
32
+ expect(refMiss.outcome).toEqual({ loaded: true, fromCache: false });
33
+
34
+ const refHit = cache.getOrLoad('v-1', load);
35
+ await refHit.load();
36
+ expect(refHit.outcome).toEqual({ loaded: true, fromCache: true });
37
+ });
38
+
39
+ it("a ref whose load() is never called leaves outcome.loaded false (the 'skipped' verdict)", () => {
40
+ const cache = createDefinitionByteCache(10 * 1024 * 1024);
41
+ const ref = cache.getOrLoad('v-1', async () => bytes(1));
42
+ // The scheduler served a pointer-known solve — load() never ran.
43
+ expect(ref.outcome).toEqual({ loaded: false, fromCache: false });
44
+ });
45
+
46
+ it('evicts least-recently-used entries when the byte budget is exceeded', async () => {
47
+ // Budget holds ~2 of these 1 KB entries.
48
+ const cache = createDefinitionByteCache(2 * 1024);
49
+ const load = (marker: number) => async () => bytes(1024, marker);
50
+
51
+ await cache.getOrLoad('a', load(1)).load(); // [a]
52
+ await cache.getOrLoad('b', load(2)).load(); // [a,b]
53
+ // Touch 'a' so 'b' becomes the LRU victim.
54
+ await cache.getOrLoad('a', load(1)).load(); // hit → [b,a]
55
+ await cache.getOrLoad('c', load(3)).load(); // insert c → evict b → [a,c]
56
+
57
+ expect(cache.stats().entries).toBe(2);
58
+ expect(cache.stats().evictions).toBe(1);
59
+ expect(cache.stats().bytes).toBe(2 * 1024);
60
+
61
+ // 'a' survived (it was touched, so 'b' was the LRU victim) → served from
62
+ // cache without the loader. Checked BEFORE re-loading 'b', since bringing 'b'
63
+ // back would itself evict 'a' under the 2-entry budget.
64
+ const aLoad = vi.fn(load(1));
65
+ await cache.getOrLoad('a', aLoad).load();
66
+ expect(aLoad).toHaveBeenCalledTimes(0);
67
+
68
+ // 'b' was evicted → its next load calls the loader again (miss).
69
+ const bLoad = vi.fn(load(2));
70
+ await cache.getOrLoad('b', bLoad).load();
71
+ expect(bLoad).toHaveBeenCalledTimes(1);
72
+ });
73
+
74
+ it('never retains an entry larger than the whole budget (serves through, caches nothing)', async () => {
75
+ const cache = createDefinitionByteCache(1024);
76
+ const load = vi.fn(async () => bytes(4096));
77
+
78
+ const out = await cache.getOrLoad('big', load).load();
79
+ expect(out.byteLength).toBe(4096); // still served
80
+ expect(cache.stats().entries).toBe(0); // but not retained
81
+ expect(cache.stats().bytes).toBe(0);
82
+
83
+ // Every load re-fetches — nothing was cached.
84
+ await cache.getOrLoad('big', load).load();
85
+ expect(load).toHaveBeenCalledTimes(2);
86
+ });
87
+
88
+ it('keys on the passed version id — two versions that reused a fileKey never collide', async () => {
89
+ // The trap this cache exists to avoid: delete-latest-then-reupload reused a
90
+ // fileKey, but the version id (the KEY) is always fresh. Distinct ids →
91
+ // distinct entries, so the new version never serves the old bytes.
92
+ const cache = createDefinitionByteCache(10 * 1024 * 1024);
93
+ const oldBytes = bytes(1024, 1);
94
+ const newBytes = bytes(1024, 2);
95
+
96
+ const a = await cache.getOrLoad('version-old', async () => oldBytes).load();
97
+ const b = await cache.getOrLoad('version-new', async () => newBytes).load();
98
+
99
+ expect(a).toEqual(oldBytes);
100
+ expect(b).toEqual(newBytes);
101
+ expect(a).not.toEqual(b); // no cross-contamination despite a shared fileKey
102
+ expect(cache.stats().entries).toBe(2);
103
+ });
104
+
105
+ it('budget 0 disables caching entirely (every load hits the loader, nothing retained)', async () => {
106
+ const cache = createDefinitionByteCache(0);
107
+ const load = vi.fn(async () => bytes(16));
108
+
109
+ const ref1 = cache.getOrLoad('v-1', load);
110
+ await ref1.load();
111
+ await cache.getOrLoad('v-1', load).load();
112
+
113
+ expect(load).toHaveBeenCalledTimes(2);
114
+ expect(cache.stats().entries).toBe(0);
115
+ expect(cache.stats().bytes).toBe(0);
116
+ // Outcome still reports loaded, but never fromCache.
117
+ expect(ref1.outcome).toEqual({ loaded: true, fromCache: false });
118
+ });
119
+
120
+ it('re-storing the same key updates bytes without double-counting the budget', async () => {
121
+ const cache = createDefinitionByteCache(10 * 1024 * 1024);
122
+ // clear() to force a re-store path: first load caches, clear drops it, second caches again.
123
+ await cache.getOrLoad('v-1', async () => bytes(1024)).load();
124
+ expect(cache.stats().bytes).toBe(1024);
125
+ cache.clear();
126
+ expect(cache.stats().bytes).toBe(0);
127
+ expect(cache.stats().entries).toBe(0);
128
+ });
129
+ });
@@ -0,0 +1,268 @@
1
+ /**
2
+ * Tests for the durable L2 solve-cache building blocks (Phase 3):
3
+ * - the in-memory backend (per-definition count quota + global byte backstop),
4
+ * - the SHA-256 key derivation (org isolation, version keyspace, config fold),
5
+ * - the envelope codec (round-trip, corruption → miss),
6
+ * - the in-process single-flight (coalescing, release-on-settle).
7
+ *
8
+ * `@selvajs/compute`'s `stableStringify` is the only external dependency of the
9
+ * key module; it's a real export (deterministic sorted-key JSON), so these run
10
+ * without mocking.
11
+ */
12
+
13
+ import { describe, it, expect } from 'vitest';
14
+ import { SYSTEM_CONTEXT, type SolveCacheKey } from '@selvajs/platform';
15
+ import { createMemorySolveResultCache } from '../memory-solve-cache.js';
16
+ import { deriveSolveCacheInputKey } from '../solve-cache-key.js';
17
+ import {
18
+ encodeSolveCacheEntry,
19
+ decodeSolveCacheEntry,
20
+ gunzipEntryBody
21
+ } from '../solve-cache-envelope.js';
22
+ import { createSolveCacheSingleFlight } from '../solve-cache-single-flight.js';
23
+ import { gzipSync } from 'node:zlib';
24
+
25
+ const ctx = SYSTEM_CONTEXT;
26
+
27
+ function key(over: Partial<SolveCacheKey> = {}): SolveCacheKey {
28
+ return {
29
+ orgId: over.orgId ?? 'org-1',
30
+ definitionId: over.definitionId ?? 'def-1',
31
+ versionId: over.versionId ?? 'v-1',
32
+ inputKey: over.inputKey ?? 'in-1'
33
+ };
34
+ }
35
+
36
+ const bytes = (n: number) => new Uint8Array(n).fill(1);
37
+
38
+ // ============================================================================
39
+ // Memory backend
40
+ // ============================================================================
41
+
42
+ describe('createMemorySolveResultCache — round-trip + quota', () => {
43
+ it('stores then serves the exact bytes on a hit, and bumps counters', async () => {
44
+ const cache = createMemorySolveResultCache(0);
45
+ const payload = new Uint8Array([9, 8, 7]);
46
+ await cache.set(ctx, key(), payload, { maxEntriesForDefinition: 5 });
47
+ const got = await cache.get(ctx, key());
48
+ expect(got).toEqual(payload);
49
+ expect(await cache.get(ctx, key({ inputKey: 'absent' }))).toBeNull();
50
+ const stats = cache.stats();
51
+ expect(stats.hits).toBe(1);
52
+ expect(stats.misses).toBe(1);
53
+ expect(stats.writes).toBe(1);
54
+ expect(stats.entries).toBe(1);
55
+ });
56
+
57
+ it('quota 0 (caching off for the definition) stores nothing', async () => {
58
+ const cache = createMemorySolveResultCache(0);
59
+ await cache.set(ctx, key(), bytes(10), { maxEntriesForDefinition: 0 });
60
+ expect(await cache.get(ctx, key())).toBeNull();
61
+ expect(cache.stats().entries).toBe(0);
62
+ });
63
+
64
+ it('evicts LRU WITHIN a definition down to its quota, not across definitions', async () => {
65
+ const cache = createMemorySolveResultCache(0);
66
+ // def-A gets a quota of 2; write 3 distinct inputs → oldest evicted.
67
+ await cache.set(ctx, key({ definitionId: 'A', inputKey: 'a1' }), bytes(1), {
68
+ maxEntriesForDefinition: 2
69
+ });
70
+ await cache.set(ctx, key({ definitionId: 'A', inputKey: 'a2' }), bytes(1), {
71
+ maxEntriesForDefinition: 2
72
+ });
73
+ // def-B writes an entry in between — must NOT be evicted by def-A's churn.
74
+ await cache.set(ctx, key({ definitionId: 'B', inputKey: 'b1' }), bytes(1), {
75
+ maxEntriesForDefinition: 2
76
+ });
77
+ await cache.set(ctx, key({ definitionId: 'A', inputKey: 'a3' }), bytes(1), {
78
+ maxEntriesForDefinition: 2
79
+ });
80
+
81
+ expect(await cache.get(ctx, key({ definitionId: 'A', inputKey: 'a1' }))).toBeNull(); // evicted
82
+ expect(await cache.get(ctx, key({ definitionId: 'A', inputKey: 'a2' }))).not.toBeNull();
83
+ expect(await cache.get(ctx, key({ definitionId: 'A', inputKey: 'a3' }))).not.toBeNull();
84
+ expect(await cache.get(ctx, key({ definitionId: 'B', inputKey: 'b1' }))).not.toBeNull(); // untouched
85
+ expect(cache.stats().quotaEvictions).toBe(1);
86
+ });
87
+
88
+ it('LRU-within-definition respects recency: a re-read entry is not the one evicted', async () => {
89
+ const cache = createMemorySolveResultCache(0);
90
+ await cache.set(ctx, key({ inputKey: 'x' }), bytes(1), { maxEntriesForDefinition: 2 });
91
+ await cache.set(ctx, key({ inputKey: 'y' }), bytes(1), { maxEntriesForDefinition: 2 });
92
+ // Touch x so y becomes the LRU.
93
+ await cache.get(ctx, key({ inputKey: 'x' }));
94
+ await cache.set(ctx, key({ inputKey: 'z' }), bytes(1), { maxEntriesForDefinition: 2 });
95
+ expect(await cache.get(ctx, key({ inputKey: 'y' }))).toBeNull(); // y was LRU → evicted
96
+ expect(await cache.get(ctx, key({ inputKey: 'x' }))).not.toBeNull();
97
+ });
98
+
99
+ it('the global byte backstop evicts across definitions regardless of counts', async () => {
100
+ // 30-byte budget; three 20-byte entries in different definitions with generous
101
+ // per-definition quotas → the backstop evicts the global LRU to fit.
102
+ const cache = createMemorySolveResultCache(30);
103
+ await cache.set(ctx, key({ definitionId: 'A', inputKey: 'a' }), bytes(20), {
104
+ maxEntriesForDefinition: 100
105
+ });
106
+ await cache.set(ctx, key({ definitionId: 'B', inputKey: 'b' }), bytes(20), {
107
+ maxEntriesForDefinition: 100
108
+ });
109
+ // A's entry is the global LRU and gets evicted to keep total <= 30.
110
+ expect(await cache.get(ctx, key({ definitionId: 'A', inputKey: 'a' }))).toBeNull();
111
+ expect(await cache.get(ctx, key({ definitionId: 'B', inputKey: 'b' }))).not.toBeNull();
112
+ expect(cache.stats().byteEvictions).toBeGreaterThanOrEqual(1);
113
+ expect(cache.stats().bytes).toBeLessThanOrEqual(30);
114
+ });
115
+
116
+ it('an entry larger than the whole byte backstop is served once but not retained', async () => {
117
+ const cache = createMemorySolveResultCache(10);
118
+ await cache.set(ctx, key(), bytes(50), { maxEntriesForDefinition: 100 });
119
+ expect(await cache.get(ctx, key())).toBeNull();
120
+ expect(cache.stats().bytes).toBe(0);
121
+ });
122
+
123
+ it('org id is part of the key: the same definition/version/input under two orgs is isolated', async () => {
124
+ const cache = createMemorySolveResultCache(0);
125
+ await cache.set(ctx, key({ orgId: 'org-A' }), new Uint8Array([1]), {
126
+ maxEntriesForDefinition: 5
127
+ });
128
+ expect(await cache.get(ctx, key({ orgId: 'org-B' }))).toBeNull(); // no cross-tenant read
129
+ expect(await cache.get(ctx, key({ orgId: 'org-A' }))).toEqual(new Uint8Array([1]));
130
+ });
131
+
132
+ it('replacing an existing key updates bytes in place without double-counting', async () => {
133
+ const cache = createMemorySolveResultCache(0);
134
+ await cache.set(ctx, key(), bytes(10), { maxEntriesForDefinition: 5 });
135
+ await cache.set(ctx, key(), bytes(4), { maxEntriesForDefinition: 5 });
136
+ expect(cache.stats().entries).toBe(1);
137
+ expect(cache.stats().bytes).toBe(4);
138
+ });
139
+
140
+ it('a version bump is a fresh keyspace (old version entries do not collide)', async () => {
141
+ const cache = createMemorySolveResultCache(0);
142
+ await cache.set(ctx, key({ versionId: 'v-1' }), new Uint8Array([1]), {
143
+ maxEntriesForDefinition: 5
144
+ });
145
+ // New version, same definition/input key → distinct entry, old one still there.
146
+ expect(await cache.get(ctx, key({ versionId: 'v-2' }))).toBeNull();
147
+ await cache.set(ctx, key({ versionId: 'v-2' }), new Uint8Array([2]), {
148
+ maxEntriesForDefinition: 5
149
+ });
150
+ expect(await cache.get(ctx, key({ versionId: 'v-1' }))).toEqual(new Uint8Array([1]));
151
+ expect(await cache.get(ctx, key({ versionId: 'v-2' }))).toEqual(new Uint8Array([2]));
152
+ });
153
+ });
154
+
155
+ // ============================================================================
156
+ // Key derivation
157
+ // ============================================================================
158
+
159
+ describe('deriveSolveCacheInputKey', () => {
160
+ const tree = { a: 1, b: [2, 3] };
161
+
162
+ it('is deterministic for the same tree + config', () => {
163
+ const k1 = deriveSolveCacheInputKey(tree, { computeServerId: 's1' });
164
+ const k2 = deriveSolveCacheInputKey(tree, { computeServerId: 's1' });
165
+ expect(k1.hash).toBe(k2.hash);
166
+ expect(k1.hash).toMatch(/^[0-9a-f]{64}$/); // SHA-256 hex
167
+ });
168
+
169
+ it('differs when the tree differs', () => {
170
+ const a = deriveSolveCacheInputKey({ a: 1 }, {});
171
+ const b = deriveSolveCacheInputKey({ a: 2 }, {});
172
+ expect(a.hash).not.toBe(b.hash);
173
+ });
174
+
175
+ it('folds the config subset in (R8): a different compute server → different key', () => {
176
+ const a = deriveSolveCacheInputKey(tree, { computeServerId: 's1' });
177
+ const b = deriveSolveCacheInputKey(tree, { computeServerId: 's2' });
178
+ expect(a.hash).not.toBe(b.hash);
179
+ });
180
+
181
+ it('exposes the canonical preimage for hit-time comparison', () => {
182
+ const k = deriveSolveCacheInputKey(tree, { computeServerId: 's1' });
183
+ expect(k.canonical).toContain('"tree"');
184
+ expect(k.canonical).toContain('"config"');
185
+ });
186
+ });
187
+
188
+ // ============================================================================
189
+ // Envelope codec
190
+ // ============================================================================
191
+
192
+ describe('solve-cache envelope codec', () => {
193
+ const header = { errorCount: 1, warningCount: 2, serializedBytes: 42, inputHash: 'abc' };
194
+
195
+ it('round-trips header + gzipped body', () => {
196
+ const body = new Uint8Array(gzipSync(Buffer.from('{"hello":"world"}')));
197
+ const encoded = encodeSolveCacheEntry(header, body);
198
+ const decoded = decodeSolveCacheEntry(encoded);
199
+ expect(decoded).not.toBeNull();
200
+ expect(decoded!.header).toEqual(header);
201
+ expect(gunzipEntryBody(decoded!.gzippedBody)).toBe('{"hello":"world"}');
202
+ });
203
+
204
+ it('returns null for a truncated / malformed entry (→ treated as a miss)', () => {
205
+ expect(decodeSolveCacheEntry(new Uint8Array([1, 2]))).toBeNull(); // too short for length prefix
206
+ const encoded = encodeSolveCacheEntry(header, new Uint8Array([1, 2, 3]));
207
+ expect(decodeSolveCacheEntry(encoded.slice(0, 6))).toBeNull(); // header claims more than present
208
+ });
209
+
210
+ it('returns null when the header JSON is missing required fields', () => {
211
+ // Hand-craft an entry whose header is valid JSON but the wrong shape.
212
+ const badHeader = Buffer.from(JSON.stringify({ nope: true }), 'utf8');
213
+ const out = Buffer.allocUnsafe(4 + badHeader.byteLength);
214
+ out.writeUInt32BE(badHeader.byteLength, 0);
215
+ badHeader.copy(out, 4);
216
+ expect(decodeSolveCacheEntry(new Uint8Array(out))).toBeNull();
217
+ });
218
+ });
219
+
220
+ // ============================================================================
221
+ // Single-flight
222
+ // ============================================================================
223
+
224
+ describe('createSolveCacheSingleFlight', () => {
225
+ it('coalesces concurrent identical calls into one execution', async () => {
226
+ const sf = createSolveCacheSingleFlight();
227
+ let runs = 0;
228
+ let release!: (v: number) => void;
229
+ const gate = new Promise<number>((r) => (release = r));
230
+ const work = () => {
231
+ runs += 1;
232
+ return gate;
233
+ };
234
+ const p1 = sf.run('k', work);
235
+ const p2 = sf.run('k', work);
236
+ expect(sf.inFlight()).toBe(1);
237
+ release(7);
238
+ expect(await p1).toBe(7);
239
+ expect(await p2).toBe(7); // shared result
240
+ expect(runs).toBe(1); // executed once
241
+ });
242
+
243
+ it('runs distinct keys independently', async () => {
244
+ const sf = createSolveCacheSingleFlight();
245
+ let runs = 0;
246
+ await Promise.all([sf.run('a', async () => void runs++), sf.run('b', async () => void runs++)]);
247
+ expect(runs).toBe(2);
248
+ });
249
+
250
+ it('releases the key after settle so a later call runs fresh', async () => {
251
+ const sf = createSolveCacheSingleFlight();
252
+ let runs = 0;
253
+ await sf.run('k', async () => void runs++);
254
+ expect(sf.inFlight()).toBe(0);
255
+ await sf.run('k', async () => void runs++);
256
+ expect(runs).toBe(2);
257
+ });
258
+
259
+ it('a rejection is shared by concurrent waiters and still frees the key', async () => {
260
+ const sf = createSolveCacheSingleFlight();
261
+ const boom = () => Promise.reject(new Error('boom'));
262
+ const p1 = sf.run('k', boom);
263
+ const p2 = sf.run('k', boom);
264
+ await expect(p1).rejects.toThrow('boom');
265
+ await expect(p2).rejects.toThrow('boom');
266
+ expect(sf.inFlight()).toBe(0);
267
+ });
268
+ });