import { observable } from '@trpc/server/observable'; type Func = (arg: T) => void; abstract class Observable { private _listeners: Func[] = []; protected abstract _value: T; protected _notifyObservers(v = this._value) { this._listeners = this._listeners.filter(l => { try { l(v); return true; } catch (err) { console.error('Observer threw, removing listener', err); return false; } }); } observe() { return observable(e => { e.next(this._value); this._listeners.push(e.next); return () => { this._listeners = this._listeners.filter(v => v !== e.next); }; }); } clearObservers() { this._listeners = []; } } export default Observable;