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

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 (145) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +32 -0
  3. package/dist/compute/client-cache.d.ts.map +1 -1
  4. package/dist/compute/client-cache.js +6 -0
  5. package/dist/compute/client-cache.js.map +1 -1
  6. package/dist/compute/safe-url.d.ts.map +1 -1
  7. package/dist/compute/safe-url.js +16 -0
  8. package/dist/compute/safe-url.js.map +1 -1
  9. package/dist/compute/solve-cache-single-flight.d.ts +8 -1
  10. package/dist/compute/solve-cache-single-flight.d.ts.map +1 -1
  11. package/dist/compute/solve-cache-single-flight.js +4 -2
  12. package/dist/compute/solve-cache-single-flight.js.map +1 -1
  13. package/dist/compute/solve-pipeline.d.ts.map +1 -1
  14. package/dist/compute/solve-pipeline.js +3 -1
  15. package/dist/compute/solve-pipeline.js.map +1 -1
  16. package/package.json +14 -18
  17. package/dist/access/__tests__/project-access-input.test.d.ts +0 -2
  18. package/dist/access/__tests__/project-access-input.test.d.ts.map +0 -1
  19. package/dist/access/__tests__/project-access-input.test.js +0 -146
  20. package/dist/access/__tests__/project-access-input.test.js.map +0 -1
  21. package/dist/compute/__tests__/client-cache.test.d.ts +0 -11
  22. package/dist/compute/__tests__/client-cache.test.d.ts.map +0 -1
  23. package/dist/compute/__tests__/client-cache.test.js +0 -218
  24. package/dist/compute/__tests__/client-cache.test.js.map +0 -1
  25. package/dist/compute/__tests__/definition-byte-cache.test.d.ts +0 -2
  26. package/dist/compute/__tests__/definition-byte-cache.test.d.ts.map +0 -1
  27. package/dist/compute/__tests__/definition-byte-cache.test.js +0 -107
  28. package/dist/compute/__tests__/definition-byte-cache.test.js.map +0 -1
  29. package/dist/compute/__tests__/rate-limit.test.d.ts +0 -2
  30. package/dist/compute/__tests__/rate-limit.test.d.ts.map +0 -1
  31. package/dist/compute/__tests__/rate-limit.test.js +0 -98
  32. package/dist/compute/__tests__/rate-limit.test.js.map +0 -1
  33. package/dist/compute/__tests__/remote-definition.test.d.ts +0 -11
  34. package/dist/compute/__tests__/remote-definition.test.d.ts.map +0 -1
  35. package/dist/compute/__tests__/remote-definition.test.js +0 -114
  36. package/dist/compute/__tests__/remote-definition.test.js.map +0 -1
  37. package/dist/compute/__tests__/safe-url.test.d.ts +0 -2
  38. package/dist/compute/__tests__/safe-url.test.d.ts.map +0 -1
  39. package/dist/compute/__tests__/safe-url.test.js +0 -71
  40. package/dist/compute/__tests__/safe-url.test.js.map +0 -1
  41. package/dist/compute/__tests__/solve-cache.test.d.ts +0 -13
  42. package/dist/compute/__tests__/solve-cache.test.d.ts.map +0 -1
  43. package/dist/compute/__tests__/solve-cache.test.js +0 -234
  44. package/dist/compute/__tests__/solve-cache.test.js.map +0 -1
  45. package/dist/compute/__tests__/solve-pipeline.test.d.ts +0 -11
  46. package/dist/compute/__tests__/solve-pipeline.test.d.ts.map +0 -1
  47. package/dist/compute/__tests__/solve-pipeline.test.js +0 -557
  48. package/dist/compute/__tests__/solve-pipeline.test.js.map +0 -1
  49. package/dist/compute/__tests__/transform-input.test.d.ts +0 -14
  50. package/dist/compute/__tests__/transform-input.test.d.ts.map +0 -1
  51. package/dist/compute/__tests__/transform-input.test.js +0 -120
  52. package/dist/compute/__tests__/transform-input.test.js.map +0 -1
  53. package/dist/definitions/__tests__/definition-service.test.d.ts +0 -14
  54. package/dist/definitions/__tests__/definition-service.test.d.ts.map +0 -1
  55. package/dist/definitions/__tests__/definition-service.test.js +0 -95
  56. package/dist/definitions/__tests__/definition-service.test.js.map +0 -1
  57. package/dist/definitions/__tests__/load-for-render.test.d.ts +0 -8
  58. package/dist/definitions/__tests__/load-for-render.test.d.ts.map +0 -1
  59. package/dist/definitions/__tests__/load-for-render.test.js +0 -196
  60. package/dist/definitions/__tests__/load-for-render.test.js.map +0 -1
  61. package/dist/definitions/__tests__/schema-extraction.test.d.ts +0 -11
  62. package/dist/definitions/__tests__/schema-extraction.test.d.ts.map +0 -1
  63. package/dist/definitions/__tests__/schema-extraction.test.js +0 -115
  64. package/dist/definitions/__tests__/schema-extraction.test.js.map +0 -1
  65. package/dist/http/__tests__/body-size.test.d.ts +0 -2
  66. package/dist/http/__tests__/body-size.test.d.ts.map +0 -1
  67. package/dist/http/__tests__/body-size.test.js +0 -24
  68. package/dist/http/__tests__/body-size.test.js.map +0 -1
  69. package/dist/http/__tests__/route-classifier.test.d.ts +0 -2
  70. package/dist/http/__tests__/route-classifier.test.d.ts.map +0 -1
  71. package/dist/http/__tests__/route-classifier.test.js +0 -54
  72. package/dist/http/__tests__/route-classifier.test.js.map +0 -1
  73. package/dist/http/__tests__/safe-redirect.test.d.ts +0 -2
  74. package/dist/http/__tests__/safe-redirect.test.d.ts.map +0 -1
  75. package/dist/http/__tests__/safe-redirect.test.js +0 -44
  76. package/dist/http/__tests__/safe-redirect.test.js.map +0 -1
  77. package/dist/http/__tests__/security-headers.test.d.ts +0 -2
  78. package/dist/http/__tests__/security-headers.test.d.ts.map +0 -1
  79. package/dist/http/__tests__/security-headers.test.js +0 -24
  80. package/dist/http/__tests__/security-headers.test.js.map +0 -1
  81. package/dist/ops/__tests__/semver.test.d.ts +0 -2
  82. package/dist/ops/__tests__/semver.test.d.ts.map +0 -1
  83. package/dist/ops/__tests__/semver.test.js +0 -38
  84. package/dist/ops/__tests__/semver.test.js.map +0 -1
  85. package/dist/providers/__tests__/create-selva-providers.test.d.ts +0 -7
  86. package/dist/providers/__tests__/create-selva-providers.test.d.ts.map +0 -1
  87. package/dist/providers/__tests__/create-selva-providers.test.js +0 -135
  88. package/dist/providers/__tests__/create-selva-providers.test.js.map +0 -1
  89. package/dist/tokens/__tests__/token-codec.test.d.ts +0 -2
  90. package/dist/tokens/__tests__/token-codec.test.d.ts.map +0 -1
  91. package/dist/tokens/__tests__/token-codec.test.js +0 -50
  92. package/dist/tokens/__tests__/token-codec.test.js.map +0 -1
  93. package/src/access/__tests__/project-access-input.test.ts +0 -175
  94. package/src/access/index.ts +0 -9
  95. package/src/access/project-access-input.ts +0 -145
  96. package/src/compute/__tests__/client-cache.test.ts +0 -244
  97. package/src/compute/__tests__/definition-byte-cache.test.ts +0 -129
  98. package/src/compute/__tests__/rate-limit.test.ts +0 -106
  99. package/src/compute/__tests__/remote-definition.test.ts +0 -140
  100. package/src/compute/__tests__/safe-url.test.ts +0 -72
  101. package/src/compute/__tests__/solve-cache.test.ts +0 -268
  102. package/src/compute/__tests__/solve-pipeline.test.ts +0 -660
  103. package/src/compute/__tests__/transform-input.test.ts +0 -162
  104. package/src/compute/client-cache.ts +0 -321
  105. package/src/compute/definition-byte-cache.ts +0 -168
  106. package/src/compute/index.ts +0 -82
  107. package/src/compute/limits.ts +0 -237
  108. package/src/compute/memory-solve-cache.ts +0 -0
  109. package/src/compute/rate-limit.ts +0 -110
  110. package/src/compute/remote-definition.ts +0 -149
  111. package/src/compute/safe-url.ts +0 -186
  112. package/src/compute/solve-cache-envelope.ts +0 -98
  113. package/src/compute/solve-cache-key.ts +0 -85
  114. package/src/compute/solve-cache-single-flight.ts +0 -59
  115. package/src/compute/solve-pipeline.ts +0 -603
  116. package/src/compute/transform-input.ts +0 -66
  117. package/src/definitions/__tests__/definition-service.test.ts +0 -131
  118. package/src/definitions/__tests__/load-for-render.test.ts +0 -244
  119. package/src/definitions/__tests__/schema-extraction.test.ts +0 -137
  120. package/src/definitions/definition-service.ts +0 -247
  121. package/src/definitions/index.ts +0 -22
  122. package/src/definitions/load-for-render.ts +0 -272
  123. package/src/definitions/schema-extraction.ts +0 -117
  124. package/src/errors/SentryErrorReporter.ts +0 -88
  125. package/src/errors/index.ts +0 -3
  126. package/src/http/__tests__/body-size.test.ts +0 -27
  127. package/src/http/__tests__/route-classifier.test.ts +0 -60
  128. package/src/http/__tests__/safe-redirect.test.ts +0 -47
  129. package/src/http/__tests__/security-headers.test.ts +0 -29
  130. package/src/http/body-size.ts +0 -24
  131. package/src/http/index.ts +0 -10
  132. package/src/http/redirect.ts +0 -16
  133. package/src/http/route-classifier.ts +0 -74
  134. package/src/http/security-headers.ts +0 -42
  135. package/src/index.ts +0 -27
  136. package/src/ops/__tests__/semver.test.ts +0 -42
  137. package/src/ops/index.ts +0 -3
  138. package/src/ops/semver.ts +0 -60
  139. package/src/providers/__tests__/create-selva-providers.test.ts +0 -172
  140. package/src/providers/__tests__/fixtures/override-config.mjs +0 -8
  141. package/src/providers/create-selva-providers.ts +0 -241
  142. package/src/providers/index.ts +0 -12
  143. package/src/tokens/__tests__/token-codec.test.ts +0 -63
  144. package/src/tokens/index.ts +0 -8
  145. package/src/tokens/token-codec.ts +0 -86
