marsdb
Version:
MarsDB is a lightweight client-side MongoDB-like database, Promise based, written in ES6
143 lines (115 loc) • 4.08 kB
JavaScript
;
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; }; }();
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.StorageManager = undefined;
var _keys2 = require('fast.js/object/keys');
var _keys3 = _interopRequireDefault(_keys2);
var _eventemitter = require('eventemitter3');
var _eventemitter2 = _interopRequireDefault(_eventemitter);
var _PromiseQueue = require('./PromiseQueue');
var _PromiseQueue2 = _interopRequireDefault(_PromiseQueue);
var _EJSON = require('./EJSON');
var _EJSON2 = _interopRequireDefault(_EJSON);
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"); } }
/**
* Manager for dealing with backend storage
* of the daatabase. Default implementation uses
* memory. You can implement the same interface
* and use another storage (with levelup, for example)
*/
var StorageManager = exports.StorageManager = function () {
function StorageManager(db) {
var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
_classCallCheck(this, StorageManager);
this.db = db;
this.options = options;
this._queue = new _PromiseQueue2.default(1);
this._storage = {};
this.reload();
}
_createClass(StorageManager, [{
key: 'loaded',
value: function loaded() {
return this._loadedPromise;
}
}, {
key: 'reload',
value: function reload() {
var _this = this;
if (this._loadedPromise) {
this._loadedPromise = this._loadedPromise.then(function () {
return _this._loadStorage();
});
} else {
this._loadedPromise = this._loadStorage();
}
return this.loaded();
}
}, {
key: 'destroy',
value: function destroy() {
var _this2 = this;
return this.loaded().then(function () {
_this2._storage = {};
});
}
}, {
key: 'persist',
value: function persist(key, value) {
var _this3 = this;
return this.loaded().then(function () {
_this3._storage[key] = _EJSON2.default.clone(value);
});
}
}, {
key: 'delete',
value: function _delete(key) {
var _this4 = this;
return this.loaded().then(function () {
delete _this4._storage[key];
});
}
}, {
key: 'get',
value: function get(key) {
var _this5 = this;
return this.loaded().then(function () {
return _this5._storage[key];
});
}
}, {
key: 'createReadStream',
value: function createReadStream() {
var _this6 = this;
var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
// Very limited subset of ReadableStream
var paused = false;
var emitter = new _eventemitter2.default();
emitter.pause = function () {
return paused = true;
};
this.loaded().then(function () {
var keys = (0, _keys3.default)(_this6._storage);
for (var i = 0; i < keys.length; i++) {
emitter.emit('data', { value: _this6._storage[keys[i]] });
if (paused) {
return;
}
}
emitter.emit('end');
});
return emitter;
}
}, {
key: '_loadStorage',
value: function _loadStorage() {
this._storage = {};
return Promise.resolve();
}
}]);
return StorageManager;
}();
exports.default = StorageManager;