botium-core 1.15.10 → 1.15.13
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/dist/botium-cjs.js +91 -51
- package/dist/botium-cjs.js.map +1 -1
- package/dist/botium-es.js +91 -50
- package/dist/botium-es.js.map +1 -1
- package/package.json +35 -40
- package/src/BotDriver.js +1 -1
- package/src/Events.js +1 -3
- package/src/containers/GridContainer.js +0 -4
- package/src/mocks/BotiumMockScripting.js +3 -0
- package/src/scripting/Convo.js +10 -0
- package/src/utils/boolean.js +39 -0
- package/test/compiler/compilercsv.spec.js +34 -0
- package/test/compiler/compilermarkdown.spec.js +11 -0
- package/test/compiler/compilertxt.spec.js +21 -0
- package/test/compiler/compilerxlsx.spec.js +27 -0
- package/test/compiler/precompilerjson.spec.js +1 -0
- package/test/compiler/precompilermarkdownrasa.spec.js +1 -0
- package/test/connectors/pluginconnectorcontainer.spec.js +1 -0
- package/test/connectors/simplerest.spec.js +3 -1
- package/test/convo/failure.spec.js +1 -0
- package/test/convo/fillAndApplyScriptingMemory.spec.js +56 -0
- package/test/convo/partialconvo.spec.js +3 -0
- package/test/convo/retry.spec.js +9 -0
- package/test/convo/retryasserter.spec.js +9 -0
- package/test/convo/transcript.spec.js +33 -0
- package/test/convo/tree.spec.js +5 -0
- package/test/driver/capabilities.spec.js +16 -0
- package/test/helpers/capabilitiesutils.spec.js +8 -0
- package/test/helpers/transcriptutils.spec.js +1 -0
- package/test/hooks/customhooks.spec.js +3 -0
- package/test/logichooks/hookfromsrc.spec.js +3 -0
- package/test/logichooks/textfromhook.spec.js +1 -0
- package/test/plugins/plugins.spec.js +3 -0
- package/test/scripting/asserters/buttonsAsserter.spec.js +15 -0
- package/test/scripting/asserters/cardsAsserter.spec.js +12 -0
- package/test/scripting/asserters/convoStepParameters.spec.js +11 -0
- package/test/scripting/asserters/entitiesAsserter.spec.js +1 -0
- package/test/scripting/asserters/entityValuesAsserter.spec.js +7 -0
- package/test/scripting/asserters/formsAsserter.spec.js +10 -0
- package/test/scripting/asserters/intentAsserter.spec.js +4 -0
- package/test/scripting/asserters/intentUniqueAsserter.spec.js +2 -0
- package/test/scripting/asserters/jsonpathAsserter.spec.js +25 -0
- package/test/scripting/asserters/mediaAsserter.spec.js +20 -0
- package/test/scripting/asserters/responseLengthAsserter.spec.js +4 -0
- package/test/scripting/asserters/textAsserter.spec.js +1 -0
- package/test/scripting/asserters/textContainsAllAsserter.spec.js +1 -0
- package/test/scripting/asserters/textContainsAnyAsserter.spec.js +1 -0
- package/test/scripting/asserters/textEqualsAsserter.spec.js +1 -0
- package/test/scripting/asserters/textRegexpAllAsserter.spec.js +1 -0
- package/test/scripting/asserters/textRegexpAnyAsserter.spec.js +1 -0
- package/test/scripting/asserters/textWildcardAllAsserter.spec.js +1 -0
- package/test/scripting/asserters/textWildcardAnyAsserter.spec.js +1 -0
- package/test/scripting/asserters/textWildcardExactAllAsserter.spec.js +1 -0
- package/test/scripting/asserters/textWildcardExactAnyAsserter.spec.js +1 -0
- package/test/scripting/asserters/werAsserter.spec.js +6 -0
- package/test/scripting/logichooks/convos/scripting_memory_resolved_args.convo.txt +11 -0
- package/test/scripting/logichooks/customConditionalStepLogicHook.spec.js +2 -0
- package/test/scripting/logichooks/localvsglobal.spec.js +1 -0
- package/test/scripting/logichooks/pauseLogic.spec.js +4 -0
- package/test/scripting/logichooks/setClearScriptingMemory.spec.js +17 -0
- package/test/scripting/logichooks/updateCustom.spec.js +2 -0
- package/test/scripting/matching/matchingmode.spec.js +48 -0
- package/test/scripting/scriptingModificator.spec.js +1 -0
- package/test/scripting/scriptingmemory/fillScriptingMemoryFromFile.spec.js +4 -0
- package/test/scripting/scriptingmemory/regexp.spec.js +1 -0
- package/test/scripting/scriptingmemory/useScriptingMemoryForAssertion.spec.js +3 -0
- package/test/scripting/txt/decompile.spec.js +20 -0
- package/test/scripting/userinputs/buttonInputConvos.spec.js +1 -0
- package/test/scripting/userinputs/defaultUserInputs.spec.js +13 -0
- package/test/scripting/userinputs/mediaInputConvos.spec.js +10 -0
- package/test/scripting/utteranceexpansion/associateByIndex.spec.js +2 -0
- package/test/security/allowUnsafe.spec.js +5 -0
- package/test/utils.spec.js +2 -0
- package/samples/postman/Botium Agent Sample.postman_collection.json +0 -834
- package/samples/postman/README.md +0 -5
- package/samples/postman/botiumFluent.js +0 -37
- package/src/grid/agent/AgentWorker.js +0 -204
- package/src/grid/agent/agent.js +0 -96
- package/src/grid/agent/agentworkerpool.js +0 -58
- package/src/grid/agent/routes.js +0 -353
- package/src/grid/agent/swagger.json +0 -327
- package/src/grid/agent/swaggerDef.json +0 -8
- package/src/grid/agent/views/index.html +0 -39
- package/test/grid/agent/client.js +0 -65
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
const BotDriver = require('../../index').BotDriver
|
|
2
|
-
const Capabilities = require('../../index').Capabilities
|
|
3
|
-
|
|
4
|
-
function assert (expected, actual) {
|
|
5
|
-
if (!actual || actual.indexOf(expected) < 0) {
|
|
6
|
-
console.log(`ERROR: Expected <${expected}>, got <${actual}>`)
|
|
7
|
-
} else {
|
|
8
|
-
console.log(`SUCCESS: Got Expected <${expected}>`)
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
const driver = new BotDriver()
|
|
13
|
-
.setCapability(Capabilities.BOTIUMGRIDURL, 'http://127.0.0.1:46100')
|
|
14
|
-
.setCapability(Capabilities.PROJECTNAME, 'IBM Watson Conversation Sample')
|
|
15
|
-
.setCapability(Capabilities.CONTAINERMODE, 'watsonconversation')
|
|
16
|
-
.setCapability(Capabilities.WATSONCONVERSATION_USER, '0274cb6f-3680-4cf7-bd6b-71c7f447542d')
|
|
17
|
-
.setCapability(Capabilities.WATSONCONVERSATION_PASSWORD, 'ZWDE5xo02sby')
|
|
18
|
-
.setCapability(Capabilities.WATSONCONVERSATION_WORKSPACE_ID, '97513bc0-c581-4bec-ac9f-ea6a8ec308a9')
|
|
19
|
-
.setCapability(Capabilities.WATSONCONVERSATION_COPY_WORKSPACE, false)
|
|
20
|
-
|
|
21
|
-
driver.BuildFluent()
|
|
22
|
-
.Start()
|
|
23
|
-
.UserSaysText('start')
|
|
24
|
-
.WaitBotSaysText((text) => assert('Hi. It looks like a nice drive today. What would you like me to do?', text))
|
|
25
|
-
.UserSaysText('turn on the lights please')
|
|
26
|
-
.WaitBotSaysText((text) => assert('I\'ll turn on the lights for you.', text))
|
|
27
|
-
.UserSaysText('play some jazz music')
|
|
28
|
-
.WaitBotSaysText((text) => assert('Great choice! Playing some jazz for you.', text))
|
|
29
|
-
.Stop()
|
|
30
|
-
.Clean()
|
|
31
|
-
.Exec()
|
|
32
|
-
.then(() => {
|
|
33
|
-
console.log('READY')
|
|
34
|
-
})
|
|
35
|
-
.catch((err) => {
|
|
36
|
-
console.log('ERROR: ', err)
|
|
37
|
-
})
|
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
const util = require('util')
|
|
2
|
-
const async = require('async')
|
|
3
|
-
const debug = require('debug')('botium-core-AgentWorker')
|
|
4
|
-
|
|
5
|
-
const BotDriver = require('../../BotDriver')
|
|
6
|
-
const Capabilities = require('../../Capabilities')
|
|
7
|
-
const Events = require('../../Events')
|
|
8
|
-
const Commands = require('../../Commands')
|
|
9
|
-
const ScriptingConstants = require('../../scripting/Constants')
|
|
10
|
-
|
|
11
|
-
module.exports = class AgentWorker {
|
|
12
|
-
constructor (args = { socket: null, slot: null }) {
|
|
13
|
-
this.driver = null
|
|
14
|
-
this.container = null
|
|
15
|
-
this.args = args
|
|
16
|
-
this.socket = args.socket
|
|
17
|
-
if (this.socket) {
|
|
18
|
-
this.socket.on(Commands.BUILD_CONTAINER, this.Build.bind(this))
|
|
19
|
-
this.socket.on(Commands.START_CONTAINER, this.Start.bind(this))
|
|
20
|
-
this.socket.on(Commands.SENDTOBOT, this.UserSays.bind(this))
|
|
21
|
-
this.socket.on(Commands.STOP_CONTAINER, this.Stop.bind(this))
|
|
22
|
-
this.socket.on(Commands.CLEAN_CONTAINER, this.Clean.bind(this))
|
|
23
|
-
this.socket.on('disconnect', this.Clean.bind(this))
|
|
24
|
-
this.socket.on('error', this.Clean.bind(this))
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
Build (caps = {}, sources = {}, env = {}) {
|
|
29
|
-
debug(`Build ${JSON.stringify(caps)}, ${JSON.stringify(sources)}, ${JSON.stringify(env)}`)
|
|
30
|
-
|
|
31
|
-
return new Promise((resolve, reject) => {
|
|
32
|
-
if (this.driver || this.container) {
|
|
33
|
-
if (this.socket) {
|
|
34
|
-
this.socket.emit(Events.CONTAINER_BUILD_ERROR, 'build already called')
|
|
35
|
-
}
|
|
36
|
-
return reject(new Error('build already called'))
|
|
37
|
-
}
|
|
38
|
-
delete caps[Capabilities.BOTIUMGRIDURL]
|
|
39
|
-
caps[Capabilities.BOTIUMGRIDSLOT] = this.args.slot
|
|
40
|
-
|
|
41
|
-
this.driver = new BotDriver(caps, sources, env)
|
|
42
|
-
if (this.socket) {
|
|
43
|
-
this.driver.on(Events.CONTAINER_BUILDING, () => this.socket.emit(Events.CONTAINER_BUILDING))
|
|
44
|
-
this.driver.on(Events.CONTAINER_BUILT, () => this.socket.emit(Events.CONTAINER_BUILT))
|
|
45
|
-
this.driver.on(Events.CONTAINER_BUILD_ERROR, (err) => this.socket.emit(Events.CONTAINER_BUILD_ERROR, err.message ? err.message : err))
|
|
46
|
-
this.driver.on(Events.CONTAINER_STARTING, () => this.socket.emit(Events.CONTAINER_STARTING))
|
|
47
|
-
this.driver.on(Events.CONTAINER_STARTED, () => this.socket.emit(Events.CONTAINER_STARTED))
|
|
48
|
-
this.driver.on(Events.CONTAINER_START_ERROR, (c, err) => this.socket.emit(Events.CONTAINER_START_ERROR, err.message ? err.message : err))
|
|
49
|
-
this.driver.on(Events.CONTAINER_STOPPING, () => this.socket.emit(Events.CONTAINER_STOPPING))
|
|
50
|
-
this.driver.on(Events.CONTAINER_STOPPED, () => this.socket.emit(Events.CONTAINER_STOPPED))
|
|
51
|
-
this.driver.on(Events.CONTAINER_STOP_ERROR, (c, err) => this.socket.emit(Events.CONTAINER_STOP_ERROR, err.message ? err.message : err))
|
|
52
|
-
this.driver.on(Events.CONTAINER_CLEANING, () => this.socket.emit(Events.CONTAINER_CLEANING))
|
|
53
|
-
this.driver.on(Events.CONTAINER_CLEANED, () => this.socket.emit(Events.CONTAINER_CLEANED))
|
|
54
|
-
this.driver.on(Events.CONTAINER_CLEAN_ERROR, (c, err) => this.socket.emit(Events.CONTAINER_CLEAN_ERROR, err.message ? err.message : err))
|
|
55
|
-
this.driver.on(Events.BOT_CONNECTED, () => this.socket.emit(Events.BOT_CONNECTED))
|
|
56
|
-
this.driver.on(Events.MESSAGE_SENTTOBOT, () => this.socket.emit(Events.MESSAGE_SENTTOBOT))
|
|
57
|
-
this.driver.on(Events.MESSAGE_SENDTOBOT_ERROR, (c, err) => this.socket.emit(Events.MESSAGE_SENDTOBOT_ERROR, err.message ? err.message : err))
|
|
58
|
-
this.driver.on(Events.MESSAGE_RECEIVEDFROMBOT, (c, msg) => this.socket.emit(Events.MESSAGE_RECEIVEDFROMBOT, msg))
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
this.driver.Build()
|
|
62
|
-
.then((container) => {
|
|
63
|
-
debug('Build succeded')
|
|
64
|
-
this.container = container
|
|
65
|
-
resolve()
|
|
66
|
-
})
|
|
67
|
-
.catch((err) => {
|
|
68
|
-
this.driver = null
|
|
69
|
-
this.container = null
|
|
70
|
-
debug(`Build failed ${util.inspect(err)}`)
|
|
71
|
-
reject(err)
|
|
72
|
-
})
|
|
73
|
-
})
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
Start () {
|
|
77
|
-
debug('Start')
|
|
78
|
-
|
|
79
|
-
return new Promise((resolve, reject) => {
|
|
80
|
-
if (!this.container) {
|
|
81
|
-
if (this.socket) {
|
|
82
|
-
this.socket.emit(Events.CONTAINER_START_ERROR, 'container not built')
|
|
83
|
-
}
|
|
84
|
-
return reject(new Error('container not built'))
|
|
85
|
-
}
|
|
86
|
-
this.container.Start()
|
|
87
|
-
.then(() => {
|
|
88
|
-
debug('Start succeded')
|
|
89
|
-
resolve()
|
|
90
|
-
})
|
|
91
|
-
.catch((err) => {
|
|
92
|
-
debug(`Start failed ${util.inspect(err)}`)
|
|
93
|
-
reject(err)
|
|
94
|
-
})
|
|
95
|
-
})
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
RunScript (script) {
|
|
99
|
-
debug('RunScript')
|
|
100
|
-
|
|
101
|
-
return new Promise((resolve, reject) => {
|
|
102
|
-
if (!this.container) {
|
|
103
|
-
if (this.socket) {
|
|
104
|
-
this.socket.emit(Events.CONTAINER_START_ERROR, 'container not built')
|
|
105
|
-
}
|
|
106
|
-
return reject(new Error('container not built'))
|
|
107
|
-
}
|
|
108
|
-
const compiler = this.driver.BuildCompiler()
|
|
109
|
-
compiler.Compile(script, ScriptingConstants.SCRIPTING_FORMAT_TXT, ScriptingConstants.SCRIPTING_TYPE_CONVO)
|
|
110
|
-
async.eachSeries(compiler.convos, (convo, convoDone) => {
|
|
111
|
-
convo.Run(this.container).then(() => convoDone()).catch(convoDone)
|
|
112
|
-
},
|
|
113
|
-
(err) => {
|
|
114
|
-
if (err) return reject(err)
|
|
115
|
-
else resolve()
|
|
116
|
-
})
|
|
117
|
-
})
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
UserSays (msg) {
|
|
121
|
-
debug(`UserSays ${util.inspect(msg)}`)
|
|
122
|
-
|
|
123
|
-
return new Promise((resolve, reject) => {
|
|
124
|
-
if (!this.container) {
|
|
125
|
-
if (this.socket) {
|
|
126
|
-
this.socket.emit(Events.MESSAGE_SENDTOBOT_ERROR, 'container not built')
|
|
127
|
-
}
|
|
128
|
-
return reject(new Error('container not built'))
|
|
129
|
-
}
|
|
130
|
-
this.container.UserSays(msg)
|
|
131
|
-
.then(() => {
|
|
132
|
-
debug('UserSays succeded')
|
|
133
|
-
resolve()
|
|
134
|
-
})
|
|
135
|
-
.catch((err) => {
|
|
136
|
-
debug(`UserSays failed ${util.inspect(err)}`)
|
|
137
|
-
reject(err)
|
|
138
|
-
})
|
|
139
|
-
})
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
WaitBotSays (channel, timeoutMillis) {
|
|
143
|
-
debug(`BotSays ${channel} ${timeoutMillis}`)
|
|
144
|
-
|
|
145
|
-
return new Promise((resolve, reject) => {
|
|
146
|
-
if (!this.container) {
|
|
147
|
-
return reject(new Error('container not built'))
|
|
148
|
-
}
|
|
149
|
-
this.container.WaitBotSays(channel, timeoutMillis)
|
|
150
|
-
.then((botMsg) => {
|
|
151
|
-
debug('WaitBotSays succeded')
|
|
152
|
-
resolve(botMsg)
|
|
153
|
-
})
|
|
154
|
-
.catch((err) => {
|
|
155
|
-
debug(`WaitBotSays failed ${util.inspect(err)}`)
|
|
156
|
-
reject(err)
|
|
157
|
-
})
|
|
158
|
-
})
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
Stop () {
|
|
162
|
-
debug('Stop')
|
|
163
|
-
|
|
164
|
-
return new Promise((resolve, reject) => {
|
|
165
|
-
if (!this.container) {
|
|
166
|
-
if (this.socket) {
|
|
167
|
-
this.socket.emit(Events.CONTAINER_STOP_ERROR, 'container not built')
|
|
168
|
-
}
|
|
169
|
-
return reject(new Error('container not built'))
|
|
170
|
-
}
|
|
171
|
-
this.container.Stop()
|
|
172
|
-
.then(() => {
|
|
173
|
-
debug('Stop succeded')
|
|
174
|
-
resolve()
|
|
175
|
-
})
|
|
176
|
-
.catch((err) => {
|
|
177
|
-
debug(`Stop failed ${util.inspect(err)}`)
|
|
178
|
-
reject(err)
|
|
179
|
-
})
|
|
180
|
-
})
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
Clean () {
|
|
184
|
-
debug('Clean')
|
|
185
|
-
|
|
186
|
-
if (!this.container) return Promise.resolve()
|
|
187
|
-
|
|
188
|
-
return new Promise((resolve, reject) => {
|
|
189
|
-
this.container.Clean()
|
|
190
|
-
.then(() => {
|
|
191
|
-
this.container = null
|
|
192
|
-
this.driver = null
|
|
193
|
-
debug('Clean success')
|
|
194
|
-
resolve()
|
|
195
|
-
})
|
|
196
|
-
.catch((err) => {
|
|
197
|
-
this.container = null
|
|
198
|
-
this.driver = null
|
|
199
|
-
debug(`Clean failed ${util.inspect(err)}`)
|
|
200
|
-
reject(err)
|
|
201
|
-
})
|
|
202
|
-
})
|
|
203
|
-
}
|
|
204
|
-
}
|
package/src/grid/agent/agent.js
DELETED
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
const util = require('util')
|
|
2
|
-
const express = require('express')
|
|
3
|
-
const bodyParser = require('body-parser')
|
|
4
|
-
const http = require('http')
|
|
5
|
-
const ioSocket = require('socket.io')
|
|
6
|
-
const ioAuth = require('socketio-auth')
|
|
7
|
-
const swaggerUi = require('swagger-ui-express')
|
|
8
|
-
const debug = require('debug')('botium-core-agent')
|
|
9
|
-
|
|
10
|
-
const Events = require('../../Events')
|
|
11
|
-
const workerpool = require('./agentworkerpool')
|
|
12
|
-
|
|
13
|
-
const port = process.env.PORT || 46100
|
|
14
|
-
const apiToken = process.env.BOTIUM_API_TOKEN || ''
|
|
15
|
-
if (!apiToken) {
|
|
16
|
-
console.log('WARNING: BOTIUM_API_TOKEN not set, all clients will be accepted')
|
|
17
|
-
} else {
|
|
18
|
-
console.log('Add BOTIUM_API_TOKEN header to all HTTP requests, or BOTIUM_API_TOKEN URL parameter')
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const app = express()
|
|
22
|
-
const server = http.Server(app)
|
|
23
|
-
const io = ioSocket(server)
|
|
24
|
-
|
|
25
|
-
app.use(bodyParser.json())
|
|
26
|
-
app.use(bodyParser.text())
|
|
27
|
-
app.use(bodyParser.urlencoded({ extended: false }))
|
|
28
|
-
app.use('/api/*', (req, res, next) => {
|
|
29
|
-
const clientApiToken = req.headers.BOTIUM_API_TOKEN || req.headers.botium_api_token || req.query.BOTIUM_API_TOKEN || req.query.botium_api_token || req.body.BOTIUM_API_TOKEN || req.body.botium_api_token
|
|
30
|
-
|
|
31
|
-
if (!apiToken || apiToken === clientApiToken) {
|
|
32
|
-
next()
|
|
33
|
-
} else {
|
|
34
|
-
debug('agent client not authenticated, wrong api token or api token not given')
|
|
35
|
-
const err = new Error('apiToken invalid')
|
|
36
|
-
err.code = 401
|
|
37
|
-
next(err)
|
|
38
|
-
}
|
|
39
|
-
})
|
|
40
|
-
app.use('/', require('./routes'))
|
|
41
|
-
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(require('./swagger.json')))
|
|
42
|
-
app.use((err, req, res, next) => {
|
|
43
|
-
debug(`request failed: ${err}`)
|
|
44
|
-
|
|
45
|
-
if (err.message) res.statusMessage = err.message
|
|
46
|
-
|
|
47
|
-
res.status(err.code || 500)
|
|
48
|
-
.json({
|
|
49
|
-
status: 'error',
|
|
50
|
-
message: err.message ? err.message : err
|
|
51
|
-
})
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
app.get('/swagger.json', (req, res) => {
|
|
55
|
-
res.json(require('./swagger.json'))
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
ioAuth(io, {
|
|
59
|
-
authenticate: (socket, data, callback) => {
|
|
60
|
-
debug(`agent client authenticate ${socket.id} - ${JSON.stringify(data)} ...`)
|
|
61
|
-
const clientApiToken = data.apiToken
|
|
62
|
-
|
|
63
|
-
if (!apiToken || apiToken === clientApiToken) {
|
|
64
|
-
debug(`agent client authenticated ${socket.id}`)
|
|
65
|
-
return callback(null, true)
|
|
66
|
-
} else {
|
|
67
|
-
debug(`agent client not authenticated ${socket.id}`)
|
|
68
|
-
return callback(new Error('apiToken invalid'))
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
io.on('connection', (socket) => {
|
|
74
|
-
workerpool.allocate({ socket })
|
|
75
|
-
.then((worker) => {
|
|
76
|
-
debug(`agent client connected ${socket.id}, worker slot ${worker.args.slot}`)
|
|
77
|
-
socket.on('disconnect', () => {
|
|
78
|
-
debug(`agent client disconnected ${socket.id}`)
|
|
79
|
-
workerpool.free(worker)
|
|
80
|
-
})
|
|
81
|
-
socket.on('error', (err) => {
|
|
82
|
-
debug(`agent client error ${socket.id}: ${util.inspect(err)}`)
|
|
83
|
-
workerpool.free(worker)
|
|
84
|
-
})
|
|
85
|
-
})
|
|
86
|
-
.catch(() => {
|
|
87
|
-
socket.emit(Events.TOOMUCHWORKERS_ERROR, 'Maximum worker count exceeded')
|
|
88
|
-
socket.disconnect(true)
|
|
89
|
-
})
|
|
90
|
-
})
|
|
91
|
-
|
|
92
|
-
server.listen(port, () => {
|
|
93
|
-
console.log('Swagger UI available at /api-docs')
|
|
94
|
-
console.log('Swagger definition available at /swagger.json')
|
|
95
|
-
console.log(`listening on *:${port}`)
|
|
96
|
-
})
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
const path = require('path')
|
|
2
|
-
|
|
3
|
-
const AgentWorker = require('./AgentWorker')
|
|
4
|
-
|
|
5
|
-
const agentWorkers = new Array(process.env.BOTIUM_WORKER_COUNT ? parseInt(process.env.BOTIUM_WORKER_COUNT) : 10)
|
|
6
|
-
|
|
7
|
-
const getStatus = () => {
|
|
8
|
-
return {
|
|
9
|
-
software: 'Botium Agent',
|
|
10
|
-
version: require(path.resolve(__dirname, '..', '..', '..', 'package.json')).version,
|
|
11
|
-
maxWorkers: agentWorkers.length,
|
|
12
|
-
currentWorkers: agentWorkers.filter((wp) => wp).length
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const allocate = (workerArgs = {}) => {
|
|
17
|
-
return new Promise((resolve, reject) => {
|
|
18
|
-
const slot = agentWorkers.findIndex((wp) => !wp)
|
|
19
|
-
|
|
20
|
-
if (slot < 0) {
|
|
21
|
-
reject(new Error('no worker slot available'))
|
|
22
|
-
} else {
|
|
23
|
-
const worker = new AgentWorker({ ...workerArgs, slot })
|
|
24
|
-
agentWorkers[slot] = worker
|
|
25
|
-
resolve(worker)
|
|
26
|
-
}
|
|
27
|
-
})
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const get = (slot) => {
|
|
31
|
-
if (agentWorkers[slot]) {
|
|
32
|
-
return Promise.resolve(agentWorkers[slot])
|
|
33
|
-
} else {
|
|
34
|
-
return Promise.reject(new Error(`worker slot ${slot} not available`))
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const free = (worker) => {
|
|
39
|
-
return new Promise((resolve, reject) => {
|
|
40
|
-
worker.Clean()
|
|
41
|
-
.then(() => {
|
|
42
|
-
const slot = agentWorkers.findIndex((wp) => wp === worker)
|
|
43
|
-
|
|
44
|
-
if (slot >= 0) {
|
|
45
|
-
agentWorkers[slot] = null
|
|
46
|
-
}
|
|
47
|
-
resolve()
|
|
48
|
-
})
|
|
49
|
-
.catch(reject)
|
|
50
|
-
})
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
module.exports = {
|
|
54
|
-
getStatus,
|
|
55
|
-
allocate,
|
|
56
|
-
get,
|
|
57
|
-
free
|
|
58
|
-
}
|