UNPKG

@cleanweb/utils

Version:

Simple, tiny, straight-forward utils for everyday Typescript needs.

72 lines (71 loc) 2.64 kB
"use strict"; 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;