保誠-保戶業務員媒合平台
HelenHuang
2022-06-09 9bdb95c9e34cef640534e5e5a1e2225a80442000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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;