-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
165 lines (138 loc) · 4.69 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
require('dotenv').config()
const express = require('express');
const bodyParser = require('body-parser');
const port = process.env.PORT || 3000;
const sessionManager = require('./sessionManager');
const flowHandler = require('./flowHandler');
const watson = require("./watson");
var HttpDispatcher = require('httpdispatcher');
var dispatcher = new HttpDispatcher();
var WebSocketServer = require('websocket').server;
var http = require('http');
var server = http.createServer(handleRequest);
//Used to location the conversation (will be stored in session for actual implementation)
var conversation_uuid;
//THIS MAY BE A PROBLEM TODO: FIND SERVER.USE ALTERNATIVE
// app.use(bodyParser.json({
// type: 'application/json'
// }));
//Lets use our dispatcher
function handleRequest(request, response) {
try {
//log the request on console
console.log(request.url);
//Dispatch
dispatcher.dispatch(request, response);
} catch (err) {
console.log(err);
}
}
var user;
dispatcher.onGet('/answer', function (req, res) {
var ncco = [];
conversation_uuid = req.params.uuid;
setTimeout(() => {
//If already active session, then calling user is Agent.
if (user && user.greeting) {
ncco = [{
"action": "talk",
"text": "Hello, thank you for servicing this call. " + user.firstName + " " + user.lastName + " is on the line. Its likely " + user.firstName + " is calling about " + user.lastOrder,
"voiceName": "Brian"
},
{
"action": "conversation",
"name": "qmes-conference",
"startOnEnter": "true",
"endOnExit": "true"
}
]
} else {
//IF No active session, get user. Launch IVR.
//Get User
user = sessionManager.getActiveUser(req.params.from);
ncco = [{
"action": "talk",
"text": "Thank you for contacting Q, M, E, S... " + user.greeting,
"voiceName": "Amy",
"bargeIn": true
},
{
"action": "input",
"eventUrl": [process.env.BASE_URL + "ivr"],
"maxDigits": "1",
'timeOut': "7"
}
]
}
res.writeHead(200, {
'Content-Type': 'application/json'
});
res.end(JSON.stringify(ncco), 'binary');
}, 650)
})
dispatcher.onPost('/ivr', function (req, res) {
req.body = JSON.parse(req.body);
console.log("IN IVR: ", req.body);
if (user.lastOrder) {
ncco = flowHandler.handleInput(user, req.body.dtmf);
} else {
ncco = flowHandler.handleUnRegisteredInput(user, req.body.dtmf);
}
res.writeHead(200, {
'Content-Type': 'application/json'
});
res.end(JSON.stringify(ncco), 'binary');
})
//Called back after passing to voice chat session
dispatcher.onGet('/voicechat', function (req, res) {
var ncco = [];
ncco.push({
"action": "talk",
"text": user.firstName + flowHandler.getIntentResponse()
})
ncco.push({
"action": "talk",
"text": "Press 0 to confirm."
})
ncco.push({
"action": "input",
"eventUrl": [process.env.BASE_URL + "ivr"],
"maxDigits": "1",
'timeOut': "7"
})
res.writeHead(200, {
'Content-Type': 'application/json'
});
res.end(JSON.stringify(ncco), 'binary');
})
dispatcher.onPost('/event', function (req, res) {
// res.sendStatus(200);
})
//Handle Watson Below
var wsServer = new WebSocketServer({
httpServer: server,
autoAcceptConnections: true,
});
//Listens for Nexmo websocket audio data. Sends it through Watson Web Socket
wsServer.on('connect', function (connection) {
console.log("***********IN SOCKET ENDPOINT***********", connection)
var watsonSocket;
//Get websocket instance (Open communication with Watson).
watson.launchWatson(conversation_uuid).then(function (ws) {
watsonSocket = ws;
})
connection.on('message', function (message) {
if (message.type === 'utf8') {
console.log("UTF8 AUDIO STREAMING", message);
} else if (watsonSocket && message.type === 'binary' && message.binaryData) {
watsonSocket.send(message.binaryData);
}
});
connection.on('close', function (reasonCode, description) {
console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.');
});
})
// Start server
server.listen(port, () => {
console.log('Express server started on port ' + port);
})