122 lines
4.0 KiB
JavaScript
122 lines
4.0 KiB
JavaScript
"use strict";
|
|
|
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
|
|
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
|
|
const _require = require('es6-promisify'),
|
|
promisify = _require.promisify;
|
|
|
|
const fs = require('fs');
|
|
|
|
exports.write =
|
|
/*#__PURE__*/
|
|
function () {
|
|
var _ref = _asyncToGenerator(function* (path, data) {
|
|
const externalBuffers = [];
|
|
const dataString = JSON.stringify(data, function replacerFunction(k, value) {
|
|
//Buffers searilize to {data: [...], type: "Buffer"}
|
|
if (value && value.type === 'Buffer' && value.data && value.data.length >= 1024
|
|
/* only save bigger Buffers external, small ones can be inlined */
|
|
) {
|
|
const buffer = Buffer.from(value.data);
|
|
externalBuffers.push({
|
|
index: externalBuffers.length,
|
|
buffer: buffer
|
|
});
|
|
return {
|
|
type: 'ExternalBuffer',
|
|
index: externalBuffers.length - 1,
|
|
size: buffer.length
|
|
};
|
|
} else {
|
|
return value;
|
|
}
|
|
}); //save main json file
|
|
|
|
yield promisify(fs.writeFile)(path + '.json', dataString, 'utf8'); //save external buffers
|
|
|
|
yield Promise.all(externalBuffers.map(
|
|
/*#__PURE__*/
|
|
function () {
|
|
var _ref2 = _asyncToGenerator(function* (externalBuffer) {
|
|
yield promisify(fs.writeFile)(path + '-' + externalBuffer.index + '.bin', externalBuffer.buffer, 'utf8');
|
|
});
|
|
|
|
return function (_x3) {
|
|
return _ref2.apply(this, arguments);
|
|
};
|
|
}()));
|
|
});
|
|
|
|
return function (_x, _x2) {
|
|
return _ref.apply(this, arguments);
|
|
};
|
|
}();
|
|
|
|
exports.read =
|
|
/*#__PURE__*/
|
|
function () {
|
|
var _ref3 = _asyncToGenerator(function* (path) {
|
|
//read main json file
|
|
const dataString = yield promisify(fs.readFile)(path + '.json', 'utf8');
|
|
const externalBuffers = [];
|
|
const data = JSON.parse(dataString, function bufferReceiver(k, value) {
|
|
if (value && value.type === 'Buffer' && value.data) {
|
|
return Buffer.from(value.data);
|
|
} else if (value && value.type === 'ExternalBuffer' && typeof value.index === 'number' && typeof value.size === 'number') {
|
|
//JSON.parse is sync so we need to return a buffer sync, we will fill the buffer later
|
|
const buffer = Buffer.alloc(value.size);
|
|
externalBuffers.push({
|
|
index: +value.index,
|
|
buffer: buffer
|
|
});
|
|
return buffer;
|
|
} else {
|
|
return value;
|
|
}
|
|
}); //read external buffers
|
|
|
|
yield Promise.all(externalBuffers.map(
|
|
/*#__PURE__*/
|
|
function () {
|
|
var _ref4 = _asyncToGenerator(function* (externalBuffer) {
|
|
const fd = yield promisify(fs.open)(path + '-' + +externalBuffer.index + '.bin', 'r');
|
|
yield promisify(fs.read)(fd, externalBuffer.buffer, 0, externalBuffer.buffer.length, 0);
|
|
yield promisify(fs.close)(fd);
|
|
});
|
|
|
|
return function (_x5) {
|
|
return _ref4.apply(this, arguments);
|
|
};
|
|
}()));
|
|
return data;
|
|
});
|
|
|
|
return function (_x4) {
|
|
return _ref3.apply(this, arguments);
|
|
};
|
|
}();
|
|
|
|
exports.delete =
|
|
/*#__PURE__*/
|
|
function () {
|
|
var _ref5 = _asyncToGenerator(function* (path) {
|
|
yield promisify(fs.unlink)(path + '.json'); //delete binary files
|
|
|
|
try {
|
|
for (let i = 0; i < Infinity; i++) {
|
|
yield promisify(fs.unlink)(path + '-' + i + '.bin');
|
|
}
|
|
} catch (err) {
|
|
if (err.code === 'ENOENT') {// every binary is deleted, we are done
|
|
} else {
|
|
throw err;
|
|
}
|
|
}
|
|
});
|
|
|
|
return function (_x6) {
|
|
return _ref5.apply(this, arguments);
|
|
};
|
|
}(); |