@moltzap/client 2026.529.0 → 2026.717.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/agent-client.d.ts +2 -65
- package/dist/agent-client.d.ts.map +1 -1
- package/dist/agent-client.js +1 -286
- package/dist/agent-client.js.map +1 -1
- package/dist/app-client.d.ts +3 -0
- package/dist/app-client.d.ts.map +1 -0
- package/dist/app-client.js +2 -0
- package/dist/app-client.js.map +1 -0
- package/dist/auth.d.ts +6 -15
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +12 -16
- package/dist/auth.js.map +1 -1
- package/dist/channel-base/format-cross-conv.d.ts +10 -15
- package/dist/channel-base/format-cross-conv.d.ts.map +1 -1
- package/dist/channel-base/format-cross-conv.js +10 -15
- package/dist/channel-base/format-cross-conv.js.map +1 -1
- package/dist/channel-base/format-group-block.d.ts +8 -10
- package/dist/channel-base/format-group-block.d.ts.map +1 -1
- package/dist/channel-base/format-group-block.js +8 -10
- package/dist/channel-base/format-group-block.js.map +1 -1
- package/dist/channel-base/index.d.ts +3 -62
- package/dist/channel-base/index.d.ts.map +1 -1
- package/dist/channel-base/index.js +2 -65
- package/dist/channel-base/index.js.map +1 -1
- package/dist/channel-base/lease-guard.d.ts +0 -2
- package/dist/channel-base/lease-guard.d.ts.map +1 -1
- package/dist/channel-base/lease-guard.js +0 -2
- package/dist/channel-base/lease-guard.js.map +1 -1
- package/dist/channel-base/lease-store.d.ts +2 -3
- package/dist/channel-base/lease-store.d.ts.map +1 -1
- package/dist/channel-base/lease-store.js +2 -3
- package/dist/channel-base/lease-store.js.map +1 -1
- package/dist/channel-base/lease.d.ts +25 -31
- package/dist/channel-base/lease.d.ts.map +1 -1
- package/dist/channel-base/lease.js +29 -45
- package/dist/channel-base/lease.js.map +1 -1
- package/dist/channel-core-enrichment.d.ts +1 -1
- package/dist/channel-core-enrichment.d.ts.map +1 -1
- package/dist/channel-core-test-support.d.ts +17 -11
- package/dist/channel-core-test-support.d.ts.map +1 -1
- package/dist/channel-core-test-support.js +5 -6
- package/dist/channel-core-test-support.js.map +1 -1
- package/dist/channel-core.d.ts +24 -29
- package/dist/channel-core.d.ts.map +1 -1
- package/dist/channel-core.js +18 -42
- package/dist/channel-core.js.map +1 -1
- package/dist/cli/commands/agents.d.ts +3 -6
- package/dist/cli/commands/agents.d.ts.map +1 -1
- package/dist/cli/commands/agents.js +14 -50
- package/dist/cli/commands/agents.js.map +1 -1
- package/dist/cli/commands/contacts.d.ts +5 -6
- package/dist/cli/commands/contacts.d.ts.map +1 -1
- package/dist/cli/commands/contacts.js +15 -43
- package/dist/cli/commands/contacts.js.map +1 -1
- package/dist/cli/commands/conversations.d.ts +8 -18
- package/dist/cli/commands/conversations.d.ts.map +1 -1
- package/dist/cli/commands/conversations.js +14 -65
- package/dist/cli/commands/conversations.js.map +1 -1
- package/dist/cli/commands/messages.d.ts +13 -35
- package/dist/cli/commands/messages.d.ts.map +1 -1
- package/dist/cli/commands/messages.js +21 -46
- package/dist/cli/commands/messages.js.map +1 -1
- package/dist/cli/commands/register.d.ts +10 -12
- package/dist/cli/commands/register.d.ts.map +1 -1
- package/dist/cli/commands/register.js +47 -133
- package/dist/cli/commands/register.js.map +1 -1
- package/dist/cli/commands/send.d.ts +23 -36
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +25 -72
- package/dist/cli/commands/send.js.map +1 -1
- package/dist/cli/commands/start.d.ts +10 -124
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +28 -510
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/status.d.ts +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +8 -9
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/test-transport.d.ts +12 -5
- package/dist/cli/commands/test-transport.d.ts.map +1 -1
- package/dist/cli/commands/test-transport.js +15 -15
- package/dist/cli/commands/test-transport.js.map +1 -1
- package/dist/cli/index.js +13 -40
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/output.d.ts +4 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +9 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/socket-client.d.ts +7 -14
- package/dist/cli/socket-client.d.ts.map +1 -1
- package/dist/cli/socket-client.js +15 -38
- package/dist/cli/socket-client.js.map +1 -1
- package/dist/cli/transport.d.ts +53 -116
- package/dist/cli/transport.d.ts.map +1 -1
- package/dist/cli/transport.js +45 -295
- package/dist/cli/transport.js.map +1 -1
- package/dist/config.d.ts +24 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +35 -0
- package/dist/config.js.map +1 -0
- package/dist/config.test-utils.d.ts +13 -0
- package/dist/config.test-utils.d.ts.map +1 -0
- package/dist/config.test-utils.js +46 -0
- package/dist/config.test-utils.js.map +1 -0
- package/dist/index.d.ts +3 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -12
- package/dist/index.js.map +1 -1
- package/dist/local-daemon-rpc.d.ts +259 -8
- package/dist/local-daemon-rpc.d.ts.map +1 -1
- package/dist/local-daemon-rpc.js +189 -12
- package/dist/local-daemon-rpc.js.map +1 -1
- package/dist/{runtime/local-history.d.ts → local-history.d.ts} +16 -21
- package/dist/local-history.d.ts.map +1 -0
- package/dist/{runtime/local-history.js → local-history.js} +16 -21
- package/dist/local-history.js.map +1 -0
- package/dist/local-paths.d.ts +0 -2
- package/dist/local-paths.d.ts.map +1 -1
- package/dist/local-paths.js +0 -4
- package/dist/local-paths.js.map +1 -1
- package/dist/local-socket-server.d.ts +22 -0
- package/dist/local-socket-server.d.ts.map +1 -0
- package/dist/{runtime/local-socket-server.js → local-socket-server.js} +4 -9
- package/dist/local-socket-server.js.map +1 -0
- package/dist/message-rendering.d.ts +3 -0
- package/dist/message-rendering.d.ts.map +1 -0
- package/dist/message-rendering.js +7 -0
- package/dist/message-rendering.js.map +1 -0
- package/dist/notification/__tests__/{snapshot-semantics.types-check.d.ts → subscribe-signatures.types-check.d.ts} +1 -1
- package/dist/notification/__tests__/subscribe-signatures.types-check.d.ts.map +1 -0
- package/dist/notification/__tests__/subscribe-signatures.types-check.js +55 -0
- package/dist/notification/__tests__/subscribe-signatures.types-check.js.map +1 -0
- package/dist/notification/errors.d.ts +18 -6
- package/dist/notification/errors.d.ts.map +1 -1
- package/dist/notification/errors.js +13 -15
- package/dist/notification/errors.js.map +1 -1
- package/dist/notification/index.d.ts +5 -0
- package/dist/notification/index.d.ts.map +1 -0
- package/dist/notification/index.js +5 -0
- package/dist/notification/index.js.map +1 -0
- package/dist/notification/stream.d.ts +33 -49
- package/dist/notification/stream.d.ts.map +1 -1
- package/dist/notification/stream.js +33 -76
- package/dist/notification/stream.js.map +1 -1
- package/dist/pagination.d.ts +20 -10
- package/dist/pagination.d.ts.map +1 -1
- package/dist/pagination.js +8 -9
- package/dist/pagination.js.map +1 -1
- package/dist/profile.d.ts +92 -0
- package/dist/profile.d.ts.map +1 -0
- package/dist/profile.js +149 -0
- package/dist/profile.js.map +1 -0
- package/dist/refs.d.ts.map +1 -0
- package/dist/refs.js.map +1 -0
- package/dist/service-archive-purge.d.ts +2 -1
- package/dist/service-archive-purge.d.ts.map +1 -1
- package/dist/service-archive-purge.js.map +1 -1
- package/dist/{runtime/service-helpers.d.ts → service-helpers.d.ts} +5 -11
- package/dist/service-helpers.d.ts.map +1 -0
- package/dist/{runtime/service-helpers.js → service-helpers.js} +2 -9
- package/dist/service-helpers.js.map +1 -0
- package/dist/service-local-daemon.d.ts +22 -0
- package/dist/service-local-daemon.d.ts.map +1 -0
- package/dist/service-local-daemon.js +185 -0
- package/dist/service-local-daemon.js.map +1 -0
- package/dist/service.d.ts +65 -57
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +205 -156
- package/dist/service.js.map +1 -1
- package/dist/test-utils/channel-service-fixture.d.ts +3 -2
- package/dist/test-utils/channel-service-fixture.d.ts.map +1 -1
- package/dist/test-utils/channel-service-fixture.js.map +1 -1
- package/dist/test-utils/fake-service.d.ts +26 -18
- package/dist/test-utils/fake-service.d.ts.map +1 -1
- package/dist/test-utils/fake-service.js +28 -42
- package/dist/test-utils/fake-service.js.map +1 -1
- package/dist/test-utils/ids.d.ts +3 -1
- package/dist/test-utils/ids.d.ts.map +1 -1
- package/dist/test-utils/ids.js.map +1 -1
- package/dist/test-utils/index.d.ts +9 -2
- package/dist/test-utils/index.d.ts.map +1 -1
- package/dist/test-utils/index.js +8 -1
- package/dist/test-utils/index.js.map +1 -1
- package/dist/test-utils/standalone-provisioning.d.ts +17 -0
- package/dist/test-utils/standalone-provisioning.d.ts.map +1 -0
- package/dist/test-utils/standalone-provisioning.js +14 -0
- package/dist/test-utils/standalone-provisioning.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +39 -17
- package/dist/auth.test.d.ts +0 -2
- package/dist/auth.test.d.ts.map +0 -1
- package/dist/auth.test.js +0 -121
- package/dist/auth.test.js.map +0 -1
- package/dist/channel-core-context.test.d.ts +0 -2
- package/dist/channel-core-context.test.d.ts.map +0 -1
- package/dist/channel-core-context.test.js +0 -342
- package/dist/channel-core-context.test.js.map +0 -1
- package/dist/channel-core-dispatch.test.d.ts +0 -2
- package/dist/channel-core-dispatch.test.d.ts.map +0 -1
- package/dist/channel-core-dispatch.test.js +0 -557
- package/dist/channel-core-dispatch.test.js.map +0 -1
- package/dist/channel-core.test.d.ts +0 -2
- package/dist/channel-core.test.d.ts.map +0 -1
- package/dist/channel-core.test.js +0 -232
- package/dist/channel-core.test.js.map +0 -1
- package/dist/cli/__tests__/cli-multi-agent.int.test.d.ts +0 -2
- package/dist/cli/__tests__/cli-multi-agent.int.test.d.ts.map +0 -1
- package/dist/cli/__tests__/cli-multi-agent.int.test.js +0 -132
- package/dist/cli/__tests__/cli-multi-agent.int.test.js.map +0 -1
- package/dist/cli/commands/invite.d.ts +0 -7
- package/dist/cli/commands/invite.d.ts.map +0 -1
- package/dist/cli/commands/invite.js +0 -11
- package/dist/cli/commands/invite.js.map +0 -1
- package/dist/cli/commands/messages.test.d.ts +0 -2
- package/dist/cli/commands/messages.test.d.ts.map +0 -1
- package/dist/cli/commands/messages.test.js +0 -99
- package/dist/cli/commands/messages.test.js.map +0 -1
- package/dist/cli/commands/ping.d.ts +0 -7
- package/dist/cli/commands/ping.d.ts.map +0 -1
- package/dist/cli/commands/ping.js +0 -37
- package/dist/cli/commands/ping.js.map +0 -1
- package/dist/cli/commands/register.test.d.ts +0 -2
- package/dist/cli/commands/register.test.d.ts.map +0 -1
- package/dist/cli/commands/register.test.js +0 -91
- package/dist/cli/commands/register.test.js.map +0 -1
- package/dist/cli/commands/send.test.d.ts +0 -2
- package/dist/cli/commands/send.test.d.ts.map +0 -1
- package/dist/cli/commands/send.test.js +0 -59
- package/dist/cli/commands/send.test.js.map +0 -1
- package/dist/cli/commands/start.test.d.ts +0 -2
- package/dist/cli/commands/start.test.d.ts.map +0 -1
- package/dist/cli/commands/start.test.js +0 -624
- package/dist/cli/commands/start.test.js.map +0 -1
- package/dist/cli/commands/whoami.d.ts +0 -8
- package/dist/cli/commands/whoami.d.ts.map +0 -1
- package/dist/cli/commands/whoami.js +0 -28
- package/dist/cli/commands/whoami.js.map +0 -1
- package/dist/cli/config.d.ts +0 -66
- package/dist/cli/config.d.ts.map +0 -1
- package/dist/cli/config.js +0 -148
- package/dist/cli/config.js.map +0 -1
- package/dist/cli/config.test.d.ts +0 -2
- package/dist/cli/config.test.d.ts.map +0 -1
- package/dist/cli/config.test.js +0 -89
- package/dist/cli/config.test.js.map +0 -1
- package/dist/cli/http-client.d.ts +0 -17
- package/dist/cli/http-client.d.ts.map +0 -1
- package/dist/cli/http-client.js +0 -38
- package/dist/cli/http-client.js.map +0 -1
- package/dist/cli/profile.d.ts +0 -126
- package/dist/cli/profile.d.ts.map +0 -1
- package/dist/cli/profile.js +0 -231
- package/dist/cli/profile.js.map +0 -1
- package/dist/cli/profile.test.d.ts +0 -2
- package/dist/cli/profile.test.d.ts.map +0 -1
- package/dist/cli/profile.test.js +0 -369
- package/dist/cli/profile.test.js.map +0 -1
- package/dist/cli/transport.test.d.ts +0 -2
- package/dist/cli/transport.test.d.ts.map +0 -1
- package/dist/cli/transport.test.js +0 -312
- package/dist/cli/transport.test.js.map +0 -1
- package/dist/notification/__tests__/filter-equivalence.test.d.ts +0 -2
- package/dist/notification/__tests__/filter-equivalence.test.d.ts.map +0 -1
- package/dist/notification/__tests__/filter-equivalence.test.js +0 -123
- package/dist/notification/__tests__/filter-equivalence.test.js.map +0 -1
- package/dist/notification/__tests__/snapshot-semantics.test.d.ts +0 -2
- package/dist/notification/__tests__/snapshot-semantics.test.d.ts.map +0 -1
- package/dist/notification/__tests__/snapshot-semantics.test.js +0 -261
- package/dist/notification/__tests__/snapshot-semantics.test.js.map +0 -1
- package/dist/notification/__tests__/snapshot-semantics.types-check.d.ts.map +0 -1
- package/dist/notification/__tests__/snapshot-semantics.types-check.js +0 -62
- package/dist/notification/__tests__/snapshot-semantics.types-check.js.map +0 -1
- package/dist/pagination.test.d.ts +0 -2
- package/dist/pagination.test.d.ts.map +0 -1
- package/dist/pagination.test.js +0 -72
- package/dist/pagination.test.js.map +0 -1
- package/dist/runtime/close-info.d.ts +0 -84
- package/dist/runtime/close-info.d.ts.map +0 -1
- package/dist/runtime/close-info.js +0 -102
- package/dist/runtime/close-info.js.map +0 -1
- package/dist/runtime/close-info.test.d.ts +0 -2
- package/dist/runtime/close-info.test.d.ts.map +0 -1
- package/dist/runtime/close-info.test.js +0 -109
- package/dist/runtime/close-info.test.js.map +0 -1
- package/dist/runtime/errors.d.ts +0 -11
- package/dist/runtime/errors.d.ts.map +0 -1
- package/dist/runtime/errors.js +0 -41
- package/dist/runtime/errors.js.map +0 -1
- package/dist/runtime/errors.test.d.ts +0 -2
- package/dist/runtime/errors.test.d.ts.map +0 -1
- package/dist/runtime/errors.test.js +0 -79
- package/dist/runtime/errors.test.js.map +0 -1
- package/dist/runtime/frame.d.ts +0 -8
- package/dist/runtime/frame.d.ts.map +0 -1
- package/dist/runtime/frame.js +0 -12
- package/dist/runtime/frame.js.map +0 -1
- package/dist/runtime/frame.test.d.ts +0 -2
- package/dist/runtime/frame.test.d.ts.map +0 -1
- package/dist/runtime/frame.test.js +0 -59
- package/dist/runtime/frame.test.js.map +0 -1
- package/dist/runtime/index.d.ts +0 -10
- package/dist/runtime/index.d.ts.map +0 -1
- package/dist/runtime/index.js +0 -9
- package/dist/runtime/index.js.map +0 -1
- package/dist/runtime/local-history.d.ts.map +0 -1
- package/dist/runtime/local-history.js.map +0 -1
- package/dist/runtime/local-service-commands.d.ts +0 -26
- package/dist/runtime/local-service-commands.d.ts.map +0 -1
- package/dist/runtime/local-service-commands.js +0 -29
- package/dist/runtime/local-service-commands.js.map +0 -1
- package/dist/runtime/local-socket-server.d.ts +0 -20
- package/dist/runtime/local-socket-server.d.ts.map +0 -1
- package/dist/runtime/local-socket-server.js.map +0 -1
- package/dist/runtime/refs.d.ts.map +0 -1
- package/dist/runtime/refs.js.map +0 -1
- package/dist/runtime/runtime.test.d.ts +0 -2
- package/dist/runtime/runtime.test.d.ts.map +0 -1
- package/dist/runtime/runtime.test.js +0 -37
- package/dist/runtime/runtime.test.js.map +0 -1
- package/dist/runtime/service-helpers.d.ts.map +0 -1
- package/dist/runtime/service-helpers.js.map +0 -1
- package/dist/runtime/service-teardown.d.ts +0 -5
- package/dist/runtime/service-teardown.d.ts.map +0 -1
- package/dist/runtime/service-teardown.js +0 -36
- package/dist/runtime/service-teardown.js.map +0 -1
- package/dist/runtime/service-teardown.test.d.ts +0 -2
- package/dist/runtime/service-teardown.test.d.ts.map +0 -1
- package/dist/runtime/service-teardown.test.js +0 -80
- package/dist/runtime/service-teardown.test.js.map +0 -1
- package/dist/runtime/subscribers.d.ts +0 -152
- package/dist/runtime/subscribers.d.ts.map +0 -1
- package/dist/runtime/subscribers.js +0 -222
- package/dist/runtime/subscribers.js.map +0 -1
- package/dist/service-socket-path.test.d.ts +0 -2
- package/dist/service-socket-path.test.d.ts.map +0 -1
- package/dist/service-socket-path.test.js +0 -87
- package/dist/service-socket-path.test.js.map +0 -1
- package/dist/service.test.d.ts +0 -2
- package/dist/service.test.d.ts.map +0 -1
- package/dist/service.test.js +0 -796
- package/dist/service.test.js.map +0 -1
- package/dist/test/index.d.ts +0 -47
- package/dist/test/index.d.ts.map +0 -1
- package/dist/test/index.js +0 -39
- package/dist/test/index.js.map +0 -1
- package/dist/test-utils/conformance-adapter.d.ts +0 -40
- package/dist/test-utils/conformance-adapter.d.ts.map +0 -1
- package/dist/test-utils/conformance-adapter.js +0 -250
- package/dist/test-utils/conformance-adapter.js.map +0 -1
- package/dist/tm-client-test-support.d.ts +0 -184
- package/dist/tm-client-test-support.d.ts.map +0 -1
- package/dist/tm-client-test-support.js +0 -466
- package/dist/tm-client-test-support.js.map +0 -1
- package/dist/tm-client.d.ts +0 -269
- package/dist/tm-client.d.ts.map +0 -1
- package/dist/tm-client.js +0 -518
- package/dist/tm-client.js.map +0 -1
- package/dist/tm-client.test.d.ts +0 -2
- package/dist/tm-client.test.d.ts.map +0 -1
- package/dist/tm-client.test.js +0 -490
- package/dist/tm-client.test.js.map +0 -1
- /package/dist/{runtime/refs.d.ts → refs.d.ts} +0 -0
- /package/dist/{runtime/refs.js → refs.js} +0 -0
package/dist/tm-client.test.js
DELETED
|
@@ -1,490 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for `tm-client.ts` against a real in-process `@effect/platform` WebSocket server.
|
|
3
|
-
*/
|
|
4
|
-
import { afterEach, beforeEach, expect, it } from "vitest";
|
|
5
|
-
import { Cause, Effect, Exit, Option } from "effect";
|
|
6
|
-
import { MessagesAuthorize, TaskCreate } from "@moltzap/protocol";
|
|
7
|
-
import { AgentsLookupByName, TaskList, DispatchAuthorize, Duration, Fiber, ForbiddenError, MessageReceivedNotificationDefinition, MessagesSend, RpcTimeoutError, TestClock, closeClient, closeWaitSocketOutput, connectClient, connectClientForServer, dispatchRequestParams, effectTest, expectEffectFailure, findClosedLocalPort, findResponseRaw, grantDispatchAuthorizeHandlers, makeClient, messageReceivedFrame, realSleep, sendMalformedFrameBurst, sendMalformedFramesAndResponse, sendPaddedNotificationAndResponse, sendRpcEffect, setRef, scopedEffectTest, startAgentsLookupByNameServer, startDispatchAuthorizeServer, startHandshakingServer, startReconnectServer, startTestServer, validateResponseFrame, waitFor, waitForErrorResponse, waitForResponseRaw, withTestServer, CLIENT_DRAIN_COUNT, CLOSE_INFO_WAIT_MS, CLOSE_PROPAGATION_TIMEOUT_MS, CONNECT_FAILURE_MAX_MS, DOMAIN_REJECTED_MESSAGE, DOMAIN_REJECTED_REASON, GRANT_DECISION, HANDLER_REJECTION_CODE, JSON_RPC_VERSION, LOCALHOST_HOST, MALFORMED_FRAME_FLUSH_MS, NORMAL_CLOSE_CODE, NORMAL_CLOSE_REASON, POST_TIMEOUT_SETTLE_MS, REALTIME_POLL_TIMEOUT_MS, RECONNECT_AGENT_ID, REFUSED_CONNECT_MAX_MS, REFUSED_CONNECT_TEST_TIMEOUT_MS, RPC_TIMEOUT_MS, SESSION_A, SESSION_B, SERVER_ERROR_CLOSE_CODE, SERVER_ERROR_REASON, SERVER_ERROR_REQUEST_ID, SERVER_TEST_REQUEST_ID, STALE_PORT_TEST_TIMEOUT_MS, TEST_AGENT_ID, TEST_CONVERSATION_ID, TEST_TASK_ID, } from "./tm-client-test-support.js";
|
|
8
|
-
import { shouldLogMalformedFrame } from "./tm-client.js";
|
|
9
|
-
// ── Tests ──────────────────────────────────────────────────────────────
|
|
10
|
-
beforeEach(() => {
|
|
11
|
-
// Nothing global to reset; each test owns its server scope.
|
|
12
|
-
});
|
|
13
|
-
afterEach(() => {
|
|
14
|
-
// Nothing to clean up — test scopes close their own servers.
|
|
15
|
-
});
|
|
16
|
-
it("encodes the notification fixture with the protocol method name", () => {
|
|
17
|
-
expect(messageReceivedFrame().method).toBe(MessageReceivedNotificationDefinition.name);
|
|
18
|
-
});
|
|
19
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
20
|
-
// §5.1 — connect() must not hang on pre-open close/error
|
|
21
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
22
|
-
effectTest("rejects immediately when the server closes the connection before handshake", () => withTestServer(Effect.gen(function* () {
|
|
23
|
-
// Handler closes on the very first inbound frame — i.e. before the
|
|
24
|
-
// client sees any network/connect response.
|
|
25
|
-
const server = yield* startTestServer((conn) => conn.close(NORMAL_CLOSE_CODE).pipe(Effect.ignore));
|
|
26
|
-
const client = makeClient(server.url);
|
|
27
|
-
const t0 = Date.now();
|
|
28
|
-
yield* expectEffectFailure(connectClient(client), /WebSocket not connected/);
|
|
29
|
-
const elapsed = Date.now() - t0;
|
|
30
|
-
expect(elapsed).toBeLessThan(CONNECT_FAILURE_MAX_MS);
|
|
31
|
-
yield* closeClient(client);
|
|
32
|
-
})));
|
|
33
|
-
effectTest("rejects when the server refuses the connection (well within RPC timeout)", () => Effect.gen(function* () {
|
|
34
|
-
// Point the client at a port that's not accepting connections. The
|
|
35
|
-
// `ws` lib emits 'error' on TCP connect failure which maps to
|
|
36
|
-
// `SocketGenericError{reason: "Open"}`. Our reader fiber's `onExit`
|
|
37
|
-
// catches and fails the handshake deferred -> NotConnectedError.
|
|
38
|
-
//
|
|
39
|
-
// Observed: ECONNREFUSED fires in single-digit ms locally; give
|
|
40
|
-
// generous CI headroom via the 15s assertion but keep test timeout at
|
|
41
|
-
// 20s to avoid flakes on slow runners.
|
|
42
|
-
const refusedPort = yield* findClosedLocalPort();
|
|
43
|
-
const client = makeClient(`http://${LOCALHOST_HOST}:${refusedPort}`);
|
|
44
|
-
const t0 = Date.now();
|
|
45
|
-
yield* expectEffectFailure(connectClient(client), /WebSocket not connected/);
|
|
46
|
-
const elapsed = Date.now() - t0;
|
|
47
|
-
expect(elapsed).toBeLessThan(REFUSED_CONNECT_MAX_MS);
|
|
48
|
-
yield* closeClient(client);
|
|
49
|
-
}), REFUSED_CONNECT_TEST_TIMEOUT_MS);
|
|
50
|
-
effectTest("resolves with HelloOk on the happy open -> network/connect path", () => withTestServer(Effect.gen(function* () {
|
|
51
|
-
const server = yield* startHandshakingServer(() => Effect.void);
|
|
52
|
-
const client = makeClient(server.url);
|
|
53
|
-
const hello = (yield* connectClient(client));
|
|
54
|
-
expect(hello.agentId).toBe(TEST_AGENT_ID);
|
|
55
|
-
expect(client.helloOk).toEqual(hello);
|
|
56
|
-
yield* closeClient(client);
|
|
57
|
-
})));
|
|
58
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
59
|
-
// §5.2 — pending RPCs fail fast on disconnect
|
|
60
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
61
|
-
effectTest("rejects pending sendRpc calls when disconnect() is called", () => withTestServer(Effect.gen(function* () {
|
|
62
|
-
// Handler responds to network/connect but drops everything else, so the
|
|
63
|
-
// RPC stays pending until we trigger disconnect.
|
|
64
|
-
const server = yield* startHandshakingServer(() => Effect.void);
|
|
65
|
-
const client = makeClient(server.url);
|
|
66
|
-
yield* connectClient(client);
|
|
67
|
-
const rpcFiber = yield* Effect.fork(sendRpcEffect(client, MessagesSend, {
|
|
68
|
-
taskId: TEST_TASK_ID,
|
|
69
|
-
conversationId: TEST_CONVERSATION_ID,
|
|
70
|
-
parts: [{ type: "text", text: "hi" }],
|
|
71
|
-
}));
|
|
72
|
-
// Wait for the RPC frame to land on the server.
|
|
73
|
-
yield* waitFor(() => server.connections[0].received.length >= 2);
|
|
74
|
-
// Trigger disconnect — the reader-fiber `onExit` path drains pendings
|
|
75
|
-
// with NotConnectedError.
|
|
76
|
-
yield* client.disconnect();
|
|
77
|
-
yield* expectEffectFailure(Fiber.join(rpcFiber), /WebSocket not connected/);
|
|
78
|
-
yield* closeClient(client);
|
|
79
|
-
})));
|
|
80
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
81
|
-
// §5.3 — no automatic retry on timeout (TestClock-driven)
|
|
82
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
83
|
-
//
|
|
84
|
-
// `sendRpcEffect` wraps `Deferred.await` with `Effect.timeoutFail`, which
|
|
85
|
-
// schedules against the Effect Clock. Under `@effect/vitest`'s `it.effect`
|
|
86
|
-
// that Clock is a TestClock, so `TestClock.adjust(Duration.millis(30_000))`
|
|
87
|
-
// advances virtual time and fires the timeout synchronously.
|
|
88
|
-
//
|
|
89
|
-
// Layering caveat: `Effect.sleep` (TestClock) and real DOM WebSocket events
|
|
90
|
-
// (real timers) live on different clocks. The handshake runs without any
|
|
91
|
-
// `Effect.sleep`, so it completes against wall-clock. We poll server-side
|
|
92
|
-
// frame arrival via real setTimeout (sidesteps TestClock) so the test can
|
|
93
|
-
// wait for the RPC frame to land before advancing virtual time.
|
|
94
|
-
scopedEffectTest("fails with RpcTimeoutError after virtual 30s, no retry frame", () => withTestServer(Effect.gen(function* () {
|
|
95
|
-
// Server answers network/connect, then silently drops messages/send.
|
|
96
|
-
const server = yield* startHandshakingServer(() => Effect.void);
|
|
97
|
-
const client = makeClient(server.url);
|
|
98
|
-
// Handshake: not wrapped in Effect.sleep, so TestClock doesn't
|
|
99
|
-
// interfere.
|
|
100
|
-
yield* connectClient(client);
|
|
101
|
-
const serverConn = server.connections[0];
|
|
102
|
-
const beforeCount = serverConn.received.length;
|
|
103
|
-
const rpcFiber = yield* Effect.fork(client.sendRpc(MessagesSend, {
|
|
104
|
-
taskId: TEST_TASK_ID,
|
|
105
|
-
conversationId: TEST_CONVERSATION_ID,
|
|
106
|
-
parts: [{ type: "text", text: "payload" }],
|
|
107
|
-
}));
|
|
108
|
-
yield* waitFor(() => serverConn.received.length > beforeCount, {
|
|
109
|
-
maxMs: REALTIME_POLL_TIMEOUT_MS,
|
|
110
|
-
});
|
|
111
|
-
expect(serverConn.received.length).toBe(beforeCount + 1);
|
|
112
|
-
// Virtual time: advance past RPC_TIMEOUT_MS → timeoutFail fires.
|
|
113
|
-
yield* TestClock.adjust(Duration.millis(RPC_TIMEOUT_MS));
|
|
114
|
-
const exit = yield* Fiber.await(rpcFiber);
|
|
115
|
-
expect(Exit.isFailure(exit)).toBe(true);
|
|
116
|
-
if (Exit.isFailure(exit)) {
|
|
117
|
-
// Cause.failureOption narrows the cause to its typed error without
|
|
118
|
-
// touching `_tag` manually. instanceof pins the class nominally
|
|
119
|
-
// in case a defect slipped through with a matching shape.
|
|
120
|
-
const failed = Cause.failureOption(exit.cause);
|
|
121
|
-
expect(Option.isSome(failed)).toBe(true);
|
|
122
|
-
if (Option.isSome(failed)) {
|
|
123
|
-
const err = failed.value;
|
|
124
|
-
expect(err).toBeInstanceOf(RpcTimeoutError);
|
|
125
|
-
if (err instanceof RpcTimeoutError) {
|
|
126
|
-
expect(err.method).toBe(MessagesSend.name);
|
|
127
|
-
expect(err.timeoutMs).toBe(RPC_TIMEOUT_MS);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
// No retry frame may have been enqueued — timeout is terminal. Bounce
|
|
132
|
-
// once through the real event loop for any stragglers.
|
|
133
|
-
yield* realSleep(POST_TIMEOUT_SETTLE_MS);
|
|
134
|
-
expect(serverConn.received.length).toBe(beforeCount + 1);
|
|
135
|
-
yield* client.close();
|
|
136
|
-
})));
|
|
137
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
138
|
-
// Reconnect backoff — real wall-clock
|
|
139
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
140
|
-
//
|
|
141
|
-
// The reconnect loop is forked on the client's internal `ManagedRuntime`
|
|
142
|
-
// (created in the constructor to provide `NodeSocket.layerWebSocketConstructor`
|
|
143
|
-
// without bubbling the requirement to callers). That runtime has its own
|
|
144
|
-
// default Clock, so `TestClock.adjust` from a test fiber doesn't release
|
|
145
|
-
// `Effect.sleep`s scheduled inside it. We assert on real wall-clock timing
|
|
146
|
-
// instead; the jittered base delay is [0, 1s] so 2.5s is a safe ceiling.
|
|
147
|
-
effectTest("reconnects with exponential-jittered backoff after unsolicited server close", () => withTestServer(Effect.gen(function* () {
|
|
148
|
-
const authResponsesSent = { current: 0 };
|
|
149
|
-
const reconnectHello = { current: null };
|
|
150
|
-
const server = yield* startReconnectServer(authResponsesSent);
|
|
151
|
-
const client = makeClient(server.url, {
|
|
152
|
-
onReconnect: setRef(reconnectHello),
|
|
153
|
-
});
|
|
154
|
-
yield* connectClient(client);
|
|
155
|
-
expect(authResponsesSent.current).toBe(1);
|
|
156
|
-
expect(server.connections.length).toBe(1);
|
|
157
|
-
// Kill the server-side connection. The client's reader sees a close,
|
|
158
|
-
// fails pendings, invokes onDisconnect, and schedules a reconnect
|
|
159
|
-
// via `Effect.sleep` + `Schedule.jittered`.
|
|
160
|
-
yield* server.connections[0].close(NORMAL_CLOSE_CODE);
|
|
161
|
-
yield* waitFor(() => server.connections.length >= 2 && authResponsesSent.current >= 2, { maxMs: 2500 });
|
|
162
|
-
expect(server.connections.length).toBeGreaterThanOrEqual(2);
|
|
163
|
-
expect(authResponsesSent.current).toBeGreaterThanOrEqual(2);
|
|
164
|
-
yield* waitFor(() => reconnectHello.current !== null, { maxMs: 500 });
|
|
165
|
-
expect(reconnectHello.current.agentId).toBe(RECONNECT_AGENT_ID);
|
|
166
|
-
yield* closeClient(client);
|
|
167
|
-
})));
|
|
168
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
169
|
-
// §5.4 — malformed inbound frames logged + ignored, not crashing
|
|
170
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
171
|
-
effectTest("ignores non-JSON frames while a pending RPC is outstanding, then resolves on the real response", () => withTestServer(Effect.gen(function* () {
|
|
172
|
-
// Server auto-handshakes. On `conversations/list`, injects a few
|
|
173
|
-
// malformed inbound frames, then the real response.
|
|
174
|
-
const server = yield* startHandshakingServer(sendMalformedFramesAndResponse);
|
|
175
|
-
const client = makeClient(server.url);
|
|
176
|
-
yield* connectClient(client);
|
|
177
|
-
const result = (yield* sendRpcEffect(client, TaskList, {}));
|
|
178
|
-
expect(result.tasks).toEqual([]);
|
|
179
|
-
yield* closeClient(client);
|
|
180
|
-
})));
|
|
181
|
-
effectTest("logs a combined notification and response text frame as malformed", () => withTestServer(Effect.gen(function* () {
|
|
182
|
-
const events = [];
|
|
183
|
-
const server = yield* startHandshakingServer(sendPaddedNotificationAndResponse);
|
|
184
|
-
const client = makeClient(server.url, {
|
|
185
|
-
onNotification: (event) => events.push(event),
|
|
186
|
-
});
|
|
187
|
-
yield* connectClient(client);
|
|
188
|
-
const rpcFiber = yield* Effect.fork(sendRpcEffect(client, TaskList, {}).pipe(Effect.ignore));
|
|
189
|
-
yield* realSleep(POST_TIMEOUT_SETTLE_MS);
|
|
190
|
-
expect(events).toHaveLength(0);
|
|
191
|
-
yield* Fiber.interrupt(rpcFiber);
|
|
192
|
-
yield* closeClient(client);
|
|
193
|
-
})));
|
|
194
|
-
effectTest("routes a well-formed notification frame to onNotification", () => withTestServer(Effect.gen(function* () {
|
|
195
|
-
const events = [];
|
|
196
|
-
const server = yield* startHandshakingServer((conn) => conn.send(JSON.stringify(messageReceivedFrame())));
|
|
197
|
-
const client = makeClient(server.url, {
|
|
198
|
-
onNotification: (e) => events.push(e),
|
|
199
|
-
});
|
|
200
|
-
yield* connectClient(client);
|
|
201
|
-
// Fire-and-forget: the server responds with an out-of-band notification
|
|
202
|
-
// rather than an RPC response, so the noop Deferred never resolves.
|
|
203
|
-
// Awaiting it would wedge the test for the full RPC_TIMEOUT_MS.
|
|
204
|
-
const rpcFiber = yield* Effect.fork(sendRpcEffect(client, TaskList, {}).pipe(Effect.ignore));
|
|
205
|
-
yield* waitFor(() => events.length > 0, {
|
|
206
|
-
maxMs: CLOSE_INFO_WAIT_MS,
|
|
207
|
-
});
|
|
208
|
-
expect(events[0]).toMatchObject({
|
|
209
|
-
method: MessageReceivedNotificationDefinition.name,
|
|
210
|
-
});
|
|
211
|
-
yield* Fiber.interrupt(rpcFiber);
|
|
212
|
-
yield* closeClient(client);
|
|
213
|
-
})));
|
|
214
|
-
effectTest("does NOT route a notification frame missing the method field", () => withTestServer(Effect.gen(function* () {
|
|
215
|
-
const events = [];
|
|
216
|
-
// Send a malformed notification on the first post-handshake frame.
|
|
217
|
-
const server = yield* startHandshakingServer((conn) => conn.send(JSON.stringify({ jsonrpc: JSON_RPC_VERSION, params: {} })));
|
|
218
|
-
const client = makeClient(server.url, {
|
|
219
|
-
onNotification: (e) => events.push(e),
|
|
220
|
-
});
|
|
221
|
-
yield* connectClient(client);
|
|
222
|
-
// Fire-and-forget: see the well-formed-event test above for rationale.
|
|
223
|
-
const rpcFiber = yield* Effect.fork(sendRpcEffect(client, TaskList, {}).pipe(Effect.ignore));
|
|
224
|
-
yield* Effect.sleep(Duration.millis(POST_TIMEOUT_SETTLE_MS));
|
|
225
|
-
expect(events).toHaveLength(0);
|
|
226
|
-
yield* Fiber.interrupt(rpcFiber);
|
|
227
|
-
yield* closeClient(client);
|
|
228
|
-
})));
|
|
229
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
230
|
-
// Malformed-frame log cadence
|
|
231
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
232
|
-
effectTest("logs at frames #1, #50, #100 and suppresses everything in between", () => withTestServer(Effect.gen(function* () {
|
|
233
|
-
// Server auto-handshakes. On ANY post-handshake frame, fires 101
|
|
234
|
-
// malformed frames back at the client.
|
|
235
|
-
const server = yield* startHandshakingServer(sendMalformedFrameBurst);
|
|
236
|
-
const client = makeClient(server.url);
|
|
237
|
-
yield* connectClient(client);
|
|
238
|
-
// Fire-and-forget: server responds with 101 malformed frames, no
|
|
239
|
-
// actual RPC response, so awaiting the noop would wedge the test.
|
|
240
|
-
const rpcFiber = yield* Effect.fork(sendRpcEffect(client, TaskList, {}).pipe(Effect.ignore));
|
|
241
|
-
// Wait for the malformed frames to flush through the reader fiber.
|
|
242
|
-
yield* Effect.sleep(Duration.millis(MALFORMED_FRAME_FLUSH_MS));
|
|
243
|
-
const loggedFrameNumbers = Array.from({ length: 101 }, (_, index) => index + 1).filter(shouldLogMalformedFrame);
|
|
244
|
-
expect(loggedFrameNumbers).toEqual([1, 50, 100]);
|
|
245
|
-
yield* Fiber.interrupt(rpcFiber);
|
|
246
|
-
yield* closeClient(client);
|
|
247
|
-
})));
|
|
248
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
249
|
-
// close() vs pending-RPC interleave
|
|
250
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
251
|
-
effectTest("rejects the pending RPC with NotConnectedError before any timeout", () => withTestServer(Effect.gen(function* () {
|
|
252
|
-
// Server handshakes then drops everything.
|
|
253
|
-
const server = yield* startHandshakingServer(() => Effect.void);
|
|
254
|
-
const client = makeClient(server.url);
|
|
255
|
-
yield* connectClient(client);
|
|
256
|
-
const rpcFiber = yield* Effect.fork(sendRpcEffect(client, TaskList, {}));
|
|
257
|
-
yield* waitFor(() => server.connections[0].received.length >= 2);
|
|
258
|
-
const beforeMs = Date.now();
|
|
259
|
-
yield* closeClient(client);
|
|
260
|
-
yield* expectEffectFailure(Fiber.join(rpcFiber), /WebSocket not connected/);
|
|
261
|
-
expect(Date.now() - beforeMs).toBeLessThan(CLOSE_PROPAGATION_TIMEOUT_MS);
|
|
262
|
-
})));
|
|
263
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
264
|
-
// ws.on("error") → close propagation
|
|
265
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
266
|
-
effectTest("pending RPCs reject with NotConnectedError after the server closes", () => withTestServer(Effect.gen(function* () {
|
|
267
|
-
// Handshakes, then on any follow-up RPC, closes abruptly (code 1011).
|
|
268
|
-
const server = yield* startHandshakingServer((conn) => conn.close(SERVER_ERROR_CLOSE_CODE));
|
|
269
|
-
const client = makeClient(server.url);
|
|
270
|
-
yield* connectClient(client);
|
|
271
|
-
yield* expectEffectFailure(sendRpcEffect(client, TaskList, {}), /WebSocket not connected/);
|
|
272
|
-
yield* closeClient(client);
|
|
273
|
-
})));
|
|
274
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
275
|
-
// Typed-manifest sendRpc overload
|
|
276
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
277
|
-
effectTest("uses definition.name as the wire-level method string", () => withTestServer(Effect.gen(function* () {
|
|
278
|
-
const captured = { current: null };
|
|
279
|
-
const server = yield* startAgentsLookupByNameServer(captured);
|
|
280
|
-
const client = makeClient(server.url);
|
|
281
|
-
yield* connectClient(client);
|
|
282
|
-
const result = yield* client.sendRpc(AgentsLookupByName, {
|
|
283
|
-
names: ["alice"],
|
|
284
|
-
});
|
|
285
|
-
expect(result.agents).toEqual([]);
|
|
286
|
-
expect(captured.current?.method).toBe(AgentsLookupByName.name);
|
|
287
|
-
expect(captured.current?.params).toEqual({ names: ["alice"] });
|
|
288
|
-
yield* closeClient(client);
|
|
289
|
-
})));
|
|
290
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
291
|
-
// AC2 — graceful close drains ESTABLISHED sockets (socket-count evidence)
|
|
292
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
293
|
-
effectTest("10 clients close cleanly: no CLOSE_WAIT sockets on the server port", () => withTestServer(Effect.gen(function* () {
|
|
294
|
-
const server = yield* startHandshakingServer(() => Effect.void);
|
|
295
|
-
const port = new URL(server.url).port;
|
|
296
|
-
// Connect 10 clients concurrently.
|
|
297
|
-
const clients = yield* Effect.all(Array.from({ length: CLIENT_DRAIN_COUNT }, () => connectClientForServer(server.url)), { concurrency: CLIENT_DRAIN_COUNT });
|
|
298
|
-
expect(server.connections.length).toBe(CLIENT_DRAIN_COUNT);
|
|
299
|
-
// Close all 10 via the graceful Effect-based close().
|
|
300
|
-
yield* Effect.all(clients.map((c) => c.close()), { concurrency: CLIENT_DRAIN_COUNT });
|
|
301
|
-
// Brief pause for TCP close handshake to complete.
|
|
302
|
-
yield* Effect.sleep("150 millis");
|
|
303
|
-
// Assert no CLOSE_WAIT connections remain on the server port.
|
|
304
|
-
const ssOut = yield* closeWaitSocketOutput;
|
|
305
|
-
const stale = ssOut
|
|
306
|
-
.split("\n")
|
|
307
|
-
.filter((line) => line.includes(`:${port} `) || line.endsWith(`:${port}`));
|
|
308
|
-
expect(stale).toHaveLength(0);
|
|
309
|
-
})), STALE_PORT_TEST_TIMEOUT_MS);
|
|
310
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
311
|
-
// Spec #222 §5.4 (V7) — `onDisconnect` receives a typed `CloseInfo`
|
|
312
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
313
|
-
// Two distinguishable closes through the live reader-fiber path:
|
|
314
|
-
// 1. Server-initiated 1000/"bye" → CloseInfo{1000, NORMAL_CLOSE_REASON}
|
|
315
|
-
// (`@effect/platform/Socket` treats 1000 as `Exit.Success` per
|
|
316
|
-
// its default `closeCodeIsError`; `extractCloseInfo` synthesizes
|
|
317
|
-
// the OQ-5 graceful default — the close-frame reason is dropped
|
|
318
|
-
// because there's no `SocketCloseError` to round-trip.)
|
|
319
|
-
// 2. Server-initiated 1011/SERVER_ERROR_REASON → CloseInfo{1011, SERVER_ERROR_REASON}
|
|
320
|
-
// (non-1000 codes raise `SocketCloseError`; the real code +
|
|
321
|
-
// `closeReason` round-trip through.)
|
|
322
|
-
//
|
|
323
|
-
// The pre-deletion adapter hardcoded `{1000, "disconnect"}` regardless
|
|
324
|
-
// of the actual close. A V7 mutation that re-introduces the hardcode
|
|
325
|
-
// flips the second test's `code === 1011` assertion pass → fail,
|
|
326
|
-
// satisfying AC 5.4-4 (distinguishable payloads). The OQ-5
|
|
327
|
-
// default-fallback paths (HandshakeFailure / TransportFailure /
|
|
328
|
-
// Unknown → DEFAULT_ABNORMAL_CLOSE) are covered by the direct unit
|
|
329
|
-
// tests in `runtime/close-info.test.ts`, where synthetic `Exit`
|
|
330
|
-
// values exercise each branch without a real transport.
|
|
331
|
-
effectTest("synthesizes the graceful default when the transport treats 1000 as Exit.Success", () => withTestServer(Effect.gen(function* () {
|
|
332
|
-
const closes = [];
|
|
333
|
-
const server = yield* startHandshakingServer(() => Effect.void);
|
|
334
|
-
const client = makeClient(server.url, {
|
|
335
|
-
onDisconnect: (close) => {
|
|
336
|
-
closes.push(close);
|
|
337
|
-
},
|
|
338
|
-
});
|
|
339
|
-
yield* connectClient(client);
|
|
340
|
-
yield* server.connections[0].close(NORMAL_CLOSE_CODE, "bye");
|
|
341
|
-
yield* waitFor(() => closes.length > 0, {
|
|
342
|
-
maxMs: CLOSE_INFO_WAIT_MS,
|
|
343
|
-
});
|
|
344
|
-
yield* closeClient(client);
|
|
345
|
-
expect(closes.length).toBeGreaterThanOrEqual(1);
|
|
346
|
-
const first = closes[0];
|
|
347
|
-
expect(first.code).toBe(NORMAL_CLOSE_CODE);
|
|
348
|
-
expect(first.reason).toBe(NORMAL_CLOSE_REASON); // OQ-5 default, not "bye"
|
|
349
|
-
})));
|
|
350
|
-
effectTest("round-trips the server's close code + reason for a 1011 (server error) close", () => withTestServer(Effect.gen(function* () {
|
|
351
|
-
const closes = [];
|
|
352
|
-
const server = yield* startHandshakingServer(() => Effect.void);
|
|
353
|
-
const client = makeClient(server.url, {
|
|
354
|
-
onDisconnect: (close) => {
|
|
355
|
-
closes.push(close);
|
|
356
|
-
},
|
|
357
|
-
});
|
|
358
|
-
yield* connectClient(client);
|
|
359
|
-
yield* server.connections[0].close(SERVER_ERROR_CLOSE_CODE, SERVER_ERROR_REASON);
|
|
360
|
-
yield* waitFor(() => closes.length > 0, {
|
|
361
|
-
maxMs: CLOSE_INFO_WAIT_MS,
|
|
362
|
-
});
|
|
363
|
-
yield* closeClient(client);
|
|
364
|
-
expect(closes.length).toBeGreaterThanOrEqual(1);
|
|
365
|
-
const first = closes[0];
|
|
366
|
-
// Distinguishable from the 1000 test above (AC 5.4-4):
|
|
367
|
-
// a hardcoded `{1000, "disconnect"}` would fail this assertion.
|
|
368
|
-
expect(first.code).toBe(SERVER_ERROR_CLOSE_CODE);
|
|
369
|
-
expect(first.reason).toBe(SERVER_ERROR_REASON);
|
|
370
|
-
})));
|
|
371
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
372
|
-
// Phase 1.0 (B.1) gating tests — client-side server-initiated RPC
|
|
373
|
-
// (Spec F #617 typed-dispatcher TM-callback handler table + dispatcher
|
|
374
|
-
// fiber + appCallback response write-back)
|
|
375
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
376
|
-
effectTest("dispatches an inbound appCallback request to the registered handler and writes the response back", () => withTestServer(Effect.gen(function* () {
|
|
377
|
-
// Server: auto-handshake; immediately AFTER replying to
|
|
378
|
-
// network/connect, send an appCallback request to the client; capture every
|
|
379
|
-
// subsequent inbound frame the client writes back. We're testing
|
|
380
|
-
// the client's dispatcher fiber + handler registry + response
|
|
381
|
-
// encoding.
|
|
382
|
-
const server = yield* startDispatchAuthorizeServer(SERVER_TEST_REQUEST_ID, dispatchRequestParams(SESSION_A));
|
|
383
|
-
// Spec F: pass the TM-callback handler table at construction
|
|
384
|
-
// so the typed dispatcher sees it on the very first inbound
|
|
385
|
-
// task-callback request. The handler captures the `taskId`
|
|
386
|
-
// it was invoked with so the assertion below can verify the
|
|
387
|
-
// request reached the right descriptor's handler.
|
|
388
|
-
const observedTaskId = { current: null };
|
|
389
|
-
const client = makeClient(server.url, {
|
|
390
|
-
handlers: grantDispatchAuthorizeHandlers(observedTaskId),
|
|
391
|
-
});
|
|
392
|
-
yield* connectClient(client);
|
|
393
|
-
// Wait for the response frame the dispatcher writes back. The
|
|
394
|
-
// server records every inbound frame in `received` — the appCallback
|
|
395
|
-
// response should appear after the client's network/connect.
|
|
396
|
-
const responseRaw = yield* waitForResponseRaw(server, SERVER_TEST_REQUEST_ID);
|
|
397
|
-
const parsedResponse = JSON.parse(responseRaw);
|
|
398
|
-
expect(validateResponseFrame(parsedResponse)).toBe(true);
|
|
399
|
-
if (!validateResponseFrame(parsedResponse))
|
|
400
|
-
return;
|
|
401
|
-
expect(parsedResponse.id).toBe(SERVER_TEST_REQUEST_ID);
|
|
402
|
-
expect("result" in parsedResponse).toBe(true);
|
|
403
|
-
if (!("result" in parsedResponse))
|
|
404
|
-
return;
|
|
405
|
-
const result = parsedResponse.result;
|
|
406
|
-
expect(result.admission.decision).toBe(GRANT_DECISION);
|
|
407
|
-
expect(observedTaskId.current).toBe(SESSION_A);
|
|
408
|
-
yield* closeClient(client);
|
|
409
|
-
})));
|
|
410
|
-
// Spec F: TM-callback handler-table fragment bound at construction.
|
|
411
|
-
// The dispatch/authorize handler unconditionally fails with a
|
|
412
|
-
// registered tagged error so the dispatcher encodes it onto the wire
|
|
413
|
-
// as an `error` reply.
|
|
414
|
-
const REGISTERED_ERROR_HANDLERS = {
|
|
415
|
-
"dispatch/authorize": {
|
|
416
|
-
definition: DispatchAuthorize,
|
|
417
|
-
handle: () => Effect.fail(new ForbiddenError({
|
|
418
|
-
message: DOMAIN_REJECTED_MESSAGE,
|
|
419
|
-
data: { reason: DOMAIN_REJECTED_REASON },
|
|
420
|
-
})),
|
|
421
|
-
},
|
|
422
|
-
"messages/authorize": {
|
|
423
|
-
definition: MessagesAuthorize,
|
|
424
|
-
handle: () => Effect.fail(new ForbiddenError({ message: "vacuous deny" })),
|
|
425
|
-
},
|
|
426
|
-
"task/create": {
|
|
427
|
-
definition: TaskCreate,
|
|
428
|
-
handle: () => Effect.succeed({
|
|
429
|
-
verdict: { decision: "reject", reason: "vacuous deny" },
|
|
430
|
-
}),
|
|
431
|
-
},
|
|
432
|
-
};
|
|
433
|
-
effectTest("encodes a registered handler error as a `response` frame with `error`", () => withTestServer(Effect.gen(function* () {
|
|
434
|
-
const server = yield* startDispatchAuthorizeServer(SERVER_ERROR_REQUEST_ID, dispatchRequestParams(SESSION_B));
|
|
435
|
-
const client = makeClient(server.url, {
|
|
436
|
-
handlers: REGISTERED_ERROR_HANDLERS,
|
|
437
|
-
});
|
|
438
|
-
yield* connectClient(client);
|
|
439
|
-
yield* waitForErrorResponse(server, SERVER_ERROR_REQUEST_ID);
|
|
440
|
-
const found = findResponseRaw(server, SERVER_ERROR_REQUEST_ID);
|
|
441
|
-
const parsed = JSON.parse(found);
|
|
442
|
-
expect(validateResponseFrame(parsed)).toBe(true);
|
|
443
|
-
if (!validateResponseFrame(parsed))
|
|
444
|
-
return;
|
|
445
|
-
expect("error" in parsed).toBe(true);
|
|
446
|
-
if (!("error" in parsed))
|
|
447
|
-
return;
|
|
448
|
-
expect(parsed.error.code).toBe(HANDLER_REJECTION_CODE);
|
|
449
|
-
expect(parsed.error.message).toBe(DOMAIN_REJECTED_MESSAGE);
|
|
450
|
-
expect(parsed.error.data.reason).toBe(DOMAIN_REJECTED_REASON);
|
|
451
|
-
yield* closeClient(client);
|
|
452
|
-
})));
|
|
453
|
-
// Note: Spec F (#617) makes the TM-callback handler table immutable at
|
|
454
|
-
// construction. Duplicate-key binding is now a TypeScript compile-time
|
|
455
|
-
// error at the object-literal site (duplicate property name on the
|
|
456
|
-
// `handlers` literal). The previous runtime
|
|
457
|
-
// duplicate-registration rejection test has been retired alongside the
|
|
458
|
-
// runtime register API (D3 deletion); the type system carries the
|
|
459
|
-
// invariant.
|
|
460
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
461
|
-
// Regression gate (review-295): runSync(client.close()) and
|
|
462
|
-
// runSync(client.disconnect()) must not throw AsyncFiberException after
|
|
463
|
-
// the appCallback queue + dispatcher were added. The appCallback machinery lives off the
|
|
464
|
-
// per-connect Scope (allocated inline + forked via runtime.runFork) so
|
|
465
|
-
// `Scope.close` stays sync; teardown of the queue and dispatcher fiber
|
|
466
|
-
// is dispatched via `runFork` from close()/disconnectSync().
|
|
467
|
-
//
|
|
468
|
-
// Failure mode this guards: `Effect.acquireRelease(Queue.dropping, Queue.shutdown)
|
|
469
|
-
// .pipe(Scope.extend(scope))` + `Effect.forkScoped` would have made the
|
|
470
|
-
// scope teardown async, breaking
|
|
471
|
-
// packages/openclaw-channel/src/__tests__/reconnection.integration.test.ts:14
|
|
472
|
-
// (`closeWs = (c) => Effect.runSync(c.close())`).
|
|
473
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
474
|
-
effectTest("client.close() runs synchronously after a successful connect", () => withTestServer(Effect.gen(function* () {
|
|
475
|
-
const server = yield* startHandshakingServer(() => Effect.void);
|
|
476
|
-
const client = makeClient(server.url);
|
|
477
|
-
yield* connectClient(client);
|
|
478
|
-
// Critical: this MUST be runSync, not runPromise. Throwing
|
|
479
|
-
// AsyncFiberException here is the regression we're guarding.
|
|
480
|
-
expect(() => Effect.runSync(client.close())).not.toThrow();
|
|
481
|
-
})));
|
|
482
|
-
effectTest("client.disconnect() runs synchronously after a successful connect", () => withTestServer(Effect.gen(function* () {
|
|
483
|
-
const server = yield* startHandshakingServer(() => Effect.void);
|
|
484
|
-
const client = makeClient(server.url);
|
|
485
|
-
yield* connectClient(client);
|
|
486
|
-
expect(() => Effect.runSync(client.disconnect())).not.toThrow();
|
|
487
|
-
// Drain reconnect-fiber + runtime so vitest doesn't flag dangling work.
|
|
488
|
-
yield* closeClient(client);
|
|
489
|
-
})));
|
|
490
|
-
//# sourceMappingURL=tm-client.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tm-client.test.js","sourceRoot":"","sources":["../src/tm-client.test.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|
|
File without changes
|