You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							134 lines
						
					
					
						
							2.7 KiB
						
					
					
				
			
		
		
	
	
							134 lines
						
					
					
						
							2.7 KiB
						
					
					
				'use strict'; | 
						|
 | 
						|
Object.defineProperty(exports, '__esModule', { | 
						|
  value: true | 
						|
}); | 
						|
exports.default = void 0; | 
						|
 | 
						|
function _path() { | 
						|
  const data = _interopRequireDefault(require('path')); | 
						|
 | 
						|
  _path = function _path() { | 
						|
    return data; | 
						|
  }; | 
						|
 | 
						|
  return data; | 
						|
} | 
						|
 | 
						|
function _mergeStream() { | 
						|
  const data = _interopRequireDefault(require('merge-stream')); | 
						|
 | 
						|
  _mergeStream = function _mergeStream() { | 
						|
    return data; | 
						|
  }; | 
						|
 | 
						|
  return data; | 
						|
} | 
						|
 | 
						|
var _types = require('../types'); | 
						|
 | 
						|
function _interopRequireDefault(obj) { | 
						|
  return obj && obj.__esModule ? obj : {default: obj}; | 
						|
} | 
						|
 | 
						|
function _defineProperty(obj, key, value) { | 
						|
  if (key in obj) { | 
						|
    Object.defineProperty(obj, key, { | 
						|
      value: value, | 
						|
      enumerable: true, | 
						|
      configurable: true, | 
						|
      writable: true | 
						|
    }); | 
						|
  } else { | 
						|
    obj[key] = value; | 
						|
  } | 
						|
  return obj; | 
						|
} | 
						|
 | 
						|
/* istanbul ignore next */ | 
						|
const emptyMethod = () => {}; | 
						|
 | 
						|
class BaseWorkerPool { | 
						|
  constructor(workerPath, options) { | 
						|
    _defineProperty(this, '_stderr', void 0); | 
						|
 | 
						|
    _defineProperty(this, '_stdout', void 0); | 
						|
 | 
						|
    _defineProperty(this, '_options', void 0); | 
						|
 | 
						|
    _defineProperty(this, '_workers', void 0); | 
						|
 | 
						|
    this._options = options; | 
						|
    this._workers = new Array(options.numWorkers); | 
						|
 | 
						|
    if (!_path().default.isAbsolute(workerPath)) { | 
						|
      workerPath = require.resolve(workerPath); | 
						|
    } | 
						|
 | 
						|
    const stdout = (0, _mergeStream().default)(); | 
						|
    const stderr = (0, _mergeStream().default)(); | 
						|
    const forkOptions = options.forkOptions, | 
						|
      maxRetries = options.maxRetries, | 
						|
      setupArgs = options.setupArgs; | 
						|
 | 
						|
    for (let i = 0; i < options.numWorkers; i++) { | 
						|
      const workerOptions = { | 
						|
        forkOptions, | 
						|
        maxRetries, | 
						|
        setupArgs, | 
						|
        workerId: i, | 
						|
        workerPath | 
						|
      }; | 
						|
      const worker = this.createWorker(workerOptions); | 
						|
      const workerStdout = worker.getStdout(); | 
						|
      const workerStderr = worker.getStderr(); | 
						|
 | 
						|
      if (workerStdout) { | 
						|
        stdout.add(workerStdout); | 
						|
      } | 
						|
 | 
						|
      if (workerStderr) { | 
						|
        stderr.add(workerStderr); | 
						|
      } | 
						|
 | 
						|
      this._workers[i] = worker; | 
						|
    } | 
						|
 | 
						|
    this._stdout = stdout; | 
						|
    this._stderr = stderr; | 
						|
  } | 
						|
 | 
						|
  getStderr() { | 
						|
    return this._stderr; | 
						|
  } | 
						|
 | 
						|
  getStdout() { | 
						|
    return this._stdout; | 
						|
  } | 
						|
 | 
						|
  getWorkers() { | 
						|
    return this._workers; | 
						|
  } | 
						|
 | 
						|
  getWorkerById(workerId) { | 
						|
    return this._workers[workerId]; | 
						|
  } | 
						|
 | 
						|
  createWorker(_workerOptions) { | 
						|
    throw Error('Missing method createWorker in WorkerPool'); | 
						|
  } | 
						|
 | 
						|
  end() { | 
						|
    // We do not cache the request object here. If so, it would only be only | 
						|
    // processed by one of the workers, and we want them all to close. | 
						|
    for (let i = 0; i < this._workers.length; i++) { | 
						|
      this._workers[i].send( | 
						|
        [_types.CHILD_MESSAGE_END, false], | 
						|
        emptyMethod, | 
						|
        emptyMethod | 
						|
      ); | 
						|
    } | 
						|
  } | 
						|
} | 
						|
 | 
						|
exports.default = BaseWorkerPool;
 | 
						|
 |