Skip to content

Instantly share code, notes, and snippets.

@leomayleomay
Created April 5, 2022 20:25
Show Gist options
  • Save leomayleomay/4b57e1e78bf07ef18bbbe19c060a88fc to your computer and use it in GitHub Desktop.
Save leomayleomay/4b57e1e78bf07ef18bbbe19c060a88fc to your computer and use it in GitHub Desktop.
import fetch_, { RequestInfo, RequestInit, Response } from "node-fetch";
import * as T from "@effect-ts/core/Effect"
import { Tagged } from "@effect-ts/core/Case";
export class HttpError extends Tagged("http-error")<{
readonly error: unknown;
}> { }
export const fetch = (url: RequestInfo, opts?: Omit<RequestInit, "signal">) =>
T.effectAsyncInterrupt<unknown, HttpError, Response>((cb) => {
const { signal, abort } = new AbortController();
fetch_(url, { ...opts, signal }).then(
(response) => cb(T.succeed(response)),
(error) => cb(T.fail(HttpError.make({ error })))
);
return T.succeedWith(() => {
abort();
});
});
export class JsonError extends Tagged("json-error")<{
readonly error: unknown;
}> { }
export const json = (resp: Response) =>
T.tryCatchPromise(
() => resp.json(),
(error) => JsonError.make({ error })
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment