UNPKG

mobdb

Version:

MarsDB is a lightweight client-side MongoDB-like database, Promise based, written in ES6

149 lines (118 loc) 4.23 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _try2 = require('fast.js/function/try'); var _try3 = _interopRequireDefault(_try2); var _doubleEndedQueue = require('double-ended-queue'); var _doubleEndedQueue2 = _interopRequireDefault(_doubleEndedQueue); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /** * It limits concurrently executed promises * * @param {Number} [maxPendingPromises=Infinity] max number of concurrently executed promises * @param {Number} [maxQueuedPromises=Infinity] max number of queued promises * @constructor */ var PromiseQueue = function () { function PromiseQueue() { var maxPendingPromises = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Infinity; var maxQueuedPromises = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Infinity; _classCallCheck(this, PromiseQueue); this.pendingPromises = 0; this.maxPendingPromises = maxPendingPromises; this.maxQueuedPromises = maxQueuedPromises; this.queue = new _doubleEndedQueue2.default(); this.length = 0; } /** * Pause queue processing */ _createClass(PromiseQueue, [{ key: 'pause', value: function pause() { this._paused = true; } /** * Resume queue processing */ }, { key: 'unpause', value: function unpause() { this._paused = false; this._dequeue(); } /** * Adds new promise generator in the queue * @param {Function} promiseGenerator */ }, { key: 'add', value: function add(promiseGenerator) { var _this = this; var unshift = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; return new Promise(function (resolve, reject) { if (_this.length >= _this.maxQueuedPromises) { reject(new Error('Queue limit reached')); } else { var queueItem = { promiseGenerator: promiseGenerator, resolve: resolve, reject: reject }; if (!unshift) { _this.queue.push(queueItem); } else { _this.queue.unshift(queueItem); } _this.length += 1; _this._dequeue(); } }); } /** * Internal queue processor. Starts processing of * the next queued function * @return {Boolean} */ }, { key: '_dequeue', value: function _dequeue() { var _this2 = this; if (this._paused || this.pendingPromises >= this.maxPendingPromises) { return false; } var item = this.queue.shift(); if (!item) { return false; } var result = (0, _try3.default)(function () { _this2.pendingPromises++; return Promise.resolve().then(function () { return item.promiseGenerator(); }).then(function (value) { _this2.length--; _this2.pendingPromises--; item.resolve(value); _this2._dequeue(); }, function (err) { _this2.length--; _this2.pendingPromises--; item.reject(err); _this2._dequeue(); }); }); if (result instanceof Error) { this.length--; this.pendingPromises--; item.reject(result); this._dequeue(); } return true; } }]); return PromiseQueue; }(); exports.default = PromiseQueue;