@moltzap/client 2026.414.0 → 2026.425.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 (216) hide show
  1. package/dist/channel-core.d.ts +28 -15
  2. package/dist/channel-core.d.ts.map +1 -1
  3. package/dist/channel-core.js +113 -74
  4. package/dist/channel-core.js.map +1 -1
  5. package/dist/channel-core.test.js +126 -34
  6. package/dist/channel-core.test.js.map +1 -1
  7. package/dist/cli/__tests__/cli-multi-agent.int.test.d.ts +2 -0
  8. package/dist/cli/__tests__/cli-multi-agent.int.test.d.ts.map +1 -0
  9. package/dist/cli/__tests__/cli-multi-agent.int.test.js +26 -0
  10. package/dist/cli/__tests__/cli-multi-agent.int.test.js.map +1 -0
  11. package/dist/cli/commands/agents.d.ts +13 -2
  12. package/dist/cli/commands/agents.d.ts.map +1 -1
  13. package/dist/cli/commands/agents.js +30 -18
  14. package/dist/cli/commands/agents.js.map +1 -1
  15. package/dist/cli/commands/apps.d.ts +96 -0
  16. package/dist/cli/commands/apps.d.ts.map +1 -0
  17. package/dist/cli/commands/apps.js +193 -0
  18. package/dist/cli/commands/apps.js.map +1 -0
  19. package/dist/cli/commands/apps.test.d.ts +2 -0
  20. package/dist/cli/commands/apps.test.d.ts.map +1 -0
  21. package/dist/cli/commands/apps.test.js +220 -0
  22. package/dist/cli/commands/apps.test.js.map +1 -0
  23. package/dist/cli/commands/contacts.d.ts +18 -2
  24. package/dist/cli/commands/contacts.d.ts.map +1 -1
  25. package/dist/cli/commands/contacts.js +44 -52
  26. package/dist/cli/commands/contacts.js.map +1 -1
  27. package/dist/cli/commands/conversations-v2.test.d.ts +2 -0
  28. package/dist/cli/commands/conversations-v2.test.d.ts.map +1 -0
  29. package/dist/cli/commands/conversations-v2.test.js +92 -0
  30. package/dist/cli/commands/conversations-v2.test.js.map +1 -0
  31. package/dist/cli/commands/conversations.d.ts +73 -3
  32. package/dist/cli/commands/conversations.d.ts.map +1 -1
  33. package/dist/cli/commands/conversations.js +157 -108
  34. package/dist/cli/commands/conversations.js.map +1 -1
  35. package/dist/cli/commands/invite.d.ts +6 -2
  36. package/dist/cli/commands/invite.d.ts.map +1 -1
  37. package/dist/cli/commands/invite.js +8 -6
  38. package/dist/cli/commands/invite.js.map +1 -1
  39. package/dist/cli/commands/messages.d.ts +48 -0
  40. package/dist/cli/commands/messages.d.ts.map +1 -0
  41. package/dist/cli/commands/messages.js +68 -0
  42. package/dist/cli/commands/messages.js.map +1 -0
  43. package/dist/cli/commands/messages.test.d.ts +2 -0
  44. package/dist/cli/commands/messages.test.d.ts.map +1 -0
  45. package/dist/cli/commands/messages.test.js +73 -0
  46. package/dist/cli/commands/messages.test.js.map +1 -0
  47. package/dist/cli/commands/permissions.d.ts +66 -0
  48. package/dist/cli/commands/permissions.d.ts.map +1 -0
  49. package/dist/cli/commands/permissions.js +101 -0
  50. package/dist/cli/commands/permissions.js.map +1 -0
  51. package/dist/cli/commands/permissions.test.d.ts +2 -0
  52. package/dist/cli/commands/permissions.test.d.ts.map +1 -0
  53. package/dist/cli/commands/permissions.test.js +126 -0
  54. package/dist/cli/commands/permissions.test.js.map +1 -0
  55. package/dist/cli/commands/ping.d.ts +6 -2
  56. package/dist/cli/commands/ping.d.ts.map +1 -1
  57. package/dist/cli/commands/ping.js +21 -20
  58. package/dist/cli/commands/ping.js.map +1 -1
  59. package/dist/cli/commands/presence.d.ts +10 -2
  60. package/dist/cli/commands/presence.d.ts.map +1 -1
  61. package/dist/cli/commands/presence.js +27 -15
  62. package/dist/cli/commands/presence.js.map +1 -1
  63. package/dist/cli/commands/register.d.ts +24 -2
  64. package/dist/cli/commands/register.d.ts.map +1 -1
  65. package/dist/cli/commands/register.js +123 -47
  66. package/dist/cli/commands/register.js.map +1 -1
  67. package/dist/cli/commands/register.test.js +45 -27
  68. package/dist/cli/commands/register.test.js.map +1 -1
  69. package/dist/cli/commands/send.d.ts +43 -2
  70. package/dist/cli/commands/send.d.ts.map +1 -1
  71. package/dist/cli/commands/send.js +55 -13
  72. package/dist/cli/commands/send.js.map +1 -1
  73. package/dist/cli/commands/send.test.js +20 -19
  74. package/dist/cli/commands/send.test.js.map +1 -1
  75. package/dist/cli/commands/status.d.ts +6 -2
  76. package/dist/cli/commands/status.d.ts.map +1 -1
  77. package/dist/cli/commands/status.js +16 -10
  78. package/dist/cli/commands/status.js.map +1 -1
  79. package/dist/cli/commands/whoami.d.ts +7 -2
  80. package/dist/cli/commands/whoami.d.ts.map +1 -1
  81. package/dist/cli/commands/whoami.js +13 -7
  82. package/dist/cli/commands/whoami.js.map +1 -1
  83. package/dist/cli/config.d.ts +24 -8
  84. package/dist/cli/config.d.ts.map +1 -1
  85. package/dist/cli/config.js +65 -39
  86. package/dist/cli/config.js.map +1 -1
  87. package/dist/cli/config.test.js +12 -10
  88. package/dist/cli/config.test.js.map +1 -1
  89. package/dist/cli/http-client.d.ts +6 -2
  90. package/dist/cli/http-client.d.ts.map +1 -1
  91. package/dist/cli/http-client.js +25 -24
  92. package/dist/cli/http-client.js.map +1 -1
  93. package/dist/cli/index.d.ts +16 -1
  94. package/dist/cli/index.d.ts.map +1 -1
  95. package/dist/cli/index.js +160 -27
  96. package/dist/cli/index.js.map +1 -1
  97. package/dist/cli/profile.d.ts +134 -0
  98. package/dist/cli/profile.d.ts.map +1 -0
  99. package/dist/cli/profile.js +217 -0
  100. package/dist/cli/profile.js.map +1 -0
  101. package/dist/cli/profile.test.d.ts +2 -0
  102. package/dist/cli/profile.test.d.ts.map +1 -0
  103. package/dist/cli/profile.test.js +263 -0
  104. package/dist/cli/profile.test.js.map +1 -0
  105. package/dist/cli/runtime.d.ts +34 -0
  106. package/dist/cli/runtime.d.ts.map +1 -0
  107. package/dist/cli/runtime.js +94 -0
  108. package/dist/cli/runtime.js.map +1 -0
  109. package/dist/cli/socket-client.d.ts +15 -12
  110. package/dist/cli/socket-client.d.ts.map +1 -1
  111. package/dist/cli/socket-client.js +72 -75
  112. package/dist/cli/socket-client.js.map +1 -1
  113. package/dist/cli/transport.d.ts +181 -0
  114. package/dist/cli/transport.d.ts.map +1 -0
  115. package/dist/cli/transport.js +324 -0
  116. package/dist/cli/transport.js.map +1 -0
  117. package/dist/cli/transport.test.d.ts +2 -0
  118. package/dist/cli/transport.test.d.ts.map +1 -0
  119. package/dist/cli/transport.test.js +197 -0
  120. package/dist/cli/transport.test.js.map +1 -0
  121. package/dist/index.d.ts +6 -2
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js +1 -0
  124. package/dist/index.js.map +1 -1
  125. package/dist/runtime/close-info.d.ts +94 -0
  126. package/dist/runtime/close-info.d.ts.map +1 -0
  127. package/dist/runtime/close-info.js +109 -0
  128. package/dist/runtime/close-info.js.map +1 -0
  129. package/dist/runtime/close-info.test.d.ts +2 -0
  130. package/dist/runtime/close-info.test.d.ts.map +1 -0
  131. package/dist/runtime/close-info.test.js +102 -0
  132. package/dist/runtime/close-info.test.js.map +1 -0
  133. package/dist/runtime/errors.d.ts +47 -0
  134. package/dist/runtime/errors.d.ts.map +1 -0
  135. package/dist/runtime/errors.js +20 -0
  136. package/dist/runtime/errors.js.map +1 -0
  137. package/dist/runtime/errors.test.d.ts +2 -0
  138. package/dist/runtime/errors.test.d.ts.map +1 -0
  139. package/dist/runtime/errors.test.js +66 -0
  140. package/dist/runtime/errors.test.js.map +1 -0
  141. package/dist/runtime/frame.d.ts +25 -0
  142. package/dist/runtime/frame.d.ts.map +1 -0
  143. package/dist/runtime/frame.js +106 -0
  144. package/dist/runtime/frame.js.map +1 -0
  145. package/dist/runtime/frame.test.d.ts +2 -0
  146. package/dist/runtime/frame.test.d.ts.map +1 -0
  147. package/dist/runtime/frame.test.js +32 -0
  148. package/dist/runtime/frame.test.js.map +1 -0
  149. package/dist/runtime/index.d.ts +3 -0
  150. package/dist/runtime/index.d.ts.map +1 -0
  151. package/dist/runtime/index.js +3 -0
  152. package/dist/runtime/index.js.map +1 -0
  153. package/dist/runtime/refs.d.ts +10 -0
  154. package/dist/runtime/refs.d.ts.map +1 -0
  155. package/dist/runtime/refs.js +10 -0
  156. package/dist/runtime/refs.js.map +1 -0
  157. package/dist/runtime/runtime.test.d.ts +2 -0
  158. package/dist/runtime/runtime.test.d.ts.map +1 -0
  159. package/dist/runtime/runtime.test.js +29 -0
  160. package/dist/runtime/runtime.test.js.map +1 -0
  161. package/dist/runtime/subscribers.d.ts +157 -0
  162. package/dist/runtime/subscribers.d.ts.map +1 -0
  163. package/dist/runtime/subscribers.js +131 -0
  164. package/dist/runtime/subscribers.js.map +1 -0
  165. package/dist/runtime/subscribers.test.d.ts +2 -0
  166. package/dist/runtime/subscribers.test.d.ts.map +1 -0
  167. package/dist/runtime/subscribers.test.js +155 -0
  168. package/dist/runtime/subscribers.test.js.map +1 -0
  169. package/dist/service.d.ts +68 -17
  170. package/dist/service.d.ts.map +1 -1
  171. package/dist/service.js +461 -307
  172. package/dist/service.js.map +1 -1
  173. package/dist/service.test.js +266 -77
  174. package/dist/service.test.js.map +1 -1
  175. package/dist/test/index.d.ts +33 -0
  176. package/dist/test/index.d.ts.map +1 -0
  177. package/dist/test/index.js +44 -0
  178. package/dist/test/index.js.map +1 -0
  179. package/dist/test-utils/channel-service-fixture.d.ts +2 -1
  180. package/dist/test-utils/channel-service-fixture.d.ts.map +1 -1
  181. package/dist/test-utils/channel-service-fixture.js +31 -11
  182. package/dist/test-utils/channel-service-fixture.js.map +1 -1
  183. package/dist/test-utils/conformance-adapter.d.ts +50 -0
  184. package/dist/test-utils/conformance-adapter.d.ts.map +1 -0
  185. package/dist/test-utils/conformance-adapter.js +206 -0
  186. package/dist/test-utils/conformance-adapter.js.map +1 -0
  187. package/dist/test-utils/fake-service.d.ts +85 -0
  188. package/dist/test-utils/fake-service.d.ts.map +1 -0
  189. package/dist/test-utils/fake-service.js +103 -0
  190. package/dist/test-utils/fake-service.js.map +1 -0
  191. package/dist/test-utils/index.d.ts +2 -0
  192. package/dist/test-utils/index.d.ts.map +1 -1
  193. package/dist/test-utils/index.js +3 -2
  194. package/dist/test-utils/index.js.map +1 -1
  195. package/dist/ws-client.d.ts +157 -18
  196. package/dist/ws-client.d.ts.map +1 -1
  197. package/dist/ws-client.js +432 -94
  198. package/dist/ws-client.js.map +1 -1
  199. package/dist/ws-client.test.d.ts +2 -0
  200. package/dist/ws-client.test.d.ts.map +1 -0
  201. package/dist/ws-client.test.js +672 -0
  202. package/dist/ws-client.test.js.map +1 -0
  203. package/package.json +23 -14
  204. package/LICENSE +0 -21
  205. package/dist/__tests__/service.integration.test.d.ts +0 -2
  206. package/dist/__tests__/service.integration.test.d.ts.map +0 -1
  207. package/dist/__tests__/service.integration.test.js +0 -1087
  208. package/dist/__tests__/service.integration.test.js.map +0 -1
  209. package/dist/cli/commands/delete.d.ts +0 -3
  210. package/dist/cli/commands/delete.d.ts.map +0 -1
  211. package/dist/cli/commands/delete.js +0 -10
  212. package/dist/cli/commands/delete.js.map +0 -1
  213. package/dist/cli/commands/react.d.ts +0 -3
  214. package/dist/cli/commands/react.d.ts.map +0 -1
  215. package/dist/cli/commands/react.js +0 -18
  216. package/dist/cli/commands/react.js.map +0 -1
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Close-metadata extraction for the WebSocket reader fiber.
3
+ *
4
+ * Responsibility: inspect an `Exit.Exit<void, Socket.SocketError>` produced by
5
+ * `Socket.runRaw(...)` and project it onto a caller-facing `CloseInfo`
6
+ * (WebSocket `{code, reason}`). Spec #222 AC 5.4 requires the real close
7
+ * metadata, not hardcoded constants, when upstream surfaces it; OQ-5 names
8
+ * the defaults to synthesize when it does not.
9
+ *
10
+ * Pure module: no I/O, no Refs, no fibers. Called exactly once per socket
11
+ * lifetime from `MoltZapWsClient`'s reader-fiber `Effect.onExit` hook
12
+ * (`ws-client.ts:386-411` today — post-impl the extraction happens at that
13
+ * same point before calling `onDisconnect(close)`).
14
+ *
15
+ * Error channel: `extractCloseInfo` is total — every possible `Exit` maps to
16
+ * a `CloseInfo`. The defaults below are the resolution of OQ-5 (A). No
17
+ * typed error surface on this module.
18
+ */
19
+ import { Cause, Exit } from "effect";
20
+ import * as Socket from "@effect/platform/Socket";
21
+ /**
22
+ * WebSocket close metadata surfaced to `MoltZapWsClientOptions.onDisconnect`
23
+ * (required arg post-migration — see design doc §Deletions, OQ-6) and to
24
+ * the conformance-adapter's `RealClientCloseEvent`. Mirrors the WHATWG
25
+ * WebSocket `CloseEvent` fields restricted to `{code, reason}` — `wasClean`
26
+ * is derivable from `code` and not worth its own field.
27
+ */
28
+ export interface CloseInfo {
29
+ readonly code: number;
30
+ readonly reason: string;
31
+ }
32
+ /**
33
+ * Discriminated shape the reader-fiber exit falls into. Implementation's
34
+ * `extractCloseInfo` pattern-matches this union and returns the `{code,
35
+ * reason}` projection. Named here so downstream review can check that
36
+ * every branch has an assigned close pair.
37
+ *
38
+ * Exhaustiveness (Principle 4): the `Unknown` branch is the residual for
39
+ * any `SocketError` variant @effect/platform adds in the future. The
40
+ * implementation's pattern-match ends in `default: return absurd(kind)`.
41
+ */
42
+ export type CloseKind = {
43
+ /** Graceful `SocketCloseError` — upstream code + reason round-tripped. */
44
+ readonly _tag: "Clean";
45
+ readonly code: number;
46
+ readonly reason: string;
47
+ } | {
48
+ /** `Exit.Success` with no close frame observed — socket ended cleanly. */
49
+ readonly _tag: "EndOfStream";
50
+ } | {
51
+ /** `SocketGenericError` with reason "Open" / "OpenTimeout". */
52
+ readonly _tag: "HandshakeFailure";
53
+ readonly underlying: "Open" | "OpenTimeout";
54
+ } | {
55
+ /** `SocketGenericError` with reason "Read" / "Write" — transport broke. */
56
+ readonly _tag: "TransportFailure";
57
+ readonly underlying: "Read" | "Write";
58
+ } | {
59
+ /** Cause did not match any known `SocketError` shape. */
60
+ readonly _tag: "Unknown";
61
+ };
62
+ /**
63
+ * OQ-5 resolution defaults. Exported so the implementation, tests, and
64
+ * the conformance-adapter's V7 proof share one source of truth.
65
+ */
66
+ export declare const DEFAULT_GRACEFUL_CLOSE: CloseInfo;
67
+ export declare const DEFAULT_ABNORMAL_CLOSE: CloseInfo;
68
+ /**
69
+ * Classify a reader-fiber exit cause into `CloseKind`. Total; the
70
+ * `Unknown` branch is the residual for future `SocketError` variants.
71
+ *
72
+ * Logic:
73
+ * 1. If the cause carries a `SocketCloseError` failure (reason ===
74
+ * "Close"), surface its `code` + `closeReason` as `Clean`.
75
+ * 2. If it carries a `SocketGenericError`, branch on `reason`:
76
+ * - "Open" / "OpenTimeout" → `HandshakeFailure`
77
+ * - "Read" / "Write" → `TransportFailure`
78
+ * 3. Anything else (interrupt, unknown defect, no failure) →
79
+ * `Unknown`. The caller (`extractCloseInfo`) maps this to the
80
+ * OQ-5 abnormal default.
81
+ */
82
+ export declare function classifyCloseCause(cause: Cause.Cause<Socket.SocketError>): CloseKind;
83
+ /**
84
+ * Project an `Exit` onto `CloseInfo`. Composition of `classifyCloseCause`
85
+ * plus the OQ-5 default map:
86
+ *
87
+ * Clean -> { code, reason } from SocketCloseError
88
+ * EndOfStream -> DEFAULT_GRACEFUL_CLOSE
89
+ * HandshakeFailure -> DEFAULT_ABNORMAL_CLOSE
90
+ * TransportFailure -> DEFAULT_ABNORMAL_CLOSE
91
+ * Unknown -> DEFAULT_ABNORMAL_CLOSE
92
+ */
93
+ export declare function extractCloseInfo(exit: Exit.Exit<void, Socket.SocketError>): CloseInfo;
94
+ //# sourceMappingURL=close-info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"close-info.d.ts","sourceRoot":"","sources":["../../src/runtime/close-info.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,MAAM,MAAM,yBAAyB,CAAC;AAElD;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,SAAS,GACjB;IACE,0EAA0E;IAC1E,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GACD;IACE,0EAA0E;IAC1E,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;CAC9B,GACD;IACE,+DAA+D;IAC/D,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,CAAC;CAC7C,GACD;IACE,2EAA2E;IAC3E,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;CACvC,GACD;IACE,yDAAyD;IACzD,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;CAC1B,CAAC;AAEN;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAGpC,CAAC;AACF,eAAO,MAAM,sBAAsB,EAAE,SAGpC,CAAC;AAOF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,GACrC,SAAS,CA6BX;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,GACxC,SAAS,CAiBX"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Close-metadata extraction for the WebSocket reader fiber.
3
+ *
4
+ * Responsibility: inspect an `Exit.Exit<void, Socket.SocketError>` produced by
5
+ * `Socket.runRaw(...)` and project it onto a caller-facing `CloseInfo`
6
+ * (WebSocket `{code, reason}`). Spec #222 AC 5.4 requires the real close
7
+ * metadata, not hardcoded constants, when upstream surfaces it; OQ-5 names
8
+ * the defaults to synthesize when it does not.
9
+ *
10
+ * Pure module: no I/O, no Refs, no fibers. Called exactly once per socket
11
+ * lifetime from `MoltZapWsClient`'s reader-fiber `Effect.onExit` hook
12
+ * (`ws-client.ts:386-411` today — post-impl the extraction happens at that
13
+ * same point before calling `onDisconnect(close)`).
14
+ *
15
+ * Error channel: `extractCloseInfo` is total — every possible `Exit` maps to
16
+ * a `CloseInfo`. The defaults below are the resolution of OQ-5 (A). No
17
+ * typed error surface on this module.
18
+ */
19
+ import { Cause, Exit } from "effect";
20
+ import * as Socket from "@effect/platform/Socket";
21
+ /**
22
+ * OQ-5 resolution defaults. Exported so the implementation, tests, and
23
+ * the conformance-adapter's V7 proof share one source of truth.
24
+ */
25
+ export const DEFAULT_GRACEFUL_CLOSE = {
26
+ code: 1000,
27
+ reason: "normal",
28
+ };
29
+ export const DEFAULT_ABNORMAL_CLOSE = {
30
+ code: 1006,
31
+ reason: "abnormal",
32
+ };
33
+ /** Exhaustiveness sentinel for `CloseKind` switches (Principle 4). */
34
+ function absurd(x) {
35
+ throw new Error(`unreachable CloseKind branch: ${JSON.stringify(x)}`);
36
+ }
37
+ /**
38
+ * Classify a reader-fiber exit cause into `CloseKind`. Total; the
39
+ * `Unknown` branch is the residual for future `SocketError` variants.
40
+ *
41
+ * Logic:
42
+ * 1. If the cause carries a `SocketCloseError` failure (reason ===
43
+ * "Close"), surface its `code` + `closeReason` as `Clean`.
44
+ * 2. If it carries a `SocketGenericError`, branch on `reason`:
45
+ * - "Open" / "OpenTimeout" → `HandshakeFailure`
46
+ * - "Read" / "Write" → `TransportFailure`
47
+ * 3. Anything else (interrupt, unknown defect, no failure) →
48
+ * `Unknown`. The caller (`extractCloseInfo`) maps this to the
49
+ * OQ-5 abnormal default.
50
+ */
51
+ export function classifyCloseCause(cause) {
52
+ // The reader fiber emits at most one SocketError-shaped failure on
53
+ // close; iterate the `Cause.failures` chunk and route on the first
54
+ // match. `Chunk` is iterable, so a `for…of` walk is sufficient.
55
+ for (const failure of Cause.failures(cause)) {
56
+ if (Socket.SocketCloseError.is(failure)) {
57
+ return {
58
+ _tag: "Clean",
59
+ code: failure.code,
60
+ reason: failure.closeReason ?? "",
61
+ };
62
+ }
63
+ if (Socket.isSocketError(failure)) {
64
+ // SocketGenericError — branch on the four documented reasons and
65
+ // let any future variant fall through to `Unknown`.
66
+ const generic = failure;
67
+ switch (generic.reason) {
68
+ case "Open":
69
+ case "OpenTimeout":
70
+ return { _tag: "HandshakeFailure", underlying: generic.reason };
71
+ case "Read":
72
+ case "Write":
73
+ return { _tag: "TransportFailure", underlying: generic.reason };
74
+ default:
75
+ return { _tag: "Unknown" };
76
+ }
77
+ }
78
+ }
79
+ return { _tag: "Unknown" };
80
+ }
81
+ /**
82
+ * Project an `Exit` onto `CloseInfo`. Composition of `classifyCloseCause`
83
+ * plus the OQ-5 default map:
84
+ *
85
+ * Clean -> { code, reason } from SocketCloseError
86
+ * EndOfStream -> DEFAULT_GRACEFUL_CLOSE
87
+ * HandshakeFailure -> DEFAULT_ABNORMAL_CLOSE
88
+ * TransportFailure -> DEFAULT_ABNORMAL_CLOSE
89
+ * Unknown -> DEFAULT_ABNORMAL_CLOSE
90
+ */
91
+ export function extractCloseInfo(exit) {
92
+ if (Exit.isSuccess(exit)) {
93
+ return DEFAULT_GRACEFUL_CLOSE;
94
+ }
95
+ const kind = classifyCloseCause(exit.cause);
96
+ switch (kind._tag) {
97
+ case "Clean":
98
+ return { code: kind.code, reason: kind.reason };
99
+ case "EndOfStream":
100
+ return DEFAULT_GRACEFUL_CLOSE;
101
+ case "HandshakeFailure":
102
+ case "TransportFailure":
103
+ case "Unknown":
104
+ return DEFAULT_ABNORMAL_CLOSE;
105
+ default:
106
+ return absurd(kind);
107
+ }
108
+ }
109
+ //# sourceMappingURL=close-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"close-info.js","sourceRoot":"","sources":["../../src/runtime/close-info.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,MAAM,MAAM,yBAAyB,CAAC;AAkDlD;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAc;IAC/C,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,QAAQ;CACjB,CAAC;AACF,MAAM,CAAC,MAAM,sBAAsB,GAAc;IAC/C,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,UAAU;CACnB,CAAC;AAEF,sEAAsE;AACtE,SAAS,MAAM,CAAC,CAAQ;IACtB,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACxE,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAsC;IAEtC,mEAAmE;IACnE,mEAAmE;IACnE,gEAAgE;IAChE,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5C,IAAI,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,OAAO;gBACL,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,MAAM,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;aAClC,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,iEAAiE;YACjE,oDAAoD;YACpD,MAAM,OAAO,GAAG,OAAoC,CAAC;YACrD,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;gBACvB,KAAK,MAAM,CAAC;gBACZ,KAAK,aAAa;oBAChB,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;gBAClE,KAAK,MAAM,CAAC;gBACZ,KAAK,OAAO;oBACV,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;gBAClE;oBACE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAyC;IAEzC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,sBAAsB,CAAC;IAChC,CAAC;IACD,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,OAAO;YACV,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QAClD,KAAK,aAAa;YAChB,OAAO,sBAAsB,CAAC;QAChC,KAAK,kBAAkB,CAAC;QACxB,KAAK,kBAAkB,CAAC;QACxB,KAAK,SAAS;YACZ,OAAO,sBAAsB,CAAC;QAChC;YACE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=close-info.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"close-info.test.d.ts","sourceRoot":"","sources":["../../src/runtime/close-info.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Unit tests for the close-metadata classifier.
3
+ *
4
+ * Spec #222 §5.4 (V7): the reader-fiber `onExit` path projects an
5
+ * `Exit.Exit<void, Socket.SocketError>` onto a `CloseInfo`. The OQ-5
6
+ * default map fans across five `CloseKind` branches; the live
7
+ * integration tests in `ws-client.test.ts` cover the `Clean` branch
8
+ * via real WebSocket close frames. This file covers the remaining
9
+ * branches by feeding synthetic `Exit` values directly to
10
+ * `extractCloseInfo`, with no transport in play.
11
+ *
12
+ * The five branches map onto two `CloseInfo` constants —
13
+ * `DEFAULT_GRACEFUL_CLOSE` for `EndOfStream` and `DEFAULT_ABNORMAL_CLOSE`
14
+ * for the three failure branches — plus the round-tripped `{code,
15
+ * reason}` from `Clean`. Each branch gets a separate test so a
16
+ * mutation that collapses the map (e.g. always returns
17
+ * `DEFAULT_GRACEFUL_CLOSE`) trips a specific assertion.
18
+ */
19
+ import { describe, expect, it } from "vitest";
20
+ import { Cause, Exit } from "effect";
21
+ import * as Socket from "@effect/platform/Socket";
22
+ import { classifyCloseCause, DEFAULT_ABNORMAL_CLOSE, DEFAULT_GRACEFUL_CLOSE, extractCloseInfo, } from "./close-info.js";
23
+ describe("extractCloseInfo — OQ-5 default map", () => {
24
+ it("EndOfStream (Exit.Success) → DEFAULT_GRACEFUL_CLOSE", () => {
25
+ const exit = Exit.succeed(undefined);
26
+ expect(extractCloseInfo(exit)).toEqual(DEFAULT_GRACEFUL_CLOSE);
27
+ });
28
+ it("Clean (SocketCloseError) → {code, reason} round-tripped", () => {
29
+ const err = new Socket.SocketCloseError({
30
+ reason: "Close",
31
+ code: 1001,
32
+ closeReason: "going away",
33
+ });
34
+ const exit = Exit.fail(err);
35
+ expect(extractCloseInfo(exit)).toEqual({
36
+ code: 1001,
37
+ reason: "going away",
38
+ });
39
+ });
40
+ it("Clean with no closeReason → empty-string reason (no synthesized text)", () => {
41
+ const err = new Socket.SocketCloseError({
42
+ reason: "Close",
43
+ code: 1000,
44
+ });
45
+ const exit = Exit.fail(err);
46
+ expect(extractCloseInfo(exit)).toEqual({ code: 1000, reason: "" });
47
+ });
48
+ it("HandshakeFailure (Open) → DEFAULT_ABNORMAL_CLOSE", () => {
49
+ const err = new Socket.SocketGenericError({
50
+ reason: "Open",
51
+ cause: new Error("boom"),
52
+ });
53
+ const exit = Exit.fail(err);
54
+ expect(extractCloseInfo(exit)).toEqual(DEFAULT_ABNORMAL_CLOSE);
55
+ });
56
+ it("HandshakeFailure (OpenTimeout) → DEFAULT_ABNORMAL_CLOSE", () => {
57
+ const err = new Socket.SocketGenericError({
58
+ reason: "OpenTimeout",
59
+ cause: new Error("timeout"),
60
+ });
61
+ const exit = Exit.fail(err);
62
+ expect(extractCloseInfo(exit)).toEqual(DEFAULT_ABNORMAL_CLOSE);
63
+ });
64
+ it("TransportFailure (Read) → DEFAULT_ABNORMAL_CLOSE", () => {
65
+ const err = new Socket.SocketGenericError({
66
+ reason: "Read",
67
+ cause: new Error("ECONNRESET"),
68
+ });
69
+ const exit = Exit.fail(err);
70
+ expect(extractCloseInfo(exit)).toEqual(DEFAULT_ABNORMAL_CLOSE);
71
+ });
72
+ it("TransportFailure (Write) → DEFAULT_ABNORMAL_CLOSE", () => {
73
+ const err = new Socket.SocketGenericError({
74
+ reason: "Write",
75
+ cause: new Error("EPIPE"),
76
+ });
77
+ const exit = Exit.fail(err);
78
+ expect(extractCloseInfo(exit)).toEqual(DEFAULT_ABNORMAL_CLOSE);
79
+ });
80
+ it("Unknown (interrupt with no SocketError failure) → DEFAULT_ABNORMAL_CLOSE", () => {
81
+ // An interrupted reader fiber emits a Cause with no failure; the
82
+ // classifier must route it to `Unknown`, not collapse to graceful.
83
+ const exit = Exit.failCause(Cause.interrupt(0));
84
+ expect(extractCloseInfo(exit)).toEqual(DEFAULT_ABNORMAL_CLOSE);
85
+ });
86
+ });
87
+ describe("classifyCloseCause", () => {
88
+ it("Clean preserves the upstream code + closeReason", () => {
89
+ const err = new Socket.SocketCloseError({
90
+ reason: "Close",
91
+ code: 4321,
92
+ closeReason: "custom",
93
+ });
94
+ const cause = Cause.fail(err);
95
+ expect(classifyCloseCause(cause)).toEqual({
96
+ _tag: "Clean",
97
+ code: 4321,
98
+ reason: "custom",
99
+ });
100
+ });
101
+ });
102
+ //# sourceMappingURL=close-info.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"close-info.test.js","sourceRoot":"","sources":["../../src/runtime/close-info.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ declare const NotConnectedError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
2
+ readonly _tag: "NotConnectedError";
3
+ } & Readonly<A>;
4
+ /** The socket is not in the OPEN state when an RPC was attempted. */
5
+ export declare class NotConnectedError extends NotConnectedError_base<{
6
+ readonly message: string;
7
+ }> {
8
+ }
9
+ declare const RpcTimeoutError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
10
+ readonly _tag: "RpcTimeoutError";
11
+ } & Readonly<A>;
12
+ /** The RPC exceeded the per-call timeout without a response frame. */
13
+ export declare class RpcTimeoutError extends RpcTimeoutError_base<{
14
+ readonly method: string;
15
+ readonly timeoutMs: number;
16
+ }> {
17
+ }
18
+ declare const RpcServerError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
19
+ readonly _tag: "RpcServerError";
20
+ } & Readonly<A>;
21
+ /** The server returned an `error` response frame. */
22
+ export declare class RpcServerError extends RpcServerError_base<{
23
+ readonly code: number;
24
+ readonly message: string;
25
+ readonly data?: unknown;
26
+ }> {
27
+ }
28
+ declare const MalformedFrameError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
29
+ readonly _tag: "MalformedFrameError";
30
+ } & Readonly<A>;
31
+ /** Inbound frame failed to parse as JSON or did not match the expected shape. */
32
+ export declare class MalformedFrameError extends MalformedFrameError_base<{
33
+ readonly raw: string;
34
+ readonly cause?: unknown;
35
+ }> {
36
+ }
37
+ declare const AgentNotFoundError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
38
+ readonly _tag: "AgentNotFoundError";
39
+ } & Readonly<A>;
40
+ /** A name→agent lookup returned no results. */
41
+ export declare class AgentNotFoundError extends AgentNotFoundError_base<{
42
+ readonly agentName: string;
43
+ }> {
44
+ get message(): string;
45
+ }
46
+ export {};
47
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/runtime/errors.ts"],"names":[],"mappings":";;;AAEA,qEAAqE;AACrE,qBAAa,iBAAkB,SAAQ,uBAAsC;IAC3E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;CAAG;;;;AAEL,sEAAsE;AACtE,qBAAa,eAAgB,SAAQ,qBAAoC;IACvE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;CAAG;;;;AAEL,qDAAqD;AACrD,qBAAa,cAAe,SAAQ,oBAAmC;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;CAAG;;;;AAEL,iFAAiF;AACjF,qBAAa,mBAAoB,SAAQ,yBAEvC;IACA,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;CAAG;;;;AAEL,+CAA+C;AAC/C,qBAAa,kBAAmB,SAAQ,wBAAuC;IAC7E,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAE7B;CACF"}
@@ -0,0 +1,20 @@
1
+ import { Data } from "effect";
2
+ /** The socket is not in the OPEN state when an RPC was attempted. */
3
+ export class NotConnectedError extends Data.TaggedError("NotConnectedError") {
4
+ }
5
+ /** The RPC exceeded the per-call timeout without a response frame. */
6
+ export class RpcTimeoutError extends Data.TaggedError("RpcTimeoutError") {
7
+ }
8
+ /** The server returned an `error` response frame. */
9
+ export class RpcServerError extends Data.TaggedError("RpcServerError") {
10
+ }
11
+ /** Inbound frame failed to parse as JSON or did not match the expected shape. */
12
+ export class MalformedFrameError extends Data.TaggedError("MalformedFrameError") {
13
+ }
14
+ /** A name→agent lookup returned no results. */
15
+ export class AgentNotFoundError extends Data.TaggedError("AgentNotFoundError") {
16
+ get message() {
17
+ return `Agent not found: ${this.agentName}`;
18
+ }
19
+ }
20
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/runtime/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,qEAAqE;AACrE,MAAM,OAAO,iBAAkB,SAAQ,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAEzE;CAAG;AAEL,sEAAsE;AACtE,MAAM,OAAO,eAAgB,SAAQ,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAGrE;CAAG;AAEL,qDAAqD;AACrD,MAAM,OAAO,cAAe,SAAQ,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAInE;CAAG;AAEL,iFAAiF;AACjF,MAAM,OAAO,mBAAoB,SAAQ,IAAI,CAAC,WAAW,CACvD,qBAAqB,CAIrB;CAAG;AAEL,+CAA+C;AAC/C,MAAM,OAAO,kBAAmB,SAAQ,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAE3E;IACA,IAAa,OAAO;QAClB,OAAO,oBAAoB,IAAI,CAAC,SAAS,EAAE,CAAC;IAC9C,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=errors.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.test.d.ts","sourceRoot":"","sources":["../../src/runtime/errors.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,66 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { AgentNotFoundError, MalformedFrameError, NotConnectedError, RpcServerError, RpcTimeoutError, } from "./errors.js";
3
+ describe("AgentNotFoundError", () => {
4
+ it("carries agentName and derives a `_tag` + `message`", () => {
5
+ const err = new AgentNotFoundError({ agentName: "foo" });
6
+ expect(err._tag).toBe("AgentNotFoundError");
7
+ expect(err.agentName).toBe("foo");
8
+ expect(err.message).toBe("Agent not found: foo");
9
+ });
10
+ it("tag discriminates at the type level against sibling tagged errors", () => {
11
+ const err = new AgentNotFoundError({
12
+ agentName: "bar",
13
+ });
14
+ // Purely a runtime sanity check that the switch on _tag narrows.
15
+ // #ignore-sloppy-code-next-line[tag-discriminant]: this test's entire purpose is to verify the _tag discriminant narrows correctly
16
+ if (err._tag === "AgentNotFoundError") {
17
+ expect(err.agentName).toBe("bar");
18
+ }
19
+ else {
20
+ throw new Error("expected AgentNotFoundError");
21
+ }
22
+ });
23
+ });
24
+ describe("NotConnectedError", () => {
25
+ it("carries message field and `_tag === 'NotConnectedError'`", () => {
26
+ const err = new NotConnectedError({ message: "socket closed" });
27
+ expect(err._tag).toBe("NotConnectedError");
28
+ expect(err.message).toBe("socket closed");
29
+ });
30
+ });
31
+ describe("RpcTimeoutError", () => {
32
+ it("carries method + timeoutMs and `_tag === 'RpcTimeoutError'`", () => {
33
+ const err = new RpcTimeoutError({
34
+ method: "messages/send",
35
+ timeoutMs: 30_000,
36
+ });
37
+ expect(err._tag).toBe("RpcTimeoutError");
38
+ expect(err.method).toBe("messages/send");
39
+ expect(err.timeoutMs).toBe(30_000);
40
+ });
41
+ });
42
+ describe("RpcServerError", () => {
43
+ it("carries code, message, and optional data", () => {
44
+ const err = new RpcServerError({
45
+ code: -32601,
46
+ message: "method not found",
47
+ data: { hint: "check spelling" },
48
+ });
49
+ expect(err._tag).toBe("RpcServerError");
50
+ expect(err.code).toBe(-32601);
51
+ expect(err.message).toBe("method not found");
52
+ expect(err.data).toEqual({ hint: "check spelling" });
53
+ });
54
+ it("treats `data` as optional (undefined when omitted)", () => {
55
+ const err = new RpcServerError({ code: -32603, message: "oops" });
56
+ expect(err.data).toBeUndefined();
57
+ });
58
+ });
59
+ describe("MalformedFrameError", () => {
60
+ it("carries the raw payload and `_tag === 'MalformedFrameError'`", () => {
61
+ const err = new MalformedFrameError({ raw: "not json" });
62
+ expect(err._tag).toBe("MalformedFrameError");
63
+ expect(err.raw).toBe("not json");
64
+ });
65
+ });
66
+ //# sourceMappingURL=errors.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../src/runtime/errors.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,GAAG,GAAG,IAAI,kBAAkB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,GAAG,GAA2C,IAAI,kBAAkB,CAAC;YACzE,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;QACH,iEAAiE;QACjE,mIAAmI;QACnI,IAAI,GAAG,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;YACtC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,GAAG,GAAG,IAAI,iBAAiB,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC3C,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC;YAC9B,MAAM,EAAE,eAAe;YACvB,SAAS,EAAE,MAAM;SAClB,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,GAAG,GAAG,IAAI,cAAc,CAAC;YAC7B,IAAI,EAAE,CAAC,KAAK;YACZ,OAAO,EAAE,kBAAkB;YAC3B,IAAI,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE;SACjC,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC7C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,GAAG,GAAG,IAAI,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAClE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,GAAG,GAAG,IAAI,mBAAmB,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;QACzD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC7C,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { Effect } from "effect";
2
+ import { type EventFrame, type ResponseFrame } from "@moltzap/protocol";
3
+ import { MalformedFrameError } from "./errors.js";
4
+ /** Decoded response frame — narrowed from the protocol's `ResponseFrame`. */
5
+ export interface DecodedResponse {
6
+ readonly _tag: "Response";
7
+ readonly id: string;
8
+ readonly result?: unknown;
9
+ readonly error?: ResponseFrame["error"];
10
+ }
11
+ /** Decoded event frame — forwarded to the service's onEvent callback. */
12
+ export interface DecodedEvent {
13
+ readonly _tag: "Event";
14
+ readonly frame: EventFrame;
15
+ }
16
+ export type DecodedFrame = DecodedResponse | DecodedEvent;
17
+ export declare const splitRawFrames: (raw: string) => Effect.Effect<ReadonlyArray<string>, MalformedFrameError>;
18
+ /**
19
+ * Central typed inbound frame decoder. JSON.parse + shape validation via the
20
+ * protocol's pre-compiled AJV validators. The raw socket chunk may contain
21
+ * padding bytes or more than one JSON object; split and validate each object
22
+ * before handing frames to the client runtime.
23
+ */
24
+ export declare const decodeFrames: (raw: string) => Effect.Effect<ReadonlyArray<DecodedFrame>, MalformedFrameError>;
25
+ //# sourceMappingURL=frame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../../src/runtime/frame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,aAAa,EACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,6EAA6E;AAC7E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;CACzC;AAED,yEAAyE;AACzE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AAED,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG,YAAY,CAAC;AAyB1D,eAAO,MAAM,cAAc,GACzB,KAAK,MAAM,KACV,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,mBAAmB,CAsEvD,CAAC;AAEL;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GACvB,KAAK,MAAM,KACV,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,mBAAmB,CAuB7D,CAAC"}
@@ -0,0 +1,106 @@
1
+ import { Effect } from "effect";
2
+ import { validators, } from "@moltzap/protocol";
3
+ import { MalformedFrameError } from "./errors.js";
4
+ const isFramePadding = (char) => char === "\u0000" || char === "\ufeff" || /\s/u.test(char);
5
+ const toDecodedFrame = (parsed) => {
6
+ if (validators.responseFrame(parsed)) {
7
+ const frame = parsed;
8
+ return {
9
+ _tag: "Response",
10
+ id: frame.id,
11
+ result: frame.result,
12
+ error: frame.error,
13
+ };
14
+ }
15
+ if (validators.eventFrame(parsed)) {
16
+ return { _tag: "Event", frame: parsed };
17
+ }
18
+ return new MalformedFrameError({ raw: JSON.stringify(parsed) });
19
+ };
20
+ export const splitRawFrames = (raw) => Effect.try({
21
+ try: () => {
22
+ const frames = [];
23
+ let start = -1;
24
+ let depth = 0;
25
+ let inString = false;
26
+ let escaped = false;
27
+ for (let index = 0; index < raw.length; index += 1) {
28
+ const char = raw[index];
29
+ if (start === -1) {
30
+ if (isFramePadding(char)) {
31
+ continue;
32
+ }
33
+ if (char !== "{") {
34
+ throw new MalformedFrameError({ raw });
35
+ }
36
+ start = index;
37
+ depth = 1;
38
+ continue;
39
+ }
40
+ if (inString) {
41
+ if (escaped) {
42
+ escaped = false;
43
+ continue;
44
+ }
45
+ if (char === "\\") {
46
+ escaped = true;
47
+ continue;
48
+ }
49
+ if (char === '"') {
50
+ inString = false;
51
+ }
52
+ continue;
53
+ }
54
+ if (char === '"') {
55
+ inString = true;
56
+ continue;
57
+ }
58
+ if (char === "{") {
59
+ depth += 1;
60
+ continue;
61
+ }
62
+ if (char !== "}") {
63
+ continue;
64
+ }
65
+ depth -= 1;
66
+ if (depth !== 0) {
67
+ continue;
68
+ }
69
+ frames.push(raw.slice(start, index + 1));
70
+ start = -1;
71
+ }
72
+ if (start !== -1 || frames.length === 0) {
73
+ throw new MalformedFrameError({ raw });
74
+ }
75
+ return frames;
76
+ },
77
+ catch: (cause) => cause instanceof MalformedFrameError
78
+ ? cause
79
+ : new MalformedFrameError({ raw, cause }),
80
+ });
81
+ /**
82
+ * Central typed inbound frame decoder. JSON.parse + shape validation via the
83
+ * protocol's pre-compiled AJV validators. The raw socket chunk may contain
84
+ * padding bytes or more than one JSON object; split and validate each object
85
+ * before handing frames to the client runtime.
86
+ */
87
+ export const decodeFrames = (raw) => Effect.gen(function* () {
88
+ const frameTexts = yield* splitRawFrames(raw);
89
+ const decodedFrames = [];
90
+ for (const frameText of frameTexts) {
91
+ let parsed;
92
+ try {
93
+ parsed = JSON.parse(frameText);
94
+ }
95
+ catch (err) {
96
+ return yield* Effect.fail(new MalformedFrameError({ raw: frameText, cause: err }));
97
+ }
98
+ const decoded = toDecodedFrame(parsed);
99
+ if (decoded instanceof MalformedFrameError) {
100
+ return yield* Effect.fail(new MalformedFrameError({ raw: frameText }));
101
+ }
102
+ decodedFrames.push(decoded);
103
+ }
104
+ return decodedFrames;
105
+ });
106
+ //# sourceMappingURL=frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame.js","sourceRoot":"","sources":["../../src/runtime/frame.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=frame.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame.test.d.ts","sourceRoot":"","sources":["../../src/runtime/frame.test.ts"],"names":[],"mappings":""}