@fuzdev/fuz_app 0.149.0 → 0.150.0
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/dist/actions/CLAUDE.md +9 -7
- package/dist/actions/action_bridge.d.ts +7 -0
- package/dist/actions/action_bridge.d.ts.map +1 -1
- package/dist/actions/action_bridge.js +10 -0
- package/dist/actions/action_event_types.d.ts +1 -1
- package/dist/actions/action_event_types.d.ts.map +1 -1
- package/dist/actions/perform_action.d.ts.map +1 -1
- package/dist/actions/perform_action.js +8 -5
- package/dist/actions/register_action_ws.d.ts +8 -2
- package/dist/actions/register_action_ws.d.ts.map +1 -1
- package/dist/actions/register_action_ws.js +24 -4
- package/dist/actions/transports_ws_auth_guard.d.ts +6 -4
- package/dist/actions/transports_ws_auth_guard.d.ts.map +1 -1
- package/dist/actions/transports_ws_auth_guard.js +9 -6
- package/dist/actions/ws_endpoint_spec.d.ts +1 -1
- package/dist/auth/CLAUDE.md +69 -31
- package/dist/auth/actor_lookup_queries.d.ts +3 -2
- package/dist/auth/actor_lookup_queries.d.ts.map +1 -1
- package/dist/auth/actor_lookup_queries.js +6 -3
- package/dist/auth/actor_search_queries.d.ts +5 -2
- package/dist/auth/actor_search_queries.d.ts.map +1 -1
- package/dist/auth/actor_search_queries.js +11 -4
- package/dist/auth/admin_action_specs.d.ts +4 -4
- package/dist/auth/admin_action_specs.js +4 -4
- package/dist/auth/admin_actions.d.ts.map +1 -1
- package/dist/auth/admin_actions.js +35 -6
- package/dist/auth/all_cell_actions.d.ts +11 -2
- package/dist/auth/all_cell_actions.d.ts.map +1 -1
- package/dist/auth/all_cell_actions.js +2 -1
- package/dist/auth/audit_emitter.d.ts +9 -3
- package/dist/auth/audit_emitter.d.ts.map +1 -1
- package/dist/auth/audit_emitter.js +9 -3
- package/dist/auth/audit_log_schema.d.ts +1 -0
- package/dist/auth/audit_log_schema.d.ts.map +1 -1
- package/dist/auth/audit_log_schema.js +9 -5
- package/dist/auth/bootstrap_account.d.ts +25 -1
- package/dist/auth/bootstrap_account.d.ts.map +1 -1
- package/dist/auth/bootstrap_account.js +37 -4
- package/dist/auth/bootstrap_routes.d.ts +3 -2
- package/dist/auth/bootstrap_routes.d.ts.map +1 -1
- package/dist/auth/bootstrap_routes.js +5 -4
- package/dist/auth/cell_action_specs.d.ts +215 -15
- package/dist/auth/cell_action_specs.d.ts.map +1 -1
- package/dist/auth/cell_action_specs.js +103 -16
- package/dist/auth/cell_actions.d.ts +40 -18
- package/dist/auth/cell_actions.d.ts.map +1 -1
- package/dist/auth/cell_actions.js +126 -19
- package/dist/auth/cell_audit_events.d.ts +1 -1
- package/dist/auth/cell_audit_events.d.ts.map +1 -1
- package/dist/auth/cell_audit_events.js +3 -2
- package/dist/auth/cell_audit_metadata.d.ts +11 -0
- package/dist/auth/cell_audit_metadata.d.ts.map +1 -1
- package/dist/auth/cell_audit_metadata.js +10 -0
- package/dist/auth/cell_grant_action_specs.d.ts +7 -0
- package/dist/auth/cell_grant_action_specs.d.ts.map +1 -1
- package/dist/auth/cell_grant_action_specs.js +7 -0
- package/dist/auth/cell_grant_actions.d.ts +36 -4
- package/dist/auth/cell_grant_actions.d.ts.map +1 -1
- package/dist/auth/cell_grant_actions.js +20 -3
- package/dist/auth/credential_type_schema.d.ts +3 -2
- package/dist/auth/credential_type_schema.d.ts.map +1 -1
- package/dist/auth/credential_type_schema.js +3 -2
- package/dist/auth/role_grant_offer_action_specs.d.ts +18 -2
- package/dist/auth/role_grant_offer_action_specs.d.ts.map +1 -1
- package/dist/auth/role_grant_offer_action_specs.js +25 -3
- package/dist/auth/role_grant_offer_actions.d.ts +9 -4
- package/dist/auth/role_grant_offer_actions.d.ts.map +1 -1
- package/dist/auth/role_grant_offer_actions.js +58 -7
- package/dist/auth/role_grant_offer_notifications.d.ts +3 -2
- package/dist/auth/role_grant_offer_notifications.d.ts.map +1 -1
- package/dist/auth/role_grant_offer_notifications.js +3 -2
- package/dist/auth/role_grant_offer_queries.d.ts +20 -0
- package/dist/auth/role_grant_offer_queries.d.ts.map +1 -1
- package/dist/auth/role_grant_offer_queries.js +35 -0
- package/dist/auth/role_grant_queries.d.ts +27 -9
- package/dist/auth/role_grant_queries.d.ts.map +1 -1
- package/dist/auth/role_grant_queries.js +40 -13
- package/dist/auth/role_schema.d.ts +14 -8
- package/dist/auth/role_schema.d.ts.map +1 -1
- package/dist/auth/role_schema.js +6 -3
- package/dist/auth/self_service_role_actions.d.ts.map +1 -1
- package/dist/auth/self_service_role_actions.js +20 -0
- package/dist/db/CLAUDE.md +9 -2
- package/dist/db/cell_ddl.d.ts +9 -1
- package/dist/db/cell_ddl.d.ts.map +1 -1
- package/dist/db/cell_ddl.js +11 -1
- package/dist/db/cell_queries.d.ts +53 -7
- package/dist/db/cell_queries.d.ts.map +1 -1
- package/dist/db/cell_queries.js +61 -7
- package/dist/http/body_limit.d.ts +3 -1
- package/dist/http/body_limit.d.ts.map +1 -1
- package/dist/http/body_limit.js +6 -1
- package/dist/http/jsonrpc.d.ts +9 -0
- package/dist/http/jsonrpc.d.ts.map +1 -1
- package/dist/http/jsonrpc.js +17 -0
- package/dist/http/jsonrpc_errors.d.ts.map +1 -1
- package/dist/http/jsonrpc_errors.js +29 -20
- package/dist/http/proxy.d.ts +4 -2
- package/dist/http/proxy.d.ts.map +1 -1
- package/dist/http/proxy.js +7 -2
- package/dist/http/surface.d.ts +3 -1
- package/dist/http/surface.d.ts.map +1 -1
- package/dist/http/surface.js +7 -4
- package/dist/realtime/sse_auth_guard.d.ts.map +1 -1
- package/dist/realtime/sse_auth_guard.js +3 -2
- package/dist/schema_meta.d.ts +32 -1
- package/dist/schema_meta.d.ts.map +1 -1
- package/dist/schema_meta.js +58 -5
- package/dist/server/app_server.d.ts +13 -5
- package/dist/server/app_server.d.ts.map +1 -1
- package/dist/server/app_server.js +32 -8
- package/dist/testing/CLAUDE.md +34 -21
- package/dist/testing/app_server.d.ts +3 -1
- package/dist/testing/app_server.d.ts.map +1 -1
- package/dist/testing/cross_backend/actor_lookup.d.ts.map +1 -1
- package/dist/testing/cross_backend/actor_lookup.js +27 -0
- package/dist/testing/cross_backend/capabilities.d.ts +2 -1
- package/dist/testing/cross_backend/capabilities.d.ts.map +1 -1
- package/dist/testing/cross_backend/cell_gated_create.d.ts.map +1 -1
- package/dist/testing/cross_backend/cell_gated_create.js +109 -13
- package/dist/testing/cross_backend/cell_moderate.d.ts +7 -1
- package/dist/testing/cross_backend/cell_moderate.d.ts.map +1 -1
- package/dist/testing/cross_backend/cell_moderate.js +68 -4
- package/dist/testing/cross_backend/cell_ref_admission.d.ts.map +1 -1
- package/dist/testing/cross_backend/cell_ref_admission.js +18 -9
- package/dist/testing/cross_backend/conformance_table.d.ts +5 -0
- package/dist/testing/cross_backend/conformance_table.d.ts.map +1 -1
- package/dist/testing/cross_backend/conformance_table.js +12 -10
- package/dist/testing/cross_backend/differential.d.ts +7 -0
- package/dist/testing/cross_backend/differential.d.ts.map +1 -1
- package/dist/testing/cross_backend/differential.js +17 -0
- package/dist/testing/cross_backend/expected_schema.json +1 -0
- package/dist/testing/cross_backend/full_spine_mount.d.ts.map +1 -1
- package/dist/testing/cross_backend/full_spine_mount.js +5 -4
- package/dist/testing/cross_backend/role_grant_offer_lifecycle.d.ts.map +1 -1
- package/dist/testing/cross_backend/role_grant_offer_lifecycle.js +74 -2
- package/dist/testing/cross_backend/test_cell_gated_create_authorize.d.ts +18 -19
- package/dist/testing/cross_backend/test_cell_gated_create_authorize.d.ts.map +1 -1
- package/dist/testing/cross_backend/test_cell_gated_create_authorize.js +66 -42
- package/dist/testing/cross_backend/transport_composition.js +3 -3
- package/package.json +1 -1
package/dist/http/jsonrpc.js
CHANGED
|
@@ -101,6 +101,23 @@ export const JsonrpcErrorCode = z.union([
|
|
|
101
101
|
z.literal(JSONRPC_INTERNAL_ERROR),
|
|
102
102
|
JsonrpcServerErrorCode
|
|
103
103
|
]);
|
|
104
|
+
/**
|
|
105
|
+
* Whether `value` is a valid JSON-RPC error code — the codes `JsonrpcErrorCode`
|
|
106
|
+
* parses, but integer-only in the server range. A numeric `code` alone doesn't make an error a
|
|
107
|
+
* JSON-RPC one: a `DOMException`'s `code` is a small positive number.
|
|
108
|
+
*
|
|
109
|
+
* @param value - the candidate code
|
|
110
|
+
* @returns whether `value` is one of the standard codes or an integer in the server range
|
|
111
|
+
*/
|
|
112
|
+
export const is_jsonrpc_error_code = (value) => typeof value === 'number' &&
|
|
113
|
+
(value === JSONRPC_PARSE_ERROR ||
|
|
114
|
+
value === JSONRPC_INVALID_REQUEST ||
|
|
115
|
+
value === JSONRPC_METHOD_NOT_FOUND ||
|
|
116
|
+
value === JSONRPC_INVALID_PARAMS ||
|
|
117
|
+
value === JSONRPC_INTERNAL_ERROR ||
|
|
118
|
+
(Number.isInteger(value) &&
|
|
119
|
+
value >= JSONRPC_SERVER_ERROR_END &&
|
|
120
|
+
value <= JSONRPC_SERVER_ERROR_START));
|
|
104
121
|
/** Error object within a JSON-RPC error response. */
|
|
105
122
|
export const JsonrpcErrorObject = z.looseObject({
|
|
106
123
|
code: JsonrpcErrorCode,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonrpc_errors.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/http/jsonrpc_errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,EAQN,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,MAAM,cAAc,CAAC;AAEtB,0CAA0C;AAC1C,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AAErD,sEAAsE;AACtE,MAAM,MAAM,gBAAgB,GACzB,aAAa,GACb,iBAAiB,GACjB,kBAAkB,GAClB,gBAAgB,GAChB,gBAAgB,GAChB,iBAAiB,GACjB,WAAW,GACX,WAAW,GACX,UAAU,GACV,kBAAkB,GAClB,cAAc,GACd,qBAAqB,GACrB,SAAS,GACT,gBAAgB,GAChB,mBAAmB,CAAC;AAEvB;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,EA4C1B,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,OAAO,CAAC,KAAG,CAAC,GAAG,SAAsC,CAAC;AAElF;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,EAmG7B,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,kBAAkB,CAAC,CAAC,CAAC;AAEtF;;;;;GAKG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC5C,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;gBAEH,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,YAAY;CAK3F;AAWD;;;;GAIG;AACH,eAAO,MAAM,cAAc;8CAXQ,kBAAkB;kDAAlB,kBAAkB;mDAAlB,kBAAkB;iDAAlB,kBAAkB;iDAAlB,kBAAkB;kDAAlB,kBAAkB;4CAAlB,kBAAkB;4CAAlB,kBAAkB;2CAAlB,kBAAkB;mDAAlB,kBAAkB;+CAAlB,kBAAkB;sDAAlB,kBAAkB;0CAAlB,kBAAkB;iDAAlB,kBAAkB;oDAAlB,kBAAkB;CA2BqC,CAAC;
|
|
1
|
+
{"version":3,"file":"jsonrpc_errors.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/http/jsonrpc_errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,EAQN,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,MAAM,cAAc,CAAC;AAEtB,0CAA0C;AAC1C,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AAErD,sEAAsE;AACtE,MAAM,MAAM,gBAAgB,GACzB,aAAa,GACb,iBAAiB,GACjB,kBAAkB,GAClB,gBAAgB,GAChB,gBAAgB,GAChB,iBAAiB,GACjB,WAAW,GACX,WAAW,GACX,UAAU,GACV,kBAAkB,GAClB,cAAc,GACd,qBAAqB,GACrB,SAAS,GACT,gBAAgB,GAChB,mBAAmB,CAAC;AAEvB;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,EA4C1B,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,OAAO,CAAC,KAAG,CAAC,GAAG,SAAsC,CAAC;AAElF;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,EAmG7B,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,kBAAkB,CAAC,CAAC,CAAC;AAEtF;;;;;GAKG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC5C,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;gBAEH,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,YAAY;CAK3F;AAWD;;;;GAIG;AACH,eAAO,MAAM,cAAc;8CAXQ,kBAAkB;kDAAlB,kBAAkB;mDAAlB,kBAAkB;iDAAlB,kBAAkB;iDAAlB,kBAAkB;kDAAlB,kBAAkB;4CAAlB,kBAAkB;4CAAlB,kBAAkB;2CAAlB,kBAAkB;mDAAlB,kBAAkB;+CAAlB,kBAAkB;sDAAlB,kBAAkB;0CAAlB,kBAAkB;iDAAlB,kBAAkB;oDAAlB,kBAAkB;CA2BqC,CAAC;AAiD3F;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,2BAA2B,GAAI,MAAM,gBAAgB,EAAE,aAAa,MAAM,KAAG,IA0BzF,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,iCAAiC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAQvF,CAAC;AAEH;;;;;;;;;GASG;AACH,eAAO,MAAM,iCAAiC,GAAI,MAAM,gBAAgB,KAAG,oBACC,CAAC;AAE7E;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,GAAI,QAAQ,MAAM,KAAG,gBACa,CAAC;AAEjF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAMjF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,GAAI,MAAM,gBAAgB,KAAG,gBACL,CAAC"}
|
|
@@ -226,6 +226,31 @@ export const jsonrpc_errors = {
|
|
|
226
226
|
request_cancelled: create_error_thrower(jsonrpc_error_messages.request_cancelled)
|
|
227
227
|
};
|
|
228
228
|
// --- HTTP status mapping ---
|
|
229
|
+
/**
|
|
230
|
+
* The HTTP status each base JSON-RPC error code answers, keyed by name so a
|
|
231
|
+
* builtin added without a status is a type error. Entry order is the reverse
|
|
232
|
+
* map's tie-break (last wins).
|
|
233
|
+
*/
|
|
234
|
+
const BASE_JSONRPC_ERROR_CODE_HTTP_STATUSES = {
|
|
235
|
+
parse_error: 400,
|
|
236
|
+
invalid_request: 400,
|
|
237
|
+
method_not_found: 404,
|
|
238
|
+
invalid_params: 400,
|
|
239
|
+
internal_error: 500,
|
|
240
|
+
unauthenticated: 401,
|
|
241
|
+
forbidden: 403,
|
|
242
|
+
not_found: 404,
|
|
243
|
+
conflict: 409,
|
|
244
|
+
validation_error: 422,
|
|
245
|
+
// queue_overflow shares 429 with rate_limited — listed first so the
|
|
246
|
+
// last-wins reverse map resolves 429 to rate_limited (a policy) rather
|
|
247
|
+
// than a full buffer
|
|
248
|
+
queue_overflow: 429,
|
|
249
|
+
rate_limited: 429,
|
|
250
|
+
service_unavailable: 503,
|
|
251
|
+
timeout: 504,
|
|
252
|
+
request_cancelled: 499 // nginx "client closed request"
|
|
253
|
+
};
|
|
229
254
|
/**
|
|
230
255
|
* The HTTP status each JSON-RPC error code answers — the base set, plus each
|
|
231
256
|
* consumer code `register_jsonrpc_error_code` adds.
|
|
@@ -233,26 +258,10 @@ export const jsonrpc_errors = {
|
|
|
233
258
|
* Module-private so a consumer can't remap a base code or skip the checks
|
|
234
259
|
* registration makes; read it through `jsonrpc_error_code_to_http_status`.
|
|
235
260
|
*/
|
|
236
|
-
const jsonrpc_error_code_http_statuses = new Map([
|
|
237
|
-
[
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
[JSONRPC_INVALID_PARAMS, 400],
|
|
241
|
-
[JSONRPC_INTERNAL_ERROR, 500],
|
|
242
|
-
[JSONRPC_ERROR_CODES.unauthenticated, 401],
|
|
243
|
-
[JSONRPC_ERROR_CODES.forbidden, 403],
|
|
244
|
-
[JSONRPC_ERROR_CODES.not_found, 404],
|
|
245
|
-
[JSONRPC_ERROR_CODES.conflict, 409],
|
|
246
|
-
[JSONRPC_ERROR_CODES.validation_error, 422],
|
|
247
|
-
// queue_overflow shares 429 with rate_limited — listed first so the
|
|
248
|
-
// last-wins reverse map resolves 429 to rate_limited (a policy) rather
|
|
249
|
-
// than a full buffer
|
|
250
|
-
[JSONRPC_ERROR_CODES.queue_overflow, 429],
|
|
251
|
-
[JSONRPC_ERROR_CODES.rate_limited, 429],
|
|
252
|
-
[JSONRPC_ERROR_CODES.service_unavailable, 503],
|
|
253
|
-
[JSONRPC_ERROR_CODES.timeout, 504],
|
|
254
|
-
[JSONRPC_ERROR_CODES.request_cancelled, 499] // nginx "client closed request"
|
|
255
|
-
]);
|
|
261
|
+
const jsonrpc_error_code_http_statuses = new Map(Object.entries(BASE_JSONRPC_ERROR_CODE_HTTP_STATUSES).map(([name, status]) => [
|
|
262
|
+
JSONRPC_ERROR_CODES[name],
|
|
263
|
+
status
|
|
264
|
+
]));
|
|
256
265
|
/** Every code `JSONRPC_ERROR_CODES` defines — the numbers a consumer code may not reuse. */
|
|
257
266
|
const BASE_JSONRPC_ERROR_CODE_SET = new Set(Object.values(JSONRPC_ERROR_CODES));
|
|
258
267
|
/**
|
package/dist/http/proxy.d.ts
CHANGED
|
@@ -56,10 +56,12 @@ export type ParsedProxy = {
|
|
|
56
56
|
*
|
|
57
57
|
* Accepts plain IPs (`'127.0.0.1'`, `'::1'`) and CIDR notation (`'10.0.0.0/8'`, `'fe80::/10'`).
|
|
58
58
|
* Plain IPs are normalized (lowercase, IPv4-mapped IPv6 stripped) and validated.
|
|
59
|
-
* CIDR prefixes are validated against address family bounds.
|
|
59
|
+
* CIDR prefixes are validated against address family bounds. A `/0` prefix is
|
|
60
|
+
* refused for either family: it trusts every client as a proxy, so the client's
|
|
61
|
+
* own `X-Forwarded-For` would choose the IP every per-IP limiter keys on.
|
|
60
62
|
*
|
|
61
63
|
* @param entry - IP address or CIDR notation
|
|
62
|
-
* @throws Error on invalid IP, invalid CIDR network,
|
|
64
|
+
* @throws Error on invalid IP, invalid CIDR network, NaN/negative/over-range prefix, or a `/0` prefix
|
|
63
65
|
*/
|
|
64
66
|
export declare const parse_proxy_entry: (entry: string) => ParsedProxy;
|
|
65
67
|
/**
|
package/dist/http/proxy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/http/proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAEvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,YAAY,GAAI,IAAI,MAAM,KAAG,MAA6B,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,sFAAsF;IACtF,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/B,+DAA+D;IAC/D,iBAAiB,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAC;IACtD,wDAAwD;IACxD,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GACpB;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAC;AAEpF
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/http/proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAEvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,YAAY,GAAI,IAAI,MAAM,KAAG,MAA6B,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,sFAAsF;IACtF,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/B,+DAA+D;IAC/D,iBAAiB,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAC;IACtD,wDAAwD;IACxD,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GACpB;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAC;AAEpF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,KAAG,WAgDjD,CAAC;AAiBF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,kBAAkB,GAAI,IAAI,MAAM,KAAG,MAAM,GAAG,MAAM,GAAG,SAWjE,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,GAAI,IAAI,MAAM,EAAE,SAAS,KAAK,CAAC,WAAW,CAAC,KAAG,OAqBvE,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,iBAAiB,GAC7B,eAAe,MAAM,EACrB,SAAS,KAAK,CAAC,WAAW,CAAC,KACzB,MAAM,GAAG,SAqBX,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,uBAAuB,GAAI,SAAS,YAAY,KAAG,iBAyC/D,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,GAAI,SAAS,YAAY,KAAG,cAInE,CAAC"}
|
package/dist/http/proxy.js
CHANGED
|
@@ -32,10 +32,12 @@ export const normalize_ip = (ip) => canonicalize_ip(ip);
|
|
|
32
32
|
*
|
|
33
33
|
* Accepts plain IPs (`'127.0.0.1'`, `'::1'`) and CIDR notation (`'10.0.0.0/8'`, `'fe80::/10'`).
|
|
34
34
|
* Plain IPs are normalized (lowercase, IPv4-mapped IPv6 stripped) and validated.
|
|
35
|
-
* CIDR prefixes are validated against address family bounds.
|
|
35
|
+
* CIDR prefixes are validated against address family bounds. A `/0` prefix is
|
|
36
|
+
* refused for either family: it trusts every client as a proxy, so the client's
|
|
37
|
+
* own `X-Forwarded-For` would choose the IP every per-IP limiter keys on.
|
|
36
38
|
*
|
|
37
39
|
* @param entry - IP address or CIDR notation
|
|
38
|
-
* @throws Error on invalid IP, invalid CIDR network,
|
|
40
|
+
* @throws Error on invalid IP, invalid CIDR network, NaN/negative/over-range prefix, or a `/0` prefix
|
|
39
41
|
*/
|
|
40
42
|
export const parse_proxy_entry = (entry) => {
|
|
41
43
|
const slash_index = entry.indexOf('/');
|
|
@@ -59,6 +61,9 @@ export const parse_proxy_entry = (entry) => {
|
|
|
59
61
|
throw new Error(`Invalid CIDR prefix (not an integer): ${entry}`);
|
|
60
62
|
}
|
|
61
63
|
const address_type = distinctRemoteAddr(network_str);
|
|
64
|
+
if (prefix === 0 && (address_type === 'IPv4' || address_type === 'IPv6')) {
|
|
65
|
+
throw new Error(`CIDR prefix 0 trusts every address as a proxy: ${entry}`);
|
|
66
|
+
}
|
|
62
67
|
if (address_type === 'IPv4') {
|
|
63
68
|
if (prefix > 32) {
|
|
64
69
|
throw new Error(`Invalid CIDR prefix for IPv4 (max 32): ${entry}`);
|
package/dist/http/surface.d.ts
CHANGED
|
@@ -198,7 +198,9 @@ export interface GenerateAppSurfaceOptions {
|
|
|
198
198
|
*/
|
|
199
199
|
export declare const collect_middleware_errors: (middleware: Array<MiddlewareSpec>, route_path: string) => RouteErrorSchemas | null;
|
|
200
200
|
/**
|
|
201
|
-
* Convert env schema to surface entries using `.meta()` metadata
|
|
201
|
+
* Convert env schema to surface entries using `.meta()` metadata, read
|
|
202
|
+
* through each field's wrappers — `schema_meta_value` for the description,
|
|
203
|
+
* the wider fail-safe `schema_sensitivity` walk for secrets.
|
|
202
204
|
*
|
|
203
205
|
* @param schema - Zod object schema with `.meta()` on fields
|
|
204
206
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"surface.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/http/surface.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"surface.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/http/surface.ts"],"names":[],"mappings":"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"}
|
package/dist/http/surface.js
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { z } from 'zod';
|
|
10
10
|
import { schema_to_surface, middleware_spec_applies, merge_error_schemas, is_null_schema, is_strict_object_schema } from './schema_helpers.js';
|
|
11
|
+
import { schema_meta_value, schema_sensitivity } from '../schema_meta.js';
|
|
11
12
|
// --- Surface generation ---
|
|
12
13
|
/**
|
|
13
14
|
* Collect error schemas from all middleware that applies to a route path.
|
|
@@ -24,7 +25,9 @@ export const collect_middleware_errors = (middleware, route_path) => {
|
|
|
24
25
|
return Object.keys(errors).length > 0 ? errors : null;
|
|
25
26
|
};
|
|
26
27
|
/**
|
|
27
|
-
* Convert env schema to surface entries using `.meta()` metadata
|
|
28
|
+
* Convert env schema to surface entries using `.meta()` metadata, read
|
|
29
|
+
* through each field's wrappers — `schema_meta_value` for the description,
|
|
30
|
+
* the wider fail-safe `schema_sensitivity` walk for secrets.
|
|
28
31
|
*
|
|
29
32
|
* @param schema - Zod object schema with `.meta()` on fields
|
|
30
33
|
*/
|
|
@@ -32,12 +35,12 @@ export const env_schema_to_surface = (schema) => {
|
|
|
32
35
|
const entries = [];
|
|
33
36
|
for (const [name, field_schema] of Object.entries(schema.shape)) {
|
|
34
37
|
const field = field_schema;
|
|
35
|
-
const meta = field.meta();
|
|
36
38
|
const undef_result = field.safeParse(undefined);
|
|
37
39
|
entries.push({
|
|
38
40
|
name,
|
|
39
|
-
|
|
40
|
-
|
|
41
|
+
// read through wrappers — a `.meta()` under `.optional()` is not on the outer schema
|
|
42
|
+
description: schema_meta_value(field, 'description') ?? '',
|
|
43
|
+
sensitivity: schema_sensitivity(field) ?? null,
|
|
41
44
|
has_default: undef_result.success && undef_result.data !== undefined,
|
|
42
45
|
optional: undef_result.success
|
|
43
46
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse_auth_guard.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/realtime/sse_auth_guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAGtD,OAAO,EAKN,KAAK,aAAa,EAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACxF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE3D,2DAA2D;AAC3D,eAAO,MAAM,iBAAiB,cAAc,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,4BAA4B,GAAI,CAAC,EAC7C,UAAU,kBAAkB,CAAC,CAAC,CAAC,EAC/B,eAAe,MAAM,GAAG,IAAI,KAC1B,gBAOD,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,eAAO,MAAM,qBAAqB,GAAI,CAAC,EACtC,UAAU,kBAAkB,CAAC,CAAC,CAAC,EAC/B,eAAe,MAAM,GAAG,IAAI,EAC5B,KAAK,MAAM,KACT,CAAC,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,
|
|
1
|
+
{"version":3,"file":"sse_auth_guard.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/realtime/sse_auth_guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAGtD,OAAO,EAKN,KAAK,aAAa,EAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACxF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE3D,2DAA2D;AAC3D,eAAO,MAAM,iBAAiB,cAAc,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,4BAA4B,GAAI,CAAC,EAC7C,UAAU,kBAAkB,CAAC,CAAC,CAAC,EAC/B,eAAe,MAAM,GAAG,IAAI,KAC1B,gBAOD,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,eAAO,MAAM,qBAAqB,GAAI,CAAC,EACtC,UAAU,kBAAkB,CAAC,CAAC,CAAC,EAC/B,eAAe,MAAM,GAAG,IAAI,EAC5B,KAAK,MAAM,KACT,CAAC,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAqEjC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC3B;;;;;OAKG;IACH,QAAQ,EAAE,kBAAkB,CAAC,eAAe,CAAC,CAAC;IAC9C,kFAAkF;IAClF,GAAG,EAAE,MAAM,CAAC;IACZ,yJAAyJ;IACzJ,cAAc,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC/C;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,SAAS,CAOlD,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,eAAO,MAAM,oBAAoB,GAAI,SAAS;IAC7C,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;;;;;OASG;IACH,iBAAiB,EAAE,cAAc,GAAG,IAAI,CAAC;IACzC;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,KAAG,WAiBH,CAAC"}
|
|
@@ -96,8 +96,9 @@ export const create_sse_auth_guard = (registry, required_role, log) => {
|
|
|
96
96
|
// attacker-controlled identifiers (e.g., session_revoke with outcome=failure
|
|
97
97
|
// carries the submitted session_id even when the DB rejected the cross-account
|
|
98
98
|
// mutation) — reacting to them lets any authenticated user close another
|
|
99
|
-
// user's SSE stream by guessing or leaking a session hash.
|
|
100
|
-
|
|
99
|
+
// user's SSE stream by guessing or leaking a session hash. Matching the
|
|
100
|
+
// success keeps an outcome outside the enum inert, as on the Rust spine.
|
|
101
|
+
if (event.outcome !== 'success')
|
|
101
102
|
return;
|
|
102
103
|
const scope = to_revocation_scope(event.event_type);
|
|
103
104
|
switch (scope) {
|
package/dist/schema_meta.d.ts
CHANGED
|
@@ -11,7 +11,11 @@ import type { Sensitivity } from './sensitivity.js';
|
|
|
11
11
|
/** Zod `.meta()` shape for fuz_app schema metadata conventions. */
|
|
12
12
|
export interface SchemaFieldMeta {
|
|
13
13
|
description?: string;
|
|
14
|
-
/**
|
|
14
|
+
/**
|
|
15
|
+
* Sensitivity level for masking/redaction. `'secret'` masks the value.
|
|
16
|
+
* Read through every wrapping layer (`schema_sensitivity`), so
|
|
17
|
+
* `.meta({sensitivity: 'secret'}).optional()` masks too.
|
|
18
|
+
*/
|
|
15
19
|
sensitivity?: Sensitivity;
|
|
16
20
|
/**
|
|
17
21
|
* Set on an action's **input** schema that accepts `{}` by design while
|
|
@@ -56,6 +60,17 @@ export interface SchemaFieldMeta {
|
|
|
56
60
|
* @returns whether its handler refuses the `{}` the schema admits
|
|
57
61
|
*/
|
|
58
62
|
export declare const is_empty_input_handler_guarded: (schema: z.ZodType) => boolean;
|
|
63
|
+
/**
|
|
64
|
+
* A `SchemaFieldMeta` key's value as a schema declares it, read through its
|
|
65
|
+
* optional, nullable, default, prefault, transform and pipe layers — Zod
|
|
66
|
+
* keeps `.meta()` on the instance it was set on, so a wrapper added after it
|
|
67
|
+
* carries none — the outermost declaration winning.
|
|
68
|
+
*
|
|
69
|
+
* @param schema - a field schema, possibly wrapped
|
|
70
|
+
* @param key - the metadata key to read
|
|
71
|
+
* @returns the declared value, or `undefined` when no layer declares one
|
|
72
|
+
*/
|
|
73
|
+
export declare const schema_meta_value: <TKey extends keyof SchemaFieldMeta>(schema: z.ZodType, key: TKey) => SchemaFieldMeta[TKey] | undefined;
|
|
59
74
|
/**
|
|
60
75
|
* The `invalid_reason` a schema declares, read through its wrappers, the
|
|
61
76
|
* outermost declaration winning.
|
|
@@ -64,6 +79,22 @@ export declare const is_empty_input_handler_guarded: (schema: z.ZodType) => bool
|
|
|
64
79
|
* @returns the declared reason, or `undefined` when no layer declares one
|
|
65
80
|
*/
|
|
66
81
|
export declare const schema_invalid_reason: (schema: z.ZodType) => string | undefined;
|
|
82
|
+
/**
|
|
83
|
+
* The `sensitivity` a schema declares anywhere among its wrapping layers, so
|
|
84
|
+
* a secret stays masked however the field is wrapped. Fail-safe where
|
|
85
|
+
* `schema_meta_value` reads one chain: the walk follows the `innerType` of
|
|
86
|
+
* every wrapper that has one (optional, nullable, default, prefault,
|
|
87
|
+
* nonoptional, catch, readonly), both sides of a pipe (so `.transform()`,
|
|
88
|
+
* `z.preprocess()` and `.pipe(secret)` all reach the secret), and a
|
|
89
|
+
* `z.lazy()` getter, and every member of a union or intersection (the
|
|
90
|
+
* value is one of them), visiting each schema once, and answers `'secret'`
|
|
91
|
+
* when any layer reached declares it. It stops at structural schemas — an
|
|
92
|
+
* object's fields and an array's element carry their own.
|
|
93
|
+
*
|
|
94
|
+
* @param schema - a field schema, possibly wrapped
|
|
95
|
+
* @returns `'secret'` when any reachable layer declares it, else `undefined`
|
|
96
|
+
*/
|
|
97
|
+
export declare const schema_sensitivity: (schema: z.ZodType) => Sensitivity | undefined;
|
|
67
98
|
/**
|
|
68
99
|
* The `error.data.reason` an input validation failure at `path` carries: the
|
|
69
100
|
* `invalid_reason` of the deepest field along `path` that declares one.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema_meta.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/schema_meta.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD,mEAAmE;AACnE,MAAM,WAAW,eAAe;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB
|
|
1
|
+
{"version":3,"file":"schema_meta.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/schema_meta.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD,mEAAmE;AACnE,MAAM,WAAW,eAAe;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;;;;;;;;OAUG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,GAAI,QAAQ,CAAC,CAAC,OAAO,KAAG,OACkB,CAAC;AAEtF;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,GAAI,IAAI,SAAS,MAAM,eAAe,EACnE,QAAQ,CAAC,CAAC,OAAO,EACjB,KAAK,IAAI,KACP,eAAe,CAAC,IAAI,CAAC,GAAG,SAM1B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GAAI,QAAQ,CAAC,CAAC,OAAO,KAAG,MAAM,GAAG,SACvB,CAAC;AAE7C;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,kBAAkB,GAAI,QAAQ,CAAC,CAAC,OAAO,KAAG,WAAW,GAAG,SAuBpE,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,sBAAsB,GAClC,cAAc,CAAC,CAAC,OAAO,EACvB,MAAM,aAAa,CAAC,WAAW,CAAC,KAC9B,MAAM,GAAG,SAYX,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,6BAA6B,GACzC,cAAc,CAAC,CAAC,OAAO,EACvB,QAAQ,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KACrC,MAAM,GAAG,SAIX,CAAC"}
|
package/dist/schema_meta.js
CHANGED
|
@@ -14,6 +14,24 @@ import { zod_get_schema_layers, zod_unwrap_to_object } from './zod.js';
|
|
|
14
14
|
* @returns whether its handler refuses the `{}` the schema admits
|
|
15
15
|
*/
|
|
16
16
|
export const is_empty_input_handler_guarded = (schema) => schema.meta()?.empty_input_handler_guarded === true;
|
|
17
|
+
/**
|
|
18
|
+
* A `SchemaFieldMeta` key's value as a schema declares it, read through its
|
|
19
|
+
* optional, nullable, default, prefault, transform and pipe layers — Zod
|
|
20
|
+
* keeps `.meta()` on the instance it was set on, so a wrapper added after it
|
|
21
|
+
* carries none — the outermost declaration winning.
|
|
22
|
+
*
|
|
23
|
+
* @param schema - a field schema, possibly wrapped
|
|
24
|
+
* @param key - the metadata key to read
|
|
25
|
+
* @returns the declared value, or `undefined` when no layer declares one
|
|
26
|
+
*/
|
|
27
|
+
export const schema_meta_value = (schema, key) => {
|
|
28
|
+
for (const layer of zod_get_schema_layers(schema)) {
|
|
29
|
+
const value = layer.meta()?.[key];
|
|
30
|
+
if (value !== undefined)
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
return undefined;
|
|
34
|
+
};
|
|
17
35
|
/**
|
|
18
36
|
* The `invalid_reason` a schema declares, read through its wrappers, the
|
|
19
37
|
* outermost declaration winning.
|
|
@@ -21,11 +39,46 @@ export const is_empty_input_handler_guarded = (schema) => schema.meta()?.empty_i
|
|
|
21
39
|
* @param schema - a field schema, possibly wrapped
|
|
22
40
|
* @returns the declared reason, or `undefined` when no layer declares one
|
|
23
41
|
*/
|
|
24
|
-
export const schema_invalid_reason = (schema) =>
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
42
|
+
export const schema_invalid_reason = (schema) => schema_meta_value(schema, 'invalid_reason');
|
|
43
|
+
/**
|
|
44
|
+
* The `sensitivity` a schema declares anywhere among its wrapping layers, so
|
|
45
|
+
* a secret stays masked however the field is wrapped. Fail-safe where
|
|
46
|
+
* `schema_meta_value` reads one chain: the walk follows the `innerType` of
|
|
47
|
+
* every wrapper that has one (optional, nullable, default, prefault,
|
|
48
|
+
* nonoptional, catch, readonly), both sides of a pipe (so `.transform()`,
|
|
49
|
+
* `z.preprocess()` and `.pipe(secret)` all reach the secret), and a
|
|
50
|
+
* `z.lazy()` getter, and every member of a union or intersection (the
|
|
51
|
+
* value is one of them), visiting each schema once, and answers `'secret'`
|
|
52
|
+
* when any layer reached declares it. It stops at structural schemas — an
|
|
53
|
+
* object's fields and an array's element carry their own.
|
|
54
|
+
*
|
|
55
|
+
* @param schema - a field schema, possibly wrapped
|
|
56
|
+
* @returns `'secret'` when any reachable layer declares it, else `undefined`
|
|
57
|
+
*/
|
|
58
|
+
export const schema_sensitivity = (schema) => {
|
|
59
|
+
const seen = new Set();
|
|
60
|
+
const pending = [schema];
|
|
61
|
+
while (pending.length > 0) {
|
|
62
|
+
const layer = pending.pop();
|
|
63
|
+
if (seen.has(layer))
|
|
64
|
+
continue;
|
|
65
|
+
seen.add(layer);
|
|
66
|
+
if (layer.meta()?.sensitivity === 'secret')
|
|
67
|
+
return 'secret';
|
|
68
|
+
const def = layer.def;
|
|
69
|
+
if (def.type === 'lazy') {
|
|
70
|
+
pending.push(layer._zod.innerType);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (def.type === 'union' && Array.isArray(def.options)) {
|
|
74
|
+
pending.push(...def.options);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
for (const key of ['innerType', 'in', 'out', 'left', 'right']) {
|
|
78
|
+
const sub = def[key];
|
|
79
|
+
if (sub && typeof sub === 'object' && 'def' in sub)
|
|
80
|
+
pending.push(sub);
|
|
81
|
+
}
|
|
29
82
|
}
|
|
30
83
|
return undefined;
|
|
31
84
|
};
|
|
@@ -88,7 +88,10 @@ export interface AppServerOptions {
|
|
|
88
88
|
backend: AppBackend;
|
|
89
89
|
/** Session options for cookie-based auth. */
|
|
90
90
|
session_options: SessionOptions<string>;
|
|
91
|
-
/**
|
|
91
|
+
/**
|
|
92
|
+
* Parsed allowed origin patterns. Must not be empty — an empty list would
|
|
93
|
+
* refuse every browser request, so assembly throws.
|
|
94
|
+
*/
|
|
92
95
|
allowed_origins: Array<RegExp>;
|
|
93
96
|
/**
|
|
94
97
|
* Paths the origin check skips, each with its reason. The check covers
|
|
@@ -188,9 +191,11 @@ export interface AppServerOptions {
|
|
|
188
191
|
*/
|
|
189
192
|
action_account_rate_limiter?: RateLimiter | null;
|
|
190
193
|
/**
|
|
191
|
-
* Maximum allowed request body size in bytes
|
|
192
|
-
* Omit or `undefined` to use the
|
|
193
|
-
* Pass `null` to explicitly disable body size limiting
|
|
194
|
+
* Maximum allowed request body size in bytes, a safe integer `0` or more
|
|
195
|
+
* (anything else throws at assembly). Omit or `undefined` to use the
|
|
196
|
+
* default (1 MiB). Pass `null` to explicitly disable body size limiting,
|
|
197
|
+
* which adds a security warning to the surface's diagnostics (logged at
|
|
198
|
+
* startup).
|
|
194
199
|
*/
|
|
195
200
|
max_body_size?: number | null;
|
|
196
201
|
/** Daemon token state for keeper auth. Omit to disable. */
|
|
@@ -583,13 +588,16 @@ export interface ConfigDiagnosticsInput {
|
|
|
583
588
|
rate_limiter_mode: RateLimiterMode;
|
|
584
589
|
/** The resolved limiters, from `resolve_rate_limiters`. */
|
|
585
590
|
rate_limiters: Record<AppServerRateLimiterKey, RateLimiter | null>;
|
|
591
|
+
/** `AppServerOptions.max_body_size` as passed; `null` disables the body size limit. */
|
|
592
|
+
max_body_size: number | null | undefined;
|
|
586
593
|
}
|
|
587
594
|
/**
|
|
588
595
|
* The config-level diagnostics `create_app_server` appends to the surface's
|
|
589
596
|
* spec-level ones: a weakened session cookie, and an open rate-limited
|
|
590
597
|
* surface — one warning for `'disabled_for_testing'`, otherwise one per
|
|
591
598
|
* explicitly-null limiter, so a deployment that disables login's limiter but
|
|
592
|
-
* keeps signup's reads differently from one that disables both
|
|
599
|
+
* keeps signup's reads differently from one that disables both — and a
|
|
600
|
+
* disabled request body size limit (`max_body_size: null`).
|
|
593
601
|
*
|
|
594
602
|
* @internal
|
|
595
603
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app_server.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/server/app_server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAAE,KAAK,OAAO,
|
|
1
|
+
{"version":3,"file":"app_server.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/server/app_server.ts"],"names":[],"mappings":"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"}
|
|
@@ -126,7 +126,8 @@ export const resolve_rate_limiters = (options) => {
|
|
|
126
126
|
* spec-level ones: a weakened session cookie, and an open rate-limited
|
|
127
127
|
* surface — one warning for `'disabled_for_testing'`, otherwise one per
|
|
128
128
|
* explicitly-null limiter, so a deployment that disables login's limiter but
|
|
129
|
-
* keeps signup's reads differently from one that disables both
|
|
129
|
+
* keeps signup's reads differently from one that disables both — and a
|
|
130
|
+
* disabled request body size limit (`max_body_size: null`).
|
|
130
131
|
*
|
|
131
132
|
* @internal
|
|
132
133
|
*/
|
|
@@ -176,6 +177,14 @@ export const collect_config_diagnostics = (input) => {
|
|
|
176
177
|
}
|
|
177
178
|
}
|
|
178
179
|
}
|
|
180
|
+
if (input.max_body_size === null) {
|
|
181
|
+
diagnostics.push({
|
|
182
|
+
level: 'warning',
|
|
183
|
+
category: 'security',
|
|
184
|
+
message: 'request body size limit explicitly disabled (max_body_size: null) — ' +
|
|
185
|
+
'every route must cap its own body'
|
|
186
|
+
});
|
|
187
|
+
}
|
|
179
188
|
return diagnostics;
|
|
180
189
|
};
|
|
181
190
|
/**
|
|
@@ -249,6 +258,16 @@ const assemble_app_server = async (options, releases) => {
|
|
|
249
258
|
const { backend } = options;
|
|
250
259
|
const { deps } = backend;
|
|
251
260
|
const { log } = deps;
|
|
261
|
+
// option checks first, before anything is acquired
|
|
262
|
+
if (options.allowed_origins.length === 0) {
|
|
263
|
+
throw new Error('create_app_server: allowed_origins is empty — list at least one origin pattern ' +
|
|
264
|
+
'(an empty list refuses every browser request)');
|
|
265
|
+
}
|
|
266
|
+
// body size limit — rejects oversized payloads before auth/validation; the
|
|
267
|
+
// middleware throws on a cap that is not a safe integer 0 or more
|
|
268
|
+
const body_limit_middleware = options.max_body_size === null
|
|
269
|
+
? null
|
|
270
|
+
: create_body_limit_middleware(options.max_body_size ?? DEFAULT_MAX_BODY_SIZE);
|
|
252
271
|
// Rate limiters — the ones built here are the server's to dispose, on
|
|
253
272
|
// close or when assembly fails.
|
|
254
273
|
const { mode: rate_limiter_mode, limiters: rate_limiters, built: built_rate_limiters } = resolve_rate_limiters(options);
|
|
@@ -392,7 +411,8 @@ const assemble_app_server = async (options, releases) => {
|
|
|
392
411
|
// WS path checks — pure data, so they run before anything mounts.
|
|
393
412
|
// `register_ws_endpoint` mounts a `GET path` upgrade route: a duplicate
|
|
394
413
|
// path, or one a `RouteSpec` already registered as `GET path`, would be
|
|
395
|
-
// silently shadowed by Hono's last-wins semantics — fail fast instead.
|
|
414
|
+
// silently shadowed by Hono's last-wins semantics — fail fast instead. An
|
|
415
|
+
// endpoint's own empty `allowed_origins` would refuse every browser upgrade.
|
|
396
416
|
if (ws_mount) {
|
|
397
417
|
const route_spec_get_paths = new Set();
|
|
398
418
|
for (const r of route_specs) {
|
|
@@ -407,6 +427,11 @@ const assemble_app_server = async (options, releases) => {
|
|
|
407
427
|
if (route_spec_get_paths.has(endpoint.path)) {
|
|
408
428
|
throw new Error(`create_app_server: ws_endpoints path collides with a GET RouteSpec: ${endpoint.path}`);
|
|
409
429
|
}
|
|
430
|
+
if (endpoint.allowed_origins.length === 0) {
|
|
431
|
+
throw new Error(`create_app_server: ws_endpoints allowed_origins is empty for ${endpoint.path} — ` +
|
|
432
|
+
'list at least one origin pattern, or omit it to take the server list ' +
|
|
433
|
+
'(an empty list refuses every browser upgrade)');
|
|
434
|
+
}
|
|
410
435
|
seen_paths.add(endpoint.path);
|
|
411
436
|
}
|
|
412
437
|
}
|
|
@@ -430,7 +455,8 @@ const assemble_app_server = async (options, releases) => {
|
|
|
430
455
|
const config_diagnostics = collect_config_diagnostics({
|
|
431
456
|
cookie_options: options.session_options.cookie_options,
|
|
432
457
|
rate_limiter_mode,
|
|
433
|
-
rate_limiters
|
|
458
|
+
rate_limiters,
|
|
459
|
+
max_body_size: options.max_body_size
|
|
434
460
|
});
|
|
435
461
|
if (config_diagnostics.length) {
|
|
436
462
|
surface_spec.surface.diagnostics = [...surface_spec.surface.diagnostics, ...config_diagnostics];
|
|
@@ -483,11 +509,9 @@ const assemble_app_server = async (options, releases) => {
|
|
|
483
509
|
if (log.level !== 'off') {
|
|
484
510
|
app.use(logger((msg) => log.info(msg)));
|
|
485
511
|
}
|
|
486
|
-
//
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
const max_size = options.max_body_size ?? DEFAULT_MAX_BODY_SIZE;
|
|
490
|
-
app.use(create_body_limit_middleware(max_size));
|
|
512
|
+
// body size limit, built with the option checks above
|
|
513
|
+
if (body_limit_middleware) {
|
|
514
|
+
app.use(body_limit_middleware);
|
|
491
515
|
}
|
|
492
516
|
apply_middleware_specs(app, middleware_specs);
|
|
493
517
|
const authorize = create_fuz_authorization_handler({ db: deps.db });
|