-
Notifications
You must be signed in to change notification settings - Fork 0
/
baresipws.js
129 lines (101 loc) · 3.29 KB
/
baresipws.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
"use strict";
process.title = 'baresipws';
var debug=false;
const bsPort = 4444;
const wsPort = 1234;
const host = 'localhost';
const Net = require('net');
const Netstring = require('netstring-stream');
const var_dump = require('var_dump');
const webSocketServer = require('websocket').server;
const http = require('http');
var bsConnStat = 0;
/////////////////////////////////////////////////////////////
///////////////////// WebSocket server for HTTP Page
/////////////////////////////////////////////////////////////
// var history = [ ]; // latest 100 messages
var clients = [ ]; // list of currently connected clients (users)
var server = http.createServer(function(request, response) {
// Not important for us. We're writing WebSocket server,
// not HTTP server
});
var wsServer = new webSocketServer({
httpServer: server
});
server.listen(wsPort, function() {
if (debug) console.log((new Date()) + " Server is listening on port " + wsPort);
});
wsServer.on('request', function(request) {
if (debug) console.log((new Date()) + ' Connection from origin ' + request.origin + '.');
var connection = request.accept(null, request.origin);
var index = clients.push(connection) - 1;
// user disconnected
connection.on('close', function(connection) {
});
connection.on('message', function(message) {
if (message.type === 'utf8') { // accept only text
// first message sent by user is their name
var req = message.utf8Data;
// var json = JSON.parse(req);
if (debug) console.log(">>>>>>>>>>>>>>>>>>> Received from client");
if (debug) var_dump(JSON.parse(req));
var ns = Netstring.write(req);
bsClient.write(ns);
}
});
// user disconnected
});
function broadcast(json) {
var ret = JSON.parse(json);
if (debug) console.log("<<<<<<<<<<<<<<<<<<< Received from Baresip");
if (debug) var_dump(ret);
for (var i=0; i < clients.length; i++) {
clients[i].sendUTF(json);
}
}
/////////////////////////////////////////////////////////////
///////////////////// TCP Client for Baresip
/////////////////////////////////////////////////////////////
var bsClient = new Net.Socket();
bsClient.on('data', function(data) {
var msgs = Netstring.read(data).toString();
var marr = msgs.split("},");
if (marr.length==1) {
broadcast(marr[0]);
} else {
marr.forEach(function(m) {
broadcast(m + "}");
});
}
});
bsClient.on('close', function() {
if (debug) console.log('Connection closed');
bsConnStat = 0;
});
bsClient.on('error',function(error){
if (debug) console.log('Error : ' + error);
});
bsClient.on('timeout',function(){
if (debug) console.log('Socket timed out !');
bsClient.end('Timed out!');
// can call socket.destroy() here too.
});
bsClient.on('end',function(data){
if (debug) console.log('Socket ended from other end!');
if (debug) console.log('End data : ' + data);
})
bsClient.connect(bsPort, host, function() {
if (debug) console.log('Connected to BS, port:' + bsPort);
bsConnStat = 2;
});
var bsConInt = setInterval(bsConnectionCheck, 2000);
function bsConnectionCheck() {
// console.log("Checking bsConnection, status:" + bsConnStat);
if (bsConnStat!=0) return;
bsConnStat = 1;
if (debug) console.log("Attempting connection to baresip..");
bsClient.connect(bsPort, host, function() {
if (debug) console.log('Connected to BS, port:' + bsPort);
bsConnStat = 2;
});
}