1 import assert from 'assert'
2 import fsPromises from 'fs/promises'
5 constructor(block_size) {
6 this.block_size = block_size || 0x1000
11 this.write_list_len = 0
15 assert(this.log === null)
17 this.log = await fsPromises.open(path, 'w+')
21 this.write_list_len = 0
25 assert(this.log !== null)
28 await this.log.close()
33 let ptr = this.eof + this.write_list_len
35 let buffer = Buffer.from(
36 JSON.stringify(value, null, 2) + '\n',
39 this.write_list.push(buffer)
40 this.write_list_len += buffer.length
42 if (this.write_list_len >= this.block_size)
45 return [ptr, buffer.length - 1]
48 async write_root(value) {
49 let buffer = Buffer.from(
50 `<${JSON.stringify(value, null, 2)}>\n`,
53 this.write_list.push(buffer)
54 this.write_list_len += buffer.length
56 if (this.write_list_len >= this.block_size)
61 if (this.write_list_len === 0)
64 let buffer = Buffer.concat(this.write_list)
65 let len = buffer.length
66 assert(len === this.write_list_len)
68 (await this.log.write(buffer, 0, len, this.eof)).bytesWritten === len
73 this.write_list_len = 0
76 async copy_pass(log, value) {
77 let copy = async ptr_len => {
78 let [ptr, len] = ptr_len
80 if (Object.prototype.hasOwnProperty.call(this.translate, ptr))
81 return this.translate[ptr]
83 let buffer = Buffer.alloc(len)
85 (await log.read(buffer, 0, len, ptr)).bytesRead === len
87 let value = JSON.parse(buffer.toString('utf-8'))
89 assert(typeof value === 'object' && value !== null)
90 if (value instanceof Array)
91 for (let i = 0; i < value.length; ++i) {
92 let child_value = value[i]
93 if (child_value instanceof Array)
94 value[i] = await copy(child_value)
97 for (let i in value) {
98 let child_value = value[i]
99 if (child_value instanceof Array)
100 value[i] = await copy(child_value)
103 let result = await this.write(value)
104 this.translate[ptr] = result
108 if (value instanceof Array)
109 value = await copy(value)
110 await this.write_root(value)
116 export default CopyCollector