import { remoteHttpClientLayer } from "@t3tools/client-runtime/rpc"; import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import { FetchHttpClient, HttpClient, HttpClientRequest } from "effect/unstable/http"; import { readDesktopPrimaryBearerToken } from "./desktopAuth"; import { resolvePrimaryEnvironmentHttpUrl } from "./target"; function isSameOriginBrowserPrimary(): boolean { if ( typeof window === "undefined" || window.desktopBridge !== undefined || window.nativeApi !== undefined || !window.location.origin.startsWith("http") ) { return false; } return new URL(resolvePrimaryEnvironmentHttpUrl("/")).origin === window.location.origin; } function withPrimaryBearerToken(client: HttpClient.HttpClient): HttpClient.HttpClient { return client.pipe( HttpClient.mapRequestEffect((request) => Effect.promise(readDesktopPrimaryBearerToken).pipe( Effect.map((bearerToken) => bearerToken ? HttpClientRequest.bearerToken(request, bearerToken) : request, ), ), ), ); } export function makePrimaryEnvironmentHttpLayer() { return Layer.unwrap( Effect.sync(() => { const baseLayer = remoteHttpClientLayer(globalThis.fetch); if (isSameOriginBrowserPrimary()) { return Layer.merge( baseLayer, Layer.succeed(FetchHttpClient.RequestInit, { credentials: "include" }), ); } const bearerClientLayer = Layer.effect( HttpClient.HttpClient, Effect.map(HttpClient.HttpClient, withPrimaryBearerToken), ).pipe(Layer.provide(baseLayer)); return Layer.merge( bearerClientLayer, Layer.succeed(FetchHttpClient.RequestInit, { credentials: "omit" }), ); }), ); } export const primaryEnvironmentHttpLayer = makePrimaryEnvironmentHttpLayer();