|
|
import { TraceSource } from "./TraceSource";
|
|
|
import { argumentNotNull } from "../safe";
|
|
|
import { IDestroyable } from "../interfaces";
|
|
|
|
|
|
export class Registry {
|
|
|
static readonly instance = new Registry();
|
|
|
|
|
|
private _registry: object = new Object();
|
|
|
private _listeners: object = new Object();
|
|
|
private _nextCookie: number = 1;
|
|
|
|
|
|
get(id: any): TraceSource {
|
|
|
argumentNotNull(id, "id");
|
|
|
|
|
|
if (this._registry[id])
|
|
|
return this._registry[id];
|
|
|
|
|
|
const source = new TraceSource(id);
|
|
|
this._registry[id] = source;
|
|
|
this._onNewSource(source);
|
|
|
|
|
|
return source;
|
|
|
}
|
|
|
|
|
|
add(id: any, source: TraceSource) {
|
|
|
argumentNotNull(id, "id");
|
|
|
argumentNotNull(source, "source");
|
|
|
|
|
|
this._registry[id] = source;
|
|
|
this._onNewSource(source);
|
|
|
}
|
|
|
|
|
|
_onNewSource(source: TraceSource) {
|
|
|
for (const i in this._listeners)
|
|
|
this._listeners[i].call(null, source);
|
|
|
}
|
|
|
|
|
|
on(handler: (source: TraceSource) => void): IDestroyable {
|
|
|
argumentNotNull(handler, "handler");
|
|
|
const me = this;
|
|
|
|
|
|
const cookie = this._nextCookie++;
|
|
|
|
|
|
this._listeners[cookie] = handler;
|
|
|
|
|
|
for (const i in this._registry)
|
|
|
handler(this._registry[i]);
|
|
|
|
|
|
return {
|
|
|
destroy() {
|
|
|
delete me._listeners[cookie];
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
|