@fuzdev/fuz_app 0.129.0 → 0.131.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.
Files changed (110) hide show
  1. package/dist/actions/CLAUDE.md +23 -6
  2. package/dist/actions/connection_closer.d.ts +3 -1
  3. package/dist/actions/connection_closer.d.ts.map +1 -1
  4. package/dist/actions/register_action_ws.d.ts +46 -0
  5. package/dist/actions/register_action_ws.d.ts.map +1 -1
  6. package/dist/actions/register_action_ws.js +108 -14
  7. package/dist/actions/rpc_client.d.ts.map +1 -1
  8. package/dist/actions/transports.d.ts +2 -1
  9. package/dist/actions/transports.d.ts.map +1 -1
  10. package/dist/actions/transports.js +2 -1
  11. package/dist/actions/transports_ws_backend.d.ts +38 -4
  12. package/dist/actions/transports_ws_backend.d.ts.map +1 -1
  13. package/dist/actions/transports_ws_backend.js +69 -4
  14. package/dist/auth/audit_log_routes.d.ts +7 -3
  15. package/dist/auth/audit_log_routes.d.ts.map +1 -1
  16. package/dist/auth/audit_log_routes.js +50 -26
  17. package/dist/auth/scope_kind_schema.d.ts.map +1 -1
  18. package/dist/auth/scope_kind_schema.js +1 -3
  19. package/dist/db/db_pg.js +1 -1
  20. package/dist/http/CLAUDE.md +1 -1
  21. package/dist/http/jsonrpc_errors.d.ts.map +1 -1
  22. package/dist/http/jsonrpc_errors.js +7 -5
  23. package/dist/realtime/sse.d.ts +14 -1
  24. package/dist/realtime/sse.d.ts.map +1 -1
  25. package/dist/realtime/sse.js +77 -1
  26. package/dist/realtime/sse_auth_guard.js +1 -1
  27. package/dist/realtime/subscriber_registry.d.ts +44 -8
  28. package/dist/realtime/subscriber_registry.d.ts.map +1 -1
  29. package/dist/realtime/subscriber_registry.js +64 -10
  30. package/dist/runtime/mock.js +1 -1
  31. package/dist/server/app_server.d.ts +4 -1
  32. package/dist/server/app_server.d.ts.map +1 -1
  33. package/dist/testing/CLAUDE.md +21 -6
  34. package/dist/testing/cross_backend/account_lifecycle.d.ts.map +1 -1
  35. package/dist/testing/cross_backend/account_lifecycle.js +0 -3
  36. package/dist/testing/cross_backend/action_manifest.d.ts +0 -4
  37. package/dist/testing/cross_backend/action_manifest.d.ts.map +1 -1
  38. package/dist/testing/cross_backend/action_manifest.js +0 -4
  39. package/dist/testing/cross_backend/actor_lookup.d.ts.map +1 -1
  40. package/dist/testing/cross_backend/actor_lookup.js +0 -3
  41. package/dist/testing/cross_backend/actor_search.d.ts.map +1 -1
  42. package/dist/testing/cross_backend/actor_search.js +0 -2
  43. package/dist/testing/cross_backend/app_settings.d.ts.map +1 -1
  44. package/dist/testing/cross_backend/app_settings.js +0 -2
  45. package/dist/testing/cross_backend/body_size.d.ts.map +1 -1
  46. package/dist/testing/cross_backend/body_size.js +0 -3
  47. package/dist/testing/cross_backend/body_size_smuggling.d.ts.map +1 -1
  48. package/dist/testing/cross_backend/body_size_smuggling.js +0 -2
  49. package/dist/testing/cross_backend/cell_cross_helpers.d.ts.map +1 -1
  50. package/dist/testing/cross_backend/cell_cross_helpers.js +0 -3
  51. package/dist/testing/cross_backend/cell_crud.d.ts.map +1 -1
  52. package/dist/testing/cross_backend/cell_crud.js +0 -3
  53. package/dist/testing/cross_backend/cell_gated_create.d.ts +0 -2
  54. package/dist/testing/cross_backend/cell_gated_create.d.ts.map +1 -1
  55. package/dist/testing/cross_backend/cell_gated_create.js +0 -4
  56. package/dist/testing/cross_backend/cell_grant_role.d.ts.map +1 -1
  57. package/dist/testing/cross_backend/cell_grant_role.js +0 -2
  58. package/dist/testing/cross_backend/cell_relations.d.ts.map +1 -1
  59. package/dist/testing/cross_backend/cell_relations.js +0 -3
  60. package/dist/testing/cross_backend/cookie_attributes.d.ts.map +1 -1
  61. package/dist/testing/cross_backend/cookie_attributes.js +0 -3
  62. package/dist/testing/cross_backend/credential_header_robustness.d.ts.map +1 -1
  63. package/dist/testing/cross_backend/credential_header_robustness.js +0 -2
  64. package/dist/testing/cross_backend/default_spine_surface.d.ts +0 -7
  65. package/dist/testing/cross_backend/default_spine_surface.d.ts.map +1 -1
  66. package/dist/testing/cross_backend/fact_serving.d.ts.map +1 -1
  67. package/dist/testing/cross_backend/fact_serving.js +0 -3
  68. package/dist/testing/cross_backend/full_spine_mount.d.ts +0 -5
  69. package/dist/testing/cross_backend/full_spine_mount.d.ts.map +1 -1
  70. package/dist/testing/cross_backend/identity_parity.d.ts.map +1 -1
  71. package/dist/testing/cross_backend/identity_parity.js +0 -2
  72. package/dist/testing/cross_backend/login_security.d.ts.map +1 -1
  73. package/dist/testing/cross_backend/login_security.js +0 -3
  74. package/dist/testing/cross_backend/origin.d.ts.map +1 -1
  75. package/dist/testing/cross_backend/origin.js +0 -3
  76. package/dist/testing/cross_backend/peer_ping_ws.js +4 -4
  77. package/dist/testing/cross_backend/query_shape.d.ts.map +1 -1
  78. package/dist/testing/cross_backend/query_shape.js +0 -3
  79. package/dist/testing/cross_backend/ready.d.ts.map +1 -1
  80. package/dist/testing/cross_backend/ready.js +0 -3
  81. package/dist/testing/cross_backend/role_grant_offer_enumeration.d.ts.map +1 -1
  82. package/dist/testing/cross_backend/role_grant_offer_enumeration.js +0 -3
  83. package/dist/testing/cross_backend/role_grant_participation.d.ts.map +1 -1
  84. package/dist/testing/cross_backend/role_grant_participation.js +0 -3
  85. package/dist/testing/cross_backend/session_cap.d.ts.map +1 -1
  86. package/dist/testing/cross_backend/session_cap.js +0 -3
  87. package/dist/testing/cross_backend/test_cell_gated_create_authorize.d.ts.map +1 -1
  88. package/dist/testing/cross_backend/test_cell_gated_create_authorize.js +0 -3
  89. package/dist/testing/cross_backend/testing_backdoor.d.ts.map +1 -1
  90. package/dist/testing/cross_backend/testing_backdoor.js +0 -3
  91. package/dist/testing/cross_backend/testing_server_bun.js +1 -1
  92. package/dist/testing/cross_backend/token_lifetime.d.ts.map +1 -1
  93. package/dist/testing/cross_backend/token_lifetime.js +0 -4
  94. package/dist/testing/cross_backend/token_scope_surface.d.ts.map +1 -1
  95. package/dist/testing/cross_backend/token_scope_surface.js +0 -3
  96. package/dist/testing/cross_backend/ts_spine_backend_config.d.ts +1 -1
  97. package/dist/testing/cross_backend/ts_spine_backend_config.js +1 -1
  98. package/dist/testing/cross_backend/ws_action_rate_limit.d.ts.map +1 -1
  99. package/dist/testing/cross_backend/ws_action_rate_limit.js +0 -3
  100. package/dist/testing/cross_backend/ws_connection_cap.d.ts.map +1 -1
  101. package/dist/testing/cross_backend/ws_connection_cap.js +0 -3
  102. package/dist/testing/cross_backend/ws_inbound_dispatch.d.ts +20 -0
  103. package/dist/testing/cross_backend/ws_inbound_dispatch.d.ts.map +1 -0
  104. package/dist/testing/cross_backend/ws_inbound_dispatch.js +177 -0
  105. package/dist/testing/transports/sse_frame_reader.d.ts.map +1 -1
  106. package/dist/testing/transports/sse_frame_reader.js +4 -1
  107. package/dist/ui/Datatable.svelte +2 -2
  108. package/dist/ui/ui_format.d.ts.map +1 -1
  109. package/dist/ui/ui_format.js +2 -0
  110. package/package.json +19 -19
