|
| 1 | + |
| 2 | +import { Middleware, NextMiddleware } from './index'; |
| 3 | +import { Command } from '../commandBus'; |
| 4 | + |
| 5 | + |
| 6 | +export interface CommandLogger { |
| 7 | + log(level: string, msg: string): CommandLogger; |
| 8 | + log(level: string, msg: string, meta: any): CommandLogger; |
| 9 | + log(level: string, msg: string, ...meta: any[]): CommandLogger; |
| 10 | +} |
| 11 | + |
| 12 | +export interface CommandLoggerOptions { |
| 13 | + level?: string; |
| 14 | + errorLevel?: string; |
| 15 | +} |
| 16 | + |
| 17 | +export class CommandLoggerMiddleware implements Middleware { |
| 18 | + private logger: CommandLogger; |
| 19 | + private level: string; |
| 20 | + private errorLevel: string; |
| 21 | + |
| 22 | + constructor(logger: CommandLogger, options: CommandLoggerOptions = {}) { |
| 23 | + this.logger = logger; |
| 24 | + this.level = options.level || 'info'; |
| 25 | + this.errorLevel = options.errorLevel || 'error'; |
| 26 | + } |
| 27 | + |
| 28 | + public async run(command: Command, next: NextMiddleware): Promise<any> { |
| 29 | + const start = Date.now(); |
| 30 | + const commandName = command.constructor.name; |
| 31 | + |
| 32 | + this.logger.log(this.level, 'Command %s dispatched', commandName); |
| 33 | + |
| 34 | + try { |
| 35 | + return await next(); |
| 36 | + } catch (err) { |
| 37 | + this.logger.log(this.errorLevel, 'Command %s error. %s', commandName, err); |
| 38 | + throw err; |
| 39 | + } finally { |
| 40 | + const time = Date.now() - start; |
| 41 | + this.logger.log(this.level, 'Command %s time %dms', commandName, time); |
| 42 | + } |
| 43 | + } |
| 44 | +} |
0 commit comments