UNPKG

@observertc/observer-js

Version:

Server Side NodeJS Library for processing ObserveRTC Samples

59 lines (44 loc) 1.57 kB
import { ObservedCall } from '../ObservedCall'; import { Observer } from '../Observer'; import { Updater } from './Updater'; export class OnAllCallObserverUpdater implements Updater { public readonly name = 'OnAllCallObserverUpdater'; public readonly description = 'Call Observer\'s update() method when all of the ObservedCalls are updated'; private readonly _updatedCalls = new Set<string>(); public closed = false; public constructor( private observer: Observer ) { this._onNewObservedCall = this._onNewObservedCall.bind(this); this.observer.once('close', () => { this.observer.off('newcall', this._onNewObservedCall); }); this.observer.on('newcall', this._onNewObservedCall); } close(): void { if (this.closed) return; this.closed = true; this._updatedCalls.clear(); } private _onNewObservedCall(observedCall: ObservedCall) { if (this.closed) return; const onUpdate = () => this._onObservedCallUpdated(observedCall); observedCall.once('close', () => { observedCall.off('update', onUpdate); this._updatedCalls.delete(observedCall.callId); this._updateIfEveryCallUpdated(); }); observedCall.on('update', onUpdate); } private _onObservedCallUpdated(observedCall: ObservedCall) { if (observedCall.closed) return; this._updatedCalls.add(observedCall.callId); this._updateIfEveryCallUpdated(); } private _updateIfEveryCallUpdated() { if (this._updatedCalls.size < this.observer.observedCalls.size) return; else if (this.closed) return; this._updatedCalls.clear(); this.observer.update(); } }