1import * as Layer from "effect/Layer";
2import * as ManagedRuntime from "effect/ManagedRuntime";
3import * as Socket from "effect/socket/Socket";
4
5import { layerRemoteHttpClient } from "@t3tools/client-runtime/rpc";
6
7import * as Dpop from "../features/cloud/dpop";
8import * as ManagedRelayLayer from "../features/cloud/managedRelayLayer";
9import { resolveCloudPublicConfig } from "../features/cloud/publicConfig";
10import * as Persistence from "../persistence/layer";
11import { disposeOnFoundationReplace, type FoundationHotModule } from "./foundation-fast-refresh";
12
13declare const module: { readonly hot?: FoundationHotModule } | undefined;
14
15function configuredRelayUrl(): string {
16 return resolveCloudPublicConfig().relay.url ?? "http://relay.invalid";
17}
18
19const layerHttpClient = layerRemoteHttpClient(fetch);
20
21type RuntimeLayerSource =
22 | ReturnType<typeof ManagedRelayLayer.layer>
23 | typeof Socket.layerWebSocketConstructorGlobal
24 | typeof Dpop.layer
25 | typeof layerHttpClient
26 | typeof Persistence.layer;
27
28const layerRuntime = Layer.merge(
29 ManagedRelayLayer.layer(configuredRelayUrl()),
30 Socket.layerWebSocketConstructorGlobal,
31).pipe(
32 Layer.provideMerge(Dpop.layer),
33 Layer.provideMerge(layerHttpClient),
34 Layer.provideMerge(Persistence.layer),
35);
36
37export const runtime: ManagedRuntime.ManagedRuntime<
38 Layer.Success<RuntimeLayerSource>,
39 Layer.Error<RuntimeLayerSource>
40> = ManagedRuntime.make(layerRuntime);
41
42export const layer: Layer.Layer<
43 Layer.Success<RuntimeLayerSource>,
44 Layer.Error<RuntimeLayerSource>
45> = Layer.effectContext(runtime.contextEffect);
46
47disposeOnFoundationReplace(typeof module === "undefined" ? undefined : module.hot, () =>
48 runtime.dispose(),
49);