import * as Option from "effect/Option" import type { HttpClientResponse } from "effect/unstable/http/HttpClientResponse" import * as Effect from "../Effect.js" import { HttpClient, HttpClientError, HttpClientRequest, HttpHeaders } from "./internal/lib.js" export interface ResponseWithBody extends Pick { readonly body: A } // TODO: consider rebuilding the text/json helpers to use a cached effect // https://discord.com/channels/795981131316985866/1098177242598756412/1168565257569046712 export const responseWithJsonBody = ( response: HttpClientResponse ) => Effect.map(response.json, (body): ResponseWithBody => ({ body, headers: response.headers, status: response.status, remoteAddress: response.remoteAddress })) export const demandJson = (client: HttpClient.HttpClient) => HttpClient .mapRequest(client, (_) => HttpClientRequest.acceptJson(_)) .pipe(HttpClient.transform((r, request) => Effect.tap(r, (response) => Option .exists( HttpHeaders.get(response.headers, "Content-Type"), (_) => _.startsWith("application/json") ) ? Effect.void : Effect.fail( new HttpClientError.DecodeError({ request, response, description: "not json response: " + Option.getOrElse(HttpHeaders.get(response.headers, "Content-Type"), () => "") }) )) ))