utils.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. const { spawn } = require('child_process');
  2. const fs = require('fs-extra');
  3. const crypto = require('crypto');
  4. function sleep(ms) {
  5. return new Promise(resolve => setTimeout(resolve, ms));
  6. }
  7. function randomHexString(len) {
  8. return crypto.randomBytes(len).toString('hex')
  9. }
  10. async function touchFile(filename) {
  11. await fs.utimes(filename, Date.now()/1000, Date.now()/1000);
  12. }
  13. function spawnProcess(cmd, opts) {
  14. let {args, killAfter, onData} = opts;
  15. killAfter = (killAfter ? killAfter : 120*1000);
  16. onData = (onData ? onData : () => {});
  17. args = (args ? args : []);
  18. return new Promise(async(resolve, reject) => {
  19. let resolved = false;
  20. const proc = spawn(cmd, args, {detached: true});
  21. let stdout = '';
  22. proc.stdout.on('data', (data) => {
  23. stdout += data;
  24. onData(data);
  25. });
  26. let stderr = '';
  27. proc.stderr.on('data', (data) => {
  28. stderr += data;
  29. onData(data);
  30. });
  31. proc.on('close', (code) => {
  32. resolved = true;
  33. resolve({status: 'close', code, stdout, stderr});
  34. });
  35. proc.on('error', (error) => {
  36. reject({status: 'error', error, stdout, stderr});
  37. });
  38. await sleep(killAfter);
  39. if (!resolved) {
  40. process.kill(proc.pid);
  41. reject({status: 'killed', stdout, stderr});
  42. }
  43. });
  44. }
  45. module.exports = {
  46. sleep,
  47. randomHexString,
  48. touchFile,
  49. spawnProcess
  50. };