@@ -30,11 +30,6 @@ import '../assert_dev_env.js';
30
30
  * enumerates `build_full_spine_rpc_actions` with stub deps and asserts the live method set equals the tagged coverage
31
31
  * manifest; see `src/test/cross_backend/spine_method_coverage.ts`.
32
32
  *
33
- * **`$lib`-free by contract** — like `default_spine_surface.ts`, this module
34
- * is reached by the spawned TS binary under Gro's loader (which resolves
35
- * `.js`→`.ts` but not the `$lib` alias), so every import is relative. Keep
36
- * it that way.
37
- *
38
33
  * @module
39
34
  */
40
35
  import type { RpcAction } from '../../actions/action_rpc.js';
@@ -1 +1 @@
1
- {"version":3,"file":"full_spine_mount.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/full_spine_mount.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAG5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8CAA8C,CAAC;AAYvF,6EAA6E;AAC7E,MAAM,WAAW,qBAAqB;IACrC;;;;;;OAMG;IACH,QAAQ,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;IAC9C;;;;OAIG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACzD;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,4BAA4B,GACxC,MAAM,OAAO,EACb,SAAS,qBAAqB,KAC5B,KAAK,CAAC,SAAS,CAoCjB,CAAC;AAEF,6EAA6E;AAC7E,MAAM,WAAW,cAAc;IAC9B,gFAAgF;IAChF,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACvC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CACnC;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,sBAAsB,GAClC,MAAM,OAAO,EACb,SAAS,qBAAqB,KAC5B,cAUF,CAAC"}
1
+ {"version":3,"file":"full_spine_mount.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/full_spine_mount.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAG5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8CAA8C,CAAC;AAYvF,6EAA6E;AAC7E,MAAM,WAAW,qBAAqB;IACrC;;;;;;OAMG;IACH,QAAQ,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;IAC9C;;;;OAIG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACzD;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,4BAA4B,GACxC,MAAM,OAAO,EACb,SAAS,qBAAqB,KAC5B,KAAK,CAAC,SAAS,CAoCjB,CAAC;AAEF,6EAA6E;AAC7E,MAAM,WAAW,cAAc;IAC9B,gFAAgF;IAChF,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACvC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CACnC;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,sBAAsB,GAClC,MAAM,OAAO,EACb,SAAS,qBAAqB,KAC5B,cAUF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"identity_parity.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/identity_parity.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAqG9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAkB5C,uDAAuD;AACvD,MAAM,WAAW,8BAA8B;IAC9C,+DAA+D;IAC/D,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,kFAAkF;IAClF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,oFAAoF;IACpF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC9B;AA8JD,eAAO,MAAM,oCAAoC,GAChD,SAAS,8BAA8B,KACrC,IA6TF,CAAC"}
1
+ {"version":3,"file":"identity_parity.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/identity_parity.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAmG9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAkB5C,uDAAuD;AACvD,MAAM,WAAW,8BAA8B;IAC9C,+DAA+D;IAC/D,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,kFAAkF;IAClF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,oFAAoF;IACpF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC9B;AA8JD,eAAO,MAAM,oCAAoC,GAChD,SAAS,8BAA8B,KACrC,IA6TF,CAAC"}
@@ -85,8 +85,6 @@ import '../assert_dev_env.js';
85
85
  * cross-process leg (`cross_backend/identity_parity.cross.test.ts`, the TS spine
86
86
  * binaries + Rust `testing_spine_stub` over real HTTP).
87
87
  *
88
- * `$lib`-free by contract (relative specifiers only).
89
- *
90
88
  * @module
91
89
  */
92
90
  import { describe, test, assert } from 'vitest';
@@ -1 +1 @@
1
- {"version":3,"file":"login_security.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/login_security.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA8D9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,mDAAmD;AACnD,MAAM,WAAW,6BAA6B;IAC7C,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,kFAAkF;IAClF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B;AA0BD,eAAO,MAAM,mCAAmC,GAC/C,SAAS,6BAA6B,KACpC,IA2KF,CAAC"}
1
+ {"version":3,"file":"login_security.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/login_security.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA2D9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,mDAAmD;AACnD,MAAM,WAAW,6BAA6B;IAC7C,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,kFAAkF;IAClF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B;AA0BD,eAAO,MAAM,mCAAmC,GAC/C,SAAS,6BAA6B,KACpC,IA2KF,CAAC"}
@@ -46,9 +46,6 @@ import '../assert_dev_env.js';
46
46
  * (`describe_rate_limiting_tests` + the proxy middleware tests). Cited
47
47
  * property: `docs/security.md` §"Rate Limiting" + §"Trusted Proxy / Client IP".
48
48
  *
49
- * `$lib`-free by contract (relative specifiers only), like the sibling
50
- * cross-backend suites.
51
- *
52
49
  * @module
53
50
  */
54
51
  import { describe, test, assert } from 'vitest';
@@ -1 +1 @@
1
- {"version":3,"file":"origin.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/origin.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAkC9B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAG3D;;;;;;GAMG;AACH,MAAM,MAAM,sBAAsB,GAAG,wBAAwB,CAAC;AAM9D,eAAO,MAAM,2BAA2B,GAAI,SAAS,sBAAsB,KAAG,IAwC7E,CAAC"}
1
+ {"version":3,"file":"origin.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/origin.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA+B9B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAG3D;;;;;;GAMG;AACH,MAAM,MAAM,sBAAsB,GAAG,wBAAwB,CAAC;AAM9D,eAAO,MAAM,2BAA2B,GAAI,SAAS,sBAAsB,KAAG,IAwC7E,CAAC"}
@@ -21,9 +21,6 @@ import '../assert_dev_env.js';
21
21
  * binaries + Rust `testing_spine_stub` over real HTTP). Origin middleware is
