-
Notifications
You must be signed in to change notification settings - Fork 1
/
sockets.js
103 lines (81 loc) · 2.43 KB
/
sockets.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'
const Database = require('./database')
const dbUrl = process.env.MONGODB_URI || 'mongodb://localhost:27017/itsback'
let socket = require('socket.io')
, Monitor = require('./monitor.js')
, findUrlKey = require('./lib/find-url-key')
module.exports = (app, server) => {
let io = socket.listen(server)
, domainClients = {}
, db = new Database(dbUrl)
, database = db.connect()
, reportedSockets = []
app.on('users', (res) => {
let count = 0
Object.keys(domainClients).forEach((domain) => {
count += domainClients[domain].clients.length
})
res.json(
{ 'labelText': 'users active'
, 'labelColour': '555555'
, 'valueText': count
, 'valueColour': '44cc11'
}
)
})
function removeClient (socket) {
Object.keys(domainClients).forEach((domain) => {
domainClients[domain].removeClient(socket.id)
if (!domainClients[domain].started) {
delete domainClients[domain]
}
})
let index = reportedSockets.indexOf(socket.id)
reportedSockets.splice(index, 1)
}
io.sockets.on('connection', (socket) => {
socket.emit('id', {'id': socket.id})
socket.on('domainValidate', (url) => {
socket.emit('serverUrlKey', findUrlKey(url))
})
socket.on('domainReport', (clientUrlKey) => {
let urlKey = findUrlKey(clientUrlKey)
if (urlKey === null) return
if (reportedSockets.indexOf(socket.id) > -1) return
database.then(() => {
db.addReport(urlKey)
})
domainClients[urlKey].clients.forEach((client) => {
io.to(client.id).emit('reported', urlKey)
})
reportedSockets.push(socket.id)
})
socket.on('domainSubmit', (url) => {
let urlKey = findUrlKey(url)
if (urlKey === null) return
removeClient(socket)
if (!domainClients.hasOwnProperty(urlKey)) {
domainClients[urlKey] = new Monitor(urlKey)
}
domainClients[urlKey].addClient(socket.id, (state) => {
let watching = domainClients[urlKey].clients.length
database.then(() => {
db.findReport(urlKey).then((reported) => {
socket.emit('result',
{ state
, urlKey
, watching
, reported
}
)
})
})
})
})
socket.on('error', console.log)
socket.on('disconnect', () => {
removeClient(socket)
})
})
return domainClients
}