import { createFetchHandler, basicHandler, Logger } from 'ff-serv'
import { Effect } from 'effect'
const program = Effect.gen(function* () {
// Create sync logger for server setup
const log = yield* Logger.sync({ service: 'http-server' })
const fetch = yield* createFetchHandler([
basicHandler('/user/:id', (request) =>
Effect.gen(function* () {
const url = new URL(request.url)
const userId = url.pathname.split('/').pop()
// Effect logging with attributes
yield* Logger.info({ userId }, 'Fetching user')
const user = yield* fetchUser(Number(userId))
yield* Logger.debug({ userId, user }, 'User found')
return Response.json(user)
})
),
basicHandler('/health', () => {
// Sync logging in non-Effect code
log.info('Health check')
return new Response('OK')
}),
])
Bun.serve({ port: 3000, fetch })
log.info({ port: 3000 }, 'Server started')
})
function fetchUser(id: number) {
return Effect.succeed({ id, name: 'Alice' })
}
Effect.runPromise(program)