22
22
  * on every spine, so the suite is ungated.
23
23
  *
24
- * `$lib`-free by contract (relative specifiers only), like the sibling
25
- * cross-backend suites.
26
- *
27
24
  * @module
28
25
  */
29
26
  import { describe, test, assert } from 'vitest';
@@ -26,10 +26,10 @@ import '../assert_dev_env.js';
26
26
  * non-sensitive — see the design doc); the WS upgrade itself still
27
27
  * authenticates, so the suite drives it over the keeper's session.
28
28
  *
29
- * Gated on `capabilities.peer_request` — `true` only for the Rust spine
30
- * (server-initiated requests landed Rust-first canonical); the TS family
31
- * skips until its server transport's request path lands (deferred twin-impl
32
- * convergence). Cross-process only: `create_ws_transport` needs a real bound
29
+ * Gated on `capabilities.peer_request`, which a backend declares once it
30
+ * mounts `peer/ping` on a WS endpoint and the HTTP RPC endpoint — the TS
31
+ * spine binaries (`BackendWebsocketTransport.request_connection`) and the
32
+ * Rust spine both do. Cross-process only: `create_ws_transport` needs a real bound
33
33
  * socket, so wire it from a `*.cross.test.ts`.
34
34
  *
35
35
  * @module
@@ -1 +1 @@
1
- {"version":3,"file":"query_shape.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/query_shape.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA0C9B,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,YAAY,CAAC;AAG1E;;;;;GAKG;AACH,MAAM,MAAM,0BAA0B,GAAG,uCAAuC,CAAC;AAQjF,eAAO,MAAM,gCAAgC,GAAI,SAAS,0BAA0B,KAAG,IAwHtF,CAAC"}
1
+ {"version":3,"file":"query_shape.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/query_shape.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAuC9B,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,YAAY,CAAC;AAG1E;;;;;GAKG;AACH,MAAM,MAAM,0BAA0B,GAAG,uCAAuC,CAAC;AAQjF,eAAO,MAAM,gCAAgC,GAAI,SAAS,0BAA0B,KAAG,IAwHtF,CAAC"}
@@ -28,9 +28,6 @@ import '../assert_dev_env.js';
28
28
  * `serve_fact_route.db.test.ts`); this suite is the cross-impl gate, so it is
29
29
  * cross-process only — like `login_security.ts` and `testing_backdoor.ts`.
30
30
  *
31
- * `$lib`-free by contract (relative specifiers only), like the sibling
32
- * cross-backend suites.
33
- *
34
31
  * @module
35
32
  */
36
33
  import { describe, test, assert } from 'vitest';
@@ -1 +1 @@
1
- {"version":3,"file":"ready.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/ready.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAkC9B,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,YAAY,CAAC;AAEnE,oDAAoD;AACpD,MAAM,WAAW,qBAAsB,SAAQ,gCAAgC;IAC9E,8CAA8C;IAC9C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,0BAA0B,GAAI,SAAS,qBAAqB,KAAG,IAuB3E,CAAC"}
1
+ {"version":3,"file":"ready.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/ready.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA+B9B,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,YAAY,CAAC;AAEnE,oDAAoD;AACpD,MAAM,WAAW,qBAAsB,SAAQ,gCAAgC;IAC9E,8CAA8C;IAC9C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,0BAA0B,GAAI,SAAS,qBAAqB,KAAG,IAuB3E,CAAC"}
@@ -22,9 +22,6 @@ import '../assert_dev_env.js';
22
22
  * the cross-process leg (`cross_backend/ready.cross.test.ts`, the TS spine
23
23
  * binaries + Rust `testing_spine_stub` over real HTTP).
