@things-factory/integration-base 8.0.0-beta.1 → 8.0.0-beta.4

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 (136) hide show
  1. package/package.json +10 -10
  2. package/server/controllers/index.ts +0 -2
  3. package/server/controllers/publish-data.ts +0 -29
  4. package/server/controllers/scenario-controller.ts +0 -156
  5. package/server/engine/analyzer/analyze-integration.ts +0 -115
  6. package/server/engine/connection-manager.ts +0 -239
  7. package/server/engine/connector/echo-back-connector.ts +0 -51
  8. package/server/engine/connector/echo-back-server.ts +0 -72
  9. package/server/engine/connector/graphql-connector.ts +0 -126
  10. package/server/engine/connector/headless-connector.ts +0 -341
  11. package/server/engine/connector/http-connector.ts +0 -65
  12. package/server/engine/connector/index.ts +0 -13
  13. package/server/engine/connector/mqtt-connector.ts +0 -78
  14. package/server/engine/connector/mssql-connector.ts +0 -152
  15. package/server/engine/connector/mysql-connector.ts +0 -94
  16. package/server/engine/connector/operato-connector.ts +0 -264
  17. package/server/engine/connector/oracle-connector.ts +0 -218
  18. package/server/engine/connector/postgresql-connector.ts +0 -152
  19. package/server/engine/connector/proxy-connector.ts +0 -53
  20. package/server/engine/connector/socket-server.ts +0 -86
  21. package/server/engine/connector/sqlite-connector.ts +0 -69
  22. package/server/engine/edge-client.ts +0 -45
  23. package/server/engine/index.ts +0 -11
  24. package/server/engine/pending-queue.ts +0 -97
  25. package/server/engine/resource-pool/headless-pool.ts +0 -136
  26. package/server/engine/resource-pool/index.ts +0 -1
  27. package/server/engine/scenario-engine.ts +0 -106
  28. package/server/engine/task/book-up-scenario.ts +0 -73
  29. package/server/engine/task/csv-readline.ts +0 -127
  30. package/server/engine/task/data-accessor.ts +0 -36
  31. package/server/engine/task/data-mapper.ts +0 -47
  32. package/server/engine/task/database-query.ts +0 -56
  33. package/server/engine/task/echo-receive.ts +0 -21
  34. package/server/engine/task/echo-send.ts +0 -32
  35. package/server/engine/task/empty-check.ts +0 -38
  36. package/server/engine/task/end.ts +0 -18
  37. package/server/engine/task/floating-point.ts +0 -71
  38. package/server/engine/task/goto.ts +0 -27
  39. package/server/engine/task/graphql-mutate.ts +0 -79
  40. package/server/engine/task/graphql-query.ts +0 -78
  41. package/server/engine/task/headless-post.ts +0 -128
  42. package/server/engine/task/headless-scrap.ts +0 -83
  43. package/server/engine/task/http-get.ts +0 -117
  44. package/server/engine/task/http-post.ts +0 -148
  45. package/server/engine/task/index.ts +0 -45
  46. package/server/engine/task/jsonata.ts +0 -45
  47. package/server/engine/task/local-graphql-mutate.ts +0 -100
  48. package/server/engine/task/local-graphql-query.ts +0 -100
  49. package/server/engine/task/log.ts +0 -78
  50. package/server/engine/task/mqtt-publish.ts +0 -45
  51. package/server/engine/task/mqtt-subscribe.ts +0 -139
  52. package/server/engine/task/mssql-procedure.ts +0 -128
  53. package/server/engine/task/oracle-procedure.ts +0 -124
  54. package/server/engine/task/pick-pending-scenario.ts +0 -80
  55. package/server/engine/task/publish.ts +0 -40
  56. package/server/engine/task/random.ts +0 -53
  57. package/server/engine/task/reset-pending-queue.ts +0 -17
  58. package/server/engine/task/script.ts +0 -63
  59. package/server/engine/task/set-domain.ts +0 -37
  60. package/server/engine/task/sleep.ts +0 -34
  61. package/server/engine/task/socket-listener.ts +0 -96
  62. package/server/engine/task/state-group-read.ts +0 -69
  63. package/server/engine/task/state-read.ts +0 -56
  64. package/server/engine/task/state-write.ts +0 -65
  65. package/server/engine/task/stop-scenario.ts +0 -44
  66. package/server/engine/task/sub-scenario.ts +0 -57
  67. package/server/engine/task/switch-goto.ts +0 -43
  68. package/server/engine/task/switch-range-goto.ts +0 -53
  69. package/server/engine/task/switch-range-scenario.ts +0 -79
  70. package/server/engine/task/switch-range-set.ts +0 -48
  71. package/server/engine/task/switch-scenario.ts +0 -67
  72. package/server/engine/task/switch-set.ts +0 -37
  73. package/server/engine/task/throw.ts +0 -27
  74. package/server/engine/task/utils/headless-pool-for-scenario.ts +0 -71
  75. package/server/engine/task/utils/substitute.ts +0 -44
  76. package/server/engine/task/variables.ts +0 -17
  77. package/server/engine/task-registry.ts +0 -23
  78. package/server/engine/types.ts +0 -114
  79. package/server/index.ts +0 -20
  80. package/server/migrations/index.ts +0 -9
  81. package/server/restful/index.ts +0 -1
  82. package/server/restful/unstable/index.ts +0 -7
  83. package/server/restful/unstable/run-scenario.ts +0 -51
  84. package/server/restful/unstable/scenario-instance.ts +0 -52
  85. package/server/restful/unstable/scenario-instances.ts +0 -80
  86. package/server/restful/unstable/scenario.ts +0 -41
  87. package/server/restful/unstable/scenarios.ts +0 -69
  88. package/server/restful/unstable/start-scenario.ts +0 -33
  89. package/server/restful/unstable/stop-scenario.ts +0 -30
  90. package/server/routers/scenario-schedule-callback-router.ts +0 -69
  91. package/server/routers/scenario-view-router.ts +0 -46
  92. package/server/routes.ts +0 -30
  93. package/server/service/analysis/analysis-query.ts +0 -13
  94. package/server/service/analysis/index.ts +0 -3
  95. package/server/service/connection/connection-mutation.ts +0 -190
  96. package/server/service/connection/connection-query.ts +0 -87
  97. package/server/service/connection/connection-subscription.ts +0 -104
  98. package/server/service/connection/connection-type.ts +0 -288
  99. package/server/service/connection/index.ts +0 -7
  100. package/server/service/connector/connector-query.ts +0 -62
  101. package/server/service/connector/connector-type.ts +0 -29
  102. package/server/service/connector/index.ts +0 -4
  103. package/server/service/index.ts +0 -52
  104. package/server/service/payload-log/index.ts +0 -7
  105. package/server/service/payload-log/payload-log-mutation.ts +0 -151
  106. package/server/service/payload-log/payload-log-query.ts +0 -49
  107. package/server/service/payload-log/payload-log-type.ts +0 -36
  108. package/server/service/payload-log/payload-log.ts +0 -100
  109. package/server/service/property-spec.ts +0 -24
  110. package/server/service/scenario/index.ts +0 -6
  111. package/server/service/scenario/scenario-mutation.ts +0 -396
  112. package/server/service/scenario/scenario-query.ts +0 -109
  113. package/server/service/scenario/scenario-type.ts +0 -78
  114. package/server/service/scenario/scenario.ts +0 -124
  115. package/server/service/scenario-flow/scenario-flow.ts +0 -17
  116. package/server/service/scenario-instance/index.ts +0 -6
  117. package/server/service/scenario-instance/scenario-instance-mutation.ts +0 -44
  118. package/server/service/scenario-instance/scenario-instance-query.ts +0 -42
  119. package/server/service/scenario-instance/scenario-instance-subscription.ts +0 -118
  120. package/server/service/scenario-instance/scenario-instance-type.ts +0 -563
  121. package/server/service/scenario-queue/index.ts +0 -4
  122. package/server/service/scenario-queue/scenario-queue-subscription.ts +0 -55
  123. package/server/service/scenario-queue/scenario-queue-type.ts +0 -27
  124. package/server/service/state-register/data-resolver.ts +0 -56
  125. package/server/service/state-register/index.ts +0 -8
  126. package/server/service/state-register/state-register-mutation.ts +0 -166
  127. package/server/service/state-register/state-register-query.ts +0 -80
  128. package/server/service/state-register/state-register-type.ts +0 -80
  129. package/server/service/state-register/state-register.ts +0 -113
  130. package/server/service/step/index.ts +0 -6
  131. package/server/service/step/step-mutation.ts +0 -52
  132. package/server/service/step/step-query.ts +0 -55
  133. package/server/service/step/step-type.ts +0 -215
  134. package/server/service/task-type/index.ts +0 -4
  135. package/server/service/task-type/task-type-query.ts +0 -95
  136. package/server/service/task-type/task-type-type.ts +0 -29
