forked from vareal-vietnam/webrtc-demo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
103 lines (88 loc) · 2.37 KB
/
index.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
'use strict'
require('dotenv').config()
const crypto = require('crypto')
// Hapi build web services such as JSON API
const Path = require('path')
const Hapi = require('hapi')
const Inert = require('@hapi/inert')
const username = process.env.TURN_USERNAME
const secret = process.env.TURN_SECRET
const server = new Hapi.Server({
// host: process.env.HOST,
port: ~~process.env.PORT
})
// attach Socket.io process to Hapi server
const socketio = require('socket.io')
const io = socketio(server.listener)
// Server static assets
const start = async () => {
await server.register(Inert)
server.route({
method: 'GET',
path: '/{path*}',
handler: {
directory: {
path: './public',
listing: false,
index: true
}
}
})
await server.start()
console.log('Server running at:', server.info.uri)
}
// TURN REST API
const getTurnCredentails = (username, secret) => {
let unixTimeStamp = parseInt(Date.now() / 1000) + 24 * 3600,
name = [unixTimeStamp, username].join(':'),
password,
token,
hmac = crypto.createHmac('sha1', secret)
hmac.setEncoding('base64')
hmac.write(name)
hmac.end()
password = hmac.read()
token = {
name: name,
password: password
}
return token
}
// signaling
io.on('connection', (socket) => {
console.log("LOG: just connected: "+ socket.id)
socket.on('join', (room) => {
console.log('already join')
let clients = io.sockets.adapter.rooms[room]
let numClients = (typeof clients !== 'undefined') ? Object.values(clients)[1] : 0
if (numClients == 0) {
console.log('LOG: numClients = 0')
socket.join(room)
} else if (numClients == 1) {
console.log('LOG: numClients = 1')
socket.join(room)
socket.emit('ready', room)
socket.broadcast.emit('ready', room)
} else {
console.log('LOG: numClients = full')
socket.emit('full', room)
}
})
// TURN server
socket.on('token', () => {
const token = getTurnCredentails(username, secret)
socket.emit('token', token)
})
// send candidate straight on to the other browser
socket.on('candidate', (candidate) => {
socket.broadcast.emit('candidate', candidate)
})
socket.on('offer', (offer) => {
socket.broadcast.emit('offer', offer)
})
socket.on('answer', (answer) => {
socket.broadcast.emit('answer', answer)
})
})
// Start the server
start()