@things-factory/integration-headless 8.0.0-alpha.30 → 8.0.0-alpha.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-server/engine/index.d.ts +0 -1
- package/dist-server/engine/index.js +0 -1
- package/dist-server/engine/index.js.map +1 -1
- package/dist-server/engine/task/pdf-capture-util.d.ts +1 -1
- package/dist-server/engine/task/pdf-capture-util.js +3 -3
- package/dist-server/engine/task/pdf-capture-util.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/server/engine/index.ts +0 -1
- package/server/engine/task/pdf-capture-util.ts +9 -4
- package/dist-server/engine/connector/headless-connector.d.ts +0 -14
- package/dist-server/engine/connector/headless-connector.js +0 -54
- package/dist-server/engine/connector/headless-connector.js.map +0 -1
- package/dist-server/engine/connector/headless-pool.d.ts +0 -3
- package/dist-server/engine/connector/headless-pool.js +0 -63
- package/dist-server/engine/connector/headless-pool.js.map +0 -1
- package/dist-server/engine/connector/index.d.ts +0 -1
- package/dist-server/engine/connector/index.js +0 -4
- package/dist-server/engine/connector/index.js.map +0 -1
- package/server/engine/connector/headless-connector.ts +0 -68
- package/server/engine/connector/headless-pool.ts +0 -69
- package/server/engine/connector/index.ts +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/integration-headless",
|
|
3
|
-
"version": "8.0.0-alpha.
|
|
3
|
+
"version": "8.0.0-alpha.34",
|
|
4
4
|
"main": "dist-server/index.js",
|
|
5
5
|
"things-factory": true,
|
|
6
6
|
"author": "heartyoh <heartyoh@hatiolab.com>",
|
|
@@ -23,11 +23,11 @@
|
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"@things-factory/attachment-base": "^8.0.0-alpha.29",
|
|
26
|
-
"@things-factory/board-service": "^8.0.0-alpha.
|
|
27
|
-
"@things-factory/integration-base": "^8.0.0-alpha.
|
|
26
|
+
"@things-factory/board-service": "^8.0.0-alpha.34",
|
|
27
|
+
"@things-factory/integration-base": "^8.0.0-alpha.34",
|
|
28
28
|
"@things-factory/shell": "^8.0.0-alpha.29",
|
|
29
29
|
"ejs": "^3.1.10",
|
|
30
30
|
"pdf-lib": "^1.17.1"
|
|
31
31
|
},
|
|
32
|
-
"gitHead": "
|
|
32
|
+
"gitHead": "0d43b419fc888429ed0bfa56c82b2456c2e74056"
|
|
33
33
|
}
|
package/server/engine/index.ts
CHANGED
|
@@ -27,7 +27,12 @@ interface PDFContext {
|
|
|
27
27
|
|
|
28
28
|
export class PDFCaptureUtil {
|
|
29
29
|
private context: PDFContext
|
|
30
|
-
private
|
|
30
|
+
private headlessConnection: {
|
|
31
|
+
acquireSessionPage: () => Promise<Page>
|
|
32
|
+
releasePage: (page: Page) => Promise<void>
|
|
33
|
+
acquireBrowser: () => Promise<Browser>
|
|
34
|
+
releaseBrowser: (browser: Browser) => Promise<void>
|
|
35
|
+
}
|
|
31
36
|
|
|
32
37
|
public browser: Browser | null = null
|
|
33
38
|
|
|
@@ -37,14 +42,14 @@ export class PDFCaptureUtil {
|
|
|
37
42
|
|
|
38
43
|
async initBrowser(connectionName: string) {
|
|
39
44
|
const { domain } = this.context
|
|
40
|
-
this.
|
|
41
|
-
this.browser = await this.
|
|
45
|
+
this.headlessConnection = ConnectionManager.getConnectionInstanceByName(domain, connectionName)
|
|
46
|
+
this.browser = await this.headlessConnection.acquireBrowser()
|
|
42
47
|
}
|
|
43
48
|
|
|
44
49
|
async closeBrowser() {
|
|
45
50
|
if (this.browser) {
|
|
46
51
|
await this.browser.close()
|
|
47
|
-
this.
|
|
52
|
+
this.headlessConnection.releaseBrowser(this.browser)
|
|
48
53
|
}
|
|
49
54
|
}
|
|
50
55
|
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { Connector } from '@things-factory/integration-base';
|
|
2
|
-
export declare class HeadlessConnector implements Connector {
|
|
3
|
-
ready(connectionConfigs: any): Promise<void>;
|
|
4
|
-
connect(connection: any): Promise<void>;
|
|
5
|
-
disconnect(connection: any): Promise<void>;
|
|
6
|
-
get parameterSpec(): {
|
|
7
|
-
type: string;
|
|
8
|
-
name: string;
|
|
9
|
-
label: string;
|
|
10
|
-
}[];
|
|
11
|
-
get taskPrefixes(): string[];
|
|
12
|
-
get description(): string;
|
|
13
|
-
get help(): string;
|
|
14
|
-
}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.HeadlessConnector = void 0;
|
|
4
|
-
const integration_base_1 = require("@things-factory/integration-base");
|
|
5
|
-
const headless_pool_1 = require("./headless-pool");
|
|
6
|
-
class HeadlessConnector {
|
|
7
|
-
async ready(connectionConfigs) {
|
|
8
|
-
await Promise.all(connectionConfigs.map(this.connect.bind(this)));
|
|
9
|
-
integration_base_1.ConnectionManager.logger.info('headless-connector connections are ready');
|
|
10
|
-
}
|
|
11
|
-
async connect(connection) {
|
|
12
|
-
var { endpoint: uri = '1', params: { min = 2, max = 10 } } = connection;
|
|
13
|
-
const headlessPool = (0, headless_pool_1.createHeadlessPool)({
|
|
14
|
-
min,
|
|
15
|
-
max,
|
|
16
|
-
testOnBorrow: true,
|
|
17
|
-
acquireTimeoutMillis: 15000
|
|
18
|
-
});
|
|
19
|
-
integration_base_1.ConnectionManager.addConnectionInstance(connection, headlessPool);
|
|
20
|
-
integration_base_1.ConnectionManager.logger.info(`headless-connector connection(${connection.name}:${connection.endpoint}) is connected`);
|
|
21
|
-
}
|
|
22
|
-
async disconnect(connection) {
|
|
23
|
-
const headlessPool = integration_base_1.ConnectionManager.getConnectionInstance(connection);
|
|
24
|
-
(0, headless_pool_1.destroyHeadlessPool)(headlessPool);
|
|
25
|
-
integration_base_1.ConnectionManager.removeConnectionInstance(connection);
|
|
26
|
-
integration_base_1.ConnectionManager.logger.info(`headless-connector connection(${connection.name}) is disconnected`);
|
|
27
|
-
}
|
|
28
|
-
get parameterSpec() {
|
|
29
|
-
return [
|
|
30
|
-
{
|
|
31
|
-
type: 'number',
|
|
32
|
-
name: 'min',
|
|
33
|
-
label: 'pool-size-min'
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
type: 'number',
|
|
37
|
-
name: 'max',
|
|
38
|
-
label: 'pool-size-max'
|
|
39
|
-
}
|
|
40
|
-
];
|
|
41
|
-
}
|
|
42
|
-
get taskPrefixes() {
|
|
43
|
-
return ['headless-pdf'];
|
|
44
|
-
}
|
|
45
|
-
get description() {
|
|
46
|
-
return 'Headless Pool Connector';
|
|
47
|
-
}
|
|
48
|
-
get help() {
|
|
49
|
-
return 'integration/connector/headless-connector';
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
exports.HeadlessConnector = HeadlessConnector;
|
|
53
|
-
integration_base_1.ConnectionManager.registerConnector('headless-connector', new HeadlessConnector());
|
|
54
|
-
//# sourceMappingURL=headless-connector.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"headless-connector.js","sourceRoot":"","sources":["../../../server/engine/connector/headless-connector.ts"],"names":[],"mappings":";;;AAAA,uEAA+E;AAC/E,mDAAyE;AAEzE,MAAa,iBAAiB;IAC5B,KAAK,CAAC,KAAK,CAAC,iBAAiB;QAC3B,MAAM,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAEjE,oCAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAA;IAC3E,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAU;QACtB,IAAI,EACF,QAAQ,EAAE,GAAG,GAAG,GAAG,EACnB,MAAM,EAAE,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,EAAE,EAC9B,GAAG,UAAU,CAAA;QAEd,MAAM,YAAY,GAAG,IAAA,kCAAkB,EAAC;YACtC,GAAG;YACH,GAAG;YACH,YAAY,EAAE,IAAI;YAClB,oBAAoB,EAAE,KAAK;SAC5B,CAAC,CAAA;QAEF,oCAAiB,CAAC,qBAAqB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAA;QAEjE,oCAAiB,CAAC,MAAM,CAAC,IAAI,CAC3B,iCAAiC,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,QAAQ,gBAAgB,CACxF,CAAA;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAU;QACzB,MAAM,YAAY,GAAG,oCAAiB,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAA;QACxE,IAAA,mCAAmB,EAAC,YAAY,CAAC,CAAA;QAEjC,oCAAiB,CAAC,wBAAwB,CAAC,UAAU,CAAC,CAAA;QAEtD,oCAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,UAAU,CAAC,IAAI,mBAAmB,CAAC,CAAA;IACpG,CAAC;IAED,IAAI,aAAa;QACf,OAAO;YACL;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,KAAK;gBACX,KAAK,EAAE,eAAe;aACvB;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,KAAK;gBACX,KAAK,EAAE,eAAe;aACvB;SACF,CAAA;IACH,CAAC;IAED,IAAI,YAAY;QACd,OAAO,CAAC,cAAc,CAAC,CAAA;IACzB,CAAC;IAED,IAAI,WAAW;QACb,OAAO,yBAAyB,CAAA;IAClC,CAAC;IAED,IAAI,IAAI;QACN,OAAO,0CAA0C,CAAA;IACnD,CAAC;CACF;AA9DD,8CA8DC;AAED,oCAAiB,CAAC,iBAAiB,CAAC,oBAAoB,EAAE,IAAI,iBAAiB,EAAE,CAAC,CAAA","sourcesContent":["import { ConnectionManager, Connector } from '@things-factory/integration-base'\nimport { createHeadlessPool, destroyHeadlessPool } from './headless-pool'\n\nexport class HeadlessConnector implements Connector {\n async ready(connectionConfigs) {\n await Promise.all(connectionConfigs.map(this.connect.bind(this)))\n\n ConnectionManager.logger.info('headless-connector connections are ready')\n }\n\n async connect(connection) {\n var {\n endpoint: uri = '1',\n params: { min = 2, max = 10 }\n } = connection\n\n const headlessPool = createHeadlessPool({\n min,\n max,\n testOnBorrow: true,\n acquireTimeoutMillis: 15000\n })\n\n ConnectionManager.addConnectionInstance(connection, headlessPool)\n\n ConnectionManager.logger.info(\n `headless-connector connection(${connection.name}:${connection.endpoint}) is connected`\n )\n }\n\n async disconnect(connection) {\n const headlessPool = ConnectionManager.getConnectionInstance(connection)\n destroyHeadlessPool(headlessPool)\n\n ConnectionManager.removeConnectionInstance(connection)\n\n ConnectionManager.logger.info(`headless-connector connection(${connection.name}) is disconnected`)\n }\n\n get parameterSpec() {\n return [\n {\n type: 'number',\n name: 'min',\n label: 'pool-size-min'\n },\n {\n type: 'number',\n name: 'max',\n label: 'pool-size-max'\n }\n ]\n }\n\n get taskPrefixes() {\n return ['headless-pdf']\n }\n\n get description() {\n return 'Headless Pool Connector'\n }\n\n get help() {\n return 'integration/connector/headless-connector'\n }\n}\n\nConnectionManager.registerConnector('headless-connector', new HeadlessConnector())\n"]}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createHeadlessPool = createHeadlessPool;
|
|
4
|
-
exports.destroyHeadlessPool = destroyHeadlessPool;
|
|
5
|
-
const tslib_1 = require("tslib");
|
|
6
|
-
const genericPool = tslib_1.__importStar(require("generic-pool"));
|
|
7
|
-
const env_1 = require("@things-factory/env");
|
|
8
|
-
try {
|
|
9
|
-
var puppeteer = require('puppeteer');
|
|
10
|
-
}
|
|
11
|
-
catch (err) {
|
|
12
|
-
env_1.logger.error(err);
|
|
13
|
-
}
|
|
14
|
-
function createHeadlessPool(options) {
|
|
15
|
-
return genericPool.createPool({
|
|
16
|
-
create() {
|
|
17
|
-
console.log('headless instance in headless-pool-integration about to create');
|
|
18
|
-
return initializeChromium();
|
|
19
|
-
},
|
|
20
|
-
validate(browser) {
|
|
21
|
-
return Promise.race([
|
|
22
|
-
new Promise(res => setTimeout(() => res(false), 1500)),
|
|
23
|
-
browser
|
|
24
|
-
//@ts-ignore
|
|
25
|
-
.version()
|
|
26
|
-
.then(_ => true)
|
|
27
|
-
.catch(_ => false)
|
|
28
|
-
]);
|
|
29
|
-
},
|
|
30
|
-
destroy(browser) {
|
|
31
|
-
//@ts-ignore
|
|
32
|
-
return browser.close();
|
|
33
|
-
}
|
|
34
|
-
}, options);
|
|
35
|
-
}
|
|
36
|
-
async function destroyHeadlessPool(headlessPool) {
|
|
37
|
-
if (headlessPool) {
|
|
38
|
-
console.log('headless-pool-integration about to destroy');
|
|
39
|
-
await headlessPool.drain();
|
|
40
|
-
await headlessPool.clear();
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
const CHROMIUM_PATH = env_1.config.get('CHROMIUM_PATH');
|
|
44
|
-
async function initializeChromium() {
|
|
45
|
-
try {
|
|
46
|
-
if (!puppeteer) {
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
var launchSetting = {
|
|
50
|
-
args: ['--hide-scrollbars', '--mute-audio', '--no-sandbox', '--use-gl=egl'],
|
|
51
|
-
headless: 'shell'
|
|
52
|
-
};
|
|
53
|
-
if (CHROMIUM_PATH) {
|
|
54
|
-
launchSetting['executablePath'] = CHROMIUM_PATH;
|
|
55
|
-
}
|
|
56
|
-
const browser = await puppeteer.launch(launchSetting);
|
|
57
|
-
return browser;
|
|
58
|
-
}
|
|
59
|
-
catch (err) {
|
|
60
|
-
env_1.logger.error(err);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
//# sourceMappingURL=headless-pool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"headless-pool.js","sourceRoot":"","sources":["../../../server/engine/connector/headless-pool.ts"],"names":[],"mappings":";;AAUA,gDAwBC;AAED,kDAOC;;AA3CD,kEAA2C;AAE3C,6CAAoD;AAEpD,IAAI,CAAC;IACH,IAAI,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;AACtC,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACb,YAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AACnB,CAAC;AAED,SAAgB,kBAAkB,CAAC,OAA4B;IAC7D,OAAO,WAAW,CAAC,UAAU,CAC3B;QACE,MAAM;YACJ,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAA;YAC7E,OAAO,kBAAkB,EAAE,CAAA;QAC7B,CAAC;QACD,QAAQ,CAAC,OAAO;YACd,OAAO,OAAO,CAAC,IAAI,CAAC;gBAClB,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;gBACtD,OAAO;oBACL,YAAY;qBACX,OAAO,EAAE;qBACT,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;qBACf,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;aACrB,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,CAAC,OAAO;YACb,YAAY;YACZ,OAAO,OAAO,CAAC,KAAK,EAAE,CAAA;QACxB,CAAC;KAC0B,EAC7B,OAAO,CACR,CAAA;AACH,CAAC;AAEM,KAAK,UAAU,mBAAmB,CAAC,YAAmC;IAC3E,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAA;QAEzD,MAAM,YAAY,CAAC,KAAK,EAAE,CAAA;QAC1B,MAAM,YAAY,CAAC,KAAK,EAAE,CAAA;IAC5B,CAAC;AACH,CAAC;AAED,MAAM,aAAa,GAAG,YAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;AAEjD,KAAK,UAAU,kBAAkB;IAC/B,IAAI,CAAC;QACH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAM;QACR,CAAC;QAED,IAAI,aAAa,GAAG;YAClB,IAAI,EAAE,CAAC,mBAAmB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,CAAC;YAC3E,QAAQ,EAAE,OAAO;SAClB,CAAA;QAED,IAAI,aAAa,EAAE,CAAC;YAClB,aAAa,CAAC,gBAAgB,CAAC,GAAG,aAAa,CAAA;QACjD,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;QAErD,OAAO,OAAO,CAAA;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACnB,CAAC;AACH,CAAC","sourcesContent":["import * as genericPool from 'generic-pool'\n\nimport { config, logger } from '@things-factory/env'\n\ntry {\n var puppeteer = require('puppeteer')\n} catch (err) {\n logger.error(err)\n}\n\nexport function createHeadlessPool(options: genericPool.Options) {\n return genericPool.createPool(\n {\n create() {\n console.log('headless instance in headless-pool-integration about to create')\n return initializeChromium()\n },\n validate(browser) {\n return Promise.race([\n new Promise(res => setTimeout(() => res(false), 1500)),\n browser\n //@ts-ignore\n .version()\n .then(_ => true)\n .catch(_ => false)\n ])\n },\n destroy(browser) {\n //@ts-ignore\n return browser.close()\n }\n } as genericPool.Factory<any>,\n options\n )\n}\n\nexport async function destroyHeadlessPool(headlessPool: genericPool.Pool<any>) {\n if (headlessPool) {\n console.log('headless-pool-integration about to destroy')\n\n await headlessPool.drain()\n await headlessPool.clear()\n }\n}\n\nconst CHROMIUM_PATH = config.get('CHROMIUM_PATH')\n\nasync function initializeChromium() {\n try {\n if (!puppeteer) {\n return\n }\n\n var launchSetting = {\n args: ['--hide-scrollbars', '--mute-audio', '--no-sandbox', '--use-gl=egl'],\n headless: 'shell'\n }\n\n if (CHROMIUM_PATH) {\n launchSetting['executablePath'] = CHROMIUM_PATH\n }\n\n const browser = await puppeteer.launch(launchSetting)\n\n return browser\n } catch (err) {\n logger.error(err)\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import './headless-connector';
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/engine/connector/index.ts"],"names":[],"mappings":";;AAAA,gCAA6B","sourcesContent":["import './headless-connector'\n"]}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { ConnectionManager, Connector } from '@things-factory/integration-base'
|
|
2
|
-
import { createHeadlessPool, destroyHeadlessPool } from './headless-pool'
|
|
3
|
-
|
|
4
|
-
export class HeadlessConnector implements Connector {
|
|
5
|
-
async ready(connectionConfigs) {
|
|
6
|
-
await Promise.all(connectionConfigs.map(this.connect.bind(this)))
|
|
7
|
-
|
|
8
|
-
ConnectionManager.logger.info('headless-connector connections are ready')
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
async connect(connection) {
|
|
12
|
-
var {
|
|
13
|
-
endpoint: uri = '1',
|
|
14
|
-
params: { min = 2, max = 10 }
|
|
15
|
-
} = connection
|
|
16
|
-
|
|
17
|
-
const headlessPool = createHeadlessPool({
|
|
18
|
-
min,
|
|
19
|
-
max,
|
|
20
|
-
testOnBorrow: true,
|
|
21
|
-
acquireTimeoutMillis: 15000
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
ConnectionManager.addConnectionInstance(connection, headlessPool)
|
|
25
|
-
|
|
26
|
-
ConnectionManager.logger.info(
|
|
27
|
-
`headless-connector connection(${connection.name}:${connection.endpoint}) is connected`
|
|
28
|
-
)
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
async disconnect(connection) {
|
|
32
|
-
const headlessPool = ConnectionManager.getConnectionInstance(connection)
|
|
33
|
-
destroyHeadlessPool(headlessPool)
|
|
34
|
-
|
|
35
|
-
ConnectionManager.removeConnectionInstance(connection)
|
|
36
|
-
|
|
37
|
-
ConnectionManager.logger.info(`headless-connector connection(${connection.name}) is disconnected`)
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
get parameterSpec() {
|
|
41
|
-
return [
|
|
42
|
-
{
|
|
43
|
-
type: 'number',
|
|
44
|
-
name: 'min',
|
|
45
|
-
label: 'pool-size-min'
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
type: 'number',
|
|
49
|
-
name: 'max',
|
|
50
|
-
label: 'pool-size-max'
|
|
51
|
-
}
|
|
52
|
-
]
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
get taskPrefixes() {
|
|
56
|
-
return ['headless-pdf']
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
get description() {
|
|
60
|
-
return 'Headless Pool Connector'
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
get help() {
|
|
64
|
-
return 'integration/connector/headless-connector'
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
ConnectionManager.registerConnector('headless-connector', new HeadlessConnector())
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import * as genericPool from 'generic-pool'
|
|
2
|
-
|
|
3
|
-
import { config, logger } from '@things-factory/env'
|
|
4
|
-
|
|
5
|
-
try {
|
|
6
|
-
var puppeteer = require('puppeteer')
|
|
7
|
-
} catch (err) {
|
|
8
|
-
logger.error(err)
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function createHeadlessPool(options: genericPool.Options) {
|
|
12
|
-
return genericPool.createPool(
|
|
13
|
-
{
|
|
14
|
-
create() {
|
|
15
|
-
console.log('headless instance in headless-pool-integration about to create')
|
|
16
|
-
return initializeChromium()
|
|
17
|
-
},
|
|
18
|
-
validate(browser) {
|
|
19
|
-
return Promise.race([
|
|
20
|
-
new Promise(res => setTimeout(() => res(false), 1500)),
|
|
21
|
-
browser
|
|
22
|
-
//@ts-ignore
|
|
23
|
-
.version()
|
|
24
|
-
.then(_ => true)
|
|
25
|
-
.catch(_ => false)
|
|
26
|
-
])
|
|
27
|
-
},
|
|
28
|
-
destroy(browser) {
|
|
29
|
-
//@ts-ignore
|
|
30
|
-
return browser.close()
|
|
31
|
-
}
|
|
32
|
-
} as genericPool.Factory<any>,
|
|
33
|
-
options
|
|
34
|
-
)
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export async function destroyHeadlessPool(headlessPool: genericPool.Pool<any>) {
|
|
38
|
-
if (headlessPool) {
|
|
39
|
-
console.log('headless-pool-integration about to destroy')
|
|
40
|
-
|
|
41
|
-
await headlessPool.drain()
|
|
42
|
-
await headlessPool.clear()
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const CHROMIUM_PATH = config.get('CHROMIUM_PATH')
|
|
47
|
-
|
|
48
|
-
async function initializeChromium() {
|
|
49
|
-
try {
|
|
50
|
-
if (!puppeteer) {
|
|
51
|
-
return
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
var launchSetting = {
|
|
55
|
-
args: ['--hide-scrollbars', '--mute-audio', '--no-sandbox', '--use-gl=egl'],
|
|
56
|
-
headless: 'shell'
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if (CHROMIUM_PATH) {
|
|
60
|
-
launchSetting['executablePath'] = CHROMIUM_PATH
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
const browser = await puppeteer.launch(launchSetting)
|
|
64
|
-
|
|
65
|
-
return browser
|
|
66
|
-
} catch (err) {
|
|
67
|
-
logger.error(err)
|
|
68
|
-
}
|
|
69
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import './headless-connector'
|