@things-factory/integration-base 7.0.1-rc.5 → 7.0.1-rc.7

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 (43) hide show
  1. package/dist-server/engine/task/database-query.d.ts +1 -1
  2. package/dist-server/engine/task/database-query.js +16 -11
  3. package/dist-server/engine/task/database-query.js.map +1 -1
  4. package/dist-server/engine/task/graphql-mutate.d.ts +1 -1
  5. package/dist-server/engine/task/graphql-mutate.js +16 -11
  6. package/dist-server/engine/task/graphql-mutate.js.map +1 -1
  7. package/dist-server/engine/task/graphql-query.d.ts +1 -1
  8. package/dist-server/engine/task/graphql-query.js +16 -11
  9. package/dist-server/engine/task/graphql-query.js.map +1 -1
  10. package/dist-server/engine/task/http-get.d.ts +1 -1
  11. package/dist-server/engine/task/http-get.js +28 -12
  12. package/dist-server/engine/task/http-get.js.map +1 -1
  13. package/dist-server/engine/task/http-post.d.ts +1 -1
  14. package/dist-server/engine/task/http-post.js +22 -11
  15. package/dist-server/engine/task/http-post.js.map +1 -1
  16. package/dist-server/engine/task/local-graphql-mutate.d.ts +1 -1
  17. package/dist-server/engine/task/local-graphql-mutate.js +16 -10
  18. package/dist-server/engine/task/local-graphql-mutate.js.map +1 -1
  19. package/dist-server/engine/task/local-graphql-query.d.ts +1 -1
  20. package/dist-server/engine/task/local-graphql-query.js +16 -10
  21. package/dist-server/engine/task/local-graphql-query.js.map +1 -1
  22. package/dist-server/engine/task/log.d.ts +1 -1
  23. package/dist-server/engine/task/log.js +15 -11
  24. package/dist-server/engine/task/log.js.map +1 -1
  25. package/dist-server/engine/task/oracle-procedure.d.ts +1 -1
  26. package/dist-server/engine/task/oracle-procedure.js +18 -12
  27. package/dist-server/engine/task/oracle-procedure.js.map +1 -1
  28. package/dist-server/engine/task/script.d.ts +1 -1
  29. package/dist-server/engine/task/script.js +30 -18
  30. package/dist-server/engine/task/script.js.map +1 -1
  31. package/dist-server/service/index.d.ts +1 -1
  32. package/dist-server/tsconfig.tsbuildinfo +1 -1
  33. package/package.json +11 -11
  34. package/server/engine/task/database-query.ts +16 -11
  35. package/server/engine/task/graphql-mutate.ts +16 -12
  36. package/server/engine/task/graphql-query.ts +15 -12
  37. package/server/engine/task/http-get.ts +26 -12
  38. package/server/engine/task/http-post.ts +22 -11
  39. package/server/engine/task/local-graphql-mutate.ts +16 -10
  40. package/server/engine/task/local-graphql-query.ts +16 -10
  41. package/server/engine/task/log.ts +14 -11
  42. package/server/engine/task/oracle-procedure.ts +19 -13
  43. package/server/engine/task/script.ts +28 -18
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/integration-base",
3
- "version": "7.0.1-rc.5",
3
+ "version": "7.0.1-rc.7",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "client/index.js",
6
6
  "things-factory": true,
@@ -27,14 +27,14 @@
27
27
  "dependencies": {
28
28
  "@apollo/client": "^3.6.9",
29
29
  "@operato/moment-timezone-es": "^7.0.0-rc",
30
- "@things-factory/api": "^7.0.1-rc.5",
31
- "@things-factory/auth-base": "^7.0.1-rc.5",
32
- "@things-factory/cache-service": "^7.0.1-rc.5",
33
- "@things-factory/env": "^7.0.1-rc.5",
34
- "@things-factory/oauth2-client": "^7.0.1-rc.5",
35
- "@things-factory/scheduler-client": "^7.0.1-rc.5",
36
- "@things-factory/shell": "^7.0.1-rc.5",
37
- "@things-factory/utils": "^7.0.1-rc.0",
30
+ "@things-factory/api": "^7.0.1-rc.7",
31
+ "@things-factory/auth-base": "^7.0.1-rc.7",
32
+ "@things-factory/cache-service": "^7.0.1-rc.7",
33
+ "@things-factory/env": "^7.0.1-rc.7",
34
+ "@things-factory/oauth2-client": "^7.0.1-rc.7",
35
+ "@things-factory/scheduler-client": "^7.0.1-rc.7",
36
+ "@things-factory/shell": "^7.0.1-rc.7",
37
+ "@things-factory/utils": "^7.0.1-rc.7",
38
38
  "async-mqtt": "^2.5.0",
39
39
  "chance": "^1.1.11",
40
40
  "cross-fetch": "^3.0.4",
@@ -42,7 +42,7 @@
42
42
  "node-fetch": "^2.6.0",
43
43
  "promise-socket": "^7.0.0",
44
44
  "readline": "^1.3.0",
45
- "vm2": "^3.9.11"
45
+ "ses": "^1.5.0"
46
46
  },