@@ -1,32 +0,0 @@
1
- import { TaskRegistry } from '../task-registry'
2
- import { ConnectionManager } from '../connection-manager'
3
- import { InputStep } from '../../service/step/step-type'
4
- import { Context } from '../types'
5
-
6
- async function EchoSend(step: InputStep, { logger, domain }: Context) {
7
- var {
8
- connection: connectionName,
9
- params: { message }
10
- } = step
11
-
12
- var connection = ConnectionManager.getConnectionInstanceByName(domain, connectionName)
13
- if (!connection) {
14
- throw Error(`connection is not found : ${connectionName}`)
15
- }
16
-
17
- var data = await connection.write(message)
18
-
19
- return {
20
- data
21
- }
22
- }
23
-
24
- EchoSend.parameterSpec = [
25
- {
26
- type: 'string',
27
- name: 'message',
28
- label: 'message'
29
- }
30
- ]
31
-
32
- TaskRegistry.registerTaskHandler('echo-send', EchoSend)
@@ -1,38 +0,0 @@
1
- import { TaskRegistry } from '../task-registry'
2
- import { access } from '@things-factory/utils'
3
-
4
- import { InputStep } from '../../service/step/step-type'
5
- import { Context } from '../types'
6
-
7
- async function EmptyCheck(step: InputStep, { logger, data }: Context) {
8
- var {
9
- params: { accessor, goto }
10
- } = step
11
-
12
- const value = access(accessor, data)
13
- if ([null, undefined, NaN, ''].indexOf(value) !== -1) {
14
- return {
15
- next: goto
16
- }
17
- }
18
-
19
- return {}
20
- }
21
-
22
- EmptyCheck.parameterSpec = [
23
- {
24
- type: 'scenario-step-input',
25
- name: 'accessor',
26
- label: 'accessor'
27
- },
28
- {
29
- type: 'scenario-step-input',
30
- name: 'goto',
31
- label: 'goto'
32
- }
33
- ]
34
-
35
- EmptyCheck.connectorFree = true
36
- EmptyCheck.help = 'integration/task/empty-check'
37
-
38
- TaskRegistry.registerTaskHandler('empty-check', EmptyCheck)
@@ -1,18 +0,0 @@
1
- import { TaskRegistry } from '../task-registry'
2
- import { ScenarioInstanceStatus } from '../../service'
3
-
4
- import { InputStep } from '../../service/step/step-type'
5
- import { Context } from '../types'
6
-
7
- async function End(step: InputStep, { logger }: Context) {
8
- return {
9
- state: ScenarioInstanceStatus.STOPPED
10
- }
11
- }
12
-
13
- End.parameterSpec = []
14
-
15
- End.connectorFree = true
16
- End.help = 'integration/task/end'
17
-
18
- TaskRegistry.registerTaskHandler('end', End)
@@ -1,71 +0,0 @@
1
- import ieee754 from 'ieee754'
2
- import { access } from '@things-factory/utils'
3
- import { TaskRegistry } from '../task-registry'
4
-
5
- import { InputStep } from '../../service/step/step-type'
6
- import { Context } from '../types'
7
-
8
- async function FloatingPoint(step: InputStep, { logger, data }: Context) {
9
- var {
10
- params: { accessor, operation, endian, floatType }
11
- } = step
12
-
13
- const value = access(accessor, data)
14
- if (typeof value === 'undefined') {
15
- throw new Error('accessor value not a found')
16
- }
17
-
18
- const isLE = endian === 'little'
19
- const nBytes = floatType === 'float' ? 4 : 8
20
- const mantissa = floatType === 'float' ? 23 : 52
21
-
22
- var result
23
-
24
- if (operation == 'write') {
25
- result = Buffer.alloc(nBytes)
26
- ieee754.write(result, value, 0, isLE, mantissa, nBytes)
27
- } else {
28
- result = ieee754.read(value, 0, isLE, mantissa, nBytes)
29
- }
30
-
31
- return {
32
- data: result
33
- }
34
- }
35
-
36
- FloatingPoint.parameterSpec = [
37
- {
38
- type: 'scenario-step-input',
39
- name: 'accessor',
40
- label: 'accessor'
41
- },
42
- {
43
- type: 'select',
44
- name: 'operation',
45
- label: 'operation',
46
- property: {
47
- options: ['read', 'write']
48
- }
49
- },
50
- {
51
- type: 'select',
52
- name: 'endian',
53
- label: 'endian',
54
- property: {
55
- options: ['little', 'big']
56
- }
57
- },
58
- {
59
- type: 'select',
60
- name: 'floatType',
61
- label: 'float type',
62
- property: {
63
- options: ['float', 'double']
64
- }
65
- }
66
- ]
67
-
68
- FloatingPoint.connectorFree = true
69
- FloatingPoint.help = 'integration/task/floating-point'
70
-
71
- TaskRegistry.registerTaskHandler('floating-point', FloatingPoint)
@@ -1,27 +0,0 @@
1
- import { TaskRegistry } from '../task-registry'
2
-
3
- import { InputStep } from '../../service/step/step-type'
4
- import { Context } from '../types'
5
-
6
- async function Goto(step: InputStep, { logger }: Context) {
7
- var {
8
- params: { goto }
9
- } = step
10
-
11
- return {
12
- next: goto
13
- }
14
- }
15
-
16
- Goto.parameterSpec = [
17
- {
18
- type: 'scenario-step-input',
19
- name: 'goto',
20
- label: 'goto'
21
- }
22
- ]
23
-
24
- Goto.connectorFree = true
25
- Goto.help = 'integration/task/goto'
26
-
27
- TaskRegistry.registerTaskHandler('goto', Goto)
@@ -1,79 +0,0 @@
1
- import gql from 'graphql-tag'
2
- import 'ses'
3
-
4
- import { access } from '@things-factory/utils'
5
- import { ConnectionManager } from '../connection-manager'
6
- import { TaskRegistry } from '../task-registry'
7
- import { InputStep } from '../../service/step/step-type'
8
- import { Context } from '../types'
9
-
10
- async function GraphqlMutate(step: InputStep, context: Context) {
11
- var { connection: connectionName, params: stepOptions } = step
12
- var { mutation, variables: variablesAccessorMap, headers } = stepOptions || {}
13
-
14
- var { domain, user, data, variables, lng } = context
15
-
16
- const compartment = new Compartment({
17
- domain,
18
- user,
19
- lng,
20
- data,
21
- variables,
22
- console
23
- })
24
-
25
- let evalMutation
26
- try {
27
- evalMutation = compartment.evaluate('`' + mutation + '`')
28
- } catch (err) {
29
- throw new Error(`Failed to evaluate mutation: ${err.message}`)
30
- }
31
-
32
- var client = ConnectionManager.getConnectionInstanceByName(context.domain, connectionName)
33
-
34
- const queryVariables = Object.keys(variablesAccessorMap || {}).reduce((variables, key) => {
35
- const accessor = variablesAccessorMap[key]
36
- variables[key] = access(accessor, data)
37
- return variables
38
- }, {})
39
-
40
- var { data: mutateResult } = await client.mutate({
41
- mutation: gql`
42
- ${evalMutation}
43
- `,
44
- variables: queryVariables,
45
- headers
46
- })
47
-
48
- return {
49
- data: mutateResult
50
- }
51
- }
52
-
53
- GraphqlMutate.parameterSpec = [
54
- {
55
- type: 'graphql',
56
- name: 'mutation',
57
- label: 'mutation',
58
- property: {
59
- showLineNumbers: true
60
- },
61
- styles: {
62
- flex: 1
63
- }
64
- },
65
- {
66
- type: 'key-values',
67
- name: 'variables',
68
- label: 'variables'
69
- },
70
- {
71
- type: 'key-values',
72
- name: 'headers',
73
- label: 'headers'
74
- }
75
- ]
76
-
77
- GraphqlMutate.help = 'integration/task/graphql-mutate'
78
-
79
- TaskRegistry.registerTaskHandler('graphql-mutate', GraphqlMutate)
@@ -1,78 +0,0 @@
1
- import gql from 'graphql-tag'
2
- import 'ses'
3
-
4
- import { access } from '@things-factory/utils'
5
- import { ConnectionManager } from '../connection-manager'
6
- import { TaskRegistry } from '../task-registry'
7
- import { InputStep } from '../../service/step/step-type'
8
- import { Context } from '../types'
9
-
10
- async function GraphqlQuery(step: InputStep, context: Context) {
11
- var { connection: connectionName, params: stepOptions } = step
12
- var { query, variables: variablesAccessorMap, headers } = stepOptions || {}
13
- var { domain, user, data, variables, lng } = context
14
-
15
- const compartment = new Compartment({
16
- domain,
17
- user,
18
- lng,
19
- data,
20
- variables,
21
- console
22
- })
23
-
24
- let evalQuery
25
- try {
26
- evalQuery = compartment.evaluate('`' + query + '`')
27
- } catch (err) {
28
- throw new Error(`Failed to evaluate query: ${err.message}`)
29
- }
30
-
31
- var client = ConnectionManager.getConnectionInstanceByName(domain, connectionName)
32
-
33
- const queryVariables = Object.keys(variablesAccessorMap || {}).reduce((variables, key) => {
34
- const accessor = variablesAccessorMap[key]
35
- variables[key] = access(accessor, data)
36
- return variables
37
- }, {})
38
-
39
- var { data: queryResult } = await client.query({
40
- query: gql`
41
- ${evalQuery}
42
- `,
43
- variables: queryVariables,
44
- headers
45
- })
46
-
47
- return {
48
- data: queryResult
49
- }
50
- }
51
-
52
- GraphqlQuery.parameterSpec = [
53
- {
54
- type: 'graphql',
55
- name: 'query',
56
- label: 'query',
57
- property: {
58
- showLineNumbers: true
59
- },
60
- styles: {
61
- flex: 1
62
- }
63
- },
64
- {
65
- type: 'key-values',
66
- name: 'variables',
67
- label: 'variables'
68
- },
69
- {
70
- type: 'key-values',
71
- name: 'headers',
72
- label: 'headers'
73
- }
74
- ]
75
-
76
- GraphqlQuery.help = 'integration/task/graphql-query'
77
-
78
- TaskRegistry.registerTaskHandler('graphql-query', GraphqlQuery)
@@ -1,128 +0,0 @@
1
- import https from 'https'
2
- import { URL } from 'url'
3
-
4
- import { access } from '@things-factory/utils'
5
- import { TaskRegistry } from '../task-registry'
6
- import { ConnectionManager } from '../connection-manager'
7
-
8
- async function HeadlessPost(step, { logger, data, domain }) {
9
- const { connection: connectionName, params: stepOptions } = step
10
- const { headers: requestHeaders, contentType, path, accessor } = stepOptions || {}
11
-
12
- const connection = ConnectionManager.getConnectionInstanceByName(domain, connectionName)
13
-
14
- if (!connection) {
15
- throw new Error(`Connection '${connectionName}' is not established.`)
16
- }
17
-
18
- const { endpoint, params: connectionParams, acquireSessionPage, releasePage } = connection
19
-
20
- const headers = {
21
- ...requestHeaders
22
- }
23
-
24
- let body = access(accessor, data)
25
- if (contentType && body) {
26
- headers['content-type'] = contentType
27
- switch (contentType) {
28
- case 'text/plain':
29
- body = JSON.stringify(body)
30
- break
31
- case 'application/json':
32
- body = JSON.stringify(body)
33
- break
34
- case 'application/x-www-form-urlencoded':
35
- const searchParams = new URLSearchParams()
36
- for (const prop in body) {
37
- searchParams.set(prop, body[prop])
38
- }
39
- body = searchParams.toString()
40
- break
41
- }
42
- }
43
-
44
- const options = {
45
- method: 'POST',
46
- headers,
47
- body
48
- } as any
49
-
50
- const { rejectUnauthorized } = connectionParams
51
-
52
- if (!rejectUnauthorized) {
53
- const httpsAgent = new https.Agent({
54
- rejectUnauthorized
55
- })
56
- options.agent = httpsAgent
57
- }
58
-
59
- const page = await acquireSessionPage()
60
-
61
- try {
62
- page.on('console', async msg => {
63
- console.log(`[browser ${msg.type()}] ${msg.text()}`)
64
- })
65
-
66
- page.on('requestfailed', request => {
67
- console.log('Request failed:', request.url())
68
- })
69
-
70
- await page.goto(endpoint, { waitUntil: 'networkidle2' })
71
-
72
- const response = await page.evaluate(
73
- async (urlString, options) => {
74
- const response = await fetch(urlString, options)
75
-
76
- if (response.ok && response.headers.get('content-type').includes('application/json')) {
77
- return await response.json()
78
- } else {
79
- return await response.text()
80
- }
81
- },
82
- new URL(path, endpoint),
83
- options
84
- )
85
-
86
- return {
87
- data: response
88
- }
89
- } catch (error) {
90
- logger.error('Error in HeadlessPost:', error)
91
- throw error
92
- } finally {
93
- await releasePage(page)
94
- }
95
- }
96
-
97
- HeadlessPost.parameterSpec = [
98
- {
99
- type: 'string',
100
- name: 'path',
101
- label: 'path'
102
- },
103
- {
104
- type: 'http-headers',
105
- name: 'headers',
106
- label: 'headers'
107
- },
108
- {
109
- type: 'select',
110
- name: 'contentType',
111
- label: 'content-type',
112
- property: {
113
- options: [
114
- { display: '', value: '' },
115
- { display: 'application/json', value: 'application/json' },
116
- { display: 'text/plain', value: 'text/plain' },
117
- { display: 'application/x-www-form-urlencoded', value: 'application/x-www-form-urlencoded' }
118
- ]
119
- }
120
- },
121
- {
122
- type: 'scenario-step-input',
123
- name: 'accessor',
124
- label: 'accessor'
125
- }
126
- ]
127
-
128
- TaskRegistry.registerTaskHandler('headless-post', HeadlessPost)
@@ -1,83 +0,0 @@
1
- import { URL } from 'url'
2
-
3
- import { TaskRegistry } from '../task-registry'
4
- import { ConnectionManager } from '../connection-manager'
5
-
6
- async function HeadlessScrap(step, { logger, data, domain }) {
7
- const { connection: connectionName, params: stepOptions } = step
8
- const { headers: requestHeaders, path, selectors = [] } = stepOptions || {}
9
-
10
- const connection = ConnectionManager.getConnectionInstanceByName(domain, connectionName)
11
-
12
- if (!connection) {
13
- throw new Error(`Connection '${connectionName}' is not established.`)
14
- }
15
-
16
- const { endpoint, params: connectionParams, acquireSessionPage, releasePage } = connection
17
-
18
- const headers = {
19
- ...requestHeaders
20
- }
21
-
22
- const page = await acquireSessionPage()
23
-
24
- try {
25
- page.on('console', async msg => {
26
- console.log(`[browser ${msg.type()}] ${msg.text()}`)
27
- })
28
-
29
- page.on('requestfailed', request => {
30
- console.log('Request failed:')
31
- console.log(`- URL: ${request.url()}`)
32
- console.log(`- Method: ${request.method()}`)
33
- console.log(`- Failure Text: ${request.failure()?.errorText}`)
34
- console.log(`- Headers:`, request.headers())
35
-
36
- // POST 데이터 (필요한 경우)
37
- if (request.postData()) {
38
- console.log(`- Post Data: ${request.postData()}`)
39
- }
40
- })
41
-
42
- await page.setExtraHTTPHeaders(headers)
43
- await page.goto(new URL(path, endpoint), { waitUntil: 'networkidle2' })
44
-
45
- const result = {}
46
-
47
- for (const selector of selectors) {
48
- const { text, value } = selector
49
- result[text] = await page.$$eval(value, elements => {
50
- return elements.map(element => element.textContent.trim())
51
- })
52
- }
53
-
54
- return {
55
- data: result
56
- }
57
- } catch (e) {
58
- logger.error('Error in HeadlessScrap:', e)
59
- throw e
60
- } finally {
61
- await releasePage(page)
62
- }
63
- }
64
-
65
- HeadlessScrap.parameterSpec = [
66
- {
67
- type: 'string',
68
- name: 'path',
69
- label: 'path'
70
- },
71
- {
72
- type: 'http-headers',
73
- name: 'headers',
74
- label: 'headers'
75
- },
76
- {
77
- type: 'options',
78
- name: 'selectors',
79
- label: 'selectors'
80
- }
81
- ]
82
-
83
- TaskRegistry.registerTaskHandler('headless-scrap', HeadlessScrap)
@@ -1,117 +0,0 @@
1
- import fetch from 'node-fetch'
2
- import 'ses'
3
- import { URL } from 'url'
4
- import https from 'https'
5
- import { TaskRegistry } from '../task-registry'
6
- import { ConnectionManager } from '../connection-manager'
7
- import { substitute } from './utils/substitute'
8
- import { InputStep } from '../../service/step/step-type'
9
- import { Context } from '../types'
10
-
11
- async function HttpGet(step: InputStep, { logger, data, domain, user, variables, lng }: Context) {
12
- var { connection: connectionName, params: stepOptions } = step
13
- var { headers: requestHeaders, searchParams = {}, path } = stepOptions || {}
14
- var connection = ConnectionManager.getConnectionInstanceByName(domain, connectionName)
15
-
16
- if (!connection) {
17
- throw new Error(`connection '${connectionName}' is not established.`)
18
- }
19
-
20
- var { endpoint, params: connectionParams, authHeaders = {} } = connection
21
-
22
- const compartment = new Compartment({
23
- domain,
24
- user,
25
- lng,
26
- data,
27
- variables,
28
- console
29
- })
30
-
31
- let evalPath
32
- try {
33
- evalPath = compartment.evaluate('`' + path + '`')
34
- } catch (err) {
35
- throw new Error(`Failed to evaluate path: ${err.message}`)
36
- }
37
-
38
- path = evalPath
39
-
40
- requestHeaders =
41
- requestHeaders &&
42
- Object.entries(requestHeaders as { [key: string]: string }).reduce((sum, [key, value]) => {
43
- try {
44
- sum[key] = compartment.evaluate('`' + value + '`')
45
- } catch (err) {
46
- throw new Error(`Failed to evaluate header value: ${err.message}`)
47
- }
48
- return sum
49
- }, {})
50
-
51
- searchParams =
52
- searchParams &&
53
- Object.entries(searchParams as { [key: string]: string }).reduce((sum, [key, value]) => {
54
- try {
55
- sum[key] = compartment.evaluate('`' + value + '`')
56
- } catch (err) {
57
- throw new Error(`Failed to evaluate search param value: ${err.message}`)
58
- }
59
- return sum
60
- }, {})
61
-
62
- var url = new URL(path, endpoint)
63
- if (searchParams) {
64
- Object.keys(searchParams).forEach(key => {
65
- let value = substitute(searchParams[key], data)
66
- url.searchParams.append(key, value)
67
- })
68
- }
69
-
70
- var fetchOptions: any = {
71
- method: 'GET',
72
- headers: {
73
- ...requestHeaders,
74
- ...authHeaders
75
- }
76
- }
77
-
78
- var { rejectUnauthorized } = connectionParams
79
-
80
- if (!rejectUnauthorized) {
81
- const httpsAgent = new https.Agent({
82
- rejectUnauthorized
83
- })
84
- fetchOptions.agent = httpsAgent
85
- }
86
-
87
- var response = await fetch(url, fetchOptions)
88
-
89
- return {
90
- data:
91
- response.ok && response.headers.get('content-type').includes('application/json')
92
- ? await response.json()
93
- : await response.text()
94
- }
95
- }
96
-
97
- HttpGet.parameterSpec = [
98
- {
99
- type: 'string',
100
- name: 'path',
101
- label: 'path'
102
- },
103
- {
104
- type: 'http-headers',
105
- name: 'headers',
106
- label: 'headers'
107
- },
108
- {
109
- type: 'http-parameters',
110
- name: 'searchParams',
111
- label: 'search-params'
112
- }
113
- ]
114
-
115
- HttpGet.help = 'integration/task/http-get'
116
-
117
- TaskRegistry.registerTaskHandler('http-get', HttpGet)