From e075f11bdb1b194062d153cad181a6b04ad8fcfc Mon Sep 17 00:00:00 2001 From: Evgeny Zinoviev Date: Tue, 15 Mar 2022 03:56:59 +0300 Subject: much fixes so improvements --- app.js | 151 +++++++++++++++ browser.js | 93 --------- cookies-storage.js | 50 ----- index.js | 138 -------------- lib/browser.js | 111 +++++++++++ lib/cookies-storage.js | 80 ++++++++ lib/logging.js | 35 ++++ package-lock.json | 435 ++++++++++++++++++++++++++++++++++++++++++- package.json | 7 +- systemd/rt-pupflare@.service | 2 +- 10 files changed, 816 insertions(+), 286 deletions(-) create mode 100644 app.js delete mode 100644 browser.js delete mode 100644 cookies-storage.js delete mode 100644 index.js create mode 100644 lib/browser.js create mode 100644 lib/cookies-storage.js create mode 100644 lib/logging.js diff --git a/app.js b/app.js new file mode 100644 index 0000000..7dddf22 --- /dev/null +++ b/app.js @@ -0,0 +1,151 @@ +const cookiesStorage = require('./lib/cookies-storage') +const browser = require('./lib/browser') +const {singlePageWrapper, PageWrapper} = browser +const os = require('os') +const path = require('path') +const logging = require('./lib/logging') + +const argv = require('minimist')(process.argv.slice(2), { + string: ['retries', 'timeout', 'cookies', 'port', 'proxy'], + boolean: ['no-sandbox', 'headful', 'reuse', 'verbose'], + stopEarly: true, + default: { + port: 3000, + retries: 10, + timeout: 30000, + cookies: path.join(os.homedir(), '.rt-pupflare-cookies.json'), + reuse: false, + verbose: false, + } +}) + +let logger = null +let reusePage = argv.reuse + +const maxTryCount = parseInt(argv.retries) +const loadingTimeout = parseInt(argv.timeout) + +const Koa = require('koa'); +const bodyParser = require('koa-bodyparser') +const Router = require('@koa/router') + +const app = new Koa(); +app.use(bodyParser()) + +const router = new Router(); + + +async function requestHandler(ctx, next) { + if (!ctx.query.url) + throw new Error('url not specified') + + const myResult = { + binary: false, + headers: [], + data: '' + } + + let responseSet = false + let pageWrapper = null + + await new Promise(async (resolve, reject) => { + const fInterceptionNeeded = (e) => e.isDownload === true + const fInterception = (response, headers) => { + Object.assign(myResult, { + data: response.base64Encoded ? response.body : btoa(response.body), + binary: true, + headers + }) + resolve() + } + const fPostInterception = (request) => { + if (ctx.method === 'POST') { + return { + 'method': 'POST', + 'postData': ctx.request.rawBody, + 'headers': { + ...request.headers, + 'Content-Type': 'application/x-www-form-urlencoded', + } + } + } + } + + pageWrapper = reusePage ? singlePageWrapper : new PageWrapper() + const page = await pageWrapper.getPage(fInterceptionNeeded, fInterception, fPostInterception) + + try { + let tryCount = 0 + let response = await page.goto(ctx.query.url, { + timeout: loadingTimeout, + waitUntil: 'domcontentloaded' + }) + + let body = await response.text() + while ((body.includes("cf-browser-verification") || body.includes('cf-captcha-container')) && tryCount <= maxTryCount) { + let newResponse = await page.waitForNavigation({ + timeout: loadingTimeout, + waitUntil: 'domcontentloaded' + }); + if (newResponse) + response = newResponse; + body = await response.text(); + tryCount++; + } + + myResult.data = (await response.buffer()).toString('base64') + myResult.headers = await response.headers() + + resolve() + } catch (error) { + if (!error.toString().includes("ERR_BLOCKED_BY_CLIENT")) { + ctx.status = 500 + ctx.body = error + + responseSet = true + resolve() + } + } + }) + + if (!responseSet) + ctx.body = JSON.stringify(myResult) + + if (!reusePage) + pageWrapper.page.close() + + await next() +} + +router + .get('/request', requestHandler) + .post('/request', requestHandler) + .get('/cookies', async (ctx, next) => { + ctx.body = JSON.stringify(await cookiesStorage.get()) + await next() + }); + + +(async () => { + process.title = 'rt-pupflare' + + logging.configure(argv.verbose) + logger = logging.getLogger('app') + + cookiesStorage.setFileName(argv.cookies) + + await browser.launch({ + proxy: argv.proxy ?? null, + noSandbox: argv['no-sandbox'] ?? false, + headful: argv.headful ?? false, + }) + + app.use(router.routes()) + .use(router.allowedMethods()) + + app.on('error', (error) => { + logger.error('app error:', error) + }) + + app.listen(parseInt(argv.port), '127.0.0.1') +})() \ No newline at end of file diff --git a/browser.js b/browser.js deleted file mode 100644 index d1f5c50..0000000 --- a/browser.js +++ /dev/null @@ -1,93 +0,0 @@ -const puppeteer = require("puppeteer-extra"); -const StealthPlugin = require('puppeteer-extra-plugin-stealth'); -const cookiesStorage = require("./cookies-storage"); -puppeteer.use(StealthPlugin()); - - -const chromeOptions = { - headless: true, - args: [] -}; - -let browser = null -let cdpClient = null - -class PageWrapper { - constructor() { - this.intrNeededCallback = null - this.intrCallback = null - - this.page = null - } - - async getPage(interceptionNeededCallback, interceptCallback) { - this.intrCallback = interceptCallback - this.intrNeededCallback = interceptionNeededCallback - - if (this.page !== null && this.page.isClosed()) { - this.page.removeAllListeners && this.page.removeAllListeners() - this.page = null - } - - if (this.page !== null) - return this.page - - this.page = await browser.newPage() - this.page.on('domcontentloaded', async () => { - try { - let cookies = await this.page.cookies(); - if (cookies) - await cookiesStorage.save(cookies) - } catch (e) { - console.warn(e) - } - }) - - await this.page.setCookie(...(await cookiesStorage.get())) - - cdpClient = await this.page.target().createCDPSession(); - await cdpClient.send('Network.setRequestInterception', { - patterns: [{ - urlPattern: '*', - resourceType: 'Document', - interceptionStage: 'HeadersReceived' - }], - }) - await cdpClient.on('Network.requestIntercepted', async e => { - let obj = { interceptionId: e.interceptionId } - if (this.intrNeededCallback && this.intrNeededCallback(e) === true) { - let ret = await cdpClient.send('Network.getResponseBodyForInterception', { - interceptionId: e.interceptionId - }) - this.intrCallback(ret, e.responseHeaders) - obj['errorReason'] = 'BlockedByClient' - } - await cdpClient.send('Network.continueInterceptedRequest', obj) - }) - - return this.page - } -} - -let singlePageWrapper = new PageWrapper() - -module.exports = { - async launch(options) { - if (options.proxy) - chromeOptions.args.push(`--proxy-server=${options.proxy}`) - - if (options.noSandbox) - chromeOptions.args.push( - '--no-sandbox', - '--disable-setuid-sandbox' - ) - - if (options.headful) - chromeOptions.headless = false - - browser = await puppeteer.launch(chromeOptions) - }, - - singlePageWrapper, - PageWrapper, -} \ No newline at end of file diff --git a/cookies-storage.js b/cookies-storage.js deleted file mode 100644 index 8c9231b..0000000 --- a/cookies-storage.js +++ /dev/null @@ -1,50 +0,0 @@ -const fs = require('fs').promises - -let storageFileName = null - -async function exists(path) { - try { - await fs.access(path) - return true - } catch { - return false - } -} - -module.exports = { - async save(newCookies) { - let currentCookies = await this.get() - if (currentCookies.length) { - for (let newCookie of newCookies) { - if (!currentCookies.length) - break - let i = currentCookies.findIndex((c) => { - return c.domain === newCookie.domain - && c.path === newCookie.path - && c.name === newCookie.name - }) - if (i !== -1) - currentCookies.splice(i, 1) - } - } - currentCookies.push(...newCookies) - // console.log('[cookies.save] saving cookies:', currentCookies) - await fs.writeFile(storageFileName, JSON.stringify(currentCookies, null, 2), 'utf-8') - }, - - async get() { - if (!(await exists(storageFileName))) - return [] - - try { - return JSON.parse(await fs.readFile(storageFileName, 'utf-8')) - } catch (e) { - console.error(e) - return [] - } - }, - - setFileName(name) { - storageFileName = name - } -}; \ No newline at end of file diff --git a/index.js b/index.js deleted file mode 100644 index f1e4903..0000000 --- a/index.js +++ /dev/null @@ -1,138 +0,0 @@ -const cookiesStorage = require('./cookies-storage') -const browser = require('./browser') -const {singlePageWrapper, PageWrapper} = browser -const os = require('os') -const path = require('path') - -const argv = require('minimist')(process.argv.slice(2), { - string: ['retries', 'timeout', 'cookies', 'port', 'proxy'], - boolean: ['no-sandbox', 'headful', 'reuse'], - stopEarly: true, - default: { - port: 3000, - retries: 10, - timeout: 30000, - cookies: path.join(os.homedir(), '.rt-pupflare-cookies.json'), - reuse: false, - } -}) - -let reusePage = argv.reuse -const maxTryCount = parseInt(argv.retries) -const loadingTimeout = parseInt(argv.timeout) - -const Koa = require('koa'); -const Router = require('@koa/router'); -const app = new Koa(); -const router = new Router(); - - -async function requestHandler(ctx, next) { - if (!ctx.query.url) - throw new Error('url not specified') - - const myResult = { - binary: false, - headers: [], - data: '' - } - - let responseSet = false - let pageWrapper = null - - await new Promise(async (resolve, reject) => { - const fInterceptionNeeded = (e) => e.isDownload === true - const fInterception = (response, headers) => { - Object.assign(myResult, { - data: response.base64Encoded ? response.body : btoa(response.body), - binary: true, - headers - }) - resolve() - } - - pageWrapper = reusePage ? singlePageWrapper : new PageWrapper() - const page = await pageWrapper.getPage(fInterceptionNeeded, fInterception) - - // not tested - if (ctx.method === "POST") { - await page.removeAllListeners('request') - await page.setRequestInterception(true) - page.on('request', interceptedRequest => { - interceptedRequest.continue({ - 'method': 'POST', - 'postData': ctx.request.rawBody - }) - }) - } - - try { - let tryCount = 0 - let response = await page.goto(ctx.query.url, { - timeout: loadingTimeout, - waitUntil: 'domcontentloaded' - }) - - let body = await response.text() - while ((body.includes("cf-browser-verification") || body.includes('cf-captcha-container')) && tryCount <= maxTryCount) { - let newResponse = await page.waitForNavigation({ - timeout: loadingTimeout, - waitUntil: 'domcontentloaded' - }); - if (newResponse) - response = newResponse; - body = await response.text(); - tryCount++; - } - - myResult.data = await response.text() - myResult.headers = await response.headers() - - resolve() - } catch (error) { - if (!error.toString().includes("ERR_BLOCKED_BY_CLIENT")) { - ctx.status = 500 - ctx.body = error - - responseSet = true - resolve() - } - } - }) - - if (!responseSet) - ctx.body = JSON.stringify(myResult) - - if (!reusePage) - pageWrapper.page.close() - - await next() -} - -router - .get('/request', requestHandler) - .post('/request', requestHandler) - .get('/cookies', async (ctx, next) => { - ctx.body = JSON.stringify(await cookiesStorage.get()) - await next() - }); - - -(async () => { - cookiesStorage.setFileName(argv.cookies) - - await browser.launch({ - proxy: argv.proxy ?? null, - noSandbox: argv['no-sandbox'] ?? false, - headful: argv.headful ?? false, - }) - - app.use(router.routes()) - .use(router.allowedMethods()) - - app.on('error', (error) => { - console.error('[app.onerror]', error) - }) - - app.listen(parseInt(argv.port), '127.0.0.1') -})(); diff --git a/lib/browser.js b/lib/browser.js new file mode 100644 index 0000000..d0f7861 --- /dev/null +++ b/lib/browser.js @@ -0,0 +1,111 @@ +const puppeteer = require("puppeteer-extra"); +const StealthPlugin = require('puppeteer-extra-plugin-stealth'); +const cookiesStorage = require("./cookies-storage"); +puppeteer.use(StealthPlugin()) + +const {getLogger} = require('./logging') + +const logger = getLogger('browser') + + +const chromeOptions = { + headless: true, + args: [] +}; + +let browser = null + +class PageWrapper { + constructor() { + this.intrNeededCallback = null + this.intrCallback = null + this.intrPostCallback = null + + this.page = null + this.cdpClient = null + } + + async getPage(interceptionNeededCallback, interceptCallback, postInterceptCallback) { + this.intrCallback = interceptCallback + this.intrNeededCallback = interceptionNeededCallback + this.intrPostCallback = postInterceptCallback + + if (this.page !== null && this.page.isClosed()) { + this.page.removeAllListeners && this.page.removeAllListeners() + this.page = null + } + + if (this.page !== null) + return this.page + + this.page = await browser.newPage() + + let cookies = await cookiesStorage.get() + // logger.debug('loaded cookies:', cookies) + await this.page.setCookie(...cookies) + + this.page.on('domcontentloaded', async () => { + try { + let cookies = await this.page.cookies(); + if (cookies) + await cookiesStorage.save(cookies) + } catch (e) { + logger.error('page.cookies() failed:', e) + } + }) + + await this.page.removeAllListeners('request') + await this.page.setRequestInterception(true) + this.page.on('request', async request => { + let contData = this.intrPostCallback(request) + await request.continue(contData) + }) + + this.cdpClient = await this.page.target().createCDPSession(); + await this.cdpClient.send('Network.enable') + await this.cdpClient.send('Network.setRequestInterception', { + patterns: [ + { + urlPattern: '*', + resourceType: 'Document', + interceptionStage: 'HeadersReceived' + } + ], + }) + await this.cdpClient.on('Network.requestIntercepted', async e => { + let obj = {interceptionId: e.interceptionId} + if (this.intrNeededCallback && this.intrNeededCallback(e) === true) { + let ret = await this.cdpClient.send('Network.getResponseBodyForInterception', { + interceptionId: e.interceptionId + }) + this.intrCallback(ret, e.responseHeaders) + obj['errorReason'] = 'BlockedByClient' + } + await this.cdpClient.send('Network.continueInterceptedRequest', obj) + }) + return this.page + } +} + +let singlePageWrapper = new PageWrapper() + +module.exports = { + async launch(options) { + if (options.proxy) + chromeOptions.args.push(`--proxy-server=${options.proxy}`) + + if (options.noSandbox) + chromeOptions.args.push( + '--no-sandbox', + '--disable-setuid-sandbox' + ) + + if (options.headful) + chromeOptions.headless = false + + browser = await puppeteer.launch(chromeOptions) + }, + + singlePageWrapper, + PageWrapper, +} \ No newline at end of file diff --git a/lib/cookies-storage.js b/lib/cookies-storage.js new file mode 100644 index 0000000..15714ca --- /dev/null +++ b/lib/cookies-storage.js @@ -0,0 +1,80 @@ +const fs = require('fs').promises +const {Mutex} = require('async-mutex') +const {getLogger} = require('./logging') + +const logger = getLogger('CookiesStorage') + +let storageFileName = null +const mutex = new Mutex() + +async function exists(path) { + try { + await fs.access(path) + return true + } catch { + return false + } +} + +function cookiesAsHashed(cookies) { + if (!cookies.length) + return {} + + const map = {} + const sep = '|;|;' + for (const c of cookies) { + const k = `${c.domain}${sep}${c.path}${sep}${c.name}` + map[k] = c + } + return map +} + +module.exports = { + async save(newCookies) { + let currentCookies = await this.get() + + await mutex.runExclusive(async () => { + if (currentCookies.length) { + for (let newCookie of newCookies) { + if (!currentCookies.length) + break + let i = currentCookies.findIndex((oldCookie) => { + return oldCookie.domain === newCookie.domain + && oldCookie.path === newCookie.path + && oldCookie.name === newCookie.name + && ( + oldCookie.value !== newCookie.value + || oldCookie.expires !== newCookie.expires + ) + }) + if (i !== -1) { + let removed = currentCookies.splice(i, 1) + // logger.debug('removed cookie:', removed, 'instead got new one:', newCookie) + } + } + } + + const cookiesMap = Object.assign({}, cookiesAsHashed(currentCookies), cookiesAsHashed(newCookies)) + await fs.writeFile(storageFileName, JSON.stringify(Object.values(cookiesMap), null, 2), 'utf-8') + }) + }, + + async get() { + if (!(await exists(storageFileName))) + return [] + + try { + const raw = await mutex.runExclusive(async () => { + return await fs.readFile(storageFileName, 'utf-8') + }) + return JSON.parse(raw) + } catch (e) { + logger.error('Failed to parse storage:', e) + return [] + } + }, + + setFileName(name) { + storageFileName = name + } +}; \ No newline at end of file diff --git a/lib/logging.js b/lib/logging.js new file mode 100644 index 0000000..bca6eb6 --- /dev/null +++ b/lib/logging.js @@ -0,0 +1,35 @@ +const log4js = require('log4js') + +module.exports = { + configure(verbose) { + const categories = { + default: { + appenders: ['stdout-filter'], + level: 'trace' + } + } + const appenders = { + stdout: { + type: 'stdout', + level: 'warn' + }, + 'stdout-filter': { + type: 'logLevelFilter', + appender: 'stdout', + level: verbose ? 'debug' : 'warn' + } + } + log4js.configure({ + appenders, + categories + }) + }, + + getLogger(...args) { + return log4js.getLogger(...args) + }, + + shutdown(cb) { + log4js.shutdown(cb) + } +} diff --git a/package-lock.json b/package-lock.json index b0cf47f..5304f9b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,19 @@ { - "name": "pupflare", + "name": "rt-pupflare", "version": "1.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "pupflare", + "name": "rt-pupflare", "version": "1.0.0", "license": "ISC", "dependencies": { "@koa/router": "^10.1.1", + "async-mutex": "^0.3.2", "koa": "^2.13.4", + "koa-bodyparser": "^4.3.0", + "log4js": "^6.4.2", "minimist": "^1.2.5", "puppeteer": "^13.4.1", "puppeteer-extra": "^3.2.3", @@ -250,6 +253,14 @@ "node": ">=0.10.0" } }, + "node_modules/async-mutex": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.3.2.tgz", + "integrity": "sha512-HuTK7E7MT7jZEh1P9GtRW9+aTWiDWWi9InbZ5hjxrnRa39KS4BW04+xLBhYNS2aXhHUIKZSw3gj4Pn1pj+qGAA==", + "dependencies": { + "tslib": "^2.3.1" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -324,6 +335,14 @@ "node": "*" } }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/cache-content-type": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", @@ -336,6 +355,18 @@ "node": ">= 6.0.0" } }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", @@ -365,6 +396,17 @@ "node": ">= 0.12.0" } }, + "node_modules/co-body": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", + "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", + "dependencies": { + "inflation": "^2.0.0", + "qs": "^6.5.2", + "raw-body": "^2.3.3", + "type-is": "^1.6.16" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -401,6 +443,11 @@ "node": ">= 0.8" } }, + "node_modules/copy-to": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", + "integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=" + }, "node_modules/cross-fetch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", @@ -409,6 +456,14 @@ "node-fetch": "2.6.7" } }, + "node_modules/date-format": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.5.tgz", + "integrity": "sha512-zBhRiN/M0gDxUoM2xRtzTjJzSg0XEi1ofYpF84PfXeS3hN2PsGxmc7jw3DNQtFlimRbMmob5FC3G0cJq6jQQpw==", + "engines": { + "node": ">=4.0" + } + }, "node_modules/debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -530,6 +585,11 @@ "node": ">=8" } }, + "node_modules/flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" + }, "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -580,6 +640,24 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -618,6 +696,17 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -690,6 +779,17 @@ "node": ">= 6" } }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -709,6 +809,14 @@ } ] }, + "node_modules/inflation": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", + "integrity": "sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -835,6 +943,18 @@ "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" } }, + "node_modules/koa-bodyparser": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz", + "integrity": "sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw==", + "dependencies": { + "co-body": "^6.0.0", + "copy-to": "^2.0.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/koa-compose": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", @@ -871,6 +991,21 @@ "node": ">=8" } }, + "node_modules/log4js": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.2.tgz", + "integrity": "sha512-k80cggS2sZQLBwllpT1p06GtfvzMmSdUCkW96f0Hj83rKGJDAu2vZjt9B9ag2vx8Zz1IXzxoLgqvRJCdMKybGg==", + "dependencies": { + "date-format": "^4.0.4", + "debug": "^4.3.3", + "flatted": "^3.2.5", + "rfdc": "^1.3.0", + "streamroller": "^3.0.4" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -992,6 +1127,14 @@ } } }, + "node_modules/object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -1212,6 +1355,57 @@ "node": ">=8" } }, + "node_modules/qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -1225,6 +1419,11 @@ "node": ">= 6" } }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -1258,6 +1457,11 @@ } ] }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -1296,6 +1500,19 @@ "node": ">=0.10.0" } }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -1304,6 +1521,19 @@ "node": ">= 0.6" } }, + "node_modules/streamroller": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.5.tgz", + "integrity": "sha512-5uzTEUIi4OB5zy/H30kbUN/zpDNJsFUA+Z47ZL8EfrP93lcZvRLEqdbhdunEPa7CouuAzXXsHpCJ9dg90Umw7g==", + "dependencies": { + "date-format": "^4.0.5", + "debug": "^4.3.3", + "fs-extra": "^10.0.1" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -1356,6 +1586,11 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, "node_modules/tsscmp": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", @@ -1393,6 +1628,14 @@ "node": ">= 10.0.0" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -1682,6 +1925,14 @@ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" }, + "async-mutex": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.3.2.tgz", + "integrity": "sha512-HuTK7E7MT7jZEh1P9GtRW9+aTWiDWWi9InbZ5hjxrnRa39KS4BW04+xLBhYNS2aXhHUIKZSw3gj4Pn1pj+qGAA==", + "requires": { + "tslib": "^2.3.1" + } + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1725,6 +1976,11 @@ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, "cache-content-type": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", @@ -1734,6 +1990,15 @@ "ylru": "^1.2.0" } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", @@ -1756,6 +2021,17 @@ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, + "co-body": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", + "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", + "requires": { + "inflation": "^2.0.0", + "qs": "^6.5.2", + "raw-body": "^2.3.3", + "type-is": "^1.6.16" + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1783,6 +2059,11 @@ "keygrip": "~1.1.0" } }, + "copy-to": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", + "integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=" + }, "cross-fetch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", @@ -1791,6 +2072,11 @@ "node-fetch": "2.6.7" } }, + "date-format": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.5.tgz", + "integrity": "sha512-zBhRiN/M0gDxUoM2xRtzTjJzSg0XEi1ofYpF84PfXeS3hN2PsGxmc7jw3DNQtFlimRbMmob5FC3G0cJq6jQQpw==" + }, "debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -1880,6 +2166,11 @@ "path-exists": "^4.0.0" } }, + "flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -1918,6 +2209,21 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -1944,6 +2250,14 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -1994,11 +2308,24 @@ "debug": "4" } }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, + "inflation": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", + "integrity": "sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=" + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2099,6 +2426,15 @@ "vary": "^1.1.2" } }, + "koa-bodyparser": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz", + "integrity": "sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw==", + "requires": { + "co-body": "^6.0.0", + "copy-to": "^2.0.1" + } + }, "koa-compose": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", @@ -2126,6 +2462,18 @@ "p-locate": "^4.1.0" } }, + "log4js": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.2.tgz", + "integrity": "sha512-k80cggS2sZQLBwllpT1p06GtfvzMmSdUCkW96f0Hj83rKGJDAu2vZjt9B9ag2vx8Zz1IXzxoLgqvRJCdMKybGg==", + "requires": { + "date-format": "^4.0.4", + "debug": "^4.3.3", + "flatted": "^3.2.5", + "rfdc": "^1.3.0", + "streamroller": "^3.0.4" + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -2211,6 +2559,11 @@ "whatwg-url": "^5.0.0" } }, + "object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" + }, "on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -2376,6 +2729,44 @@ "puppeteer-extra-plugin-user-data-dir": "^2.3.1" } }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + } + } + }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -2386,6 +2777,11 @@ "util-deprecate": "^1.0.1" } }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -2399,6 +2795,11 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -2430,11 +2831,31 @@ } } }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, + "streamroller": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.5.tgz", + "integrity": "sha512-5uzTEUIi4OB5zy/H30kbUN/zpDNJsFUA+Z47ZL8EfrP93lcZvRLEqdbhdunEPa7CouuAzXXsHpCJ9dg90Umw7g==", + "requires": { + "date-format": "^4.0.5", + "debug": "^4.3.3", + "fs-extra": "^10.0.1" + } + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -2481,6 +2902,11 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, "tsscmp": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", @@ -2509,6 +2935,11 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/package.json b/package.json index b3ca94e..2f8ffa4 100644 --- a/package.json +++ b/package.json @@ -2,17 +2,20 @@ "name": "rt-pupflare", "version": "1.0.0", "description": "", - "main": "index.js", + "main": "app.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "start": "node index.js" + "start": "node app.js" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "@koa/router": "^10.1.1", + "async-mutex": "^0.3.2", "koa": "^2.13.4", + "koa-bodyparser": "^4.3.0", + "log4js": "^6.4.2", "minimist": "^1.2.5", "puppeteer": "^13.4.1", "puppeteer-extra": "^3.2.3", diff --git a/systemd/rt-pupflare@.service b/systemd/rt-pupflare@.service index b96a902..c2362f5 100644 --- a/systemd/rt-pupflare@.service +++ b/systemd/rt-pupflare@.service @@ -10,7 +10,7 @@ Restart=on-failure ProtectSystem=full PrivateDevices=true WorkingDirectory=/opt/thirdparty -ExecStart=/usr/bin/node $INSTALL_DIR/index.js $PARAMS +ExecStart=/usr/bin/node $INSTALL_DIR/app.js $PARAMS [Install] WantedBy=multi-user.target -- cgit v1.2.3