getPort utility that wraps the get-port library in Effect.
Find available ports with getPort
getPort utility that wraps the get-port library in Effect.
bun add get-port
import { getPort } from 'ff-serv'
import { Effect } from 'effect'
const program = Effect.gen(function* () {
const port = yield* getPort()
yield* Effect.log(`Available port: ${port}`)
Bun.serve({
port,
fetch: () => new Response('OK'),
})
})
Effect.runPromise(program)
const port = yield* getPort({ port: 3000 })
// Returns 3000 if available, otherwise finds next available port
const port = yield* getPort({
port: [3000, 3001, 3002, 3003],
})
const port = yield* getPort({
exclude: [3000, 8080],
})
function getPort(
options?: {
port?: number | number[]
exclude?: number[]
host?: string
}
): Effect.Effect<number>
import { createFetchHandler, basicHandler, getPort, Logger } from 'ff-serv'
import { Effect } from 'effect'
const program = Effect.gen(function* () {
// Find available port, preferring 3000
const port = yield* getPort({ port: 3000 })
const fetch = yield* createFetchHandler([
basicHandler('/health', () => new Response('OK')),
])
Bun.serve({ port, fetch })
yield* Logger.info({ port }, `Server running on http://localhost:${port}`)
})
Effect.runPromise(program)
const port = yield* getPort({ port: [3000, 3001, 3002] })
yield* Effect.log(`Dev server on port ${port}`)
import { describe, it } from '@effect/vitest'
describe('HTTP tests', () => {
it.effect('server test', () =>
Effect.gen(function* () {
const port = yield* getPort()
// Each test gets a unique port
})
)
})
const program = Effect.gen(function* () {
const apiPort = yield* getPort({ port: 3000 })
const adminPort = yield* getPort({ port: 3001 })
const metricsPort = yield* getPort({ port: 9090 })
yield* Effect.all([
startApiServer(apiPort),
startAdminServer(adminPort),
startMetricsServer(metricsPort),
])
})