emit-io-hono
v2.0.0
Published
Hono middleware for emit-io — request id, child logger, timings
Readme
emit-io-hono
Hono middleware for emit-io-core — request ID, child logger, timings, and ALS context propagation.
Install
npm install emit-io-core emit-io-honoQuick Start
import { Hono } from 'hono'
import { EmitIoStrategy, JSONTransport, LogLevelEnum } from 'emit-io-core'
import { loggerMiddleware } from 'emit-io-hono'
const emit = new EmitIoStrategy({
transports: [new JSONTransport({ minLevel: LogLevelEnum.INFO })],
})
const app = new Hono()
app.use('*', loggerMiddleware({ logger }))
app.get('/orders', (c) => {
const log = c.get('logger') // child EmitIoStrategy with { requestId, method, path }
const requestId = c.get('requestId')
log.info('fetching orders')
return c.json({ orders: [] })
})
export default appAPI
loggerMiddleware(options)
import { loggerMiddleware } from 'emit-io-hono'
import type { LoggerMiddlewareOptions } from 'emit-io-hono'
const options: LoggerMiddlewareOptions = {
logger: emit, // required: EmitIoStrategy instance
requestIdHeader: 'x-request-id', // default: 'x-request-id'
autoLog: true, // default: true
contextKey: 'logger', // default: 'logger' — key for c.get()
}
app.use('*', loggerMiddleware(options))Context Values
After the middleware runs, the Hono context exposes:
| Key | Type | Description |
|---|---|---|
| c.get('logger') | EmitIoStrategy | Child logger with { requestId, method, path } |
| c.get('requestId') | string | Request ID from header or generated UUID |
Behaviour
onRequest— logsrequest-startwith{ method, path }whenautoLog: trueonResponse— logsrequest-completewith{ status, durationMs }onError— logsrequest-failedwith{ status, durationMs, error }, then re-throws- Sets
x-request-idresponse header - Runs the downstream handler inside
runWithContext({ requestId, path, method })so all nested log calls automatically include the request context
ALS Context Example
app.get('/checkout', async (c) => {
const log = c.get('logger')
// All logger calls inside this handler (and any async callees)
// automatically include requestId from ALS — no manual threading needed.
await processOrder()
return c.json({ ok: true })
})
async function processOrder() {
// emit.info here also picks up requestId from ALS context
emit.info('order processed')
}Peer Dependencies
| Package | Version |
|---|---|
| emit-io-core | ^1.0.0 |
| hono | ^4.0.0 |
License
MIT
