utils.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. const { spawn } = require('child_process');
  2. const fs = require('fs-extra');
  3. const crypto = require('crypto');
  4. const baseX = require('base-x');
  5. const BASE36 = '0123456789abcdefghijklmnopqrstuvwxyz';
  6. const bs36 = baseX(BASE36);
  7. function toBase36(data) {
  8. return bs36.encode(Buffer.from(data));
  9. }
  10. function fromBase36(data) {
  11. return bs36.decode(data);
  12. }
  13. function getFileHash(filename, hashName, enc) {
  14. return new Promise((resolve, reject) => {
  15. const hash = crypto.createHash(hashName);
  16. const rs = fs.createReadStream(filename);
  17. rs.on('error', reject);
  18. rs.on('data', chunk => hash.update(chunk));
  19. rs.on('end', () => resolve(hash.digest(enc)));
  20. });
  21. }
  22. function sleep(ms) {
  23. return new Promise(resolve => setTimeout(resolve, ms));
  24. }
  25. function randomHexString(len) {
  26. return crypto.randomBytes(len).toString('hex')
  27. }
  28. async function touchFile(filename) {
  29. await fs.utimes(filename, Date.now()/1000, Date.now()/1000);
  30. }
  31. function spawnProcess(cmd, opts) {
  32. let {args, killAfter, onData} = opts;
  33. killAfter = (killAfter ? killAfter : 120*1000);
  34. onData = (onData ? onData : () => {});
  35. args = (args ? args : []);
  36. return new Promise(async(resolve, reject) => {
  37. let resolved = false;
  38. const proc = spawn(cmd, args, {detached: true});
  39. let stdout = '';
  40. proc.stdout.on('data', (data) => {
  41. stdout += data;
  42. onData(data);
  43. });
  44. let stderr = '';
  45. proc.stderr.on('data', (data) => {
  46. stderr += data;
  47. onData(data);
  48. });
  49. proc.on('close', (code) => {
  50. resolved = true;
  51. resolve({status: 'close', code, stdout, stderr});
  52. });
  53. proc.on('error', (error) => {
  54. reject({status: 'error', error, stdout, stderr});
  55. });
  56. await sleep(killAfter);
  57. if (!resolved) {
  58. process.kill(proc.pid);
  59. reject({status: 'killed', stdout, stderr});
  60. }
  61. });
  62. }
  63. module.exports = {
  64. toBase36,
  65. fromBase36,
  66. getFileHash,
  67. sleep,
  68. randomHexString,
  69. touchFile,
  70. spawnProcess
  71. };