@moltzap/client 2026.529.0 → 2026.718.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 +49 -27
- 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
|
@@ -1,312 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for the transport layer — pure decision table + composition-
|
|
3
|
-
* boundary checks. Integration coverage of the direct-WS branch lives in
|
|
4
|
-
* the E2E fixture (`__tests__/cli-multi-agent.int.test.ts`).
|
|
5
|
-
*/
|
|
6
|
-
import { Cause, Effect, Exit, Option } from "effect";
|
|
7
|
-
import * as fc from "fast-check";
|
|
8
|
-
import { it as effectIt } from "@effect/vitest";
|
|
9
|
-
import { afterEach, beforeEach, describe, expect, vi } from "vitest";
|
|
10
|
-
import { NotConnectedError, RpcServerError, RpcTimeoutError, } from "@moltzap/protocol";
|
|
11
|
-
import { decideTransport, makeTransportLayer, resolveTransportInputs, tagWsError, Transport, TransportDecodeError, TransportRpcError, ServiceUnreachableError, TransportTimeoutError, } from "./transport.js";
|
|
12
|
-
import { TaskList, TaskRejectedError } from "@moltzap/protocol";
|
|
13
|
-
const it = effectIt.effect;
|
|
14
|
-
const SESSION_NOT_FOUND_CODE = -32001;
|
|
15
|
-
const RPC_TIMEOUT_MS = 15_000;
|
|
16
|
-
const SERVER_URL = "wss://example.test";
|
|
17
|
-
const TEST_SOCKET_PATH = "/var/run/moltzap-test.sock";
|
|
18
|
-
const USE_DIRECT_TAG = "UseDirect";
|
|
19
|
-
const USE_DAEMON_TAG = "UseDaemon";
|
|
20
|
-
const AS_FLAG_REASON = "as-flag";
|
|
21
|
-
const PROFILE_REASON = "profile";
|
|
22
|
-
const ENV_FALLBACK_REASON = "env-fallback";
|
|
23
|
-
const TRANSPORT_RPC_ERROR_TAG = "TransportRpcError";
|
|
24
|
-
const SERVICE_UNREACHABLE_ERROR_TAG = "ServiceUnreachableError";
|
|
25
|
-
const TRANSPORT_DECODE_ERROR_TAG = "TransportDecodeError";
|
|
26
|
-
const SESSION_NOT_FOUND_MESSAGE = "session not found";
|
|
27
|
-
const ITEM_NOT_FOUND_MESSAGE = "item not found";
|
|
28
|
-
const NOT_CONNECTED_MESSAGE = "not connected";
|
|
29
|
-
const UNKNOWN_ERROR_MESSAGE = "some unknown error";
|
|
30
|
-
const IMPERSONATE_KEY = "key-1";
|
|
31
|
-
const PROFILE_KEY = "pk-1";
|
|
32
|
-
const ENV_KEY = "env-key";
|
|
33
|
-
const LEAKED_ENV_KEY = "leaked-key";
|
|
34
|
-
const EXPLICIT_KEY = "explicit-key";
|
|
35
|
-
const OVERRIDE_SERVER_URL = "wss://override.test";
|
|
36
|
-
const DIRECT_TEST_KEY = "test-key";
|
|
37
|
-
const DIRECT_TEST_SERVER_URL = "wss://test.example";
|
|
38
|
-
function makeMockWsClient() {
|
|
39
|
-
return {
|
|
40
|
-
connect: () => Effect.void,
|
|
41
|
-
sendRpc: () => Effect.fail(new RpcServerError({
|
|
42
|
-
code: SESSION_NOT_FOUND_CODE,
|
|
43
|
-
message: ITEM_NOT_FOUND_MESSAGE,
|
|
44
|
-
})),
|
|
45
|
-
close: () => Effect.void,
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Module-level mock so transport.ts's `new MoltZapAgentClient(...)` call is
|
|
50
|
-
* intercepted for the composed-rpc test below. Existing tests (decideTransport,
|
|
51
|
-
* tagWsError, resolveTransportInputs) do not exercise the ws-client path, so
|
|
52
|
-
* the mock is a no-op for them.
|
|
53
|
-
*/
|
|
54
|
-
vi.mock("../agent-client.js", () => ({
|
|
55
|
-
MoltZapAgentClient: vi.fn().mockImplementation(makeMockWsClient),
|
|
56
|
-
}));
|
|
57
|
-
const makeOpts = (over = {}) => ({
|
|
58
|
-
serverUrl: SERVER_URL,
|
|
59
|
-
...over,
|
|
60
|
-
});
|
|
61
|
-
const unreachableDaemon = () => Effect.succeed(false);
|
|
62
|
-
const reachableDaemon = () => Effect.succeed(true);
|
|
63
|
-
function countedProbe(counter) {
|
|
64
|
-
return () => Effect.sync(() => {
|
|
65
|
-
counter.count++;
|
|
66
|
-
return true;
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
function useDirectAsFlag() {
|
|
70
|
-
return Effect.gen(function* () {
|
|
71
|
-
const probe = { count: 0 };
|
|
72
|
-
const decision = yield* decideTransport(makeOpts({
|
|
73
|
-
impersonateKey: IMPERSONATE_KEY,
|
|
74
|
-
probeDaemon: countedProbe(probe),
|
|
75
|
-
}));
|
|
76
|
-
expect(decision).toEqual({ _tag: USE_DIRECT_TAG, reason: AS_FLAG_REASON });
|
|
77
|
-
expect(probe.count).toBe(0);
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
function useDirectProfile() {
|
|
81
|
-
return Effect.gen(function* () {
|
|
82
|
-
const decision = yield* decideTransport(makeOpts({ profileKey: PROFILE_KEY }));
|
|
83
|
-
expect(decision).toEqual({ _tag: USE_DIRECT_TAG, reason: PROFILE_REASON });
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
function useDirectEnvFallback() {
|
|
87
|
-
return Effect.gen(function* () {
|
|
88
|
-
const decision = yield* decideTransport(makeOpts({ envFallbackKey: ENV_KEY, probeDaemon: unreachableDaemon }));
|
|
89
|
-
expect(decision).toEqual({
|
|
90
|
-
_tag: USE_DIRECT_TAG,
|
|
91
|
-
reason: ENV_FALLBACK_REASON,
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
function useDaemonWhenReachable() {
|
|
96
|
-
return Effect.gen(function* () {
|
|
97
|
-
const decision = yield* decideTransport(makeOpts({
|
|
98
|
-
envFallbackKey: ENV_KEY,
|
|
99
|
-
socketPath: TEST_SOCKET_PATH,
|
|
100
|
-
probeDaemon: reachableDaemon,
|
|
101
|
-
}));
|
|
102
|
-
expect(decision._tag).toBe(USE_DAEMON_TAG);
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
function useDaemonByDefault() {
|
|
106
|
-
return Effect.gen(function* () {
|
|
107
|
-
const decision = yield* decideTransport(makeOpts({ socketPath: TEST_SOCKET_PATH }));
|
|
108
|
-
expect(decision).toEqual({
|
|
109
|
-
_tag: USE_DAEMON_TAG,
|
|
110
|
-
socketPath: TEST_SOCKET_PATH,
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
function impersonateBypassesProbe() {
|
|
115
|
-
return Effect.gen(function* () {
|
|
116
|
-
const probe = { count: 0 };
|
|
117
|
-
yield* decideTransport(makeOpts({
|
|
118
|
-
impersonateKey: IMPERSONATE_KEY,
|
|
119
|
-
probeDaemon: countedProbe(probe),
|
|
120
|
-
}));
|
|
121
|
-
expect(probe.count).toBe(0);
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
function expectBypassForKey(key) {
|
|
125
|
-
const probe = { count: 0 };
|
|
126
|
-
const decision = Effect.runSync(decideTransport(makeOpts({
|
|
127
|
-
impersonateKey: key,
|
|
128
|
-
probeDaemon: countedProbe(probe),
|
|
129
|
-
})));
|
|
130
|
-
expect(decision._tag).toBe(USE_DIRECT_TAG);
|
|
131
|
-
expect(probe.count).toBe(0);
|
|
132
|
-
}
|
|
133
|
-
function impersonateBypassesProbeForAnyKey() {
|
|
134
|
-
return Effect.sync(() => {
|
|
135
|
-
fc.assert(fc.property(fc.string({ minLength: 1 }), expectBypassForKey));
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
describe("decideTransport", () => {
|
|
139
|
-
beforeEach(() => {
|
|
140
|
-
vi.unstubAllEnvs();
|
|
141
|
-
});
|
|
142
|
-
afterEach(() => {
|
|
143
|
-
vi.unstubAllEnvs();
|
|
144
|
-
});
|
|
145
|
-
it("impersonate key bypasses daemon probe for any non-empty key", impersonateBypassesProbeForAnyKey);
|
|
146
|
-
it("returns UseDirect{as-flag} when impersonateKey is set", useDirectAsFlag);
|
|
147
|
-
it("returns UseDirect{profile} when profileKey set and no --as", useDirectProfile);
|
|
148
|
-
it("returns UseDirect{env-fallback} when envFallbackKey + daemonReachable=false", useDirectEnvFallback);
|
|
149
|
-
it("returns UseDaemon when envFallbackKey + daemonReachable=true", useDaemonWhenReachable);
|
|
150
|
-
it("returns UseDaemon when neither as-flag nor env-fallback nor profile", useDaemonByDefault);
|
|
151
|
-
it("never invokes probeDaemon when impersonateKey is set (Invariant §4.2)", impersonateBypassesProbe);
|
|
152
|
-
});
|
|
153
|
-
function expectTimeoutForwarded(timeoutMs) {
|
|
154
|
-
const err = tagWsError(TaskList.name, new RpcTimeoutError({ method: TaskList.name, timeoutMs }));
|
|
155
|
-
expect(err).toBeInstanceOf(TransportTimeoutError);
|
|
156
|
-
if (err instanceof TransportTimeoutError) {
|
|
157
|
-
expect(err.timeoutMs).toBe(timeoutMs);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
function timeoutErrorForwardsGeneratedTimeouts() {
|
|
161
|
-
return Effect.sync(() => {
|
|
162
|
-
fc.assert(fc.property(fc.integer({ min: 1, max: 60_000 }), expectTimeoutForwarded));
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
function rpcServerErrorMapsToTransportRpcError() {
|
|
166
|
-
return Effect.sync(() => {
|
|
167
|
-
const err = tagWsError(TaskList.name, new RpcServerError({
|
|
168
|
-
code: SESSION_NOT_FOUND_CODE,
|
|
169
|
-
message: SESSION_NOT_FOUND_MESSAGE,
|
|
170
|
-
}));
|
|
171
|
-
expect(err).toBeInstanceOf(TransportRpcError);
|
|
172
|
-
expect(err._tag).toBe(TRANSPORT_RPC_ERROR_TAG);
|
|
173
|
-
if (err instanceof TransportRpcError) {
|
|
174
|
-
expect(err.code).toBe(SESSION_NOT_FOUND_CODE);
|
|
175
|
-
expect(err.message).toBe(SESSION_NOT_FOUND_MESSAGE);
|
|
176
|
-
}
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
function registeredWireErrorMapsToTransportRpcError() {
|
|
180
|
-
return Effect.sync(() => {
|
|
181
|
-
// A registered domain wire error (decoded from a -32024 frame) carries its
|
|
182
|
-
// numeric code on the constructor, not the instance. It must map to
|
|
183
|
-
// TransportRpcError preserving code/reason — not fall through to decode.
|
|
184
|
-
const err = tagWsError(TaskList.name, new TaskRejectedError({
|
|
185
|
-
message: TaskRejectedError.message,
|
|
186
|
-
data: { taskId: "task-1" },
|
|
187
|
-
}));
|
|
188
|
-
expect(err).toBeInstanceOf(TransportRpcError);
|
|
189
|
-
expect(err._tag).toBe(TRANSPORT_RPC_ERROR_TAG);
|
|
190
|
-
if (err instanceof TransportRpcError) {
|
|
191
|
-
expect(err.code).toBe(TaskRejectedError.code);
|
|
192
|
-
expect(err.message).toBe(TaskRejectedError.message);
|
|
193
|
-
expect(err.data).toEqual({ taskId: "task-1" });
|
|
194
|
-
}
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
function notConnectedMapsToServiceUnreachable() {
|
|
198
|
-
return Effect.sync(() => {
|
|
199
|
-
const err = tagWsError(TaskList.name, new NotConnectedError({ message: NOT_CONNECTED_MESSAGE }));
|
|
200
|
-
expect(err).toBeInstanceOf(ServiceUnreachableError);
|
|
201
|
-
expect(err._tag).toBe(SERVICE_UNREACHABLE_ERROR_TAG);
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
function rpcTimeoutMapsToTransportTimeout() {
|
|
205
|
-
return Effect.sync(() => {
|
|
206
|
-
const err = tagWsError(TaskList.name, new RpcTimeoutError({
|
|
207
|
-
method: TaskList.name,
|
|
208
|
-
timeoutMs: RPC_TIMEOUT_MS,
|
|
209
|
-
}));
|
|
210
|
-
expect(err).toBeInstanceOf(TransportTimeoutError);
|
|
211
|
-
if (err instanceof TransportTimeoutError) {
|
|
212
|
-
expect(err.timeoutMs).toBe(RPC_TIMEOUT_MS);
|
|
213
|
-
}
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
function unknownErrorMapsToTransportDecode() {
|
|
217
|
-
return Effect.sync(() => {
|
|
218
|
-
const err = tagWsError(TaskList.name, {
|
|
219
|
-
message: UNKNOWN_ERROR_MESSAGE,
|
|
220
|
-
});
|
|
221
|
-
expect(err).toBeInstanceOf(TransportDecodeError);
|
|
222
|
-
expect(err._tag).toBe(TRANSPORT_DECODE_ERROR_TAG);
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Regression guard for sbd#198: the original v2 implementation at 069135d
|
|
227
|
-
* used `Effect.runPromise(sendRpc)` inside `Effect.tryPromise`. In Effect 3.21,
|
|
228
|
-
* `runPromise` wraps typed failures in `FiberFailureImpl` (no `_tag`), so
|
|
229
|
-
* `tagWsError`'s switch hit the default branch and emitted `TransportDecodeError`
|
|
230
|
-
* for every ws error. Fixed by code-guard commit ff2de0d; these tests guard
|
|
231
|
-
* against regression to that pattern.
|
|
232
|
-
*
|
|
233
|
-
* `tagWsError` is `@internal`-exported so this suite can reach it directly
|
|
234
|
-
* without a mock WS server.
|
|
235
|
-
*/
|
|
236
|
-
describe("tagWsError — maps ws-client error tags to TransportError variants", () => {
|
|
237
|
-
it("RpcTimeoutError forwards generated timeoutMs values", timeoutErrorForwardsGeneratedTimeouts);
|
|
238
|
-
it("RpcServerError maps to TransportRpcError (not TransportDecodeError)", rpcServerErrorMapsToTransportRpcError);
|
|
239
|
-
it("registered wire error (TaskRejected) maps to TransportRpcError with its static code", registeredWireErrorMapsToTransportRpcError);
|
|
240
|
-
it("NotConnectedError maps to ServiceUnreachableError", notConnectedMapsToServiceUnreachable);
|
|
241
|
-
it("RpcTimeoutError maps to TransportTimeoutError with timeoutMs forwarded", rpcTimeoutMapsToTransportTimeout);
|
|
242
|
-
it("FiberFailureImpl-shaped error (no _tag) maps to TransportDecodeError — not to TransportRpcError", unknownErrorMapsToTransportDecode);
|
|
243
|
-
});
|
|
244
|
-
function explicitKeyIgnoresEnvKey() {
|
|
245
|
-
return Effect.gen(function* () {
|
|
246
|
-
vi.stubEnv("MOLTZAP_API_KEY", LEAKED_ENV_KEY);
|
|
247
|
-
const opts = yield* resolveTransportInputs({
|
|
248
|
-
impersonateKey: EXPLICIT_KEY,
|
|
249
|
-
});
|
|
250
|
-
expect(opts.impersonateKey).toBe(EXPLICIT_KEY);
|
|
251
|
-
expect(opts.profileKey).toBeUndefined();
|
|
252
|
-
});
|
|
253
|
-
}
|
|
254
|
-
function explicitKeyUsesServerUrlEnv() {
|
|
255
|
-
return Effect.gen(function* () {
|
|
256
|
-
vi.stubEnv("MOLTZAP_SERVER_URL", OVERRIDE_SERVER_URL);
|
|
257
|
-
const opts = yield* resolveTransportInputs({ impersonateKey: "k" });
|
|
258
|
-
expect(opts.serverUrl).toBe(OVERRIDE_SERVER_URL);
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
function emptyInputUsesDaemon() {
|
|
262
|
-
return Effect.gen(function* () {
|
|
263
|
-
const opts = yield* resolveTransportInputs({});
|
|
264
|
-
expect(opts.impersonateKey).toBeUndefined();
|
|
265
|
-
expect(opts.profileKey).toBeUndefined();
|
|
266
|
-
expect(opts.socketPath).toBeDefined();
|
|
267
|
-
});
|
|
268
|
-
}
|
|
269
|
-
function directRpcFailurePropagates() {
|
|
270
|
-
return Effect.gen(function* () {
|
|
271
|
-
const opts = {
|
|
272
|
-
impersonateKey: DIRECT_TEST_KEY,
|
|
273
|
-
serverUrl: DIRECT_TEST_SERVER_URL,
|
|
274
|
-
};
|
|
275
|
-
const exit = yield* Transport.pipe(Effect.flatMap((transport) => transport.rpc(TaskList, {})), Effect.exit, Effect.provide(makeTransportLayer(opts)));
|
|
276
|
-
expect(Exit.isFailure(exit)).toBe(true);
|
|
277
|
-
if (Exit.isFailure(exit)) {
|
|
278
|
-
const failure = Cause.failureOption(exit.cause);
|
|
279
|
-
expect(Option.isSome(failure)).toBe(true);
|
|
280
|
-
if (Option.isSome(failure)) {
|
|
281
|
-
expect(failure.value).toBeInstanceOf(TransportRpcError);
|
|
282
|
-
expect(failure.value._tag).toBe(TRANSPORT_RPC_ERROR_TAG);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
|
-
describe("resolveTransportInputs (composition-boundary gate)", () => {
|
|
288
|
-
beforeEach(() => {
|
|
289
|
-
vi.unstubAllEnvs();
|
|
290
|
-
});
|
|
291
|
-
afterEach(() => {
|
|
292
|
-
vi.unstubAllEnvs();
|
|
293
|
-
});
|
|
294
|
-
it("impersonateKey branch does NOT read MOLTZAP_API_KEY env", explicitKeyIgnoresEnvKey);
|
|
295
|
-
it("impersonateKey branch uses MOLTZAP_SERVER_URL if present, else default", explicitKeyUsesServerUrlEnv);
|
|
296
|
-
it("empty input falls through to legacy daemon path (no impersonate, no profile)", emptyInputUsesDaemon);
|
|
297
|
-
});
|
|
298
|
-
/**
|
|
299
|
-
* Composed rpc() failure path — pins the full call chain so a future
|
|
300
|
-
* regression to `Effect.runPromise(sendRpc)` inside `Effect.tryPromise`
|
|
301
|
-
* is caught here, not just in the isolated `tagWsError` suite above.
|
|
302
|
-
*
|
|
303
|
-
* The ws-client mock (module-level `vi.mock("../agent-client.js")`) makes
|
|
304
|
-
* `sendRpc` return `Effect.fail(new RpcServerError(...))` so the test
|
|
305
|
-
* exercises: connect (success) → sendRpc (RpcServerError) → tagWsError
|
|
306
|
-
* → TransportRpcError. A runPromise bridge would wrap RpcServerError in
|
|
307
|
-
* FiberFailureImpl (no _tag) and the result would be TransportDecodeError.
|
|
308
|
-
*/
|
|
309
|
-
describe("makeDirectTransport — composed rpc() failure path", () => {
|
|
310
|
-
it("RpcServerError from sendRpc propagates as TransportRpcError through tagWsError", directRpcFailurePropagates);
|
|
311
|
-
});
|
|
312
|
-
//# sourceMappingURL=transport.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transport.test.js","sourceRoot":"","sources":["../../src/cli/transport.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"filter-equivalence.test.d.ts","sourceRoot":"","sources":["../../../src/notification/__tests__/filter-equivalence.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
/* eslint-disable max-nested-callbacks, max-lines-per-function, sonarjs/max-lines-per-function, agent-code-guard/as-unknown-as, agent-code-guard/async-keyword, jsdoc/text-escaping -- fast-check + Effect.gen + Stream.runForEach nest by construction; the cross-shape brand erasure in `oracle`/`fakeOtherFrame` is the typed→erased boundary the property test deliberately probes; fc.asyncProperty requires an async function */
|
|
2
|
-
/**
|
|
3
|
-
* Filter-equivalence oracle (spec #596 §Acceptance criteria).
|
|
4
|
-
*
|
|
5
|
-
* For any property-generated sequence of inbound notifications (length up
|
|
6
|
-
* to 32, value pool size up to 8) and any property-generated typed
|
|
7
|
-
* predicate `p`, the Stream-based subscribe API output equals the pure-JS
|
|
8
|
-
* reference `frames.filter(frame => def===frame.definition && p(frame.params))`.
|
|
9
|
-
*
|
|
10
|
-
* The oracle is a pure-JS reference implementation embedded in this file
|
|
11
|
-
* (NOT a reference to the deleted three-storage shape).
|
|
12
|
-
*
|
|
13
|
-
* Bounded generators per spec: max array length 32, value pool size 8.
|
|
14
|
-
*
|
|
15
|
-
* The type-guard overload narrows the Stream's payload to
|
|
16
|
-
* `DecodedNotification<D, R>`; the second property-test below pins the
|
|
17
|
-
* runtime narrowing matches the compile-time canary in
|
|
18
|
-
* `snapshot-semantics.types-check.ts → Canary #1`.
|
|
19
|
-
*/
|
|
20
|
-
import { describe, expect, it } from "vitest";
|
|
21
|
-
import * as fc from "fast-check";
|
|
22
|
-
import { Effect, Fiber, Ref, Stream } from "effect";
|
|
23
|
-
import { PresenceChangedNotificationDefinition, } from "@moltzap/protocol";
|
|
24
|
-
import { makeSubscriberRegistry } from "../../runtime/subscribers.js";
|
|
25
|
-
import { subscribe } from "../stream.js";
|
|
26
|
-
const MAX_SEQUENCE_LENGTH = 32;
|
|
27
|
-
const VALUE_POOL_SIZE = 8;
|
|
28
|
-
const PROPERTY_RUN_COUNT = 25;
|
|
29
|
-
const arbAgentId = fc
|
|
30
|
-
.integer({ min: 0, max: VALUE_POOL_SIZE - 1 })
|
|
31
|
-
.map((n) => `agent-${n}`);
|
|
32
|
-
const arbStatus = fc.constantFrom("online", "offline");
|
|
33
|
-
const arbGeneratedFrame = fc.record({
|
|
34
|
-
definitionTag: fc.constantFrom("presence", "other"),
|
|
35
|
-
agentId: arbAgentId,
|
|
36
|
-
status: arbStatus,
|
|
37
|
-
});
|
|
38
|
-
const arbSequence = fc.array(arbGeneratedFrame, {
|
|
39
|
-
minLength: 0,
|
|
40
|
-
maxLength: MAX_SEQUENCE_LENGTH,
|
|
41
|
-
});
|
|
42
|
-
/** Pure-JS reference oracle. Filters by definition identity + predicate. */
|
|
43
|
-
function oracle(frames, predicate) {
|
|
44
|
-
const presenceOnly = frames.filter((f) => f.definitionTag === "presence");
|
|
45
|
-
const presenceParams = presenceOnly.map((f) => ({ agentId: f.agentId, status: f.status }));
|
|
46
|
-
return presenceParams.filter(predicate);
|
|
47
|
-
}
|
|
48
|
-
function decodedPresence(generated) {
|
|
49
|
-
return {
|
|
50
|
-
_tag: "Notification",
|
|
51
|
-
jsonrpc: "2.0",
|
|
52
|
-
definition: PresenceChangedNotificationDefinition,
|
|
53
|
-
method: PresenceChangedNotificationDefinition.name,
|
|
54
|
-
params: {
|
|
55
|
-
agentId: generated.agentId,
|
|
56
|
-
status: generated.status,
|
|
57
|
-
},
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
function fakeOtherFrame(generated) {
|
|
61
|
-
// A frame whose `.definition` reference does NOT match
|
|
62
|
-
// `PresenceChangedNotificationDefinition` — used to verify the registry's
|
|
63
|
-
// definition-identity filter drops it before the predicate runs.
|
|
64
|
-
const raw = {
|
|
65
|
-
_tag: "Notification",
|
|
66
|
-
jsonrpc: "2.0",
|
|
67
|
-
definition: { name: "other/method" },
|
|
68
|
-
method: "other/method",
|
|
69
|
-
params: { agentId: generated.agentId, status: generated.status },
|
|
70
|
-
};
|
|
71
|
-
return raw; // #ignore-sloppy-code[as-unknown-as]: fake-frame for the non-matching arm; the test is precisely about the boundary's behaviour on misshapen frames
|
|
72
|
-
}
|
|
73
|
-
describe("Spec B filter-equivalence oracle", () => {
|
|
74
|
-
it("Stream output equals pure-JS filter oracle for arbitrary inputs", () => fc.assert(fc.asyncProperty(arbSequence, async (frames) => {
|
|
75
|
-
// Property-generated predicate: deterministic, total, varies by
|
|
76
|
-
// status. Closing over an outer counter would invalidate the
|
|
77
|
-
// oracle equivalence.
|
|
78
|
-
const predicate = (params) => params.status === "online";
|
|
79
|
-
const collected = await Effect.runPromise(Effect.gen(function* () {
|
|
80
|
-
const registry = yield* makeSubscriberRegistry();
|
|
81
|
-
const seen = yield* Ref.make([]);
|
|
82
|
-
const fiber = yield* Effect.fork(subscribe(registry, PresenceChangedNotificationDefinition, predicate).pipe(Stream.runForEach((frame) => Ref.update(seen, (xs) => [...xs, frame.params])), Effect.catchAll(() => Effect.void)));
|
|
83
|
-
// Yield once to materialise the Stream's subscription via
|
|
84
|
-
// Stream.async's register callback.
|
|
85
|
-
yield* Effect.yieldNow();
|
|
86
|
-
for (const f of frames) {
|
|
87
|
-
const decoded = f.definitionTag === "presence"
|
|
88
|
-
? decodedPresence(f)
|
|
89
|
-
: fakeOtherFrame(f);
|
|
90
|
-
yield* registry.dispatch(decoded);
|
|
91
|
-
}
|
|
92
|
-
yield* Effect.yieldNow();
|
|
93
|
-
yield* registry.closeAll;
|
|
94
|
-
yield* Fiber.join(fiber);
|
|
95
|
-
return yield* Ref.get(seen);
|
|
96
|
-
}));
|
|
97
|
-
const expected = oracle(frames, predicate);
|
|
98
|
-
expect(collected).toEqual(expected);
|
|
99
|
-
}), { numRuns: PROPERTY_RUN_COUNT }));
|
|
100
|
-
it("user-defined type guard narrows the Stream payload", () => Effect.runPromise(Effect.gen(function* () {
|
|
101
|
-
const registry = yield* makeSubscriberRegistry();
|
|
102
|
-
const seen = yield* Ref.make([]);
|
|
103
|
-
const isOnline = (params) => params.status === "online";
|
|
104
|
-
const fiber = yield* Effect.fork(subscribe(registry, PresenceChangedNotificationDefinition, isOnline).pipe(Stream.runForEach((frame) => Ref.update(seen, (xs) => [...xs, frame.params])), Effect.catchAll(() => Effect.void)));
|
|
105
|
-
yield* Effect.yieldNow();
|
|
106
|
-
yield* registry.dispatch(decodedPresence({
|
|
107
|
-
definitionTag: "presence",
|
|
108
|
-
agentId: "agent-0",
|
|
109
|
-
status: "online",
|
|
110
|
-
}));
|
|
111
|
-
yield* registry.dispatch(decodedPresence({
|
|
112
|
-
definitionTag: "presence",
|
|
113
|
-
agentId: "agent-1",
|
|
114
|
-
status: "offline",
|
|
115
|
-
}));
|
|
116
|
-
yield* Effect.yieldNow();
|
|
117
|
-
yield* registry.closeAll;
|
|
118
|
-
yield* Fiber.join(fiber);
|
|
119
|
-
const observed = yield* Ref.get(seen);
|
|
120
|
-
expect(observed).toEqual([{ agentId: "agent-0", status: "online" }]);
|
|
121
|
-
})));
|
|
122
|
-
});
|
|
123
|
-
//# sourceMappingURL=filter-equivalence.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"filter-equivalence.test.js","sourceRoot":"","sources":["../../../src/notification/__tests__/filter-equivalence.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot-semantics.test.d.ts","sourceRoot":"","sources":["../../../src/notification/__tests__/snapshot-semantics.test.ts"],"names":[],"mappings":""}
|