289 lines · 10.2 KB · TypeScript
RawDownload
import { describe, it, assert } from "@effect/vitest";import { ProviderDriverKind, ProviderInstanceId, type ServerProvider } from "@t3tools/contracts";import { createModelCapabilities } from "@t3tools/shared/model";import * as Deferred from "effect/Deferred";import * as Effect from "effect/Effect";import * as Fiber from "effect/Fiber";import * as PubSub from "effect/PubSub";import * as Ref from "effect/Ref";import * as Stream from "effect/Stream"; import { makeManagedServerProvider } from "./makeManagedServerProvider.ts"; const emptyCapabilities = createModelCapabilities({ optionDescriptors: [] });const fastModeCapabilities = createModelCapabilities({  optionDescriptors: [    {      id: "fastMode",      label: "Fast Mode",      type: "boolean",    },  ],}); interface TestSettings {  readonly enabled: boolean;} const maintenanceCapabilities = {  provider: ProviderDriverKind.make("codex"),  packageName: "@openai/codex",  update: {    command: "npm install -g @openai/codex@latest",     executable: "npm",     args: ["install", "-g", "@openai/codex@latest"],     lockKey: "npm-global",  },} as const; const initialSnapshot: ServerProvider = {  instanceId: ProviderInstanceId.make("codex"),  driver: ProviderDriverKind.make("codex"),  enabled: true,  installed: true,  version: null,  status: "warning",  auth: { status: "unknown" },  checkedAt: "2026-04-10T00:00:00.000Z",  message: "Checking provider availability...",  models: [],  slashCommands: [],  skills: [],}; const refreshedSnapshot: ServerProvider = {  instanceId: ProviderInstanceId.make("codex"),  driver: ProviderDriverKind.make("codex"),  enabled: true,  installed: true,  version: "1.0.0",  status: "ready",  auth: { status: "authenticated" },  checkedAt: "2026-04-10T00:00:01.000Z",  models: [],  slashCommands: [],  skills: [],}; const enrichedSnapshot: ServerProvider = {  ...refreshedSnapshot,  checkedAt: "2026-04-10T00:00:02.000Z",  models: [    {      slug: "composer-2",      name: "Composer 2",      isCustom: false,      capabilities: fastModeCapabilities,    },  ],}; const refreshedSnapshotSecond: ServerProvider = {  ...refreshedSnapshot,  checkedAt: "2026-04-10T00:00:03.000Z",  message: "Refreshed provider availability again.",}; const enrichedSnapshotSecond: ServerProvider = {  ...refreshedSnapshotSecond,  checkedAt: "2026-04-10T00:00:04.000Z",  models: [    {      slug: "gpt-5.4",      name: "GPT-5.4",      isCustom: false,      capabilities: emptyCapabilities,    },  ],}; describe("makeManagedServerProvider", () => {  it.effect(    "runs the initial provider check in the background and streams the refreshed snapshot",    () =>      Effect.scoped(        Effect.gen(function* () {          const checkCalls = yield* Ref.make(0);          const releaseCheck = yield* Deferred.make<void>();          const provider = yield* makeManagedServerProvider<TestSettings>({            maintenanceCapabilities,            getSettings: Effect.succeed({ enabled: true }),            streamSettings: Stream.empty,            haveSettingsChanged: (previous, next) => previous.enabled !== next.enabled,            initialSnapshot: () => Effect.succeed(initialSnapshot),            checkProvider: Ref.update(checkCalls, (count) => count + 1).pipe(              Effect.flatMap(() => Deferred.await(releaseCheck)),              Effect.as(refreshedSnapshot),            ),            refreshInterval: "1 hour",          });           const initial = yield* provider.getSnapshot;          assert.deepStrictEqual(initial, initialSnapshot);           const updatesFiber = yield* Stream.take(provider.streamChanges, 1).pipe(            Stream.runCollect,            Effect.forkChild,          );          yield* Effect.yieldNow;          assert.strictEqual(yield* Ref.get(checkCalls), 1);           yield* Deferred.succeed(releaseCheck, undefined);           const updates = Array.from(yield* Fiber.join(updatesFiber));          const latest = yield* provider.getSnapshot;           assert.deepStrictEqual(updates, [refreshedSnapshot]);          assert.deepStrictEqual(latest, refreshedSnapshot);          assert.strictEqual(yield* Ref.get(checkCalls), 1);        }),      ),  );   it.effect("reruns the provider check when streamed settings change", () =>    Effect.scoped(      Effect.gen(function* () {        const settingsRef = yield* Ref.make<TestSettings>({ enabled: true });        const settingsChanges = yield* PubSub.unbounded<TestSettings>();        const checkCalls = yield* Ref.make(0);        const releaseInitialCheck = yield* Deferred.make<void>();        const releaseSettingsCheck = yield* Deferred.make<void>();        const provider = yield* makeManagedServerProvider<TestSettings>({          maintenanceCapabilities,          getSettings: Ref.get(settingsRef),          streamSettings: Stream.fromPubSub(settingsChanges),          haveSettingsChanged: (previous, next) => previous.enabled !== next.enabled,          initialSnapshot: () => Effect.succeed(initialSnapshot),          checkProvider: Ref.updateAndGet(checkCalls, (count) => count + 1).pipe(            Effect.flatMap((count) =>              count === 1                ? Deferred.await(releaseInitialCheck).pipe(Effect.as(refreshedSnapshot))                : Deferred.await(releaseSettingsCheck).pipe(Effect.as(refreshedSnapshotSecond)),            ),          ),          refreshInterval: "1 hour",        });         const updatesFiber = yield* Stream.take(provider.streamChanges, 2).pipe(          Stream.runCollect,          Effect.forkChild,        );        yield* Effect.yieldNow;         yield* Deferred.succeed(releaseInitialCheck, undefined);        yield* Ref.set(settingsRef, { enabled: false });        yield* PubSub.publish(settingsChanges, { enabled: false });        yield* Deferred.succeed(releaseSettingsCheck, undefined);         const updates = Array.from(yield* Fiber.join(updatesFiber));        const latest = yield* provider.getSnapshot;         assert.deepStrictEqual(updates, [refreshedSnapshot, refreshedSnapshotSecond]);        assert.deepStrictEqual(latest, refreshedSnapshotSecond);        assert.strictEqual(yield* Ref.get(checkCalls), 2);      }),    ),  );   it.effect("streams supplemental snapshot updates after the base provider check completes", () =>    Effect.scoped(      Effect.gen(function* () {        const releaseEnrichment = yield* Deferred.make<void>();        const releaseCheck = yield* Deferred.make<void>();        const provider = yield* makeManagedServerProvider<TestSettings>({          maintenanceCapabilities,          getSettings: Effect.succeed({ enabled: true }),          streamSettings: Stream.empty,          haveSettingsChanged: (previous, next) => previous.enabled !== next.enabled,          initialSnapshot: () => Effect.succeed(initialSnapshot),          checkProvider: Deferred.await(releaseCheck).pipe(Effect.as(refreshedSnapshot)),          enrichSnapshot: ({ publishSnapshot }) =>            Deferred.await(releaseEnrichment).pipe(              Effect.flatMap(() => publishSnapshot(enrichedSnapshot)),            ),          refreshInterval: "1 hour",        });         const updatesFiber = yield* Stream.take(provider.streamChanges, 2).pipe(          Stream.runCollect,          Effect.forkChild,        );        yield* Effect.yieldNow;         yield* Deferred.succeed(releaseCheck, undefined);         yield* Deferred.succeed(releaseEnrichment, undefined);         const updates = Array.from(yield* Fiber.join(updatesFiber));        const latest = yield* provider.getSnapshot;         assert.deepStrictEqual(updates, [refreshedSnapshot, enrichedSnapshot]);        assert.deepStrictEqual(latest, enrichedSnapshot);      }),    ),  );   it.effect("ignores stale enrichment callbacks after a newer refresh advances generation", () =>    Effect.scoped(      Effect.gen(function* () {        const publishCallbacks: Array<(snapshot: ServerProvider) => Effect.Effect<void>> = [];        const refreshCount = yield* Ref.make(0);        const firstCallbackReady = yield* Deferred.make<void>();        const secondCallbackReady = yield* Deferred.make<void>();        const allowFirstRefresh = yield* Deferred.make<void>();        const provider = yield* makeManagedServerProvider<TestSettings>({          maintenanceCapabilities,          getSettings: Effect.succeed({ enabled: true }),          streamSettings: Stream.empty,          haveSettingsChanged: (previous, next) => previous.enabled !== next.enabled,          initialSnapshot: () => Effect.succeed(initialSnapshot),          checkProvider: Ref.updateAndGet(refreshCount, (count) => count + 1).pipe(            Effect.flatMap((count) =>              count === 1                ? Deferred.await(allowFirstRefresh).pipe(Effect.as(refreshedSnapshot))                : Effect.succeed(refreshedSnapshotSecond),            ),          ),          enrichSnapshot: ({ publishSnapshot }) =>            Effect.gen(function* () {              publishCallbacks.push(publishSnapshot);              if (publishCallbacks.length === 1) {                yield* Deferred.succeed(firstCallbackReady, undefined).pipe(Effect.ignore);              } else if (publishCallbacks.length === 2) {                yield* Deferred.succeed(secondCallbackReady, undefined).pipe(Effect.ignore);              }            }),          refreshInterval: "1 hour",        });         const updatesFiber = yield* Stream.take(provider.streamChanges, 3).pipe(          Stream.runCollect,          Effect.forkChild,        );        yield* Effect.yieldNow;         yield* Deferred.succeed(allowFirstRefresh, undefined);        yield* Deferred.await(firstCallbackReady);         yield* provider.refresh;        yield* Deferred.await(secondCallbackReady);         yield* publishCallbacks[0]!(enrichedSnapshot);        yield* publishCallbacks[1]!(enrichedSnapshotSecond);         const updates = Array.from(yield* Fiber.join(updatesFiber));        const latest = yield* provider.getSnapshot;         assert.deepStrictEqual(updates, [          refreshedSnapshot,          refreshedSnapshotSecond,          enrichedSnapshotSecond,        ]);        assert.deepStrictEqual(latest, enrichedSnapshotSecond);      }),    ),  );});