effect.ts 1.0 KB

12345678910111213141516171819202122232425
  1. import { NodeFileSystem } from "@effect/platform-node"
  2. import * as Layer from "effect/Layer"
  3. import { FetchHttpClient } from "effect/unstable/http"
  4. import type * as HttpClient from "effect/unstable/http/HttpClient"
  5. import * as CassetteService from "./cassette.js"
  6. import { recordingLayer } from "./internal-effect.js"
  7. import { make } from "./redactor.js"
  8. import type { RecorderOptions } from "./types.js"
  9. /**
  10. * Provides a fetch-backed `HttpClient` with cassette recording and replay.
  11. *
  12. * Locally, a missing cassette is recorded from the real service. Existing
  13. * cassettes are replayed, and `CI=true` makes a missing cassette fail.
  14. */
  15. export const http = (name: string, options: RecorderOptions = {}): Layer.Layer<HttpClient.HttpClient> =>
  16. recordingLayer(name, {
  17. metadata: options.metadata,
  18. redactor: make(options.redact),
  19. match: options.match,
  20. }).pipe(
  21. Layer.provide(CassetteService.fileSystem({ directory: options.directory })),
  22. Layer.provide(FetchHttpClient.layer),
  23. Layer.provide(NodeFileSystem.layer),
  24. )