@selvajs/server 1.0.0-beta.0 → 1.0.0-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,8 +4,8 @@ Transport-agnostic server building blocks for apps built on the Selva engine: li
4
4
  limiting, SSRF guard, definition service, render loader, and structured logging. Consumed by
5
5
  `@selvajs/selva`; not tied to SvelteKit or any specific HTTP framework.
6
6
 
7
- **The solve core lives in [`@selvajs/solve/server`](../solve/README.md)** — pipeline, L2 result
8
- cache, single-flight, client and definition-byte caches. This package does not re-export it and does
7
+ **The solve core lives in [`@selvajs/solve/server`](../solve/README.md)** — pipeline, result cache,
8
+ single-flight, client and definition-byte caches. This package does not re-export it and does
9
9
  not depend on it. What stays here is HTTP _request policy_, which is a different job from running a
10
10
  solve.
11
11
 
@@ -13,7 +13,7 @@ Logging follows the same rule as the rest of the package: nothing here logs unle
13
13
  it. Modules that emit diagnostics take an optional `logger?: ILogger` and default to
14
14
  `NoopLogger`, so an embedder that wires nothing gets silence rather than unsolicited stdout
15
15
  writes. `@selvajs/server/logging` provides a pino-backed implementation (`createLogger`);
16
- `pino` is an **optional** peer dependency, and without it `createLogger` degrades to a
16
+ `pino` is an **optional** peer dependency, and without it `createLogger` falls back to a
17
17
  console-backed logger rather than failing.
18
18
 
19
19
  ## Install
@@ -33,7 +33,7 @@ hid which slice a consumer actually depended on; nothing in this repo used it.
33
33
  | `@selvajs/server/compute` | Compute limits, rate limiting, SSRF guard, remote-definition fetch |
34
34
  | `@selvajs/server/definitions` | Definition service + render loader |
35
35
  | `@selvajs/server/providers` | Provider composition helpers |
36
- | `@selvajs/server/tokens` | API token (PAT) codec |
36
+ | `@selvajs/server/tokens` | Mints and verifies personal API tokens |
37
37
  | `@selvajs/server/errors` | Shared error types |
38
38
  | `@selvajs/server/logging` | pino-backed `ILogger` + request-id correlation |
39
39
  | `@selvajs/server/http` | Security headers, request limits, route classification |
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Idempotency store for the solve endpoint: a repeat of the same request within
3
+ * the TTL replays the first response instead of re-solving.
4
+ *
5
+ * **This absorbs client retries; it is not a result cache.** The TTL is short
6
+ * and the store is process-local, so a retry that lands on another instance
7
+ * (or after the TTL) re-solves. That is acceptable — a duplicate solve costs
8
+ * compute, not correctness. What it must never do is return one caller's result
9
+ * to another, hence the caller identity in the key.
10
+ *
11
+ * Concurrency matters more than the hit rate. A client that retries on timeout
12
+ * usually retries *while the first solve is still running*, so the store holds a
13
+ * **promise**, reserved before the work starts: the second request awaits the
14
+ * first rather than starting a second solve. A reservation that rejects is
15
+ * dropped, so a failed solve is retryable rather than a cached error.
16
+ *
17
+ * Bounded the same way as the rate limiter: amortized sweep plus a hard cap, both
18
+ * driven by `run` rather than a timer — a timer would keep the event loop alive
19
+ * and give this module a lifecycle its callers don't have.
20
+ */
21
+ export interface IdempotencyStoreConfig {
22
+ /** How long a completed response stays replayable, in ms. */
23
+ ttlMs: number;
24
+ /**
25
+ * Max retained entries. Once live entries exceed this, the ones nearest
26
+ * expiry are evicted. Evicting only costs a re-solve on a retry, so size this
27
+ * above the plausible number of in-flight + recent keys.
28
+ */
29
+ maxKeys?: number;
30
+ /**
31
+ * How often (ms) to sweep expired entries, amortized onto `run`. Defaults to
32
+ * `ttlMs`. `0` disables the sweep, leaving only the cap (test seam).
33
+ */
34
+ sweepIntervalMs?: number;
35
+ }
36
+ /** Default {@link IdempotencyStoreConfig.maxKeys}. */
37
+ export declare const DEFAULT_IDEMPOTENCY_MAX_KEYS = 10000;
38
+ export interface IdempotencyOutcome<T> {
39
+ value: T;
40
+ /** True when this call awaited an existing entry rather than running `fn`. */
41
+ replayed: boolean;
42
+ }
43
+ export interface IdempotencyStore<T> {
44
+ /**
45
+ * Run `fn` under `key`, or join/replay the entry already stored there.
46
+ *
47
+ * The entry is reserved before `fn` starts, so a concurrent retry awaits the
48
+ * first run instead of starting its own. A rejection drops the reservation.
49
+ */
50
+ run(key: string, fn: () => Promise<T>): Promise<IdempotencyOutcome<T>>;
51
+ /** Test seam — wipes in-memory state. Production code never calls this. */
52
+ reset(): void;
53
+ /** Retained entry count, including any not yet swept. For tests/observability. */
54
+ size(): number;
55
+ readonly config: Readonly<IdempotencyStoreConfig>;
56
+ }
57
+ /**
58
+ * Build a process-local idempotency store. `T` is whatever the caller replays;
59
+ * the solve route stores a serialized response snapshot rather than a `Response`,
60
+ * because a `Response` body can only be read once.
61
+ */
62
+ export declare function createIdempotencyStore<T>(config: IdempotencyStoreConfig): IdempotencyStore<T>;
63
+ //# sourceMappingURL=idempotency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotency.d.ts","sourceRoot":"","sources":["../../src/compute/idempotency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,WAAW,sBAAsB;IACtC,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,sDAAsD;AACtD,eAAO,MAAM,4BAA4B,QAAS,CAAC;AAEnD,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACpC,KAAK,EAAE,CAAC,CAAC;IACT,8EAA8E;IAC9E,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC;IAClC;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,2EAA2E;IAC3E,KAAK,IAAI,IAAI,CAAC;IACd,kFAAkF;IAClF,IAAI,IAAI,MAAM,CAAC;IACf,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC;CAClD;AAYD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,MAAM,EAAE,sBAAsB,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAwE7F"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Idempotency store for the solve endpoint: a repeat of the same request within
3
+ * the TTL replays the first response instead of re-solving.
4
+ *
5
+ * **This absorbs client retries; it is not a result cache.** The TTL is short
6
+ * and the store is process-local, so a retry that lands on another instance
7
+ * (or after the TTL) re-solves. That is acceptable — a duplicate solve costs
8
+ * compute, not correctness. What it must never do is return one caller's result
9
+ * to another, hence the caller identity in the key.
10
+ *
11
+ * Concurrency matters more than the hit rate. A client that retries on timeout
12
+ * usually retries *while the first solve is still running*, so the store holds a
13
+ * **promise**, reserved before the work starts: the second request awaits the
14
+ * first rather than starting a second solve. A reservation that rejects is
15
+ * dropped, so a failed solve is retryable rather than a cached error.
16
+ *
17
+ * Bounded the same way as the rate limiter: amortized sweep plus a hard cap, both
18
+ * driven by `run` rather than a timer — a timer would keep the event loop alive
19
+ * and give this module a lifecycle its callers don't have.
20
+ */
21
+ /** Default {@link IdempotencyStoreConfig.maxKeys}. */
22
+ export const DEFAULT_IDEMPOTENCY_MAX_KEYS = 10_000;
23
+ /**
24
+ * Build a process-local idempotency store. `T` is whatever the caller replays;
25
+ * the solve route stores a serialized response snapshot rather than a `Response`,
26
+ * because a `Response` body can only be read once.
27
+ */
28
+ export function createIdempotencyStore(config) {
29
+ const ttlMs = Math.max(0, Math.floor(config.ttlMs));
30
+ const maxKeys = Math.max(1, Math.floor(config.maxKeys ?? DEFAULT_IDEMPOTENCY_MAX_KEYS));
31
+ const sweepIntervalMs = Math.max(0, Math.floor(config.sweepIntervalMs ?? ttlMs));
32
+ const resolvedConfig = Object.freeze({
33
+ ...config,
34
+ ttlMs,
35
+ maxKeys,
36
+ sweepIntervalMs
37
+ });
38
+ const entries = new Map();
39
+ let nextSweepAt = Number.POSITIVE_INFINITY;
40
+ function maybeSweep(now, headroom = 0) {
41
+ const budget = Math.max(0, maxKeys - headroom);
42
+ const dueForSweep = sweepIntervalMs > 0 && now >= nextSweepAt;
43
+ if (!dueForSweep && entries.size <= budget)
44
+ return;
45
+ for (const [key, entry] of entries) {
46
+ if (entry.expiresAt !== null && now > entry.expiresAt)
47
+ entries.delete(key);
48
+ }
49
+ if (sweepIntervalMs > 0)
50
+ nextSweepAt = now + sweepIntervalMs;
51
+ if (entries.size > budget) {
52
+ // In-flight entries sort last: evicting one would orphan the retries
53
+ // awaiting it, so they are given up only when nothing else is left.
54
+ const byExpiryAsc = [...entries.entries()].sort((a, b) => (a[1].expiresAt ?? Infinity) - (b[1].expiresAt ?? Infinity));
55
+ for (let i = 0; i < byExpiryAsc.length - budget; i++)
56
+ entries.delete(byExpiryAsc[i][0]);
57
+ }
58
+ }
59
+ return {
60
+ config: resolvedConfig,
61
+ async run(key, fn) {
62
+ const now = Date.now();
63
+ const existing = entries.get(key);
64
+ if (existing && (existing.expiresAt === null || now <= existing.expiresAt)) {
65
+ return { value: await existing.promise, replayed: true };
66
+ }
67
+ maybeSweep(now, entries.has(key) ? 0 : 1);
68
+ const promise = fn();
69
+ const entry = { promise, expiresAt: null };
70
+ entries.set(key, entry);
71
+ if (sweepIntervalMs > 0 && nextSweepAt === Number.POSITIVE_INFINITY) {
72
+ nextSweepAt = now + sweepIntervalMs;
73
+ }
74
+ try {
75
+ const value = await promise;
76
+ entry.expiresAt = Date.now() + ttlMs;
77
+ return { value, replayed: false };
78
+ }
79
+ catch (err) {
80
+ // A failed solve is retryable — drop the reservation rather than
81
+ // replaying the error to every retry for the whole TTL. Only drop our
82
+ // own entry: a later `run` may already have replaced it.
83
+ if (entries.get(key) === entry)
84
+ entries.delete(key);
85
+ throw err;
86
+ }
87
+ },
88
+ reset() {
89
+ entries.clear();
90
+ nextSweepAt = Number.POSITIVE_INFINITY;
91
+ },
92
+ size() {
93
+ return entries.size;
94
+ }
95
+ };
96
+ }
97
+ //# sourceMappingURL=idempotency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotency.js","sourceRoot":"","sources":["../../src/compute/idempotency.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  export { resolveComputeLimits, readPositiveInt, readNonNegativeInt, readBool, type ComputeLimits, type EnvRecord } from './limits.js';
2
2
  export { createComputeRateLimiter, DEFAULT_MAX_KEYS, type ComputeRateLimiter, type ComputeRateLimiterConfig, type RateLimitResult } from './rate-limit.js';
