dbjs-level
Version:
leveldb driver for dbjs
53 lines (44 loc) • 1.98 kB
JavaScript
;
var normalizeOptions = require('es5-ext/object/normalize-options')
, setPrototypeOf = require('es5-ext/object/set-prototype-of')
, ensureCallable = require('es5-ext/object/valid-callable')
, ensureObject = require('es5-ext/object/valid-object')
, ensureString = require('es5-ext/object/validate-stringifiable-value')
, hyphenToCamel = require('es5-ext/string/#/hyphen-to-camel')
, d = require('d')
, deferred = require('deferred')
, resolve = require('path').resolve
, readdir = require('fs2/readdir')
, Driver = require('dbjs-persistence/driver')
, level = require('levelup')
, Storage = require('./storage')
, ReducedStorage = require('./reduced-storage')
, isIdent = RegExp.prototype.test.bind(/^[a-z][a-z0-9\-]*$/);
var LevelDriver = module.exports = Object.defineProperties(function (data) {
if (!(this instanceof LevelDriver)) return new LevelDriver(data);
this._dbOptions = normalizeOptions(ensureObject(data));
// Below is workaround for https://github.com/Raynos/xtend/pull/28
this._dbOptions.hasOwnProperty = Object.prototype.hasOwnProperty;
this.dbPath = resolve(ensureString(this._dbOptions.path));
delete this._dbOptions.path;
if (this._dbOptions.level != null) {
this.levelConstructor = ensureCallable(this._dbOptions.level);
delete this._dbOptions.level;
}
Driver.call(this, data);
}, {
storageClass: d(Storage),
reducedStorageClass: d(ReducedStorage)
});
setPrototypeOf(LevelDriver, Driver);
LevelDriver.prototype = Object.create(Driver.prototype, {
constructor: d(LevelDriver),
levelConstructor: d(level),
__resolveAllStorages: d(function () {
return readdir(this.dbPath, { type: { directory: true } }).map(function (name) {
if (!isIdent(name)) return;
this.getStorage(hyphenToCamel.call(name));
}.bind(this))(Function.prototype);
}),
__close: d(function () { return deferred(undefined); })
});