BaseWorkerPool.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. function _path() {
  7. const data = _interopRequireDefault(require('path'));
  8. _path = function _path() {
  9. return data;
  10. };
  11. return data;
  12. }
  13. function _mergeStream() {
  14. const data = _interopRequireDefault(require('merge-stream'));
  15. _mergeStream = function _mergeStream() {
  16. return data;
  17. };
  18. return data;
  19. }
  20. var _types = require('../types');
  21. function _interopRequireDefault(obj) {
  22. return obj && obj.__esModule ? obj : {default: obj};
  23. }
  24. function _defineProperty(obj, key, value) {
  25. if (key in obj) {
  26. Object.defineProperty(obj, key, {
  27. value: value,
  28. enumerable: true,
  29. configurable: true,
  30. writable: true
  31. });
  32. } else {
  33. obj[key] = value;
  34. }
  35. return obj;
  36. }
  37. /* istanbul ignore next */
  38. const emptyMethod = () => {};
  39. class BaseWorkerPool {
  40. constructor(workerPath, options) {
  41. _defineProperty(this, '_stderr', void 0);
  42. _defineProperty(this, '_stdout', void 0);
  43. _defineProperty(this, '_options', void 0);
  44. _defineProperty(this, '_workers', void 0);
  45. this._options = options;
  46. this._workers = new Array(options.numWorkers);
  47. if (!_path().default.isAbsolute(workerPath)) {
  48. workerPath = require.resolve(workerPath);
  49. }
  50. const stdout = (0, _mergeStream().default)();
  51. const stderr = (0, _mergeStream().default)();
  52. const forkOptions = options.forkOptions,
  53. maxRetries = options.maxRetries,
  54. setupArgs = options.setupArgs;
  55. for (let i = 0; i < options.numWorkers; i++) {
  56. const workerOptions = {
  57. forkOptions,
  58. maxRetries,
  59. setupArgs,
  60. workerId: i,
  61. workerPath
  62. };
  63. const worker = this.createWorker(workerOptions);
  64. const workerStdout = worker.getStdout();
  65. const workerStderr = worker.getStderr();
  66. if (workerStdout) {
  67. stdout.add(workerStdout);
  68. }
  69. if (workerStderr) {
  70. stderr.add(workerStderr);
  71. }
  72. this._workers[i] = worker;
  73. }
  74. this._stdout = stdout;
  75. this._stderr = stderr;
  76. }
  77. getStderr() {
  78. return this._stderr;
  79. }
  80. getStdout() {
  81. return this._stdout;
  82. }
  83. getWorkers() {
  84. return this._workers;
  85. }
  86. getWorkerById(workerId) {
  87. return this._workers[workerId];
  88. }
  89. createWorker(_workerOptions) {
  90. throw Error('Missing method createWorker in WorkerPool');
  91. }
  92. end() {
  93. // We do not cache the request object here. If so, it would only be only
  94. // processed by one of the workers, and we want them all to close.
  95. for (let i = 0; i < this._workers.length; i++) {
  96. this._workers[i].send(
  97. [_types.CHILD_MESSAGE_END, false],
  98. emptyMethod,
  99. emptyMethod
  100. );
  101. }
  102. }
  103. }
  104. exports.default = BaseWorkerPool;