History

fix(client): release idle VCS subscriptions immediately

Ben Davis committed 4 months ago

Commit a49d7a71 parent 52b04b92 files · +15 −0Browse files

Unified · Split

2 files
  1. packages/client-runtime/src/state/runtime.test.ts +14 −0
  2. packages/client-runtime/src/state/vcs.ts +1 −0
packages/client-runtime/src/state/runtime.test.ts+14−0
@@ -9,6 +9,7 @@ import * as Layer from "effect/Layer"; · 8 unmodified lines
9import * as Stream from "effect/Stream";9import * as Stream from "effect/Stream";
10import { AsyncResult, Atom, AtomRegistry } from "effect/unstable/reactivity";10import { AsyncResult, Atom, AtomRegistry } from "effect/unstable/reactivity";
11 11
12import { EnvironmentRegistry } from "../connection/registry.ts";
12import {13import {
13 environmentRpcKey,14 environmentRpcKey,
14 createAtomCommandScheduler,15 createAtomCommandScheduler,
@@ -22,6 +23,19 @@ import { · 7 unmodified lines
22 settlePromise,23 settlePromise,
23 squashAtomCommandFailure,24 squashAtomCommandFailure,
24} from "./runtime.ts";25} from "./runtime.ts";
26import { createVcsEnvironmentAtoms } from "./vcs.ts";
27
28describe("VCS status subscription lifecycle", () => {
29 it("removes the status subscription immediately after its last consumer unmounts", () => {
30 const runtime = Atom.runtime(Layer.effect(EnvironmentRegistry, Effect.never));
31 const statusAtom = createVcsEnvironmentAtoms(runtime).status({
32 environmentId: EnvironmentId.make("env-1"),
33 input: { cwd: "/repo" },
34 });
35
36 expect(statusAtom.idleTTL).toBe(0);
37 });
38});
25 39
26describe("settleAsyncResult", () => {40describe("settleAsyncResult", () => {
27 it("preserves successful values and typed failures", async () => {41 it("preserves successful values and typed failures", async () => {
packages/client-runtime/src/state/vcs.ts+1−0
@@ -23,6 +23,7 @@ export function createVcsEnvironmentAtoms<R, E>( · 22 unmodified lines
23 }),23 }),
24 status: createEnvironmentSubscriptionAtomFamily(runtime, {24 status: createEnvironmentSubscriptionAtomFamily(runtime, {
25 label: "environment-data:vcs:status",25 label: "environment-data:vcs:status",
26 idleTtlMs: 0,
26 subscribe: (input: EnvironmentRpcInput<typeof WS_METHODS.subscribeVcsStatus>) =>27 subscribe: (input: EnvironmentRpcInput<typeof WS_METHODS.subscribeVcsStatus>) =>
27 subscribe(WS_METHODS.subscribeVcsStatus, input).pipe(28 subscribe(WS_METHODS.subscribeVcsStatus, input).pipe(
28 Stream.mapAccum(29 Stream.mapAccum(