@things-factory/integration-base 6.0.67 → 6.0.69

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.
Files changed (29) hide show
  1. package/dist-server/engine/connector/http-connector.js +1 -1
  2. package/dist-server/engine/connector/http-connector.js.map +1 -1
  3. package/dist-server/engine/task/data-mapper.js +37 -0
  4. package/dist-server/engine/task/data-mapper.js.map +1 -0
  5. package/dist-server/engine/task/headless-post.js +123 -0
  6. package/dist-server/engine/task/headless-post.js.map +1 -0
  7. package/dist-server/engine/task/http-post.js +3 -6
  8. package/dist-server/engine/task/http-post.js.map +1 -1
  9. package/dist-server/engine/task/index.js +2 -0
  10. package/dist-server/engine/task/index.js.map +1 -1
  11. package/dist-server/engine/task/map-data.js +37 -0
  12. package/dist-server/engine/task/map-data.js.map +1 -0
  13. package/dist-server/engine/task/utils/headless-pool-for-scenario.js +65 -0
  14. package/dist-server/engine/task/utils/headless-pool-for-scenario.js.map +1 -0
  15. package/dist-server/engine/task/utils/headless-pool-for-task.js +65 -0
  16. package/dist-server/engine/task/utils/headless-pool-for-task.js.map +1 -0
  17. package/dist-server/tsconfig.tsbuildinfo +1 -1
  18. package/helps/integration/task/data-mapper.md +14 -0
  19. package/package.json +2 -2
  20. package/server/engine/connector/http-connector.ts +1 -1
  21. package/server/engine/task/data-mapper.ts +44 -0
  22. package/server/engine/task/headless-post.ts +141 -0
  23. package/server/engine/task/http-post.ts +4 -8
  24. package/server/engine/task/index.ts +2 -0
  25. package/server/engine/task/utils/headless-pool-for-scenario.ts +71 -0
  26. package/translations/en.json +1 -1
  27. package/translations/ko.json +1 -1
  28. package/translations/ms.json +1 -1
  29. package/translations/zh.json +1 -1
@@ -44,7 +44,7 @@ class HttpConnector {
44
44
  ];
45
45
  }
46
46
  get taskPrefixes() {
47
- return ['http'];
47
+ return ['http', 'headless'];
48
48
  }
49
49
  }
50
50
  exports.HttpConnector = HttpConnector;