@@ -1,71 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { isSafeRemoteDefinitionUrl } from '../safe-url.js';
3
- /**
4
- * SSRF guard for `loadRemoteDefinition`. Each rejection row corresponds to
5
- * an attack the helper exists to block — leaving any of them unsuppressed
6
- * would let an authenticated user have the server fetch arbitrary
7
- * intranet/cloud-metadata/loopback hosts on their behalf.
8
- *
9
- * Hostname-only — DNS rebinding is not addressed here. See the helper's
10
- * file-level comment.
11
- */
12
- describe('isSafeRemoteDefinitionUrl', () => {
13
- it.each([
14
- 'https://example.com/foo.gh',
15
- 'http://example.com/foo.gh',
16
- 'https://cdn.example.com:443/path/to/file.ghx',
17
- 'https://1.2.3.4/file.gh',
18
- // 172.32 is outside the 172.16-31 private range — must be allowed.
19
- 'https://172.32.0.1/file.gh',
20
- // Edge of the private /16 — 192.169 is public.
21
- 'https://192.169.0.1/file.gh'
22
- ])('accepts public URL %j', (url) => {
23
- expect(isSafeRemoteDefinitionUrl(url)).toBe(true);
24
- });
25
- it.each([
26
- // Loopback
27
- ['http://localhost/foo', 'localhost'],
28
- ['http://localhost:8080/foo', 'localhost with port'],
29
- ['http://api.localhost/foo', '*.localhost'],
30
- ['http://127.0.0.1/foo', '127.0.0.1'],
31
- ['http://127.0.0.5/foo', '127/8'],
32
- ['http://0.0.0.0/foo', '0.0.0.0'],
33
- ['http://[::1]/foo', 'IPv6 loopback'],
34
- // Cloud metadata service — the canonical reason this guard exists.
35
- ['http://169.254.169.254/latest/meta-data/', 'AWS/GCP/Azure metadata'],
36
- ['http://169.254.0.1/foo', '169.254/16 link-local'],
37
- // IPv4 RFC1918 private ranges
38
- ['http://10.0.0.1/foo', '10/8'],
39
- ['http://10.255.255.255/foo', '10/8 upper'],
40
- ['http://192.168.0.1/foo', '192.168/16'],
41
- ['http://172.16.0.1/foo', '172.16 lower bound'],
42
- ['http://172.31.255.255/foo', '172.31 upper bound'],
43
- ['http://172.20.0.1/foo', '172.20 mid-range'],
44
- // IPv6 unique-local + link-local
45
- ['http://[fc00::1]/foo', 'IPv6 unique-local fc'],
46
- ['http://[fd12:3456::1]/foo', 'IPv6 unique-local fd'],
47
- ['http://[fe80::1]/foo', 'IPv6 link-local'],
48
- // IPv4-mapped IPv6 — must unwrap and apply the v4 rules.
49
- ['http://[::ffff:127.0.0.1]/foo', 'IPv4-mapped loopback'],
50
- ['http://[::ffff:169.254.169.254]/foo', 'IPv4-mapped metadata'],
51
- ['http://[::ffff:10.0.0.1]/foo', 'IPv4-mapped RFC1918'],
52
- // Alternate IPv4 encodings that glibc/inet_aton resolve to loopback.
53
- ['http://2130706433/foo', 'integer loopback'],
54
- ['http://0x7f000001/foo', 'hex loopback'],
55
- ['http://0177.0.0.1/foo', 'octal loopback'],
56
- ['http://127.1/foo', 'short-form loopback'],
57
- ['http://0/foo', 'integer 0.0.0.0'],
58
- // Alternate encodings of the cloud-metadata address.
59
- ['http://2852039166/foo', 'integer metadata 169.254.169.254'],
60
- // Non-http(s) schemes
61
- ['file:///etc/passwd', 'file scheme'],
62
- ['gopher://evil/', 'gopher scheme'],
63
- ['javascript:alert(1)', 'javascript scheme'],
64
- // Malformed
65
- ['not a url', 'unparseable'],
66
- ['', 'empty']
67
- ])('rejects %j (%s)', (url) => {
68
- expect(isSafeRemoteDefinitionUrl(url)).toBe(false);
69
- });
70
- });
71
- //# sourceMappingURL=safe-url.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"safe-url.test.js","sourceRoot":"","sources":["../../../src/compute/__tests__/safe-url.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAE3D;;;;;;;;GAQG;AACH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,IAAI,CAAC;QACP,4BAA4B;QAC5B,2BAA2B;QAC3B,8CAA8C;QAC9C,yBAAyB;QACzB,mEAAmE;QACnE,4BAA4B;QAC5B,+CAA+C;QAC/C,6BAA6B;KAC7B,CAAC,CAAC,uBAAuB,EAAE,CAAC,GAAG,EAAE,EAAE;QACnC,MAAM,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;QACP,WAAW;QACX,CAAC,sBAAsB,EAAE,WAAW,CAAC;QACrC,CAAC,2BAA2B,EAAE,qBAAqB,CAAC;QACpD,CAAC,0BAA0B,EAAE,aAAa,CAAC;QAC3C,CAAC,sBAAsB,EAAE,WAAW,CAAC;QACrC,CAAC,sBAAsB,EAAE,OAAO,CAAC;QACjC,CAAC,oBAAoB,EAAE,SAAS,CAAC;QACjC,CAAC,kBAAkB,EAAE,eAAe,CAAC;QACrC,mEAAmE;QACnE,CAAC,0CAA0C,EAAE,wBAAwB,CAAC;QACtE,CAAC,wBAAwB,EAAE,uBAAuB,CAAC;QACnD,8BAA8B;QAC9B,CAAC,qBAAqB,EAAE,MAAM,CAAC;QAC/B,CAAC,2BAA2B,EAAE,YAAY,CAAC;QAC3C,CAAC,wBAAwB,EAAE,YAAY,CAAC;QACxC,CAAC,uBAAuB,EAAE,oBAAoB,CAAC;QAC/C,CAAC,2BAA2B,EAAE,oBAAoB,CAAC;QACnD,CAAC,uBAAuB,EAAE,kBAAkB,CAAC;QAC7C,iCAAiC;QACjC,CAAC,sBAAsB,EAAE,sBAAsB,CAAC;QAChD,CAAC,2BAA2B,EAAE,sBAAsB,CAAC;QACrD,CAAC,sBAAsB,EAAE,iBAAiB,CAAC;QAC3C,yDAAyD;QACzD,CAAC,+BAA+B,EAAE,sBAAsB,CAAC;QACzD,CAAC,qCAAqC,EAAE,sBAAsB,CAAC;QAC/D,CAAC,8BAA8B,EAAE,qBAAqB,CAAC;QACvD,qEAAqE;QACrE,CAAC,uBAAuB,EAAE,kBAAkB,CAAC;QAC7C,CAAC,uBAAuB,EAAE,cAAc,CAAC;QACzC,CAAC,uBAAuB,EAAE,gBAAgB,CAAC;QAC3C,CAAC,kBAAkB,EAAE,qBAAqB,CAAC;QAC3C,CAAC,cAAc,EAAE,iBAAiB,CAAC;QACnC,qDAAqD;QACrD,CAAC,uBAAuB,EAAE,kCAAkC,CAAC;QAC7D,sBAAsB;QACtB,CAAC,oBAAoB,EAAE,aAAa,CAAC;QACrC,CAAC,gBAAgB,EAAE,eAAe,CAAC;QACnC,CAAC,qBAAqB,EAAE,mBAAmB,CAAC;QAC5C,YAAY;QACZ,CAAC,WAAW,EAAE,aAAa,CAAC;QAC5B,CAAC,EAAE,EAAE,OAAO,CAAC;KACb,CAAC,CAAC,iBAAiB,EAAE,CAAC,GAAG,EAAE,EAAE;QAC7B,MAAM,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -1,13 +0,0 @@
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
- export {};
13
- //# sourceMappingURL=solve-cache.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"solve-cache.test.d.ts","sourceRoot":"","sources":["../../../src/compute/__tests__/solve-cache.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -1,234 +0,0 @@
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
- import { describe, it, expect } from 'vitest';
13
- import { SYSTEM_CONTEXT } from '@selvajs/platform';
14
- import { createMemorySolveResultCache } from '../memory-solve-cache.js';
15
- import { deriveSolveCacheInputKey } from '../solve-cache-key.js';
16
- import { encodeSolveCacheEntry, decodeSolveCacheEntry, gunzipEntryBody } from '../solve-cache-envelope.js';
17
- import { createSolveCacheSingleFlight } from '../solve-cache-single-flight.js';
18
- import { gzipSync } from 'node:zlib';
19
- const ctx = SYSTEM_CONTEXT;
20
- function key(over = {}) {
21
- return {
22
- orgId: over.orgId ?? 'org-1',
23
- definitionId: over.definitionId ?? 'def-1',
24
- versionId: over.versionId ?? 'v-1',
25
- inputKey: over.inputKey ?? 'in-1'
26
- };
27
- }
28
- const bytes = (n) => new Uint8Array(n).fill(1);
29
- // ============================================================================
30
- // Memory backend
31
- // ============================================================================
32
- describe('createMemorySolveResultCache — round-trip + quota', () => {
33
- it('stores then serves the exact bytes on a hit, and bumps counters', async () => {
34
- const cache = createMemorySolveResultCache(0);
35
- const payload = new Uint8Array([9, 8, 7]);
36
- await cache.set(ctx, key(), payload, { maxEntriesForDefinition: 5 });
37
- const got = await cache.get(ctx, key());
38
- expect(got).toEqual(payload);
39
- expect(await cache.get(ctx, key({ inputKey: 'absent' }))).toBeNull();
40
- const stats = cache.stats();
41
- expect(stats.hits).toBe(1);
42
- expect(stats.misses).toBe(1);
43
- expect(stats.writes).toBe(1);
44
- expect(stats.entries).toBe(1);
45
- });
46
- it('quota 0 (caching off for the definition) stores nothing', async () => {
47
- const cache = createMemorySolveResultCache(0);
48
- await cache.set(ctx, key(), bytes(10), { maxEntriesForDefinition: 0 });
49
- expect(await cache.get(ctx, key())).toBeNull();
50
- expect(cache.stats().entries).toBe(0);
51
- });
52
- it('evicts LRU WITHIN a definition down to its quota, not across definitions', async () => {
53
- const cache = createMemorySolveResultCache(0);
54
- // def-A gets a quota of 2; write 3 distinct inputs → oldest evicted.
55
- await cache.set(ctx, key({ definitionId: 'A', inputKey: 'a1' }), bytes(1), {
56
- maxEntriesForDefinition: 2
57
- });
58
- await cache.set(ctx, key({ definitionId: 'A', inputKey: 'a2' }), bytes(1), {
59
- maxEntriesForDefinition: 2
60
- });
61
- // def-B writes an entry in between — must NOT be evicted by def-A's churn.
62
- await cache.set(ctx, key({ definitionId: 'B', inputKey: 'b1' }), bytes(1), {
63
- maxEntriesForDefinition: 2
64
- });
65
- await cache.set(ctx, key({ definitionId: 'A', inputKey: 'a3' }), bytes(1), {
66
- maxEntriesForDefinition: 2
67
- });
68
- expect(await cache.get(ctx, key({ definitionId: 'A', inputKey: 'a1' }))).toBeNull(); // evicted
69
- expect(await cache.get(ctx, key({ definitionId: 'A', inputKey: 'a2' }))).not.toBeNull();
70
- expect(await cache.get(ctx, key({ definitionId: 'A', inputKey: 'a3' }))).not.toBeNull();
71
- expect(await cache.get(ctx, key({ definitionId: 'B', inputKey: 'b1' }))).not.toBeNull(); // untouched
72
- expect(cache.stats().quotaEvictions).toBe(1);
73
- });
74
- it('LRU-within-definition respects recency: a re-read entry is not the one evicted', async () => {
75
- const cache = createMemorySolveResultCache(0);
76
- await cache.set(ctx, key({ inputKey: 'x' }), bytes(1), { maxEntriesForDefinition: 2 });
77
- await cache.set(ctx, key({ inputKey: 'y' }), bytes(1), { maxEntriesForDefinition: 2 });
78
- // Touch x so y becomes the LRU.
79
- await cache.get(ctx, key({ inputKey: 'x' }));
80
- await cache.set(ctx, key({ inputKey: 'z' }), bytes(1), { maxEntriesForDefinition: 2 });
81
- expect(await cache.get(ctx, key({ inputKey: 'y' }))).toBeNull(); // y was LRU → evicted
82
- expect(await cache.get(ctx, key({ inputKey: 'x' }))).not.toBeNull();
83
- });
84
- it('the global byte backstop evicts across definitions regardless of counts', async () => {
85
- // 30-byte budget; three 20-byte entries in different definitions with generous
86
- // per-definition quotas → the backstop evicts the global LRU to fit.
87
- const cache = createMemorySolveResultCache(30);
88
- await cache.set(ctx, key({ definitionId: 'A', inputKey: 'a' }), bytes(20), {
89
- maxEntriesForDefinition: 100
90
- });
91
- await cache.set(ctx, key({ definitionId: 'B', inputKey: 'b' }), bytes(20), {
92
- maxEntriesForDefinition: 100
93
- });
94
- // A's entry is the global LRU and gets evicted to keep total <= 30.
95
- expect(await cache.get(ctx, key({ definitionId: 'A', inputKey: 'a' }))).toBeNull();
96
- expect(await cache.get(ctx, key({ definitionId: 'B', inputKey: 'b' }))).not.toBeNull();
97
- expect(cache.stats().byteEvictions).toBeGreaterThanOrEqual(1);
98
- expect(cache.stats().bytes).toBeLessThanOrEqual(30);
99
- });
100
- it('an entry larger than the whole byte backstop is served once but not retained', async () => {
101
- const cache = createMemorySolveResultCache(10);
102
- await cache.set(ctx, key(), bytes(50), { maxEntriesForDefinition: 100 });
103
- expect(await cache.get(ctx, key())).toBeNull();
104
- expect(cache.stats().bytes).toBe(0);
105
- });
106
- it('org id is part of the key: the same definition/version/input under two orgs is isolated', async () => {
107
- const cache = createMemorySolveResultCache(0);
108
- await cache.set(ctx, key({ orgId: 'org-A' }), new Uint8Array([1]), {
109
- maxEntriesForDefinition: 5
110
- });
111
- expect(await cache.get(ctx, key({ orgId: 'org-B' }))).toBeNull(); // no cross-tenant read
112
- expect(await cache.get(ctx, key({ orgId: 'org-A' }))).toEqual(new Uint8Array([1]));
113
- });
114
- it('replacing an existing key updates bytes in place without double-counting', async () => {
115
- const cache = createMemorySolveResultCache(0);
116
- await cache.set(ctx, key(), bytes(10), { maxEntriesForDefinition: 5 });
117
- await cache.set(ctx, key(), bytes(4), { maxEntriesForDefinition: 5 });
118
- expect(cache.stats().entries).toBe(1);
119
- expect(cache.stats().bytes).toBe(4);
120
- });
121
- it('a version bump is a fresh keyspace (old version entries do not collide)', async () => {
122
- const cache = createMemorySolveResultCache(0);
123
- await cache.set(ctx, key({ versionId: 'v-1' }), new Uint8Array([1]), {
124
- maxEntriesForDefinition: 5
125
- });
126
- // New version, same definition/input key → distinct entry, old one still there.
127
- expect(await cache.get(ctx, key({ versionId: 'v-2' }))).toBeNull();
128
- await cache.set(ctx, key({ versionId: 'v-2' }), new Uint8Array([2]), {
129
- maxEntriesForDefinition: 5
130
- });
131
- expect(await cache.get(ctx, key({ versionId: 'v-1' }))).toEqual(new Uint8Array([1]));
132
- expect(await cache.get(ctx, key({ versionId: 'v-2' }))).toEqual(new Uint8Array([2]));
133
- });
134
- });
135
- // ============================================================================
136
- // Key derivation
137
- // ============================================================================
138
- describe('deriveSolveCacheInputKey', () => {
139
- const tree = { a: 1, b: [2, 3] };
140
- it('is deterministic for the same tree + config', () => {
141
- const k1 = deriveSolveCacheInputKey(tree, { computeServerId: 's1' });
142
- const k2 = deriveSolveCacheInputKey(tree, { computeServerId: 's1' });
143
- expect(k1.hash).toBe(k2.hash);
144
- expect(k1.hash).toMatch(/^[0-9a-f]{64}$/); // SHA-256 hex
145
- });
146
- it('differs when the tree differs', () => {
147
- const a = deriveSolveCacheInputKey({ a: 1 }, {});
148
- const b = deriveSolveCacheInputKey({ a: 2 }, {});
149
- expect(a.hash).not.toBe(b.hash);
150
- });
151
- it('folds the config subset in (R8): a different compute server → different key', () => {
152
- const a = deriveSolveCacheInputKey(tree, { computeServerId: 's1' });
153
- const b = deriveSolveCacheInputKey(tree, { computeServerId: 's2' });
154
- expect(a.hash).not.toBe(b.hash);
155
- });
156
- it('exposes the canonical preimage for hit-time comparison', () => {
157
- const k = deriveSolveCacheInputKey(tree, { computeServerId: 's1' });
158
- expect(k.canonical).toContain('"tree"');
159
- expect(k.canonical).toContain('"config"');
160
- });
161
- });
162
- // ============================================================================
163
- // Envelope codec
164
- // ============================================================================
165
- describe('solve-cache envelope codec', () => {
166
- const header = { errorCount: 1, warningCount: 2, serializedBytes: 42, inputHash: 'abc' };
167
- it('round-trips header + gzipped body', () => {
168
- const body = new Uint8Array(gzipSync(Buffer.from('{"hello":"world"}')));
169
- const encoded = encodeSolveCacheEntry(header, body);
170
- const decoded = decodeSolveCacheEntry(encoded);
171
- expect(decoded).not.toBeNull();
172
- expect(decoded.header).toEqual(header);
173
- expect(gunzipEntryBody(decoded.gzippedBody)).toBe('{"hello":"world"}');
174
- });
175
- it('returns null for a truncated / malformed entry (→ treated as a miss)', () => {
176
- expect(decodeSolveCacheEntry(new Uint8Array([1, 2]))).toBeNull(); // too short for length prefix
177
- const encoded = encodeSolveCacheEntry(header, new Uint8Array([1, 2, 3]));
178
- expect(decodeSolveCacheEntry(encoded.slice(0, 6))).toBeNull(); // header claims more than present
179
- });
180
- it('returns null when the header JSON is missing required fields', () => {
181
- // Hand-craft an entry whose header is valid JSON but the wrong shape.
182
- const badHeader = Buffer.from(JSON.stringify({ nope: true }), 'utf8');
183
- const out = Buffer.allocUnsafe(4 + badHeader.byteLength);
184
- out.writeUInt32BE(badHeader.byteLength, 0);
185
- badHeader.copy(out, 4);
186
- expect(decodeSolveCacheEntry(new Uint8Array(out))).toBeNull();
187
- });
188
- });
189
- // ============================================================================
190
- // Single-flight
191
- // ============================================================================
192
- describe('createSolveCacheSingleFlight', () => {
193
- it('coalesces concurrent identical calls into one execution', async () => {
194
- const sf = createSolveCacheSingleFlight();
195
- let runs = 0;
196
- let release;
197
- const gate = new Promise((r) => (release = r));
198
- const work = () => {
199
- runs += 1;
200
- return gate;
201
- };
202
- const p1 = sf.run('k', work);
203
- const p2 = sf.run('k', work);
204
- expect(sf.inFlight()).toBe(1);
205
- release(7);
206
- expect(await p1).toBe(7);
207
- expect(await p2).toBe(7); // shared result
208
- expect(runs).toBe(1); // executed once
209
- });
210
- it('runs distinct keys independently', async () => {
211
- const sf = createSolveCacheSingleFlight();
212
- let runs = 0;
213
- await Promise.all([sf.run('a', async () => void runs++), sf.run('b', async () => void runs++)]);
214
- expect(runs).toBe(2);
215
- });
216
- it('releases the key after settle so a later call runs fresh', async () => {
217
- const sf = createSolveCacheSingleFlight();
218
- let runs = 0;
219
- await sf.run('k', async () => void runs++);
220
- expect(sf.inFlight()).toBe(0);
221
- await sf.run('k', async () => void runs++);
222
- expect(runs).toBe(2);
223
- });
224
- it('a rejection is shared by concurrent waiters and still frees the key', async () => {
225
- const sf = createSolveCacheSingleFlight();
226
- const boom = () => Promise.reject(new Error('boom'));
227
- const p1 = sf.run('k', boom);
228
- const p2 = sf.run('k', boom);
229
- await expect(p1).rejects.toThrow('boom');
230
- await expect(p2).rejects.toThrow('boom');
231
- expect(sf.inFlight()).toBe(0);
232
- });
233
- });
234
- //# sourceMappingURL=solve-cache.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"solve-cache.test.js","sourceRoot":"","sources":["../../../src/compute/__tests__/solve-cache.test.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- /**
2
- * Tests for `runSolvePipeline` — the transport-agnostic solve core (K3).
3
- *
4
- * `@selvajs/compute` is mocked so the pipeline runs without a live compute
5
- * server: `TreeBuilder.fromInputParams` returns a marker tree and the scheduler
6
- * is a stub whose `solve` we script per test (resolve a response, throw an
7
- * AbortError, etc.). That isolates the pipeline's own behavior — outcome
8
- * classification, size cap, gzip, and the Server-Timing / version envelope.
9
- */
10
- export {};
11
- //# sourceMappingURL=solve-pipeline.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"solve-pipeline.test.d.ts","sourceRoot":"","sources":["../../../src/compute/__tests__/solve-pipeline.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}