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.
		
		
		
		
			
				
					135 lines
				
				2.7 KiB
			
		
		
			
		
	
	
					135 lines
				
				2.7 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								'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;
							 |