1import * as ManagedRuntime from "effect/ManagedRuntime";
2import type * as Effect from "effect/Effect";
3import * as Layer from "effect/Layer";
4import * as Socket from "effect/socket/Socket";
5
6import { layerRemoteHttpClient } from "@t3tools/client-runtime/rpc";
7import * as PrimaryEnvironmentHttpClient from "../environments/primary/httpClient";
8import * as PrimaryEnvironmentHttpLayer from "../environments/primary/httpLayer";
9
10import * as Dpop from "../cloud/dpop";
11import * as ManagedRelayLayer from "../cloud/managedRelayLayer";
12import { resolveCloudPublicConfig } from "../cloud/publicConfig";
13import * as ClientTracer from "../observability/clientTracer";
14
15function configuredRelayUrl(): string {
16 return resolveCloudPublicConfig().relayUrl ?? "http://relay.invalid";
17}
18
19const layerHttpClient = layerRemoteHttpClient((input, init) => globalThis.fetch(input, init));
20type RuntimeLayerSource =
21 | typeof layerHttpClient
22 | typeof Dpop.layer
23 | typeof Socket.layerWebSocketConstructorGlobal
24 | typeof ClientTracer.layer
25 | ReturnType<typeof ManagedRelayLayer.layer>;
26
27const primaryHttpRuntime = ManagedRuntime.make(
28 PrimaryEnvironmentHttpClient.layer.pipe(Layer.provide(PrimaryEnvironmentHttpLayer.layer)),
29);
30
31export type PrimaryHttpEffectRunner = <A, E>(
32 effect: Effect.Effect<A, E, PrimaryEnvironmentHttpClient.PrimaryEnvironmentHttpClient>,
33) => Promise<A>;
34
35const livePrimaryHttpRunner: PrimaryHttpEffectRunner = (effect) =>
36 primaryHttpRuntime.runPromise(effect);
37
38let primaryHttpRunner = livePrimaryHttpRunner;
39
40export const runPrimaryHttp = <A, E>(
41 effect: Effect.Effect<A, E, PrimaryEnvironmentHttpClient.PrimaryEnvironmentHttpClient>,
42) => primaryHttpRunner(effect);
43
44export function __setPrimaryHttpRunnerForTests(runner?: PrimaryHttpEffectRunner): void {
45 primaryHttpRunner = runner ?? livePrimaryHttpRunner;
46}
47
48const layerRuntime = Layer.mergeAll(
49 layerHttpClient,
50 Dpop.layer,
51 Socket.layerWebSocketConstructorGlobal,
52 ClientTracer.layer,
53 ManagedRelayLayer.layer(configuredRelayUrl()).pipe(
54 Layer.provide(Layer.mergeAll(layerHttpClient, Dpop.layer)),
55 ),
56);
57
58export const runtime: ManagedRuntime.ManagedRuntime<
59 Layer.Success<RuntimeLayerSource>,
60 Layer.Error<RuntimeLayerSource>
61> = ManagedRuntime.make(layerRuntime);
62
63export const layer: Layer.Layer<
64 Layer.Success<RuntimeLayerSource>,
65 Layer.Error<RuntimeLayerSource>
66> = Layer.effectContext(runtime.contextEffect);