utils.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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 : 30*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);
  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. reject({status: 'killed', stdout, stderr});
  41. });
  42. }
  43. module.exports = {
  44. sleep,
  45. randomHexString,
  46. touchFile,
  47. spawnProcess
  48. };