Files
liberama/server/db/JembaDb/utils.js
2021-11-24 14:15:09 +07:00

152 lines
3.1 KiB
JavaScript

const fsCB = require('fs');
const fs = fsCB.promises;
const zlib = require('zlib');
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
function sleepWithStop(ms, cb = () => {}) {
return new Promise(resolve => {
const timer = setTimeout(resolve, ms);
cb(() => { clearTimeout(timer); resolve(); });
});
}
function unionSet(arrSet) {
if (!arrSet.length)
return new Set();
let max = 0;
let size = arrSet[0].size;
for (let i = 1; i < arrSet.length; i++) {
if (arrSet[i].size > size) {
max = i;
size = arrSet[i].size;
}
}
const result = new Set(arrSet[max]);
for (let i = 0; i < arrSet.length; i++) {
if (i === max)
continue;
for (const elem of arrSet[i]) {
result.add(elem);
}
}
return result;
}
function intersectSet(arrSet) {
if (!arrSet.length)
return new Set();
let min = 0;
let size = arrSet[0].size;
for (let i = 1; i < arrSet.length; i++) {
if (arrSet[i].size < size) {
min = i;
size = arrSet[i].size;
}
}
const result = new Set();
for (const elem of arrSet[min]) {
let inAll = true;
for (let i = 0; i < arrSet.length; i++) {
if (i === min)
continue;
if (!arrSet[i].has(elem)) {
inAll = false;
break;
}
}
if (inAll)
result.add(elem);
}
return result;
}
async function pathExists(path) {
try {
await fs.access(path);
return true;
} catch(e) {
return false;
}
}
async function appendFileToFile(nameFrom, nameTo) {
return new Promise((resolve, reject) => {
const readStream = fsCB.createReadStream(nameFrom);
readStream.on('error', (err) => {
reject(err);
});
const writeStream = fsCB.createWriteStream(nameTo, {flags: 'a'});
writeStream.on('error', (err) => {
reject(err);
});
writeStream.on('close', () => {
resolve();
});
readStream.pipe(writeStream);
});
}
function esc(obj) {
return JSON.stringify(obj).replace(/@/g, '\\x40');
}
function paramToArray(param) {
return (Array.isArray(param) ? param : [param]);
}
function cloneDeep(obj) {
return JSON.parse(JSON.stringify(obj));
}
//async
function deflate(buf, compressionLevel) {
return new Promise((resolve, reject) => {
zlib.deflateRaw(buf, {level: compressionLevel}, (err, b) => {
if (err)
reject(err);
resolve(b);
});
});
}
//async
function inflate(buf) {
return new Promise((resolve, reject) => {
zlib.inflateRaw(buf, (err, b) => {
if (err)
reject(err);
resolve(b);
});
});
}
module.exports = {
sleep,
sleepWithStop,
unionSet,
intersectSet,
pathExists,
appendFileToFile,
esc,
paramToArray,
cloneDeep,
deflate,
inflate,
};