API REFERENCE

Hooks

import type { HookName, HookHandler } from '@rasenganjs/futon';

HookSystem isn't imported directly. Every Futon instance owns one at app.hooks. See Hooks for the full lifecycle explanation and examples.

HookSystem

class HookSystem { on(name: HookName, handler: HookHandler): void; off(name: HookName, handler: HookHandler): void; has(name: HookName): boolean; emit(name: HookName, ...args: unknown[]): Promise<void>; clear(): void; }
MethodDescription
on(name, handler)Register a handler. Handlers run in registration order and may be async.
off(name, handler)Remove a previously registered handler.
has(name)Whether any handler is registered for name, used internally to skip emit()'s overhead when unused.
emit(name, ...args)Fire all handlers for name, awaiting every async one. If a handler throws, the error is swallowed and the remaining handlers still run.
clear()Remove every registered handler across all hook names, mainly useful for test teardown.
Registering and removing a hook
const onRequest = (ctx) => console.log(ctx.request.method, ctx.request.url); app.hooks.on('beforeRequest', onRequest); app.hooks.off('beforeRequest', onRequest);

HookName

type HookName = 'beforeRequest' | 'afterResponse' | 'onError';
HookFiresHandler receives
'beforeRequest'Once per request, before the middleware chain runs.(ctx)
'afterResponse'After the Response is produced, both success and error paths.(ctx, response)
'onError'When an unhandled error escapes the middleware chain.(error, ctx)

HookHandler

type HookHandler = (...args: unknown[]) => void | Promise<void>;

The generic handler shape. Its effective arguments depend on which HookName it's registered under (see the table above).

Adapters
Errors