worker.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. var _jestWorker = require("next/dist/compiled/jest-worker");
  6. const RESTARTED = Symbol("restarted");
  7. class Worker {
  8. constructor(workerPath, options){
  9. let { timeout , onRestart , ...farmOptions } = options;
  10. let restartPromise;
  11. let resolveRestartPromise;
  12. let activeTasks = 0;
  13. this._worker = undefined;
  14. const createWorker = ()=>{
  15. this._worker = new _jestWorker.Worker(workerPath, farmOptions);
  16. restartPromise = new Promise((resolve)=>resolveRestartPromise = resolve);
  17. this._worker.getStdout().pipe(process.stdout);
  18. this._worker.getStderr().pipe(process.stderr);
  19. };
  20. createWorker();
  21. const onHanging = ()=>{
  22. const worker = this._worker;
  23. if (!worker) return;
  24. const resolve = resolveRestartPromise;
  25. createWorker();
  26. worker.end().then(()=>{
  27. resolve(RESTARTED);
  28. });
  29. };
  30. let hangingTimer = false;
  31. const onActivity = ()=>{
  32. if (hangingTimer) clearTimeout(hangingTimer);
  33. hangingTimer = activeTasks > 0 && setTimeout(onHanging, timeout);
  34. };
  35. for (const method of farmOptions.exposedMethods){
  36. if (method.startsWith("_")) continue;
  37. this[method] = timeout ? async (...args)=>{
  38. activeTasks++;
  39. try {
  40. let attempts = 0;
  41. for(;;){
  42. onActivity();
  43. const result = await Promise.race([
  44. this._worker[method](...args),
  45. restartPromise,
  46. ]);
  47. if (result !== RESTARTED) return result;
  48. if (onRestart) onRestart(method, args, ++attempts);
  49. }
  50. } finally{
  51. activeTasks--;
  52. onActivity();
  53. }
  54. } : this._worker[method].bind(this._worker);
  55. }
  56. }
  57. end() {
  58. const worker = this._worker;
  59. if (!worker) {
  60. throw new Error("Farm is ended, no more calls can be done to it");
  61. }
  62. this._worker = undefined;
  63. return worker.end();
  64. }
  65. /**
  66. * Quietly end the worker if it exists
  67. */ close() {
  68. if (this._worker) {
  69. this._worker.end();
  70. }
  71. }
  72. }
  73. exports.Worker = Worker;
  74. //# sourceMappingURL=worker.js.map