Files
hydra/backend/server.js
2023-06-04 17:42:31 +03:00

131 lines
4.1 KiB
JavaScript
Executable File

// load environmental variables contained in .env file
require('dotenv').config()
const fs = require('fs')
const express = require('express')
const app = express()
// const browserify = require('browserify-middleware')
const path = require('path')
const configureSSL = require('./configure-ssl.js')
var server = configureSSL(app)
//
// TURN server access
var twilio = require('twilio')
//console.log('process', process.env)
if (process.env.TWILIO_SID) {
var twilio_client = new twilio(process.env.TWILIO_SID, process.env.TWILIO_AUTH)
}
var io = require('socket.io')(server)
require('./twitter-gallery.js')(app)
// crear un servidor en puerto 8000
var httpsPort = process.env.HTTPS_PORT !== undefined ? process.env.HTTPS_PORT : 8000
server.listen(httpsPort, function () {
// imprimir la direccion ip en la consola
// console.log('servidor disponible en https://'+myip.getLocalIP4()+':8000')
console.log(`server available at https://localhost:${ httpsPort }`)
})
// look up uuid by entiring socket id
var userFromSocket = {}
// lookup socket id by entering uuid
var socketFromUser = {}
// new connection to websocket server
io.on('connection', function (socket) {
// console.log('new connection', socket.id)
var thisRoom = null
socket.on('join', function (room, _userData) {
thisRoom = room
// console.log('user', JSON.stringify(_userData))
if (_userData.uuid) {
userFromSocket[socket.id] = _userData.uuid
socketFromUser[_userData.uuid] = socket.id
} else {
console.log('no user data!')
}
// Get the list of peers in the room
var peers = io.nsps['/'].adapter.rooms[room] ? Object.keys(io.nsps['/'].adapter.rooms[room].sockets) : []
io.of('/').in(room).clients(function (error, clients) {
if (error) throw error
// console.log(clients) // => [Anw2LatarvGVVXEIAAAD]
})
var peerUuids = peers.map(socketId => userFromSocket[socketId])
// Send them to the client
// socket.emit('ready', socket.id, peerUuids)
if (twilio_client) {
twilio_client.api.accounts(process.env.TWILIO_SID).tokens
.create({})
.then((token) => {
// console.log(token.iceServers)
socket.emit('ready', {
id: socket.id,
peers: peerUuids,
servers: token.iceServers
})
})
} else {
socket.emit('ready', {
id: socket.id,
peers: peerUuids
})
}
// And then add the client to the room
socket.join(room)
// send updated list of peers to all clients in room
// io.sockets.emit('peers', peerUuids);
socket.to(thisRoom).emit('new peer', _userData.uuid)
// console.log('user', JSON.stringify(Object.keys(socketFromUser)))
})
socket.on('broadcast', function (data) {
// io.sockets.emit('broadcast', data)
// console.log('broadcasting', data, socket.room)
// io.sockets.in(socket.room).emit('broadcast', data)
socket.to(thisRoom).emit('broadcast', data)
})
// pass message from one peer to another
socket.on('message', function (data) {
var client = io.sockets.connected[socketFromUser[data.id]]
client && client.emit('message', {
id: userFromSocket[socket.id],
label: socket.label,
message: data.message,
type: data.type
})
})
socket.on('signal', function (data) {
// console.log('forwarding signal ' + JSON.stringify(data))
var client = io.sockets.connected[socketFromUser[data.id]]
client && client.emit('signal', {
id: userFromSocket[socket.id],
label: socket.label,
signal: data.signal
})
})
// TO DO: on disconnect, remove from label dictionary
})
app.use('/api', express.static(path.join(__dirname, '../frontend/hydra-functions/docs')))
app.use('/functions', express.static(path.join(__dirname, '../frontend/hydra-functions/docs')))
app.use('/docs', express.static(path.join(__dirname, '../frontend/hydra-docs')))
app.use('/garden', express.static(path.join(__dirname, '../frontend/hydra-garden/dist')))
app.use('/grants', express.static(path.join(__dirname, '../frontend/hydra-grants/public')))
app.use(express.static(path.join(__dirname, '../frontend/web-editor/public')))