3
+ export { createIdempotencyStore, DEFAULT_IDEMPOTENCY_MAX_KEYS, type IdempotencyStore, type IdempotencyStoreConfig, type IdempotencyOutcome } from './idempotency.js';
3
4
  export { isSafeRemoteDefinitionUrl, assertSafeRemoteDefinitionUrl } from './safe-url.js';
4
5
  export { createRemoteDefinitionFetcher, readBodyWithCap, type RemoteDefinitionFetcher, type RemoteDefinitionConfig } from './remote-definition.js';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/compute/index.ts"],"names":[],"mappings":"AAaA,OAAO,EACN,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,QAAQ,EACR,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,MAAM,aAAa,CAAC;AAErB,OAAO,EACN,wBAAwB,EACxB,gBAAgB,EAChB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EACpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,yBAAyB,EAAE,6BAA6B,EAAE,MAAM,eAAe,CAAC;AAEzF,OAAO,EACN,6BAA6B,EAC7B,eAAe,EACf,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/compute/index.ts"],"names":[],"mappings":"AAaA,OAAO,EACN,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,QAAQ,EACR,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,MAAM,aAAa,CAAC;AAErB,OAAO,EACN,wBAAwB,EACxB,gBAAgB,EAChB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EACpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACN,sBAAsB,EACtB,4BAA4B,EAC5B,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,yBAAyB,EAAE,6BAA6B,EAAE,MAAM,eAAe,CAAC;AAEzF,OAAO,EACN,6BAA6B,EAC7B,eAAe,EACf,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,MAAM,wBAAwB,CAAC"}
@@ -12,6 +12,7 @@
12
12
  // depend on `@selvajs/solve`.
13
13
  export { resolveComputeLimits, readPositiveInt, readNonNegativeInt, readBool } from './limits.js';
14
14
  export { createComputeRateLimiter, DEFAULT_MAX_KEYS } from './rate-limit.js';
15
+ export { createIdempotencyStore, DEFAULT_IDEMPOTENCY_MAX_KEYS } from './idempotency.js';
15
16
  export { isSafeRemoteDefinitionUrl, assertSafeRemoteDefinitionUrl } from './safe-url.js';
16
17
  export { createRemoteDefinitionFetcher, readBodyWithCap } from './remote-definition.js';
