getPort utility that wraps the get-port library in Effect.
Learn more about Mintlify
Enter your email to receive updates about new features and product releases.
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),
])
})