@fuzdev/fuz_app 0.87.0 → 0.89.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/action_rpc.js +1 -1
- package/dist/actions/register_action_ws.js +1 -1
- package/dist/auth/CLAUDE.md +15 -0
- package/dist/auth/account_actions.js +1 -1
- package/dist/auth/account_route_schema.d.ts +152 -0
- package/dist/auth/account_route_schema.d.ts.map +1 -0
- package/dist/auth/account_route_schema.js +147 -0
- package/dist/auth/account_routes.d.ts +18 -83
- package/dist/auth/account_routes.d.ts.map +1 -1
- package/dist/auth/account_routes.js +28 -115
- package/dist/auth/audit_log_route_schema.d.ts +32 -0
- package/dist/auth/audit_log_route_schema.d.ts.map +1 -0
- package/dist/auth/audit_log_route_schema.js +36 -0
- package/dist/auth/audit_log_routes.d.ts.map +1 -1
- package/dist/auth/audit_log_routes.js +2 -12
- package/dist/auth/bearer_auth.js +1 -1
- package/dist/auth/bootstrap_route_schema.d.ts +85 -0
- package/dist/auth/bootstrap_route_schema.d.ts.map +1 -0
- package/dist/auth/bootstrap_route_schema.js +56 -0
- package/dist/auth/bootstrap_routes.d.ts +0 -20
- package/dist/auth/bootstrap_routes.d.ts.map +1 -1
- package/dist/auth/bootstrap_routes.js +4 -35
- package/dist/auth/signup_route_schema.d.ts +53 -0
- package/dist/auth/signup_route_schema.d.ts.map +1 -0
- package/dist/auth/signup_route_schema.js +59 -0
- package/dist/auth/signup_routes.d.ts +0 -26
- package/dist/auth/signup_routes.d.ts.map +1 -1
- package/dist/auth/signup_routes.js +8 -40
- package/dist/http/CLAUDE.md +2 -1
- package/dist/http/client_ip.d.ts +15 -0
- package/dist/http/client_ip.d.ts.map +1 -0
- package/dist/http/client_ip.js +13 -0
- package/dist/http/proxy.d.ts +0 -7
- package/dist/http/proxy.d.ts.map +1 -1
- package/dist/http/proxy.js +0 -7
- package/dist/realtime/sse.d.ts +0 -2
- package/dist/realtime/sse.d.ts.map +1 -1
- package/dist/realtime/sse.js +1 -2
- package/dist/realtime/sse_constants.d.ts +17 -0
- package/dist/realtime/sse_constants.d.ts.map +1 -0
- package/dist/realtime/sse_constants.js +16 -0
- package/dist/testing/CLAUDE.md +9 -1
- package/dist/testing/admin_integration.d.ts.map +1 -1
- package/dist/testing/admin_integration.js +1 -1
- package/dist/testing/app_server.d.ts +0 -15
- package/dist/testing/app_server.d.ts.map +1 -1
- package/dist/testing/app_server.js +1 -15
- package/dist/testing/audit_completeness.d.ts.map +1 -1
- package/dist/testing/audit_completeness.js +1 -1
- package/dist/testing/cross_backend/body_size_smuggling.d.ts +12 -0
- package/dist/testing/cross_backend/body_size_smuggling.d.ts.map +1 -1
- package/dist/testing/cross_backend/body_size_smuggling.js +68 -41
- package/dist/testing/cross_backend/capabilities.d.ts +29 -0
- package/dist/testing/cross_backend/capabilities.d.ts.map +1 -1
- package/dist/testing/cross_backend/capabilities.js +15 -0
- package/dist/testing/cross_backend/default_backend_configs.d.ts.map +1 -1
- package/dist/testing/cross_backend/default_backend_configs.js +13 -0
- package/dist/testing/cross_backend/default_spine_surface.d.ts.map +1 -1
- package/dist/testing/cross_backend/default_spine_surface.js +1 -0
- package/dist/testing/cross_backend/in_process_setup.d.ts +143 -0
- package/dist/testing/cross_backend/in_process_setup.d.ts.map +1 -0
- package/dist/testing/cross_backend/in_process_setup.js +166 -0
- package/dist/testing/cross_backend/rust_spine_stub_backend_config.d.ts.map +1 -1
- package/dist/testing/cross_backend/rust_spine_stub_backend_config.js +13 -6
- package/dist/testing/cross_backend/setup.d.ts +31 -140
- package/dist/testing/cross_backend/setup.d.ts.map +1 -1
- package/dist/testing/cross_backend/setup.js +11 -171
- package/dist/testing/cross_backend/sse_round_trip.js +1 -1
- package/dist/testing/cross_backend/testing_reset_actions.d.ts.map +1 -1
- package/dist/testing/cross_backend/testing_reset_actions.js +2 -1
- package/dist/testing/cross_backend/ts_spine_backend_config.d.ts.map +1 -1
- package/dist/testing/cross_backend/ts_spine_backend_config.js +16 -1
- package/dist/testing/integration.d.ts.map +1 -1
- package/dist/testing/integration.js +15 -18
- package/dist/testing/middleware.d.ts.map +1 -1
- package/dist/testing/middleware.js +2 -1
- package/dist/testing/sse_round_trip.d.ts +1 -1
- package/dist/testing/sse_round_trip.d.ts.map +1 -1
- package/dist/testing/sse_round_trip.js +1 -1
- package/dist/testing/stubs.d.ts.map +1 -1
- package/dist/testing/stubs.js +7 -9
- package/dist/testing/test_credentials.d.ts +23 -0
- package/dist/testing/test_credentials.d.ts.map +1 -0
- package/dist/testing/test_credentials.js +22 -0
- package/package.json +4 -4
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hono-free wire schemas + route shape for `POST /signup`.
|
|
3
|
+
*
|
|
4
|
+
* Split from `signup_routes.ts` (whose handler pulls `hono/cookie` via
|
|
5
|
+
* `session_middleware` to set the new session cookie) so cross-process test
|
|
6
|
+
* suites can build the signup route shape — and assert on the response shape
|
|
7
|
+
* — without dragging the in-process Hono session handler, and its optional
|
|
8
|
+
* `hono` peer, onto a backend-spawning consumer. `signup_routes.ts` imports
|
|
9
|
+
* these back and attaches the live handler; single source of truth for the
|
|
10
|
+
* wire shape.
|
|
11
|
+
*
|
|
12
|
+
* @module
|
|
13
|
+
*/
|
|
14
|
+
import { z } from 'zod';
|
|
15
|
+
import { Uuid } from '@fuzdev/fuz_util/id.js';
|
|
16
|
+
import { Username, Email } from '../primitive_schemas.js';
|
|
17
|
+
import { Password } from './password.js';
|
|
18
|
+
import { ERROR_NO_MATCHING_INVITE, ERROR_SIGNUP_CONFLICT, ERROR_INVALID_JSON_BODY, ERROR_INVALID_REQUEST_BODY, } from '../http/error_schemas.js';
|
|
19
|
+
/** Input for `POST /signup`. `email` is optional and must match any referenced invite. */
|
|
20
|
+
export const SignupInput = z.strictObject({
|
|
21
|
+
username: Username,
|
|
22
|
+
password: Password,
|
|
23
|
+
email: Email.optional(),
|
|
24
|
+
});
|
|
25
|
+
/**
|
|
26
|
+
* Output for `POST /signup`.
|
|
27
|
+
*
|
|
28
|
+
* Session cookie is the operative side effect. The returned `account` and
|
|
29
|
+
* `actor` mirror `BootstrapOutput` so cross-process per-test setup can read
|
|
30
|
+
* the per-test identity straight off the signup response.
|
|
31
|
+
*/
|
|
32
|
+
export const SignupOutput = z.strictObject({
|
|
33
|
+
ok: z.literal(true),
|
|
34
|
+
account: z.strictObject({ id: Uuid, username: Username }),
|
|
35
|
+
actor: z.strictObject({ id: Uuid }),
|
|
36
|
+
});
|
|
37
|
+
/**
|
|
38
|
+
* The `POST /signup` route shape minus its handler — pure hono-free data.
|
|
39
|
+
* `create_signup_route_specs` spreads this and attaches the live handler;
|
|
40
|
+
* cross-process surface builders spread it with a stub handler. Single source
|
|
41
|
+
* of truth — the shape can't drift between the live route and the surface.
|
|
42
|
+
*/
|
|
43
|
+
export const create_signup_route_shape = (options) => ({
|
|
44
|
+
method: 'POST',
|
|
45
|
+
path: '/signup',
|
|
46
|
+
auth: { account: 'none', actor: 'none' },
|
|
47
|
+
description: 'Create account (invite-gated or open signup)',
|
|
48
|
+
transaction: false, // manages its own transaction for TOCTOU safety
|
|
49
|
+
input: SignupInput,
|
|
50
|
+
output: SignupOutput,
|
|
51
|
+
rate_limit: options.signup_account_rate_limited ? 'both' : 'ip',
|
|
52
|
+
errors: {
|
|
53
|
+
400: z.looseObject({
|
|
54
|
+
error: z.enum([ERROR_INVALID_JSON_BODY, ERROR_INVALID_REQUEST_BODY]),
|
|
55
|
+
}),
|
|
56
|
+
403: z.looseObject({ error: z.literal(ERROR_NO_MATCHING_INVITE) }),
|
|
57
|
+
409: z.looseObject({ error: z.literal(ERROR_SIGNUP_CONFLICT) }),
|
|
58
|
+
},
|
|
59
|
+
});
|
|
@@ -7,7 +7,6 @@
|
|
|
7
7
|
*
|
|
8
8
|
* @module
|
|
9
9
|
*/
|
|
10
|
-
import { z } from 'zod';
|
|
11
10
|
import { type RouteSpec } from '../http/route_spec.js';
|
|
12
11
|
import { type RateLimiter } from '../rate_limiter.js';
|
|
13
12
|
import type { RouteFactoryDeps } from './deps.js';
|
|
@@ -52,31 +51,6 @@ export interface SignupRouteOptions extends AuthSessionRouteOptions {
|
|
|
52
51
|
*/
|
|
53
52
|
signup_fail_jitter_ms?: number;
|
|
54
53
|
}
|
|
55
|
-
/** Input for `POST /signup`. `email` is optional and must match any referenced invite. */
|
|
56
|
-
export declare const SignupInput: z.ZodObject<{
|
|
57
|
-
username: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
|
|
58
|
-
password: z.ZodString;
|
|
59
|
-
email: z.ZodOptional<z.ZodEmail>;
|
|
60
|
-
}, z.core.$strict>;
|
|
61
|
-
export type SignupInput = z.infer<typeof SignupInput>;
|
|
62
|
-
/**
|
|
63
|
-
* Output for `POST /signup`.
|
|
64
|
-
*
|
|
65
|
-
* Session cookie is the operative side effect. The returned `account` and
|
|
66
|
-
* `actor` mirror `BootstrapOutput` so cross-process per-test setup can read
|
|
67
|
-
* the per-test identity straight off the signup response.
|
|
68
|
-
*/
|
|
69
|
-
export declare const SignupOutput: z.ZodObject<{
|
|
70
|
-
ok: z.ZodLiteral<true>;
|
|
71
|
-
account: z.ZodObject<{
|
|
72
|
-
id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
|
|
73
|
-
username: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
|
|
74
|
-
}, z.core.$strict>;
|
|
75
|
-
actor: z.ZodObject<{
|
|
76
|
-
id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
|
|
77
|
-
}, z.core.$strict>;
|
|
78
|
-
}, z.core.$strict>;
|
|
79
|
-
export type SignupOutput = z.infer<typeof SignupOutput>;
|
|
80
54
|
/**
|
|
81
55
|
* Create signup route specs for account creation.
|
|
82
56
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signup_routes.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/signup_routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"signup_routes.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/signup_routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAaH,OAAO,EAAkB,KAAK,SAAS,EAAC,MAAM,uBAAuB,CAAC;AAEtE,OAAO,EAA+B,KAAK,WAAW,EAAC,MAAM,oBAAoB,CAAC;AAClF,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,WAAW,CAAC;AAGhD,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,qBAAqB,CAAC;AAEjE;;;;;;;;;;GAUG;AACH,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAEhD;;;;;;;GAOG;AACH,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAQhD;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,uBAAuB;IAClE,6FAA6F;IAC7F,2BAA2B,EAAE,WAAW,GAAG,IAAI,CAAC;IAChD;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAID;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,GACrC,MAAM,gBAAgB,EACtB,SAAS,kBAAkB,KACzB,KAAK,CAAC,SAAS,CA4KjB,CAAC"}
|
|
@@ -7,18 +7,15 @@
|
|
|
7
7
|
*
|
|
8
8
|
* @module
|
|
9
9
|
*/
|
|
10
|
-
import { z } from 'zod';
|
|
11
|
-
import { Uuid } from '@fuzdev/fuz_util/id.js';
|
|
12
10
|
import { create_session_and_set_cookie } from './session_middleware.js';
|
|
13
11
|
import { query_create_account_with_actor } from './account_queries.js';
|
|
14
12
|
import { query_app_settings_load } from './app_settings_queries.js';
|
|
15
13
|
import { query_invite_find_unclaimed_match_for_update, query_invite_claim_unscoped, } from './invite_queries.js';
|
|
16
|
-
import {
|
|
17
|
-
import { Password } from './password.js';
|
|
14
|
+
import { create_signup_route_shape } from './signup_route_schema.js';
|
|
18
15
|
import { get_route_input } from '../http/route_spec.js';
|
|
19
|
-
import { get_client_ip } from '../http/
|
|
16
|
+
import { get_client_ip } from '../http/client_ip.js';
|
|
20
17
|
import { rate_limit_exceeded_response } from '../rate_limiter.js';
|
|
21
|
-
import { ERROR_NO_MATCHING_INVITE, ERROR_SIGNUP_CONFLICT
|
|
18
|
+
import { ERROR_NO_MATCHING_INVITE, ERROR_SIGNUP_CONFLICT } from '../http/error_schemas.js';
|
|
22
19
|
import { is_pg_unique_violation } from '../db/pg_error.js';
|
|
23
20
|
/**
|
|
24
21
|
* Default minimum wall-clock time (ms) for a signup denial (403 / 409) response.
|
|
@@ -47,25 +44,8 @@ const signup_fail_delay = (floor_ms, jitter_ms) => {
|
|
|
47
44
|
const jitter = jitter_ms > 0 ? Math.floor(Math.random() * (jitter_ms * 2 + 1)) - jitter_ms : 0;
|
|
48
45
|
return new Promise((resolve) => setTimeout(resolve, floor_ms + jitter));
|
|
49
46
|
};
|
|
50
|
-
//
|
|
51
|
-
|
|
52
|
-
export const SignupInput = z.strictObject({
|
|
53
|
-
username: Username,
|
|
54
|
-
password: Password,
|
|
55
|
-
email: Email.optional(),
|
|
56
|
-
});
|
|
57
|
-
/**
|
|
58
|
-
* Output for `POST /signup`.
|
|
59
|
-
*
|
|
60
|
-
* Session cookie is the operative side effect. The returned `account` and
|
|
61
|
-
* `actor` mirror `BootstrapOutput` so cross-process per-test setup can read
|
|
62
|
-
* the per-test identity straight off the signup response.
|
|
63
|
-
*/
|
|
64
|
-
export const SignupOutput = z.strictObject({
|
|
65
|
-
ok: z.literal(true),
|
|
66
|
-
account: z.strictObject({ id: Uuid, username: Username }),
|
|
67
|
-
actor: z.strictObject({ id: Uuid }),
|
|
68
|
-
});
|
|
47
|
+
// `create_signup_route_specs` spreads the shape and attaches the live handler
|
|
48
|
+
// below.
|
|
69
49
|
/**
|
|
70
50
|
* Create signup route specs for account creation.
|
|
71
51
|
*
|
|
@@ -78,21 +58,9 @@ export const create_signup_route_specs = (deps, options) => {
|
|
|
78
58
|
const { session_options, ip_rate_limiter, signup_account_rate_limiter, signup_fail_floor_ms = DEFAULT_SIGNUP_FAIL_FLOOR_MS, signup_fail_jitter_ms = DEFAULT_SIGNUP_FAIL_JITTER_MS, } = options;
|
|
79
59
|
return [
|
|
80
60
|
{
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
description: 'Create account (invite-gated or open signup)',
|
|
85
|
-
transaction: false, // manages its own transaction for TOCTOU safety
|
|
86
|
-
input: SignupInput,
|
|
87
|
-
output: SignupOutput,
|
|
88
|
-
rate_limit: signup_account_rate_limiter ? 'both' : 'ip',
|
|
89
|
-
errors: {
|
|
90
|
-
400: z.looseObject({
|
|
91
|
-
error: z.enum([ERROR_INVALID_JSON_BODY, ERROR_INVALID_REQUEST_BODY]),
|
|
92
|
-
}),
|
|
93
|
-
403: z.looseObject({ error: z.literal(ERROR_NO_MATCHING_INVITE) }),
|
|
94
|
-
409: z.looseObject({ error: z.literal(ERROR_SIGNUP_CONFLICT) }),
|
|
95
|
-
},
|
|
61
|
+
...create_signup_route_shape({
|
|
62
|
+
signup_account_rate_limited: signup_account_rate_limiter !== null,
|
|
63
|
+
}),
|
|
96
64
|
handler: async (c, route) => {
|
|
97
65
|
// Per-IP rate limit check (before any work). 429 stays fast.
|
|
98
66
|
const ip = ip_rate_limiter ? get_client_ip(c) : null;
|
package/dist/http/CLAUDE.md
CHANGED
|
@@ -21,7 +21,8 @@ effects, see ../../../docs/architecture.md.
|
|
|
21
21
|
- `http/middleware_spec.ts` — `MiddlewareSpec` interface.
|
|
22
22
|
- `http/surface.ts` — `AppSurface`, `AppSurfaceSpec`, `generate_app_surface`, diagnostics.
|
|
23
23
|
- `http/surface_query.ts` — pure filters/groupings over `AppSurface`.
|
|
24
|
-
- `http/proxy.ts` — trusted-proxy middleware, CIDR parsing, rightmost-first XFF resolution.
|
|
24
|
+
- `http/proxy.ts` — trusted-proxy middleware, CIDR parsing, rightmost-first XFF resolution. Pulls `hono/utils/ipaddr` for CIDR matching.
|
|
25
|
+
- `http/client_ip.ts` — `get_client_ip(c)` — reads the resolved IP off the context (set by `proxy.ts`'s middleware). Split out of `proxy.ts` so it's hono-free: dispatch + route modules that only _read_ the IP don't pull `hono/utils/ipaddr`, keeping cross-process test surfaces free of the optional `hono` peer.
|
|
25
26
|
- `http/ip_canonical.ts` — RFC 5952 IPv6 canonicalization + IPv4-mapped collapse; `IP_LITERAL_CHARS` regex.
|
|
26
27
|
- `http/origin.ts` — origin allowlist middleware with wildcard patterns (Origin-only).
|
|
27
28
|
- `http/jsonrpc.ts` — JSON-RPC 2.0 envelope schemas (MCP superset), `JsonrpcErrorCode`, `_meta`.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read the resolved client IP off the Hono context.
|
|
3
|
+
*
|
|
4
|
+
* Split from `proxy.ts` (which pulls `hono/utils/ipaddr` for trusted-proxy
|
|
5
|
+
* CIDR matching) so dispatch + route modules that only need to *read* the IP
|
|
6
|
+
* stay free of that value import — and the cross-process test surface that
|
|
7
|
+
* imports them stays free of the optional `hono` peer. The IP itself is set on
|
|
8
|
+
* the context by the trusted-proxy middleware in `proxy.ts`.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
import type { Context } from 'hono';
|
|
13
|
+
/** Client IP resolved by the trusted-proxy middleware, or `'unknown'` if unset. */
|
|
14
|
+
export declare const get_client_ip: (c: Context) => string;
|
|
15
|
+
//# sourceMappingURL=client_ip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client_ip.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/http/client_ip.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,MAAM,CAAC;AAElC,mFAAmF;AACnF,eAAO,MAAM,aAAa,GAAI,GAAG,OAAO,KAAG,MAAyC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read the resolved client IP off the Hono context.
|
|
3
|
+
*
|
|
4
|
+
* Split from `proxy.ts` (which pulls `hono/utils/ipaddr` for trusted-proxy
|
|
5
|
+
* CIDR matching) so dispatch + route modules that only need to *read* the IP
|
|
6
|
+
* stay free of that value import — and the cross-process test surface that
|
|
7
|
+
* imports them stays free of the optional `hono` peer. The IP itself is set on
|
|
8
|
+
* the context by the trusted-proxy middleware in `proxy.ts`.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
/** Client IP resolved by the trusted-proxy middleware, or `'unknown'` if unset. */
|
|
13
|
+
export const get_client_ip = (c) => c.get('client_ip') || 'unknown';
|
package/dist/http/proxy.d.ts
CHANGED
|
@@ -154,11 +154,4 @@ export declare const create_proxy_middleware: (options: ProxyOptions) => Middlew
|
|
|
154
154
|
* @param options - trusted proxy configuration
|
|
155
155
|
*/
|
|
156
156
|
export declare const create_proxy_middleware_spec: (options: ProxyOptions) => MiddlewareSpec;
|
|
157
|
-
/**
|
|
158
|
-
* Read the resolved client IP from the Hono context.
|
|
159
|
-
*
|
|
160
|
-
* Returns `'unknown'` if the proxy middleware has not run or no IP is available.
|
|
161
|
-
* Set by `create_proxy_middleware`.
|
|
162
|
-
*/
|
|
163
|
-
export declare const get_client_ip: (c: Context) => string;
|
|
164
157
|
//# sourceMappingURL=proxy.d.ts.map
|
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,EAAC,OAAO,EAAE,iBAAiB,EAAC,MAAM,MAAM,CAAC;AAErD,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAEpD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,sBAAsB,CAAC;AAGzD;;;;;;;;;;;;;;;;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;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC,GAC7B;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAA;CAAC,CAAC;AAElF;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,KAAG,WA6CjD,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,SA0BX,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,uBAAuB,GAAI,SAAS,YAAY,KAAG,iBAyC/D,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,GAAI,SAAS,YAAY,KAAG,cAInE,CAAC
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/http/proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,OAAO,EAAE,iBAAiB,EAAC,MAAM,MAAM,CAAC;AAErD,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAEpD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,sBAAsB,CAAC;AAGzD;;;;;;;;;;;;;;;;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;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC,GAC7B;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAA;CAAC,CAAC;AAElF;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,KAAG,WA6CjD,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,SA0BX,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;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
|
@@ -298,10 +298,3 @@ export const create_proxy_middleware_spec = (options) => ({
|
|
|
298
298
|
path: '*',
|
|
299
299
|
handler: create_proxy_middleware(options),
|
|
300
300
|
});
|
|
301
|
-
/**
|
|
302
|
-
* Read the resolved client IP from the Hono context.
|
|
303
|
-
*
|
|
304
|
-
* Returns `'unknown'` if the proxy middleware has not run or no IP is available.
|
|
305
|
-
* Set by `create_proxy_middleware`.
|
|
306
|
-
*/
|
|
307
|
-
export const get_client_ip = (c) => c.get('client_ip') || 'unknown';
|
package/dist/realtime/sse.d.ts
CHANGED
|
@@ -53,8 +53,6 @@ export declare const create_sse_response: <T = unknown>(c: Context, log: Logger)
|
|
|
53
53
|
response: Response;
|
|
54
54
|
stream: SseStream<T>;
|
|
55
55
|
};
|
|
56
|
-
/** SSE comment sent on connect to flush headers through proxies. Exported for test assertions. */
|
|
57
|
-
export declare const SSE_CONNECTED_COMMENT = ": connected\n\n";
|
|
58
56
|
/** Spec for a push event — declares params schema, description, and channel. */
|
|
59
57
|
export interface EventSpec {
|
|
60
58
|
/** Event method name, used as the JSON-RPC notification `method`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/realtime/sse.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,MAAM,CAAC;AAElC,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"sse.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/realtime/sse.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,MAAM,CAAC;AAElC,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAIpD;;;;GAIG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,OAAO;IACrC,mDAAmD;IACnD,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;IACxB,6CAA6C;IAC7C,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,wBAAwB;IACxB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,+FAA+F;IAC/F,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;CACnC;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC/B,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,MAAM,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,mBAAmB,GAAI,CAAC,GAAG,OAAO,EAC9C,GAAG,OAAO,EACV,KAAK,MAAM,KACT;IAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAA;CAiD3C,CAAC;AAEF,gFAAgF;AAChF,MAAM,WAAW,SAAS;IACzB,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC;IAClB,8DAA8D;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,4BAA4B,GAAI,CAAC,SAAS,eAAe,EACrE,aAAa;IAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,IAAI,CAAA;CAAC,EAC5D,aAAa,KAAK,CAAC,SAAS,CAAC,EAC7B,KAAK,MAAM,KACT;IAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,IAAI,CAAA;CAmBhD,CAAC"}
|
package/dist/realtime/sse.js
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
import { streamSSE } from 'hono/streaming';
|
|
10
10
|
import { z } from 'zod';
|
|
11
11
|
import { DEV } from 'esm-env';
|
|
12
|
+
import { SSE_CONNECTED_COMMENT } from './sse_constants.js';
|
|
12
13
|
/**
|
|
13
14
|
* Create an SSE response for a Hono context.
|
|
14
15
|
*
|
|
@@ -74,8 +75,6 @@ export const create_sse_response = (c, log) => {
|
|
|
74
75
|
});
|
|
75
76
|
return { response, stream: sse_stream };
|
|
76
77
|
};
|
|
77
|
-
/** SSE comment sent on connect to flush headers through proxies. Exported for test assertions. */
|
|
78
|
-
export const SSE_CONNECTED_COMMENT = `: connected\n\n`;
|
|
79
78
|
/**
|
|
80
79
|
* Create a broadcaster that validates events in DEV mode.
|
|
81
80
|
*
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hono-free SSE wire constants.
|
|
3
|
+
*
|
|
4
|
+
* Split from `sse.ts` (which pulls `hono/streaming` via `streamSSE`) so the
|
|
5
|
+
* stream-framing constants are importable by cross-process test suites
|
|
6
|
+
* asserting on the wire without dragging in the in-process Hono SSE
|
|
7
|
+
* implementation.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* The comment line written immediately on SSE stream open. Flushes headers +
|
|
13
|
+
* confirms the connection is live before the first real event. Cross-process
|
|
14
|
+
* SSE tests assert the stream emits this on connect.
|
|
15
|
+
*/
|
|
16
|
+
export declare const SSE_CONNECTED_COMMENT = ": connected\n\n";
|
|
17
|
+
//# sourceMappingURL=sse_constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse_constants.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/realtime/sse_constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hono-free SSE wire constants.
|
|
3
|
+
*
|
|
4
|
+
* Split from `sse.ts` (which pulls `hono/streaming` via `streamSSE`) so the
|
|
5
|
+
* stream-framing constants are importable by cross-process test suites
|
|
6
|
+
* asserting on the wire without dragging in the in-process Hono SSE
|
|
7
|
+
* implementation.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* The comment line written immediately on SSE stream open. Flushes headers +
|
|
13
|
+
* confirms the connection is live before the first real event. Cross-process
|
|
14
|
+
* SSE tests assert the stream emits this on connect.
|
|
15
|
+
*/
|
|
16
|
+
export const SSE_CONNECTED_COMMENT = `: connected\n\n`;
|
package/dist/testing/CLAUDE.md
CHANGED
|
@@ -858,7 +858,7 @@ source of truth for wire-shape conformance.
|
|
|
858
858
|
- `testing/cross_backend/capabilities.ts` — `BackendCapabilities` vocabulary
|
|
859
859
|
(`bearer_auth` / `trusted_proxy` / `login_rate_limit` / `ws` / `sse` /
|
|
860
860
|
`cell_crud` / `cell_relations` / `account_lifecycle` / `fact_serving` /
|
|
861
|
-
`ready`),
|
|
861
|
+
`ready` / `account_status` / `oversized_reject_closes_connection`),
|
|
862
862
|
`test_if(cond, name, fn)`
|
|
863
863
|
for capability-gated cases, and `in_process_capabilities` preset. `cell_crud`
|
|
864
864
|
gates the CRUD parity suite, `cell_relations` the relation / ACL / audit
|
|
@@ -875,6 +875,14 @@ source of truth for wire-shape conformance.
|
|
|
875
875
|
(anonymous `GET /ready` → `200 {ready: true}` on a clean spine bootstrap);
|
|
876
876
|
like cells/sse the `/ready` deploy gate stays off the declared surface, `true`
|
|
877
877
|
on every spine that live-mounts it over the shared `expected_schema.json`.
|
|
878
|
+
`account_status` gates the integration suite's `account status response body`
|
|
879
|
+
case — `GET /api/account/status` is bundled into `create_account_route_specs`,
|
|
880
|
+
so every spine serves it (`true`); the gate fails loud if a declaring backend
|
|
881
|
+
doesn't mount it (replacing the old runtime 404-sniff-skip).
|
|
882
|
+
`oversized_reject_closes_connection` gates the strong half of the body-size
|
|
883
|
+
smuggling probe (`true` Node/Deno/Rust — they close on an oversized reject;
|
|
884
|
+
`false` Bun — `Bun.serve` drains + keepalives but frames correctly, so the
|
|
885
|
+
suite's no-desync half still runs).
|
|
878
886
|
|
|
879
887
|
### `cross_backend/standard.ts` — `describe_standard_cross_process_tests`
|
|
880
888
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin_integration.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/testing/admin_integration.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,CAAC;AAgC7B,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAa,KAAK,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"admin_integration.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/testing/admin_integration.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,CAAC;AAgC7B,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAa,KAAK,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AAWzE,OAAO,EAKN,KAAK,uBAAuB,EAC5B,MAAM,kBAAkB,CAAC;AAkB1B,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,iCAAiC,CAAC;AACzE,OAAO,KAAK,EAAC,SAAS,EAAc,MAAM,0BAA0B,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,mCAAmC;IACnD;;;;OAIG;IACH,UAAU,EAAE,SAAS,CAAC;IACtB;;;;OAIG;IACH,cAAc,EAAE,cAAc,CAAC;IAC/B,uCAAuC;IACvC,YAAY,EAAE,mBAAmB,CAAC;IAClC,uFAAuF;IACvF,eAAe,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACxC,4GAA4G;IAC5G,KAAK,EAAE,gBAAgB,CAAC;IACxB;;;OAGG;IACH,aAAa,EAAE,uBAAuB,CAAC;IACvC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAiBD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,yCAAyC,GACrD,SAAS,mCAAmC,KAC1C,IAi3BF,CAAC"}
|
|
@@ -28,7 +28,7 @@ import './assert_dev_env.js';
|
|
|
28
28
|
import { describe, test, assert, afterAll } from 'vitest';
|
|
29
29
|
import { ROLE_ADMIN } from '../auth/role_schema.js';
|
|
30
30
|
import { GRANT_PATH_ADMIN } from '../auth/grant_path_schema.js';
|
|
31
|
-
import { DEFAULT_TEST_PASSWORD } from './
|
|
31
|
+
import { DEFAULT_TEST_PASSWORD } from './test_credentials.js';
|
|
32
32
|
import { role_grant_offer_and_accept } from './role_grant_helpers.js';
|
|
33
33
|
import { find_auth_route } from './integration_helpers.js';
|
|
34
34
|
import { ErrorCoverageCollector, assert_error_coverage, DEFAULT_INTEGRATION_ERROR_COVERAGE, } from './error_coverage.js';
|
|
@@ -34,21 +34,6 @@ import type { RpcEndpointsSuiteOption } from './rpc_helpers.js';
|
|
|
34
34
|
export declare const stub_password_deps: PasswordHashDeps;
|
|
35
35
|
/** 64-hex-char test cookie secret — deterministic, never used in production. */
|
|
36
36
|
export declare const TEST_COOKIE_SECRET: string;
|
|
37
|
-
/**
|
|
38
|
-
* Default password for bootstrapped test accounts. Shared between the
|
|
39
|
-
* in-process keeper bootstrap (`bootstrap_test_keeper`,
|
|
40
|
-
* `create_test_account_with_credentials`, `create_test_app_server`,
|
|
41
|
-
* `TestApp.create_account`) and the cross-process bootstrap
|
|
42
|
-
* (`cross_backend/setup.ts`). The two paths MUST agree — when they
|
|
43
|
-
* diverged during the 3d cross-process lift, ~20 login tests 401'd
|
|
44
|
-
* silently against the cross-process backend because the per-test
|
|
45
|
-
* fixture minted accounts under a different default than the
|
|
46
|
-
* integration suite's hardcoded login bodies expected. Consumers
|
|
47
|
-
* hardcoding the literal string in test bodies should import this
|
|
48
|
-
* constant instead so a future divergence becomes a typecheck miss
|
|
49
|
-
* rather than a runtime password mismatch.
|
|
50
|
-
*/
|
|
51
|
-
export declare const DEFAULT_TEST_PASSWORD = "test-password-123";
|
|
52
37
|
/**
|
|
53
38
|
* Options for `bootstrap_test_keeper` and `create_test_account_with_credentials`.
|
|
54
39
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app_server.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/testing/app_server.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,CAAC;AAE7B;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,MAAM,CAAC;AAG/B,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"app_server.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/testing/app_server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import './assert_dev_env.js';
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
import { Logger } from '@fuzdev/fuz_util/log.js';
|
|
4
|
+
import { DEFAULT_TEST_PASSWORD } from './test_credentials.js';
|
|
4
5
|
import { ROLE_KEEPER } from '../auth/role_schema.js';
|
|
5
6
|
import { create_validated_keyring } from '../auth/keyring.js';
|
|
6
7
|
import { generate_api_token } from '../auth/api_token.js';
|
|
@@ -28,21 +29,6 @@ export const stub_password_deps = {
|
|
|
28
29
|
};
|
|
29
30
|
/** 64-hex-char test cookie secret — deterministic, never used in production. */
|
|
30
31
|
export const TEST_COOKIE_SECRET = 'a'.repeat(64);
|
|
31
|
-
/**
|
|
32
|
-
* Default password for bootstrapped test accounts. Shared between the
|
|
33
|
-
* in-process keeper bootstrap (`bootstrap_test_keeper`,
|
|
34
|
-
* `create_test_account_with_credentials`, `create_test_app_server`,
|
|
35
|
-
* `TestApp.create_account`) and the cross-process bootstrap
|
|
36
|
-
* (`cross_backend/setup.ts`). The two paths MUST agree — when they
|
|
37
|
-
* diverged during the 3d cross-process lift, ~20 login tests 401'd
|
|
38
|
-
* silently against the cross-process backend because the per-test
|
|
39
|
-
* fixture minted accounts under a different default than the
|
|
40
|
-
* integration suite's hardcoded login bodies expected. Consumers
|
|
41
|
-
* hardcoding the literal string in test bodies should import this
|
|
42
|
-
* constant instead so a future divergence becomes a typecheck miss
|
|
43
|
-
* rather than a runtime password mismatch.
|
|
44
|
-
*/
|
|
45
|
-
export const DEFAULT_TEST_PASSWORD = 'test-password-123';
|
|
46
32
|
// Module-level PGlite factory for create_test_app_server when no db is provided.
|
|
47
33
|
// Shares the WASM instance cache from test_db.ts, avoiding redundant cold starts
|
|
48
34
|
// within the same vitest worker thread. Schema is reset on each create() call.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit_completeness.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/testing/audit_completeness.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,CAAC;AA4B7B,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"audit_completeness.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/testing/audit_completeness.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,CAAC;AA4B7B,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,2BAA2B,CAAC;AAU9D,OAAO,EAKN,KAAK,uBAAuB,EAC5B,MAAM,kBAAkB,CAAC;AA2B1B,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,iCAAiC,CAAC;AACzE,OAAO,KAAK,EAAC,SAAS,EAAc,MAAM,0BAA0B,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC5C;;;;;OAKG;IACH,UAAU,EAAE,SAAS,CAAC;IACtB;;;;;;OAMG;IACH,cAAc,EAAE,cAAc,CAAC;IAC/B,uCAAuC;IACvC,YAAY,EAAE,mBAAmB,CAAC;IAClC,yEAAyE;IACzE,eAAe,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACxC;;;OAGG;IACH,aAAa,EAAE,uBAAuB,CAAC;CACvC;AA8FD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,iCAAiC,GAAI,SAAS,4BAA4B,KAAG,IAomBzF,CAAC"}
|
|
@@ -25,7 +25,7 @@ import './assert_dev_env.js';
|
|
|
25
25
|
import { describe, test, assert } from 'vitest';
|
|
26
26
|
import { ROLE_ADMIN } from '../auth/role_schema.js';
|
|
27
27
|
import { AUDIT_EVENT_TYPES, } from '../auth/audit_log_schema.js';
|
|
28
|
-
import { DEFAULT_TEST_PASSWORD } from './
|
|
28
|
+
import { DEFAULT_TEST_PASSWORD } from './test_credentials.js';
|
|
29
29
|
import { find_auth_route } from './integration_helpers.js';
|
|
30
30
|
import { rpc_call_for_spec, require_rpc_endpoint_path, resolve_rpc_endpoints_for_setup, } from './rpc_helpers.js';
|
|
31
31
|
import { role_grant_offer_and_accept } from './role_grant_helpers.js';
|
|
@@ -5,6 +5,18 @@ export interface BodySizeSmugglingCrossTestOptions {
|
|
|
5
5
|
readonly base_url: string;
|
|
6
6
|
/** RPC endpoint path to target. Default `/api/rpc`. */
|
|
7
7
|
readonly rpc_path?: string;
|
|
8
|
+
/**
|
|
9
|
+
* Whether the backend closes the connection on an oversized-body reject
|
|
10
|
+
* without reading the body (`capabilities.oversized_reject_closes_connection`).
|
|
11
|
+
* `true` (default) demands the strong posture — the pipelined GET is never
|
|
12
|
+
* reached, so **at most one** response comes back. `false` (Bun) relaxes to
|
|
13
|
+
* the no-desync property: the body is drained on `Content-Length` and the
|
|
14
|
+
* pipelined GET is framed correctly, so **at most two** responses come back
|
|
15
|
+
* and the body bytes are never reparsed as a request. Default `true` so a
|
|
16
|
+
* consumer that forgets to declare the flag fails loud rather than silently
|
|
17
|
+
* accepting a drain.
|
|
18
|
+
*/
|
|
19
|
+
readonly closes_connection?: boolean;
|
|
8
20
|
}
|
|
9
21
|
export declare const describe_body_size_smuggling_cross_tests: (options: BodySizeSmugglingCrossTestOptions) => void;
|
|
10
22
|
//# sourceMappingURL=body_size_smuggling.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"body_size_smuggling.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/body_size_smuggling.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"body_size_smuggling.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/body_size_smuggling.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA0D9B,4EAA4E;AAC5E,MAAM,WAAW,iCAAiC;IACjD,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,uDAAuD;IACvD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CACrC;AAqDD,eAAO,MAAM,wCAAwC,GACpD,SAAS,iCAAiC,KACxC,IAiFF,CAAC"}
|