@plinthjs/bus
v0.1.0
Published
Mason command bus: dispatch to handlers through a middleware pipeline (the Illuminate\Bus equivalent).
Downloads
119
Maintainers
Readme
@plinthjs/bus
Mason's command bus — the Laravel Illuminate\Bus equivalent. Dispatch command objects to
handlers resolved by the command's constructor, optionally passing every command through a
middleware pipeline first.
Usage
import { Bus } from '@plinthjs/bus'
class SendWelcomeEmail {
constructor(public readonly userId: number) {}
}
const bus = new Bus()
// Register a handler for a command class (`Bus::map` in Laravel).
bus.register(SendWelcomeEmail, async (command) => {
return `welcomed ${command.userId}`
})
const result = await bus.dispatch(new SendWelcomeEmail(7))
// => 'welcomed 7'Mapping many handlers at once
bus.map([
[CreateOrder, (c) => createOrder(c)],
[CancelOrder, (c) => cancelOrder(c)],
])Middleware (pipeThrough)
Middleware wraps the handler. Call next(command) to continue (returning the inner result), or
return a value to short-circuit.
bus.pipeThrough([
async (command, next) => {
console.time('dispatch')
const result = await next(command)
console.timeEnd('dispatch')
return result
},
])Self-handling commands
A command that carries its own handle() needs no registration:
class PingCommand {
handle() {
return 'pong'
}
}
await bus.dispatch(new PingCommand()) // => 'pong'Synchronous dispatch
dispatchSync returns the handler's result without awaiting — it throws if any handler or
middleware actually does async work.
const value = bus.dispatchSync(new PingCommand())Queueing (stub)
dispatchToQueue records the command onto the public queued[] array instead of running it
inline; real queue integration lands later.
await bus.dispatchToQueue(new SendWelcomeEmail(7))
bus.queued // => [SendWelcomeEmail { userId: 7 }]