wal
Version:
An implementation of write-ahead logging (WAL) for nodejs.
100 lines (78 loc) • 5.97 kB
JavaScript
'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; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var $queue = Symbol('queue');
var $offset = Symbol('offset');
/**
* A simple queue class.
*
* This is an obvious es6 dirivative of [Stephen Morley's queue implementation](http://code.stephenmorley.org/javascript/queues/).
*/
var Queue = function () {
/**
* Creates a new instance.
*/
function Queue() {
_classCallCheck(this, Queue);
this[$queue] = [];
this[$offset] = 0;
}
/**
* @type {number} The queue's length.
*/
_createClass(Queue, [{
key: 'enqueue',
/**
* Enqueues the specified item.
* @param item - An item to put on the queue.
*/
value: function enqueue(item) {
this[$queue].push(item);
}
/**
* Dequeues the item at the head of the queue, removing the item.
* @return The item at the head of the queue or `undefined` if the queue is empty.
*/
}, {
key: 'dequeue',
value: function dequeue() {
if (this.length === 0) {
return undefined;
}
var item = this[$queue][this[$offset]];
if (++this[$offset] * 2 >= this[$queue].length) {
this[$queue] = this[$queue].slice(this[$offset]);
this[$offset] = 0;
}
return item;
}
/**
* Peeks at the item at the head of the queue without removing it.
* @return The item at the head of the queue or `undefined` if the queue is empty.
*/
}, {
key: 'peek',
value: function peek() {
return this.length > 0 ? this[$queue][this[$offset]] : undefined;
}
}, {
key: 'length',
get: function get() {
return this[$queue].length - this[$offset];
}
/**
* @type {boolean} Indicates whether the queue is empty.
*/
}, {
key: 'isEmpty',
get: function get() {
return this.length === 0;
}
}]);
return Queue;
}();
exports.default = Queue;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9xdWV1ZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztBQUVBLElBQU0sU0FBUyxPQUFPLE9BQVAsQ0FBZjtBQUNBLElBQU0sVUFBVSxPQUFPLFFBQVAsQ0FBaEI7Ozs7Ozs7O0lBT00sSzs7Ozs7O0FBS0osbUJBQWM7QUFBQTs7QUFDWixTQUFLLE1BQUwsSUFBZSxFQUFmO0FBQ0EsU0FBSyxPQUFMLElBQWdCLENBQWhCO0FBQ0Q7Ozs7Ozs7Ozs7Ozs7Ozs0QkFvQk8sSSxFQUFNO0FBQ1osV0FBSyxNQUFMLEVBQWEsSUFBYixDQUFrQixJQUFsQjtBQUNEOzs7Ozs7Ozs7OEJBTVM7QUFDUixVQUFJLEtBQUssTUFBTCxLQUFnQixDQUFwQixFQUF1QjtBQUNyQixlQUFPLFNBQVA7QUFDRDtBQUNELFVBQUksT0FBTyxLQUFLLE1BQUwsRUFBYSxLQUFLLE9BQUwsQ0FBYixDQUFYO0FBQ0EsVUFBSSxFQUFFLEtBQUssT0FBTCxDQUFGLEdBQWtCLENBQWxCLElBQXVCLEtBQUssTUFBTCxFQUFhLE1BQXhDLEVBQWdEO0FBQzlDLGFBQUssTUFBTCxJQUFlLEtBQUssTUFBTCxFQUFhLEtBQWIsQ0FBbUIsS0FBSyxPQUFMLENBQW5CLENBQWY7QUFDQSxhQUFLLE9BQUwsSUFBZ0IsQ0FBaEI7QUFDRDtBQUNELGFBQU8sSUFBUDtBQUNEOzs7Ozs7Ozs7MkJBTU07QUFDTCxhQUFRLEtBQUssTUFBTCxHQUFjLENBQWQsR0FBa0IsS0FBSyxNQUFMLEVBQWEsS0FBSyxPQUFMLENBQWIsQ0FBbEIsR0FBZ0QsU0FBeEQ7QUFDRDs7O3dCQXpDWTtBQUNYLGFBQVEsS0FBSyxNQUFMLEVBQWEsTUFBYixHQUFzQixLQUFLLE9BQUwsQ0FBOUI7QUFDRDs7Ozs7Ozs7d0JBS2E7QUFDWixhQUFRLEtBQUssTUFBTCxLQUFnQixDQUF4QjtBQUNEOzs7Ozs7a0JBbUNZLEsiLCJmaWxlIjoicXVldWUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0ICRxdWV1ZSA9IFN5bWJvbCgncXVldWUnKTtcbmNvbnN0ICRvZmZzZXQgPSBTeW1ib2woJ29mZnNldCcpO1xuXG4vKipcbiAqIEEgc2ltcGxlIHF1ZXVlIGNsYXNzLlxuICpcbiAqIFRoaXMgaXMgYW4gb2J2aW91cyBlczYgZGlyaXZhdGl2ZSBvZiBbU3RlcGhlbiBNb3JsZXkncyBxdWV1ZSBpbXBsZW1lbnRhdGlvbl0oaHR0cDovL2NvZGUuc3RlcGhlbm1vcmxleS5vcmcvamF2YXNjcmlwdC9xdWV1ZXMvKS5cbiAqL1xuY2xhc3MgUXVldWUge1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLlxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpc1skcXVldWVdID0gW107XG4gICAgdGhpc1skb2Zmc2V0XSA9IDA7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge251bWJlcn0gVGhlIHF1ZXVlJ3MgbGVuZ3RoLlxuICAgKi9cbiAgZ2V0IGxlbmd0aCgpIHtcbiAgICByZXR1cm4gKHRoaXNbJHF1ZXVlXS5sZW5ndGggLSB0aGlzWyRvZmZzZXRdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHF1ZXVlIGlzIGVtcHR5LlxuICAgKi9cbiAgZ2V0IGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuICh0aGlzLmxlbmd0aCA9PT0gMCk7XG4gIH1cblxuICAvKipcbiAgICogRW5xdWV1ZXMgdGhlIHNwZWNpZmllZCBpdGVtLlxuICAgKiBAcGFyYW0gaXRlbSAtIEFuIGl0ZW0gdG8gcHV0IG9uIHRoZSBxdWV1ZS5cbiAgICovXG4gIGVucXVldWUoaXRlbSkge1xuICAgIHRoaXNbJHF1ZXVlXS5wdXNoKGl0ZW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcXVldWVzIHRoZSBpdGVtIGF0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSwgcmVtb3ZpbmcgdGhlIGl0ZW0uXG4gICAqIEByZXR1cm4gVGhlIGl0ZW0gYXQgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIG9yIGB1bmRlZmluZWRgIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICovXG4gIGRlcXVldWUoKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgaXRlbSA9IHRoaXNbJHF1ZXVlXVt0aGlzWyRvZmZzZXRdXTtcbiAgICBpZiAoKyt0aGlzWyRvZmZzZXRdICogMiA+PSB0aGlzWyRxdWV1ZV0ubGVuZ3RoKSB7XG4gICAgICB0aGlzWyRxdWV1ZV0gPSB0aGlzWyRxdWV1ZV0uc2xpY2UodGhpc1skb2Zmc2V0XSk7XG4gICAgICB0aGlzWyRvZmZzZXRdID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW07XG4gIH1cblxuICAvKipcbiAgICogUGVla3MgYXQgdGhlIGl0ZW0gYXQgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIHdpdGhvdXQgcmVtb3ZpbmcgaXQuXG4gICAqIEByZXR1cm4gVGhlIGl0ZW0gYXQgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIG9yIGB1bmRlZmluZWRgIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICovXG4gIHBlZWsoKSB7XG4gICAgcmV0dXJuICh0aGlzLmxlbmd0aCA+IDAgPyB0aGlzWyRxdWV1ZV1bdGhpc1skb2Zmc2V0XV0gOiB1bmRlZmluZWQpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFF1ZXVlO1xuIl19