@selvajs/server 1.0.0-beta.9 → 1.0.1
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 +18 -20
- package/dist/access/project-access-input.d.ts +13 -16
- package/dist/access/project-access-input.d.ts.map +1 -1
- package/dist/access/project-access-input.js +2 -2
- package/dist/access/project-access-input.js.map +1 -1
- package/dist/compute/idempotency.d.ts +18 -22
- package/dist/compute/idempotency.d.ts.map +1 -1
- package/dist/compute/idempotency.js +10 -14
- package/dist/compute/idempotency.js.map +1 -1
- package/dist/compute/index.d.ts.map +1 -1
- package/dist/compute/index.js +3 -5
- package/dist/compute/index.js.map +1 -1
- package/dist/compute/limits.d.ts +70 -86
- package/dist/compute/limits.d.ts.map +1 -1
- package/dist/compute/limits.js +27 -56
- package/dist/compute/limits.js.map +1 -1
- package/dist/compute/rate-limit.d.ts +41 -53
- package/dist/compute/rate-limit.d.ts.map +1 -1
- package/dist/compute/rate-limit.js +27 -35
- package/dist/compute/rate-limit.js.map +1 -1
- package/dist/compute/remote-definition.d.ts +8 -22
- package/dist/compute/remote-definition.d.ts.map +1 -1
- package/dist/compute/remote-definition.js +9 -19
- package/dist/compute/remote-definition.js.map +1 -1
- package/dist/compute/safe-url.d.ts +7 -5
- package/dist/compute/safe-url.d.ts.map +1 -1
- package/dist/compute/safe-url.js +26 -28
- package/dist/compute/safe-url.js.map +1 -1
- package/dist/definitions/definition-service.d.ts +13 -38
- package/dist/definitions/definition-service.d.ts.map +1 -1
- package/dist/definitions/definition-service.js +25 -53
- package/dist/definitions/definition-service.js.map +1 -1
- package/dist/definitions/index.d.ts +2 -2
- package/dist/definitions/index.d.ts.map +1 -1
- package/dist/definitions/index.js +1 -5
- package/dist/definitions/index.js.map +1 -1
- package/dist/definitions/load-for-render.d.ts +23 -20
- package/dist/definitions/load-for-render.d.ts.map +1 -1
- package/dist/definitions/load-for-render.js +55 -41
- package/dist/definitions/load-for-render.js.map +1 -1
- package/dist/definitions/schema-extraction.d.ts +36 -16
- package/dist/definitions/schema-extraction.d.ts.map +1 -1
- package/dist/definitions/schema-extraction.js +65 -28
- package/dist/definitions/schema-extraction.js.map +1 -1
- package/dist/errors/SentryErrorReporter.d.ts +2 -3
- package/dist/errors/SentryErrorReporter.d.ts.map +1 -1
- package/dist/errors/SentryErrorReporter.js +10 -14
- package/dist/errors/SentryErrorReporter.js.map +1 -1
- package/dist/http/body-size.d.ts +8 -11
- package/dist/http/body-size.d.ts.map +1 -1
- package/dist/http/body-size.js +8 -11
- package/dist/http/body-size.js.map +1 -1
- package/dist/http/redirect.d.ts +3 -7
- package/dist/http/redirect.d.ts.map +1 -1
- package/dist/http/redirect.js +8 -8
- package/dist/http/redirect.js.map +1 -1
- package/dist/http/route-classifier.d.ts +20 -24
- package/dist/http/route-classifier.d.ts.map +1 -1
- package/dist/http/route-classifier.js +6 -7
- package/dist/http/route-classifier.js.map +1 -1
- package/dist/http/security-headers.d.ts +13 -15
- package/dist/http/security-headers.d.ts.map +1 -1
- package/dist/http/security-headers.js +10 -12
- package/dist/http/security-headers.js.map +1 -1
- package/dist/logging/PinoLogger.d.ts +8 -14
- package/dist/logging/PinoLogger.d.ts.map +1 -1
- package/dist/logging/PinoLogger.js +29 -35
- package/dist/logging/PinoLogger.js.map +1 -1
- package/dist/logging/requestId.d.ts +20 -28
- package/dist/logging/requestId.d.ts.map +1 -1
- package/dist/logging/requestId.js +29 -37
- package/dist/logging/requestId.js.map +1 -1
- package/dist/ops/index.d.ts.map +1 -1
- package/dist/ops/index.js +2 -1
- package/dist/ops/index.js.map +1 -1
- package/dist/ops/semver.d.ts +22 -24
- package/dist/ops/semver.d.ts.map +1 -1
- package/dist/ops/semver.js +22 -25
- package/dist/ops/semver.js.map +1 -1
- package/dist/providers/create-selva-providers.d.ts +19 -27
- package/dist/providers/create-selva-providers.d.ts.map +1 -1
- package/dist/providers/create-selva-providers.js +28 -34
- package/dist/providers/create-selva-providers.js.map +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +2 -4
- package/dist/providers/index.js.map +1 -1
- package/dist/tokens/token-codec.d.ts +24 -27
- package/dist/tokens/token-codec.d.ts.map +1 -1
- package/dist/tokens/token-codec.js +18 -21
- package/dist/tokens/token-codec.js.map +1 -1
- package/package.json +5 -5
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
// resolution, schema fetch (with the ADR 0005 staleness check), default merging.
|
|
1
|
+
// Given a definition record, produces everything the client needs to render its
|
|
2
|
+
// form and solve it.
|
|
4
3
|
//
|
|
5
|
-
// Access gating is
|
|
6
|
-
// whether `ctx`
|
|
7
|
-
//
|
|
4
|
+
// Access gating is deliberately NOT done here — the calling route decides
|
|
5
|
+
// whether `ctx` may load this definition, since gates differ across routes
|
|
6
|
+
// (project membership, segment ownership, share-token, admin override).
|
|
8
7
|
//
|
|
9
|
-
// Everything stateful is injected
|
|
10
|
-
//
|
|
11
|
-
// on the engine can wire its own composition root.
|
|
8
|
+
// Everything stateful is injected, so any app on the engine can wire its own
|
|
9
|
+
// composition root.
|
|
12
10
|
import { UI_SCHEMA_VERSION } from '@selvajs/schemas';
|
|
13
11
|
import { NoopLogger } from '@selvajs/platform';
|
|
14
12
|
import { fetchSchemaFromCompute } from './schema-extraction.js';
|
|
@@ -23,18 +21,13 @@ export class DefinitionLoadError extends Error {
|
|
|
23
21
|
}
|
|
24
22
|
}
|
|
25
23
|
/**
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* merged compute defaults). By default it resolves the `channel` pointer
|
|
30
|
-
* (live/draft); pass `explicitVersionId` to render an arbitrary historical
|
|
31
|
-
* version instead — the caller must gate that behind edit permission
|
|
32
|
-
* (editor-only, like the draft channel). Throws `DefinitionLoadError` for
|
|
33
|
-
* classified failures so the caller can translate to HTTP status codes.
|
|
24
|
+
* The returned loader resolves the `channel` pointer (live/draft) by default.
|
|
25
|
+
* `explicitVersionId` renders an arbitrary historical version instead — the
|
|
26
|
+
* caller MUST gate that behind edit permission, as with the draft channel.
|
|
34
27
|
*/
|
|
35
28
|
export function createDefinitionLoader(deps) {
|
|
36
29
|
const { storage, definitions, projects, resolveServer, getClient, fetchSchema = fetchSchemaFromCompute, computeDebug = false, onWarn, logger = new NoopLogger() } = deps;
|
|
37
|
-
return async function loadDefinitionForRender(ctx, record, channel, explicitVersionId) {
|
|
30
|
+
return async function loadDefinitionForRender(ctx, record, channel, explicitVersionId, options) {
|
|
38
31
|
const versionId = explicitVersionId ?? (channel === 'draft' ? record.draftVersionId : record.liveVersionId);
|
|
39
32
|
if (!versionId)
|
|
40
33
|
throw new DefinitionLoadError('data', `Definition '${record.guid}' has no ${channel} version`);
|
|
@@ -57,6 +50,15 @@ export function createDefinitionLoader(deps) {
|
|
|
57
50
|
catch (err) {
|
|
58
51
|
throw new DefinitionLoadError('missing-config', 'No compute server configured for this definition', err);
|
|
59
52
|
}
|
|
53
|
+
// Returning before `getClient` is the point — the connect is the cost, not
|
|
54
|
+
// the `getIO` it carries. A missing or stale-format cache falls through to
|
|
55
|
+
// the full path below, so the result is always a valid schema.
|
|
56
|
+
if (options?.skipComputeDefaults) {
|
|
57
|
+
const cachedSchema = version.schema;
|
|
58
|
+
if (cachedSchema && isUsableCachedSchema(cachedSchema)) {
|
|
59
|
+
return { version, definitionSource, computeServer, schema: cachedSchema };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
60
62
|
// Only the client is used here (getIO); the entry's solve scheduler rides
|
|
61
63
|
// along unused.
|
|
62
64
|
let client;
|
|
@@ -68,24 +70,21 @@ export function createDefinitionLoader(deps) {
|
|
|
68
70
|
throw new DefinitionLoadError('connect', `Failed to connect to Rhino Compute server: ${message}`, err);
|
|
69
71
|
}
|
|
70
72
|
try {
|
|
71
|
-
//
|
|
72
|
-
//
|
|
73
|
-
//
|
|
74
|
-
//
|
|
75
|
-
//
|
|
76
|
-
// migrates schemas itself. `getIO` is always needed to merge compute
|
|
77
|
-
// default values into the schema, cached or not.
|
|
73
|
+
// The stored schema is a disposable cache, used ONLY when its format
|
|
74
|
+
// version matches the app's. On a mismatch (or a pre-caching row with no
|
|
75
|
+
// schema) re-extract from compute, whose C# SchemaMigrator emits the
|
|
76
|
+
// current format — the web side never migrates schemas itself. `getIO`
|
|
77
|
+
// runs either way, to merge compute default values in.
|
|
78
78
|
const cachedSchema = version.schema;
|
|
79
|
-
const freshCache = cachedSchema && cachedSchema
|
|
79
|
+
const freshCache = cachedSchema && isUsableCachedSchema(cachedSchema) ? cachedSchema : null;
|
|
80
80
|
const [definition, fetchedSchema] = await Promise.all([
|
|
81
81
|
client.getIO(definitionSource),
|
|
82
82
|
freshCache ? Promise.resolve(freshCache) : fetchSchema(definitionSource, computeServer)
|
|
83
83
|
]);
|
|
84
|
-
//
|
|
85
|
-
//
|
|
86
|
-
//
|
|
87
|
-
//
|
|
88
|
-
// plugin behind the app) would just go stale again next render.
|
|
84
|
+
// Best-effort — a viewer context may lack write access, and the next
|
|
85
|
+
// editor render or the solve-time backfill will land it. Guarded on the
|
|
86
|
+
// current version because persisting an older format (compute plugin
|
|
87
|
+
// behind the app) would just go stale again next render.
|
|
89
88
|
if (!freshCache && fetchedSchema.schemaVersion === UI_SCHEMA_VERSION) {
|
|
90
89
|
definitions.setVersionSchema(ctx, version.id, fetchedSchema).catch((err) => {
|
|
91
90
|
if (onWarn) {
|
|
@@ -103,13 +102,12 @@ export function createDefinitionLoader(deps) {
|
|
|
103
102
|
if (!definition) {
|
|
104
103
|
throw new Error(`Failed to get definition IO — server returned undefined`);
|
|
105
104
|
}
|
|
106
|
-
//
|
|
107
|
-
//
|
|
108
|
-
//
|
|
109
|
-
//
|
|
110
|
-
//
|
|
111
|
-
//
|
|
112
|
-
// dump is gated on `computeDebug`.
|
|
105
|
+
// Zero inputs or reported parse/load problems mean a definition that will
|
|
106
|
+
// render wrong without saying why: an empty ValueList whose backing GH
|
|
107
|
+
// component didn't resolve ("Missing Definition Objects"), or a PascalCase
|
|
108
|
+
// /io response the parser silently dropped to []. Warning is always on —
|
|
109
|
+
// it only fires on the unhappy path — while the raw wire dump costs an
|
|
110
|
+
// extra round-trip and stays behind `computeDebug`.
|
|
113
111
|
const ioParseErrors = definition.parseErrors ?? [];
|
|
114
112
|
const ioLoadErrors = definition.loadErrors ?? [];
|
|
115
113
|
const ioLooksBroken = definition.inputs.length === 0 || ioParseErrors.length > 0 || ioLoadErrors.length > 0;
|
|
@@ -161,10 +159,26 @@ export function createDefinitionLoader(deps) {
|
|
|
161
159
|
}
|
|
162
160
|
};
|
|
163
161
|
}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
162
|
+
/**
|
|
163
|
+
* A cached schema is usable only if it is BOTH the current format version and
|
|
164
|
+
* structurally sound. The version check alone is not enough: a compute server
|
|
165
|
+
* that serialized the schema with the wrong Newtonsoft emits PascalCase keys, so
|
|
166
|
+
* `schemaVersion` reads as undefined while `SchemaVersion` holds the value —
|
|
167
|
+
* and a row cached during that window would otherwise be served forever, long
|
|
168
|
+
* after the server was fixed. See `assertCamelCaseSchema`.
|
|
169
|
+
*/
|
|
170
|
+
function isUsableCachedSchema(schema) {
|
|
171
|
+
return schema.schemaVersion === UI_SCHEMA_VERSION && Array.isArray(schema.inputs);
|
|
172
|
+
}
|
|
173
|
+
// Colors come back from Compute as "r,g,b" or "a,r,g,b" strings — converted to
|
|
174
|
+
// hex here so the color picker can consume them directly.
|
|
167
175
|
function mergeComputeDefaults(schema, computeInputs) {
|
|
176
|
+
if (!Array.isArray(schema.inputs)) {
|
|
177
|
+
throw new DefinitionLoadError('schema', `Schema has no 'inputs' array (keys: ${Object.keys(schema)
|
|
178
|
+
.slice(0, 12)
|
|
179
|
+
.join(', ')}). A PascalCase shape here means compute serialized it with the wrong ` +
|
|
180
|
+
`Newtonsoft — see assertCamelCaseSchema.`);
|
|
181
|
+
}
|
|
168
182
|
const byParamId = new Map(computeInputs.map((input) => [input.id, input]));
|
|
169
183
|
return {
|
|
170
184
|
...schema,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-for-render.js","sourceRoot":"","sources":["../../src/definitions/load-for-render.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,
|
|
1
|
+
{"version":3,"file":"load-for-render.js","sourceRoot":"","sources":["../../src/definitions/load-for-render.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,33 +3,53 @@ import { type UISchema } from '@selvajs/schemas';
|
|
|
3
3
|
import type { ComputeServerConfig } from '@selvajs/platform';
|
|
4
4
|
/** One entry of the compute schema endpoint's response, typed to our `UISchema`. */
|
|
5
5
|
export type SchemaExtractionResult = SchemaEndpointResult<UISchema>;
|
|
6
|
-
/**
|
|
6
|
+
/** Thin re-export of @selvajs/compute's unwrap, typed to `UISchema`. */
|
|
7
7
|
export declare function readSchemaResults(raw: unknown): SchemaExtractionResult[];
|
|
8
8
|
/** Thrown when compute is reachable but the definition yields no usable schema. */
|
|
9
9
|
export declare class SchemaExtractionError extends Error {
|
|
10
|
-
readonly kind: 'unreachable' | 'invalid' | 'unsupported';
|
|
11
|
-
constructor(kind: 'unreachable' | 'invalid' | 'unsupported', message: string);
|
|
10
|
+
readonly kind: 'unreachable' | 'invalid' | 'unsupported' | 'malformed';
|
|
11
|
+
constructor(kind: 'unreachable' | 'invalid' | 'unsupported' | 'malformed', message: string);
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
14
|
+
* Rejects a schema whose keys are not camelCase by the time it reaches a consumer.
|
|
15
|
+
*
|
|
16
|
+
* Compute serializes the plugin's `UISchema` POCO, whose camelCase names live in
|
|
17
|
+
* `[JsonProperty]` attributes. `Selva.gha` ILRepack-merges Newtonsoft, so those
|
|
18
|
+
* attributes have type `Selva!Newtonsoft.Json.JsonPropertyAttribute`; a compute
|
|
19
|
+
* server serializing with its OWN Newtonsoft does not recognize them, reads no
|
|
20
|
+
* attributes, and falls back to raw CLR member names — `Inputs`, `Layout`.
|
|
21
|
+
* Nothing throws on the wire: every consumer just reads `schema.inputs` as
|
|
22
|
+
* undefined and renders a definition with no inputs.
|
|
23
|
+
*
|
|
24
|
+
* `postSchemaFormData` repairs that casing via `normalizeUISchemaCasing`, so a
|
|
25
|
+
* schema fresh off the wire never trips this. It stays because schemas are also
|
|
26
|
+
* PERSISTED: a row cached before the normalizer existed still holds PascalCase,
|
|
27
|
+
* and it reaches consumers without passing through `postSchemaFormData` again.
|
|
28
|
+
* A schema with no `inputs` in any casing lands here too. It is a backstop, not
|
|
29
|
+
* the primary defense — which is why it names the missing key rather than telling
|
|
30
|
+
* the operator to go update their compute server.
|
|
31
|
+
*
|
|
32
|
+
* Checked structurally rather than by plugin version, because the casing depends
|
|
33
|
+
* on which assembly serialized the schema, not on any version number.
|
|
34
|
+
*/
|
|
35
|
+
export declare function assertCamelCaseSchema(schema: UISchema): void;
|
|
36
|
+
/**
|
|
37
|
+
* Rejects a schema from a NEWER plugin than this app was built against — its
|
|
38
|
+
* shape may contain constructs the renderer doesn't know. Older (or missing)
|
|
39
|
+
* versions pass: the compute-side C# migrator always emits its own current
|
|
40
|
+
* version, and an older shape only lacks optional additions.
|
|
19
41
|
*/
|
|
20
42
|
export declare function assertSupportedSchemaVersion(schema: UISchema): void;
|
|
21
43
|
/**
|
|
22
|
-
*
|
|
23
|
-
* solve required)
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* diagnose, since single-file and multi-file callers want different messages.
|
|
44
|
+
* POSTs a multipart form to Rhino Compute's `/grasshopper/schema` endpoint (no
|
|
45
|
+
* solve required). Throws 'unreachable' on a network failure or non-2xx. The
|
|
46
|
+
* per-file `error` Compute reports on its 200-with-no-schemas case is left to
|
|
47
|
+
* the caller — single-file and multi-file callers want different messages.
|
|
27
48
|
*/
|
|
28
49
|
export declare function postSchemaFormData(formData: FormData, server: ComputeServerConfig): Promise<SchemaExtractionResult[]>;
|
|
29
50
|
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* right HTTP status (503 unreachable / 422 invalid or unsupported).
|
|
51
|
+
* Throws `SchemaExtractionError` so callers can map to the right HTTP status:
|
|
52
|
+
* 503 unreachable / 422 invalid or unsupported.
|
|
33
53
|
*/
|
|
34
54
|
export declare function fetchSchemaFromCompute(definitionBytes: Uint8Array, server: ComputeServerConfig): Promise<UISchema>;
|
|
35
55
|
//# sourceMappingURL=schema-extraction.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-extraction.d.ts","sourceRoot":"","sources":["../../src/definitions/schema-extraction.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schema-extraction.d.ts","sourceRoot":"","sources":["../../src/definitions/schema-extraction.ts"],"names":[],"mappings":"AAIA,OAAO,EAGN,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,wEAAwE;AACxE,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,GAAG,WAAW;gBAA7D,IAAI,EAAE,aAAa,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,EAC7E,OAAO,EAAE,MAAM;CAKhB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,CAsB5D;AAOD;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,CAmBnE;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACvC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,mBAAmB,GACzB,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAiCnC;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC3C,eAAe,EAAE,UAAU,EAC3B,MAAM,EAAE,mBAAmB,GACzB,OAAO,CAAC,QAAQ,CAAC,CA4BnB"}
|
|
@@ -1,14 +1,9 @@
|
|
|
1
|
-
// Shared compute-schema extraction. One implementation used by:
|
|
2
|
-
// - upload routes (validate-and-cache gate — no upload without a valid schema)
|
|
3
|
-
// - the render path (falls back to live extraction for un-cached or stale
|
|
4
|
-
// versions; see load-for-render.ts and ADR 0005)
|
|
5
|
-
// - the temporary solve-time backfill bridge (see the app's specs/SchemaCaching.md)
|
|
6
|
-
//
|
|
7
1
|
// Extraction IS validation: a `.gh` with no valid "Schema" output, or an
|
|
8
|
-
// unreachable compute server, throws here
|
|
9
|
-
|
|
2
|
+
// unreachable compute server, throws here — which is what makes this the upload
|
|
3
|
+
// gate as well as the render path's fallback for un-cached or stale versions.
|
|
4
|
+
import { normalizeUISchemaCasing, readSchemaResults as readWrapper } from '@selvajs/compute/grasshopper';
|
|
10
5
|
import { UI_SCHEMA_VERSION } from '@selvajs/schemas';
|
|
11
|
-
/**
|
|
6
|
+
/** Thin re-export of @selvajs/compute's unwrap, typed to `UISchema`. */
|
|
12
7
|
export function readSchemaResults(raw) {
|
|
13
8
|
return readWrapper(raw);
|
|
14
9
|
}
|
|
@@ -21,16 +16,53 @@ export class SchemaExtractionError extends Error {
|
|
|
21
16
|
this.name = 'SchemaExtractionError';
|
|
22
17
|
}
|
|
23
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Rejects a schema whose keys are not camelCase by the time it reaches a consumer.
|
|
21
|
+
*
|
|
22
|
+
* Compute serializes the plugin's `UISchema` POCO, whose camelCase names live in
|
|
23
|
+
* `[JsonProperty]` attributes. `Selva.gha` ILRepack-merges Newtonsoft, so those
|
|
24
|
+
* attributes have type `Selva!Newtonsoft.Json.JsonPropertyAttribute`; a compute
|
|
25
|
+
* server serializing with its OWN Newtonsoft does not recognize them, reads no
|
|
26
|
+
* attributes, and falls back to raw CLR member names — `Inputs`, `Layout`.
|
|
27
|
+
* Nothing throws on the wire: every consumer just reads `schema.inputs` as
|
|
28
|
+
* undefined and renders a definition with no inputs.
|
|
29
|
+
*
|
|
30
|
+
* `postSchemaFormData` repairs that casing via `normalizeUISchemaCasing`, so a
|
|
31
|
+
* schema fresh off the wire never trips this. It stays because schemas are also
|
|
32
|
+
* PERSISTED: a row cached before the normalizer existed still holds PascalCase,
|
|
33
|
+
* and it reaches consumers without passing through `postSchemaFormData` again.
|
|
34
|
+
* A schema with no `inputs` in any casing lands here too. It is a backstop, not
|
|
35
|
+
* the primary defense — which is why it names the missing key rather than telling
|
|
36
|
+
* the operator to go update their compute server.
|
|
37
|
+
*
|
|
38
|
+
* Checked structurally rather than by plugin version, because the casing depends
|
|
39
|
+
* on which assembly serialized the schema, not on any version number.
|
|
40
|
+
*/
|
|
41
|
+
export function assertCamelCaseSchema(schema) {
|
|
42
|
+
const raw = schema;
|
|
43
|
+
if (Array.isArray(raw.inputs))
|
|
44
|
+
return;
|
|
45
|
+
const pascalKeys = ['Inputs', 'Outputs', 'Layout', 'SchemaVersion'].filter((k) => k in raw);
|
|
46
|
+
if (pascalKeys.length > 0) {
|
|
47
|
+
throw new SchemaExtractionError('malformed', `Schema keys are PascalCase (found ${pascalKeys.join(', ')}), so every property name ` +
|
|
48
|
+
`is wrong and the definition would render with no inputs. Compute serialized it with ` +
|
|
49
|
+
`its own Newtonsoft instead of the one merged into Selva.gha. Fresh responses are ` +
|
|
50
|
+
`normalized, so this is most likely a schema cached before that fix — re-save the ` +
|
|
51
|
+
`definition version to re-extract it.`);
|
|
52
|
+
}
|
|
53
|
+
throw new SchemaExtractionError('malformed', `Compute returned a schema with no 'inputs' array (got keys: ${Object.keys(raw)
|
|
54
|
+
.slice(0, 12)
|
|
55
|
+
.join(', ')}).`);
|
|
56
|
+
}
|
|
24
57
|
function parseSemver(version) {
|
|
25
58
|
const m = /^(\d+)\.(\d+)\.(\d+)$/.exec(version);
|
|
26
59
|
return m ? [Number(m[1]), Number(m[2]), Number(m[3])] : null;
|
|
27
60
|
}
|
|
28
61
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
* optional additions.
|
|
62
|
+
* Rejects a schema from a NEWER plugin than this app was built against — its
|
|
63
|
+
* shape may contain constructs the renderer doesn't know. Older (or missing)
|
|
64
|
+
* versions pass: the compute-side C# migrator always emits its own current
|
|
65
|
+
* version, and an older shape only lacks optional additions.
|
|
34
66
|
*/
|
|
35
67
|
export function assertSupportedSchemaVersion(schema) {
|
|
36
68
|
const version = schema.schemaVersion;
|
|
@@ -51,11 +83,10 @@ export function assertSupportedSchemaVersion(schema) {
|
|
|
51
83
|
}
|
|
52
84
|
}
|
|
53
85
|
/**
|
|
54
|
-
*
|
|
55
|
-
* solve required)
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
* diagnose, since single-file and multi-file callers want different messages.
|
|
86
|
+
* POSTs a multipart form to Rhino Compute's `/grasshopper/schema` endpoint (no
|
|
87
|
+
* solve required). Throws 'unreachable' on a network failure or non-2xx. The
|
|
88
|
+
* per-file `error` Compute reports on its 200-with-no-schemas case is left to
|
|
89
|
+
* the caller — single-file and multi-file callers want different messages.
|
|
59
90
|
*/
|
|
60
91
|
export async function postSchemaFormData(formData, server) {
|
|
61
92
|
const schemaUrl = new URL('/grasshopper/schema', server.serverUrl).toString();
|
|
@@ -73,12 +104,18 @@ export async function postSchemaFormData(formData, server) {
|
|
|
73
104
|
if (!response.ok) {
|
|
74
105
|
throw new SchemaExtractionError('unreachable', `Schema endpoint returned ${response.status}: ${response.statusText}`);
|
|
75
106
|
}
|
|
76
|
-
|
|
107
|
+
// Normalize here rather than in each caller: the upload/validation route reads
|
|
108
|
+
// `postSchemaFormData` directly, so a fix applied only inside
|
|
109
|
+
// `fetchSchemaFromCompute` would leave that path serving PascalCase schemas.
|
|
110
|
+
const results = readSchemaResults(await response.json());
|
|
111
|
+
return results.map((result) => ({
|
|
112
|
+
...result,
|
|
113
|
+
schemas: result.schemas?.map((schema) => normalizeUISchemaCasing(schema))
|
|
114
|
+
}));
|
|
77
115
|
}
|
|
78
116
|
/**
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
* right HTTP status (503 unreachable / 422 invalid or unsupported).
|
|
117
|
+
* Throws `SchemaExtractionError` so callers can map to the right HTTP status:
|
|
118
|
+
* 503 unreachable / 422 invalid or unsupported.
|
|
82
119
|
*/
|
|
83
120
|
export async function fetchSchemaFromCompute(definitionBytes, server) {
|
|
84
121
|
const formData = new FormData();
|
|
@@ -87,11 +124,10 @@ export async function fetchSchemaFromCompute(definitionBytes, server) {
|
|
|
87
124
|
const results = await postSchemaFormData(formData, server);
|
|
88
125
|
const schemas = results.flatMap((r) => r.schemas ?? []);
|
|
89
126
|
if (schemas.length === 0) {
|
|
90
|
-
// Compute
|
|
91
|
-
//
|
|
92
|
-
//
|
|
93
|
-
// which the generic fallback below cannot
|
|
94
|
-
// wrong thing.
|
|
127
|
+
// Compute answers 200 while reporting a per-file `error`, so the
|
|
128
|
+
// !response.ok guard never fires for it. Surface that message verbatim: it
|
|
129
|
+
// names the actual cause (bad Schema source, no embedded schema, ...),
|
|
130
|
+
// which the generic fallback below cannot.
|
|
95
131
|
const diagnosis = results.map((r) => r.error).filter(Boolean);
|
|
96
132
|
if (diagnosis.length > 0) {
|
|
97
133
|
throw new SchemaExtractionError('invalid', diagnosis.join('\n'));
|
|
@@ -100,6 +136,7 @@ export async function fetchSchemaFromCompute(definitionBytes, server) {
|
|
|
100
136
|
'In Grasshopper, verify a Context Bake component with the output name "Schema" is present and wired to the solver.');
|
|
101
137
|
}
|
|
102
138
|
assertSupportedSchemaVersion(schemas[0]);
|
|
139
|
+
assertCamelCaseSchema(schemas[0]);
|
|
103
140
|
return schemas[0];
|
|
104
141
|
}
|
|
105
142
|
//# sourceMappingURL=schema-extraction.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-extraction.js","sourceRoot":"","sources":["../../src/definitions/schema-extraction.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"schema-extraction.js","sourceRoot":"","sources":["../../src/definitions/schema-extraction.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,9 +3,8 @@ export declare class SentryErrorReporter implements IErrorReporter {
|
|
|
3
3
|
private readonly sentry;
|
|
4
4
|
private constructor();
|
|
5
5
|
/**
|
|
6
|
-
* Initialize Sentry and return a reporter, or `null`
|
|
7
|
-
*
|
|
8
|
-
* error-tracker must not take down boot.
|
|
6
|
+
* Initialize Sentry and return a reporter, or `null` when `@sentry/node`
|
|
7
|
+
* won't load. Never throws — a broken error-tracker must not take down boot.
|
|
9
8
|
*/
|
|
10
9
|
static create(opts: {
|
|
11
10
|
dsn: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SentryErrorReporter.d.ts","sourceRoot":"","sources":["../../src/errors/SentryErrorReporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"SentryErrorReporter.d.ts","sourceRoot":"","sources":["../../src/errors/SentryErrorReporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AA0BtE,qBAAa,mBAAoB,YAAW,cAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAA3C,OAAO;IAEP;;;OAGG;WACU,MAAM,CAAC,IAAI,EAAE;QACzB,GAAG,EAAE,MAAM,CAAC;QACZ,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IA4BvC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;CAgBrD"}
|
|
@@ -4,19 +4,15 @@ export class SentryErrorReporter {
|
|
|
4
4
|
this.sentry = sentry;
|
|
5
5
|
}
|
|
6
6
|
/**
|
|
7
|
-
* Initialize Sentry and return a reporter, or `null`
|
|
8
|
-
*
|
|
9
|
-
* error-tracker must not take down boot.
|
|
7
|
+
* Initialize Sentry and return a reporter, or `null` when `@sentry/node`
|
|
8
|
+
* won't load. Never throws — a broken error-tracker must not take down boot.
|
|
10
9
|
*/
|
|
11
10
|
static async create(opts) {
|
|
12
11
|
try {
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
// dep in some installs, absent in others — so we can't assert the error
|
|
18
|
-
// is always present. The `as unknown as` cast narrows whatever loads to
|
|
19
|
-
// the two calls we use.
|
|
12
|
+
// `@vite-ignore` stops the bundler resolving an absent package at build
|
|
13
|
+
// time. `@ts-ignore` rather than `@ts-expect-error` because the module
|
|
14
|
+
// is a real dep in some installs and missing in others, so we can't
|
|
15
|
+
// assert the error is always there for `expect-error` to consume.
|
|
20
16
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
21
17
|
// @ts-ignore -- optional dependency, may be absent at type-check time
|
|
22
18
|
const sentry = (await import(/* @vite-ignore */ '@sentry/node'));
|
|
@@ -24,8 +20,8 @@ export class SentryErrorReporter {
|
|
|
24
20
|
dsn: opts.dsn,
|
|
25
21
|
environment: opts.environment,
|
|
26
22
|
release: opts.release,
|
|
27
|
-
//
|
|
28
|
-
//
|
|
23
|
+
// 0 = error tracking only, no performance tracing. Raise it to
|
|
24
|
+
// sample transactions/spans.
|
|
29
25
|
tracesSampleRate: 0
|
|
30
26
|
});
|
|
31
27
|
return new SentryErrorReporter(sentry);
|
|
@@ -51,8 +47,8 @@ export class SentryErrorReporter {
|
|
|
51
47
|
});
|
|
52
48
|
}
|
|
53
49
|
catch (err) {
|
|
54
|
-
//
|
|
55
|
-
// failure
|
|
50
|
+
// Best-effort, and this sits on the error path — letting a second
|
|
51
|
+
// failure escape would mask the first.
|
|
56
52
|
console.error('[ErrorReporter] Failed to capture error:', err);
|
|
57
53
|
}
|
|
58
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SentryErrorReporter.js","sourceRoot":"","sources":["../../src/errors/SentryErrorReporter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SentryErrorReporter.js","sourceRoot":"","sources":["../../src/errors/SentryErrorReporter.ts"],"names":[],"mappings":"AA0BA,MAAM,OAAO,mBAAmB;IACM;IAArC,YAAqC,MAAkB;QAAlB,WAAM,GAAN,MAAM,CAAY;IAAG,CAAC;IAE3D;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAInB;QACA,IAAI,CAAC;YACJ,wEAAwE;YACxE,uEAAuE;YACvE,oEAAoE;YACpE,kEAAkE;YAClE,6DAA6D;YAC7D,sEAAsE;YACtE,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAA0B,CAAC;YAC1F,MAAM,CAAC,IAAI,CAAC;gBACX,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,+DAA+D;gBAC/D,6BAA6B;gBAC7B,gBAAgB,EAAE,CAAC;aACnB,CAAC,CAAC;YACH,OAAO,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CACZ,4EAA4E;gBAC3E,+EAA+E,EAChF,GAAG,CACH,CAAC;YACF,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IAED,OAAO,CAAC,KAAc,EAAE,OAAsB;QAC7C,IAAI,CAAC;YACJ,MAAM,IAAI,GAA2B,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC;YAC1D,IAAI,OAAO,EAAE,MAAM;gBAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAClD,IAAI,OAAO,EAAE,KAAK;gBAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;YAC/C,IAAI,OAAO,EAAE,KAAK;gBAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;YAC/C,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE;gBACnC,IAAI;gBACJ,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;aAC1D,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,kEAAkE;YAClE,uCAAuC;YACvC,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,GAAG,CAAC,CAAC;QAChE,CAAC;IACF,CAAC;CACD"}
|
package/dist/http/body-size.d.ts
CHANGED
|
@@ -3,19 +3,16 @@ export interface HeadersLike {
|
|
|
3
3
|
get(name: string): string | null;
|
|
4
4
|
}
|
|
5
5
|
/**
|
|
6
|
-
* True when the request's declared `Content-Length` exceeds `maxBytes`.
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* result to its transport's 413.
|
|
6
|
+
* True when the request's declared `Content-Length` exceeds `maxBytes`. Call it
|
|
7
|
+
* BEFORE reading the body, so a huge payload aimed at a small-body endpoint
|
|
8
|
+
* can't burn memory; the route maps `true` to its transport's 413.
|
|
10
9
|
*
|
|
11
|
-
*
|
|
12
|
-
* has to
|
|
13
|
-
*
|
|
14
|
-
* per-route lower bound.
|
|
10
|
+
* This is the per-route lower bound. A global limit (e.g. adapter-node's
|
|
11
|
+
* `BODY_SIZE_LIMIT`) has to clear the largest legitimate upload, so every small
|
|
12
|
+
* JSON endpoint would otherwise inherit that ceiling.
|
|
15
13
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* The global limit is the backstop for those.
|
|
14
|
+
* Requests without `Content-Length` (chunked encoding) slip past this check —
|
|
15
|
+
* the global limit is the backstop there.
|
|
19
16
|
*/
|
|
20
17
|
export declare function declaredBodySizeExceeds(headers: HeadersLike, maxBytes: number): boolean;
|
|
21
18
|
//# sourceMappingURL=body-size.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"body-size.d.ts","sourceRoot":"","sources":["../../src/http/body-size.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,MAAM,WAAW,WAAW;IAC3B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CACjC;AAED
|
|
1
|
+
{"version":3,"file":"body-size.d.ts","sourceRoot":"","sources":["../../src/http/body-size.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,MAAM,WAAW,WAAW;IAC3B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CACjC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGvF"}
|
package/dist/http/body-size.js
CHANGED
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* True when the request's declared `Content-Length` exceeds `maxBytes`.
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* result to its transport's 413.
|
|
2
|
+
* True when the request's declared `Content-Length` exceeds `maxBytes`. Call it
|
|
3
|
+
* BEFORE reading the body, so a huge payload aimed at a small-body endpoint
|
|
4
|
+
* can't burn memory; the route maps `true` to its transport's 413.
|
|
6
5
|
*
|
|
7
|
-
*
|
|
8
|
-
* has to
|
|
9
|
-
*
|
|
10
|
-
* per-route lower bound.
|
|
6
|
+
* This is the per-route lower bound. A global limit (e.g. adapter-node's
|
|
7
|
+
* `BODY_SIZE_LIMIT`) has to clear the largest legitimate upload, so every small
|
|
8
|
+
* JSON endpoint would otherwise inherit that ceiling.
|
|
11
9
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* The global limit is the backstop for those.
|
|
10
|
+
* Requests without `Content-Length` (chunked encoding) slip past this check —
|
|
11
|
+
* the global limit is the backstop there.
|
|
15
12
|
*/
|
|
16
13
|
export function declaredBodySizeExceeds(headers, maxBytes) {
|
|
17
14
|
const declared = Number(headers.get('content-length'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"body-size.js","sourceRoot":"","sources":["../../src/http/body-size.ts"],"names":[],"mappings":"AAKA
|
|
1
|
+
{"version":3,"file":"body-size.js","sourceRoot":"","sources":["../../src/http/body-size.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAoB,EAAE,QAAgB;IAC7E,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACvD,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,QAAQ,CAAC;AACzD,CAAC"}
|
package/dist/http/redirect.d.ts
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Validate a user-supplied post-login redirect target
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* and `/\evil.com` (back-slash variants some browsers normalize) are rejected.
|
|
6
|
-
*
|
|
7
|
-
* Always returns a safe path: the validated target on success, the fallback
|
|
8
|
-
* otherwise. Routes call this with `redirectTo` from form data or query string.
|
|
2
|
+
* Validate a user-supplied post-login redirect target (`redirectTo` from form
|
|
3
|
+
* data or a query string) against open redirects. Returns the target when it is
|
|
4
|
+
* a same-origin relative path, the fallback otherwise — never a raw target.
|
|
9
5
|
*/
|
|
10
6
|
export declare function safeRedirectTarget(raw: string | null | undefined, fallback: string): string;
|
|
11
7
|
//# sourceMappingURL=redirect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redirect.d.ts","sourceRoot":"","sources":["../../src/http/redirect.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"redirect.d.ts","sourceRoot":"","sources":["../../src/http/redirect.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAU3F"}
|