/**
* Minimal reproduction for "The client is destroyed" error
* Demonstrates HttpClient being destroyed when provided at layer level
*/
import { Effect, Context, Layer } from "effect"
import { HttpClient, HttpClientError } from "@effect/platform"
import { NodeRuntime, NodeHttpClient, NodeContext } from "@effect/platform-node"
/**
* Service tag
*/
class MyService extends Context.Tag("MyService")<
MyService,
{ fetchData: () => Effect.Effect<unknown, HttpClientError.HttpClientError> }
>() {
static Live = Layer.effect(MyService, Effect.gen(function* () {
yield* Effect.log("[MyService] Initializing...")
// Capture HttpClient from context
const httpClient = yield* HttpClient.HttpClient
yield* Effect.log("[MyService] HttpClient captured")
const service = {
fetchData: () =>
Effect.gen(function* () {
yield* Effect.log("[MyService] Making HTTP request...")
const response = yield* httpClient.get("https://api.binance.com/api/v3/time")
const data = yield* response.json
yield* Effect.log(`[MyService] Request successful: ${JSON.stringify(data)}`)
return data
})
}
return service
})).pipe(
Layer.provide(NodeHttpClient.layerUndici) // ← When I remove this everything works fine
)
}
/**
* Test program
*/
const program = Effect.gen(function* () {
yield* Effect.log("[Main] Starting program...")
// Get the service
const myService = yield* MyService.pipe(
Effect.provide(MyService.Live)
)
yield* Effect.log("[Main] Service acquired")
yield* Effect.log("[Main] Attempting to fetch data...")
yield* myService.fetchData()
yield* Effect.log("[Main] Success!")
}).pipe(
Effect.provide(NodeHttpClient.layerUndici),
Effect.provide(NodeContext.layer)
)
NodeRuntime.runMain(program)
/**
* Minimal reproduction for "The client is destroyed" error
* Demonstrates HttpClient being destroyed when provided at layer level
*/
import { Effect, Context, Layer } from "effect"
import { HttpClient, HttpClientError } from "@effect/platform"
import { NodeRuntime, NodeHttpClient, NodeContext } from "@effect/platform-node"
/**
* Service tag
*/
class MyService extends Context.Tag("MyService")<
MyService,
{ fetchData: () => Effect.Effect<unknown, HttpClientError.HttpClientError> }
>() {
static Live = Layer.effect(MyService, Effect.gen(function* () {
yield* Effect.log("[MyService] Initializing...")
// Capture HttpClient from context
const httpClient = yield* HttpClient.HttpClient
yield* Effect.log("[MyService] HttpClient captured")
const service = {
fetchData: () =>
Effect.gen(function* () {
yield* Effect.log("[MyService] Making HTTP request...")
const response = yield* httpClient.get("https://api.binance.com/api/v3/time")
const data = yield* response.json
yield* Effect.log(`[MyService] Request successful: ${JSON.stringify(data)}`)
return data
})
}
return service
})).pipe(
Layer.provide(NodeHttpClient.layerUndici) // ← When I remove this everything works fine
)
}
/**
* Test program
*/
const program = Effect.gen(function* () {
yield* Effect.log("[Main] Starting program...")
// Get the service
const myService = yield* MyService.pipe(
Effect.provide(MyService.Live)
)
yield* Effect.log("[Main] Service acquired")
yield* Effect.log("[Main] Attempting to fetch data...")
yield* myService.fetchData()
yield* Effect.log("[Main] Success!")
}).pipe(
Effect.provide(NodeHttpClient.layerUndici),
Effect.provide(NodeContext.layer)
)
NodeRuntime.runMain(program)