@selvajs/server 0.2.0-beta.2 → 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.
- package/LICENSE +1 -1
- package/README.md +32 -0
- package/dist/compute/client-cache.d.ts +12 -0
- package/dist/compute/client-cache.d.ts.map +1 -1
- package/dist/compute/client-cache.js +18 -3
- package/dist/compute/client-cache.js.map +1 -1
- package/dist/compute/definition-byte-cache.d.ts +85 -0
- package/dist/compute/definition-byte-cache.d.ts.map +1 -0
- package/dist/compute/definition-byte-cache.js +110 -0
- package/dist/compute/definition-byte-cache.js.map +1 -0
- package/dist/compute/index.d.ts +7 -2
- package/dist/compute/index.d.ts.map +1 -1
- package/dist/compute/index.js +6 -1
- package/dist/compute/index.js.map +1 -1
- package/dist/compute/limits.d.ts +52 -0
- package/dist/compute/limits.d.ts.map +1 -1
- package/dist/compute/limits.js +33 -1
- package/dist/compute/limits.js.map +1 -1
- package/dist/compute/memory-solve-cache.d.ts +58 -0
- package/dist/compute/memory-solve-cache.d.ts.map +1 -0
- package/dist/compute/memory-solve-cache.js +0 -0
- package/dist/compute/memory-solve-cache.js.map +1 -0
- package/dist/compute/safe-url.d.ts.map +1 -1
- package/dist/compute/safe-url.js +16 -0
- package/dist/compute/safe-url.js.map +1 -1
- package/dist/compute/solve-cache-envelope.d.ts +53 -0
- package/dist/compute/solve-cache-envelope.d.ts.map +1 -0
- package/dist/compute/solve-cache-envelope.js +66 -0
- package/dist/compute/solve-cache-envelope.js.map +1 -0
- package/dist/compute/solve-cache-key.d.ts +65 -0
- package/dist/compute/solve-cache-key.d.ts.map +1 -0
- package/dist/compute/solve-cache-key.js +50 -0
- package/dist/compute/solve-cache-key.js.map +1 -0
- package/dist/compute/solve-cache-single-flight.d.ts +42 -0
- package/dist/compute/solve-cache-single-flight.d.ts.map +1 -0
- package/dist/compute/solve-cache-single-flight.js +50 -0
- package/dist/compute/solve-cache-single-flight.js.map +1 -0
- package/dist/compute/solve-pipeline.d.ts +71 -8
- package/dist/compute/solve-pipeline.d.ts.map +1 -1
- package/dist/compute/solve-pipeline.js +180 -8
- package/dist/compute/solve-pipeline.js.map +1 -1
- package/dist/definitions/definition-service.d.ts +1 -1
- package/dist/definitions/definition-service.d.ts.map +1 -1
- package/dist/definitions/definition-service.js +8 -4
- package/dist/definitions/definition-service.js.map +1 -1
- package/package.json +14 -18
- package/dist/access/__tests__/project-access-input.test.d.ts +0 -2
- package/dist/access/__tests__/project-access-input.test.d.ts.map +0 -1
- package/dist/access/__tests__/project-access-input.test.js +0 -146
- package/dist/access/__tests__/project-access-input.test.js.map +0 -1
- package/dist/compute/__tests__/client-cache.test.d.ts +0 -11
- package/dist/compute/__tests__/client-cache.test.d.ts.map +0 -1
- package/dist/compute/__tests__/client-cache.test.js +0 -200
- package/dist/compute/__tests__/client-cache.test.js.map +0 -1
- package/dist/compute/__tests__/rate-limit.test.d.ts +0 -2
- package/dist/compute/__tests__/rate-limit.test.d.ts.map +0 -1
- package/dist/compute/__tests__/rate-limit.test.js +0 -98
- package/dist/compute/__tests__/rate-limit.test.js.map +0 -1
- package/dist/compute/__tests__/remote-definition.test.d.ts +0 -11
- package/dist/compute/__tests__/remote-definition.test.d.ts.map +0 -1
- package/dist/compute/__tests__/remote-definition.test.js +0 -114
- package/dist/compute/__tests__/remote-definition.test.js.map +0 -1
- package/dist/compute/__tests__/safe-url.test.d.ts +0 -2
- package/dist/compute/__tests__/safe-url.test.d.ts.map +0 -1
- package/dist/compute/__tests__/safe-url.test.js +0 -71
- package/dist/compute/__tests__/safe-url.test.js.map +0 -1
- package/dist/compute/__tests__/solve-pipeline.test.d.ts +0 -11
- package/dist/compute/__tests__/solve-pipeline.test.d.ts.map +0 -1
- package/dist/compute/__tests__/solve-pipeline.test.js +0 -292
- package/dist/compute/__tests__/solve-pipeline.test.js.map +0 -1
- package/dist/compute/__tests__/transform-input.test.d.ts +0 -14
- package/dist/compute/__tests__/transform-input.test.d.ts.map +0 -1
- package/dist/compute/__tests__/transform-input.test.js +0 -120
- package/dist/compute/__tests__/transform-input.test.js.map +0 -1
- package/dist/definitions/__tests__/load-for-render.test.d.ts +0 -8
- package/dist/definitions/__tests__/load-for-render.test.d.ts.map +0 -1
- package/dist/definitions/__tests__/load-for-render.test.js +0 -196
- package/dist/definitions/__tests__/load-for-render.test.js.map +0 -1
- package/dist/definitions/__tests__/schema-extraction.test.d.ts +0 -11
- package/dist/definitions/__tests__/schema-extraction.test.d.ts.map +0 -1
- package/dist/definitions/__tests__/schema-extraction.test.js +0 -115
- package/dist/definitions/__tests__/schema-extraction.test.js.map +0 -1
- package/dist/http/__tests__/body-size.test.d.ts +0 -2
- package/dist/http/__tests__/body-size.test.d.ts.map +0 -1
- package/dist/http/__tests__/body-size.test.js +0 -24
- package/dist/http/__tests__/body-size.test.js.map +0 -1
- package/dist/http/__tests__/route-classifier.test.d.ts +0 -2
- package/dist/http/__tests__/route-classifier.test.d.ts.map +0 -1
- package/dist/http/__tests__/route-classifier.test.js +0 -54
- package/dist/http/__tests__/route-classifier.test.js.map +0 -1
- package/dist/http/__tests__/safe-redirect.test.d.ts +0 -2
- package/dist/http/__tests__/safe-redirect.test.d.ts.map +0 -1
- package/dist/http/__tests__/safe-redirect.test.js +0 -44
- package/dist/http/__tests__/safe-redirect.test.js.map +0 -1
- package/dist/http/__tests__/security-headers.test.d.ts +0 -2
- package/dist/http/__tests__/security-headers.test.d.ts.map +0 -1
- package/dist/http/__tests__/security-headers.test.js +0 -24
- package/dist/http/__tests__/security-headers.test.js.map +0 -1
- package/dist/ops/__tests__/semver.test.d.ts +0 -2
- package/dist/ops/__tests__/semver.test.d.ts.map +0 -1
- package/dist/ops/__tests__/semver.test.js +0 -38
- package/dist/ops/__tests__/semver.test.js.map +0 -1
- package/dist/providers/__tests__/create-selva-providers.test.d.ts +0 -7
- package/dist/providers/__tests__/create-selva-providers.test.d.ts.map +0 -1
- package/dist/providers/__tests__/create-selva-providers.test.js +0 -135
- package/dist/providers/__tests__/create-selva-providers.test.js.map +0 -1
- package/dist/tokens/__tests__/token-codec.test.d.ts +0 -2
- package/dist/tokens/__tests__/token-codec.test.d.ts.map +0 -1
- package/dist/tokens/__tests__/token-codec.test.js +0 -50
- package/dist/tokens/__tests__/token-codec.test.js.map +0 -1
- package/src/access/__tests__/project-access-input.test.ts +0 -175
- package/src/access/index.ts +0 -9
- package/src/access/project-access-input.ts +0 -145
- package/src/compute/__tests__/client-cache.test.ts +0 -224
- package/src/compute/__tests__/rate-limit.test.ts +0 -106
- package/src/compute/__tests__/remote-definition.test.ts +0 -140
- package/src/compute/__tests__/safe-url.test.ts +0 -72
- package/src/compute/__tests__/solve-pipeline.test.ts +0 -341
- package/src/compute/__tests__/transform-input.test.ts +0 -162
- package/src/compute/client-cache.ts +0 -300
- package/src/compute/index.ts +0 -48
- package/src/compute/limits.ts +0 -159
- package/src/compute/rate-limit.ts +0 -110
- package/src/compute/remote-definition.ts +0 -149
- package/src/compute/safe-url.ts +0 -186
- package/src/compute/solve-pipeline.ts +0 -339
- package/src/compute/transform-input.ts +0 -66
- package/src/definitions/__tests__/load-for-render.test.ts +0 -244
- package/src/definitions/__tests__/schema-extraction.test.ts +0 -137
- package/src/definitions/definition-service.ts +0 -243
- package/src/definitions/index.ts +0 -22
- package/src/definitions/load-for-render.ts +0 -272
- package/src/definitions/schema-extraction.ts +0 -117
- package/src/errors/SentryErrorReporter.ts +0 -88
- package/src/errors/index.ts +0 -3
- package/src/http/__tests__/body-size.test.ts +0 -27
- package/src/http/__tests__/route-classifier.test.ts +0 -60
- package/src/http/__tests__/safe-redirect.test.ts +0 -47
- package/src/http/__tests__/security-headers.test.ts +0 -29
- package/src/http/body-size.ts +0 -24
- package/src/http/index.ts +0 -10
- package/src/http/redirect.ts +0 -16
- package/src/http/route-classifier.ts +0 -74
- package/src/http/security-headers.ts +0 -42
- package/src/index.ts +0 -27
- package/src/ops/__tests__/semver.test.ts +0 -42
- package/src/ops/index.ts +0 -3
- package/src/ops/semver.ts +0 -60
- package/src/providers/__tests__/create-selva-providers.test.ts +0 -172
- package/src/providers/__tests__/fixtures/override-config.mjs +0 -8
- package/src/providers/create-selva-providers.ts +0 -241
- package/src/providers/index.ts +0 -12
- package/src/tokens/__tests__/token-codec.test.ts +0 -63
- package/src/tokens/index.ts +0 -8
- package/src/tokens/token-codec.ts +0 -86
|
@@ -19,9 +19,14 @@
|
|
|
19
19
|
* The Server-Timing string it emits IS the versioned wire contract (audit D5):
|
|
20
20
|
* see {@link COMPUTE_CONTRACT_VERSION} and {@link COMPUTE_VERSION_HEADER}.
|
|
21
21
|
*/
|
|
22
|
-
import { TreeBuilder } from '@selvajs/compute';
|
|
23
|
-
import {
|
|
22
|
+
import { ErrorCodes, RhinoComputeError, TreeBuilder } from '@selvajs/compute';
|
|
23
|
+
import { gzip } from 'node:zlib';
|
|
24
|
+
import { promisify } from 'node:util';
|
|
24
25
|
import { transformInputParameter } from './transform-input.js';
|
|
26
|
+
import { deriveSolveCacheInputKey } from './solve-cache-key.js';
|
|
27
|
+
import { decodeSolveCacheEntry, encodeSolveCacheEntry, gunzipEntryBody } from './solve-cache-envelope.js';
|
|
28
|
+
/** Async gzip (audit B8) — off the event loop, unlike the old `gzipSync`. */
|
|
29
|
+
const gzipAsync = promisify(gzip);
|
|
25
30
|
// ============================================================================
|
|
26
31
|
// Wire contract version (audit D5)
|
|
27
32
|
// ============================================================================
|
|
@@ -50,6 +55,31 @@ export async function runSolvePipeline(args) {
|
|
|
50
55
|
.filter((input) => input.paramType)
|
|
51
56
|
.map((input) => transformInputParameter(input, args.values[input.id])));
|
|
52
57
|
const treeBuildMs = performance.now() - treeBuildStart;
|
|
58
|
+
// --- L2 durable cache lookup (H1) ---------------------------------------
|
|
59
|
+
// Derive the wide key from the TRANSFORMED tree (R13) + config subset (R8),
|
|
60
|
+
// then check the injected hook. Present only for cacheable live solves — its
|
|
61
|
+
// presence is the channel gate. A hit skips the solve entirely and serves the
|
|
62
|
+
// stored gzipped envelope; the derived key is reused for the write-through on
|
|
63
|
+
// a miss. Lookup is best-effort: any rejection is swallowed to a miss.
|
|
64
|
+
let inputKey = null;
|
|
65
|
+
if (args.solveCache) {
|
|
66
|
+
inputKey = deriveSolveCacheInputKey(inputTree, args.solveCache.configSubset).hash;
|
|
67
|
+
let stored = null;
|
|
68
|
+
try {
|
|
69
|
+
stored = await args.solveCache.lookup(inputKey);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
stored = null;
|
|
73
|
+
}
|
|
74
|
+
if (stored) {
|
|
75
|
+
const hit = buildEnvelopeFromCacheEntry(stored, inputKey, args);
|
|
76
|
+
if (hit)
|
|
77
|
+
return hit;
|
|
78
|
+
// Corrupt/tampered entry → fall through and solve as a miss. Warn: a
|
|
79
|
+
// silently-poisoned cache would otherwise look like an eternal cold key.
|
|
80
|
+
console.warn(`[Compute/l2-cache] corrupt or hash-mismatched entry for key ${inputKey.slice(0, 16)}… — discarding, solving fresh`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
53
83
|
// --- solve --------------------------------------------------------------
|
|
54
84
|
// Snapshot the shared telemetry sequence counters. The holders live on the
|
|
55
85
|
// warm client and are written by every request on this server; with
|
|
@@ -80,6 +110,30 @@ export async function runSolvePipeline(args) {
|
|
|
80
110
|
message: `Solve exceeded the ${Math.round(args.maxSolveDurationMs / 1000)}s deadline.`
|
|
81
111
|
};
|
|
82
112
|
}
|
|
113
|
+
// Scheduler backpressure (audit B7): a full queue or an over-deadline queue
|
|
114
|
+
// wait sheds the solve BEFORE compute runs. Classify these as `shed` (503 +
|
|
115
|
+
// Retry-After) rather than the generic 500 `compute_error` path — they're
|
|
116
|
+
// load signals, not failures, and the client should back off and retry.
|
|
117
|
+
if (err instanceof RhinoComputeError) {
|
|
118
|
+
if (err.code === ErrorCodes.QUEUE_FULL) {
|
|
119
|
+
return {
|
|
120
|
+
kind: 'shed',
|
|
121
|
+
durationMs,
|
|
122
|
+
reason: 'queue_full',
|
|
123
|
+
retryAfterSeconds: 1,
|
|
124
|
+
message: 'Compute server is at capacity. Retry shortly.'
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
if (err.code === ErrorCodes.QUEUE_TIMEOUT) {
|
|
128
|
+
return {
|
|
129
|
+
kind: 'shed',
|
|
130
|
+
durationMs,
|
|
131
|
+
reason: 'queue_timeout',
|
|
132
|
+
retryAfterSeconds: 1,
|
|
133
|
+
message: 'Compute request waited too long in the queue. Retry shortly.'
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
83
137
|
return { kind: 'compute_error', durationMs, error: err };
|
|
84
138
|
}
|
|
85
139
|
const solveMs = performance.now() - solveStart;
|
|
@@ -104,13 +158,36 @@ export async function runSolvePipeline(args) {
|
|
|
104
158
|
// in Server-Timing, included in `total`). Buffered (not streamed) so
|
|
105
159
|
// Content-Length is known and a connection cut mid-transfer fails hard
|
|
106
160
|
// instead of truncating the JSON.
|
|
161
|
+
// gzip is async (audit B8) — a multi-MB `gzipSync` blocked the event loop for
|
|
162
|
+
// every other request on this instance. Two independent reasons to compress:
|
|
163
|
+
// - the client advertised gzip AND the body clears the 1 KB break-even (tiny
|
|
164
|
+
// bodies aren't worth compressing for the wire);
|
|
165
|
+
// - an L2 write-through is pending — the entry stores compressed bytes so
|
|
166
|
+
// every future hit is near-CPU-free, so we compress even a small body (it
|
|
167
|
+
// will be cached), just not for the wire below the threshold.
|
|
168
|
+
const clientWantsGzip = /\bgzip\b/i.test(args.acceptEncoding);
|
|
169
|
+
const worthSendingGzip = clientWantsGzip && serialized.length > 1024;
|
|
170
|
+
const willCache = args.solveCache != null;
|
|
107
171
|
let compressed = null;
|
|
108
172
|
let gzipMs = 0;
|
|
109
|
-
if (
|
|
173
|
+
if (worthSendingGzip || willCache) {
|
|
110
174
|
const gzipStart = performance.now();
|
|
111
|
-
compressed =
|
|
175
|
+
compressed = await gzipAsync(Buffer.from(serialized));
|
|
112
176
|
gzipMs = performance.now() - gzipStart;
|
|
113
177
|
}
|
|
178
|
+
// --- L2 write-through (H1) ----------------------------------------------
|
|
179
|
+
// On a cacheable solve with a compressed body, store the gzipped envelope so
|
|
180
|
+
// future hits are near-CPU-free. Fire-and-forget through the hook; the store
|
|
181
|
+
// itself is best-effort (may silently drop under quota/byte pressure).
|
|
182
|
+
if (args.solveCache && inputKey && compressed) {
|
|
183
|
+
const entry = encodeSolveCacheEntry({
|
|
184
|
+
errorCount: result.errors?.length ?? 0,
|
|
185
|
+
warningCount: result.warnings?.length ?? 0,
|
|
186
|
+
serializedBytes: serialized.length,
|
|
187
|
+
inputHash: inputKey
|
|
188
|
+
}, new Uint8Array(compressed));
|
|
189
|
+
args.solveCache.store(inputKey, entry);
|
|
190
|
+
}
|
|
114
191
|
const serverTotalMs = performance.now() - args.loadStartMs;
|
|
115
192
|
// --- per-request telemetry attribution (see snapshot above) -------------
|
|
116
193
|
// settle: ours iff exactly one settle happened since the snapshot. rhino:
|
|
@@ -121,6 +198,10 @@ export async function runSolvePipeline(args) {
|
|
|
121
198
|
const rhino = settle && !settle.fromCache && client.rhinoTiming.seq === rhinoSeqBefore + 1
|
|
122
199
|
? client.rhinoTiming.last
|
|
123
200
|
: null;
|
|
201
|
+
// Send gzip to the client only when it's worth it for the wire — a body
|
|
202
|
+
// compressed solely to feed the L2 write-through (or one below the 1 KB
|
|
203
|
+
// break-even) goes out uncompressed.
|
|
204
|
+
const sendCompressed = compressed && worthSendingGzip ? compressed : null;
|
|
124
205
|
// --- Server-Timing envelope (the versioned wire contract) ---------------
|
|
125
206
|
const serverTiming = buildServerTiming({
|
|
126
207
|
defLoadMs: args.defLoadMs,
|
|
@@ -131,6 +212,9 @@ export async function runSolvePipeline(args) {
|
|
|
131
212
|
serverTotalMs,
|
|
132
213
|
rhino,
|
|
133
214
|
settle,
|
|
215
|
+
byteRefOutcome: args.byteRefOutcome,
|
|
216
|
+
// L2 was consulted (hook present) and missed — otherwise not consulted.
|
|
217
|
+
l2CacheHit: args.solveCache ? false : null,
|
|
134
218
|
prepMarks: args.prepMarks ?? []
|
|
135
219
|
});
|
|
136
220
|
const headers = {
|
|
@@ -146,15 +230,22 @@ export async function runSolvePipeline(args) {
|
|
|
146
230
|
gzipMs,
|
|
147
231
|
serverTotalMs,
|
|
148
232
|
serializedBytes: serialized.length,
|
|
149
|
-
compressedBytes:
|
|
233
|
+
compressedBytes: sendCompressed?.byteLength ?? null,
|
|
234
|
+
l2CacheHit: args.solveCache ? false : null
|
|
150
235
|
};
|
|
151
236
|
let envelope;
|
|
152
|
-
if (
|
|
237
|
+
if (sendCompressed) {
|
|
153
238
|
// A downstream proxy's `encode gzip` skips already-encoded responses, so
|
|
154
239
|
// this never double-compresses. Vary is set on both branches.
|
|
155
240
|
headers['Content-Encoding'] = 'gzip';
|
|
156
|
-
headers['Content-Length'] = String(
|
|
157
|
-
envelope = {
|
|
241
|
+
headers['Content-Length'] = String(sendCompressed.byteLength);
|
|
242
|
+
envelope = {
|
|
243
|
+
body: new Uint8Array(sendCompressed),
|
|
244
|
+
encoding: 'gzip',
|
|
245
|
+
headers,
|
|
246
|
+
result,
|
|
247
|
+
metrics
|
|
248
|
+
};
|
|
158
249
|
}
|
|
159
250
|
else {
|
|
160
251
|
headers['Content-Length'] = String(Buffer.byteLength(serialized));
|
|
@@ -168,6 +259,74 @@ export async function runSolvePipeline(args) {
|
|
|
168
259
|
warningCount: result.warnings?.length ?? 0
|
|
169
260
|
};
|
|
170
261
|
}
|
|
262
|
+
// ============================================================================
|
|
263
|
+
// L2 cache-hit envelope
|
|
264
|
+
// ============================================================================
|
|
265
|
+
/**
|
|
266
|
+
* Build the `ok` outcome from a stored L2 entry — the near-CPU-free hit path (no
|
|
267
|
+
* solve, no `JSON.stringify`, no gzip). Returns `null` when the entry is corrupt
|
|
268
|
+
* or its stored `inputHash` doesn't match the requesting key (defense-in-depth
|
|
269
|
+
* against a wide-hash collision), so the caller falls through and solves.
|
|
270
|
+
*/
|
|
271
|
+
function buildEnvelopeFromCacheEntry(entryBytes, inputKey, args) {
|
|
272
|
+
const decoded = decodeSolveCacheEntry(entryBytes);
|
|
273
|
+
// A collision that produced the same storage key still can't serve the wrong
|
|
274
|
+
// geometry: the stored hash must match the requesting key's hash.
|
|
275
|
+
if (!decoded || decoded.header.inputHash !== inputKey)
|
|
276
|
+
return null;
|
|
277
|
+
const { header, gzippedBody } = decoded;
|
|
278
|
+
const clientWantsGzip = /\bgzip\b/i.test(args.acceptEncoding);
|
|
279
|
+
const serverTotalMs = performance.now() - args.loadStartMs;
|
|
280
|
+
const serverTiming = buildServerTiming({
|
|
281
|
+
defLoadMs: args.defLoadMs,
|
|
282
|
+
treeBuildMs: 0,
|
|
283
|
+
solveMs: 0,
|
|
284
|
+
serializeMs: 0,
|
|
285
|
+
gzipMs: 0,
|
|
286
|
+
serverTotalMs,
|
|
287
|
+
rhino: null,
|
|
288
|
+
settle: null,
|
|
289
|
+
byteRefOutcome: args.byteRefOutcome,
|
|
290
|
+
l2CacheHit: true,
|
|
291
|
+
prepMarks: args.prepMarks ?? []
|
|
292
|
+
});
|
|
293
|
+
const headers = {
|
|
294
|
+
'Content-Type': 'application/json',
|
|
295
|
+
'Server-Timing': serverTiming,
|
|
296
|
+
[COMPUTE_VERSION_HEADER]: String(COMPUTE_CONTRACT_VERSION),
|
|
297
|
+
Vary: 'Accept-Encoding'
|
|
298
|
+
};
|
|
299
|
+
const metrics = {
|
|
300
|
+
treeBuildMs: 0,
|
|
301
|
+
solveMs: 0,
|
|
302
|
+
serializeMs: 0,
|
|
303
|
+
gzipMs: 0,
|
|
304
|
+
serverTotalMs,
|
|
305
|
+
serializedBytes: header.serializedBytes,
|
|
306
|
+
compressedBytes: clientWantsGzip ? gzippedBody.byteLength : null,
|
|
307
|
+
l2CacheHit: true
|
|
308
|
+
};
|
|
309
|
+
let envelope;
|
|
310
|
+
if (clientWantsGzip) {
|
|
311
|
+
// Serve the stored compressed bytes verbatim — the whole point of R6.
|
|
312
|
+
headers['Content-Encoding'] = 'gzip';
|
|
313
|
+
headers['Content-Length'] = String(gzippedBody.byteLength);
|
|
314
|
+
envelope = { body: new Uint8Array(gzippedBody), encoding: 'gzip', headers, metrics };
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
// Rare non-gzip client: gunzip back to the JSON string for the response.
|
|
318
|
+
const json = gunzipEntryBody(gzippedBody);
|
|
319
|
+
headers['Content-Length'] = String(Buffer.byteLength(json));
|
|
320
|
+
envelope = { body: json, headers, metrics };
|
|
321
|
+
}
|
|
322
|
+
return {
|
|
323
|
+
kind: 'ok',
|
|
324
|
+
envelope,
|
|
325
|
+
solveMs: 0,
|
|
326
|
+
errorCount: header.errorCount,
|
|
327
|
+
warningCount: header.warningCount
|
|
328
|
+
};
|
|
329
|
+
}
|
|
171
330
|
/**
|
|
172
331
|
* Assemble the `Server-Timing` header. The browser reads these to attribute its
|
|
173
332
|
* round-trip: `total` here == the server's headers-to-out wall time, so browser
|
|
@@ -203,6 +362,19 @@ function buildServerTiming(parts) {
|
|
|
203
362
|
header += `, def_reupload;dur=${settle.definitionReuploaded ? 1 : 0}`;
|
|
204
363
|
}
|
|
205
364
|
}
|
|
365
|
+
// Byte-cache verdict for `DefinitionRef` solves: skipped = the scheduler never
|
|
366
|
+
// materialized bytes (pointer-known solve — the whole point of this path), hit
|
|
367
|
+
// = warm byte cache, miss = fell through to storage. Absent for raw-bytes solves.
|
|
368
|
+
const byteRef = parts.byteRefOutcome;
|
|
369
|
+
if (byteRef) {
|
|
370
|
+
const verdict = !byteRef.loaded ? 'skipped' : byteRef.fromCache ? 'hit' : 'miss';
|
|
371
|
+
header += `, def_bytes;desc=${verdict}`;
|
|
372
|
+
}
|
|
373
|
+
// Durable L2 verdict (H1): 1 = hit (no solve ran), 0 = miss (consulted then
|
|
374
|
+
// solved). Absent when the L2 wasn't consulted (draft channel / caching off).
|
|
375
|
+
if (parts.l2CacheHit !== null) {
|
|
376
|
+
header += `, l2_cache;dur=${parts.l2CacheHit ? 1 : 0}`;
|
|
377
|
+
}
|
|
206
378
|
return header;
|
|
207
379
|
}
|
|
208
380
|
//# sourceMappingURL=solve-pipeline.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solve-pipeline.js","sourceRoot":"","sources":["../../src/compute/solve-pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,WAAW,EAAoD,MAAM,kBAAkB,CAAC;AAEjG,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAG/D,+EAA+E;AAC/E,mCAAmC;AACnC,+EAA+E;AAC/E,EAAE;AACF,+EAA+E;AAC/E,4EAA4E;AAC5E,6EAA6E;AAC7E,iFAAiF;AACjF,8DAA8D;AAE9D,wFAAwF;AACxF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAU,CAAC;AACnD,iEAAiE;AACjE,MAAM,CAAC,MAAM,sBAAsB,GAAG,yBAAyB,CAAC;AAgGhE,+EAA+E;AAC/E,WAAW;AACX,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAuB;IAC7D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAEhC,2EAA2E;IAC3E,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,WAAW,CAAC,eAAe,CAC5C,IAAI,CAAC,MAAM;SACT,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;SAClC,GAAG,CAAC,CAAC,KAAK,EAAc,EAAE,CAAC,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CACnF,CAAC;IACF,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;IAEvD,2EAA2E;IAC3E,2EAA2E;IAC3E,oEAAoE;IACpE,2EAA2E;IAC3E,wEAAwE;IACxE,2EAA2E;IAC3E,uEAAuE;IACvE,yEAAyE;IACzE,MAAM,eAAe,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;IAC7C,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC;IAE9C,IAAI,MAAkC,CAAC;IACvC,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACrC,IAAI,CAAC;QACJ,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACrF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;QAClD,wEAAwE;QACxE,yEAAyE;QACzE,qEAAqE;QACrE,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC;QAClE,IAAI,OAAO,EAAE,CAAC;YACb,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC;YAChE,OAAO;gBACN,IAAI,EAAE,SAAS;gBACf,UAAU;gBACV,OAAO,EAAE,sBAAsB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,aAAa;aACtF,CAAC;QACH,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IAC1D,CAAC;IACD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;IAE/C,0EAA0E;IAC1E,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACzC,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACJ,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,yEAAyE;QACzE,6EAA6E;QAC7E,IAAI,GAAG,YAAY,UAAU;YAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;QAC5D,MAAM,GAAG,CAAC;IACX,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC5E,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;IAEvD,2EAA2E;IAC3E,8EAA8E;IAC9E,qEAAqE;IACrE,uEAAuE;IACvE,kCAAkC;IAClC,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;QACvE,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACpC,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC/C,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,CAAC;IAED,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;IAE3D,2EAA2E;IAC3E,0EAA0E;IAC1E,yEAAyE;IACzE,0EAA0E;IAC1E,0DAA0D;IAC1D,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3F,MAAM,KAAK,GACV,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,WAAW,CAAC,GAAG,KAAK,cAAc,GAAG,CAAC;QAC3E,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI;QACzB,CAAC,CAAC,IAAI,CAAC;IAET,2EAA2E;IAC3E,MAAM,YAAY,GAAG,iBAAiB,CAAC;QACtC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,WAAW;QACX,OAAO;QACP,WAAW;QACX,MAAM;QACN,aAAa;QACb,KAAK;QACL,MAAM;QACN,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;KAC/B,CAAC,CAAC;IAEH,MAAM,OAAO,GAA2B;QACvC,cAAc,EAAE,kBAAkB;QAClC,eAAe,EAAE,YAAY;QAC7B,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC,wBAAwB,CAAC;QAC1D,IAAI,EAAE,iBAAiB;KACvB,CAAC;IAEF,MAAM,OAAO,GAAsB;QAClC,WAAW;QACX,OAAO;QACP,WAAW;QACX,MAAM;QACN,aAAa;QACb,eAAe,EAAE,UAAU,CAAC,MAAM;QAClC,eAAe,EAAE,UAAU,EAAE,UAAU,IAAI,IAAI;KAC/C,CAAC;IAEF,IAAI,QAAuB,CAAC;IAC5B,IAAI,UAAU,EAAE,CAAC;QAChB,yEAAyE;QACzE,8DAA8D;QAC9D,OAAO,CAAC,kBAAkB,CAAC,GAAG,MAAM,CAAC;QACrC,OAAO,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC1D,QAAQ,GAAG,EAAE,IAAI,EAAE,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC7F,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;QAClE,QAAQ,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC3D,CAAC;IAED,OAAO;QACN,IAAI,EAAE,IAAI;QACV,QAAQ;QACR,OAAO;QACP,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;QACtC,YAAY,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;KAC1C,CAAC;AACH,CAAC;AAkBD;;;;;;;GAOG;AACH,SAAS,iBAAiB,CAAC,KAAwB;IAClD,IAAI,MAAM,GACT,YAAY,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;QAC1C,YAAY,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;QAC5C,aAAa,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;QACzC,iBAAiB,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;QACjD,YAAY,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;QACvC,aAAa,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,IAAI,KAAK,EAAE,CAAC;QACX,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5D,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;QAC7D,MAAM;YACL,sBAAsB,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBAC/C,qBAAqB,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBAC7C,sBAAsB,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBAC/C,sBAAsB,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,CAAC;IAED,KAAK,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QAC3C,MAAM,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/C,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,IAAI,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,qBAAqB,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,IAAI,MAAM,CAAC,oBAAoB,KAAK,SAAS,EAAE,CAAC;YAC/C,MAAM,IAAI,sBAAsB,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,CAAC;IACF,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC"}
|
|
1
|
+
{"version":3,"file":"solve-pipeline.js","sourceRoot":"","sources":["../../src/compute/solve-pipeline.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.
|
|
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;
|
|
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.
|
|
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
|
-
//
|
|
103
|
-
|
|
104
|
-
|
|
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.
|
|
3
|
+
"version": "0.2.0-beta.4",
|
|
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": {
|
|
@@ -8,67 +8,63 @@
|
|
|
8
8
|
},
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|
|
11
|
-
"url": "https://github.com/VektorNode/selva.git",
|
|
11
|
+
"url": "git+https://github.com/VektorNode/selva.git",
|
|
12
12
|
"directory": "packages/server"
|
|
13
13
|
},
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=22.0.0"
|
|
16
|
+
},
|
|
14
17
|
"type": "module",
|
|
15
18
|
"main": "./dist/index.js",
|
|
16
19
|
"types": "./dist/index.d.ts",
|
|
17
20
|
"exports": {
|
|
18
21
|
".": {
|
|
19
|
-
"source": "./src/index.ts",
|
|
20
22
|
"types": "./dist/index.d.ts",
|
|
21
23
|
"import": "./dist/index.js"
|
|
22
24
|
},
|
|
23
25
|
"./compute": {
|
|
24
|
-
"source": "./src/compute/index.ts",
|
|
25
26
|
"types": "./dist/compute/index.d.ts",
|
|
26
27
|
"import": "./dist/compute/index.js"
|
|
27
28
|
},
|
|
28
29
|
"./definitions": {
|
|
29
|
-
"source": "./src/definitions/index.ts",
|
|
30
30
|
"types": "./dist/definitions/index.d.ts",
|
|
31
31
|
"import": "./dist/definitions/index.js"
|
|
32
32
|
},
|
|
33
33
|
"./providers": {
|
|
34
|
-
"source": "./src/providers/index.ts",
|
|
35
34
|
"types": "./dist/providers/index.d.ts",
|
|
36
35
|
"import": "./dist/providers/index.js"
|
|
37
36
|
},
|
|
38
37
|
"./tokens": {
|
|
39
|
-
"source": "./src/tokens/index.ts",
|
|
40
38
|
"types": "./dist/tokens/index.d.ts",
|
|
41
39
|
"import": "./dist/tokens/index.js"
|
|
42
40
|
},
|
|
43
41
|
"./errors": {
|
|
44
|
-
"source": "./src/errors/index.ts",
|
|
45
42
|
"types": "./dist/errors/index.d.ts",
|
|
46
43
|
"import": "./dist/errors/index.js"
|
|
47
44
|
},
|
|
48
45
|
"./http": {
|
|
49
|
-
"source": "./src/http/index.ts",
|
|
50
46
|
"types": "./dist/http/index.d.ts",
|
|
51
47
|
"import": "./dist/http/index.js"
|
|
52
48
|
},
|
|
53
49
|
"./access": {
|
|
54
|
-
"source": "./src/access/index.ts",
|
|
55
50
|
"types": "./dist/access/index.d.ts",
|
|
56
51
|
"import": "./dist/access/index.js"
|
|
57
52
|
},
|
|
58
53
|
"./ops": {
|
|
59
|
-
"source": "./src/ops/index.ts",
|
|
60
54
|
"types": "./dist/ops/index.d.ts",
|
|
61
55
|
"import": "./dist/ops/index.js"
|
|
62
56
|
}
|
|
63
57
|
},
|
|
64
58
|
"files": [
|
|
65
59
|
"dist",
|
|
66
|
-
"
|
|
60
|
+
"!**/__tests__/**",
|
|
61
|
+
"!**/*.test.*",
|
|
62
|
+
"!**/*.spec.*"
|
|
67
63
|
],
|
|
68
64
|
"dependencies": {
|
|
69
|
-
"@selvajs/compute": "^3.1.0-beta.
|
|
70
|
-
"@selvajs/platform": "0.
|
|
71
|
-
"@selvajs/schemas": "4.7.0-beta.0"
|
|
65
|
+
"@selvajs/compute": "^3.1.0-beta.11",
|
|
66
|
+
"@selvajs/platform": "^0.15.0-beta.1",
|
|
67
|
+
"@selvajs/schemas": "^4.7.0-beta.0"
|
|
72
68
|
},
|
|
73
69
|
"peerDependencies": {
|
|
74
70
|
"@sentry/node": ">=8"
|
|
@@ -79,9 +75,9 @@
|
|
|
79
75
|
}
|
|
80
76
|
},
|
|
81
77
|
"devDependencies": {
|
|
82
|
-
"@types/node": "^22.
|
|
83
|
-
"typescript": "^
|
|
84
|
-
"vitest": "^3.2.
|
|
78
|
+
"@types/node": "^22.20.1",
|
|
79
|
+
"typescript": "^6.0.3",
|
|
80
|
+
"vitest": "^3.2.7"
|
|
85
81
|
},
|
|
86
82
|
"scripts": {
|
|
87
83
|
"build": "tsc",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"project-access-input.test.d.ts","sourceRoot":"","sources":["../../../src/access/__tests__/project-access-input.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { createProjectAccessInputBuilder } from '../project-access-input.js';
|
|
3
|
-
const CTX = {
|
|
4
|
-
userId: 'user-1',
|
|
5
|
-
actingOrgId: 'org-1',
|
|
6
|
-
platformPermissions: ['manage_compute'],
|
|
7
|
-
orgPermissions: ['manage_org_members']
|
|
8
|
-
};
|
|
9
|
-
function project(visibility) {
|
|
10
|
-
return {
|
|
11
|
-
id: 'proj-1',
|
|
12
|
-
orgId: 'org-1',
|
|
13
|
-
name: 'P',
|
|
14
|
-
slug: 'p',
|
|
15
|
-
visibility,
|
|
16
|
-
ownerId: 'user-9',
|
|
17
|
-
createdBy: 'user-9',
|
|
18
|
-
updatedBy: 'user-9',
|
|
19
|
-
autoJoinOnUpload: false,
|
|
20
|
-
createdAt: '2026-01-01T00:00:00Z',
|
|
21
|
-
updatedAt: '2026-01-01T00:00:00Z'
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
// Row identity is all the builder consumes — it passes rows through opaquely.
|
|
25
|
-
const MEMBER = {
|
|
26
|
-
projectId: 'proj-1',
|
|
27
|
-
userId: 'user-1',
|
|
28
|
-
role: 'editor'
|
|
29
|
-
};
|
|
30
|
-
const ORG_MEMBER = {
|
|
31
|
-
orgId: 'org-1',
|
|
32
|
-
userId: 'user-1',
|
|
33
|
-
role: 'member'
|
|
34
|
-
};
|
|
35
|
-
const GRANT = {
|
|
36
|
-
projectId: 'proj-1',
|
|
37
|
-
orgId: 'org-2',
|
|
38
|
-
canSolve: true
|
|
39
|
-
};
|
|
40
|
-
function makeDeps(flags = {}) {
|
|
41
|
-
return {
|
|
42
|
-
getProjectMember: vi.fn().mockResolvedValue(MEMBER),
|
|
43
|
-
getOrgMember: vi.fn().mockResolvedValue(ORG_MEMBER),
|
|
44
|
-
listPlatformGrants: vi.fn().mockResolvedValue([GRANT]),
|
|
45
|
-
flags: vi.fn().mockReturnValue({
|
|
46
|
-
allowCrossOrgPublic: false,
|
|
47
|
-
enablePlatformProjects: false,
|
|
48
|
-
...flags
|
|
49
|
-
})
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
describe('buildProjectAccessInput — per-visibility row fetching', () => {
|
|
53
|
-
it('private: fetches only the project member row', async () => {
|
|
54
|
-
const deps = makeDeps();
|
|
55
|
-
const builder = createProjectAccessInputBuilder(deps);
|
|
56
|
-
const input = await builder.buildProjectAccessInput(CTX, project('private'));
|
|
57
|
-
expect(input.member).toEqual(MEMBER);
|
|
58
|
-
expect(input.orgMember).toBeNull();
|
|
59
|
-
expect(input.platformGrants).toEqual([]);
|
|
60
|
-
expect(deps.getOrgMember).not.toHaveBeenCalled();
|
|
61
|
-
expect(deps.listPlatformGrants).not.toHaveBeenCalled();
|
|
62
|
-
});
|
|
63
|
-
it.each(['org', 'public'])('%s: fetches project member + org member', async (vis) => {
|
|
64
|
-
const deps = makeDeps();
|
|
65
|
-
const builder = createProjectAccessInputBuilder(deps);
|
|
66
|
-
const input = await builder.buildProjectAccessInput(CTX, project(vis));
|
|
67
|
-
expect(input.member).toEqual(MEMBER);
|
|
68
|
-
expect(input.orgMember).toEqual(ORG_MEMBER);
|
|
69
|
-
expect(deps.getOrgMember).toHaveBeenCalledWith(CTX, 'org-1', 'user-1');
|
|
70
|
-
});
|
|
71
|
-
it('public + ALLOW_CROSS_ORG_PUBLIC: skips the org member row', async () => {
|
|
72
|
-
const deps = makeDeps({ allowCrossOrgPublic: true });
|
|
73
|
-
const builder = createProjectAccessInputBuilder(deps);
|
|
74
|
-
const input = await builder.buildProjectAccessInput(CTX, project('public'));
|
|
75
|
-
expect(input.member).toEqual(MEMBER);
|
|
76
|
-
expect(input.orgMember).toBeNull();
|
|
77
|
-
expect(deps.getOrgMember).not.toHaveBeenCalled();
|
|
78
|
-
});
|
|
79
|
-
it('org visibility still fetches the org row when cross-org public is on', async () => {
|
|
80
|
-
const deps = makeDeps({ allowCrossOrgPublic: true });
|
|
81
|
-
const builder = createProjectAccessInputBuilder(deps);
|
|
82
|
-
const input = await builder.buildProjectAccessInput(CTX, project('org'));
|
|
83
|
-
expect(input.orgMember).toEqual(ORG_MEMBER);
|
|
84
|
-
});
|
|
85
|
-
it('platform + flag on: fetches grants only', async () => {
|
|
86
|
-
const deps = makeDeps({ enablePlatformProjects: true });
|
|
87
|
-
const builder = createProjectAccessInputBuilder(deps);
|
|
88
|
-
const input = await builder.buildProjectAccessInput(CTX, project('platform'));
|
|
89
|
-
expect(input.platformGrants).toEqual([GRANT]);
|
|
90
|
-
expect(input.member).toBeNull();
|
|
91
|
-
expect(deps.getProjectMember).not.toHaveBeenCalled();
|
|
92
|
-
expect(deps.getOrgMember).not.toHaveBeenCalled();
|
|
93
|
-
});
|
|
94
|
-
it('platform + flag off: skips the grant lookup entirely (feature disabled stays cheap)', async () => {
|
|
95
|
-
const deps = makeDeps({ enablePlatformProjects: false });
|
|
96
|
-
const builder = createProjectAccessInputBuilder(deps);
|
|
97
|
-
const input = await builder.buildProjectAccessInput(CTX, project('platform'));
|
|
98
|
-
expect(input.platformGrants).toEqual([]);
|
|
99
|
-
expect(deps.listPlatformGrants).not.toHaveBeenCalled();
|
|
100
|
-
});
|
|
101
|
-
it('threads ctx fields and flags into the input, with overrides winning', async () => {
|
|
102
|
-
const deps = makeDeps({ allowCrossOrgPublic: true });
|
|
103
|
-
const builder = createProjectAccessInputBuilder(deps);
|
|
104
|
-
const input = await builder.buildProjectAccessInput(CTX, project('private'), {
|
|
105
|
-
member: null
|
|
106
|
-
});
|
|
107
|
-
expect(input.userId).toBe('user-1');
|
|
108
|
-
expect(input.actingOrgId).toBe('org-1');
|
|
109
|
-
expect(input.orgPermissions).toEqual(CTX.orgPermissions);
|
|
110
|
-
expect(input.platformPermissions).toEqual(CTX.platformPermissions);
|
|
111
|
-
expect(input.allowCrossOrgPublic).toBe(true);
|
|
112
|
-
expect(input.member).toBeNull(); // override beat the fetched row
|
|
113
|
-
});
|
|
114
|
-
it('reads flags per call, not at builder creation', async () => {
|
|
115
|
-
const deps = makeDeps();
|
|
116
|
-
const builder = createProjectAccessInputBuilder(deps);
|
|
117
|
-
await builder.buildProjectAccessInput(CTX, project('private'));
|
|
118
|
-
deps.flags.mockReturnValue({ allowCrossOrgPublic: true, enablePlatformProjects: true });
|
|
119
|
-
const input = await builder.buildProjectAccessInput(CTX, project('private'));
|
|
120
|
-
expect(input.enablePlatformProjects).toBe(true);
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
describe('projectAccessInputFromRows', () => {
|
|
124
|
-
it('assembles from caller rows with zero I/O', () => {
|
|
125
|
-
const deps = makeDeps();
|
|
126
|
-
const builder = createProjectAccessInputBuilder(deps);
|
|
127
|
-
const input = builder.projectAccessInputFromRows(CTX, project('org'), {
|
|
128
|
-
member: MEMBER,
|
|
129
|
-
orgMember: ORG_MEMBER
|
|
130
|
-
});
|
|
131
|
-
expect(input.member).toEqual(MEMBER);
|
|
132
|
-
expect(input.orgMember).toEqual(ORG_MEMBER);
|
|
133
|
-
expect(input.platformGrants).toEqual([]);
|
|
134
|
-
expect(deps.getProjectMember).not.toHaveBeenCalled();
|
|
135
|
-
expect(deps.getOrgMember).not.toHaveBeenCalled();
|
|
136
|
-
expect(deps.listPlatformGrants).not.toHaveBeenCalled();
|
|
137
|
-
});
|
|
138
|
-
it('defaults omitted rows to null/empty', () => {
|
|
139
|
-
const builder = createProjectAccessInputBuilder(makeDeps());
|
|
140
|
-
const input = builder.projectAccessInputFromRows(CTX, project('private'), {});
|
|
141
|
-
expect(input.member).toBeNull();
|
|
142
|
-
expect(input.orgMember).toBeNull();
|
|
143
|
-
expect(input.platformGrants).toEqual([]);
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
//# sourceMappingURL=project-access-input.test.js.map
|