import * as ManagedRuntime from "effect/ManagedRuntime";
import type * as Effect from "effect/Effect";
import * as Layer from "effect/Layer";
import { FetchHttpClient } from "effect/unstable/http";
import { remoteHttpClientLayer } from "@t3tools/client-runtime";
import {
PrimaryEnvironmentHttpClient,
primaryEnvironmentHttpClientLive,
} from "../environments/primary/httpClient";
export const remoteHttpRuntime = ManagedRuntime.make(remoteHttpClientLayer(globalThis.fetch));
const primaryHttpRuntime = ManagedRuntime.make(
primaryEnvironmentHttpClientLive.pipe(
Layer.provide(
Layer.mergeAll(
remoteHttpClientLayer((input, init) => globalThis.fetch(input, init)),
Layer.succeed(FetchHttpClient.RequestInit, { credentials: "include" }),
),
),
),
);
export type PrimaryHttpEffectRunner = (
effect: Effect.Effect,
) => Promise;
const livePrimaryHttpRunner: PrimaryHttpEffectRunner = (effect) =>
primaryHttpRuntime.runPromise(effect);
let primaryHttpRunner = livePrimaryHttpRunner;
export const runPrimaryHttp = (effect: Effect.Effect) =>
primaryHttpRunner(effect);
export function __setPrimaryHttpRunnerForTests(runner?: PrimaryHttpEffectRunner): void {
primaryHttpRunner = runner ?? livePrimaryHttpRunner;
}