UNPKG

webshot-factory

Version:

screenshots at scale based on headless chrome

94 lines 3.16 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const job_queue_1 = require("./job-queue"); const shot_worker_1 = require("./shot-worker"); const _ = require("lodash"); const Logger = require("log4js"); const ON_DEATH = require("death"); let _logger = Logger.getLogger("shot-pool"); let idleWorkers = []; let allWorkers = []; let jobQueue = new job_queue_1.JobQueue(); let opts; let concurrency = 0; function create(options) { return __awaiter(this, void 0, void 0, function* () { opts = options; return addWorkers(options.concurrency); }); } exports.create = create; function addWorkers(numWorkers) { return __awaiter(this, void 0, void 0, function* () { try { let newWorkers = yield Promise.all(_.range(numWorkers).map((idx) => { return shot_worker_1.ShotWorker.create(concurrency + idx, opts); })); idleWorkers.push(...newWorkers); allWorkers.push(...newWorkers); concurrency += numWorkers; } catch (e) { _logger.error("error while adding worker to the queue", e); throw e; } }); } function getShot(url) { return new Promise((resolve, reject) => { jobQueue.enqueue({ url: url, done: (err, buffer) => { if (err) { return reject(err); } return resolve(buffer); } }); }); } exports.getShot = getShot; function getStatus() { return { jobQueue, allWorkers, idleWorkers }; } exports.getStatus = getStatus; let processJob = () => __awaiter(this, void 0, void 0, function* () { if (idleWorkers.length && jobQueue.hasJobs()) { let worker = idleWorkers.pop(); let job = jobQueue.dequeue(); try { let buffer = yield worker.takeShot(job.url); job.done(null, buffer); } catch (err) { _logger.error("error while taking screenshot", err); job.done(err, null); } finally { idleWorkers.unshift(worker); processJob(); } } }); jobQueue.on('process', processJob); ON_DEATH(() => __awaiter(this, void 0, void 0, function* () { _logger.info('Exiting ...', allWorkers.length); yield Promise.all(allWorkers.map((worker) => { console.log(`Exiting Worker ${worker.id}`); return worker.exit(); })); process.exit(); })); //# sourceMappingURL=shot-pool.js.map