hard-source-webpack-plugin
Version:
Hard cache the source of modules in webpack.
64 lines (53 loc) • 1.58 kB
JavaScript
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;