utils.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. const fs = require('fs-extra');
  2. const path = require('path');
  3. const zlib = require('zlib');
  4. const crypto = require('crypto');
  5. function sleep(ms) {
  6. return new Promise(resolve => setTimeout(resolve, ms));
  7. }
  8. function versionText(config) {
  9. return `${config.name} v${config.version}, Node.js ${process.version}`;
  10. }
  11. async function findFiles(callback, dir, recursive = true) {
  12. if (!(callback && dir))
  13. return;
  14. const files = await fs.readdir(dir, { withFileTypes: true });
  15. for (const file of files) {
  16. const found = path.resolve(dir, file.name);
  17. if (file.isDirectory()) {
  18. if (recursive)
  19. await findFiles(callback, found);
  20. } else {
  21. await callback(found);
  22. }
  23. }
  24. }
  25. async function touchFile(filename) {
  26. await fs.utimes(filename, Date.now()/1000, Date.now()/1000);
  27. }
  28. function hasProp(obj, prop) {
  29. return Object.prototype.hasOwnProperty.call(obj, prop);
  30. }
  31. function freeMemory() {
  32. if (global.gc) {
  33. global.gc();
  34. }
  35. }
  36. function getFileHash(filename, hashName, enc) {
  37. return new Promise((resolve, reject) => {
  38. const hash = crypto.createHash(hashName);
  39. const rs = fs.createReadStream(filename);
  40. rs.on('error', reject);
  41. rs.on('data', chunk => hash.update(chunk));
  42. rs.on('end', () => resolve(hash.digest(enc)));
  43. });
  44. }
  45. function getBufHash(buf, hashName, enc) {
  46. const hash = crypto.createHash(hashName);
  47. hash.update(buf);
  48. return hash.digest(enc);
  49. }
  50. function intersectSet(arrSet) {
  51. if (!arrSet.length)
  52. return new Set();
  53. let min = 0;
  54. let size = arrSet[0].size;
  55. for (let i = 1; i < arrSet.length; i++) {
  56. if (arrSet[i].size < size) {
  57. min = i;
  58. size = arrSet[i].size;
  59. }
  60. }
  61. const result = new Set();
  62. for (const elem of arrSet[min]) {
  63. let inAll = true;
  64. for (let i = 0; i < arrSet.length; i++) {
  65. if (i === min)
  66. continue;
  67. if (!arrSet[i].has(elem)) {
  68. inAll = false;
  69. break;
  70. }
  71. }
  72. if (inAll)
  73. result.add(elem);
  74. }
  75. return result;
  76. }
  77. function randomHexString(len) {
  78. return crypto.randomBytes(len).toString('hex')
  79. }
  80. //async
  81. function gzipFile(inputFile, outputFile, level = 1) {
  82. return new Promise((resolve, reject) => {
  83. const gzip = zlib.createGzip({level});
  84. const input = fs.createReadStream(inputFile);
  85. const output = fs.createWriteStream(outputFile);
  86. input.pipe(gzip).pipe(output).on('finish', (err) => {
  87. if (err) reject(err);
  88. else resolve();
  89. });
  90. });
  91. }
  92. function toUnixPath(dir) {
  93. return dir.replace(/\\/g, '/');
  94. }
  95. module.exports = {
  96. sleep,
  97. versionText,
  98. findFiles,
  99. touchFile,
  100. hasProp,
  101. freeMemory,
  102. getFileHash,
  103. getBufHash,
  104. intersectSet,
  105. randomHexString,
  106. gzipFile,
  107. toUnixPath,
  108. };