-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.js
130 lines (108 loc) · 2.99 KB
/
server.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
// vars
var fs = require('fs'),
ini = require('ini'),
config = ini.parse(fs.readFileSync('./config.ini', 'utf-8')),
express = require('express'),
app = express(),
port = process.env.PORT || config.server.port,
rooms = [],
rooms_priv = [];
/**
* port: port server
* host: host server
* username: username for authentication
* password: username's password for authentication
* events: this parameter determines whether events are emited.
**/
var ami = new require('asterisk-manager')(config.asterisk.port, config.asterisk.host, config.asterisk.username, config.asterisk.password, true),
ac = require('asterisk-config');
// In case of any connectiviy problems we got you coverd.
ami.keepConnected();
// meetme config
var cb = function(err, obj) {
if (err) {
console.log(err);
} else if (obj) {
//console.log(obj);
//console.log(obj.rooms);
//console.log(typeof obj.rooms.vars.conf);
Object.keys(obj.rooms.vars.conf).forEach(function(key) {
var room = obj.rooms.vars.conf[key];
//console.log(key+" / "+room);
var room_info = room.split(",");
//console.log(room_info);
if (room_info[1] == '0') {
rooms.push(room_info[0]);
} else {
rooms_priv.push(room_info[0]);
}
});
console.log("rooms", rooms);
console.log("rooms_priv", rooms_priv);
}
};
ac.getConfigLocal('/etc/asterisk/meetme.conf', cb, {
varsAsArray: false,
duphandlers: {'conf': 'array'}
});
// express
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
// Generate a v4 UUID (random)
const uuidV4 = require('uuid/v4');
// routes
app.get('/meetmelist/:room', function(req, res) {
//console.log("req", req);
//console.log("res", res);
var room = req.params.room;
console.log("/meetmelist/"+room);
if (rooms_priv.contains(room)) {
res.json({
success: false,
message: 'none public room'
});
return;
}
if (!rooms.contains(room)) {
res.json({
success: false,
message: 'invalid room'
});
return;
}
var uuid = uuidV4();
ami.addListener('managerevent', queryMeetme.bind(null, uuid, res));
// Perform an AMI Action. A list of actions can be found at
// https://wiki.asterisk.org/wiki/display/AST/AMI+Actions
ami.action({
'action': 'meetmelist',
'actionid': uuid,
'conference': room
}, function(err, res) {
});
});
// start express
app.listen(port);
console.log('Server started! At http://localhost:' + port);
var queryMeetme = function(uuid, res, evt) {
/*
console.log("evt", evt);
console.log("uuid", uuid);
console.log("res", res);
*/
if (evt.actionid == uuid && evt.event == 'MeetmeListComplete') {
console.log("evt", evt);
ami.removeListener('managerevent', queryMeetme);
var ret = {
success: true,
listitems: evt.listitems
};
res.json(ret);
}
};
Array.prototype.contains = function(element){
return this.indexOf(element) > -1;
};