196 lines
4.3 KiB
JavaScript
196 lines
4.3 KiB
JavaScript
// Setup basic express server
|
|
|
|
require('newrelic');
|
|
|
|
var express = require('express');
|
|
var app = express();
|
|
var server = require('http').createServer(app);
|
|
var io = require('socket.io')(server);
|
|
var port = process.env.PORT || 3696;
|
|
var http = require('http');
|
|
var querystring = require('querystring');
|
|
var bodyParser = require('body-parser');
|
|
|
|
var key = 'eoW5Z/nhFNMPjjYI62czeNhaK6x5jgsw94rFrSZnoLpa/fVswc+fJlhK1vi21kk7RHz5Dzvv0XvJkmdmc3ldY7JjmjgsZvVLq0E8x+jXBO9Dtp3tvlndHcj8v3onjP0ghh8vf4oSE1nbGKxsqpTHDpgHP6QLjJb+4vNyWmoDhlEwr4EabditQsALfSUvXJrgXR6JQ3NlDke/1w9mC9X7KEG52VLIZJhGyyPB4Dt2sWEYIXOTahy5PDGPCNxw';
|
|
|
|
server.listen(port, function () {
|
|
console.log('Server listening at port %d', port);
|
|
});
|
|
|
|
app.use(bodyParser.json());
|
|
|
|
var sendBroadcast = function(payload, to, event) {
|
|
|
|
var sockets = {};
|
|
|
|
console.log('recieved broadcast...', to, event, payload);
|
|
|
|
// @todo: prevent duplicate messages
|
|
|
|
if (to.room) {
|
|
if (typeof to.room != 'object') {
|
|
to.room = [to.room];
|
|
}
|
|
|
|
for (var x in to.room) {
|
|
io.to(to.room[x]).emit(to.room[x] + '.' + event, payload);
|
|
continue;
|
|
io.sockets.clients(to.room[x]).forEach(function(socket) {
|
|
if (!sockets[socket.phpsessid]) {
|
|
sockets[socket.phpsessid] = socket;
|
|
}
|
|
});
|
|
|
|
}
|
|
}
|
|
|
|
if (to.admin) {
|
|
if (typeof to.admin != 'object') {
|
|
to.admin = [to.admin];
|
|
}
|
|
|
|
io.sockets.clients().forEach(function(socket) {
|
|
if (to.admin.indexOf(socket.id_admin) > -1) {
|
|
if (!sockets[socket.phpsessid]) {
|
|
sockets[socket.phpsessid] = socket;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
for (var x in sockets) {
|
|
sockets[x].emit(event, payload);
|
|
}
|
|
}
|
|
|
|
|
|
// from php
|
|
app.post('/', function (req, res) {
|
|
if (req.body._key != key) {
|
|
res.status(401).end();
|
|
return;
|
|
}
|
|
|
|
sendBroadcast(req.body.payload, req.body.to, req.body.event);
|
|
|
|
res.send('{"status":"sent"}');
|
|
});
|
|
|
|
app.all('*', function (req, res) {
|
|
res.redirect(302, 'https://cockpit.la/');
|
|
});
|
|
|
|
io.on('connection', function (socket) {
|
|
var addedUser = false;
|
|
console.log('user connected...');
|
|
|
|
socket.events = {};
|
|
|
|
// from socket
|
|
socket.on('event.broadcast', function (payload) {
|
|
sendBroadcast(payload.payload, payload.to, payload.event);
|
|
});
|
|
|
|
socket.on('event.message', function (payload) {
|
|
console.log('recieved message...', payload);
|
|
|
|
if (!payload.url) {
|
|
return;
|
|
}
|
|
|
|
var post = querystring.stringify(payload.data);
|
|
|
|
var options = {
|
|
host: socket.apiHost || 'beta.cockpit.la',
|
|
path: payload.url,
|
|
port: '80',
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/x-www-form-urlencoded',
|
|
'Content-Length': post.length,
|
|
'Cookie': 'PHPSESSID=' + socket.phpsessid + '; token=' + socket.token
|
|
}
|
|
};
|
|
|
|
var complete = function(data) {
|
|
console.log('api response: ', data);
|
|
socket.emit('event.response', data);
|
|
};
|
|
|
|
var req = http.request(options, function(res) {
|
|
console.log('statusCode: ', res.statusCode);
|
|
console.log('headers: ', res.headers);
|
|
|
|
res.setEncoding('utf8');
|
|
var str = '';
|
|
res.on('data', function (chunk) {
|
|
str += chunk;
|
|
});
|
|
res.on('end', function () {
|
|
complete(str);
|
|
});
|
|
});
|
|
|
|
req.on('error', function (err) {
|
|
console.log(err);
|
|
});
|
|
|
|
req.write(post);
|
|
req.end();
|
|
});
|
|
|
|
// listen for events
|
|
socket.on('event.subscribe', function (event) {
|
|
console.log('subscribing to ', event);
|
|
socket.join(event);
|
|
});
|
|
|
|
// stop listening for events
|
|
socket.on('event.unsubscribe', function (event) {
|
|
console.log('unsubscribing to ', event);
|
|
socket.leave(event);
|
|
});
|
|
|
|
// set the auth to be used for authentication
|
|
socket.on('auth', function (payload) {
|
|
socket.phpsessid = payload.phpsessid;
|
|
socket.token = payload.token;
|
|
socket.apiHost = payload.host || 'beta.cockpit.la';
|
|
|
|
var options = {
|
|
host: socket.apiHost,
|
|
path: '/api/config',
|
|
port: '443',
|
|
method: 'GET',
|
|
headers: {
|
|
'Cookie': 'PHPSESSID=' + socket.phpsessid + '; token=' + socket.token
|
|
}
|
|
};
|
|
|
|
var complete = function(data) {
|
|
console.log('config response: ', data);
|
|
if (data.user && data.user.id_admin) {
|
|
socket.id_admin = data.user.id_admin;
|
|
}
|
|
};
|
|
|
|
var req = http.request(options, function(res) {
|
|
console.log('statusCode: ', res.statusCode);
|
|
console.log('headers: ', res.headers);
|
|
|
|
var str = '';
|
|
res.on('data', function (chunk) {
|
|
str += chunk;
|
|
});
|
|
res.on('end', function () {
|
|
complete(str);
|
|
});
|
|
|
|
});
|
|
|
|
req.on('error', function (err) {
|
|
console.log(err);
|
|
});
|
|
|
|
});
|
|
}); |