platypush-app/service/server.js

70 lines
1.8 KiB
JavaScript

const WebSocketServer = require('websocket').server
const http = require('http')
const bonjour = require('bonjour')()
const sockets = new Set()
const services = {}
const server = http.createServer(function(request, response) {
console.log((new Date()) + ' Received request for ' + request.url)
response.writeHead(404)
response.end()
})
server.listen(3080, '127.0.0.1', () => {
console.log((new Date()) + ' Server is listening on port 3080')
})
wsServer = new WebSocketServer({
httpServer: server,
autoAcceptConnections: false,
})
function originIsAllowed() {
return true
}
wsServer.on('request', (request) => {
if (!originIsAllowed(request.origin)) {
request.reject()
console.log((new Date()) + ' Connection from origin ' + request.origin + ' rejected.')
return
}
const connection = request.accept('', request.origin)
sockets.add(connection)
sendServiceInfo(connection)
console.log((new Date()) + ' Connection accepted.')
connection.on('message', function(message) {
if (message.type === 'utf8') {
console.log('Received Message: ' + message.utf8Data)
if (message.utf8Data === 'sync')
sendServiceInfo(connection)
}
})
connection.on('close', function() {
console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.')
})
})
function sendServiceInfo(sock, service) {
const srvs = service ? [service] : Object.values(services)
for (const srv of srvs)
sock.sendUTF(JSON.stringify(srv))
}
function discoverServices() {
bonjour.find({type: 'platypush-http'}, (service) => {
services[service.name] = service
for (const socket of sockets) {
sendServiceInfo(socket, service)
}
})
}
discoverServices()