@awesome-nodes/mvvm
Version:
Application development framework using the *model* *view* *view-model* design pattern.
52 lines (42 loc) • 10.4 kB
JavaScript
import { InjectionScope } from '@awesome-nodes/injection-factory';
import { EventArgs } from '@awesome-nodes/object';
export class EventDelegate {
get eventEmitter() {
return this._eventEmitter;
}
constructor(_producer) {
this._producer = _producer;
this._subscriptions = new Map();
this._eventEmitter = new EVENT_EMITTER_TOKEN.value();
}
subscribe(observer, thisArg) {
let next;
let error;
let complete;
if (typeof observer == 'function') next = observer;else ({
next,
error,
complete
} = observer);
if (this._subscriptions.get(next)) this.unsubscribe(next);
const subscription = this._eventEmitter.subscribe(delegate => {
delegate(thisArg ? next.bind(thisArg) : next);
}, error && thisArg ? error.bind(thisArg) : error, complete && thisArg ? complete.bind(thisArg) : complete);
subscription.add(() => {
this._subscriptions.delete(next);
});
this._subscriptions.set(next, subscription);
return subscription;
}
unsubscribe(observer) {
const subscription = this._subscriptions.get(typeof observer == 'function' ? observer : observer.next);
if (subscription && subscription.closed === false) subscription.unsubscribe();
}
invoke(ea = EventArgs.empty) {
this._eventEmitter.emit((delagate, thisArg) => {
(thisArg ? delagate.bind(thisArg) : delagate)(this._producer, ea);
});
}
}
export const EVENT_EMITTER_TOKEN = InjectionScope.get(EventDelegate, null).addToken('event-emitter');
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tdnZtL21vZGVsL0V2ZW50RGVsZWdhdGUudHMiXSwibmFtZXMiOlsiSW5qZWN0aW9uU2NvcGUiLCJFdmVudEFyZ3MiLCJFdmVudERlbGVnYXRlIiwiZXZlbnRFbWl0dGVyIiwiX2V2ZW50RW1pdHRlciIsImNvbnN0cnVjdG9yIiwiX3Byb2R1Y2VyIiwiX3N1YnNjcmlwdGlvbnMiLCJNYXAiLCJFVkVOVF9FTUlUVEVSX1RPS0VOIiwidmFsdWUiLCJzdWJzY3JpYmUiLCJvYnNlcnZlciIsInRoaXNBcmciLCJuZXh0IiwiZXJyb3IiLCJjb21wbGV0ZSIsImdldCIsInVuc3Vic2NyaWJlIiwic3Vic2NyaXB0aW9uIiwiZGVsZWdhdGUiLCJiaW5kIiwiYWRkIiwiZGVsZXRlIiwic2V0IiwiY2xvc2VkIiwiaW52b2tlIiwiZWEiLCJlbXB0eSIsImVtaXQiLCJkZWxhZ2F0ZSIsImFkZFRva2VuIl0sIm1hcHBpbmdzIjoiQUFDQSxTQUFTQSxjQUFULFFBQStDLGtDQUEvQztBQUNBLFNBQVNDLFNBQVQsUUFBa0QsdUJBQWxEO0FBOEJBLE9BQU8sTUFBTUMsYUFBTixDQUVQO0FBUzJCLE1BQVpDLFlBQVksR0FDdkI7QUFDSSxXQUFPLEtBQUtDLGFBQVo7QUFDSDs7QUFNTUMsRUFBQUEsV0FBVyxDQUFXQyxTQUFYLEVBQ2xCO0FBQUEsU0FENkJBLFNBQzdCLEdBRDZCQSxTQUM3QjtBQUFBLFNBbEJpQkMsY0FrQmpCLEdBbEJtQyxJQUFJQyxHQUFKLEVBa0JuQztBQUFBLFNBakJtQkosYUFpQm5CLEdBakJtQyxJQUFJSyxtQkFBbUIsQ0FBQ0MsS0FBeEIsRUFpQm5DO0FBQUU7O0FBUUtDLEVBQUFBLFNBQVMsQ0FDWkMsUUFEWSxFQUVaQyxPQUZZLEVBR2hCO0FBQ0ksUUFBSUMsSUFBSjtBQUNBLFFBQUlDLEtBQUo7QUFDQSxRQUFJQyxRQUFKO0FBRUEsUUFBSSxPQUFPSixRQUFQLElBQW1CLFVBQXZCLEVBQ0lFLElBQUksR0FBR0YsUUFBUCxDQURKLEtBR0ksQ0FBQztBQUFFRSxNQUFBQSxJQUFGO0FBQVFDLE1BQUFBLEtBQVI7QUFBZUMsTUFBQUE7QUFBZixRQUE0QkosUUFBN0I7QUFFSixRQUFJLEtBQUtMLGNBQUwsQ0FBb0JVLEdBQXBCLENBQXdCSCxJQUF4QixDQUFKLEVBQ0ksS0FBS0ksV0FBTCxDQUFpQkosSUFBakI7O0FBRUosVUFBTUssWUFBWSxHQUFHLEtBQUtmLGFBQUwsQ0FBbUJPLFNBQW5CLENBQ2hCUyxRQUFELElBQ0E7QUFDSUEsTUFBQUEsUUFBUSxDQUFDUCxPQUFPLEdBQUdDLElBQUksQ0FBQ08sSUFBTCxDQUFVUixPQUFWLENBQUgsR0FBd0JDLElBQWhDLENBQVI7QUFDSCxLQUpnQixFQUtqQkMsS0FBSyxJQUFJRixPQUFULEdBQW1CRSxLQUFLLENBQUNNLElBQU4sQ0FBV1IsT0FBWCxDQUFuQixHQUF5Q0UsS0FMeEIsRUFNakJDLFFBQVEsSUFBSUgsT0FBWixHQUFzQkcsUUFBUSxDQUFDSyxJQUFULENBQWNSLE9BQWQsQ0FBdEIsR0FBK0NHLFFBTjlCLENBQXJCOztBQVFBRyxJQUFBQSxZQUFZLENBQUNHLEdBQWIsQ0FBaUIsTUFDakI7QUFDSSxXQUFLZixjQUFMLENBQW9CZ0IsTUFBcEIsQ0FBMkJULElBQTNCO0FBQ0gsS0FIRDs7QUFJQSxTQUFLUCxjQUFMLENBQW9CaUIsR0FBcEIsQ0FBd0JWLElBQXhCLEVBQThCSyxZQUE5Qjs7QUFFQSxXQUFPQSxZQUFQO0FBQ0g7O0FBRU1ELEVBQUFBLFdBQVcsQ0FBQ04sUUFBRCxFQUNsQjtBQUNJLFVBQU1PLFlBQVksR0FBRyxLQUFLWixjQUFMLENBQW9CVSxHQUFwQixDQUF3QixPQUFPTCxRQUFQLElBQW1CLFVBQW5CLEdBQWdDQSxRQUFoQyxHQUEyQ0EsUUFBUSxDQUFDRSxJQUE1RSxDQUFyQjs7QUFFQSxRQUFJSyxZQUFZLElBQUlBLFlBQVksQ0FBQ00sTUFBYixLQUF3QixLQUE1QyxFQUNJTixZQUFZLENBQUNELFdBQWI7QUFDUDs7QUFFTVEsRUFBQUEsTUFBTSxDQUFDQyxFQUFjLEdBQUcxQixTQUFTLENBQUMyQixLQUE1QixFQUNiO0FBQ0ksU0FBS3hCLGFBQUwsQ0FBbUJ5QixJQUFuQixDQUF3QixDQUFDQyxRQUFELEVBQXdDakIsT0FBeEMsS0FDeEI7QUFDSSxPQUFDQSxPQUFPLEdBQUdpQixRQUFRLENBQUNULElBQVQsQ0FBY1IsT0FBZCxDQUFILEdBQTRCaUIsUUFBcEMsRUFBOEMsS0FBS3hCLFNBQW5ELEVBQThEcUIsRUFBOUQ7QUFDSCxLQUhEO0FBSUg7O0FBMUVMO0FBNkVBLE9BQU8sTUFBTWxCLG1CQUFrRCxHQUFHVCxjQUFjLENBQzNFaUIsR0FENkQsQ0FDekRmLGFBRHlELEVBQzFDLElBRDBDLEVBQ3BDNkIsUUFEb0MsQ0FDM0IsZUFEMkIsQ0FBM0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbmltcG9ydCB7IEluamVjdGlvblNjb3BlLCBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhd2Vzb21lLW5vZGVzL2luamVjdGlvbi1mYWN0b3J5JztcbmltcG9ydCB7IEV2ZW50QXJncywgSUV2ZW50LCBJRXZlbnREZWxlZ2F0ZSB9IGZyb20gJ0Bhd2Vzb21lLW5vZGVzL29iamVjdCc7XG5pbXBvcnQgeyBJRGVsZWdhdGUgfSBmcm9tICdAYXdlc29tZS1ub2Rlcy9vYmplY3QvbW9kZWwnO1xuaW1wb3J0IHsgT2JqZWN0TW9kZWwgfSBmcm9tICdtdnZtL21vZGVsL09iamVjdE1vZGVsJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgSUV2ZW50T2JzZXJ2ZXI8VFNlbmRlciBleHRlbmRzIE9iamVjdE1vZGVsLCBURXZlbnRBcmdzIGV4dGVuZHMgRXZlbnRBcmdzID0gRXZlbnRBcmdzPlxue1xuICAgIG5leHQ6IElFdmVudDxUU2VuZGVyLCBURXZlbnRBcmdzPjtcbiAgICBlcnJvcj86IChlcnI6IHVua25vd24pID0+IHZvaWQ7XG4gICAgY29tcGxldGU/OiAoKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFdmVudEVtaXR0ZXI8VFNlbmRlciBleHRlbmRzIE9iamVjdE1vZGVsID0gT2JqZWN0TW9kZWwsIFRFdmVudEFyZ3MgZXh0ZW5kcyBFdmVudEFyZ3MgPSBFdmVudEFyZ3M+XG57XG4gICAgLy90c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tZmxhZy1hcmdzXG4gICAgbmV3KGFzeW5jPzogYm9vbGVhbik6IHRoaXM7XG5cbiAgICBlbWl0KGRlbGVnYXRlOiBJRXZlbnREZWxlZ2F0ZTxUU2VuZGVyLCBURXZlbnRBcmdzPik6IHZvaWQ7XG5cbiAgICBzdWJzY3JpYmUoXG4gICAgICAgIG5leHQ/OiAodmFsdWU6IElFdmVudERlbGVnYXRlPFRTZW5kZXIsIFRFdmVudEFyZ3M+KSA9PiB2b2lkLFxuICAgICAgICBlcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gdm9pZCxcbiAgICAgICAgY29tcGxldGU/OiAoKSA9PiB2b2lkKTogU3Vic2NyaXB0aW9uO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBzaW1wbGUgZXZlbnQgZGVsZWdhdGUgdXNlZCB0byBlbmNhcHN1bGF0ZSBhbnkgd2ViIGZyb250ZW5kIGZyYW1ld29yayBldmVudCBlbWl0dGVyIG9iamVjdC5cbiAqIEB0ZW1wbGF0ZSBUU2VuZGVyLCBURXZlbnRBcmdzXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudERlbGVnYXRlPFRTZW5kZXIgZXh0ZW5kcyBPYmplY3RNb2RlbCwgVEV2ZW50QXJncyBleHRlbmRzIEV2ZW50QXJncyA9IEV2ZW50QXJncz5cbiAgICBpbXBsZW1lbnRzIElEZWxlZ2F0ZTxUU2VuZGVyLCBURXZlbnRBcmdzPlxue1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3N1YnNjcmlwdGlvbnMgID0gbmV3IE1hcDxJRXZlbnQ8VFNlbmRlciwgVEV2ZW50QXJncz4sIFN1YnNjcmlwdGlvbj4oKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2V2ZW50RW1pdHRlciA9IG5ldyBFVkVOVF9FTUlUVEVSX1RPS0VOLnZhbHVlKCkgYXMgdW5rbm93biBhcyBJRXZlbnRFbWl0dGVyPFRTZW5kZXIsIFRFdmVudEFyZ3M+O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgd2VuIGZyYW1ld29yayBFdmVudEVtaXR0ZXIgdXNlZCBvbmx5IHdpdGhpbiBhbmd1bGFyIGNvbXBvbmVudHMuXG4gICAgICogQGFjY2VzcyBBbnkgYWNjZXNzIGZyb20gYSB2aWV3LW1vZGVsLCBtb2RlbCBvciBzZXJ2aWNlIGlzIG5vdFxuICAgICAqIHBlcm1pdHRlZCBiZWNhdXNlIGl0IGNvdXBsZXMgYW5ndWxhciBjb2RlIHRvIHRoZSBvYmplY3QgbW9kZWwuXG4gICAgICovXG4gICAgcHVibGljIGdldCBldmVudEVtaXR0ZXIoKTogSUV2ZW50RW1pdHRlcjxUU2VuZGVyLCBURXZlbnRBcmdzPlxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50RW1pdHRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyB0aGlzIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtUU2VuZGVyfSBfcHJvZHVjZXIgVGhlIGV2ZW50IHByb2R1Y2VyIHRvIGJlIHVzZWQgYXMgYHRoaXNBcmdgIGZvciB0aGUgY29tbWFuZCBoYW5kbGVyIGludm9jYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfcHJvZHVjZXI6IFRTZW5kZXIpXG4gICAge31cblxuICAgIC8qKlxuICAgICAqIFN1YnNjcmliZXMgdG8gdGhlIHVuZGVybHlpbmcgRXZlbnRFbWl0dGVyIG9ic2VydmFibGUgYW5kIGRlbGVnYXRlcyBldmVudFxuICAgICAqIHN1YnNjcmlwdGlvbiB0byBjb21tZW5kIHBhdHRlcm4gc3R5bGUgaGFuZGxlciBmdW5jdGlvbnMuXG4gICAgICogQHBhcmFtIG9ic2VydmVyIFRoZSBuZXh0IG9ic2VydmVyIGZ1bmN0aW9uIG9yIGFuIGV2ZW50IG9ic2VydmVyIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB0aGlzQXJnIElmIHByb3ZpZGVkLCBhbGwgb2JzZXJ2ZXIgZnVuY3Rpb25zIGFyZSBpbnZva2VkIG9uIGV4Y2VwdCB0aGUgZXJyb3Igb2JzZXJ2ZXIuXG4gICAgICovXG4gICAgcHVibGljIHN1YnNjcmliZShcbiAgICAgICAgb2JzZXJ2ZXI6IElFdmVudDxUU2VuZGVyLCBURXZlbnRBcmdzPiB8IElFdmVudE9ic2VydmVyPFRTZW5kZXIsIFRFdmVudEFyZ3M+LFxuICAgICAgICB0aGlzQXJnPzogb2JqZWN0KTogU3Vic2NyaXB0aW9uXG4gICAge1xuICAgICAgICBsZXQgbmV4dDogSUV2ZW50PFRTZW5kZXIsIFRFdmVudEFyZ3M+O1xuICAgICAgICBsZXQgZXJyb3I6ICgoZXJyOiB1bmtub3duKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGNvbXBsZXRlOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvYnNlcnZlciA9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgbmV4dCA9IG9ic2VydmVyO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICAoeyBuZXh0LCBlcnJvciwgY29tcGxldGUgfSA9IG9ic2VydmVyKTtcblxuICAgICAgICBpZiAodGhpcy5fc3Vic2NyaXB0aW9ucy5nZXQobmV4dCkpXG4gICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKG5leHQpO1xuXG4gICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuX2V2ZW50RW1pdHRlci5zdWJzY3JpYmUoXG4gICAgICAgICAgICAoZGVsZWdhdGU6IElFdmVudERlbGVnYXRlPFRTZW5kZXIsIFRFdmVudEFyZ3M+KSA9PlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRlbGVnYXRlKHRoaXNBcmcgPyBuZXh0LmJpbmQodGhpc0FyZykgOiBuZXh0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvciAmJiB0aGlzQXJnID8gZXJyb3IuYmluZCh0aGlzQXJnKSA6IGVycm9yLFxuICAgICAgICAgICAgY29tcGxldGUgJiYgdGhpc0FyZyA/IGNvbXBsZXRlLmJpbmQodGhpc0FyZykgOiBjb21wbGV0ZSxcbiAgICAgICAgKTtcbiAgICAgICAgc3Vic2NyaXB0aW9uLmFkZCgoKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmRlbGV0ZShuZXh0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMuc2V0KG5leHQsIHN1YnNjcmlwdGlvbik7XG5cbiAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgdW5zdWJzY3JpYmUob2JzZXJ2ZXI6IElFdmVudDxUU2VuZGVyLCBURXZlbnRBcmdzPiB8IElFdmVudE9ic2VydmVyPFRTZW5kZXIsIFRFdmVudEFyZ3M+KTogdm9pZFxuICAgIHtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy5fc3Vic2NyaXB0aW9ucy5nZXQodHlwZW9mIG9ic2VydmVyID09ICdmdW5jdGlvbicgPyBvYnNlcnZlciA6IG9ic2VydmVyLm5leHQpO1xuICAgICAgICAvL25vaW5zcGVjdGlvbiBQb2ludGxlc3NCb29sZWFuRXhwcmVzc2lvbkpTIHN1YnNjcmlwdGlvbi5jbG9zZWQgaXMgdW5kZWZpbmVkIGlmIG5vdCByYWlzZWRcbiAgICAgICAgaWYgKHN1YnNjcmlwdGlvbiAmJiBzdWJzY3JpcHRpb24uY2xvc2VkID09PSBmYWxzZSlcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbnZva2UoZWE6IFRFdmVudEFyZ3MgPSBFdmVudEFyZ3MuZW1wdHkgYXMgVEV2ZW50QXJncyk6IHZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5lbWl0KChkZWxhZ2F0ZTogSUV2ZW50PFRTZW5kZXIsIFRFdmVudEFyZ3M+LCB0aGlzQXJnPzogb2JqZWN0KSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICAodGhpc0FyZyA/IGRlbGFnYXRlLmJpbmQodGhpc0FyZykgOiBkZWxhZ2F0ZSkodGhpcy5fcHJvZHVjZXIsIGVhKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgRVZFTlRfRU1JVFRFUl9UT0tFTjogSW5qZWN0aW9uVG9rZW48SUV2ZW50RW1pdHRlcj4gPSBJbmplY3Rpb25TY29wZVxuICAgIC5nZXQoRXZlbnREZWxlZ2F0ZSwgbnVsbCkuYWRkVG9rZW4oJ2V2ZW50LWVtaXR0ZXInKTtcbiJdfQ==