47
- "gitHead": "7d5d340e80a8efde9be08bb7b1e019d944bc3628"
47
+ "gitHead": "0e8c627f3fbb83cc1c3fadac3ec342cb8f3f0149"
48
48
  }
@@ -1,8 +1,8 @@
1
- import { VM } from 'vm2'
2
1
  import { ConnectionManager } from '../connection-manager'
3
2
  import { TaskRegistry } from '../task-registry'
4
3
  import { InputStep } from '../../service/step/step-type'
5
4
  import { Context } from '../types'
5
+ import 'ses'
6
6
 
7
7
  async function DatabaseQuery(step: InputStep, context: Context) {
8
8
  var { domain, user, data, variables, lng } = context
@@ -13,18 +13,23 @@ async function DatabaseQuery(step: InputStep, context: Context) {
13
13
 
14
14
  var dbconnection = ConnectionManager.getConnectionInstanceByName(domain, connectionName)
15
15
 
16
- const vm = new VM({
17
- sandbox: {
18
- domain,
19
- user,
20
- lng,
21
- data,
22
- variables
23
- }
16
+ const compartment = new Compartment({
17
+ domain,
18
+ user,
19
+ lng,
20
+ data,
21
+ variables,
22
+ console
24
23
  })
25
24
 
26
- query = vm.run('`' + query + '`')
27
- var queryResult = await dbconnection.query(query, [])
25
+ let evalQuery
26
+ try {
27
+ evalQuery = compartment.evaluate('`' + query + '`')
28
+ } catch (err) {
29
+ throw new Error(`Failed to evaluate query: ${err.message}`)
30
+ }
31
+
32
+ var queryResult = await dbconnection.query(evalQuery, [])
28
33
 
29
34
  return {
30
35
  data: queryResult
@@ -1,8 +1,7 @@
1
1
  import gql from 'graphql-tag'
2
- import { VM } from 'vm2'
2
+ import 'ses'
3
3
 
4
4
  import { access } from '@things-factory/utils'
5
-
6
5
  import { ConnectionManager } from '../connection-manager'
7
6
  import { TaskRegistry } from '../task-registry'
8
7
  import { InputStep } from '../../service/step/step-type'
@@ -14,17 +13,21 @@ async function GraphqlMutate(step: InputStep, context: Context) {
14
13
 
15
14
  var { domain, user, data, variables, lng } = context
16
15
 
17
- const vm = new VM({
18
- sandbox: {
19
- domain,
20
- user,
21
- lng,
22
- data,
23
- variables
24
- }
16
+ const compartment = new Compartment({
17
+ domain,
18
+ user,
19
+ lng,
20
+ data,
21
+ variables,
22
+ console
25
23
  })
26
24
 
27
- mutation = vm.run('`' + mutation + '`')
25
+ let evalMutation
26
+ try {
27
+ evalMutation = compartment.evaluate('`' + mutation + '`')
28
+ } catch (err) {
29
+ throw new Error(`Failed to evaluate mutation: ${err.message}`)
30
+ }
28
31
 
29
32
  var client = ConnectionManager.getConnectionInstanceByName(context.domain, connectionName)
30
33
 
@@ -36,7 +39,7 @@ async function GraphqlMutate(step: InputStep, context: Context) {
36
39
 
37
40
  var { data: mutateResult } = await client.mutate({
38
41
  mutation: gql`
39
- ${mutation}
42
+ ${evalMutation}
40
43
  `,
41
44
  variables: queryVariables,
42
45
  headers
@@ -70,6 +73,7 @@ GraphqlMutate.parameterSpec = [
70
73
  label: 'headers'
71
74
  }
72
75
  ]
76
+
73
77
  GraphqlMutate.help = 'integration/task/graphql-mutate'
74
78
 
75
79
  TaskRegistry.registerTaskHandler('graphql-mutate', GraphqlMutate)
@@ -1,8 +1,7 @@
1
1
  import gql from 'graphql-tag'
2
- import { VM } from 'vm2'
2
+ import 'ses'
3
3
 
4
4
  import { access } from '@things-factory/utils'
5
-
6
5
  import { ConnectionManager } from '../connection-manager'
7
6
  import { TaskRegistry } from '../task-registry'
8
7
  import { InputStep } from '../../service/step/step-type'
@@ -13,17 +12,21 @@ async function GraphqlQuery(step: InputStep, context: Context) {
13
12
  var { query, variables: variablesAccessorMap, headers } = stepOptions || {}
14
13
  var { domain, user, data, variables, lng } = context
15
14
 
16
- const vm = new VM({
17
- sandbox: {
18
- domain,
19
- user,
20
- lng,
21
- data,
22
- variables
23
- }
15
+ const compartment = new Compartment({
16
+ domain,
17
+ user,
18
+ lng,
19
+ data,
20
+ variables,
21
+ console
24
22
  })
25
23
 
26
- query = vm.run('`' + query + '`')
24
+ let evalQuery
25
+ try {
26
+ evalQuery = compartment.evaluate('`' + query + '`')
27
+ } catch (err) {
28
+ throw new Error(`Failed to evaluate query: ${err.message}`)
29
+ }
27
30
 
28
31
  var client = ConnectionManager.getConnectionInstanceByName(domain, connectionName)
29
32
 
@@ -35,7 +38,7 @@ async function GraphqlQuery(step: InputStep, context: Context) {
35
38
 
36
39
  var { data: queryResult } = await client.query({
37
40
  query: gql`
38
- ${query}
41
+ ${evalQuery}
39
42
  `,
40
43
  variables: queryVariables,
41
44
  headers
@@ -1,5 +1,5 @@
1
1
  import fetch from 'node-fetch'
2
- import { VM } from 'vm2'
2
+ import 'ses'
3
3
  import { URL } from 'url'
4
4
  import https from 'https'
5
5
  import { TaskRegistry } from '../task-registry'
@@ -19,29 +19,43 @@ async function HttpGet(step: InputStep, { logger, data, domain, user, variables,
19
19
 
20
20
  var { endpoint, params: connectionParams, authHeaders = {} } = connection
21
21
 
22
- const vm = new VM({
23
- sandbox: {
24
- domain,
25
- user,
26
- lng,
27
- data,
28
- variables
29
- }
22
+ const compartment = new Compartment({
23
+ domain,
24
+ user,
25
+ lng,
26
+ data,
27
+ variables,
28
+ console
30
29
  })
31
30
 
32
- path = vm.run('`' + path + '`')
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
33
39
 
34
40
  requestHeaders =
35
41
  requestHeaders &&
36
42
  Object.entries(requestHeaders as { [key: string]: string }).reduce((sum, [key, value]) => {
37
- sum[key] = vm.run('`' + value + '`')
43
+ try {
44
+ sum[key] = compartment.evaluate('`' + value + '`')
45
+ } catch (err) {
46
+ throw new Error(`Failed to evaluate header value: ${err.message}`)
47
+ }
38
48
  return sum
39
49
  }, {})
40
50
 
41
51
  searchParams =
42
52
  searchParams &&
43
53
  Object.entries(searchParams as { [key: string]: string }).reduce((sum, [key, value]) => {
44
- sum[key] = vm.run('`' + 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
+ }
45
59
  return sum
46
60
  }, {})
47
61
 
@@ -1,6 +1,6 @@
1
1
  import fetch from 'node-fetch'
2
2
  import { URL } from 'url'
3
- import { VM } from 'vm2'
3
+ import 'ses'
4
4
  import { access } from '@things-factory/utils'
5
5
  import { TaskRegistry } from '../task-registry'
6
6
  import { ConnectionManager } from '../connection-manager'
@@ -20,21 +20,32 @@ async function HttpPost(step: InputStep, { logger, data, domain, user, variables
20
20
 
21
21
  var { endpoint, params: connectionParams, authHeaders = {} } = connection
22
22
 
23
- const vm = new VM({
24
- sandbox: {
25
- domain,
26
- user,
27
- lng,
28
- data,
29
- variables
30
- }
23
+ const compartment = new Compartment({
24
+ domain,
25
+ user,
26
+ lng,
27
+ data,
28
+ variables,
29
+ console
31
30
  })
32
31
 
33
- path = vm.run('`' + path + '`')
32
+ let evalPath
33
+ try {
34
+ evalPath = compartment.evaluate('`' + path + '`')
35
+ } catch (err) {
36
+ throw new Error(`Failed to evaluate path: ${err.message}`)
37
+ }
38
+
39
+ path = evalPath
40
+
34
41
  requestHeaders =
35
42
  requestHeaders &&
36
43
  Object.entries(requestHeaders as { [key: string]: string }).reduce((sum, [key, value]) => {
37
- sum[key] = vm.run('`' + value + '`')
44
+ try {
45
+ sum[key] = compartment.evaluate('`' + value + '`')
46
+ } catch (err) {
47
+ throw new Error(`Failed to evaluate header value: ${err.message}`)
48
+ }
38
49
  return sum
39
50
  }, {})
40
51
 
@@ -1,5 +1,5 @@
1
1
  import gql from 'graphql-tag'
2
- import { VM } from 'vm2'
2
+ import 'ses'
3
3
 
4
4
  import { User } from '@things-factory/auth-base'
5
5
  import { getRepository } from '@things-factory/shell'
@@ -21,17 +21,23 @@ async function LocalGraphqlMutate(step: InputStep, context: Context) {
21
21
  relations: ['domains']
22
22
  }))
23
23
 
24
- const vm = new VM({
25
- sandbox: {
26
- domain,
27
- user,
28
- lng,
29
- data,
30
- variables
31
- }
24
+ const compartment = new Compartment({
25
+ domain,
26
+ user,
27
+ lng,
28
+ data,
29
+ variables,
30
+ console
32
31
  })
33
32
 
34
- mutation = vm.run('`' + mutation + '`')
33
+ let evalMutation
34
+ try {
35
+ evalMutation = compartment.evaluate('`' + mutation + '`')
36
+ } catch (err) {
37
+ throw new Error(`Failed to evaluate mutation: ${err.message}`)
38
+ }
39
+
40
+ mutation = evalMutation
35
41
 
36
42
  const queryVariables = Object.keys(variablesAccessorMap || {}).reduce((variables, key) => {
37
43
  const accessor = variablesAccessorMap[key]
@@ -1,5 +1,5 @@
1
1
  import gql from 'graphql-tag'
2
- import { VM } from 'vm2'
2
+ import 'ses'
3
3
 
4
4
  import { User } from '@things-factory/auth-base'
5
5
  import { getRepository } from '@things-factory/shell'
@@ -21,17 +21,23 @@ async function LocalGraphqlQuery(step: InputStep, context: Context) {
21
21
  relations: ['domains']
22
22
  }))
23
23
 
24
- const vm = new VM({
25
- sandbox: {
26
- domain,
27
- user,
28
- lng,
29
- data,
30
- variables
31
- }
24
+ const compartment = new Compartment({
25
+ domain,
26
+ user,
27
+ lng,
28
+ data,
29
+ variables,
30
+ console
32
31
  })
33
32
 
34
- query = vm.run('`' + query + '`')
33
+ let evalQuery
34
+ try {
35
+ evalQuery = compartment.evaluate('`' + query + '`')
36
+ } catch (err) {
37
+ throw new Error(`Failed to evaluate query: ${err.message}`)
38
+ }
39
+
40
+ query = evalQuery
35
41
 
36
42
  const queryVariables = Object.keys(variablesAccessorMap || {}).reduce((variables, key) => {
37
43
  const accessor = variablesAccessorMap[key]
@@ -1,5 +1,5 @@
1
1
  import { access, hasTemplateExpression } from '@things-factory/utils'
2
- import { VM } from 'vm2'
2
+ import 'ses'
3
3
  import { TaskRegistry } from '../task-registry'
4
4
  import { InputStep } from '../../service/step/step-type'
5
5
  import { Context } from '../types'
@@ -10,23 +10,26 @@ async function Log(step: InputStep, { logger, data, variables, domain, user, lng
10
10
  } = step
11
11
 
12
12
  if (hasTemplateExpression(message)) {
13
- const vm = new VM({
14
- sandbox: {
15
- domain,
16
- user,
17
- lng,
18
- data,
19
- variables
20
- }
13
+ const compartment = new Compartment({
14
+ domain,
15
+ user,
16
+ lng,
17
+ data,
18
+ variables,
19
+ console
21
20
  })
22
21
 
23
- message = vm.run('`' + message + '`')
22
+ try {
23
+ message = compartment.evaluate('`' + message + '`')
24
+ } catch (err) {
25
+ throw new Error(`Failed to evaluate message: ${err.message}`)
26
+ }
24
27
  }
25
28
 
26
29
  accessor = access(accessor, data)
27
30
 
28
31
  if (accessor) {
29
- if (accessor !== 'string') {
32
+ if (typeof accessor !== 'string') {
30
33
  accessor = JSON.stringify(accessor, null, 2)
31
34
  }
32
35
  message += ': ' + accessor
@@ -1,10 +1,10 @@
1
- import { VM } from 'vm2'
2
1
  import { logger } from '@things-factory/env'
3
2
  import { access } from '@things-factory/utils'
4
3
  import { ConnectionManager } from '../connection-manager'
5
4
  import { TaskRegistry } from '../task-registry'
6
5
  import { InputStep } from '../../service/step/step-type'
7
6
  import { Context } from '../types'
7
+ import 'ses'
8
8
 
9
9
  try {
10
10
  var oracledb = require('oracledb')
@@ -51,21 +51,27 @@ async function OracleProcedure(step: InputStep, context: Context) {
51
51
 
52
52
  var dbconnection = ConnectionManager.getConnectionInstanceByName(domain, connectionName)
53
53
 
54
- const vm = new VM({
55
- sandbox: {
56
- domain,
57
- user,
58
- lng,
59
- data,
60
- variables
61
- }
62
- })
63
-
64
54
  if (!code) {
65
55
  throw 'procedure code not defined'
66
56
  }
67
57
 
68
- code = vm.run('`' + code + '`')
58
+ const compartment = new Compartment({
59
+ domain,
60
+ user,
61
+ lng,
62
+ data,
63
+ variables,
64
+ console
65
+ })
66
+
67
+ let evalCode
68
+ try {
69
+ evalCode = compartment.evaluate('`' + code + '`')
70
+ } catch (err) {
71
+ throw new Error(`Failed to evaluate code: ${err.message}`)
72
+ }
73
+
74
+ code = evalCode
69
75
 
70
76
  const procedureParameters =
71
77
  parameters &&
@@ -79,7 +85,7 @@ async function OracleProcedure(step: InputStep, context: Context) {
79
85
 
80
86
  if (calculated !== undefined) {
81
87
  sum[name].val =
82
- type == 'Date'
88
+ type === 'Date'
83
89
  ? new Date(calculated)
84
90
  : type == 'Number'
85
91
  ? Number(calculated)
@@ -1,34 +1,44 @@
1
1
  import { TaskRegistry } from '../task-registry'
2
- import { NodeVM } from 'vm2'
3
-
4
2
  import { InputStep } from '../../service/step/step-type'
5
3
  import { Context } from '../types'
4
+ import 'ses'
6
5
 
7
6
  async function Script(step: InputStep, context: Context) {
8
- var {
7
+ const {
9
8
  params: { script }
10
9
  } = step
11
10
 
12
11
  const { domain, user, data, variables, lng, logger } = context
13
12
 
14
- const vm = new NodeVM({
15
- timeout: 5000,
16
- wrapper: 'none',
17
- console: 'inherit',
18
- sandbox: {
19
- domain,
20
- user,
21
- lng,
22
- logger,
23
- data,
24
- variables
25
- }
13
+ const compartment = new Compartment({
14
+ domain,
15
+ user,
16
+ data,
17
+ variables,
18
+ logger,
19
+ lng,
20
+ console,
21
+ Math,
22
+ JSON,
23
+ Date,
24
+ setTimeout,
25
+ setInterval,
26
+ clearTimeout,
27
+ clearInterval
26
28
  })
27
29
 
28
- var result = await vm.run(`return (async () => {\n${script}\n})()`)
30
+ const scriptSource = `
31
+ (async () => {
32
+ ${script}
33
+ })();
34
+ `
29
35
 
30
- return {
31
- data: result
36
+ try {
37
+ return {
38
+ data: await compartment.evaluate(scriptSource)
39
+ }
40
+ } catch (err) {
41
+ throw new Error(`Script execution failed: ${err.message}`)
32
42
  }
33
43
  }
34
44