24
24
  *
25
- * `$lib`-free by contract (relative specifiers only), like the sibling
26
- * cross-backend suites.
27
- *
28
25
  * @module
29
26
  */
30
27
  import { describe, assert } from 'vitest';
@@ -1 +1 @@
1
- {"version":3,"file":"role_grant_offer_enumeration.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/role_grant_offer_enumeration.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAwD9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAK5C;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,kBAAkB,CAAC;AAEtD,sDAAsD;AACtD,MAAM,WAAW,yCAAyC;IACzD;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC3B;AAQD,eAAO,MAAM,iDAAiD,GAC7D,SAAS,yCAAyC,KAChD,IAqGF,CAAC"}
1
+ {"version":3,"file":"role_grant_offer_enumeration.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/role_grant_offer_enumeration.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAqD9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAK5C;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,kBAAkB,CAAC;AAEtD,sDAAsD;AACtD,MAAM,WAAW,yCAAyC;IACzD;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC3B;AAQD,eAAO,MAAM,iDAAiD,GAC7D,SAAS,yCAAyC,KAChD,IAqGF,CAAC"}
@@ -37,9 +37,6 @@ import '../assert_dev_env.js';
37
37
  * cross-principal leaks; an intra-account sibling-actor offer stays a 403
38
38
  * `role_grant_offer_actor_mismatch`).
39
39
  *
40
- * `$lib`-free by contract (relative specifiers only), like the sibling
41
- * cross-backend suites.
42
- *
43
40
  * @module
44
41
  */
45
42
  import { describe, test, assert } from 'vitest';
