@moltzap/client 2026.528.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 -38
- 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/presence.d.ts +0 -11
- package/dist/cli/commands/presence.d.ts.map +0 -1
- package/dist/cli/commands/presence.js +0 -33
- package/dist/cli/commands/presence.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,5 +0,0 @@
|
|
|
1
|
-
import { Effect, Scope } from "effect";
|
|
2
|
-
export declare function composeServiceTeardown(serviceScope: Scope.CloseableScope | null, client: {
|
|
3
|
-
readonly close: () => Effect.Effect<void, never>;
|
|
4
|
-
} | null): Effect.Effect<void, never>;
|
|
5
|
-
//# sourceMappingURL=service-teardown.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service-teardown.d.ts","sourceRoot":"","sources":["../../src/runtime/service-teardown.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAQ,KAAK,EAAE,MAAM,QAAQ,CAAC;AA8B7C,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,KAAK,CAAC,cAAc,GAAG,IAAI,EACzC,MAAM,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;CAAE,GAAG,IAAI,GAClE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAQ5B"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/* eslint-disable agent-code-guard/no-conditional-chaining -- composeServiceTeardown IS the resolution site for nullable scope+client inputs; the `closeXxxIfPresent` helpers each narrow their one nullable arg to a concrete `Effect`, so by the time `zipRight` runs every value is fully resolved. The rule fires on the parameter declarations (regarding them as "carriers"), but pushing the null-narrowing to every caller of `MoltZapService.close` would duplicate the conditional shape across the package. */
|
|
2
|
-
import { Effect, Exit, Scope } from "effect";
|
|
3
|
-
/**
|
|
4
|
-
* Build the close-order teardown Effect for `MoltZapService.close`:
|
|
5
|
-
* close the service-owned scope (which interrupts the
|
|
6
|
-
* `subscribeAll → Stream.runForEach` fan-out fiber) BEFORE invoking the
|
|
7
|
-
* ws-client's `close()`. Exposed as a top-level pure helper so the
|
|
8
|
-
* ordering can be exercised by a regression test without spinning up
|
|
9
|
-
* the full service. Codex r0 caught the original two-`runFork` race
|
|
10
|
-
* here; the regression test in `service.test.ts` pins the structural
|
|
11
|
-
* fix (P2-4 r1 cleanup).
|
|
12
|
-
*
|
|
13
|
-
* The chain is single-fork by construction (`Effect.zipRight`): the
|
|
14
|
-
* ws-client `close()` does not begin until the scope finalizer chain
|
|
15
|
-
* has completed.
|
|
16
|
-
*/
|
|
17
|
-
function closeScopeIfPresent(serviceScope) {
|
|
18
|
-
if (serviceScope === null)
|
|
19
|
-
return Effect.void;
|
|
20
|
-
return Scope.close(serviceScope, Exit.void);
|
|
21
|
-
}
|
|
22
|
-
function closeClientIfPresent(client) {
|
|
23
|
-
if (client === null)
|
|
24
|
-
return Effect.void;
|
|
25
|
-
return client.close();
|
|
26
|
-
}
|
|
27
|
-
export function composeServiceTeardown(serviceScope, client) {
|
|
28
|
-
// Resolve each optional input to a concrete Effect via the dedicated
|
|
29
|
-
// `closeXxxIfPresent` helpers, then sequence with `zipRight`. Single-fork
|
|
30
|
-
// sequencing: ws-client `close()` does not begin until the scope
|
|
31
|
-
// finalizer chain has completed.
|
|
32
|
-
const closeScope = closeScopeIfPresent(serviceScope);
|
|
33
|
-
const closeClient = closeClientIfPresent(client);
|
|
34
|
-
return closeScope.pipe(Effect.zipRight(closeClient));
|
|
35
|
-
}
|
|
36
|
-
//# sourceMappingURL=service-teardown.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service-teardown.js","sourceRoot":"","sources":["../../src/runtime/service-teardown.ts"],"names":[],"mappings":"AAAA,yfAAyf;AACzf,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE7C;;;;;;;;;;;;;GAaG;AACH,SAAS,mBAAmB,CAC1B,YAAyC;IAEzC,IAAI,YAAY,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IAC9C,OAAO,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,oBAAoB,CAC3B,MAAmE;IAEnE,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IACxC,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,YAAyC,EACzC,MAAmE;IAEnE,qEAAqE;IACrE,0EAA0E;IAC1E,iEAAiE;IACjE,iCAAiC;IACjC,MAAM,UAAU,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACjD,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service-teardown.test.d.ts","sourceRoot":"","sources":["../../src/runtime/service-teardown.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Spec B (#596) close-ordering regression test (P2-4 r1 cleanup).
|
|
3
|
-
*
|
|
4
|
-
* `MoltZapService.close` MUST close the service-owned scope (which holds
|
|
5
|
-
* the `subscribeAll → Stream.runForEach` fan-out fiber) BEFORE invoking
|
|
6
|
-
* the ws-client's `close()`. Codex r0 caught the original two-`runFork`
|
|
7
|
-
* race; the structural fix lives in `composeServiceTeardown` and these
|
|
8
|
-
* tests pin the ordering so a future refactor can't regress.
|
|
9
|
-
*
|
|
10
|
-
* `composeServiceTeardown` is a pure Effect producer: it composes the
|
|
11
|
-
* close chain but does NOT run it. The tests await the returned Effect
|
|
12
|
-
* via `yield*`, which means by the time we read `events` the chain has
|
|
13
|
-
* fully settled — no `Effect.runFork` race in the test harness either.
|
|
14
|
-
*/
|
|
15
|
-
/* eslint-disable agent-code-guard/finalizer-requires-scope -- scope is the test artifact closed explicitly via composeServiceTeardown(scope, ...); no enclosing Effect.scoped frame applies here by design */
|
|
16
|
-
import { describe, expect, it } from "vitest";
|
|
17
|
-
import { Effect, Scope } from "effect";
|
|
18
|
-
import { composeServiceTeardown } from "./service-teardown.js";
|
|
19
|
-
function makeRecorder() {
|
|
20
|
-
const events = [];
|
|
21
|
-
const fakeClient = {
|
|
22
|
-
close: () => Effect.sync(() => {
|
|
23
|
-
events.push("client");
|
|
24
|
-
}),
|
|
25
|
-
};
|
|
26
|
-
return { events, fakeClient };
|
|
27
|
-
}
|
|
28
|
-
function makeScopeRecorder(events) {
|
|
29
|
-
// Build a `Scope.CloseableScope` whose finalizer pushes "scope" — mirrors
|
|
30
|
-
// the runtime shape (the fan-out fiber is installed as a finalizer on
|
|
31
|
-
// `serviceScope` via `Effect.forkIn` in `MoltZapService.connect`). The
|
|
32
|
-
// scope is the artifact under test and is closed explicitly via
|
|
33
|
-
// `composeServiceTeardown`; no enclosing `Effect.scoped` is needed.
|
|
34
|
-
return Effect.gen(function* () {
|
|
35
|
-
const scope = yield* Scope.make();
|
|
36
|
-
yield* Scope.addFinalizer(scope, Effect.sync(() => {
|
|
37
|
-
events.push("scope");
|
|
38
|
-
}));
|
|
39
|
-
return scope;
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
function teardownOrderingCloses() {
|
|
43
|
-
return Effect.runPromise(Effect.gen(function* () {
|
|
44
|
-
const { events, fakeClient } = makeRecorder();
|
|
45
|
-
const scope = yield* makeScopeRecorder(events);
|
|
46
|
-
yield* composeServiceTeardown(scope, fakeClient);
|
|
47
|
-
expect(events).toEqual(["scope", "client"]);
|
|
48
|
-
}));
|
|
49
|
-
}
|
|
50
|
-
function teardownNullScopeRunsClient() {
|
|
51
|
-
return Effect.runPromise(Effect.gen(function* () {
|
|
52
|
-
const { events, fakeClient } = makeRecorder();
|
|
53
|
-
yield* composeServiceTeardown(null, fakeClient);
|
|
54
|
-
expect(events).toEqual(["client"]);
|
|
55
|
-
}));
|
|
56
|
-
}
|
|
57
|
-
function teardownNullClientClosesScope() {
|
|
58
|
-
return Effect.runPromise(Effect.gen(function* () {
|
|
59
|
-
const events = [];
|
|
60
|
-
const scope = yield* makeScopeRecorder(events);
|
|
61
|
-
yield* composeServiceTeardown(scope, null);
|
|
62
|
-
expect(events).toEqual(["scope"]);
|
|
63
|
-
}));
|
|
64
|
-
}
|
|
65
|
-
function teardownBothNullIsNoop() {
|
|
66
|
-
return Effect.runPromise(Effect.gen(function* () {
|
|
67
|
-
yield* composeServiceTeardown(null, null);
|
|
68
|
-
// The Effect completed without failing — that IS the assertion. The
|
|
69
|
-
// explicit expect anchors the test name; no value to compare beyond
|
|
70
|
-
// "no throw."
|
|
71
|
-
expect(true).toBe(true);
|
|
72
|
-
}));
|
|
73
|
-
}
|
|
74
|
-
describe("composeServiceTeardown — Spec B close ordering (P2-4)", () => {
|
|
75
|
-
it("closes service-owned scope BEFORE invoking ws-client.close()", teardownOrderingCloses);
|
|
76
|
-
it("tolerates null scope (calls only client.close())", teardownNullScopeRunsClient);
|
|
77
|
-
it("tolerates null client (closes only the scope)", teardownNullClientClosesScope);
|
|
78
|
-
it("no-op when both inputs are null", teardownBothNullIsNoop);
|
|
79
|
-
});
|
|
80
|
-
//# sourceMappingURL=service-teardown.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service-teardown.test.js","sourceRoot":"","sources":["../../src/runtime/service-teardown.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Per-subscription notification registry for `MoltZapAgentClient`.
|
|
3
|
-
*
|
|
4
|
-
* Responsibility: own the list of live subscriptions and fan each inbound
|
|
5
|
-
* JSON-RPC notification out to every subscription whose definition (and
|
|
6
|
-
* optional typed refinement predicate) matches. Implements spec #596
|
|
7
|
-
* (notification consumption consolidation) via the AD1 path-(a) Stream.async
|
|
8
|
-
* design (architect plan §3, §5.5).
|
|
9
|
-
*
|
|
10
|
-
* Storage shape (post-Spec B):
|
|
11
|
-
* - Subscriptions are records of typed `{onFrame, onClose}` callbacks
|
|
12
|
-
* (NOT queues / Take items / Stream.fromQueue). `notification/stream.ts`
|
|
13
|
-
* owns Stream construction via `Stream.async`; this module owns the
|
|
14
|
-
* register/dispatch/closeAll lifecycle.
|
|
15
|
-
* - The dispatch path snapshots `subsRef` at iteration start (AD1
|
|
16
|
-
* snapshot-semantic contract from spec #222 §5.3 OQ-3 / spec #596
|
|
17
|
-
* "Stream lifecycle contract" row).
|
|
18
|
-
* - `closeAll` invokes each live sub's `onClose(new NotConnectedError(...))`
|
|
19
|
-
* before clearing `subsRef` — deterministic typed-failure delivery
|
|
20
|
-
* replaces the deleted `failAllNotificationWaiters` semantic.
|
|
21
|
-
*
|
|
22
|
-
* Filter grammar (post-Spec B):
|
|
23
|
-
* - Subscription matches a frame iff `sub.definition === frame.definition`.
|
|
24
|
-
* - Optional `refinement` is a typed predicate over the frame's params
|
|
25
|
-
* (erased to the union type `ErasedNotificationRefinement` at the
|
|
26
|
-
* storage boundary; consumers receive the typed-narrowed shape via
|
|
27
|
-
* `Stream.async`'s typed `emit.single` callback inside
|
|
28
|
-
* `notification/stream.ts`).
|
|
29
|
-
* - The three-field `SubscriptionFilter` grammar is deleted (spec #596
|
|
30
|
-
* Goal #3 + §"Acceptance criteria" delete sweep). Multi-definition
|
|
31
|
-
* fan-out becomes `Stream.mergeAll([subscribe(d1), subscribe(d2)])`.
|
|
32
|
-
*/
|
|
33
|
-
import { Brand, Effect } from "effect";
|
|
34
|
-
import { NotConnectedError, type AnyNotificationDefinition, type DecodedNotification, type NotificationParamsOf } from "@moltzap/protocol";
|
|
35
|
-
/** Branded identifier for a subscription handle. Minted by `register`. */
|
|
36
|
-
type SubscriptionId = string & Brand.Brand<"SubscriptionId">;
|
|
37
|
-
/**
|
|
38
|
-
* Per-subscription callback delivered each matching frame. Implemented in
|
|
39
|
-
* `notification/stream.ts` as `(frame) => Effect.sync(() => emit.single(frame))`.
|
|
40
|
-
* Returning `Effect<void, never>` keeps the dispatch path total — the
|
|
41
|
-
* Stream-side `emit.single` cannot fail synchronously.
|
|
42
|
-
*/
|
|
43
|
-
type SubscriberFrameCallback = (frame: DecodedNotification<AnyNotificationDefinition>) => Effect.Effect<void, never>;
|
|
44
|
-
/**
|
|
45
|
-
* Per-subscription callback invoked exactly once when the client transitions
|
|
46
|
-
* to its terminal closed state. Implemented in `notification/stream.ts` as
|
|
47
|
-
* `(cause) => Effect.sync(() => emit.fail(cause))`.
|
|
48
|
-
*/
|
|
49
|
-
type SubscriberCloseCallback = (cause: NotConnectedError) => Effect.Effect<void, never>;
|
|
50
|
-
/**
|
|
51
|
-
* Handle returned by `register`. `unregister` is `Effect<void, never>`: it
|
|
52
|
-
* is idempotent and total. Calling `unregister` a second time, or after
|
|
53
|
-
* `closeAll`, is a no-op.
|
|
54
|
-
*/
|
|
55
|
-
interface SubscriptionHandle {
|
|
56
|
-
readonly id: SubscriptionId;
|
|
57
|
-
readonly unregister: Effect.Effect<void, never>;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Subscriber registry. One instance per `MoltZapAgentClient`, created at
|
|
61
|
-
* construction time and owned by the client.
|
|
62
|
-
*
|
|
63
|
-
* `register<D>` accepts typed `onFrame` / `onClose` callbacks for the
|
|
64
|
-
* specific definition `D`; internally the registry erases them to the
|
|
65
|
-
* `Subscriber{Frame,Close}Callback` union shape so a single iteration
|
|
66
|
-
* can dispatch over heterogeneous subscriptions without per-`D`
|
|
67
|
-
* dispatch tables.
|
|
68
|
-
*
|
|
69
|
-
* Subscription lifecycle, paired with `Stream.async` consumers in
|
|
70
|
-
* `notification/stream.ts`:
|
|
71
|
-
*
|
|
72
|
-
* ```mermaid
|
|
73
|
-
* sequenceDiagram
|
|
74
|
-
* participant caller
|
|
75
|
-
* participant ws as MoltZapAgentClient
|
|
76
|
-
* participant stream as notification/stream.ts
|
|
77
|
-
* participant registry as SubscriberRegistry
|
|
78
|
-
* participant reader as WS reader fiber
|
|
79
|
-
* participant server
|
|
80
|
-
*
|
|
81
|
-
* caller->>ws: client.subscribe(def, refinement?)
|
|
82
|
-
* Note over ws: pure — returns Stream value, no I/O
|
|
83
|
-
* ws-->>caller: Stream<DecodedNotification<D>, NotConnectedError>
|
|
84
|
-
* caller->>caller: Stream.runForEach / runHead
|
|
85
|
-
* Note over stream: materialization runs `Stream.async`'s register synchronously
|
|
86
|
-
* stream->>registry: register(def, refinement, {onFrame, onClose})
|
|
87
|
-
* Note over registry: Ref.update(subsRef, append live)<br>return {unregister}
|
|
88
|
-
* Note over stream: onFrame → emit.single<br>onClose → emit.fail<br>finalizer → handle.unregister
|
|
89
|
-
* server->>reader: notification frame
|
|
90
|
-
* reader->>ws: handleIncoming → handleDecodedNotification
|
|
91
|
-
* ws->>registry: dispatch(decoded)
|
|
92
|
-
* Note over registry: snapshot = Ref.get(subsRef)<br>for sub in snapshot — match def + refinement → onFrame
|
|
93
|
-
* registry-->>caller: emit.single — runForEach handler fires
|
|
94
|
-
* caller->>stream: scope ends
|
|
95
|
-
* stream->>registry: handle.unregister — Ref.update drop
|
|
96
|
-
* ws->>registry: closeAll on client.close
|
|
97
|
-
* Note over registry: every live sub → onClose(NotConnectedError)<br>Ref.set(subsRef, [])
|
|
98
|
-
* ```
|
|
99
|
-
*
|
|
100
|
-
* AD1 snapshot semantic: `dispatch` snapshots `subsRef` at iteration
|
|
101
|
-
* start and never re-reads mid-loop. In-flight dispatch of frame N is
|
|
102
|
-
* not interrupted by an unsubscribe that lands during frame N. The
|
|
103
|
-
* `snapshot-semantics` tests pin this invariant end-to-end.
|
|
104
|
-
*
|
|
105
|
-
* Reconnect: subscriptions survive the reconnect path. The new socket
|
|
106
|
-
* resumes feeding `onFrame`; frames dropped at the transport during
|
|
107
|
-
* the disconnect window are a wire-protocol limitation (no per-frame
|
|
108
|
-
* ack at this layer). Terminal close fires `closeAll` →
|
|
109
|
-
* `emit.fail(NotConnectedError)` to every in-flight Stream.
|
|
110
|
-
*
|
|
111
|
-
* Subscribe-before-trigger: when a caller needs to observe a
|
|
112
|
-
* notification that follows a specific RPC, materialise the Stream
|
|
113
|
-
* BEFORE issuing the trigger — `Effect.fork(subscribe(def).pipe(...))`
|
|
114
|
-
* then `client.sendRpc(triggerDef, params)` then `Fiber.join`.
|
|
115
|
-
* Subscribing after the trigger is racy.
|
|
116
|
-
*/
|
|
117
|
-
export interface SubscriberRegistry {
|
|
118
|
-
readonly register: <D extends AnyNotificationDefinition>(definition: D, refinement: ((params: NotificationParamsOf<D>) => boolean) | undefined, callbacks: {
|
|
119
|
-
readonly onFrame: (frame: DecodedNotification<D>) => Effect.Effect<void, never>;
|
|
120
|
-
readonly onClose: SubscriberCloseCallback;
|
|
121
|
-
}) => Effect.Effect<SubscriptionHandle, never>;
|
|
122
|
-
/**
|
|
123
|
-
* `subscribeAll` surface (spec #596 Goal #2). Registers a broad-union
|
|
124
|
-
* subscription that fires for every inbound frame regardless of
|
|
125
|
-
* definition. The optional `refinement` predicate runs against the
|
|
126
|
-
* full `DecodedNotification<AnyNotificationDefinition>` shape.
|
|
127
|
-
*
|
|
128
|
-
* Stored in a sibling `subsAllRef` list — kept off `subsRef` so the
|
|
129
|
-
* per-definition dispatch loop in `dispatch` stays a simple
|
|
130
|
-
* `definition ===` check without a per-sub broad-union escape branch.
|
|
131
|
-
*/
|
|
132
|
-
readonly registerAll: (refinement: ((notification: DecodedNotification<AnyNotificationDefinition>) => boolean) | undefined, callbacks: {
|
|
133
|
-
readonly onFrame: SubscriberFrameCallback;
|
|
134
|
-
readonly onClose: SubscriberCloseCallback;
|
|
135
|
-
}) => Effect.Effect<SubscriptionHandle, never>;
|
|
136
|
-
/**
|
|
137
|
-
* Fan an inbound notification out to every matching subscription. Called
|
|
138
|
-
* from `MoltZapAgentClient.handleDecodedNotification`. Snapshot semantic:
|
|
139
|
-
* unsubscribes that commit mid-dispatch observe NEXT-frame semantics
|
|
140
|
-
* (AD1 path-(a) contract).
|
|
141
|
-
*/
|
|
142
|
-
readonly dispatch: (frame: DecodedNotification<AnyNotificationDefinition>) => Effect.Effect<void, never>;
|
|
143
|
-
/**
|
|
144
|
-
* Terminal close. Invokes every live sub's `onClose` callback (which
|
|
145
|
-
* `emit.fail(cause)`s the corresponding consumer Stream), then clears
|
|
146
|
-
* both `subsRef` and `subsAllRef`. Idempotent.
|
|
147
|
-
*/
|
|
148
|
-
readonly closeAll: Effect.Effect<void, never>;
|
|
149
|
-
}
|
|
150
|
-
export declare function makeSubscriberRegistry(): Effect.Effect<SubscriberRegistry, never>;
|
|
151
|
-
export {};
|
|
152
|
-
//# sourceMappingURL=subscribers.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subscribers.d.ts","sourceRoot":"","sources":["../../src/runtime/subscribers.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAO,MAAM,QAAQ,CAAC;AAC5C,OAAO,EACL,iBAAiB,EACjB,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EAC1B,MAAM,mBAAmB,CAAC;AAE3B,0EAA0E;AAC1E,KAAK,cAAc,GAAG,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;AAc7D;;;;;GAKG;AACH,KAAK,uBAAuB,GAAG,CAC7B,KAAK,EAAE,mBAAmB,CAAC,yBAAyB,CAAC,KAClD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAEhC;;;;GAIG;AACH,KAAK,uBAAuB,GAAG,CAC7B,KAAK,EAAE,iBAAiB,KACrB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAehC;;;;GAIG;AACH,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;CACjD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,SAAS,yBAAyB,EACrD,UAAU,EAAE,CAAC,EACb,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,GAAG,SAAS,EACtE,SAAS,EAAE;QACT,QAAQ,CAAC,OAAO,EAAE,CAChB,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAC1B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAChC,QAAQ,CAAC,OAAO,EAAE,uBAAuB,CAAC;KAC3C,KACE,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAE9C;;;;;;;;;OASG;IACH,QAAQ,CAAC,WAAW,EAAE,CACpB,UAAU,EACN,CAAC,CACC,YAAY,EAAE,mBAAmB,CAAC,yBAAyB,CAAC,KACzD,OAAO,CAAC,GACb,SAAS,EACb,SAAS,EAAE;QACT,QAAQ,CAAC,OAAO,EAAE,uBAAuB,CAAC;QAC1C,QAAQ,CAAC,OAAO,EAAE,uBAAuB,CAAC;KAC3C,KACE,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAE9C;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,CACjB,KAAK,EAAE,mBAAmB,CAAC,yBAAyB,CAAC,KAClD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAEhC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;CAC/C;AA8RD,wBAAgB,sBAAsB,IAAI,MAAM,CAAC,MAAM,CACrD,kBAAkB,EAClB,KAAK,CACN,CAcA"}
|
|
@@ -1,222 +0,0 @@
|
|
|
1
|
-
/* eslint-disable jsdoc/text-escaping -- JSDoc references to generic types like `NotificationParamsOf<D>` use the natural angle-bracket form (TS source style) inside backtick-fenced code spans; the lint rule's pre-render check fires false positives on these multi-line spans. Matches the precedent in filter-equivalence.test.ts. */
|
|
2
|
-
/**
|
|
3
|
-
* Per-subscription notification registry for `MoltZapAgentClient`.
|
|
4
|
-
*
|
|
5
|
-
* Responsibility: own the list of live subscriptions and fan each inbound
|
|
6
|
-
* JSON-RPC notification out to every subscription whose definition (and
|
|
7
|
-
* optional typed refinement predicate) matches. Implements spec #596
|
|
8
|
-
* (notification consumption consolidation) via the AD1 path-(a) Stream.async
|
|
9
|
-
* design (architect plan §3, §5.5).
|
|
10
|
-
*
|
|
11
|
-
* Storage shape (post-Spec B):
|
|
12
|
-
* - Subscriptions are records of typed `{onFrame, onClose}` callbacks
|
|
13
|
-
* (NOT queues / Take items / Stream.fromQueue). `notification/stream.ts`
|
|
14
|
-
* owns Stream construction via `Stream.async`; this module owns the
|
|
15
|
-
* register/dispatch/closeAll lifecycle.
|
|
16
|
-
* - The dispatch path snapshots `subsRef` at iteration start (AD1
|
|
17
|
-
* snapshot-semantic contract from spec #222 §5.3 OQ-3 / spec #596
|
|
18
|
-
* "Stream lifecycle contract" row).
|
|
19
|
-
* - `closeAll` invokes each live sub's `onClose(new NotConnectedError(...))`
|
|
20
|
-
* before clearing `subsRef` — deterministic typed-failure delivery
|
|
21
|
-
* replaces the deleted `failAllNotificationWaiters` semantic.
|
|
22
|
-
*
|
|
23
|
-
* Filter grammar (post-Spec B):
|
|
24
|
-
* - Subscription matches a frame iff `sub.definition === frame.definition`.
|
|
25
|
-
* - Optional `refinement` is a typed predicate over the frame's params
|
|
26
|
-
* (erased to the union type `ErasedNotificationRefinement` at the
|
|
27
|
-
* storage boundary; consumers receive the typed-narrowed shape via
|
|
28
|
-
* `Stream.async`'s typed `emit.single` callback inside
|
|
29
|
-
* `notification/stream.ts`).
|
|
30
|
-
* - The three-field `SubscriptionFilter` grammar is deleted (spec #596
|
|
31
|
-
* Goal #3 + §"Acceptance criteria" delete sweep). Multi-definition
|
|
32
|
-
* fan-out becomes `Stream.mergeAll([subscribe(d1), subscribe(d2)])`.
|
|
33
|
-
*/
|
|
34
|
-
import { Brand, Effect, Ref } from "effect";
|
|
35
|
-
import { NotConnectedError, } from "@moltzap/protocol";
|
|
36
|
-
const SubscriptionIdBrand = Brand.nominal();
|
|
37
|
-
function nextSubscriptionId(counterRef) {
|
|
38
|
-
return Ref.updateAndGet(counterRef, (count) => count + 1).pipe(Effect.map((count) => SubscriptionIdBrand(`sub-${count}`)));
|
|
39
|
-
}
|
|
40
|
-
function appendSubscription(subsRef, live) {
|
|
41
|
-
return Ref.update(subsRef, (subscriptions) => [...subscriptions, live]);
|
|
42
|
-
}
|
|
43
|
-
function removeSubscription(subsRef, id) {
|
|
44
|
-
return Ref.update(subsRef, (subscriptions) => subscriptions.filter((subscription) => subscription.id !== id));
|
|
45
|
-
}
|
|
46
|
-
function dispatchToSubscriber(sub, frame) {
|
|
47
|
-
return Effect.suspend(() => sub.onFrame(frame)).pipe(Effect.catchAllDefect((err) => Effect.logWarning("subscriber onFrame callback threw", err)));
|
|
48
|
-
}
|
|
49
|
-
function closeSubscriber(sub, cause) {
|
|
50
|
-
return Effect.suspend(() => sub.onClose(cause)).pipe(Effect.catchAllDefect((err) => Effect.logWarning("subscriber onClose callback threw", err)));
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Construct an empty registry. Called once from the `MoltZapAgentClient`
|
|
54
|
-
* constructor.
|
|
55
|
-
*
|
|
56
|
-
* Implementation notes:
|
|
57
|
-
* - `subsRef: Ref<ReadonlyArray<LiveSubscription>>` keyed by registration
|
|
58
|
-
* order. Append-on-register, filter-on-unregister keeps the dispatch
|
|
59
|
-
* path O(N) with N = live subscription count.
|
|
60
|
-
* - `dispatch` snapshots `subsRef` at iteration start. An unregister
|
|
61
|
-
* mid-dispatch mutates the Ref but the in-flight iteration walks the
|
|
62
|
-
* snapshot (AD1 path-(a) snapshot semantic).
|
|
63
|
-
* - `closeAll` invokes each live sub's `onClose` in iteration order
|
|
64
|
-
* before clearing the ref. `Stream.async`'s `emit.fail` is the
|
|
65
|
-
* deterministic in-Effect mechanism that propagates the typed
|
|
66
|
-
* failure to each consumer.
|
|
67
|
-
*/
|
|
68
|
-
function appendBroadSubscription(subsAllRef, live) {
|
|
69
|
-
return Ref.update(subsAllRef, (subscriptions) => [...subscriptions, live]);
|
|
70
|
-
}
|
|
71
|
-
function removeBroadSubscription(subsAllRef, id) {
|
|
72
|
-
return Ref.update(subsAllRef, (subscriptions) => subscriptions.filter((subscription) => subscription.id !== id));
|
|
73
|
-
}
|
|
74
|
-
function dispatchToBroadSubscriber(sub, frame) {
|
|
75
|
-
return Effect.suspend(() => sub.onFrame(frame)).pipe(Effect.catchAllDefect((err) => Effect.logWarning("subscribeAll onFrame callback threw", err)));
|
|
76
|
-
}
|
|
77
|
-
function closeBroadSubscriber(sub, cause) {
|
|
78
|
-
return Effect.suspend(() => sub.onClose(cause)).pipe(Effect.catchAllDefect((err) => Effect.logWarning("subscribeAll onClose callback threw", err)));
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Single named typed→erased adapter for the refinement predicate. The
|
|
82
|
-
* `Stream.async` callback inside `notification/stream.ts` keeps the typed
|
|
83
|
-
* shape for the consumer's typed payload; storage in `LiveSubscription`
|
|
84
|
-
* uses the broad-union erased form. This is the only place the typed →
|
|
85
|
-
* erased boundary crosses, so the cast is acknowledged with an explicit
|
|
86
|
-
* lint suppression.
|
|
87
|
-
*/
|
|
88
|
-
function eraseRefinement(refinement) {
|
|
89
|
-
if (refinement === undefined)
|
|
90
|
-
return undefined;
|
|
91
|
-
// The typed→erased boundary is by construction safe: the registry's
|
|
92
|
-
// `dispatch` loop only invokes the refinement with frames whose
|
|
93
|
-
// `definition === sub.definition`, so `frame.params` always satisfies
|
|
94
|
-
// `NotificationParamsOf<D>`.
|
|
95
|
-
// eslint-disable-next-line agent-code-guard/as-unknown-as -- documented typed→erased boundary, see comment above
|
|
96
|
-
return refinement; // #ignore-sloppy-code[as-unknown-as]: typed→erased boundary for heterogeneous registry storage; dispatch loop enforces definition identity before invocation
|
|
97
|
-
}
|
|
98
|
-
function buildRegister(subsRef, counterRef) {
|
|
99
|
-
return (definition, refinement, callbacks) => Effect.gen(function* () {
|
|
100
|
-
const id = yield* nextSubscriptionId(counterRef);
|
|
101
|
-
const erasedRefinement = eraseRefinement(refinement);
|
|
102
|
-
const live = {
|
|
103
|
-
id,
|
|
104
|
-
definition,
|
|
105
|
-
...(erasedRefinement !== undefined
|
|
106
|
-
? { refinement: erasedRefinement }
|
|
107
|
-
: {}),
|
|
108
|
-
onFrame: callbacks.onFrame,
|
|
109
|
-
onClose: callbacks.onClose,
|
|
110
|
-
};
|
|
111
|
-
yield* appendSubscription(subsRef, live);
|
|
112
|
-
const unregister = removeSubscription(subsRef, id);
|
|
113
|
-
return { id, unregister };
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
function buildRegisterAll(subsAllRef, counterRef) {
|
|
117
|
-
return (refinement, callbacks) => Effect.gen(function* () {
|
|
118
|
-
const id = yield* nextSubscriptionId(counterRef);
|
|
119
|
-
const live = {
|
|
120
|
-
id,
|
|
121
|
-
...(refinement !== undefined ? { refinement } : {}),
|
|
122
|
-
onFrame: callbacks.onFrame,
|
|
123
|
-
onClose: callbacks.onClose,
|
|
124
|
-
};
|
|
125
|
-
yield* appendBroadSubscription(subsAllRef, live);
|
|
126
|
-
const unregister = removeBroadSubscription(subsAllRef, id);
|
|
127
|
-
return { id, unregister };
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Run a user-supplied refinement predicate with throw isolation. A throw
|
|
132
|
-
* inside the predicate must NOT defect the dispatch Effect (which would
|
|
133
|
-
* starve sibling subscribers of the in-flight frame, AD1 path-(a) snapshot
|
|
134
|
-
* contract). Treat any throw as "predicate said false" — the frame is
|
|
135
|
-
* filtered out for this subscriber, the throw is logged, dispatch
|
|
136
|
-
* continues with the next subscription in the snapshot.
|
|
137
|
-
*
|
|
138
|
-
* The warning is emitted via `Effect.runFork(Effect.logWarning(…))`
|
|
139
|
-
* (detached from the dispatch fiber's span/annotations) so the
|
|
140
|
-
* synchronous filter returned by `subAcceptsFrame` / `broadAcceptsFrame`
|
|
141
|
-
* stays synchronous — pulling logging into the surrounding `Effect.gen`
|
|
142
|
-
* would either (a) require the predicate to become an Effect (forcing
|
|
143
|
-
* every caller to `yield*`) or (b) accumulate warnings in a Ref and
|
|
144
|
-
* re-emit post-dispatch (extra state for a non-load-bearing log). The
|
|
145
|
-
* detached log is acceptable for predicate misuse — a noisy warning
|
|
146
|
-
* that names the call site (`subscribe` vs `subscribeAll`) is sufficient
|
|
147
|
-
* signal for the application author to find the throw in their
|
|
148
|
-
* refinement. Codex r2 P3-1 documented this trade-off rather than
|
|
149
|
-
* restructuring.
|
|
150
|
-
*/
|
|
151
|
-
function safePredicate(predicate, params, context) {
|
|
152
|
-
try {
|
|
153
|
-
return predicate(params);
|
|
154
|
-
}
|
|
155
|
-
catch (err) {
|
|
156
|
-
Effect.runFork(Effect.logWarning(`${context} refinement predicate threw`, err));
|
|
157
|
-
return false;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* Cognitive-complexity helper: decides whether a per-definition sub
|
|
162
|
-
* accepts a given frame. Predicate throws are caught (P2-1, codex r1):
|
|
163
|
-
* a throwing refinement returns `false` rather than defecting the
|
|
164
|
-
* dispatch Effect.
|
|
165
|
-
*/
|
|
166
|
-
function subAcceptsFrame(sub, frame) {
|
|
167
|
-
if (sub.definition !== frame.definition)
|
|
168
|
-
return false;
|
|
169
|
-
if (sub.refinement !== undefined &&
|
|
170
|
-
!safePredicate(sub.refinement, frame.params, "subscribe"))
|
|
171
|
-
return false;
|
|
172
|
-
return true;
|
|
173
|
-
}
|
|
174
|
-
/** Same as `subAcceptsFrame`, but for broad-union subscriptions. */
|
|
175
|
-
function broadAcceptsFrame(sub, frame) {
|
|
176
|
-
return (sub.refinement === undefined ||
|
|
177
|
-
safePredicate(sub.refinement, frame, "subscribeAll"));
|
|
178
|
-
}
|
|
179
|
-
function buildDispatch(subsRef, subsAllRef) {
|
|
180
|
-
return (frame) => Effect.gen(function* () {
|
|
181
|
-
// Snapshot both lists at iteration start (AD1 path-(a) semantic).
|
|
182
|
-
const snapshot = yield* Ref.get(subsRef);
|
|
183
|
-
const broadSnapshot = yield* Ref.get(subsAllRef);
|
|
184
|
-
const matching = snapshot.filter((sub) => subAcceptsFrame(sub, frame));
|
|
185
|
-
for (const sub of matching) {
|
|
186
|
-
yield* dispatchToSubscriber(sub, frame);
|
|
187
|
-
}
|
|
188
|
-
const matchingBroad = broadSnapshot.filter((sub) => broadAcceptsFrame(sub, frame));
|
|
189
|
-
for (const sub of matchingBroad) {
|
|
190
|
-
yield* dispatchToBroadSubscriber(sub, frame);
|
|
191
|
-
}
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
function buildCloseAll(subsRef, subsAllRef) {
|
|
195
|
-
return Effect.gen(function* () {
|
|
196
|
-
const snapshot = yield* Ref.getAndSet(subsRef, []);
|
|
197
|
-
const broadSnapshot = yield* Ref.getAndSet(subsAllRef, []);
|
|
198
|
-
const cause = new NotConnectedError({
|
|
199
|
-
message: "WebSocket not connected",
|
|
200
|
-
});
|
|
201
|
-
for (const sub of snapshot) {
|
|
202
|
-
yield* closeSubscriber(sub, cause);
|
|
203
|
-
}
|
|
204
|
-
for (const sub of broadSnapshot) {
|
|
205
|
-
yield* closeBroadSubscriber(sub, cause);
|
|
206
|
-
}
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
export function makeSubscriberRegistry() {
|
|
210
|
-
return Effect.gen(function* () {
|
|
211
|
-
const subsRef = yield* Ref.make([]);
|
|
212
|
-
const subsAllRef = yield* Ref.make([]);
|
|
213
|
-
const counterRef = yield* Ref.make(0);
|
|
214
|
-
return {
|
|
215
|
-
register: buildRegister(subsRef, counterRef),
|
|
216
|
-
registerAll: buildRegisterAll(subsAllRef, counterRef),
|
|
217
|
-
dispatch: buildDispatch(subsRef, subsAllRef),
|
|
218
|
-
closeAll: buildCloseAll(subsRef, subsAllRef),
|
|
219
|
-
};
|
|
220
|
-
}).pipe(Effect.withSpan("makeSubscriberRegistry"));
|
|
221
|
-
}
|
|
222
|
-
//# sourceMappingURL=subscribers.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subscribers.js","sourceRoot":"","sources":["../../src/runtime/subscribers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service-socket-path.test.d.ts","sourceRoot":"","sources":["../src/service-socket-path.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { getMoltZapAgentServiceSocketPath } from "./local-paths.js";
|
|
3
|
-
import { FakeMoltZapService } from "./test-utils/fake-service.js";
|
|
4
|
-
const SAFE_AGENT_ID = "agent-abc_123";
|
|
5
|
-
const DEFAULT_SOCKET_SEGMENT = "default";
|
|
6
|
-
const SAFE_SOCKET_NAME = "service-agent-abc_123.sock";
|
|
7
|
-
const DEFAULT_SOCKET_NAME = "service-default.sock";
|
|
8
|
-
const ETC_PASSWD_SEGMENT = "etc/passwd";
|
|
9
|
-
const EXPECTED_DEFAULT_SOCKET_PATH = getMoltZapAgentServiceSocketPath(DEFAULT_SOCKET_SEGMENT);
|
|
10
|
-
const EXPECTED_SAFE_SOCKET_PATH = getMoltZapAgentServiceSocketPath(SAFE_AGENT_ID);
|
|
11
|
-
const MOLTZAP_SOCKET_DIR = EXPECTED_DEFAULT_SOCKET_PATH.slice(0, -DEFAULT_SOCKET_NAME.length);
|
|
12
|
-
function setOwnAgentId(service, id) {
|
|
13
|
-
Reflect.set(service, "_ownAgentId", id);
|
|
14
|
-
}
|
|
15
|
-
function socketPathAcceptsSafeAgentIds() {
|
|
16
|
-
const service = new FakeMoltZapService();
|
|
17
|
-
setOwnAgentId(service, SAFE_AGENT_ID);
|
|
18
|
-
expect(service.socketPath).toBe(EXPECTED_SAFE_SOCKET_PATH);
|
|
19
|
-
expect(service.socketPath.endsWith(SAFE_SOCKET_NAME)).toBe(true);
|
|
20
|
-
}
|
|
21
|
-
function socketPathRejectsTraversal() {
|
|
22
|
-
const service = new FakeMoltZapService();
|
|
23
|
-
setOwnAgentId(service, "../etc/passwd");
|
|
24
|
-
expect(service.socketPath).toBe(EXPECTED_DEFAULT_SOCKET_PATH);
|
|
25
|
-
expect(service.socketPath).not.toContain("..");
|
|
26
|
-
expect(service.socketPath).not.toContain(ETC_PASSWD_SEGMENT);
|
|
27
|
-
}
|
|
28
|
-
function socketPathRejectsForwardSlash() {
|
|
29
|
-
const service = new FakeMoltZapService();
|
|
30
|
-
setOwnAgentId(service, "foo/bar");
|
|
31
|
-
expect(service.socketPath).toBe(EXPECTED_DEFAULT_SOCKET_PATH);
|
|
32
|
-
}
|
|
33
|
-
function socketPathRejectsParentSegment() {
|
|
34
|
-
const service = new FakeMoltZapService();
|
|
35
|
-
setOwnAgentId(service, "..");
|
|
36
|
-
expect(service.socketPath).toBe(EXPECTED_DEFAULT_SOCKET_PATH);
|
|
37
|
-
}
|
|
38
|
-
function socketPathRejectsEmptyAndWhitespace() {
|
|
39
|
-
const service = new FakeMoltZapService();
|
|
40
|
-
setOwnAgentId(service, "");
|
|
41
|
-
expect(service.socketPath).toBe(EXPECTED_DEFAULT_SOCKET_PATH);
|
|
42
|
-
setOwnAgentId(service, " ");
|
|
43
|
-
expect(service.socketPath).toBe(EXPECTED_DEFAULT_SOCKET_PATH);
|
|
44
|
-
}
|
|
45
|
-
function socketPathRejectsPunctuation() {
|
|
46
|
-
const service = new FakeMoltZapService();
|
|
47
|
-
for (const bad of [
|
|
48
|
-
"a;b",
|
|
49
|
-
"a|b",
|
|
50
|
-
"a$b",
|
|
51
|
-
"a\\b",
|
|
52
|
-
"a\nb",
|
|
53
|
-
".hidden",
|
|
54
|
-
"foo.sock",
|
|
55
|
-
]) {
|
|
56
|
-
setOwnAgentId(service, bad);
|
|
57
|
-
expect(service.socketPath).toBe(EXPECTED_DEFAULT_SOCKET_PATH);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
function socketPathDefaultsBeforeAgentAssignment() {
|
|
61
|
-
const service = new FakeMoltZapService();
|
|
62
|
-
expect(service.socketPath).toBe(EXPECTED_DEFAULT_SOCKET_PATH);
|
|
63
|
-
}
|
|
64
|
-
function rejectedSocketPathsStayInMoltzapDir() {
|
|
65
|
-
const service = new FakeMoltZapService();
|
|
66
|
-
for (const bad of ["../foo", "a/b", "a\x00b", "a\\b"]) {
|
|
67
|
-
setOwnAgentId(service, bad);
|
|
68
|
-
expect(service.socketPath.startsWith(MOLTZAP_SOCKET_DIR)).toBe(true);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
describe("MoltZapService.socketPath safe ids", () => {
|
|
72
|
-
it("accepts safe alphanumeric agent ids verbatim", socketPathAcceptsSafeAgentIds);
|
|
73
|
-
});
|
|
74
|
-
describe("MoltZapService.socketPath rejected ids", () => {
|
|
75
|
-
it("rejects `..` traversal and falls back to `service-default.sock`", socketPathRejectsTraversal);
|
|
76
|
-
it("rejects forward-slash separators", socketPathRejectsForwardSlash);
|
|
77
|
-
it("rejects a plain `..` agent id", socketPathRejectsParentSegment);
|
|
78
|
-
});
|
|
79
|
-
describe("MoltZapService.socketPath fallback ids", () => {
|
|
80
|
-
it("rejects empty-string and whitespace agent ids", socketPathRejectsEmptyAndWhitespace);
|
|
81
|
-
it("rejects shell metacharacters and path-like punctuation", socketPathRejectsPunctuation);
|
|
82
|
-
it("falls back to `default` when no agent id has been assigned yet", socketPathDefaultsBeforeAgentAssignment);
|
|
83
|
-
});
|
|
84
|
-
describe("MoltZapService.socketPath containment", () => {
|
|
85
|
-
it("keeps the socket inside ~/.moltzap/ for every rejected id", rejectedSocketPathsStayInMoltzapDir);
|
|
86
|
-
});
|
|
87
|
-
//# sourceMappingURL=service-socket-path.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service-socket-path.test.js","sourceRoot":"","sources":["../src/service-socket-path.test.ts"],"names":[],"mappings":"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"}
|
package/dist/service.test.d.ts
DELETED