import * as Effect from "effect/Effect"; import * as Stream from "effect/Stream"; import * as SubscriptionRef from "effect/SubscriptionRef"; import { AsyncResult, Atom } from "effect/reactivity"; import * as RelayEnvironmentDiscovery from "../relay/discovery.ts"; import { createRuntimeCommand } from "./runtime.ts"; export function createRelayEnvironmentDiscoveryAtoms( runtime: Atom.AtomRuntime, ) { const stateAtom = runtime.atom( Stream.unwrap( RelayEnvironmentDiscovery.RelayEnvironmentDiscovery.pipe( Effect.map((discovery) => SubscriptionRef.changes(discovery.state)), ), ), { initialValue: RelayEnvironmentDiscovery.EMPTY_RELAY_ENVIRONMENT_DISCOVERY_STATE }, ); const stateValueAtom = Atom.make((get) => AsyncResult.getOrElse( get(stateAtom), () => RelayEnvironmentDiscovery.EMPTY_RELAY_ENVIRONMENT_DISCOVERY_STATE, ), ).pipe(Atom.withLabel("relay-environment-discovery-value")); const refresh = createRuntimeCommand(runtime, { label: "relay-environment-discovery:refresh", concurrency: { mode: "singleFlight", key: () => "refresh" }, execute: (_input: void) => RelayEnvironmentDiscovery.RelayEnvironmentDiscovery.pipe( Effect.flatMap((discovery) => discovery.refresh), ), }); const refreshAfterMutation = createRuntimeCommand(runtime, { label: "relay-environment-discovery:refresh-after-mutation", concurrency: { mode: "serial", key: () => "refresh-after-mutation" }, execute: (_input: void) => RelayEnvironmentDiscovery.RelayEnvironmentDiscovery.pipe( Effect.flatMap((discovery) => discovery.refresh), ), }); return { stateAtom, stateValueAtom, refresh, refreshAfterMutation, }; }