@things-factory/integration-base 9.0.28 → 9.0.32
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/README.md +513 -2
- package/dist-server/engine/task/headless-delete.d.ts +1 -0
- package/dist-server/engine/task/headless-delete.js +95 -0
- package/dist-server/engine/task/headless-delete.js.map +1 -0
- package/dist-server/engine/task/headless-get.d.ts +1 -0
- package/dist-server/engine/task/headless-get.js +96 -0
- package/dist-server/engine/task/headless-get.js.map +1 -0
- package/dist-server/engine/task/headless-patch.d.ts +1 -0
- package/dist-server/engine/task/headless-patch.js +135 -0
- package/dist-server/engine/task/headless-patch.js.map +1 -0
- package/dist-server/engine/task/headless-post.js +27 -4
- package/dist-server/engine/task/headless-post.js.map +1 -1
- package/dist-server/engine/task/headless-put.d.ts +1 -0
- package/dist-server/engine/task/headless-put.js +135 -0
- package/dist-server/engine/task/headless-put.js.map +1 -0
- package/dist-server/engine/task/index.d.ts +4 -0
- package/dist-server/engine/task/index.js +4 -0
- package/dist-server/engine/task/index.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -3
@@ -0,0 +1,96 @@
|
|
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 task_registry_1 = require("../task-registry");
|
7
|
+
const connection_manager_1 = require("../connection-manager");
|
8
|
+
async function HeadlessGet(step, { logger, data, domain }) {
|
9
|
+
const { connection: connectionName, params: stepOptions } = step;
|
10
|
+
const { headers: requestHeaders, path, queryParams } = stepOptions || {};
|
11
|
+
const connection = await connection_manager_1.ConnectionManager.getConnectionInstanceByName(domain, connectionName);
|
12
|
+
if (!connection) {
|
13
|
+
throw new Error(`Connection '${connectionName}' is not established.`);
|
14
|
+
}
|
15
|
+
const { endpoint, params: connectionParams, acquireSessionPage, releasePage } = connection;
|
16
|
+
const headers = {
|
17
|
+
...requestHeaders
|
18
|
+
};
|
19
|
+
const options = {
|
20
|
+
method: 'GET',
|
21
|
+
headers
|
22
|
+
};
|
23
|
+
const { rejectUnauthorized } = connectionParams;
|
24
|
+
if (!rejectUnauthorized) {
|
25
|
+
const httpsAgent = new https_1.default.Agent({
|
26
|
+
rejectUnauthorized
|
27
|
+
});
|
28
|
+
options.agent = httpsAgent;
|
29
|
+
}
|
30
|
+
const page = await acquireSessionPage();
|
31
|
+
try {
|
32
|
+
page.on('console', async (msg) => {
|
33
|
+
console.log(`[browser ${msg.type()}] ${msg.text()}`);
|
34
|
+
});
|
35
|
+
page.on('requestfailed', request => {
|
36
|
+
console.log('Request failed:', request.url());
|
37
|
+
});
|
38
|
+
await page.goto(endpoint, { waitUntil: 'networkidle2' });
|
39
|
+
// URL 구성 - queryParams가 있으면 추가
|
40
|
+
let requestUrl = new url_1.URL(path, endpoint);
|
41
|
+
if (queryParams && typeof queryParams === 'object') {
|
42
|
+
Object.keys(queryParams).forEach(key => {
|
43
|
+
if (queryParams[key] !== null && queryParams[key] !== undefined) {
|
44
|
+
requestUrl.searchParams.append(key, String(queryParams[key]));
|
45
|
+
}
|
46
|
+
});
|
47
|
+
}
|
48
|
+
const response = await page.evaluate(async (urlString, options) => {
|
49
|
+
const response = await fetch(urlString, options);
|
50
|
+
if (!response.ok) {
|
51
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
52
|
+
}
|
53
|
+
const contentType = response.headers.get('content-type') || '';
|
54
|
+
if (contentType.includes('application/json')) {
|
55
|
+
return await response.json();
|
56
|
+
}
|
57
|
+
else if (contentType.includes('text/')) {
|
58
|
+
return await response.text();
|
59
|
+
}
|
60
|
+
else {
|
61
|
+
// Binary data나 기타 타입의 경우
|
62
|
+
const arrayBuffer = await response.arrayBuffer();
|
63
|
+
return Array.from(new Uint8Array(arrayBuffer));
|
64
|
+
}
|
65
|
+
}, requestUrl.toString(), options);
|
66
|
+
return {
|
67
|
+
data: response
|
68
|
+
};
|
69
|
+
}
|
70
|
+
catch (error) {
|
71
|
+
logger.error('Error in HeadlessGet:', error);
|
72
|
+
throw error;
|
73
|
+
}
|
74
|
+
finally {
|
75
|
+
await releasePage(page);
|
76
|
+
}
|
77
|
+
}
|
78
|
+
HeadlessGet.parameterSpec = [
|
79
|
+
{
|
80
|
+
type: 'string',
|
81
|
+
name: 'path',
|
82
|
+
label: 'path'
|
83
|
+
},
|
84
|
+
{
|
85
|
+
type: 'http-headers',
|
86
|
+
name: 'headers',
|
87
|
+
label: 'headers'
|
88
|
+
},
|
89
|
+
{
|
90
|
+
type: 'options',
|
91
|
+
name: 'queryParams',
|
92
|
+
label: 'query-parameters'
|
93
|
+
}
|
94
|
+
];
|
95
|
+
task_registry_1.TaskRegistry.registerTaskHandler('headless-get', HeadlessGet);
|
96
|
+
//# sourceMappingURL=headless-get.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"headless-get.js","sourceRoot":"","sources":["../../../server/engine/task/headless-get.ts"],"names":[],"mappings":"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","sourcesContent":["import https from 'https'\nimport { URL } from 'url'\n\nimport { TaskRegistry } from '../task-registry'\nimport { ConnectionManager } from '../connection-manager'\n\nasync function HeadlessGet(step, { logger, data, domain }) {\n const { connection: connectionName, params: stepOptions } = step\n const { headers: requestHeaders, path, queryParams } = stepOptions || {}\n\n const connection = await ConnectionManager.getConnectionInstanceByName(domain, connectionName)\n\n if (!connection) {\n throw new Error(`Connection '${connectionName}' is not established.`)\n }\n\n const { endpoint, params: connectionParams, acquireSessionPage, releasePage } = connection\n\n const headers = {\n ...requestHeaders\n }\n\n const options = {\n method: 'GET',\n headers\n } as any\n\n const { rejectUnauthorized } = connectionParams\n\n if (!rejectUnauthorized) {\n const httpsAgent = new https.Agent({\n rejectUnauthorized\n })\n options.agent = httpsAgent\n }\n\n const page = await acquireSessionPage()\n\n try {\n page.on('console', async msg => {\n console.log(`[browser ${msg.type()}] ${msg.text()}`)\n })\n\n page.on('requestfailed', request => {\n console.log('Request failed:', request.url())\n })\n\n await page.goto(endpoint, { waitUntil: 'networkidle2' })\n\n // URL 구성 - queryParams가 있으면 추가\n let requestUrl = new URL(path, endpoint)\n if (queryParams && typeof queryParams === 'object') {\n Object.keys(queryParams).forEach(key => {\n if (queryParams[key] !== null && queryParams[key] !== undefined) {\n requestUrl.searchParams.append(key, String(queryParams[key]))\n }\n })\n }\n\n const response = await page.evaluate(\n async (urlString, options) => {\n const response = await fetch(urlString, options)\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n const contentType = response.headers.get('content-type') || ''\n \n if (contentType.includes('application/json')) {\n return await response.json()\n } else if (contentType.includes('text/')) {\n return await response.text()\n } else {\n // Binary data나 기타 타입의 경우\n const arrayBuffer = await response.arrayBuffer()\n return Array.from(new Uint8Array(arrayBuffer))\n }\n },\n requestUrl.toString(),\n options\n )\n\n return {\n data: response\n }\n } catch (error) {\n logger.error('Error in HeadlessGet:', error)\n throw error\n } finally {\n await releasePage(page)\n }\n}\n\nHeadlessGet.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: 'options',\n name: 'queryParams',\n label: 'query-parameters'\n }\n]\n\nTaskRegistry.registerTaskHandler('headless-get', HeadlessGet)"]}
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,135 @@
|
|
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
|
+
async function HeadlessPatch(step, { logger, data, domain }) {
|
10
|
+
const { connection: connectionName, params: stepOptions } = step;
|
11
|
+
const { headers: requestHeaders, contentType, path, accessor, queryParams } = stepOptions || {};
|
12
|
+
const connection = await connection_manager_1.ConnectionManager.getConnectionInstanceByName(domain, connectionName);
|
13
|
+
if (!connection) {
|
14
|
+
throw new Error(`Connection '${connectionName}' is not established.`);
|
15
|
+
}
|
16
|
+
const { endpoint, params: connectionParams, acquireSessionPage, releasePage } = connection;
|
17
|
+
const headers = {
|
18
|
+
...requestHeaders
|
19
|
+
};
|
20
|
+
let body = (0, utils_1.access)(accessor, data);
|
21
|
+
if (contentType && body) {
|
22
|
+
headers['content-type'] = contentType;
|
23
|
+
switch (contentType) {
|
24
|
+
case 'text/plain':
|
25
|
+
body = JSON.stringify(body);
|
26
|
+
break;
|
27
|
+
case 'application/json':
|
28
|
+
body = JSON.stringify(body);
|
29
|
+
break;
|
30
|
+
case 'application/x-www-form-urlencoded':
|
31
|
+
const searchParams = new URLSearchParams();
|
32
|
+
for (const prop in body) {
|
33
|
+
searchParams.set(prop, body[prop]);
|
34
|
+
}
|
35
|
+
body = searchParams.toString();
|
36
|
+
break;
|
37
|
+
}
|
38
|
+
}
|
39
|
+
const options = {
|
40
|
+
method: 'PATCH',
|
41
|
+
headers,
|
42
|
+
body
|
43
|
+
};
|
44
|
+
const { rejectUnauthorized } = connectionParams;
|
45
|
+
if (!rejectUnauthorized) {
|
46
|
+
const httpsAgent = new https_1.default.Agent({
|
47
|
+
rejectUnauthorized
|
48
|
+
});
|
49
|
+
options.agent = httpsAgent;
|
50
|
+
}
|
51
|
+
const page = await acquireSessionPage();
|
52
|
+
try {
|
53
|
+
page.on('console', async (msg) => {
|
54
|
+
console.log(`[browser ${msg.type()}] ${msg.text()}`);
|
55
|
+
});
|
56
|
+
page.on('requestfailed', request => {
|
57
|
+
console.log('Request failed:', request.url());
|
58
|
+
});
|
59
|
+
await page.goto(endpoint, { waitUntil: 'networkidle2' });
|
60
|
+
// URL 구성 - queryParams가 있으면 추가
|
61
|
+
let requestUrl = new url_1.URL(path, endpoint);
|
62
|
+
if (queryParams && typeof queryParams === 'object') {
|
63
|
+
Object.keys(queryParams).forEach(key => {
|
64
|
+
if (queryParams[key] !== null && queryParams[key] !== undefined) {
|
65
|
+
requestUrl.searchParams.append(key, String(queryParams[key]));
|
66
|
+
}
|
67
|
+
});
|
68
|
+
}
|
69
|
+
const response = await page.evaluate(async (urlString, options) => {
|
70
|
+
const response = await fetch(urlString, options);
|
71
|
+
if (!response.ok) {
|
72
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
73
|
+
}
|
74
|
+
const contentType = response.headers.get('content-type') || '';
|
75
|
+
if (contentType.includes('application/json')) {
|
76
|
+
return await response.json();
|
77
|
+
}
|
78
|
+
else if (contentType.includes('text/')) {
|
79
|
+
return await response.text();
|
80
|
+
}
|
81
|
+
else {
|
82
|
+
// Binary data나 기타 타입의 경우
|
83
|
+
const arrayBuffer = await response.arrayBuffer();
|
84
|
+
return Array.from(new Uint8Array(arrayBuffer));
|
85
|
+
}
|
86
|
+
}, requestUrl.toString(), options);
|
87
|
+
return {
|
88
|
+
data: response
|
89
|
+
};
|
90
|
+
}
|
91
|
+
catch (error) {
|
92
|
+
logger.error('Error in HeadlessPatch:', error);
|
93
|
+
throw error;
|
94
|
+
}
|
95
|
+
finally {
|
96
|
+
await releasePage(page);
|
97
|
+
}
|
98
|
+
}
|
99
|
+
HeadlessPatch.parameterSpec = [
|
100
|
+
{
|
101
|
+
type: 'string',
|
102
|
+
name: 'path',
|
103
|
+
label: 'path'
|
104
|
+
},
|
105
|
+
{
|
106
|
+
type: 'http-headers',
|
107
|
+
name: 'headers',
|
108
|
+
label: 'headers'
|
109
|
+
},
|
110
|
+
{
|
111
|
+
type: 'options',
|
112
|
+
name: 'queryParams',
|
113
|
+
label: 'query-parameters'
|
114
|
+
},
|
115
|
+
{
|
116
|
+
type: 'select',
|
117
|
+
name: 'contentType',
|
118
|
+
label: 'content-type',
|
119
|
+
property: {
|
120
|
+
options: [
|
121
|
+
{ display: '', value: '' },
|
122
|
+
{ display: 'application/json', value: 'application/json' },
|
123
|
+
{ display: 'text/plain', value: 'text/plain' },
|
124
|
+
{ display: 'application/x-www-form-urlencoded', value: 'application/x-www-form-urlencoded' }
|
125
|
+
]
|
126
|
+
}
|
127
|
+
},
|
128
|
+
{
|
129
|
+
type: 'scenario-step-input',
|
130
|
+
name: 'accessor',
|
131
|
+
label: 'accessor'
|
132
|
+
}
|
133
|
+
];
|
134
|
+
task_registry_1.TaskRegistry.registerTaskHandler('headless-patch', HeadlessPatch);
|
135
|
+
//# sourceMappingURL=headless-patch.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"headless-patch.js","sourceRoot":"","sources":["../../../server/engine/task/headless-patch.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\nasync function HeadlessPatch(step, { logger, data, domain }) {\n const { connection: connectionName, params: stepOptions } = step\n const { headers: requestHeaders, contentType, path, accessor, queryParams } = stepOptions || {}\n\n const connection = await ConnectionManager.getConnectionInstanceByName(domain, connectionName)\n\n if (!connection) {\n throw new Error(`Connection '${connectionName}' is not established.`)\n }\n\n const { endpoint, params: connectionParams, acquireSessionPage, releasePage } = connection\n\n const headers = {\n ...requestHeaders\n }\n\n let 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.toString()\n break\n }\n }\n\n const options = {\n method: 'PATCH',\n headers,\n body\n } as any\n\n const { rejectUnauthorized } = connectionParams\n\n if (!rejectUnauthorized) {\n const httpsAgent = new https.Agent({\n rejectUnauthorized\n })\n options.agent = httpsAgent\n }\n\n const page = await acquireSessionPage()\n\n try {\n page.on('console', async msg => {\n console.log(`[browser ${msg.type()}] ${msg.text()}`)\n })\n\n page.on('requestfailed', request => {\n console.log('Request failed:', request.url())\n })\n\n await page.goto(endpoint, { waitUntil: 'networkidle2' })\n\n // URL 구성 - queryParams가 있으면 추가\n let requestUrl = new URL(path, endpoint)\n if (queryParams && typeof queryParams === 'object') {\n Object.keys(queryParams).forEach(key => {\n if (queryParams[key] !== null && queryParams[key] !== undefined) {\n requestUrl.searchParams.append(key, String(queryParams[key]))\n }\n })\n }\n\n const response = await page.evaluate(\n async (urlString, options) => {\n const response = await fetch(urlString, options)\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n const contentType = response.headers.get('content-type') || ''\n \n if (contentType.includes('application/json')) {\n return await response.json()\n } else if (contentType.includes('text/')) {\n return await response.text()\n } else {\n // Binary data나 기타 타입의 경우\n const arrayBuffer = await response.arrayBuffer()\n return Array.from(new Uint8Array(arrayBuffer))\n }\n },\n requestUrl.toString(),\n options\n )\n\n return {\n data: response\n }\n } catch (error) {\n logger.error('Error in HeadlessPatch:', error)\n throw error\n } finally {\n await releasePage(page)\n }\n}\n\nHeadlessPatch.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: 'options',\n name: 'queryParams',\n label: 'query-parameters'\n },\n {\n type: 'select',\n name: 'contentType',\n label: 'content-type',\n property: {\n options: [\n { display: '', value: '' },\n { display: 'application/json', value: 'application/json' },\n { display: 'text/plain', value: 'text/plain' },\n { display: 'application/x-www-form-urlencoded', value: 'application/x-www-form-urlencoded' }\n ]\n }\n },\n {\n type: 'scenario-step-input',\n name: 'accessor',\n label: 'accessor'\n }\n]\n\nTaskRegistry.registerTaskHandler('headless-patch', HeadlessPatch)"]}
|
@@ -8,7 +8,7 @@ const task_registry_1 = require("../task-registry");
|
|
8
8
|
const connection_manager_1 = require("../connection-manager");
|
9
9
|
async function HeadlessPost(step, { logger, data, domain }) {
|
10
10
|
const { connection: connectionName, params: stepOptions } = step;
|
11
|
-
const { headers: requestHeaders, contentType, path, accessor } = stepOptions || {};
|
11
|
+
const { headers: requestHeaders, contentType, path, accessor, queryParams } = stepOptions || {};
|
12
12
|
const connection = await connection_manager_1.ConnectionManager.getConnectionInstanceByName(domain, connectionName);
|
13
13
|
if (!connection) {
|
14
14
|
throw new Error(`Connection '${connectionName}' is not established.`);
|
@@ -57,15 +57,33 @@ async function HeadlessPost(step, { logger, data, domain }) {
|
|
57
57
|
console.log('Request failed:', request.url());
|
58
58
|
});
|
59
59
|
await page.goto(endpoint, { waitUntil: 'networkidle2' });
|
60
|
+
// URL 구성 - queryParams가 있으면 추가
|
61
|
+
let requestUrl = new url_1.URL(path, endpoint);
|
62
|
+
if (queryParams && typeof queryParams === 'object') {
|
63
|
+
Object.keys(queryParams).forEach(key => {
|
64
|
+
if (queryParams[key] !== null && queryParams[key] !== undefined) {
|
65
|
+
requestUrl.searchParams.append(key, String(queryParams[key]));
|
66
|
+
}
|
67
|
+
});
|
68
|
+
}
|
60
69
|
const response = await page.evaluate(async (urlString, options) => {
|
61
70
|
const response = await fetch(urlString, options);
|
62
|
-
if (response.ok
|
71
|
+
if (!response.ok) {
|
72
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
73
|
+
}
|
74
|
+
const contentType = response.headers.get('content-type') || '';
|
75
|
+
if (contentType.includes('application/json')) {
|
63
76
|
return await response.json();
|
64
77
|
}
|
65
|
-
else {
|
78
|
+
else if (contentType.includes('text/')) {
|
66
79
|
return await response.text();
|
67
80
|
}
|
68
|
-
|
81
|
+
else {
|
82
|
+
// Binary data나 기타 타입의 경우
|
83
|
+
const arrayBuffer = await response.arrayBuffer();
|
84
|
+
return Array.from(new Uint8Array(arrayBuffer));
|
85
|
+
}
|
86
|
+
}, requestUrl.toString(), options);
|
69
87
|
return {
|
70
88
|
data: response
|
71
89
|
};
|
@@ -89,6 +107,11 @@ HeadlessPost.parameterSpec = [
|
|
89
107
|
name: 'headers',
|
90
108
|
label: 'headers'
|
91
109
|
},
|
110
|
+
{
|
111
|
+
type: 'options',
|
112
|
+
name: 'queryParams',
|
113
|
+
label: 'query-parameters'
|
114
|
+
},
|
92
115
|
{
|
93
116
|
type: 'select',
|
94
117
|
name: 'contentType',
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"headless-post.js","sourceRoot":"","sources":["../../../server/engine/task/headless-post.ts"],"names":[],"mappings":";;;AAAA,0DAAyB;AACzB,6BAAyB;AAEzB,iDAA8C;AAC9C,oDAA+C;AAC/C,8DAAyD;AAEzD,KAAK,UAAU,YAAY,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;IACxD,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAA;IAChE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,WAAW,IAAI,EAAE,CAAA;
|
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\nasync function HeadlessPost(step, { logger, data, domain }) {\n const { connection: connectionName, params: stepOptions } = step\n const { headers: requestHeaders, contentType, path, accessor, queryParams } = stepOptions || {}\n\n const connection = await ConnectionManager.getConnectionInstanceByName(domain, connectionName)\n\n if (!connection) {\n throw new Error(`Connection '${connectionName}' is not established.`)\n }\n\n const { endpoint, params: connectionParams, acquireSessionPage, releasePage } = connection\n\n const headers = {\n ...requestHeaders\n }\n\n let 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.toString()\n break\n }\n }\n\n const options = {\n method: 'POST',\n headers,\n body\n } as any\n\n const { rejectUnauthorized } = connectionParams\n\n if (!rejectUnauthorized) {\n const httpsAgent = new https.Agent({\n rejectUnauthorized\n })\n options.agent = httpsAgent\n }\n\n const page = await acquireSessionPage()\n\n try {\n page.on('console', async msg => {\n console.log(`[browser ${msg.type()}] ${msg.text()}`)\n })\n\n page.on('requestfailed', request => {\n console.log('Request failed:', request.url())\n })\n\n await page.goto(endpoint, { waitUntil: 'networkidle2' })\n\n // URL 구성 - queryParams가 있으면 추가\n let requestUrl = new URL(path, endpoint)\n if (queryParams && typeof queryParams === 'object') {\n Object.keys(queryParams).forEach(key => {\n if (queryParams[key] !== null && queryParams[key] !== undefined) {\n requestUrl.searchParams.append(key, String(queryParams[key]))\n }\n })\n }\n\n const response = await page.evaluate(\n async (urlString, options) => {\n const response = await fetch(urlString, options)\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n const contentType = response.headers.get('content-type') || ''\n \n if (contentType.includes('application/json')) {\n return await response.json()\n } else if (contentType.includes('text/')) {\n return await response.text()\n } else {\n // Binary data나 기타 타입의 경우\n const arrayBuffer = await response.arrayBuffer()\n return Array.from(new Uint8Array(arrayBuffer))\n }\n },\n requestUrl.toString(),\n options\n )\n\n return {\n data: response\n }\n } catch (error) {\n logger.error('Error in HeadlessPost:', error)\n throw error\n } finally {\n await releasePage(page)\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: 'options',\n name: 'queryParams',\n label: 'query-parameters'\n },\n {\n type: 'select',\n name: 'contentType',\n label: 'content-type',\n property: {\n options: [\n { display: '', value: '' },\n { display: 'application/json', value: 'application/json' },\n { display: 'text/plain', value: 'text/plain' },\n { display: 'application/x-www-form-urlencoded', value: 'application/x-www-form-urlencoded' }\n ]\n }\n },\n {\n type: 'scenario-step-input',\n name: 'accessor',\n label: 'accessor'\n }\n]\n\nTaskRegistry.registerTaskHandler('headless-post', HeadlessPost)\n"]}
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,135 @@
|
|
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
|
+
async function HeadlessPut(step, { logger, data, domain }) {
|
10
|
+
const { connection: connectionName, params: stepOptions } = step;
|
11
|
+
const { headers: requestHeaders, contentType, path, accessor, queryParams } = stepOptions || {};
|
12
|
+
const connection = await connection_manager_1.ConnectionManager.getConnectionInstanceByName(domain, connectionName);
|
13
|
+
if (!connection) {
|
14
|
+
throw new Error(`Connection '${connectionName}' is not established.`);
|
15
|
+
}
|
16
|
+
const { endpoint, params: connectionParams, acquireSessionPage, releasePage } = connection;
|
17
|
+
const headers = {
|
18
|
+
...requestHeaders
|
19
|
+
};
|
20
|
+
let body = (0, utils_1.access)(accessor, data);
|
21
|
+
if (contentType && body) {
|
22
|
+
headers['content-type'] = contentType;
|
23
|
+
switch (contentType) {
|
24
|
+
case 'text/plain':
|
25
|
+
body = JSON.stringify(body);
|
26
|
+
break;
|
27
|
+
case 'application/json':
|
28
|
+
body = JSON.stringify(body);
|
29
|
+
break;
|
30
|
+
case 'application/x-www-form-urlencoded':
|
31
|
+
const searchParams = new URLSearchParams();
|
32
|
+
for (const prop in body) {
|
33
|
+
searchParams.set(prop, body[prop]);
|
34
|
+
}
|
35
|
+
body = searchParams.toString();
|
36
|
+
break;
|
37
|
+
}
|
38
|
+
}
|
39
|
+
const options = {
|
40
|
+
method: 'PUT',
|
41
|
+
headers,
|
42
|
+
body
|
43
|
+
};
|
44
|
+
const { rejectUnauthorized } = connectionParams;
|
45
|
+
if (!rejectUnauthorized) {
|
46
|
+
const httpsAgent = new https_1.default.Agent({
|
47
|
+
rejectUnauthorized
|
48
|
+
});
|
49
|
+
options.agent = httpsAgent;
|
50
|
+
}
|
51
|
+
const page = await acquireSessionPage();
|
52
|
+
try {
|
53
|
+
page.on('console', async (msg) => {
|
54
|
+
console.log(`[browser ${msg.type()}] ${msg.text()}`);
|
55
|
+
});
|
56
|
+
page.on('requestfailed', request => {
|
57
|
+
console.log('Request failed:', request.url());
|
58
|
+
});
|
59
|
+
await page.goto(endpoint, { waitUntil: 'networkidle2' });
|
60
|
+
// URL 구성 - queryParams가 있으면 추가
|
61
|
+
let requestUrl = new url_1.URL(path, endpoint);
|
62
|
+
if (queryParams && typeof queryParams === 'object') {
|
63
|
+
Object.keys(queryParams).forEach(key => {
|
64
|
+
if (queryParams[key] !== null && queryParams[key] !== undefined) {
|
65
|
+
requestUrl.searchParams.append(key, String(queryParams[key]));
|
66
|
+
}
|
67
|
+
});
|
68
|
+
}
|
69
|
+
const response = await page.evaluate(async (urlString, options) => {
|
70
|
+
const response = await fetch(urlString, options);
|
71
|
+
if (!response.ok) {
|
72
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
73
|
+
}
|
74
|
+
const contentType = response.headers.get('content-type') || '';
|
75
|
+
if (contentType.includes('application/json')) {
|
76
|
+
return await response.json();
|
77
|
+
}
|
78
|
+
else if (contentType.includes('text/')) {
|
79
|
+
return await response.text();
|
80
|
+
}
|
81
|
+
else {
|
82
|
+
// Binary data나 기타 타입의 경우
|
83
|
+
const arrayBuffer = await response.arrayBuffer();
|
84
|
+
return Array.from(new Uint8Array(arrayBuffer));
|
85
|
+
}
|
86
|
+
}, requestUrl.toString(), options);
|
87
|
+
return {
|
88
|
+
data: response
|
89
|
+
};
|
90
|
+
}
|
91
|
+
catch (error) {
|
92
|
+
logger.error('Error in HeadlessPut:', error);
|
93
|
+
throw error;
|
94
|
+
}
|
95
|
+
finally {
|
96
|
+
await releasePage(page);
|
97
|
+
}
|
98
|
+
}
|
99
|
+
HeadlessPut.parameterSpec = [
|
100
|
+
{
|
101
|
+
type: 'string',
|
102
|
+
name: 'path',
|
103
|
+
label: 'path'
|
104
|
+
},
|
105
|
+
{
|
106
|
+
type: 'http-headers',
|
107
|
+
name: 'headers',
|
108
|
+
label: 'headers'
|
109
|
+
},
|
110
|
+
{
|
111
|
+
type: 'options',
|
112
|
+
name: 'queryParams',
|
113
|
+
label: 'query-parameters'
|
114
|
+
},
|
115
|
+
{
|
116
|
+
type: 'select',
|
117
|
+
name: 'contentType',
|
118
|
+
label: 'content-type',
|
119
|
+
property: {
|
120
|
+
options: [
|
121
|
+
{ display: '', value: '' },
|
122
|
+
{ display: 'application/json', value: 'application/json' },
|
123
|
+
{ display: 'text/plain', value: 'text/plain' },
|
124
|
+
{ display: 'application/x-www-form-urlencoded', value: 'application/x-www-form-urlencoded' }
|
125
|
+
]
|
126
|
+
}
|
127
|
+
},
|
128
|
+
{
|
129
|
+
type: 'scenario-step-input',
|
130
|
+
name: 'accessor',
|
131
|
+
label: 'accessor'
|
132
|
+
}
|
133
|
+
];
|
134
|
+
task_registry_1.TaskRegistry.registerTaskHandler('headless-put', HeadlessPut);
|
135
|
+
//# sourceMappingURL=headless-put.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"headless-put.js","sourceRoot":"","sources":["../../../server/engine/task/headless-put.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\nasync function HeadlessPut(step, { logger, data, domain }) {\n const { connection: connectionName, params: stepOptions } = step\n const { headers: requestHeaders, contentType, path, accessor, queryParams } = stepOptions || {}\n\n const connection = await ConnectionManager.getConnectionInstanceByName(domain, connectionName)\n\n if (!connection) {\n throw new Error(`Connection '${connectionName}' is not established.`)\n }\n\n const { endpoint, params: connectionParams, acquireSessionPage, releasePage } = connection\n\n const headers = {\n ...requestHeaders\n }\n\n let 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.toString()\n break\n }\n }\n\n const options = {\n method: 'PUT',\n headers,\n body\n } as any\n\n const { rejectUnauthorized } = connectionParams\n\n if (!rejectUnauthorized) {\n const httpsAgent = new https.Agent({\n rejectUnauthorized\n })\n options.agent = httpsAgent\n }\n\n const page = await acquireSessionPage()\n\n try {\n page.on('console', async msg => {\n console.log(`[browser ${msg.type()}] ${msg.text()}`)\n })\n\n page.on('requestfailed', request => {\n console.log('Request failed:', request.url())\n })\n\n await page.goto(endpoint, { waitUntil: 'networkidle2' })\n\n // URL 구성 - queryParams가 있으면 추가\n let requestUrl = new URL(path, endpoint)\n if (queryParams && typeof queryParams === 'object') {\n Object.keys(queryParams).forEach(key => {\n if (queryParams[key] !== null && queryParams[key] !== undefined) {\n requestUrl.searchParams.append(key, String(queryParams[key]))\n }\n })\n }\n\n const response = await page.evaluate(\n async (urlString, options) => {\n const response = await fetch(urlString, options)\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n const contentType = response.headers.get('content-type') || ''\n \n if (contentType.includes('application/json')) {\n return await response.json()\n } else if (contentType.includes('text/')) {\n return await response.text()\n } else {\n // Binary data나 기타 타입의 경우\n const arrayBuffer = await response.arrayBuffer()\n return Array.from(new Uint8Array(arrayBuffer))\n }\n },\n requestUrl.toString(),\n options\n )\n\n return {\n data: response\n }\n } catch (error) {\n logger.error('Error in HeadlessPut:', error)\n throw error\n } finally {\n await releasePage(page)\n }\n}\n\nHeadlessPut.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: 'options',\n name: 'queryParams',\n label: 'query-parameters'\n },\n {\n type: 'select',\n name: 'contentType',\n label: 'content-type',\n property: {\n options: [\n { display: '', value: '' },\n { display: 'application/json', value: 'application/json' },\n { display: 'text/plain', value: 'text/plain' },\n { display: 'application/x-www-form-urlencoded', value: 'application/x-www-form-urlencoded' }\n ]\n }\n },\n {\n type: 'scenario-step-input',\n name: 'accessor',\n label: 'accessor'\n }\n]\n\nTaskRegistry.registerTaskHandler('headless-put', HeadlessPut)"]}
|
@@ -34,7 +34,11 @@ import './socket-listener';
|
|
34
34
|
import './random';
|
35
35
|
import './csv-readline';
|
36
36
|
import './data-mapper';
|
37
|
+
import './headless-get';
|
37
38
|
import './headless-post';
|
39
|
+
import './headless-put';
|
40
|
+
import './headless-patch';
|
41
|
+
import './headless-delete';
|
38
42
|
import './headless-scrap';
|
39
43
|
import './set-domain';
|
40
44
|
import './mssql-procedure';
|
@@ -36,7 +36,11 @@ require("./socket-listener");
|
|
36
36
|
require("./random");
|
37
37
|
require("./csv-readline");
|
38
38
|
require("./data-mapper");
|
39
|
+
require("./headless-get");
|
39
40
|
require("./headless-post");
|
41
|
+
require("./headless-put");
|
42
|
+
require("./headless-patch");
|
43
|
+
require("./headless-delete");
|
40
44
|
require("./headless-scrap");
|
41
45
|
require("./set-domain");
|
42
46
|
require("./mssql-procedure");
|
@@ -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,2BAAwB;AACxB,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;AACxB,4BAAyB;AACzB,wBAAqB;AACrB,6BAA0B;AAC1B,8BAA2B;AAC3B,qBAAkB;AAClB,wBAAqB;AACrB,yBAAsB;AACtB,8BAA2B;AAC3B,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 './stop-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'\nimport './headless-scrap'\nimport './set-domain'\nimport './mssql-procedure'\nimport './oracle-procedure'\nimport './jsonata'\nimport './state-read'\nimport './state-write'\nimport './state-group-read'\nimport './pyrun-execute'\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,2BAAwB;AACxB,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,0BAAuB;AACvB,2BAAwB;AACxB,0BAAuB;AACvB,4BAAyB;AACzB,6BAA0B;AAC1B,4BAAyB;AACzB,wBAAqB;AACrB,6BAA0B;AAC1B,8BAA2B;AAC3B,qBAAkB;AAClB,wBAAqB;AACrB,yBAAsB;AACtB,8BAA2B;AAC3B,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 './stop-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-get'\nimport './headless-post'\nimport './headless-put'\nimport './headless-patch'\nimport './headless-delete'\nimport './headless-scrap'\nimport './set-domain'\nimport './mssql-procedure'\nimport './oracle-procedure'\nimport './jsonata'\nimport './state-read'\nimport './state-write'\nimport './state-group-read'\nimport './pyrun-execute'\n"]}
|