webshot-factory
Version:
screenshots at scale based on headless chrome
94 lines • 3.16 kB
JavaScript
;
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