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