@cleanweb/utils
Version:
Simple, tiny, straight-forward utils for everyday Typescript needs.
72 lines (71 loc) • 2.64 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var Subscribable = /** @class */ (function () {
function Subscribable() {
var params = [];
for (var _i = 0; _i < arguments.length; _i++) {
params[_i] = arguments[_i];
}
var _this = this;
this._subscribers = {};
this._allTimeSubscribersCount = 0;
/** @inheritdoc {@link IPublisher} */
this._publisher = {
publish: function (data) { return _this._publish(data); },
done: function () { return _this._close(); },
};
this._publish = function (data) {
Object.values(_this._subscribers).forEach(function (subscriber) {
subscriber.next(data);
});
_this._lastPublishedData = data;
};
this._close = function () {
Object.values(_this._subscribers).forEach(function (subscriber) {
subscriber.onComplete();
});
_this._lastPublishedData = undefined;
_this._allTimeSubscribersCount = 0;
};
this.subscribe = function (onPublish, onComplete, freshOnly) {
var position = _this._allTimeSubscribersCount++;
_this._subscribers[position] = {
next: function (data) {
onPublish(data);
},
onComplete: function () {
onComplete === null || onComplete === void 0 ? void 0 : onComplete();
},
};
if (Object.keys(_this._subscribers).length === 1) {
_this._start();
}
;
if (!freshOnly && _this._lastPublishedData !== undefined) {
onPublish(_this._lastPublishedData);
}
return function () {
delete _this._subscribers[position];
if (Object.keys(_this._subscribers).length === 0) {
_this._pause();
}
};
};
var start = params[0], pause = params[1], initialData = params[2];
this._start = function () {
start(_this._publisher);
};
this._pause = function () { return pause(); };
this._lastPublishedData = initialData;
}
Object.defineProperty(Subscribable.prototype, "snapshot", {
/** Returns the data that was last published. */
get: function () {
return this._lastPublishedData;
},
enumerable: false,
configurable: true
});
return Subscribable;
}());
exports.default = Subscribable;