@@ -1 +1 @@
1
- {"version":3,"file":"http-connector.js","sourceRoot":"","sources":["../../../server/engine/connector/http-connector.ts"],"names":[],"mappings":";;;AAAA,iEAA4D;AAC5D,iDAAqD;AAErD,8DAAyD;AAGzD,MAAa,aAAa;IACxB,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,sCAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAA;IACvE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAU;QACtB,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAAA;QAC3B,MAAM,CAAC,kBAAkB,GAAG,CAAC,MAAM,CAAC,kBAAkB,IAAI,GAAG,CAAC,KAAK,GAAG,CAAA;QAEtE,IAAI,MAAM,CAAC,UAAU,EAAE;YACrB,MAAM,YAAY,GAAiB,MAAM,IAAA,qBAAa,EAAC,4BAAY,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAA;YACzG,IAAI,WAAW,GAAG,YAAY,CAAC,cAAc,EAAE,CAAA;SAChD;QAED,sCAAiB,CAAC,qBAAqB,CAAC,UAAU,kCAC7C,UAAU,KACb,WAAW,EAAE,WAAW,IAAI,EAAE,EAC9B,MAAM,IACN,CAAA;QAEF,sCAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,QAAQ,gBAAgB,CAAC,CAAA;IACpH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAU;QACzB,sCAAiB,CAAC,wBAAwB,CAAC,UAAU,CAAC,CAAA;QAEtD,sCAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,UAAU,CAAC,IAAI,mBAAmB,CAAC,CAAA;IAChG,CAAC;IAED,IAAI,aAAa;QACf,OAAO;YACL;gBACE,IAAI,EAAE,iBAAiB;gBACvB,IAAI,EAAE,YAAY;gBAClB,KAAK,EAAE,aAAa;gBACpB,QAAQ,EAAE;oBACR,SAAS,EAAE,eAAe;iBAC3B;aACF;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,oBAAoB;gBAC1B,KAAK,EAAE,qBAAqB;gBAC5B,QAAQ,EAAE;oBACR,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;iBACpB;aACF;SACF,CAAA;IACH,CAAC;IAED,IAAI,YAAY;QACd,OAAO,CAAC,MAAM,CAAC,CAAA;IACjB,CAAC;CACF;AAvDD,sCAuDC;AAED,sCAAiB,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,IAAI,aAAa,EAAE,CAAC,CAAA","sourcesContent":["import { Oauth2Client } from '@things-factory/oauth2-client'\nimport { getRepository } from '@things-factory/shell'\n\nimport { ConnectionManager } from '../connection-manager'\nimport { Connector } from '../types'\n\nexport class HttpConnector implements Connector {\n async ready(connectionConfigs) {\n await Promise.all(connectionConfigs.map(this.connect.bind(this)))\n\n ConnectionManager.logger.info('http-connector connections are ready')\n }\n\n async connect(connection) {\n var { params } = connection\n params.rejectUnauthorized = (params.rejectUnauthorized || 'Y') === 'Y'\n\n if (params.authClient) {\n const oauth2Client: Oauth2Client = await getRepository(Oauth2Client).findOneBy({ id: params.authClient })\n var authHeaders = oauth2Client.getAuthHeaders()\n }\n\n ConnectionManager.addConnectionInstance(connection, {\n ...connection,\n authHeaders: authHeaders || {},\n params\n })\n\n ConnectionManager.logger.info(`http-connector connection(${connection.name}:${connection.endpoint}) is connected`)\n }\n\n async disconnect(connection) {\n ConnectionManager.removeConnectionInstance(connection)\n\n ConnectionManager.logger.info(`http-connector connection(${connection.name}) is disconnected`)\n }\n\n get parameterSpec() {\n return [\n {\n type: 'entity-selector',\n name: 'authClient',\n label: 'auth-client',\n property: {\n queryName: 'oauth2Clients'\n }\n },\n {\n type: 'select',\n name: 'rejectUnauthorized',\n label: 'reject-unauthorized',\n property: {\n options: ['Y', 'N']\n }\n }\n ]\n }\n\n get taskPrefixes() {\n return ['http']\n }\n}\n\nConnectionManager.registerConnector('http-connector', new HttpConnector())\n"]}
1
+ {"version":3,"file":"http-connector.js","sourceRoot":"","sources":["../../../server/engine/connector/http-connector.ts"],"names":[],"mappings":";;;AAAA,iEAA4D;AAC5D,iDAAqD;AAErD,8DAAyD;AAGzD,MAAa,aAAa;IACxB,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,sCAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAA;IACvE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAU;QACtB,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAAA;QAC3B,MAAM,CAAC,kBAAkB,GAAG,CAAC,MAAM,CAAC,kBAAkB,IAAI,GAAG,CAAC,KAAK,GAAG,CAAA;QAEtE,IAAI,MAAM,CAAC,UAAU,EAAE;YACrB,MAAM,YAAY,GAAiB,MAAM,IAAA,qBAAa,EAAC,4BAAY,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAA;YACzG,IAAI,WAAW,GAAG,YAAY,CAAC,cAAc,EAAE,CAAA;SAChD;QAED,sCAAiB,CAAC,qBAAqB,CAAC,UAAU,kCAC7C,UAAU,KACb,WAAW,EAAE,WAAW,IAAI,EAAE,EAC9B,MAAM,IACN,CAAA;QAEF,sCAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,QAAQ,gBAAgB,CAAC,CAAA;IACpH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAU;QACzB,sCAAiB,CAAC,wBAAwB,CAAC,UAAU,CAAC,CAAA;QAEtD,sCAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,UAAU,CAAC,IAAI,mBAAmB,CAAC,CAAA;IAChG,CAAC;IAED,IAAI,aAAa;QACf,OAAO;YACL;gBACE,IAAI,EAAE,iBAAiB;gBACvB,IAAI,EAAE,YAAY;gBAClB,KAAK,EAAE,aAAa;gBACpB,QAAQ,EAAE;oBACR,SAAS,EAAE,eAAe;iBAC3B;aACF;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,oBAAoB;gBAC1B,KAAK,EAAE,qBAAqB;gBAC5B,QAAQ,EAAE;oBACR,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;iBACpB;aACF;SACF,CAAA;IACH,CAAC;IAED,IAAI,YAAY;QACd,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAC7B,CAAC;CACF;AAvDD,sCAuDC;AAED,sCAAiB,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,IAAI,aAAa,EAAE,CAAC,CAAA","sourcesContent":["import { Oauth2Client } from '@things-factory/oauth2-client'\nimport { getRepository } from '@things-factory/shell'\n\nimport { ConnectionManager } from '../connection-manager'\nimport { Connector } from '../types'\n\nexport class HttpConnector implements Connector {\n async ready(connectionConfigs) {\n await Promise.all(connectionConfigs.map(this.connect.bind(this)))\n\n ConnectionManager.logger.info('http-connector connections are ready')\n }\n\n async connect(connection) {\n var { params } = connection\n params.rejectUnauthorized = (params.rejectUnauthorized || 'Y') === 'Y'\n\n if (params.authClient) {\n const oauth2Client: Oauth2Client = await getRepository(Oauth2Client).findOneBy({ id: params.authClient })\n var authHeaders = oauth2Client.getAuthHeaders()\n }\n\n ConnectionManager.addConnectionInstance(connection, {\n ...connection,\n authHeaders: authHeaders || {},\n params\n })\n\n ConnectionManager.logger.info(`http-connector connection(${connection.name}:${connection.endpoint}) is connected`)\n }\n\n async disconnect(connection) {\n ConnectionManager.removeConnectionInstance(connection)\n\n ConnectionManager.logger.info(`http-connector connection(${connection.name}) is disconnected`)\n }\n\n get parameterSpec() {\n return [\n {\n type: 'entity-selector',\n name: 'authClient',\n label: 'auth-client',\n property: {\n queryName: 'oauth2Clients'\n }\n },\n {\n type: 'select',\n name: 'rejectUnauthorized',\n label: 'reject-unauthorized',\n property: {\n options: ['Y', 'N']\n }\n }\n ]\n }\n\n get taskPrefixes() {\n return ['http', 'headless']\n }\n}\n\nConnectionManager.registerConnector('http-connector', new HttpConnector())\n"]}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("@things-factory/utils");
4
+ const task_registry_1 = require("../task-registry");
5
+ function mapping(rule, input) {
6
+ if (Array.isArray(input)) {
7
+ return input.map(i => mapping(rule, i));
8
+ }
9
+ return Object.keys(rule).reduce((sum, key) => {
10
+ sum[key] = input[rule[key]];
11
+ return sum;
12
+ }, {});
13
+ }
14
+ async function DataMapper(step, { logger, data }) {
15
+ var { params: { accessor, mappingRule } } = step;
16
+ const input = (0, utils_1.access)(accessor, data);
17
+ const output = mapping(mappingRule || {}, input);
18
+ return {
19
+ data: output
20
+ };
21
+ }
22
+ DataMapper.parameterSpec = [
23
+ {
24
+ type: 'scenario-step-input',
25
+ name: 'accessor',
26
+ label: 'accessor'
27
+ },
28
+ {
29
+ type: 'key-values',
30
+ name: 'mappingRule',
31
+ label: 'mapping-rule'
32
+ }
33
+ ];
34
+ DataMapper.connectorFree = true;
35
+ DataMapper.help = 'integration/task/data-mapper';
36
+ task_registry_1.TaskRegistry.registerTaskHandler('data-mapper', DataMapper);
37
+ //# sourceMappingURL=data-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-mapper.js","sourceRoot":"","sources":["../../../server/engine/task/data-mapper.ts"],"names":[],"mappings":";;AAAA,iDAA8C;AAC9C,oDAA+C;AAE/C,SAAS,OAAO,CAAC,IAAI,EAAE,KAAK;IAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACxB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;KACxC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC3C,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAC3B,OAAO,GAAG,CAAA;IACZ,CAAC,EAAE,EAAS,CAAC,CAAA;AACf,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;IAC9C,IAAI,EACF,MAAM,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,EAClC,GAAG,IAAI,CAAA;IAER,MAAM,KAAK,GAAG,IAAA,cAAM,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IACpC,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,EAAE,KAAK,CAAC,CAAA;IAEhD,OAAO;QACL,IAAI,EAAE,MAAM;KACb,CAAA;AACH,CAAC;AAED,UAAU,CAAC,aAAa,GAAG;IACzB;QACE,IAAI,EAAE,qBAAqB;QAC3B,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,cAAc;KACtB;CACF,CAAA;AAED,UAAU,CAAC,aAAa,GAAG,IAAI,CAAA;AAC/B,UAAU,CAAC,IAAI,GAAG,8BAA8B,CAAA;AAEhD,4BAAY,CAAC,mBAAmB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAA","sourcesContent":["import { access } from '@things-factory/utils'\nimport { TaskRegistry } from '../task-registry'\n\nfunction mapping(rule, input) {\n if (Array.isArray(input)) {\n return input.map(i => mapping(rule, i))\n }\n\n return Object.keys(rule).reduce((sum, key) => {\n sum[key] = input[rule[key]]\n return sum\n }, {} as any)\n}\n\nasync function DataMapper(step, { logger, data }) {\n var {\n params: { accessor, mappingRule }\n } = step\n\n const input = access(accessor, data)\n const output = mapping(mappingRule || {}, input)\n\n return {\n data: output\n }\n}\n\nDataMapper.parameterSpec = [\n {\n type: 'scenario-step-input',\n name: 'accessor',\n label: 'accessor'\n },\n {\n type: 'key-values',\n name: 'mappingRule',\n label: 'mapping-rule'\n }\n]\n\nDataMapper.connectorFree = true\nDataMapper.help = 'integration/task/data-mapper'\n\nTaskRegistry.registerTaskHandler('data-mapper', DataMapper)\n"]}
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const https_1 = tslib_1.__importDefault(require("https"));
5
+ const url_1 = require("url");
6
+ const utils_1 = require("@things-factory/utils");
7
+ const task_registry_1 = require("../task-registry");
8
+ const connection_manager_1 = require("../connection-manager");
9
+ const headless_pool_for_scenario_1 = require("./utils/headless-pool-for-scenario");
10
+ async function HeadlessPost(step, { logger, data, domain }) {
11
+ var { connection: connectionName, params: stepOptions } = step;
12
+ var { headers: requestHeaders, contentType, path, accessor } = stepOptions || {};
13
+ var connection = connection_manager_1.ConnectionManager.getConnectionInstanceByName(domain, connectionName);
14
+ if (!connection) {
15
+ throw new Error(`connection '${connectionName}' is not established.`);
16
+ }
17
+ var { endpoint, params: connectionParams, authHeaders = {} } = connection;
18
+ var headers = Object.assign(Object.assign({}, authHeaders), requestHeaders);
19
+ var body = (0, utils_1.access)(accessor, data);
20
+ if (contentType && body) {
21
+ headers['content-type'] = contentType;
22
+ switch (contentType) {
23
+ case 'text/plain':
24
+ body = JSON.stringify(body);
25
+ break;
26
+ case 'application/json':
27
+ body = JSON.stringify(body);
28
+ break;
29
+ case 'application/x-www-form-urlencoded':
30
+ const searchParams = new URLSearchParams();
31
+ for (const prop in body) {
32
+ searchParams.set(prop, body[prop]);
33
+ }
34
+ body = searchParams;
35
+ break;
36
+ }
37
+ }
38
+ var options = {
39
+ method: 'POST',
40
+ headers,
41
+ body
42
+ };
43
+ var { rejectUnauthorized } = connectionParams;
44
+ if (!rejectUnauthorized) {
45
+ const httpsAgent = new https_1.default.Agent({
46
+ rejectUnauthorized
47
+ });
48
+ options.agent = httpsAgent;
49
+ }
50
+ const browser = (await (0, headless_pool_for_scenario_1.getHeadlessPool)().acquire());
51
+ const page = await browser.newPage();
52
+ try {
53
+ page.on('console', msg => {
54
+ console.log(`[browser ${msg.type()}] ${msg.text()}`);
55
+ for (let i = 0; i < msg.args().length; ++i)
56
+ console.log(`${i}: ${msg.args()[i]}`);
57
+ });
58
+ await page.goto(endpoint, { waitUntil: 'networkidle2' });
59
+ const response = await page.evaluate(async (urlString, options) => {
60
+ const response = await fetch(urlString, options);
61
+ if (response.ok && response.headers.get('content-type').includes('application/json')) {
62
+ return await response.json();
63
+ }
64
+ else {
65
+ return await response.text();
66
+ }
67
+ }, new url_1.URL(path, endpoint), options);
68
+ return {
69
+ data: response
70
+ };
71
+ }
72
+ catch (e) {
73
+ console.error(e);
74
+ }
75
+ finally {
76
+ page.close();
77
+ (0, headless_pool_for_scenario_1.getHeadlessPool)().release(browser);
78
+ }
79
+ }
80
+ HeadlessPost.parameterSpec = [
81
+ {
82
+ type: 'string',
83
+ name: 'path',
84
+ label: 'path'
85
+ },
86
+ {
87
+ type: 'http-headers',
88
+ name: 'headers',
89
+ label: 'headers'
90
+ },
91
+ {
92
+ type: 'select',
93
+ name: 'contentType',
94
+ label: 'content-type',
95
+ property: {
96
+ options: [
97
+ {
98
+ display: '',
99
+ value: ''
100
+ },
101
+ {
102
+ display: 'application/json',
103
+ value: 'application/json'
104
+ },
105
+ {
106
+ display: 'text/plain',
107
+ value: 'text/plain'
108
+ },
109
+ {
110
+ display: 'application/x-www-form-urlencoded',
111
+ value: 'application/x-www-form-urlencoded'
112
+ }
113
+ ]
114
+ }
115
+ },
116
+ {
117
+ type: 'scenario-step-input',
118
+ name: 'accessor',
119
+ label: 'accessor'
120
+ }
121
+ ];
122
+ task_registry_1.TaskRegistry.registerTaskHandler('headless-post', HeadlessPost);
123
+ //# sourceMappingURL=headless-post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headless-post.js","sourceRoot":"","sources":["../../../server/engine/task/headless-post.ts"],"names":[],"mappings":"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","sourcesContent":["import https from 'https'\nimport { URL } from 'url'\n\nimport { access } from '@things-factory/utils'\nimport { TaskRegistry } from '../task-registry'\nimport { ConnectionManager } from '../connection-manager'\n\nimport { getHeadlessPool } from './utils/headless-pool-for-scenario'\n\nasync function HeadlessPost(step, { logger, data, domain }) {\n var { connection: connectionName, params: stepOptions } = step\n var { headers: requestHeaders, contentType, path, accessor } = stepOptions || {}\n\n var connection = ConnectionManager.getConnectionInstanceByName(domain, connectionName)\n\n if (!connection) {\n throw new Error(`connection '${connectionName}' is not established.`)\n }\n\n var { endpoint, params: connectionParams, authHeaders = {} } = connection\n\n var headers = {\n ...authHeaders,\n ...requestHeaders\n }\n\n var body = access(accessor, data)\n if (contentType && body) {\n headers['content-type'] = contentType\n switch (contentType) {\n case 'text/plain':\n body = JSON.stringify(body)\n break\n case 'application/json':\n body = JSON.stringify(body)\n break\n case 'application/x-www-form-urlencoded':\n const searchParams = new URLSearchParams()\n for (const prop in body) {\n searchParams.set(prop, body[prop])\n }\n body = searchParams\n break\n }\n }\n\n var options: any = {\n method: 'POST',\n headers,\n body\n }\n\n var { rejectUnauthorized } = connectionParams\n\n if (!rejectUnauthorized) {\n const httpsAgent = new https.Agent({\n rejectUnauthorized\n })\n options.agent = httpsAgent\n }\n\n const browser = (await getHeadlessPool().acquire()) as any\n const page = await browser.newPage()\n\n try {\n page.on('console', msg => {\n console.log(`[browser ${msg.type()}] ${msg.text()}`)\n for (let i = 0; i < msg.args().length; ++i) console.log(`${i}: ${msg.args()[i]}`)\n })\n\n await page.goto(endpoint, { waitUntil: 'networkidle2' })\n\n const response = await page.evaluate(\n async (urlString, options) => {\n const response = await fetch(urlString, options)\n\n if (response.ok && response.headers.get('content-type').includes('application/json')) {\n return await response.json()\n } else {\n return await response.text()\n }\n },\n new URL(path, endpoint),\n options\n )\n\n return {\n data: response\n }\n } catch (e) {\n console.error(e)\n } finally {\n page.close()\n getHeadlessPool().release(browser)\n }\n}\n\nHeadlessPost.parameterSpec = [\n {\n type: 'string',\n name: 'path',\n label: 'path'\n },\n {\n type: 'http-headers',\n name: 'headers',\n label: 'headers'\n },\n {\n type: 'select',\n name: 'contentType',\n label: 'content-type',\n property: {\n options: [\n {\n display: '',\n value: ''\n },\n {\n display: 'application/json',\n value: 'application/json'\n },\n {\n display: 'text/plain',\n value: 'text/plain'\n },\n {\n display: 'application/x-www-form-urlencoded',\n value: 'application/x-www-form-urlencoded'\n }\n ]\n }\n },\n {\n type: 'scenario-step-input',\n name: 'accessor',\n label: 'accessor'\n }\n]\n\nTaskRegistry.registerTaskHandler('headless-post', HeadlessPost)\n"]}
@@ -49,13 +49,10 @@ async function HttpPost(step, { logger, data, domain }) {
49
49
  fetchOptions.agent = httpsAgent;
50
50
  }
