UNPKG

@tdb/web

Version:

Common condiguration for serving a web-site and testing web-based UI components.

134 lines (112 loc) 3.06 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise")); var _assign = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/assign")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass")); // based on https://github.com/sindresorhus/p-queue (MIT) // modified for browser support var Queue = /*#__PURE__*/ function () { function Queue() { (0, _classCallCheck2.default)(this, Queue); this._queue = []; } (0, _createClass2.default)(Queue, [{ key: "enqueue", value: function enqueue(run) { this._queue.push(run); } }, { key: "dequeue", value: function dequeue() { return this._queue.shift(); } }, { key: "size", get: function get() { return this._queue.length; } }]); return Queue; }(); var PQueue = /*#__PURE__*/ function () { function PQueue(opts) { (0, _classCallCheck2.default)(this, PQueue); opts = (0, _assign.default)({ concurrency: Infinity, queueClass: Queue }, opts); if (opts.concurrency < 1) { throw new TypeError('Expected `concurrency` to be a number from 1 and up'); } this.queue = new opts.queueClass(); // eslint-disable-line new-cap this._pendingCount = 0; this._concurrency = opts.concurrency; this._resolveEmpty = function () {}; } (0, _createClass2.default)(PQueue, [{ key: "_next", value: function _next() { this._pendingCount--; if (this.queue.size > 0) { this.queue.dequeue()(); } else { this._resolveEmpty(); } } }, { key: "add", value: function add(fn, opts) { var _this = this; return new _promise.default(function (resolve, reject) { var run = function run() { _this._pendingCount++; fn().then(function (val) { resolve(val); _this._next(); }, function (err) { reject(err); _this._next(); }); }; if (_this._pendingCount < _this._concurrency) { run(); } else { _this.queue.enqueue(run, opts); } }); } }, { key: "onEmpty", value: function onEmpty() { var _this2 = this; return new _promise.default(function (resolve) { var existingResolve = _this2._resolveEmpty; _this2._resolveEmpty = function () { existingResolve(); resolve(); }; }); } }, { key: "size", get: function get() { return this.queue.size; } }, { key: "pending", get: function get() { return this._pendingCount; } }]); return PQueue; }(); exports.default = PQueue;