@things-factory/integration-headless 8.0.0-alpha.31 → 8.0.0-alpha.35

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/integration-headless",
3
- "version": "8.0.0-alpha.31",
3
+ "version": "8.0.0-alpha.35",
4
4
  "main": "dist-server/index.js",
5
5
  "things-factory": true,
6
6
  "author": "heartyoh <heartyoh@hatiolab.com>",
@@ -22,12 +22,12 @@
22
22
  "clean": "npm run clean:server"
23
23
  },
24
24
  "dependencies": {
25
- "@things-factory/attachment-base": "^8.0.0-alpha.29",
26
- "@things-factory/board-service": "^8.0.0-alpha.31",
27
- "@things-factory/integration-base": "^8.0.0-alpha.31",
25
+ "@things-factory/attachment-base": "^8.0.0-alpha.35",
26
+ "@things-factory/board-service": "^8.0.0-alpha.35",
27
+ "@things-factory/integration-base": "^8.0.0-alpha.35",
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": "3d8df8131f3b0c1898c525d2928b7f9dc846840e"
32
+ "gitHead": "94fe243a5c99837a1e6f98de2c454c351ac8e6fd"
33
33
  }
@@ -1,2 +1 @@
1
- import './connector'
2
1
  import './task'
@@ -27,7 +27,12 @@ interface PDFContext {
27
27
 
28
28
  export class PDFCaptureUtil {
29
29
  private context: PDFContext
30
- private headlessPool: any
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.headlessPool = ConnectionManager.getConnectionInstanceByName(domain, connectionName)
41
- this.browser = await this.headlessPool.acquire()
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.headlessPool.release(this.browser)
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,3 +0,0 @@
1
- import * as genericPool from 'generic-pool';
2
- export declare function createHeadlessPool(options: genericPool.Options): genericPool.Pool<any>;
3
- export declare function destroyHeadlessPool(headlessPool: genericPool.Pool<any>): Promise<void>;
@@ -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,4 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- require("./headless-connector");
4
- //# sourceMappingURL=index.js.map
@@ -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'