ts-lib-extended
Version:
Additional types and tools for typescript
76 lines (75 loc) • 2.1 kB
JavaScript
import { DisposableBase } from '../disposable/base.js';
import { Event } from './index.js';
/**
* A handler that provides subscribable, public events.
* The handler is intended for internal (protected, private) use
*
* @export
* @class EventHandler
* @template TSender
* @template {EventArgs | void} [TArgs=void]
* @extends {DisposableBase}
* @since 1.0.0
*/
export class EventHandler extends DisposableBase {
constructor() {
super();
this._callbacks = {};
this._event = new Event((...args_) => this.subscribe(...args_), (...args_) => this.unsubscribe(...args_), (detachEvent_) => {
this._detachEvent = detachEvent_;
});
}
/**
* the subscribable event itself
*
* @readonly
* @type {Event<TSender, TArgs>}
* @memberof EventHandler
* @since 1.0.0
*/
get event() {
return this.validateDisposed(this._event);
}
/**
* trigger/invoke event
*
* @param {TSender} sender_
* @param {TArgs} eventArgs_
* @memberof EventHandler
* @since 1.0.0
*/
invoke(sender_, eventArgs_) {
const keys = Object.keys(this._callbacks);
for (let i = 0; i < keys.length; i++) {
this._callbacks[keys[i]]?.(sender_, eventArgs_);
}
}
subscribe(identifier_, callback_) {
if (identifier_ in this._callbacks) {
return false;
}
this._callbacks[identifier_] = callback_;
return true;
}
unsubscribe(identifier_) {
if (identifier_ in this._callbacks) {
delete this._callbacks[identifier_];
return true;
}
return false;
}
disposingInstance() {
if (this._detachEvent) {
this._detachEvent();
this._detachEvent = undefined;
}
this._event = undefined;
const keys = Object.keys(this._callbacks);
for (let i = 0; i < keys.length; i++) {
delete this._callbacks[keys[i]];
}
}
disposedInstance() {
/** there is nothing to do */
}
}