@@ -1 +1 @@
1
- {"version":3,"file":"role_grant_participation.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/role_grant_participation.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAyC9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,0EAA0E;AAC1E,MAAM,WAAW,sCAAsC;IACtD,+DAA+D;IAC/D,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,6CAA6C,GACzD,SAAS,sCAAsC,KAC7C,IA8IF,CAAC"}
1
+ {"version":3,"file":"role_grant_participation.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/role_grant_participation.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAsC9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,0EAA0E;AAC1E,MAAM,WAAW,sCAAsC;IACtD,+DAA+D;IAC/D,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,6CAA6C,GACzD,SAAS,sCAAsC,KAC7C,IA8IF,CAAC"}
@@ -28,9 +28,6 @@ import '../assert_dev_env.js';
28
28
  * (`spine_roles` / the Rust stub's `RoleRegistry`), so the suite is ungated;
29
29
  * every spine mounts the standard RPC surface it drives.
30
30
  *
31
- * `$lib`-free by contract (relative specifiers only), like the sibling
32
- * cross-backend suites.
33
- *
34
31
  * @module
35
32
  */
36
33
  import { describe, test, assert } from 'vitest';
@@ -1 +1 @@
1
- {"version":3,"file":"session_cap.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/session_cap.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA6D9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,gDAAgD;AAChD,MAAM,WAAW,0BAA0B;IAC1C,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,2DAA2D;IAC3D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,qEAAqE;IACrE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE;QACb,2EAA2E;QAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,+DAA+D;QAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,sDAAsD;QACtD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACF;AAED,eAAO,MAAM,gCAAgC,GAAI,SAAS,0BAA0B,KAAG,IA4FtF,CAAC"}
1
+ {"version":3,"file":"session_cap.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/session_cap.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA0D9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,gDAAgD;AAChD,MAAM,WAAW,0BAA0B;IAC1C,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,2DAA2D;IAC3D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,qEAAqE;IACrE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE;QACb,2EAA2E;QAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,+DAA+D;QAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,sDAAsD;QACtD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACF;AAED,eAAO,MAAM,gCAAgC,GAAI,SAAS,0BAA0B,KAAG,IA4FtF,CAAC"}
@@ -43,9 +43,6 @@ import '../assert_dev_env.js';
43
43
  * the cap — see `query_session_enforce_limit`'s race note. That needs a
44
44
  * barrier-based test against one backend, not a parity case.
45
45
  *
46
- * `$lib`-free by contract (relative specifiers only), like the sibling
47
- * cross-backend suites.
48
- *
49
46
  * @module
50
47
  */
51
48
  import { describe, test, assert } from 'vitest';
@@ -1 +1 @@
1
- {"version":3,"file":"test_cell_gated_create_authorize.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/test_cell_gated_create_authorize.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA+B9B,OAAO,KAAK,EACX,mBAAmB,EAGnB,MAAM,4BAA4B,CAAC;AAGpC,8EAA8E;AAC9E,eAAO,MAAM,eAAe,UAAU,CAAC;AAEvC;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,gBAAyB,CAAC;AAEzD,yFAAyF;AACzF,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAYD;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,EAAE,mBAsB9C,CAAC"}
1
+ {"version":3,"file":"test_cell_gated_create_authorize.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/test_cell_gated_create_authorize.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA4B9B,OAAO,KAAK,EACX,mBAAmB,EAGnB,MAAM,4BAA4B,CAAC;AAGpC,8EAA8E;AAC9E,eAAO,MAAM,eAAe,UAAU,CAAC;AAEvC;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,gBAAyB,CAAC;AAEzD,yFAAyF;AACzF,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAYD;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,EAAE,mBAsB9C,CAAC"}
@@ -20,9 +20,6 @@ import '../assert_dev_env.js';
20
20
  * the predicate is **pure** — no DB read of its own (which also dodges the
21
21
  * single-connection PGlite deadlock a separate handle would hit).
22
22
  *
23
- * **`$lib`-free by contract** — reached by the spawned TS spine binary under
24
- * Gro's loader (no `$lib` alias). Keep every import relative.
25
- *
26
23
  * @module
27
24
  */
28
25
  import { has_scoped_role } from '../../auth/request_context.js';
@@ -1 +1 @@
1
- {"version":3,"file":"testing_backdoor.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/testing_backdoor.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA2E9B,OAAO,KAAK,EAAE,wBAAwB,EAAe,MAAM,YAAY,CAAC;AA0ExE,kEAAkE;AAClE,MAAM,WAAW,+BAAgC,SAAQ,wBAAwB;IAChF;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE;QACb,2EAA2E;QAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,+DAA+D;QAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,sDAAsD;QACtD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACF;AAED,eAAO,MAAM,qCAAqC,GACjD,SAAS,+BAA+B,KACtC,IAyEF,CAAC"}
1
+ {"version":3,"file":"testing_backdoor.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/testing_backdoor.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAwE9B,OAAO,KAAK,EAAE,wBAAwB,EAAe,MAAM,YAAY,CAAC;AA0ExE,kEAAkE;AAClE,MAAM,WAAW,+BAAgC,SAAQ,wBAAwB;IAChF;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE;QACb,2EAA2E;QAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,+DAA+D;QAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,sDAAsD;QACtD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACF;AAED,eAAO,MAAM,qCAAqC,GACjD,SAAS,+BAA+B,KACtC,IAyEF,CAAC"}
@@ -57,9 +57,6 @@ import '../assert_dev_env.js';
57
57
  * backend mounts them, and the WS cases run when `ws` is passed — for a
58
58
  * backend that also serves them on its WS endpoint.
59
59
  *
60
- * `$lib`-free by contract (relative specifiers only), like the sibling
61
- * cross-backend suites.
62
- *
63
60
  * @module
64
61
  */
65
62
  import { describe, test, assert } from 'vitest';
@@ -51,7 +51,7 @@ export const create_bun_testing_adapter = () => {
51
51
  },
52
52
  serve: ({ fetch, port, hostname }) => {
53
53
  const server = Bun.serve({
54
- fetch: fetch,
54
+ fetch,
55
55
  port,
56
56
  hostname,
57
57
  // Harmless for HTTP-only binaries — Bun only invokes it for sockets
@@ -1 +1 @@
1
- {"version":3,"file":"token_lifetime.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/token_lifetime.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAgD9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C;;;;GAIG;AACH,MAAM,WAAW,6BAA6B;IAC7C,wEAAwE;IACxE,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC3B;AAaD,eAAO,MAAM,mCAAmC,GAC/C,SAAS,6BAA6B,KACpC,IAsHF,CAAC"}
1
+ {"version":3,"file":"token_lifetime.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/token_lifetime.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA4C9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C;;;;GAIG;AACH,MAAM,WAAW,6BAA6B;IAC7C,wEAAwE;IACxE,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC3B;AAaD,eAAO,MAAM,mCAAmC,GAC/C,SAAS,6BAA6B,KACpC,IAsHF,CAAC"}
@@ -28,10 +28,6 @@ import '../assert_dev_env.js';
28
28
  * - **Out-of-range days are refused** — `days: 0` 400s identically, so the
29
29
  * two hand-rolled bounds checks can't drift.
30
30
  *
31
- * `$lib`-free by contract (relative specifiers only), like the sibling
32
- * cross-backend suites. Runs both legs — in-process (`gro test`) and
33
- * cross-process — through the shared `{setup_test}` protocol.
34
- *
35
31
  * @module
36
32
  */
37
33
  import { describe, test, assert } from 'vitest';
@@ -1 +1 @@
1
- {"version":3,"file":"token_scope_surface.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/token_scope_surface.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA8E9B,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,YAAY,CAAC;AAkB1E,wDAAwD;AACxD,MAAM,WAAW,iCAAkC,SAAQ,uCAAuC;IACjG,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC3B;AAwFD,eAAO,MAAM,wCAAwC,GACpD,SAAS,iCAAiC,KACxC,IAwHF,CAAC"}
1
+ {"version":3,"file":"token_scope_surface.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/token_scope_surface.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA2E9B,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,YAAY,CAAC;AAkB1E,wDAAwD;AACxD,MAAM,WAAW,iCAAkC,SAAQ,uCAAuC;IACjG,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC3B;AAwFD,eAAO,MAAM,wCAAwC,GACpD,SAAS,iCAAiC,KACxC,IAwHF,CAAC"}
@@ -60,9 +60,6 @@ import '../assert_dev_env.js';
60
60
  * gate needs. The WS gate keeps its per-spine coverage (fuz_app's surface
61
61
  * census pins the call site; the Rust census pins its own).
62
62
  *
63
- * `$lib`-free by contract (relative specifiers only), like the sibling
64
- * cross-backend suites.
65
- *
66
63
  * @module
67
64
  */
68
65
  import { describe, assert } from 'vitest';
@@ -63,7 +63,7 @@ export interface TsSpineBackendConfigOptions {
63
63
  }
64
64
  /**
65
65
  * `BackendConfig` for the Node TS spine binary — spawned via `gro run`
66
- * (Gro's TS loader resolves the `$lib`-free entry's relative imports).
66
+ * (Gro's TS loader resolves the entry's relative imports).
67
67
  */
68
68
  export declare const ts_spine_node_backend_config: (options?: TsSpineBackendConfigOptions) => BackendConfig;
69
69
  /**
@@ -62,7 +62,7 @@ export const TS_SPINE_BUN_ENTRY = 'src/test/cross_backend/testing_spine_server_b
62
62
  const login_rate_limit_env = (enable) => enable ? { [LOGIN_RATE_LIMIT_ENABLED_ENV]: 'true' } : {};
63
63
  /**
64
64
  * `BackendConfig` for the Node TS spine binary — spawned via `gro run`
65
- * (Gro's TS loader resolves the `$lib`-free entry's relative imports).
65
+ * (Gro's TS loader resolves the entry's relative imports).
66
66
  */
67
67
  export const ts_spine_node_backend_config = (options = {}) => {
68
68
  const { port = TS_SPINE_NODE_DEFAULT_PORT, database_url, enable_login_rate_limit } = options;
@@ -1 +1 @@
1
- {"version":3,"file":"ws_action_rate_limit.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/ws_action_rate_limit.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAmE9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAyC5C,+DAA+D;AAC/D,MAAM,WAAW,iCAAiC;IACjD,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC9B;AAkBD;;;;GAIG;AACH,eAAO,MAAM,yCAAyC,GACrD,SAAS,iCAAiC,KACxC,IAqRF,CAAC"}
1
+ {"version":3,"file":"ws_action_rate_limit.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/ws_action_rate_limit.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAgE9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAyC5C,+DAA+D;AAC/D,MAAM,WAAW,iCAAiC;IACjD,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC9B;AAkBD;;;;GAIG;AACH,eAAO,MAAM,yCAAyC,GACrD,SAAS,iCAAiC,KACxC,IAqRF,CAAC"}
@@ -48,9 +48,6 @@ import '../assert_dev_env.js';
48
48
  * (`create_app_server` threading one limiter pair to both mounts on TS; the
49
49
  * stub's dispatcher states plus its auth-family builders on Rust).
50
50
  *
51
- * `$lib`-free by contract (relative specifiers only), like the sibling
52
- * cross-backend suites.
53
- *
54
51
  * @module
55
52
  */
56
53
  import { assert, describe, test } from 'vitest';
@@ -1 +1 @@
1
- {"version":3,"file":"ws_connection_cap.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/ws_connection_cap.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAsD9B,OAAO,EAAE,KAAK,mBAAmB,EAAW,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAK5C,6DAA6D;AAC7D,MAAM,WAAW,+BAA+B;IAC/C;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,uEAAuE;IACvE,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAC3C,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,2BAA2B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrD;AAED;;;;;GAKG;AACH,eAAO,MAAM,sCAAsC,GAClD,SAAS,+BAA+B,KACtC,IA4GF,CAAC"}
1
+ {"version":3,"file":"ws_connection_cap.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/ws_connection_cap.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAmD9B,OAAO,EAAE,KAAK,mBAAmB,EAAW,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAK5C,6DAA6D;AAC7D,MAAM,WAAW,+BAA+B;IAC/C;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,uEAAuE;IACvE,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAC3C,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,2BAA2B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrD;AAED;;;;;GAKG;AACH,eAAO,MAAM,sCAAsC,GAClD,SAAS,+BAA+B,KACtC,IA4GF,CAAC"}
@@ -38,9 +38,6 @@ import '../assert_dev_env.js';
38
38
  * which is why it's a separate call rather than more cases on the WS
39
39
  * round-trip suite.
40
40
  *
41
- * `$lib`-free by contract (relative specifiers only), like the sibling
42
- * cross-backend suites.
43
- *
44
41
  * @module
45
42
  */
46
43
  import { assert, describe } from 'vitest';
@@ -0,0 +1,20 @@
1
+ import '../assert_dev_env.js';
2
+ import { type BackendCapabilities } from './capabilities.js';
3
+ import type { SetupTest } from './setup.js';
4
+ /** Configuration for `describe_ws_inbound_dispatch_cross_tests`. */
5
+ export interface WsInboundDispatchCrossTestOptions {
6
+ /** Per-test fixture producer (`default_cross_process_setup(handle)`). */
7
+ readonly setup_test: SetupTest;
8
+ /** Backend capability flags; every case gates on `capabilities.peer_request`. */
9
+ readonly capabilities: BackendCapabilities;
10
+ /** Base URL the backend is reachable at (e.g. `http://localhost:1177`). */
11
+ readonly base_url: string;
12
+ /** WebSocket endpoint path on the backend (e.g. `/api/ws`). */
13
+ readonly ws_path: string;
14
+ }
15
+ /**
16
+ * Register the duplicate-id and in-flight-ceiling cases. Gated on
17
+ * `capabilities.peer_request` (the cases hold requests with `peer/ping`).
18
+ */
19
+ export declare const describe_ws_inbound_dispatch_cross_tests: (options: WsInboundDispatchCrossTestOptions) => void;
20
+ //# sourceMappingURL=ws_inbound_dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws_inbound_dispatch.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/ws_inbound_dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA2C9B,OAAO,EAAE,KAAK,mBAAmB,EAAW,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAiB5C,oEAAoE;AACpE,MAAM,WAAW,iCAAiC;IACjD,yEAAyE;IACzE,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,iFAAiF;IACjF,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAC3C,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACzB;AAiED;;;GAGG;AACH,eAAO,MAAM,wCAAwC,GACpD,SAAS,iCAAiC,KACxC,IA8GF,CAAC"}
@@ -0,0 +1,177 @@
1
+ import '../assert_dev_env.js';
2
+ /**
3
+ * Cross-process suite for the two refusals a WebSocket request can meet ahead
4
+ * of dispatch — the same on both spines, pinned over a real upgrade:
5
+ *
6
+ * - a request whose id names a request still running on the socket is
7
+ * answered `invalid_request` with `data.reason: 'duplicate_request_id'` and
8
+ * not dispatched; the running request keeps the id and answers as usual, and
9
+ * once it has answered the id is free again
10
+ * - past the per-socket in-flight ceiling (128 on both spines) a new request is
11
+ * answered `queue_overflow` with its id and not dispatched; the socket stays
12
+ * open, the running requests still answer, and the duplicate check comes
13
+ * first
14
+ *
15
+ * A request has to stay in flight for either to be observable, so the suite
16
+ * holds requests with `peer/ping`: the server's handler pings the client back
17
+ * and waits for the echo, and the client's responder withholds it until the
18
+ * test releases it. Gated on `capabilities.peer_request` for that reason.
19
+ *
20
+ * The wire literals are deliberate independent copies of the producers'
21
+ * constants (`ERROR_DUPLICATE_REQUEST_ID`,
22
+ * `MAX_INBOUND_DISPATCHES_PER_CONNECTION`, `WS_INBOUND_DISPATCH_OVERFLOW_MESSAGE`
23
+ * on TS; their Rust twins in `fuz_realtime`) — parity by test, so a value
24
+ * renamed on one side fails here instead of moving both at once.
25
+ *
26
+ * Cross-process only: `create_ws_transport` needs a real bound socket, so wire
27
+ * it from a `*.cross.test.ts` file.
28
+ *
29
+ * @module
30
+ */
31
+ import { assert, describe } from 'vitest';
32
+ import { create_jsonrpc_request } from '../../http/jsonrpc_helpers.js';
33
+ import { create_ws_transport } from '../transports/ws_transport.js';
34
+ import { is_response_for } from '../transports/ws_client.js';
35
+ import { test_if } from './capabilities.js';
36
+ /** `data.reason` of the duplicate-id refusal. */
37
+ const REASON_DUPLICATE_REQUEST_ID = 'duplicate_request_id';
38
+ /** The per-socket in-flight ceiling on both spines. */
39
+ const MAX_INBOUND_DISPATCHES = 128;
40
+ /** The `queue_overflow` message past the ceiling. */
41
+ const OVERFLOW_MESSAGE = 'too many concurrent requests on this connection';
42
+ const INVALID_REQUEST = -32600;
43
+ const QUEUE_OVERFLOW = -32009;
44
+ const PEER_PING_METHOD = 'peer/ping';
45
+ const HEARTBEAT_METHOD = 'heartbeat';
46
+ /** How long the test waits on a frame — above the server's peer-request deadline. */
47
+ const FRAME_TIMEOUT_MS = 12_000;
48
+ /**
49
+ * A client responder that withholds every server-initiated `peer/ping` echo
50
+ * until `release` — so each client `peer/ping` stays in flight on the server —
51
+ * and answers at once after it.
52
+ */
53
+ const create_holding_responder = () => {
54
+ let release;
55
+ const released = new Promise((resolve) => {
56
+ release = resolve;
57
+ });
58
+ let ping_count = 0;
59
+ const ping_waiters = [];
60
+ const responder = async (request) => {
61
+ ping_count++;
62
+ for (let i = ping_waiters.length - 1; i >= 0; i--) {
63
+ const waiter = ping_waiters[i];
64
+ if (ping_count >= waiter.count) {
65
+ waiter.resolve();
66
+ ping_waiters.splice(i, 1);
67
+ }
68
+ }
69
+ await released;
70
+ const nonce = request.params?.nonce ?? 0;
71
+ return { result: { nonce, protocol_version: 1 } };
72
+ };
73
+ const pinged = (count) => ping_count >= count
74
+ ? Promise.resolve()
75
+ : new Promise((resolve) => ping_waiters.push({ count, resolve }));
76
+ return { responder, release, pinged };
77
+ };
78
+ /** A response for `id` that carries a `peer/ping` result (`nonce` present). */
79
+ const is_ping_result_for = (id) => (msg) => is_response_for(id)(msg) &&
80
+ typeof msg.result === 'object' &&
81
+ msg.result !== null &&
82
+ 'nonce' in msg.result;
83
+ /** A response for `id` that carries a `heartbeat` result (an object without `nonce`). */
84
+ const is_heartbeat_result_for = (id) => (msg) => is_response_for(id)(msg) &&
85
+ typeof msg.result === 'object' &&
86
+ msg.result !== null &&
87
+ !('nonce' in msg.result);
88
+ /** An error response for `id`. */
89
+ const is_error_for = (id) => (msg) => is_response_for(id)(msg) && 'error' in msg;
90
+ /**
91
+ * Register the duplicate-id and in-flight-ceiling cases. Gated on
92
+ * `capabilities.peer_request` (the cases hold requests with `peer/ping`).
93
+ */
94
+ export const describe_ws_inbound_dispatch_cross_tests = (options) => {
95
+ const { setup_test, capabilities, base_url, ws_path } = options;
96
+ const open_ws = (cookie, on_request) => {
97
+ assert.ok(cookie, 'expected a session cookie for the WS upgrade');
98
+ return create_ws_transport({
99
+ base_url,
100
+ ws_path,
101
+ cookies: [cookie],
102
+ origin: base_url,
103
+ on_request,
104
+ default_timeout_ms: FRAME_TIMEOUT_MS
105
+ });
106
+ };
107
+ const send_ping = (ws, id, nonce) => ws.send(create_jsonrpc_request(PEER_PING_METHOD, { nonce }, id));
108
+ const send_heartbeat = (ws, id) => ws.send(create_jsonrpc_request(HEARTBEAT_METHOD, undefined, id));
109
+ const assert_duplicate_refusal = (frame, id) => {
110
+ assert.ok('error' in frame, `expected the duplicate to be refused: ${JSON.stringify(frame)}`);
111
+ assert.strictEqual(frame.id, id);
112
+ assert.strictEqual(frame.error.code, INVALID_REQUEST);
113
+ assert.strictEqual(frame.error.message, 'invalid request');
114
+ assert.deepStrictEqual(frame.error.data, { reason: REASON_DUPLICATE_REQUEST_ID });
115
+ };
116
+ describe('ws inbound dispatch refusals (cross-process)', () => {
117
+ test_if(capabilities.peer_request, 'a request reusing a live id is refused with that id; the first keeps it, then the id frees', async () => {
118
+ const fixture = await setup_test();
119
+ const { responder, release, pinged } = create_holding_responder();
120
+ const ws = await open_ws(fixture.create_session_headers().cookie, responder);
121
+ try {
122
+ const id = 'held';
123
+ await send_ping(ws, id, 41);
124
+ // the server pinged back: the first request is dispatched and waiting
125
+ await pinged(1);
126
+ await send_heartbeat(ws, id);
127
+ assert_duplicate_refusal(await ws.wait_for(is_error_for(id)), id);
128
+ // the string '7' and the number 7 are different ids on both spines
129
+ await send_ping(ws, 7, 7);
130
+ await pinged(2);
131
+ await send_heartbeat(ws, '7');
132
+ await ws.wait_for(is_heartbeat_result_for('7'));
133
+ release();
134
+ const first = await ws.wait_for(is_ping_result_for(id));
135
+ assert.strictEqual(first.result.nonce, 41, 'the first request answers under its id');
136
+ await ws.wait_for(is_ping_result_for(7));
137
+ // answered, the id is free again
138
+ await send_heartbeat(ws, id);
139
+ await ws.wait_for(is_heartbeat_result_for(id));
140
+ const refusals = ws.messages.filter(is_error_for(id));
141
+ assert.strictEqual(refusals.length, 1, 'only the duplicate was refused');
142
+ }
143
+ finally {
144
+ await ws.close();
145
+ }
146
+ });
147
+ test_if(capabilities.peer_request, 'past the in-flight ceiling a request is shed with queue_overflow and the socket keeps serving', async () => {
148
+ const fixture = await setup_test();
149
+ const { responder, release } = create_holding_responder();
150
+ const ws = await open_ws(fixture.create_session_headers().cookie, responder);
151
+ try {
152
+ for (let n = 0; n < MAX_INBOUND_DISPATCHES; n++) {
153
+ await send_ping(ws, n, n);
154
+ }
155
+ // a duplicate at the ceiling is refused as a duplicate — that check is first
156
+ await send_heartbeat(ws, 0);
157
+ await send_heartbeat(ws, 'over');
158
+ assert_duplicate_refusal(await ws.wait_for(is_error_for(0)), 0);
159
+ const over = await ws.wait_for(is_response_for('over'));
160
+ assert.ok('error' in over, `expected the request to be shed: ${JSON.stringify(over)}`);
161
+ assert.strictEqual(over.error.code, QUEUE_OVERFLOW);
162
+ assert.strictEqual(over.error.message, OVERFLOW_MESSAGE);
163
+ assert.strictEqual(ws.close_code, null, 'shedding never closes the socket');
164
+ release();
165
+ for (let n = 0; n < MAX_INBOUND_DISPATCHES; n++) {
166
+ const frame = await ws.wait_for(is_ping_result_for(n));
167
+ assert.strictEqual(frame.result.nonce, n);
168
+ }
169
+ await send_heartbeat(ws, 'after');
170
+ await ws.wait_for(is_heartbeat_result_for('after'));
171
+ }
172
+ finally {
173
+ await ws.close();
174
+ }
175
+ });
176
+ });
177
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"sse_frame_reader.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/transports/sse_frame_reader.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;GAWG;AAEH,iDAAiD;AACjD,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,gEAAgE;AAChE,MAAM,WAAW,cAAc;IAC9B;;;;OAIG;IACH,UAAU,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD;;;OAGG;IACH,cAAc,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,sEAAsE;IACtE,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,GACnC,QAAQ,2BAA2B,CAAC,UAAU,CAAC,EAC/C,2BAA8C,KAC5C,cA6DF,CAAC"}
1
+ {"version":3,"file":"sse_frame_reader.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/transports/sse_frame_reader.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;GAWG;AAEH,iDAAiD;AACjD,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,gEAAgE;AAChE,MAAM,WAAW,cAAc;IAC9B;;;;OAIG;IACH,UAAU,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD;;;OAGG;IACH,cAAc,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,sEAAsE;IACtE,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,GACnC,QAAQ,2BAA2B,CAAC,UAAU,CAAC,EAC/C,2BAA8C,KAC5C,cA+DF,CAAC"}
@@ -31,7 +31,10 @@ export const create_sse_frame_reader = (reader, default_timeout_ms = SSE_FRAME_R
31
31
  const timeout = new Promise((resolve) => {
32
32
  setTimeout(() => resolve({ timed_out: true }), timeout_ms);
33
33
  });
34
- const result = (await Promise.race([reader.read(), timeout]));
34
+ const result = await Promise.race([
35
+ reader.read(),
36
+ timeout
37
+ ]);
35
38
  if ('timed_out' in result) {
36
39
  throw new Error(`SSE read timed out after ${timeout_ms}ms`);
37
40
  }
@@ -22,7 +22,7 @@
22
22
  const {
23
23
  columns,
24
24
  rows,
25
- row_key = 'id' as string & keyof T, // eslint-disable-line @typescript-eslint/no-duplicate-type-constituents
25
+ row_key = 'id',
26
26
  height,
27
27
  header,
28
28
  cell,
@@ -131,7 +131,7 @@
131
131
  {#if cell}
132
132
  {@render cell(column, row, row[column.key])}
133
133
  {:else if column.format}
134
- {column.format(row[column.key], row as any)}
134
+ {column.format(row[column.key], row)}
135
135
  {:else}
136
136
  {format_value(row[column.key])}
137
137
  {/if}
@@ -1 +1 @@
1
- {"version":3,"file":"ui_format.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/ui_format.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAChC,WAAW,MAAM,GAAG,MAAM,GAAG,IAAI,EACjC,MAAK,MAAmB,KACtB,MA2BF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,IAAI,MAAM,KAAG,MAY1C,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,EAAE,YAAY,MAAM,EAAE,kBAAe,KAAG,MAOlF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,MAAmC,CAAC;AAEjF;;GAEG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,MAS7C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,WAAW,MAAM,GAAG,MAAM,GAAG,IAAI,KAAG,MAOzE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GACjC,YAAY,MAAM,EAClB,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,KACtC,MAgEF,CAAC"}
1
+ {"version":3,"file":"ui_format.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/ui_format.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAChC,WAAW,MAAM,GAAG,MAAM,GAAG,IAAI,EACjC,MAAK,MAAmB,KACtB,MA2BF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,IAAI,MAAM,KAAG,MAY1C,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,EAAE,YAAY,MAAM,EAAE,kBAAe,KAAG,MAOlF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,MAAmC,CAAC;AAEjF;;GAEG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,MAW7C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,WAAW,MAAM,GAAG,MAAM,GAAG,IAAI,KAAG,MAOzE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GACjC,YAAY,MAAM,EAClB,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,KACtC,MAgEF,CAAC"}
@@ -104,6 +104,8 @@ export const format_value = (value) => {
104
104
  return String(value);
105
105
  if (typeof value === 'symbol')
106
106
  return value.toString();
107
+ // only functions reach here, whose source text is the intended display
108
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string
107
109
  return String(value);
108
110
  };
109
111
  /**