17
18
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/compute/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,EAAE;AACF,kGAAkG;AAClG,mGAAmG;AACnG,oBAAoB;AACpB,EAAE;AACF,6FAA6F;AAC7F,qGAAqG;AACrG,mGAAmG;AACnG,oGAAoG;AACpG,kGAAkG;AAClG,8BAA8B;AAE9B,OAAO,EACN,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,QAAQ,EAGR,MAAM,aAAa,CAAC;AAErB,OAAO,EACN,wBAAwB,EACxB,gBAAgB,EAIhB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,yBAAyB,EAAE,6BAA6B,EAAE,MAAM,eAAe,CAAC;AAEzF,OAAO,EACN,6BAA6B,EAC7B,eAAe,EAGf,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/compute/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,EAAE;AACF,kGAAkG;AAClG,mGAAmG;AACnG,oBAAoB;AACpB,EAAE;AACF,6FAA6F;AAC7F,qGAAqG;AACrG,mGAAmG;AACnG,oGAAoG;AACpG,kGAAkG;AAClG,8BAA8B;AAE9B,OAAO,EACN,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,QAAQ,EAGR,MAAM,aAAa,CAAC;AAErB,OAAO,EACN,wBAAwB,EACxB,gBAAgB,EAIhB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACN,sBAAsB,EACtB,4BAA4B,EAI5B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,yBAAyB,EAAE,6BAA6B,EAAE,MAAM,eAAe,CAAC;AAEzF,OAAO,EACN,6BAA6B,EAC7B,eAAe,EAGf,MAAM,wBAAwB,CAAC"}
@@ -49,8 +49,8 @@ export interface ComputeLimits {
49
49
  * serverless platform cap may shoot the request sooner; bumping past those
50
50
  * caps produces 502s, not longer solves.
51
51
  */
52
- maxSolveDurationMs: number;
53
- /** Fixed-window cap on /api/compute: window length + max requests per window. */
52
+ solveDeadlineMs: number;
53
+ /** Fixed-window cap on /api/v1/compute: window length + max requests per window. */
54
54
  rateLimitWindowMs: number;
55
55
  rateLimitMaxRequests: number;
56
56
  /**
@@ -60,10 +60,10 @@ export interface ComputeLimits {
60
60
  * `RHINO_COMPUTE_MAX_REQUEST_SIZE` default: a larger file 413s at compute
61
61
  * regardless, so accepting it here only defers the failure.
62
62
  */
63
- maxGhFileSize: number;
63
+ maxDefinitionFileSize: number;
64
64
  maxImageFileSize: number;
65
65
  /**
66
- * /api/compute JSON *request* body cap (inputs + values, not the .gh). A
66
+ * /api/v1/compute JSON *request* body cap (inputs + values, not the .gh). A
67
67
  * `file`-widget input embeds geometry as base64 in `values`; must stay <=
68
68
  * the adapter-node global BODY_SIZE_LIMIT or the global backstop rejects first.
69
69
  * Defaults to 210 MB: the client allows a 150 MB raw file, base64 inflates it
@@ -72,7 +72,7 @@ export interface ComputeLimits {
72
72
  */
73
73
  computeRequestMaxBytes: number;
74
74
  /**
75
- * /api/compute JSON *response* cap. A `file`-typed output is base64-embedded
75
+ * /api/v1/compute JSON *response* cap. A `file`-typed output is base64-embedded
76
76
  * in the response; guards V8's ~512 MB single-string wall (a `JSON.stringify`
77
77
  * `RangeError`) and browser-tab OOM. Defensive backstop → clear 413 instead of
78
78
  * an opaque crash (real fix is out-of-band streaming, ADR 0003).
@@ -82,7 +82,7 @@ export interface ComputeLimits {
82
82
  * not bounded by BODY_SIZE_LIMIT, which only applies to inbound bodies.
83
83
  */
84
84
  computeResponseMaxBytes: number;
85
- /** Hard cap on fetching a remote definition — tracks `maxGhFileSize`. */
85
+ /** Hard cap on fetching a remote definition — tracks `maxDefinitionFileSize`. */
86
86
  remoteDefinitionMaxBytes: number;
87
87
  /** Deadline on fetching a remote definition (slow-loris protection). */
88
88
  remoteDefinitionFetchTimeoutMs: number;
@@ -116,33 +116,25 @@ export interface ComputeLimits {
116
116
  * honoring the flag. Conservative default off.
117
117
  */
118
118
  computeCacheErroredSolves: boolean;
119
- /**
120
- * Max in-flight solves this app instance sends to ONE compute server
121
- * (forwarded as the SolveScheduler's `maxConcurrent`; excess solves FIFO-queue).
122
- * Size it to the server's `compute.geometry` child count — Rhino.Compute
123
- * spawns N children per VM precisely to run N solves concurrently, and a
124
- * lower value idles that capacity while users queue (audit B6: the scheduler's
125
- * queue-mode default is 1, which serialized ALL solves per server). Multiple
126
- * app instances each apply their own cap.
127
- */
128
- computeMaxConcurrentSolves: number;
129
119
  /**
130
120
  * Backpressure — max solves allowed to WAIT in the per-server FIFO queue (i.e.
131
- * excluding the `computeMaxConcurrentSolves` already in flight). A solve that
132
- * arrives to a full queue is shed immediately (scheduler `QUEUE_FULL`, mapped
133
- * to HTTP 503 + `Retry-After`) instead of piling up unbounded. `0` = unbounded
134
- * (the pre-shedding default): the queue grows without limit, matching prior
135
- * behavior. Size it to roughly 2–3× `computeMaxConcurrentSolves` once the
136
- * Rhino pool's real capacity is known — shedding fast beats a hung request.
121
+ * excluding the in-flight solves, capped at the scheduler's `maxConcurrent`,
122
+ * itself auto-detected from the compute server's active child count). A solve
123
+ * that arrives to a full queue is rejected immediately (scheduler `QUEUE_FULL`,
124
+ * mapped to HTTP 503 + `Retry-After`) instead of piling up unbounded. `0` =
125
+ * unbounded (the pre-backpressure default): the queue grows without limit,
126
+ * matching prior behavior. Size it to roughly 2–3× the compute server's
127
+ * child count once the Rhino pool's real capacity is known — rejecting fast
128
+ * beats a hung request.
137
129
  */
138
130
  computeMaxQueueDepth: number;
139
131
  /**
140
132
  * Backpressure — longest (ms) a solve may sit QUEUED before it starts
141
- * executing; still-waiting past this it's shed (scheduler `QUEUE_TIMEOUT` →
133
+ * executing; still-waiting past this it's rejected (scheduler `QUEUE_TIMEOUT` →
142
134
  * HTTP 503 + `Retry-After`) rather than burning compute on a stale request.
143
135
  * Bounds tail latency: the scheduler's `timeoutMs` clock starts at execution,
144
136
  * so without this a solve's total wait is unbounded and invisible. `0` = no
145
- * queue deadline (the default). A sensible tuned value is ≈ `maxSolveDurationMs`.
137
+ * queue deadline (the default). A sensible tuned value is ≈ `solveDeadlineMs`.
146
138
  */
147
139
  computeQueueWaitMs: number;
148
140
  /**
@@ -161,7 +153,7 @@ export interface ComputeLimits {
161
153
  * disables it (every solve goes to compute). Env value is MB.
162
154
  *
163
155
  * **This is per warm client, so the worst case multiplies.** Selva keeps up to
164
- * `maxCachedClients` (default 16) distinct compute servers warm, so the true
156
+ * `maxWarmComputeServers` (default 16) distinct compute servers warm, so the true
165
157
  * ceiling is this × 16 — 4 GB at the default. Real deployments run 1–2 servers,
166
158
  * which is why the default is comfortable, but a deployment that fans out
167
159
  * across many servers on a small VPS is exactly the case this knob exists for.
@@ -1 +1 @@
1
- {"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../../src/compute/limits.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAI7D,gFAAgF;AAChF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAS3D;;;GAGG;AACH,wBAAgB,eAAe,CAC9B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,OAAc,GACpB,MAAM,CAcR;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CACjC,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,OAAc,GACpB,MAAM,CAcR;AAwBD;;;GAGG;AACH,wBAAgB,QAAQ,CACvB,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,EACjB,MAAM,GAAE,OAAc,GACpB,OAAO,CAaT;AAED,iDAAiD;AACjD,MAAM,WAAW,aAAa;IAC7B;;;;;;;;;OASG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iFAAiF;IACjF,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,MAAM,CAAC;IAC7B;;;;;;OAMG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;;;;;OAOG;IACH,sBAAsB,EAAE,MAAM,CAAC;IAC/B;;;;;;;;;OASG;IACH,uBAAuB,EAAE,MAAM,CAAC;IAChC,yEAAyE;IACzE,wBAAwB,EAAE,MAAM,CAAC;IACjC,wEAAwE;IACxE,8BAA8B,EAAE,MAAM,CAAC;IACvC;;;;;;;OAOG;IACH,0BAA0B,EAAE,MAAM,CAAC;IACnC;;;;;;OAMG;IACH,2BAA2B,EAAE,OAAO,CAAC;IACrC;;;;OAIG;IACH,uBAAuB,EAAE,OAAO,CAAC;IACjC;;;;;OAKG;IACH,yBAAyB,EAAE,OAAO,CAAC;IACnC;;;;;;;;OAQG;IACH,0BAA0B,EAAE,MAAM,CAAC;IACnC;;;;;;;;OAQG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAC7B;;;;;;;OAOG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAC3B;;;;;;OAMG;IACH,2BAA2B,EAAE,MAAM,CAAC;IACpC;;;;;;;;;;;;OAYG;IACH,sBAAsB,EAAE,MAAM,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,GAAE,OAAc,GAAG,aAAa,CAmD1F"}
1
+ {"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../../src/compute/limits.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAI7D,gFAAgF;AAChF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAS3D;;;GAGG;AACH,wBAAgB,eAAe,CAC9B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,OAAc,GACpB,MAAM,CAcR;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CACjC,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,OAAc,GACpB,MAAM,CAcR;AAwBD;;;GAGG;AACH,wBAAgB,QAAQ,CACvB,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,EACjB,MAAM,GAAE,OAAc,GACpB,OAAO,CAaT;AAED,iDAAiD;AACjD,MAAM,WAAW,aAAa;IAC7B;;;;;;;;;OASG;IACH,eAAe,EAAE,MAAM,CAAC;IACxB,oFAAoF;IACpF,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,MAAM,CAAC;IAC7B;;;;;;OAMG;IACH,qBAAqB,EAAE,MAAM,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;;;;;OAOG;IACH,sBAAsB,EAAE,MAAM,CAAC;IAC/B;;;;;;;;;OASG;IACH,uBAAuB,EAAE,MAAM,CAAC;IAChC,iFAAiF;IACjF,wBAAwB,EAAE,MAAM,CAAC;IACjC,wEAAwE;IACxE,8BAA8B,EAAE,MAAM,CAAC;IACvC;;;;;;;OAOG;IACH,0BAA0B,EAAE,MAAM,CAAC;IACnC;;;;;;OAMG;IACH,2BAA2B,EAAE,OAAO,CAAC;IACrC;;;;OAIG;IACH,uBAAuB,EAAE,OAAO,CAAC;IACjC;;;;;OAKG;IACH,yBAAyB,EAAE,OAAO,CAAC;IACnC;;;;;;;;;;OAUG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAC7B;;;;;;;OAOG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAC3B;;;;;;OAMG;IACH,2BAA2B,EAAE,MAAM,CAAC;IACpC;;;;;;;;;;;;OAYG;IACH,sBAAsB,EAAE,MAAM,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,GAAE,OAAc,GAAG,aAAa,CA0D1F"}
@@ -121,25 +121,27 @@ export function resolveComputeLimits(env, logger = noop) {
121
121
  env = readRenamed(env, 'COMPUTE_DEFINITION_CACHE_MB', 'COMPUTE_DEFINITION_BYTE_CACHE_MB', logger);
122
122
  env = readRenamed(env, 'COMPUTE_SOLVE_CACHE_MB', 'COMPUTE_RESPONSE_CACHE_MB', logger);
123
123
  env = readRenamed(env, 'REMOTE_DEFINITION_CACHE_TTL_MS', 'DEFINITION_CACHE_TTL_MS', logger);
124
- const maxGhFileSize = readPositiveInt(env, 'MAX_GH_FILE_SIZE_BYTES', 50 * MB, logger);
124
+ // Renamed 2026-08 into the COMPUTE_* namespace it belongs to, and to say what it
125
+ // bounds — one solve — rather than a vague "duration".
126
+ env = readRenamed(env, 'COMPUTE_SOLVE_DEADLINE_MS', 'MAX_SOLVE_DURATION_MS', logger);
127
+ // Intentional clean-cut rename (no old-name dual-read): pre-1.0 breaking change.
128
+ const maxDefinitionFileSize = readPositiveInt(env, 'MAX_DEFINITION_FILE_SIZE_BYTES', 50 * MB, logger);
125
129
  return {
126
- maxSolveDurationMs: readPositiveInt(env, 'MAX_SOLVE_DURATION_MS', 100_000, logger),
130
+ solveDeadlineMs: readPositiveInt(env, 'COMPUTE_SOLVE_DEADLINE_MS', 100_000, logger),
127
131
  rateLimitWindowMs: readPositiveInt(env, 'COMPUTE_RATE_LIMIT_WINDOW_MS', 100_000, logger),
128
132
  rateLimitMaxRequests: readPositiveInt(env, 'COMPUTE_RATE_LIMIT_MAX', 120, logger),
129
- maxGhFileSize,
133
+ maxDefinitionFileSize,
130
134
  maxImageFileSize: readPositiveInt(env, 'MAX_IMAGE_FILE_SIZE_BYTES', 10 * MB, logger),
131
135
  computeRequestMaxBytes: readPositiveInt(env, 'COMPUTE_REQUEST_MAX_BYTES', 210 * MB, logger),
132
136
  computeResponseMaxBytes: readPositiveInt(env, 'COMPUTE_RESPONSE_MAX_BYTES', 300 * MB, logger),
133
137
  // Tracks the upload cap so a remote URL can't smuggle a larger file.
134
- remoteDefinitionMaxBytes: maxGhFileSize,
138
+ remoteDefinitionMaxBytes: maxDefinitionFileSize,
135
139
  remoteDefinitionFetchTimeoutMs: readPositiveInt(env, 'REMOTE_DEFINITION_FETCH_TIMEOUT_MS', 30_000, logger),
136
140
  remoteDefinitionCacheTtlMs: readPositiveInt(env, 'REMOTE_DEFINITION_CACHE_TTL_MS', 5 * 60 * 1000, logger),
137
141
  computeReuseDefinitionCache: readBool(env, 'COMPUTE_REUSE_DEFINITION_CACHE', true, logger),
138
142
  computeServerCachesolve: readBool(env, 'COMPUTE_SERVER_CACHESOLVE', true, logger),
139
143
  computeCacheErroredSolves: readBool(env, 'COMPUTE_CACHE_ERRORED_SOLVES', false, logger),
140
- // 4 matches rhino.compute's default --childcount; tune to the actual VM.
141
- computeMaxConcurrentSolves: readPositiveInt(env, 'COMPUTE_MAX_CONCURRENT', 4, logger),
142
- // Both 0 (unbounded / no deadline) by default — nothing sheds until an
144
+ // Both 0 (unbounded / no deadline) by default — nothing is rejected until an
143
145
  // operator who's measured their pool opts in. readNonNegativeInt so `0` is a
144
146
  // valid "disabled" value, not treated as invalid.
145
147
  computeMaxQueueDepth: readNonNegativeInt(env, 'COMPUTE_MAX_QUEUE_DEPTH', 0, logger),
@@ -1 +1 @@
1
- {"version":3,"file":"limits.js","sourceRoot":"","sources":["../../src/compute/limits.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"limits.js","sourceRoot":"","sources":["../../src/compute/limits.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,UAAU,EAAgB,MAAM,mBAAmB,CAAC;AAE7D,MAAM,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAKvB;;;;GAIG;AACH,MAAM,IAAI,GAAG,IAAI,UAAU,EAAE,CAAC;AAE9B;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC9B,GAAc,EACd,IAAY,EACZ,QAAgB,EAChB,SAAkB,IAAI;IAEtB,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IACtB,IAAI,CAAC,GAAG;QAAE,OAAO,QAAQ,CAAC;IAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,4CAA4C,EAAE;YACzD,SAAS,EAAE,OAAO;YAClB,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,GAAG;YACV,QAAQ;SACR,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CACjC,GAAc,EACd,IAAY,EACZ,QAAgB,EAChB,SAAkB,IAAI;IAEtB,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IACtB,IAAI,CAAC,GAAG;QAAE,OAAO,QAAQ,CAAC;IAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,4CAA4C,EAAE;YACzD,SAAS,EAAE,OAAO;YAClB,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,GAAG;YACV,QAAQ;SACR,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,WAAW,CAAC,GAAc,EAAE,IAAY,EAAE,OAAe,EAAE,MAAe;IAClF,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IACtE,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE;QAC5C,SAAS,EAAE,OAAO;QAClB,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,IAAI;KACf,CAAC,CAAC;IACH,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CACvB,GAAc,EACd,IAAY,EACZ,QAAiB,EACjB,SAAkB,IAAI;IAEtB,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IACtB,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAC;IAC/C,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACnC,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACxE,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAC1E,MAAM,CAAC,IAAI,CAAC,4CAA4C,EAAE;QACzD,SAAS,EAAE,OAAO;QAClB,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,GAAG;QACV,QAAQ;KACR,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AACjB,CAAC;AA8HD;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAc,EAAE,SAAkB,IAAI;IAC1E,8EAA8E;IAC9E,4DAA4D;IAC5D,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,6BAA6B,EAAE,kCAAkC,EAAE,MAAM,CAAC,CAAC;IAClG,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,wBAAwB,EAAE,2BAA2B,EAAE,MAAM,CAAC,CAAC;IACtF,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,gCAAgC,EAAE,yBAAyB,EAAE,MAAM,CAAC,CAAC;IAC5F,iFAAiF;IACjF,uDAAuD;IACvD,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,MAAM,CAAC,CAAC;IAErF,iFAAiF;IACjF,MAAM,qBAAqB,GAAG,eAAe,CAC5C,GAAG,EACH,gCAAgC,EAChC,EAAE,GAAG,EAAE,EACP,MAAM,CACN,CAAC;IACF,OAAO;QACN,eAAe,EAAE,eAAe,CAAC,GAAG,EAAE,2BAA2B,EAAE,OAAO,EAAE,MAAM,CAAC;QACnF,iBAAiB,EAAE,eAAe,CAAC,GAAG,EAAE,8BAA8B,EAAE,OAAO,EAAE,MAAM,CAAC;QACxF,oBAAoB,EAAE,eAAe,CAAC,GAAG,EAAE,wBAAwB,EAAE,GAAG,EAAE,MAAM,CAAC;QACjF,qBAAqB;QACrB,gBAAgB,EAAE,eAAe,CAAC,GAAG,EAAE,2BAA2B,EAAE,EAAE,GAAG,EAAE,EAAE,MAAM,CAAC;QACpF,sBAAsB,EAAE,eAAe,CAAC,GAAG,EAAE,2BAA2B,EAAE,GAAG,GAAG,EAAE,EAAE,MAAM,CAAC;QAC3F,uBAAuB,EAAE,eAAe,CAAC,GAAG,EAAE,4BAA4B,EAAE,GAAG,GAAG,EAAE,EAAE,MAAM,CAAC;QAC7F,qEAAqE;QACrE,wBAAwB,EAAE,qBAAqB;QAC/C,8BAA8B,EAAE,eAAe,CAC9C,GAAG,EACH,oCAAoC,EACpC,MAAM,EACN,MAAM,CACN;QACD,0BAA0B,EAAE,eAAe,CAC1C,GAAG,EACH,gCAAgC,EAChC,CAAC,GAAG,EAAE,GAAG,IAAI,EACb,MAAM,CACN;QACD,2BAA2B,EAAE,QAAQ,CAAC,GAAG,EAAE,gCAAgC,EAAE,IAAI,EAAE,MAAM,CAAC;QAC1F,uBAAuB,EAAE,QAAQ,CAAC,GAAG,EAAE,2BAA2B,EAAE,IAAI,EAAE,MAAM,CAAC;QACjF,yBAAyB,EAAE,QAAQ,CAAC,GAAG,EAAE,8BAA8B,EAAE,KAAK,EAAE,MAAM,CAAC;QACvF,6EAA6E;QAC7E,6EAA6E;QAC7E,kDAAkD;QAClD,oBAAoB,EAAE,kBAAkB,CAAC,GAAG,EAAE,yBAAyB,EAAE,CAAC,EAAE,MAAM,CAAC;QACnF,kBAAkB,EAAE,kBAAkB,CAAC,GAAG,EAAE,uBAAuB,EAAE,CAAC,EAAE,MAAM,CAAC;QAC/E,mEAAmE;QACnE,wEAAwE;QACxE,uDAAuD;QACvD,2BAA2B,EAC1B,kBAAkB,CAAC,GAAG,EAAE,6BAA6B,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE;QACzE,wEAAwE;QACxE,sEAAsE;QACtE,yEAAyE;QACzE,4CAA4C;QAC5C,sBAAsB,EAAE,kBAAkB,CAAC,GAAG,EAAE,wBAAwB,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE;KAC3F,CAAC;AACH,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export { DefinitionService, type CreateDefinitionRecord } from './definition-service.js';
2
- export { fetchSchemaFromCompute, assertSupportedSchemaVersion, SchemaExtractionError } from './schema-extraction.js';
3
- export { createDefinitionLoader, DefinitionLoadError, type DefinitionChannel, type DefinitionLoader, type DefinitionLoaderDeps, type DefinitionLoadErrorKind, type LoadedDefinition } from './load-for-render.js';
2
+ export { fetchSchemaFromCompute, postSchemaFormData, assertSupportedSchemaVersion, readSchemaResults, SchemaExtractionError } from './schema-extraction.js';
3
+ export type { SchemaExtractionResult } from './schema-extraction.js';
4
+ export { createDefinitionLoader, DefinitionLoadError, type DefinitionChannel, type DefinitionLoader, type DefinitionLoaderDeps, type DefinitionLoadErrorKind, type DefinitionLoadOptions, type LoadedDefinition } from './load-for-render.js';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/definitions/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEzF,OAAO,EACN,sBAAsB,EACtB,4BAA4B,EAC5B,qBAAqB,EACrB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACN,sBAAsB,EACtB,mBAAmB,EACnB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/definitions/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEzF,OAAO,EACN,sBAAsB,EACtB,kBAAkB,EAClB,4BAA4B,EAC5B,iBAAiB,EACjB,qBAAqB,EACrB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAErE,OAAO,EACN,sBAAsB,EACtB,mBAAmB,EACnB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,MAAM,sBAAsB,CAAC"}
@@ -3,6 +3,6 @@
3
3
  // composition-root wiring (stores, warm-client cache, server resolution) is
4
4
  // injected; access gating stays with the calling app.
5
5
  export { DefinitionService } from './definition-service.js';
6
- export { fetchSchemaFromCompute, assertSupportedSchemaVersion, SchemaExtractionError } from './schema-extraction.js';
6
+ export { fetchSchemaFromCompute, postSchemaFormData, assertSupportedSchemaVersion, readSchemaResults, SchemaExtractionError } from './schema-extraction.js';
7
7
  export { createDefinitionLoader, DefinitionLoadError } from './load-for-render.js';
8
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/definitions/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,wEAAwE;AACxE,4EAA4E;AAC5E,sDAAsD;AAEtD,OAAO,EAAE,iBAAiB,EAA+B,MAAM,yBAAyB,CAAC;AAEzF,OAAO,EACN,sBAAsB,EACtB,4BAA4B,EAC5B,qBAAqB,EACrB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACN,sBAAsB,EACtB,mBAAmB,EAMnB,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/definitions/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,wEAAwE;AACxE,4EAA4E;AAC5E,sDAAsD;AAEtD,OAAO,EAAE,iBAAiB,EAA+B,MAAM,yBAAyB,CAAC;AAEzF,OAAO,EACN,sBAAsB,EACtB,kBAAkB,EAClB,4BAA4B,EAC5B,iBAAiB,EACjB,qBAAqB,EACrB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACN,sBAAsB,EACtB,mBAAmB,EAOnB,MAAM,sBAAsB,CAAC"}
@@ -55,7 +55,24 @@ export interface DefinitionLoaderDeps {
55
55
  */
56
56
  logger?: ILogger;
57
57
  }
58
- export type DefinitionLoader = (ctx: RequestContext, record: DefinitionRecord, channel: DefinitionChannel, explicitVersionId?: string | null) => Promise<LoadedDefinition>;
58
+ export interface DefinitionLoadOptions {
59
+ /**
60
+ * Skip the `getIO` round-trip that merges compute default *values* into the
61
+ * schema, when the cached schema on the version row is usable.
62
+ *
63
+ * A caller that reads only schema STRUCTURE (input ids, `source.key`, widget
64
+ * types — anything persisted at upload) does not need defaults, and paying a
65
+ * multi-second compute connect per definition to fetch them dominates a page
66
+ * that resolves several. With this set, a fresh cached schema returns without
67
+ * touching compute at all; a missing or stale-format cache still falls back to
68
+ * the full path, so the result is always a valid schema.
69
+ *
70
+ * Leave unset (the default) for anything that RENDERS a form — a form without
71
+ * compute defaults shows the wrong initial values.
72
+ */
73
+ skipComputeDefaults?: boolean;
74
+ }
75
+ export type DefinitionLoader = (ctx: RequestContext, record: DefinitionRecord, channel: DefinitionChannel, explicitVersionId?: string | null, options?: DefinitionLoadOptions) => Promise<LoadedDefinition>;
59
76
  /**
60
77
  * Build a definition loader over the injected stores/compute wiring.
61
78
  *
@@ -1 +1 @@
1
- {"version":3,"file":"load-for-render.d.ts","sourceRoot":"","sources":["../../src/definitions/load-for-render.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,KAAK,EACX,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAG7D,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,gBAAgB,EAAE,UAAU,CAAC;IAC7B,aAAa,EAAE,mBAAmB,CAAC;IACnC,MAAM,EAAE,QAAQ,CAAC;CACjB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,gBAAgB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEvF,qBAAa,mBAAoB,SAAQ,KAAK;aAE5B,IAAI,EAAE,uBAAuB;aAE7B,KAAK,CAAC,EAAE,OAAO;gBAFf,IAAI,EAAE,uBAAuB,EAC7C,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,OAAO,YAAA;CAKhC;AAED,MAAM,WAAW,oBAAoB;IACpC,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;IACvC,WAAW,EAAE,IAAI,CAAC,gBAAgB,EAAE,YAAY,GAAG,kBAAkB,CAAC,CAAC;IACvE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC5C,mFAAmF;IACnF,aAAa,EAAE,CACd,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,IAAI,EAAE;QAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KAClC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAClC,gGAAgG;IAChG,SAAS,EAAE,CACV,MAAM,EAAE,mBAAmB,EAC3B,IAAI,EAAE;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,KAC5B,OAAO,CAAC;QAAE,MAAM,EAAE,iBAAiB,CAAA;KAAE,CAAC,CAAC;IAC5C,qFAAqF;IACrF,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,mBAAmB,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpF;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,gBAAgB,GAAG,CAC9B,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,iBAAiB,EAC1B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,KAC7B,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAE/B;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,oBAAoB,GAAG,gBAAgB,CAgKnF"}
1
+ {"version":3,"file":"load-for-render.d.ts","sourceRoot":"","sources":["../../src/definitions/load-for-render.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,KAAK,EACX,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAG7D,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,gBAAgB,EAAE,UAAU,CAAC;IAC7B,aAAa,EAAE,mBAAmB,CAAC;IACnC,MAAM,EAAE,QAAQ,CAAC;CACjB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,gBAAgB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEvF,qBAAa,mBAAoB,SAAQ,KAAK;aAE5B,IAAI,EAAE,uBAAuB;aAE7B,KAAK,CAAC,EAAE,OAAO;gBAFf,IAAI,EAAE,uBAAuB,EAC7C,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,OAAO,YAAA;CAKhC;AAED,MAAM,WAAW,oBAAoB;IACpC,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;IACvC,WAAW,EAAE,IAAI,CAAC,gBAAgB,EAAE,YAAY,GAAG,kBAAkB,CAAC,CAAC;IACvE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC5C,mFAAmF;IACnF,aAAa,EAAE,CACd,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,IAAI,EAAE;QAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KAClC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAClC,gGAAgG;IAChG,SAAS,EAAE,CACV,MAAM,EAAE,mBAAmB,EAC3B,IAAI,EAAE;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,KAC5B,OAAO,CAAC;QAAE,MAAM,EAAE,iBAAiB,CAAA;KAAE,CAAC,CAAC;IAC5C,qFAAqF;IACrF,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,mBAAmB,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpF;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACrC;;;;;;;;;;;;;OAaG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,MAAM,gBAAgB,GAAG,CAC9B,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,iBAAiB,EAC1B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,EACjC,OAAO,CAAC,EAAE,qBAAqB,KAC3B,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAE/B;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,oBAAoB,GAAG,gBAAgB,CA2KnF"}
@@ -34,7 +34,7 @@ export class DefinitionLoadError extends Error {
34
34
  */
35
35
  export function createDefinitionLoader(deps) {
36
36
  const { storage, definitions, projects, resolveServer, getClient, fetchSchema = fetchSchemaFromCompute, computeDebug = false, onWarn, logger = new NoopLogger() } = deps;
37
- return async function loadDefinitionForRender(ctx, record, channel, explicitVersionId) {
37
+ return async function loadDefinitionForRender(ctx, record, channel, explicitVersionId, options) {
38
38
  const versionId = explicitVersionId ?? (channel === 'draft' ? record.draftVersionId : record.liveVersionId);
39
39
  if (!versionId)
40
40
  throw new DefinitionLoadError('data', `Definition '${record.guid}' has no ${channel} version`);
@@ -57,6 +57,16 @@ export function createDefinitionLoader(deps) {
57
57
  catch (err) {
58
58
  throw new DefinitionLoadError('missing-config', 'No compute server configured for this definition', err);
59
59
  }
60
+ // Structure-only callers stop here: a fresh cached schema is everything they
61
+ // need, and returning before `getClient` is the point — the connect is the
62
+ // multi-second cost, not the `getIO` call it carries. A missing or
63
+ // stale-format cache falls through to the full path below.
64
+ if (options?.skipComputeDefaults) {
65
+ const cachedSchema = version.schema;
66
+ if (cachedSchema && cachedSchema.schemaVersion === UI_SCHEMA_VERSION) {
67
+ return { version, definitionSource, computeServer, schema: cachedSchema };
68
+ }
69
+ }
60
70
  // Only the client is used here (getIO); the entry's solve scheduler rides
61
71
  // along unused.
62
72
  let client;
@@ -1 +1 @@
1
- {"version":3,"file":"load-for-render.js","sourceRoot":"","sources":["../../src/definitions/load-for-render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"load-for-render.js","sourceRoot":"","sources":["../../src/definitions/load-for-render.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,10 @@
1
+ import { type SchemaEndpointResult } from '@selvajs/compute/grasshopper';
1
2
  import { type UISchema } from '@selvajs/schemas';
2
3
  import type { ComputeServerConfig } from '@selvajs/platform';
4
+ /** One entry of the compute schema endpoint's response, typed to our `UISchema`. */
5
+ export type SchemaExtractionResult = SchemaEndpointResult<UISchema>;
6
+ /** Read compute's schema-endpoint body, typed to `UISchema`. See {@link readSchemaResults}. */
7
+ export declare function readSchemaResults(raw: unknown): SchemaExtractionResult[];
3
8
  /** Thrown when compute is reachable but the definition yields no usable schema. */
4
9
  export declare class SchemaExtractionError extends Error {
5
10
  readonly kind: 'unreachable' | 'invalid' | 'unsupported';
@@ -13,6 +18,14 @@ export declare class SchemaExtractionError extends Error {
13
18
  * optional additions.
14
19
  */
15
20
  export declare function assertSupportedSchemaVersion(schema: UISchema): void;
21
+ /**
22
+ * POST a multipart form to Rhino Compute's `/grasshopper/schema` endpoint (no
23
+ * solve required) and return the per-file results. Throws `SchemaExtractionError`
24
+ * ('unreachable') on a network failure or non-2xx — the per-file `error` field
25
+ * Compute reports on its 200-with-no-schemas case is left for the caller to
26
+ * diagnose, since single-file and multi-file callers want different messages.
27
+ */
28
+ export declare function postSchemaFormData(formData: FormData, server: ComputeServerConfig): Promise<SchemaExtractionResult[]>;
16
29
  /**
17
30
  * Fetch the UI schema from Rhino Compute's `/grasshopper/schema` endpoint (no
18
31
  * solve required). Throws `SchemaExtractionError` so callers can map to the
@@ -1 +1 @@
1
- {"version":3,"file":"schema-extraction.d.ts","sourceRoot":"","sources":["../../src/definitions/schema-extraction.ts"],"names":[],"mappings":"AAUA,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,mFAAmF;AACnF,qBAAa,qBAAsB,SAAQ,KAAK;aAE9B,IAAI,EAAE,aAAa,GAAG,SAAS,GAAG,aAAa;gBAA/C,IAAI,EAAE,aAAa,GAAG,SAAS,GAAG,aAAa,EAC/D,OAAO,EAAE,MAAM;CAKhB;AAOD;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,CAmBnE;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC3C,eAAe,EAAE,UAAU,EAC3B,MAAM,EAAE,mBAAmB,GACzB,OAAO,CAAC,QAAQ,CAAC,CA6DnB"}
1
+ {"version":3,"file":"schema-extraction.d.ts","sourceRoot":"","sources":["../../src/definitions/schema-extraction.ts"],"names":[],"mappings":"AASA,OAAO,EAEN,KAAK,oBAAoB,EACzB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,oFAAoF;AACpF,MAAM,MAAM,sBAAsB,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;AAEpE,+FAA+F;AAC/F,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,sBAAsB,EAAE,CAExE;AAED,mFAAmF;AACnF,qBAAa,qBAAsB,SAAQ,KAAK;aAE9B,IAAI,EAAE,aAAa,GAAG,SAAS,GAAG,aAAa;gBAA/C,IAAI,EAAE,aAAa,GAAG,SAAS,GAAG,aAAa,EAC/D,OAAO,EAAE,MAAM;CAKhB;AAOD;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,CAmBnE;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACvC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,mBAAmB,GACzB,OAAO,CAAC,sBAAsB,EAAE,CAAC,CA0BnC;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC3C,eAAe,EAAE,UAAU,EAC3B,MAAM,EAAE,mBAAmB,GACzB,OAAO,CAAC,QAAQ,CAAC,CA4BnB"}
@@ -6,8 +6,12 @@
6
6
  //
7
7
  // Extraction IS validation: a `.gh` with no valid "Schema" output, or an
8
8
  // unreachable compute server, throws here and the caller rejects the upload.
9
- import { camelcaseKeys } from '@selvajs/compute/core';
9
+ import { readSchemaResults as readWrapper } from '@selvajs/compute/grasshopper';
10
10
  import { UI_SCHEMA_VERSION } from '@selvajs/schemas';
11
+ /** Read compute's schema-endpoint body, typed to `UISchema`. See {@link readSchemaResults}. */
12
+ export function readSchemaResults(raw) {
13
+ return readWrapper(raw);
14
+ }
11
15
  /** Thrown when compute is reachable but the definition yields no usable schema. */
12
16
  export class SchemaExtractionError extends Error {
13
17
  kind;
@@ -47,15 +51,14 @@ export function assertSupportedSchemaVersion(schema) {
47
51
  }
48
52
  }
49
53
  /**
50
- * Fetch the UI schema from Rhino Compute's `/grasshopper/schema` endpoint (no
51
- * solve required). Throws `SchemaExtractionError` so callers can map to the
52
- * right HTTP status (503 unreachable / 422 invalid or unsupported).
54
+ * POST a multipart form to Rhino Compute's `/grasshopper/schema` endpoint (no
55
+ * solve required) and return the per-file results. Throws `SchemaExtractionError`
56
+ * ('unreachable') on a network failure or non-2xx — the per-file `error` field
57
+ * Compute reports on its 200-with-no-schemas case is left for the caller to
58
+ * diagnose, since single-file and multi-file callers want different messages.
53
59
  */
54
- export async function fetchSchemaFromCompute(definitionBytes, server) {
60
+ export async function postSchemaFormData(formData, server) {
55
61
  const schemaUrl = new URL('/grasshopper/schema', server.serverUrl).toString();
56
- const formData = new FormData();
57
- const blob = new Blob([new Uint8Array(definitionBytes)], { type: 'application/octet-stream' });
58
- formData.append('file', blob, 'definition.gh');
59
62
  const headers = {};
60
63
  if (server.apiKey) {
61
64
  headers['RhinoComputeKey'] = server.apiKey;
@@ -70,20 +73,25 @@ export async function fetchSchemaFromCompute(definitionBytes, server) {
70
73
  if (!response.ok) {
71
74
  throw new SchemaExtractionError('unreachable', `Schema endpoint returned ${response.status}: ${response.statusText}`);
72
75
  }
73
- // Compute returns [{ FileName, Schemas }] with PascalCase wrapper keys only.
74
- // The schema contents are already camelCase from our C# serializer, so we only
75
- // need a shallow camelcase per wrapper to normalize FileName→fileName,
76
- // Schemas→schemas (shallow camelcaseKeys is a no-op on arrays, so each
77
- // element is normalized individually). deep:true would mangle user-defined
78
- // option names (e.g. "Display3d" → "display3d").
79
- const raw = await response.json();
80
- const results = (Array.isArray(raw) ? raw : [raw]).map((r) => camelcaseKeys(r));
76
+ return readSchemaResults(await response.json());
77
+ }
78
+ /**
79
+ * Fetch the UI schema from Rhino Compute's `/grasshopper/schema` endpoint (no
80
+ * solve required). Throws `SchemaExtractionError` so callers can map to the
81
+ * right HTTP status (503 unreachable / 422 invalid or unsupported).
82
+ */
83
+ export async function fetchSchemaFromCompute(definitionBytes, server) {
84
+ const formData = new FormData();
85
+ const blob = new Blob([new Uint8Array(definitionBytes)], { type: 'application/octet-stream' });
86
+ formData.append('file', blob, 'definition.gh');
87
+ const results = await postSchemaFormData(formData, server);
81
88
  const schemas = results.flatMap((r) => r.schemas ?? []);
82
89
  if (schemas.length === 0) {
83
90
  // Compute reports a per-file diagnosis in an `error` field and still answers 200, so
84
- // the !response.ok guard above never fires for it. Surface that message verbatim —
85
- // it names the actual cause (bad Schema source, no embedded schema, ...), which the
86
- // generic fallback below cannot, and its absence sends people debugging the wrong thing.
91
+ // the !response.ok guard in postSchemaFormData never fires for it. Surface that message
92
+ // verbatim — it names the actual cause (bad Schema source, no embedded schema, ...),
93
+ // which the generic fallback below cannot, and its absence sends people debugging the
94
+ // wrong thing.
87
95
  const diagnosis = results.map((r) => r.error).filter(Boolean);
88
96
  if (diagnosis.length > 0) {
89
97
  throw new SchemaExtractionError('invalid', diagnosis.join('\n'));
@@ -1 +1 @@
1
- {"version":3,"file":"schema-extraction.js","sourceRoot":"","sources":["../../src/definitions/schema-extraction.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema-extraction.js","sourceRoot":"","sources":["../../src/definitions/schema-extraction.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export { parseSemver, isNewer, type ReleaseChannel } from './semver.js';
1
+ export { parseSemver, isNewer, compareCore, satisfiesRange, type ReleaseChannel } from './semver.js';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ops/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ops/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,WAAW,EACX,OAAO,EACP,WAAW,EACX,cAAc,EACd,KAAK,cAAc,EACnB,MAAM,aAAa,CAAC"}
package/dist/ops/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  // Deployment/ops helpers — channel-aware semver comparison.
2
- export { parseSemver, isNewer } from './semver.js';
2
+ export { parseSemver, isNewer, compareCore, satisfiesRange } from './semver.js';
3
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ops/index.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAE5D,OAAO,EAAE,WAAW,EAAE,OAAO,EAAuB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ops/index.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAE5D,OAAO,EACN,WAAW,EACX,OAAO,EACP,WAAW,EACX,cAAc,EAEd,MAAM,aAAa,CAAC"}
@@ -17,6 +17,24 @@ export declare function parseSemver(v: string): {
17
17
  core: [number, number, number];
18
18
  beta: number | null;
19
19
  } | null;
20
+ /**
21
+ * Compare two `x.y.z` cores. Pre-release tails are ignored — callers that care
22
+ * about them use `isNewer`, which layers channel rules on top.
23
+ */
24
+ export declare function compareCore(a: string, b: string): number;
25
+ /**
26
+ * Does `version` satisfy an `engines.node` range?
27
+ *
28
+ * Deliberately narrow: handles the `>=X`, `>X`, `^X`, `~X`, `=X` and bare-version
29
+ * forms Selva and its dependencies actually publish, plus `||` alternatives and
30
+ * space-separated conjunctions (`>=18 <21`). Anything it cannot parse returns
31
+ * `null` — "unknown", never a false "incompatible", because a wrong block would
32
+ * strand an operator who has no way to override a bad parse.
33
+ *
34
+ * A full `semver` dependency would subsume this; it isn't warranted for the
35
+ * handful of range forms in play (issue #176).
36
+ */
37
+ export declare function satisfiesRange(version: string, range: string): boolean | null;
20
38
  /**
21
39
  * True when `latest` is strictly newer than `current` by semver.
22
40
  *
@@ -1 +1 @@
1
- {"version":3,"file":"semver.d.ts","sourceRoot":"","sources":["../../src/ops/semver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,gDAAgD;AAChD,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE/C;;;;;GAKG;AACH,wBAAgB,WAAW,CAC1B,CAAC,EAAE,MAAM,GACP;IAAE,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAOhE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,OAAO,CACtB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,cAAyB,GAChC,OAAO,CAaT"}
1
+ {"version":3,"file":"semver.d.ts","sourceRoot":"","sources":["../../src/ops/semver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,gDAAgD;AAChD,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE/C;;;;;GAKG;AACH,wBAAgB,WAAW,CAC1B,CAAC,EAAE,MAAM,GACP;IAAE,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAOhE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CASxD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAsE7E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,OAAO,CACtB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,cAAyB,GAChC,OAAO,CAaT"}
@@ -20,6 +20,107 @@ export function parseSemver(v) {
20
20
  beta: m[4] != null ? Number(m[4]) : null
21
21
  };
22
22
  }
23
+ /**
24
+ * Compare two `x.y.z` cores. Pre-release tails are ignored — callers that care
25
+ * about them use `isNewer`, which layers channel rules on top.
26
+ */
27
+ export function compareCore(a, b) {
28
+ const pa = parseSemver(a);
29
+ const pb = parseSemver(b);
30
+ if (!pa || !pb)
31
+ return 0;
32
+ for (let i = 0; i < 3; i++) {
33
+ if (pa.core[i] > pb.core[i])
34
+ return 1;
35
+ if (pa.core[i] < pb.core[i])
36
+ return -1;
37
+ }
38
+ return 0;
39
+ }
40
+ /**
41
+ * Does `version` satisfy an `engines.node` range?
42
+ *
43
+ * Deliberately narrow: handles the `>=X`, `>X`, `^X`, `~X`, `=X` and bare-version
44
+ * forms Selva and its dependencies actually publish, plus `||` alternatives and
45
+ * space-separated conjunctions (`>=18 <21`). Anything it cannot parse returns
46
+ * `null` — "unknown", never a false "incompatible", because a wrong block would
47
+ * strand an operator who has no way to override a bad parse.
48
+ *
49
+ * A full `semver` dependency would subsume this; it isn't warranted for the
50
+ * handful of range forms in play (issue #176).
51
+ */
52
+ export function satisfiesRange(version, range) {
53
+ const v = parseSemver(version);
54
+ if (!v)
55
+ return null;
56
+ const alternatives = range.split('||').map((r) => r.trim());
57
+ let anyParsed = false;
58
+ for (const alt of alternatives) {
59
+ const clauses = alt.split(/\s+/).filter(Boolean);
60
+ if (clauses.length === 0)
61
+ continue;
62
+ let all = true;
63
+ let altParsed = true;
64
+ for (const clause of clauses) {
65
+ const m = /^(>=|<=|>|<|\^|~|=)?\s*v?(\d+)(?:\.(\d+|x|\*))?(?:\.(\d+|x|\*))?/.exec(clause);
66
+ if (!m) {
67
+ altParsed = false;
68
+ break;
69
+ }
70
+ const op = m[1] ?? '=';
71
+ const num = (s) => (s == null || s === 'x' || s === '*' ? 0 : Number(s));
72
+ const target = [Number(m[2]), num(m[3]), num(m[4])];
73
+ const cmp = (() => {
74
+ for (let i = 0; i < 3; i++) {
75
+ if (v.core[i] > target[i])
76
+ return 1;
77
+ if (v.core[i] < target[i])
78
+ return -1;
79
+ }
80
+ return 0;
81
+ })();
82
+ let ok;
83
+ switch (op) {
84
+ case '>=':
85
+ ok = cmp >= 0;
86
+ break;
87
+ case '>':
88
+ ok = cmp > 0;
89
+ break;
90
+ case '<=':
91
+ ok = cmp <= 0;
92
+ break;
93
+ case '<':
94
+ ok = cmp < 0;
95
+ break;
96
+ // ^X.Y.Z allows anything up to the next major; ~X.Y.Z up to the next minor.
97
+ case '^':
98
+ ok = cmp >= 0 && v.core[0] === target[0];
99
+ break;
100
+ case '~':
101
+ ok = cmp >= 0 && v.core[0] === target[0] && v.core[1] === target[1];
102
+ break;
103
+ default:
104
+ // A bare version means that exact release, but `18` / `18.x` mean the
105
+ // whole line — treat omitted segments as wildcards.
106
+ ok =
107
+ v.core[0] === target[0] &&
108
+ (m[3] == null || m[3] === 'x' || m[3] === '*' || v.core[1] === target[1]) &&
109
+ (m[4] == null || m[4] === 'x' || m[4] === '*' || v.core[2] === target[2]);
110
+ }
111
+ if (!ok) {
112
+ all = false;
113
+ break;
114
+ }
115
+ }
116
+ if (!altParsed)
117
+ continue;
118
+ anyParsed = true;
119
+ if (all)
120
+ return true;
121
+ }
122
+ return anyParsed ? false : null;
123
+ }
23
124
  /**
24
125
  * True when `latest` is strictly newer than `current` by semver.
25
126
  *
@@ -1 +1 @@
1
- {"version":3,"file":"semver.js","sourceRoot":"","sources":["../../src/ops/semver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAC1B,CAAS;IAET,MAAM,CAAC,GAAG,uCAAuC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACjE,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,OAAO;QACN,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;KACxC,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,OAAO,CACtB,MAAc,EACd,OAAe,EACf,UAA0B,QAAQ;IAElC,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,MAAM,KAAK,OAAO,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACvC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IACzC,CAAC;IACD,wEAAwE;IACxE,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IACrC,sEAAsE;IACtE,MAAM,IAAI,GAAG,CAAC,IAAmB,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACvE,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"semver.js","sourceRoot":"","sources":["../../src/ops/semver.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@selvajs/server",
3
- "version": "1.0.0-beta.0",
3
+ "version": "1.0.0-beta.10",
4
4
  "description": "Transport-agnostic server building blocks for apps built on the Selva engine (limits, rate limiting, SSRF guard, remote-definition fetch, definition service + render loader); the solve core lives in @selvajs/solve/server",
5
5
  "license": "MIT",
6
6
  "author": "VektorNode",
@@ -22,43 +22,52 @@
22
22
  "directory": "packages/server"
23
23
  },
24
24
  "engines": {
25
- "node": ">=22.0.0"
25
+ "node": ">=24.0.0"
26
26
  },
27
27
  "type": "module",
28
28
  "exports": {
29
29
  "./compute": {
30
+ "selva-source": "./src/compute/index.ts",
30
31
  "types": "./dist/compute/index.d.ts",
31
32
  "import": "./dist/compute/index.js"
32
33
  },
33
34
  "./definitions": {
35
+ "selva-source": "./src/definitions/index.ts",
34
36
  "types": "./dist/definitions/index.d.ts",
35
37
  "import": "./dist/definitions/index.js"
36
38
  },
37
39
  "./providers": {
40
+ "selva-source": "./src/providers/index.ts",
38
41
  "types": "./dist/providers/index.d.ts",
39
42
  "import": "./dist/providers/index.js"
40
43
  },
41
44
  "./tokens": {
45
+ "selva-source": "./src/tokens/index.ts",
42
46
  "types": "./dist/tokens/index.d.ts",
43
47
  "import": "./dist/tokens/index.js"
44
48
  },
45
49
  "./errors": {
50
+ "selva-source": "./src/errors/index.ts",
46
51
  "types": "./dist/errors/index.d.ts",
47
52
  "import": "./dist/errors/index.js"
48
53
  },
49
54
  "./logging": {
55
+ "selva-source": "./src/logging/index.ts",
50
56
  "types": "./dist/logging/index.d.ts",
51
57
  "import": "./dist/logging/index.js"
52
58
  },
53
59
  "./http": {
60
+ "selva-source": "./src/http/index.ts",
54
61
  "types": "./dist/http/index.d.ts",
55
62
  "import": "./dist/http/index.js"
56
63
  },
57
64
  "./access": {
65
+ "selva-source": "./src/access/index.ts",
58
66
  "types": "./dist/access/index.d.ts",
59
67
  "import": "./dist/access/index.js"
60
68
  },
61
69
  "./ops": {
70
+ "selva-source": "./src/ops/index.ts",
62
71
  "types": "./dist/ops/index.d.ts",
63
72
  "import": "./dist/ops/index.js"
64
73
  }
@@ -70,9 +79,9 @@
70
79
  "!**/*.spec.*"
71
80
  ],
72
81
  "dependencies": {
73
- "@selvajs/compute": "^4.0.0-beta.0",
74
- "@selvajs/platform": "^0.16.0",
75
- "@selvajs/schemas": "^4.7.0"
82
+ "@selvajs/compute": "^4.0.0-beta.7",
83
+ "@selvajs/platform": "^0.17.0-beta.3",
84
+ "@selvajs/schemas": "^5.0.0-beta.3"
76
85
  },
77
86
  "peerDependencies": {
78
87
  "@sentry/node": ">=8",
@@ -89,7 +98,8 @@
89
98
  "devDependencies": {
90
99
  "@types/node": "^26.1.2",
91
100
  "typescript": "~6.0.3",
92
- "vitest": "^4.1.10"
101
+ "vitest": "^4.1.10",
102
+ "@selvajs/config": "0.0.3"
93
103
  },
94
104
  "scripts": {
95
105
  "build": "tsc",