import { assert, it } from "@effect/vitest"; import * as Deferred from "effect/Deferred"; import * as Duration from "effect/Duration"; import * as Effect from "effect/Effect"; import * as Fiber from "effect/Fiber"; import * as TestClock from "effect/testing/TestClock"; import { hasCompatibleOrchestrationProtocol, resolveAvailableEditorsForConfig } from "./ws.ts"; import { ORCHESTRATION_PROTOCOL_VERSION } from "@t3tools/contracts"; it("accepts only the current orchestration protocol before websocket RPC setup", () => { assert.isTrue( hasCompatibleOrchestrationProtocol( new URL(`https://host.test/ws?orchestrationProtocol=${ORCHESTRATION_PROTOCOL_VERSION}`), ), ); assert.isFalse(hasCompatibleOrchestrationProtocol(new URL("https://host.test/ws"))); assert.isFalse( hasCompatibleOrchestrationProtocol( new URL(`https://host.test/ws?orchestrationProtocol=${ORCHESTRATION_PROTOCOL_VERSION - 1}`), ), ); }); it.effect("does not block server config when editor discovery never resolves", () => Effect.gen(function* () { const discoveryInterrupted = yield* Deferred.make(); const responseFiber = yield* resolveAvailableEditorsForConfig( Effect.never.pipe( Effect.onInterrupt(() => Deferred.succeed(discoveryInterrupted, undefined)), ), ).pipe(Effect.forkChild); yield* TestClock.adjust(Duration.seconds(5)); const availableEditors = yield* Fiber.join(responseFiber); yield* Deferred.await(discoveryInterrupted); assert.deepEqual(availableEditors, []); }), );