const _level = require('level'); const promisify = require('./util/promisify'); const level = promisify(_level); class LevelDbSerializer { constructor({ cacheDirPath }) { this.path = cacheDirPath; this.leveldbLock = Promise.resolve(); } read() { const start = Date.now(); const moduleCache = {}; return level(this.path) .then( db => new Promise((resolve, reject) => { const dbClose = promisify(db.close, { context: db }); db.createReadStream() .on('data', data => { const value = data.value; if (!moduleCache[data.key]) { moduleCache[data.key] = value; } }) .on('end', () => { dbClose().then(resolve, reject); }); }), ) .then(() => moduleCache); } write(moduleOps) { const ops = moduleOps; if (ops.length === 0) { return Promise.resolve(); } for (let i = 0; i < ops.length; i++) { if (ops[i].value === null) { ops[i].type = 'delete'; } else { if (typeof ops[i].value !== 'string') { ops[i].value = JSON.stringify(ops[i].value); } ops[i].type = 'put'; } } const cachePath = this.path; return (this.leveldbLock = this.leveldbLock .then(() => level(cachePath)) .then(db => promisify(db.batch, { context: db })(ops).then(() => db)) .then(db => promisify(db.close, { context: db })())); } } module.exports = LevelDbSerializer;