51
51
  var response = await (0, node_fetch_1.default)(url, fetchOptions);
52
- var responseData = await response.text();
53
- const responseContentType = response.headers.get('content-type');
54
- if (responseContentType && responseContentType.indexOf('application/json') !== -1) {
55
- responseData = JSON.stringify(responseData);
56
- }
57
52
  return {
58
- data: responseData
53
+ data: response.ok && response.headers.get('content-type').includes('application/json')
54
+ ? await response.json()
55
+ : await response.text()
59
56
  };
60
57
  }
61
58
  HttpPost.parameterSpec = [
@@ -1 +1 @@
1
- {"version":3,"file":"http-post.js","sourceRoot":"","sources":["../../../server/engine/task/http-post.ts"],"names":[],"mappings":"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","sourcesContent":["import fetch from 'node-fetch'\nimport { URL } from 'url'\nimport { access } from '@things-factory/utils'\nimport { TaskRegistry } from '../task-registry'\nimport { ConnectionManager } from '../connection-manager'\nimport https from 'https'\n\nasync function HttpPost(step, { logger, data, domain }) {\n var { connection: connectionName, params: stepOptions } = step\n var { headers: requestHeaders, contentType, path, accessor } = stepOptions || {}\n\n var connection = ConnectionManager.getConnectionInstanceByName(domain, connectionName)\n\n if (!connection) {\n throw new Error(`connection '${connectionName}' is not established.`)\n }\n\n var { endpoint, params: connectionParams, authHeaders = {} } = connection\n\n var url = new URL(path, endpoint)\n\n var headers = {\n ...authHeaders,\n ...requestHeaders\n }\n\n var body = access(accessor, data)\n if (contentType && body) {\n headers['content-type'] = contentType\n switch (contentType) {\n case 'text/plain':\n body = JSON.stringify(body)\n break\n case 'application/json':\n body = JSON.stringify(body)\n break\n case 'application/x-www-form-urlencoded':\n const searchParams = new URLSearchParams()\n for (const prop in body) {\n searchParams.set(prop, body[prop])\n }\n body = searchParams\n break\n }\n }\n\n var fetchOptions: any = {\n method: 'POST',\n headers,\n body\n }\n\n var { rejectUnauthorized } = connectionParams\n\n if (!rejectUnauthorized) {\n const httpsAgent = new https.Agent({\n rejectUnauthorized\n })\n fetchOptions.agent = httpsAgent\n }\n\n var response = await fetch(url, fetchOptions)\n\n var responseData = await response.text()\n\n const responseContentType = response.headers.get('content-type')\n if (responseContentType && responseContentType.indexOf('application/json') !== -1) {\n responseData = JSON.stringify(responseData)\n }\n\n return {\n data: responseData\n }\n}\n\nHttpPost.parameterSpec = [\n {\n type: 'string',\n name: 'path',\n label: 'path'\n },\n {\n type: 'http-headers',\n name: 'headers',\n label: 'headers'\n },\n {\n type: 'select',\n name: 'contentType',\n label: 'content-type',\n property: {\n options: [\n {\n display: '',\n value: ''\n },\n {\n display: 'application/json',\n value: 'application/json'\n },\n {\n display: 'text/plain',\n value: 'text/plain'\n },\n {\n display: 'application/x-www-form-urlencoded',\n value: 'application/x-www-form-urlencoded'\n }\n ]\n }\n },\n {\n type: 'scenario-step-input',\n name: 'accessor',\n label: 'accessor'\n }\n]\n\nTaskRegistry.registerTaskHandler('http-post', HttpPost)\n"]}
1
+ {"version":3,"file":"http-post.js","sourceRoot":"","sources":["../../../server/engine/task/http-post.ts"],"names":[],"mappings":"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","sourcesContent":["import fetch from 'node-fetch'\nimport { URL } from 'url'\nimport { access } from '@things-factory/utils'\nimport { TaskRegistry } from '../task-registry'\nimport { ConnectionManager } from '../connection-manager'\nimport https from 'https'\n\nasync function HttpPost(step, { logger, data, domain }) {\n var { connection: connectionName, params: stepOptions } = step\n var { headers: requestHeaders, contentType, path, accessor } = stepOptions || {}\n\n var connection = ConnectionManager.getConnectionInstanceByName(domain, connectionName)\n\n if (!connection) {\n throw new Error(`connection '${connectionName}' is not established.`)\n }\n\n var { endpoint, params: connectionParams, authHeaders = {} } = connection\n\n var url = new URL(path, endpoint)\n\n var headers = {\n ...authHeaders,\n ...requestHeaders\n }\n\n var body = access(accessor, data)\n if (contentType && body) {\n headers['content-type'] = contentType\n switch (contentType) {\n case 'text/plain':\n body = JSON.stringify(body)\n break\n case 'application/json':\n body = JSON.stringify(body)\n break\n case 'application/x-www-form-urlencoded':\n const searchParams = new URLSearchParams()\n for (const prop in body) {\n searchParams.set(prop, body[prop])\n }\n body = searchParams\n break\n }\n }\n\n var fetchOptions: any = {\n method: 'POST',\n headers,\n body\n }\n\n var { rejectUnauthorized } = connectionParams\n\n if (!rejectUnauthorized) {\n const httpsAgent = new https.Agent({\n rejectUnauthorized\n })\n fetchOptions.agent = httpsAgent\n }\n\n var response = await fetch(url, fetchOptions)\n\n return {\n data:\n response.ok && response.headers.get('content-type').includes('application/json')\n ? await response.json()\n : await response.text()\n }\n}\n\nHttpPost.parameterSpec = [\n {\n type: 'string',\n name: 'path',\n label: 'path'\n },\n {\n type: 'http-headers',\n name: 'headers',\n label: 'headers'\n },\n {\n type: 'select',\n name: 'contentType',\n label: 'content-type',\n property: {\n options: [\n {\n display: '',\n value: ''\n },\n {\n display: 'application/json',\n value: 'application/json'\n },\n {\n display: 'text/plain',\n value: 'text/plain'\n },\n {\n display: 'application/x-www-form-urlencoded',\n value: 'application/x-www-form-urlencoded'\n }\n ]\n }\n },\n {\n type: 'scenario-step-input',\n name: 'accessor',\n label: 'accessor'\n }\n]\n\nTaskRegistry.registerTaskHandler('http-post', HttpPost)\n"]}
@@ -34,4 +34,6 @@ require("./floating-point");
34
34
  require("./socket-listener");
35
35
  require("./random");
36
36
  require("./csv-readline");
37
+ require("./data-mapper");
38
+ require("./headless-post");
37
39
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/engine/task/index.ts"],"names":[],"mappings":";;AAAA,uBAAoB;AACpB,0BAAuB;AACvB,mBAAgB;AAChB,iBAAc;AACd,qBAAkB;AAClB,sBAAmB;AACnB,uBAAoB;AACpB,2BAAwB;AACxB,4BAAyB;AACzB,iCAA8B;AAC9B,kCAA+B;AAC/B,0BAAuB;AACvB,8BAA2B;AAC3B,mCAAgC;AAChC,iCAA8B;AAC9B,yBAAsB;AACtB,kBAAe;AACf,iBAAc;AACd,yBAAsB;AACtB,+BAA4B;AAC5B,6BAA0B;AAC1B,mCAAgC;AAChC,wBAAqB;AACrB,8BAA2B;AAC3B,oBAAiB;AACjB,4BAAyB;AACzB,4BAAyB;AACzB,0BAAuB;AACvB,mBAAgB;AAChB,uBAAoB;AACpB,4BAAyB;AACzB,6BAA0B;AAC1B,oBAAiB;AACjB,0BAAuB","sourcesContent":["import './echo-send'\nimport './echo-receive'\nimport './sleep'\nimport './log'\nimport './publish'\nimport './http-get'\nimport './http-post'\nimport './graphql-query'\nimport './graphql-mutate'\nimport './local-graphql-query'\nimport './local-graphql-mutate'\nimport './sub-scenario'\nimport './book-up-scenario'\nimport './pick-pending-scenario'\nimport './reset-pending-queue'\nimport './empty-check'\nimport './goto'\nimport './end'\nimport './switch-goto'\nimport './switch-range-goto'\nimport './switch-scenario'\nimport './switch-range-scenario'\nimport './switch-set'\nimport './switch-range-set'\nimport './script'\nimport './database-query'\nimport './mqtt-subscribe'\nimport './mqtt-publish'\nimport './throw'\nimport './variables'\nimport './floating-point'\nimport './socket-listener'\nimport './random'\nimport './csv-readline'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/engine/task/index.ts"],"names":[],"mappings":";;AAAA,uBAAoB;AACpB,0BAAuB;AACvB,mBAAgB;AAChB,iBAAc;AACd,qBAAkB;AAClB,sBAAmB;AACnB,uBAAoB;AACpB,2BAAwB;AACxB,4BAAyB;AACzB,iCAA8B;AAC9B,kCAA+B;AAC/B,0BAAuB;AACvB,8BAA2B;AAC3B,mCAAgC;AAChC,iCAA8B;AAC9B,yBAAsB;AACtB,kBAAe;AACf,iBAAc;AACd,yBAAsB;AACtB,+BAA4B;AAC5B,6BAA0B;AAC1B,mCAAgC;AAChC,wBAAqB;AACrB,8BAA2B;AAC3B,oBAAiB;AACjB,4BAAyB;AACzB,4BAAyB;AACzB,0BAAuB;AACvB,mBAAgB;AAChB,uBAAoB;AACpB,4BAAyB;AACzB,6BAA0B;AAC1B,oBAAiB;AACjB,0BAAuB;AACvB,yBAAsB;AACtB,2BAAwB","sourcesContent":["import './echo-send'\nimport './echo-receive'\nimport './sleep'\nimport './log'\nimport './publish'\nimport './http-get'\nimport './http-post'\nimport './graphql-query'\nimport './graphql-mutate'\nimport './local-graphql-query'\nimport './local-graphql-mutate'\nimport './sub-scenario'\nimport './book-up-scenario'\nimport './pick-pending-scenario'\nimport './reset-pending-queue'\nimport './empty-check'\nimport './goto'\nimport './end'\nimport './switch-goto'\nimport './switch-range-goto'\nimport './switch-scenario'\nimport './switch-range-scenario'\nimport './switch-set'\nimport './switch-range-set'\nimport './script'\nimport './database-query'\nimport './mqtt-subscribe'\nimport './mqtt-publish'\nimport './throw'\nimport './variables'\nimport './floating-point'\nimport './socket-listener'\nimport './random'\nimport './csv-readline'\nimport './data-mapper'\nimport './headless-post'\n"]}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("@things-factory/utils");
4
+ const task_registry_1 = require("../task-registry");
5
+ function map(rule, input) {
6
+ if (Array.isArray(input)) {
7
+ return input.map(i => map(rule, i));
8
+ }
9
+ return Object.keys(rule).reduce((sum, key) => {
10
+ sum[key] = input[rule[key]];
11
+ return sum;
12
+ }, {});
13
+ }
14
+ async function MapData(step, { logger, data }) {
15
+ var { params: { accessor, mappingRule } } = step;
16
+ const input = (0, utils_1.access)(accessor, data);
17
+ const output = map(mappingRule || {}, input);
18
+ return {
19
+ data: output
20
+ };
21
+ }
22
+ MapData.parameterSpec = [
23
+ {
24
+ type: 'scenario-step-input',
25
+ name: 'accessor',
26
+ label: 'accessor'
27
+ },
28
+ {
29
+ type: 'key-values',
30
+ name: 'mappingRule',
31
+ label: 'mapping-rule'
32
+ }
33
+ ];
34
+ MapData.connectorFree = true;
35
+ MapData.help = 'integration/task/map-data';
36
+ task_registry_1.TaskRegistry.registerTaskHandler('map-data', MapData);
37
+ //# sourceMappingURL=map-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-data.js","sourceRoot":"","sources":["../../../server/engine/task/map-data.ts"],"names":[],"mappings":";;AAAA,iDAA8C;AAC9C,oDAA+C;AAE/C,SAAS,GAAG,CAAC,IAAI,EAAE,KAAK;IACtB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACxB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;KACpC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC3C,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAC3B,OAAO,GAAG,CAAA;IACZ,CAAC,EAAE,EAAS,CAAC,CAAA;AACf,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;IAC3C,IAAI,EACF,MAAM,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,EAClC,GAAG,IAAI,CAAA;IAER,MAAM,KAAK,GAAG,IAAA,cAAM,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IACpC,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE,EAAE,KAAK,CAAC,CAAA;IAE5C,OAAO;QACL,IAAI,EAAE,MAAM;KACb,CAAA;AACH,CAAC;AAED,OAAO,CAAC,aAAa,GAAG;IACtB;QACE,IAAI,EAAE,qBAAqB;QAC3B,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,cAAc;KACtB;CACF,CAAA;AAED,OAAO,CAAC,aAAa,GAAG,IAAI,CAAA;AAC5B,OAAO,CAAC,IAAI,GAAG,2BAA2B,CAAA;AAE1C,4BAAY,CAAC,mBAAmB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA","sourcesContent":["import { access } from '@things-factory/utils'\nimport { TaskRegistry } from '../task-registry'\n\nfunction map(rule, input) {\n if (Array.isArray(input)) {\n return input.map(i => map(rule, i))\n }\n\n return Object.keys(rule).reduce((sum, key) => {\n sum[key] = input[rule[key]]\n return sum\n }, {} as any)\n}\n\nasync function MapData(step, { logger, data }) {\n var {\n params: { accessor, mappingRule }\n } = step\n\n const input = access(accessor, data)\n const output = map(mappingRule || {}, input)\n\n return {\n data: output\n }\n}\n\nMapData.parameterSpec = [\n {\n type: 'scenario-step-input',\n name: 'accessor',\n label: 'accessor'\n },\n {\n type: 'key-values',\n name: 'mappingRule',\n label: 'mapping-rule'\n }\n]\n\nMapData.connectorFree = true\nMapData.help = 'integration/task/map-data'\n\nTaskRegistry.registerTaskHandler('map-data', MapData)\n"]}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getHeadlessPool = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const genericPool = tslib_1.__importStar(require("generic-pool"));
6
+ const env_1 = require("@things-factory/env");
7
+ try {
8
+ var puppeteer = require('puppeteer');
9
+ }
10
+ catch (err) {
11
+ env_1.logger.error(err);
12
+ }
13
+ var headlessPool;
14
+ function getHeadlessPool() {
15
+ if (!headlessPool) {
16
+ headlessPool = genericPool.createPool({
17
+ create() {
18
+ console.log('headless-pool-for-scensrio about to create');
19
+ return initializeChromium();
20
+ },
21
+ validate(browser) {
22
+ return Promise.race([
23
+ new Promise(res => setTimeout(() => res(false), 1500)),
24
+ browser
25
+ //@ts-ignore
26
+ .version()
27
+ .then(_ => true)
28
+ .catch(_ => false)
29
+ ]);
30
+ },
31
+ destroy(browser) {
32
+ //@ts-ignore
33
+ return browser.close();
34
+ }
35
+ }, {
36
+ min: 2,
37
+ max: 10,
38
+ testOnBorrow: true,
39
+ acquireTimeoutMillis: 15000
40
+ });
41
+ }
42
+ return headlessPool;
43
+ }
44
+ exports.getHeadlessPool = getHeadlessPool;
45
+ const CHROMIUM_PATH = env_1.config.get('CHROMIUM_PATH');
46
+ async function initializeChromium() {
47
+ try {
48
+ if (!puppeteer) {
49
+ return;
50
+ }
51
+ var launchSetting = {
52
+ args: ['--mute-audio', '--no-sandbox'],
53
+ headless: 'new'
54
+ };
55
+ if (CHROMIUM_PATH) {
56
+ launchSetting['executablePath'] = CHROMIUM_PATH;
57
+ }
58
+ const browser = await puppeteer.launch(launchSetting);
59
+ return browser;
60
+ }
61
+ catch (err) {
62
+ env_1.logger.error(err);
63
+ }
64
+ }
65
+ //# sourceMappingURL=headless-pool-for-scenario.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headless-pool-for-scenario.js","sourceRoot":"","sources":["../../../../server/engine/task/utils/headless-pool-for-scenario.ts"],"names":[],"mappings":";;;;AAAA,kEAA2C;AAE3C,6CAAoD;AAEpD,IAAI;IACF,IAAI,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;CACrC;AAAC,OAAO,GAAG,EAAE;IACZ,YAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;CAClB;AAED,IAAI,YAAY,CAAA;AAEhB,SAAgB,eAAe;IAC7B,IAAI,CAAC,YAAY,EAAE;QACjB,YAAY,GAAG,WAAW,CAAC,UAAU,CACnC;YACE,MAAM;gBACJ,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAA;gBACzD,OAAO,kBAAkB,EAAE,CAAA;YAC7B,CAAC;YACD,QAAQ,CAAC,OAAO;gBACd,OAAO,OAAO,CAAC,IAAI,CAAC;oBAClB,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;oBACtD,OAAO;wBACL,YAAY;yBACX,OAAO,EAAE;yBACT,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;yBACf,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;iBACrB,CAAC,CAAA;YACJ,CAAC;YACD,OAAO,CAAC,OAAO;gBACb,YAAY;gBACZ,OAAO,OAAO,CAAC,KAAK,EAAE,CAAA;YACxB,CAAC;SACF,EACD;YACE,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,EAAE;YACP,YAAY,EAAE,IAAI;YAClB,oBAAoB,EAAE,KAAK;SAC5B,CACF,CAAA;KACF;IAED,OAAO,YAAY,CAAA;AACrB,CAAC;AAjCD,0CAiCC;AAED,MAAM,aAAa,GAAG,YAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;AAEjD,KAAK,UAAU,kBAAkB;IAC/B,IAAI;QACF,IAAI,CAAC,SAAS,EAAE;YACd,OAAM;SACP;QAED,IAAI,aAAa,GAAG;YAClB,IAAI,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC;YACtC,QAAQ,EAAE,KAAK;SAChB,CAAA;QAED,IAAI,aAAa,EAAE;YACjB,aAAa,CAAC,gBAAgB,CAAC,GAAG,aAAa,CAAA;SAChD;QAED,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;QAErD,OAAO,OAAO,CAAA;KACf;IAAC,OAAO,GAAG,EAAE;QACZ,YAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;KAClB;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\nvar headlessPool\n\nexport function getHeadlessPool() {\n if (!headlessPool) {\n headlessPool = genericPool.createPool(\n {\n create() {\n console.log('headless-pool-for-scensrio 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 },\n {\n min: 2,\n max: 10,\n testOnBorrow: true,\n acquireTimeoutMillis: 15000\n }\n )\n }\n\n return headlessPool\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: ['--mute-audio', '--no-sandbox'],\n headless: 'new'\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"]}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getHeadlessPool = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const genericPool = tslib_1.__importStar(require("generic-pool"));
6
+ const env_1 = require("@things-factory/env");
7
+ try {
8
+ var puppeteer = require('puppeteer');
9
+ }
10
+ catch (err) {
11
+ env_1.logger.error(err);
12
+ }
13
+ var headlessPool;
14
+ function getHeadlessPool() {
15
+ if (!headlessPool) {
16
+ headlessPool = genericPool.createPool({
17
+ create() {
18
+ console.log('headless-pool-for-scensrio about to create');
19
+ return initializeChromium();
20
+ },
21
+ validate(browser) {
22
+ return Promise.race([
23
+ new Promise(res => setTimeout(() => res(false), 1500)),
24
+ browser
25
+ //@ts-ignore
26
+ .version()
27
+ .then(_ => true)
28
+ .catch(_ => false)
29
+ ]);
30
+ },
31
+ destroy(browser) {
32
+ //@ts-ignore
33
+ return browser.close();
34
+ }
35
+ }, {
36
+ min: 2,
37
+ max: 10,
38
+ testOnBorrow: true,
39
+ acquireTimeoutMillis: 15000
40
+ });
41
+ }
42
+ return headlessPool;
43
+ }
44
+ exports.getHeadlessPool = getHeadlessPool;
45
+ const CHROMIUM_PATH = env_1.config.get('CHROMIUM_PATH');
46
+ async function initializeChromium() {
47
+ try {
48
+ if (!puppeteer) {
49
+ return;
50
+ }
51
+ var launchSetting = {
52
+ args: ['--mute-audio', '--no-sandbox'],
53
+ headless: 'new'
54
+ };
55
+ if (CHROMIUM_PATH) {
56
+ launchSetting['executablePath'] = CHROMIUM_PATH;
57
+ }
58
+ const browser = await puppeteer.launch(launchSetting);
59
+ return browser;
60
+ }
61
+ catch (err) {
62
+ env_1.logger.error(err);
63
+ }
64
+ }
65
+ //# sourceMappingURL=headless-pool-for-task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headless-pool-for-task.js","sourceRoot":"","sources":["../../../../server/engine/task/utils/headless-pool-for-task.ts"],"names":[],"mappings":";;;;AAAA,kEAA2C;AAE3C,6CAAoD;AAEpD,IAAI;IACF,IAAI,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;CACrC;AAAC,OAAO,GAAG,EAAE;IACZ,YAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;CAClB;AAED,IAAI,YAAY,CAAA;AAEhB,SAAgB,eAAe;IAC7B,IAAI,CAAC,YAAY,EAAE;QACjB,YAAY,GAAG,WAAW,CAAC,UAAU,CACnC;YACE,MAAM;gBACJ,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAA;gBACzD,OAAO,kBAAkB,EAAE,CAAA;YAC7B,CAAC;YACD,QAAQ,CAAC,OAAO;gBACd,OAAO,OAAO,CAAC,IAAI,CAAC;oBAClB,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;oBACtD,OAAO;wBACL,YAAY;yBACX,OAAO,EAAE;yBACT,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;yBACf,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;iBACrB,CAAC,CAAA;YACJ,CAAC;YACD,OAAO,CAAC,OAAO;gBACb,YAAY;gBACZ,OAAO,OAAO,CAAC,KAAK,EAAE,CAAA;YACxB,CAAC;SACF,EACD;YACE,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,EAAE;YACP,YAAY,EAAE,IAAI;YAClB,oBAAoB,EAAE,KAAK;SAC5B,CACF,CAAA;KACF;IAED,OAAO,YAAY,CAAA;AACrB,CAAC;AAjCD,0CAiCC;AAED,MAAM,aAAa,GAAG,YAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;AAEjD,KAAK,UAAU,kBAAkB;IAC/B,IAAI;QACF,IAAI,CAAC,SAAS,EAAE;YACd,OAAM;SACP;QAED,IAAI,aAAa,GAAG;YAClB,IAAI,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC;YACtC,QAAQ,EAAE,KAAK;SAChB,CAAA;QAED,IAAI,aAAa,EAAE;YACjB,aAAa,CAAC,gBAAgB,CAAC,GAAG,aAAa,CAAA;SAChD;QAED,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;QAErD,OAAO,OAAO,CAAA;KACf;IAAC,OAAO,GAAG,EAAE;QACZ,YAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;KAClB;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\nvar headlessPool\n\nexport function getHeadlessPool() {\n if (!headlessPool) {\n headlessPool = genericPool.createPool(\n {\n create() {\n console.log('headless-pool-for-scensrio 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 },\n {\n min: 2,\n max: 10,\n testOnBorrow: true,\n acquireTimeoutMillis: 15000\n }\n )\n }\n\n return headlessPool\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: ['--mute-audio', '--no-sandbox'],\n headless: 'new'\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"]}