diff --git a/src/api/log.js b/src/api/log.js index 6ad0818d9..6c05b5260 100644 --- a/src/api/log.js +++ b/src/api/log.js @@ -1,5 +1,5 @@ export async function get ({namespace}) { - const logger = this.getLogger(namespace) + const logger = await this.getLogger(namespace) return new Promise((resolve, reject) => { const logs = {} @@ -17,8 +17,8 @@ export async function get ({namespace}) { get.description = 'returns logs list for one namespace' -function delete_ ({namespace, id}) { - const logger = this.getLogger(namespace) +async function delete_ ({namespace, id}) { + const logger = await this.getLogger(namespace) logger.del(id) } diff --git a/src/job-executor.js b/src/job-executor.js index 562e4697f..bc76f685c 100644 --- a/src/job-executor.js +++ b/src/job-executor.js @@ -50,9 +50,9 @@ export default class JobExecutor { } // The logger is not available until Xo has started. - xo.on('started', () => { - this._logger = this.xo.getLogger('jobs') - }) + xo.on('starting', () => xo.getLogger('jobs').then(logger => { + this._logger = logger + })) } async exec (job) { diff --git a/src/xo-mixins/store.js b/src/xo-mixins/store.js new file mode 100644 index 000000000..7f86478d8 --- /dev/null +++ b/src/xo-mixins/store.js @@ -0,0 +1,50 @@ +import levelup from 'level-party' +import sublevel from 'level-sublevel' +import { ensureDir } from 'fs-promise' + +// =================================================================== + +const _levelHas = function has (key, cb) { + if (cb) { + return this.get(key, (error, value) => error + ? ( + error.notFound + ? cb(null, false) + : cb(error) + ) + : cb(null, true) + ) + } + + try { + this.get(key) + return true + } catch (error) { + if (!error.notFound) { + throw error + } + } + return false +} +const levelHas = db => { + db.has = _levelHas + + return db +} + +// =================================================================== + +export default class { + constructor (xo) { + const dir = `${xo._config.datadir}/leveldb` + this._db = ensureDir(dir).then(() => { + return sublevel(levelup(dir, { + valueEncoding: 'json' + })) + }) + } + + getStore (namespace) { + return this._db.then(db => levelHas(db.sublevel(namespace))) + } +} diff --git a/src/xo.js b/src/xo.js index 51691203a..aeae3b85b 100644 --- a/src/xo.js +++ b/src/xo.js @@ -4,8 +4,6 @@ import fs from 'fs-promise' import includes from 'lodash.includes' import isFunction from 'lodash.isfunction' import isString from 'lodash.isstring' -import levelup from 'level-party' -import sublevel from 'level-sublevel' import XoCollection from 'xo-collection' import XoUniqueIndex from 'xo-collection/unique-index' import {createClient as createRedisClient} from 'redis' @@ -107,16 +105,8 @@ export default class Xo extends EventEmitter { async start () { this.start = noop - const { _config: config } = this - this._watchObjects() - await fs.mkdirp(config.datadir) - - this._leveldb = sublevel(levelup(`${config.datadir}/leveldb`, { - valueEncoding: 'json' - })) - // --------------------------------------------------------------- const redis = this._redis @@ -212,10 +202,10 @@ export default class Xo extends EventEmitter { // ----------------------------------------------------------------- getLogger (namespace) { - return new LevelDbLogger( - this._leveldb.sublevel('logs'), + return this.getStore('logs').then(store => new LevelDbLogger( + store, namespace - ) + )) } // -----------------------------------------------------------------