From 1c96201d463e700e5b768822ac3884bcd302e2f0 Mon Sep 17 00:00:00 2001 From: spiduler Date: Sun, 25 Oct 2020 11:27:51 +0900 Subject: [PATCH] sadsaf --- src/component/SeleniumBrowser.js | 75 +++----------------------------- src/service/PoolingService.js | 73 +++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 69 deletions(-) create mode 100644 src/service/PoolingService.js diff --git a/src/component/SeleniumBrowser.js b/src/component/SeleniumBrowser.js index 48a45b2..0837e09 100644 --- a/src/component/SeleniumBrowser.js +++ b/src/component/SeleniumBrowser.js @@ -1,77 +1,15 @@ const logger = require("logops") , config = require('../../config') - , { Builder, Capabilities, By, Key, until } = require('selenium-webdriver') + , { By, until } = require('selenium-webdriver') , url = require('url') + , poolingService = require('../service/PoolingService') , fetch = require('node-fetch') - , pool = require('generic-pool') - , { Options } = require('selenium-webdriver/chrome'); + class SeleniumBrowser { constructor() { - this.config = { - useHub: true, browser: 'chrome', - browserArgs: ['--no-sandbox', '--headless', '--disable-dev-shm-usage', '--proxy-server=spiduler-tor:8118'] - } - this.capabilities = Capabilities.chrome() - this.sleep = m => new Promise(r => setTimeout(r, m)) - this.createPool() - } - - createPool() { - this.pool = pool.createPool({ - create: () => { - logger.info('Create new driver instance') - return this.getDriver(); - }, - destroy: (driver) => { - logger.info('Quitting driver') - return driver.quit().catch(err => { - logger.debug({ message: err.message }, 'Quitting error') - this.pool.release(driver) - }) - }, - validate: (driver) => { - return driver.getSession().then(s => { - logger.info('Driver session validation checked (id: %s)', s.getId()) - return true - }).catch(err => { - this.pool.destroy(driver) - logger.debug({ message: err.message }, 'Driver session expired and destroy it') - return false - }) - } - }, { - max: 10, min: 1, testOnBorrow: true - }); - - this.pool.on('factoryCreateError', function (err) { - logger.error({ message: err.message }, 'pool error') - }) - - this.pool.on('factoryDestroyError', function (err) { - logger.error({ message: err.message }, 'pool error') - }) - - setInterval(() => { - logger.debug({ - spare: this.pool.spareResourceCapacity, - size: this.pool.size, - available: this.pool.available, - borrowed: this.pool.borrowed, - pending: this.pool.pending - }, 'Pool info') - }, 1000 * 60 * 5) - } - - getDriver() { - let opts = new Options; - opts.addArguments(this.config.browserArgs) - return new Builder() - .usingServer('http://spiduler-chrome:4444/wd/hub') - .withCapabilities(this.capabilities) - .forBrowser(this.config.browser) - .setChromeOptions(opts) - .build(); + this.sleep = m => new Promise(r => setTimeout(r, m)) + this.pool = poolingService.pool } async request(params) { @@ -161,5 +99,4 @@ class SeleniumBrowser { } } -const browser = new SeleniumBrowser -module.exports = browser \ No newline at end of file +module.exports = new SeleniumBrowser \ No newline at end of file diff --git a/src/service/PoolingService.js b/src/service/PoolingService.js new file mode 100644 index 0000000..cedffdd --- /dev/null +++ b/src/service/PoolingService.js @@ -0,0 +1,73 @@ +const logger = require("logops") + , config = require('../../config') + , { Builder, Capabilities } = require('selenium-webdriver') + , pool = require('generic-pool') + , { Options } = require('selenium-webdriver/chrome'); + +class PoolingService { + constructor() { + this.config = { + pool: { max: 10, min: 1, testOnBorrow: true }, + browser: 'chrome', + browserArgs: ['--no-sandbox', '--headless', '--disable-dev-shm-usage', '--proxy-server=spiduler-tor:8118'] + } + this.pool = this.createPool() + } + + createPool() { + setInterval(() => this.debugPoolStatus(), 1000 * 60 * 5) + return pool.createPool({ + create: () => this.create(), + destroy: (driver) => this.destroy(driver), + validate: (driver) => this.validate(driver) + }, this.config.pool); + } + + create() { + logger.info('Create new driver instance') + return this.getDriver(); + } + + destroy(driver) { + logger.info('Quitting driver') + return driver.quit().catch(err => { + logger.debug({ message: err.message }, 'Quitting error') + this.pool.release(driver) + }) + } + + validate(driver) { + return driver.getSession().then(s => { + logger.info('Driver session validation checked (id: %s)', s.getId()) + return true + }).catch(err => { + this.pool.destroy(driver) + logger.debug({ message: err.message }, 'Driver session expired and destroy it') + return false + }) + } + + getDriver() { + let opts = new Options; + let capabilities = Capabilities.chrome() + opts.addArguments(this.config.browserArgs) + return new Builder() + .usingServer('http://spiduler-chrome:4444/wd/hub') + .withCapabilities(capabilities) + .forBrowser(this.config.browser) + .setChromeOptions(opts) + .build(); + } + + debugPoolStatus() { + logger.debug({ + spare: this.pool.spareResourceCapacity, + size: this.pool.size, + available: this.pool.available, + borrowed: this.pool.borrowed, + pending: this.pool.pending + }, 'Pool status') + } +} + +module.exports = new PoolingService