TraceSource.ts
115 lines
| 2.4 KiB
| video/mp2t
|
TypeScriptLexer
|
|
r9 | import * as TraceEventArgs from './TraceEventArgs' | |
| import * as format from '../text/format' | |||
| interface Handler { | |||
| (arg: TraceEventArgs): void; | |||
| } | |||
| interface Destroyable { | |||
| destroy(); | |||
| } | |||
| class HandlerDescriptor implements Destroyable { | |||
| private _target: TraceSource | |||
| readonly handler: Handler; | |||
| constructor(target: TraceSource, handler: Handler) { | |||
| this._target = target; | |||
| this.handler = handler; | |||
| } | |||
| destroy() { | |||
| this._target.remove(this); | |||
| } | |||
| } | |||
| class TraceSource { | |||
| readonly id: any | |||
| private _handlers: Array<HandlerDescriptor> | |||
| level: number | |||
| constructor(id: any) { | |||
| this.id = id || new Object(); | |||
| this._handlers = new Array<HandlerDescriptor>(); | |||
| } | |||
| on(handler: Handler): Destroyable { | |||
| if (!handler) | |||
| throw new Error("A handler must be specified"); | |||
| let d = new HandlerDescriptor(this, handler) | |||
| this._handlers.push(d); | |||
| return d; | |||
| } | |||
| remove(cookie: any): void { | |||
| let i = this._handlers.indexOf(cookie); | |||
| if (i >= 0) | |||
| this._handlers.splice(i, 1); | |||
| } | |||
| protected emit(level: number, msg: string, ...args: any[]) { | |||
| if (level <= this.level) { | |||
| let event = new TraceEventArgs(this, format(msg, args)); | |||
| this._handlers.forEach(d => { | |||
| try { | |||
| d.handler.call(null, event); | |||
| } catch { | |||
| // suppress error in log handlers | |||
| } | |||
| }); | |||
| } | |||
| } | |||
| isDebugEnabled() { | |||
| return this.level >= TraceSource.DebugLevel; | |||
| } | |||
| debug(msg: string, ...args: any[]): void { | |||
| this.emit(TraceSource.DebugLevel, msg, args); | |||
| } | |||
| isLogEnabled() { | |||
| return this.level >= TraceSource.LogLevel; | |||
| } | |||
| log(msg: string, ...args: any[]): void { | |||
| this.emit(TraceSource.LogLevel, msg, args); | |||
| } | |||
| isWarnEnabled() { | |||
| return this.level >= TraceSource.WarnLevel; | |||
| } | |||
| warn(msg: string, ...args: any[]): void { | |||
| this.emit(TraceSource.WarnLevel, msg, args); | |||
| } | |||
| isErrorEnabled() { | |||
| return this.level >= TraceSource.ErrorLevel; | |||
| } | |||
| error(msg: string, ...args: any[]): void { | |||
| this.emit(TraceSource.ErrorLevel, msg, args); | |||
| } | |||
| } | |||
| namespace TraceSource { | |||
| export const DebugLevel = 400; | |||
| export const LogLevel = 300; | |||
| export const WarnLevel = 200; | |||
| export const ErrorLevel = 100; | |||
| export const SilentLevel = 0; | |||
| } | |||
| export = TraceSource; |
