TraceSource.ts
174 lines
| 3.9 KiB
| video/mp2t
|
TypeScriptLexer
|
|
r9 | import * as format from '../text/format' | |
|
|
r10 | import { argumentNotNull } from '../safe'; | |
|
|
r9 | ||
|
|
r10 | interface TraceEventHandler { | |
| (sender: TraceSource, level: number, arg: any): void; | |||
| } | |||
| interface TraceSourceHandler { | |||
| (source: TraceSource): void; | |||
|
|
r9 | } | |
| interface Destroyable { | |||
| destroy(); | |||
| } | |||
|
|
r10 | class Registry { | |
| static readonly instance = new Registry(); | |||
| private _registry: object = new Object(); | |||
| private _listeners: object = new Object(); | |||
| private _nextCookie: number = 1; | |||
|
|
r9 | ||
|
|
r10 | get(id: any): TraceSource { | |
| argumentNotNull(id, "id"); | |||
| if (this._registry[id]) | |||
| return this._registry[id]; | |||
|
|
r9 | ||
|
|
r10 | var source = new TraceSource(id); | |
| this._registry[id] = source; | |||
| this._onNewSource(source); | |||
| return source; | |||
|
|
r9 | } | |
|
|
r10 | add(id: any, source: TraceSource) { | |
| argumentNotNull(id, "id"); | |||
| argumentNotNull(source, "source"); | |||
| this._registry[id] = source; | |||
| this._onNewSource(source); | |||
| } | |||
| _onNewSource(source: TraceSource) { | |||
| for (let i in this._listeners) | |||
| this._listeners[i].call(null, source); | |||
| } | |||
| on(handler: TraceSourceHandler): Destroyable { | |||
| argumentNotNull(handler, "handler"); | |||
| var me = this; | |||
| var cookie = this._nextCookie++; | |||
| this._listeners[cookie] = handler; | |||
| for (let i in this._registry) | |||
| handler(this._registry[i]); | |||
| return { | |||
| destroy() { | |||
| delete me._listeners[cookie]; | |||
| } | |||
| }; | |||
|
|
r9 | } | |
| } | |||
|
|
r10 | class TraceSource { | |
|
|
r9 | ||
| readonly id: any | |||
|
|
r10 | // using array will provide faster iteration the with object | |
| private _handlers: Array<TraceEventHandler> = new Array<TraceEventHandler>(); | |||
|
|
r9 | ||
| level: number | |||
| constructor(id: any) { | |||
| this.id = id || new Object(); | |||
| } | |||
|
|
r10 | on(handler: TraceEventHandler): Destroyable { | |
| argumentNotNull(handler, "handler"); | |||
| var me = this; | |||
| me._handlers.push(handler); | |||
|
|
r9 | ||
|
|
r10 | return { | |
| destroy() { | |||
| me.remove(handler); | |||
| } | |||
| } | |||
|
|
r9 | } | |
|
|
r10 | remove(handler: TraceEventHandler): void { | |
| let i = this._handlers.indexOf(handler); | |||
|
|
r9 | if (i >= 0) | |
| this._handlers.splice(i, 1); | |||
| } | |||
|
|
r10 | protected emit(level: number, arg: any) { | |
| this._handlers.forEach(h => { | |||
| try { | |||
| h(this, level, arg); | |||
| } catch (e) { | |||
| // suppress error in log handlers | |||
| } | |||
| }); | |||
|
|
r9 | } | |
| isDebugEnabled() { | |||
| return this.level >= TraceSource.DebugLevel; | |||
| } | |||
|
|
r10 | debug(msg: string, ...args: any[]) { | |
| if (this.isEnabled(TraceSource.DebugLevel)) | |||
| this.emit(TraceSource.DebugLevel, format(msg, args)); | |||
|
|
r9 | } | |
| isLogEnabled() { | |||
| return this.level >= TraceSource.LogLevel; | |||
| } | |||
|
|
r10 | log(msg: string, ...args: any[]) { | |
| if (this.isEnabled(TraceSource.LogLevel)) | |||
| this.emit(TraceSource.LogLevel, format(msg, args)); | |||
|
|
r9 | } | |
| isWarnEnabled() { | |||
| return this.level >= TraceSource.WarnLevel; | |||
| } | |||
|
|
r10 | warn(msg: string, ...args: any[]) { | |
| if (this.isEnabled(TraceSource.WarnLevel)) | |||
| this.emit(TraceSource.WarnLevel, format(msg, args)); | |||
|
|
r9 | } | |
| isErrorEnabled() { | |||
| return this.level >= TraceSource.ErrorLevel; | |||
| } | |||
|
|
r10 | error(msg: string, ...args: any[]) { | |
| if (this.isEnabled(TraceSource.ErrorLevel)) | |||
| this.emit(TraceSource.ErrorLevel, format(msg, args)); | |||
| } | |||
| isEnabled(level: number) { | |||
| return (this.level >= level); | |||
| } | |||
| traceEvent(level: number, arg: any) { | |||
| if (this.isEnabled(level)) | |||
| this.emit(level, arg); | |||
| } | |||
| static on(handler: TraceSourceHandler) { | |||
|
|
r11 | return Registry.instance.on(handler); | |
|
|
r10 | } | |
| static get(id: any) { | |||
| return Registry.instance.get(id); | |||
|
|
r9 | } | |
| } | |||
| namespace TraceSource { | |||
| export const DebugLevel = 400; | |||
| export const LogLevel = 300; | |||
| export const WarnLevel = 200; | |||
| export const ErrorLevel = 100; | |||
| export const SilentLevel = 0; | |||
| } | |||
| export = TraceSource; |
