@fuzdev/fuz_app 0.125.0 → 0.127.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 +56 -20
- package/dist/actions/action_rpc.d.ts +14 -11
- package/dist/actions/action_rpc.d.ts.map +1 -1
- package/dist/actions/action_rpc.js +5 -4
- package/dist/actions/connection_closer.d.ts +13 -3
- package/dist/actions/connection_closer.d.ts.map +1 -1
- package/dist/actions/connection_closer.js +7 -5
- package/dist/actions/register_action_ws.d.ts +18 -13
- package/dist/actions/register_action_ws.d.ts.map +1 -1
- package/dist/actions/register_action_ws.js +8 -6
- package/dist/actions/register_ws_endpoint.d.ts +6 -3
- package/dist/actions/register_ws_endpoint.d.ts.map +1 -1
- package/dist/actions/register_ws_endpoint.js +6 -3
- package/dist/actions/transports.d.ts +9 -0
- package/dist/actions/transports.d.ts.map +1 -1
- package/dist/actions/transports.js +9 -0
- package/dist/actions/transports_ws_backend.d.ts +15 -0
- package/dist/actions/transports_ws_backend.d.ts.map +1 -1
- package/dist/actions/transports_ws_backend.js +25 -5
- package/dist/actions/ws_endpoint_spec.d.ts +24 -4
- package/dist/actions/ws_endpoint_spec.d.ts.map +1 -1
- package/dist/actions/ws_endpoint_spec.js +15 -1
- package/dist/auth/middleware.d.ts +29 -1
- package/dist/auth/middleware.d.ts.map +1 -1
- package/dist/auth/middleware.js +35 -1
- package/dist/http/CLAUDE.md +3 -3
- package/dist/http/surface.d.ts +12 -9
- package/dist/http/surface.d.ts.map +1 -1
- package/dist/rate_limiter.d.ts +43 -3
- package/dist/rate_limiter.d.ts.map +1 -1
- package/dist/rate_limiter.js +27 -3
- package/dist/realtime/sse_auth_guard.d.ts +2 -1
- package/dist/realtime/sse_auth_guard.d.ts.map +1 -1
- package/dist/realtime/sse_auth_guard.js +4 -2
- package/dist/realtime/subscriber_registry.d.ts +12 -0
- package/dist/realtime/subscriber_registry.d.ts.map +1 -1
- package/dist/realtime/subscriber_registry.js +18 -2
- package/dist/server/app_server.d.ts +128 -55
- package/dist/server/app_server.d.ts.map +1 -1
- package/dist/server/app_server.js +110 -61
- package/dist/server/app_server_context.d.ts +17 -9
- package/dist/server/app_server_context.d.ts.map +1 -1
- package/dist/testing/CLAUDE.md +83 -25
- package/dist/testing/app_server.d.ts +6 -3
- package/dist/testing/app_server.d.ts.map +1 -1
- package/dist/testing/app_server.js +20 -20
- package/dist/testing/connection_closer_helpers.d.ts +10 -4
- package/dist/testing/connection_closer_helpers.d.ts.map +1 -1
- package/dist/testing/connection_closer_helpers.js +4 -0
- package/dist/testing/cross_backend/capabilities.d.ts +3 -3
- package/dist/testing/cross_backend/default_backend_configs.d.ts +12 -12
- package/dist/testing/cross_backend/default_backend_configs.d.ts.map +1 -1
- package/dist/testing/cross_backend/default_backend_configs.js +11 -10
- package/dist/testing/cross_backend/full_spine_mount.d.ts +35 -11
- package/dist/testing/cross_backend/full_spine_mount.d.ts.map +1 -1
- package/dist/testing/cross_backend/full_spine_mount.js +26 -9
- package/dist/testing/cross_backend/rust_spine_stub_backend_config.d.ts +16 -1
- 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 +5 -4
- package/dist/testing/cross_backend/spine_surface_constants.d.ts +43 -3
- package/dist/testing/cross_backend/spine_surface_constants.d.ts.map +1 -1
- package/dist/testing/cross_backend/spine_surface_constants.js +43 -3
- package/dist/testing/cross_backend/testing_backdoor.d.ts +15 -1
- package/dist/testing/cross_backend/testing_backdoor.d.ts.map +1 -1
- package/dist/testing/cross_backend/testing_backdoor.js +51 -6
- package/dist/testing/cross_backend/testing_reset_actions.d.ts +6 -3
- package/dist/testing/cross_backend/testing_reset_actions.d.ts.map +1 -1
- package/dist/testing/cross_backend/testing_reset_actions.js +6 -3
- package/dist/testing/cross_backend/testing_server_bun.d.ts.map +1 -1
- package/dist/testing/cross_backend/testing_server_bun.js +5 -1
- package/dist/testing/cross_backend/testing_server_core.d.ts +72 -41
- package/dist/testing/cross_backend/testing_server_core.d.ts.map +1 -1
- package/dist/testing/cross_backend/testing_server_core.js +22 -14
- package/dist/testing/cross_backend/testing_server_deno.js +1 -1
- package/dist/testing/cross_backend/testing_server_node.d.ts.map +1 -1
- package/dist/testing/cross_backend/testing_server_node.js +20 -7
- package/dist/testing/cross_backend/ts_spine_backend_config.d.ts +15 -2
- package/dist/testing/cross_backend/ts_spine_backend_config.d.ts.map +1 -1
- package/dist/testing/cross_backend/ts_spine_backend_config.js +10 -8
- package/dist/testing/cross_backend/ws_action_rate_limit.d.ts +26 -0
- package/dist/testing/cross_backend/ws_action_rate_limit.d.ts.map +1 -0
- package/dist/testing/cross_backend/ws_action_rate_limit.js +261 -0
- package/dist/testing/middleware.d.ts.map +1 -1
- package/dist/testing/middleware.js +4 -3
- package/dist/testing/stubs.d.ts +17 -4
- package/dist/testing/stubs.d.ts.map +1 -1
- package/dist/testing/stubs.js +46 -13
- package/dist/testing/transports/ws_transport.d.ts +7 -0
- package/dist/testing/transports/ws_transport.d.ts.map +1 -1
- package/dist/testing/transports/ws_transport.js +1 -1
- package/dist/testing/ws_round_trip.d.ts +43 -37
- package/dist/testing/ws_round_trip.d.ts.map +1 -1
- package/dist/testing/ws_round_trip.js +28 -46
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws_round_trip.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/testing/ws_round_trip.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,CAAC;AAE7B
|
|
1
|
+
{"version":3,"file":"ws_round_trip.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/testing/ws_round_trip.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,14 +2,11 @@ import './assert_dev_env.js';
|
|
|
2
2
|
import { WSContext, createWSMessageEvent } from 'hono/ws';
|
|
3
3
|
import { Logger } from '@fuzdev/fuz_util/log.ts';
|
|
4
4
|
import { create_uuid } from '@fuzdev/fuz_util/id.ts';
|
|
5
|
-
import { ActionDispatcher } from '../actions/action_dispatcher.js';
|
|
6
|
-
import { create_broadcast_api } from '../actions/broadcast_api.js';
|
|
7
5
|
import { register_action_ws } from '../actions/register_action_ws.js';
|
|
8
6
|
import { create_stub_db } from './stubs.js';
|
|
9
7
|
import { BackendWebsocketTransport } from '../actions/transports_ws_backend.js';
|
|
10
8
|
import { AUTH_SESSION_TOKEN_HASH_KEY, REQUEST_CONTEXT_KEY } from '../auth/request_context.js';
|
|
11
9
|
import { hash_session_token } from '../auth/session_queries.js';
|
|
12
|
-
import { ROLE_KEEPER } from '../auth/role_schema.js';
|
|
13
10
|
import { ACCOUNT_ID_KEY, AUTH_API_TOKEN_ID_KEY, CREDENTIAL_TYPE_KEY, TEST_CONTEXT_PRESET_KEY } from '../hono_context.js';
|
|
14
11
|
import { create_jsonrpc_request } from '../http/jsonrpc_helpers.js';
|
|
15
12
|
import { create_test_account, create_test_actor, create_test_role_grant } from './entities.js';
|
|
@@ -58,15 +55,30 @@ export const create_fake_hono_context = (opts) => {
|
|
|
58
55
|
};
|
|
59
56
|
};
|
|
60
57
|
/**
|
|
61
|
-
* Build a fake `upgradeWebSocket` that
|
|
62
|
-
*
|
|
63
|
-
*
|
|
58
|
+
* Build a fake `upgradeWebSocket` that stands in for a runtime adapter's.
|
|
59
|
+
*
|
|
60
|
+
* Like the real adapters, the middleware it returns passes a request
|
|
61
|
+
* without an `Upgrade: websocket` header to `next()`. An upgrade request
|
|
62
|
+
* is recorded in `upgrades` — its real `Context` and the endpoint's events
|
|
63
|
+
* factory — and answered `200` with no body (a `Response` cannot carry the
|
|
64
|
+
* `101` an adapter answers). No socket is opened: tests drive the recorded
|
|
65
|
+
* factory, so an upgrade sent through `app.request` exercises the app's
|
|
66
|
+
* whole middleware chain — origin, session or bearer, client IP — before
|
|
67
|
+
* the dispatcher sees it.
|
|
64
68
|
*/
|
|
65
69
|
export const create_stub_upgrade = () => {
|
|
66
70
|
let captured = null;
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
71
|
+
const upgrades = [];
|
|
72
|
+
const upgradeWebSocket = ((create_events) => {
|
|
73
|
+
captured = create_events;
|
|
74
|
+
return async (c, next) => {
|
|
75
|
+
if (c.req.header('upgrade')?.toLowerCase() !== 'websocket') {
|
|
76
|
+
await next();
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
upgrades.push({ c, create_events });
|
|
80
|
+
return new Response(null, { status: 200 });
|
|
81
|
+
};
|
|
70
82
|
});
|
|
71
83
|
return {
|
|
72
84
|
upgradeWebSocket,
|
|
@@ -74,7 +86,8 @@ export const create_stub_upgrade = () => {
|
|
|
74
86
|
if (!captured)
|
|
75
87
|
throw new Error('upgradeWebSocket was not called');
|
|
76
88
|
return captured;
|
|
77
|
-
}
|
|
89
|
+
},
|
|
90
|
+
upgrades
|
|
78
91
|
};
|
|
79
92
|
};
|
|
80
93
|
/**
|
|
@@ -198,7 +211,11 @@ export const create_ws_test_harness = (options) => {
|
|
|
198
211
|
heartbeat,
|
|
199
212
|
log,
|
|
200
213
|
on_socket_open,
|
|
201
|
-
on_socket_close
|
|
214
|
+
on_socket_close,
|
|
215
|
+
// the harness drives per-message dispatch, not throttling — the
|
|
216
|
+
// assembled-app tests cover the limiters `create_app_server` threads
|
|
217
|
+
action_ip_rate_limiter: null,
|
|
218
|
+
action_account_rate_limiter: null
|
|
202
219
|
});
|
|
203
220
|
const events_factory = stub.get_create_events();
|
|
204
221
|
const connect = async (identity = {}) => {
|
|
@@ -368,38 +385,3 @@ export const create_ws_test_harness = (options) => {
|
|
|
368
385
|
};
|
|
369
386
|
return { transport, connect };
|
|
370
387
|
};
|
|
371
|
-
/** Convenience: default identity for keeper-authenticated connections. */
|
|
372
|
-
export const keeper_identity = () => ({
|
|
373
|
-
credential_type: 'daemon_token',
|
|
374
|
-
roles: [ROLE_KEEPER]
|
|
375
|
-
});
|
|
376
|
-
// ---------------------------------------------------------------------
|
|
377
|
-
// Broadcast wiring — for tests that assert on server-initiated
|
|
378
|
-
// notification fan-out. `build_broadcast_api` mirrors how consumer
|
|
379
|
-
// `backend_actions_api.ts` composes the real stack (peer + transport
|
|
380
|
-
// registered + `create_broadcast_api`); the helper exists so each test
|
|
381
|
-
// doesn't re-spell that boilerplate.
|
|
382
|
-
// ---------------------------------------------------------------------
|
|
383
|
-
const make_peer = () => new ActionDispatcher({ environment: new MinimalActionEnvironment([]) });
|
|
384
|
-
/**
|
|
385
|
-
* Wire a typed broadcast API against the harness's transport, matching
|
|
386
|
-
* how a consumer's real backend composes the stack. Returns the typed
|
|
387
|
-
* API so tests can call `.zap_run_created(...)` / `.workspace_changed(...)`
|
|
388
|
-
* etc. directly.
|
|
389
|
-
*
|
|
390
|
-
* ```ts
|
|
391
|
-
* const harness = create_ws_test_harness({actions});
|
|
392
|
-
* const broadcast = build_broadcast_api<MyBackendActionsApi>({
|
|
393
|
-
* harness,
|
|
394
|
-
* specs: my_broadcast_action_specs,
|
|
395
|
-
* });
|
|
396
|
-
* const client = await harness.connect(keeper_identity());
|
|
397
|
-
* await broadcast.zap_run_created({run_id: '...', ...});
|
|
398
|
-
* await client.wait_for(is_notification('zap_run_created'));
|
|
399
|
-
* ```
|
|
400
|
-
*/
|
|
401
|
-
export const build_broadcast_api = (options) => {
|
|
402
|
-
const peer = make_peer();
|
|
403
|
-
peer.transports.register_transport(options.harness.transport);
|
|
404
|
-
return create_broadcast_api({ peer, specs: options.specs });
|
|
405
|
-
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fuzdev/fuz_app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.127.0",
|
|
4
4
|
"description": "fullstack app library",
|
|
5
5
|
"glyph": "🗝",
|
|
6
6
|
"logo": "logo.svg",
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
"@electric-sql/pglite": "^0.4.5",
|
|
88
88
|
"@fuzdev/blake3-wasm": "^0.2.0",
|
|
89
89
|
"@fuzdev/fuz_code": "^0.50.0",
|
|
90
|
-
"@fuzdev/fuz_css": "^0.65.
|
|
90
|
+
"@fuzdev/fuz_css": "^0.65.3",
|
|
91
91
|
"@fuzdev/fuz_ui": "^0.210.2",
|
|
92
92
|
"@fuzdev/fuz_util": "^0.71.0",
|
|
93
93
|
"@fuzdev/gro": "^0.213.0",
|