import { WsRpcGroup } from "@t3tools/contracts"; import { Effect, Layer, ManagedRuntime } from "effect"; import { AtomRpc } from "effect/unstable/reactivity"; import { createWsRpcProtocolLayer } from "./protocol"; export class WsRpcAtomClient extends AtomRpc.Service()("WsRpcAtomClient", { group: WsRpcGroup, protocol: Layer.suspend(() => createWsRpcProtocolLayer()), }) {} let sharedRuntime: ManagedRuntime.ManagedRuntime | null = null; function getRuntime() { if (sharedRuntime !== null) { return sharedRuntime; } sharedRuntime = ManagedRuntime.make(WsRpcAtomClient.layer); return sharedRuntime; } export function runRpc( execute: (client: typeof WsRpcAtomClient.Service) => Effect.Effect, ): Promise { return getRuntime().runPromise(WsRpcAtomClient.use(execute)); } export async function __resetWsRpcAtomClientForTests() { const runtime = sharedRuntime; sharedRuntime = null; await runtime?.dispose(); }