-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.js
139 lines (100 loc) · 2.56 KB
/
server.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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
var http = require('http')
, express = require('express')
, app = express()
, port = process.env.PORT || 5000
, partials = require('express-partials')
app.engine('hamlc', require('haml-coffee').__express);
app.use(partials());
app.configure(function() {
app.set('view engine', 'hamlc');
app.set('layout', 'layout');
})
app.use(express.static(__dirname + '/public'));
var server = http.createServer(app).listen(port);
var io = require('socket.io').listen(server);
console.log('http server listening on %d', port);
app.get('/', function(req, res) {
res.render('index', { name: 'Express user' });
})
io.sockets.on('connection', function (socket) {
console.log('websocket connection open');
var name = userNames.getGuestName();
// send the new user their name and a list of users
socket.emit('init', {
name: name,
users: userNames.get()
});
// notify other clients that a new user has joined
socket.broadcast.emit('user:join', {
name: name
});
// broadcast a user's message to other users
socket.on('message:send', function (data) {
socket.broadcast.emit('message:send', {
user: name,
text: data.message
});
});
// validate a user's name change, and broadcast it on success
socket.on('user:name:change', function (data, fn) {
if (userNames.claim(data.name)) {
var oldName = name;
userNames.free(oldName);
name = data.name;
socket.broadcast.emit('user:name:change', {
oldName: oldName,
newName: name
});
fn(true);
} else {
fn(false);
}
});
// clean up when a user leaves, and broadcast it to other users
socket.on('disconnect', function () {
socket.broadcast.emit('user:left', {
name: name
});
userNames.free(name);
});
});
var userNames = (function () {
var names = {};
var claim = function (name) {
if (!name || names[name]) {
return false;
} else {
names[name] = true;
return true;
}
};
// find the lowest unused "guest" name and claim it
var getGuestName = function () {
var name,
nextUserId = 1;
do {
name = 'Guest ' + nextUserId;
nextUserId += 1;
} while (!claim(name));
return name;
};
// serialize claimed names as an array
var get = function () {
var res = [];
for (user in names) {
res.push(user);
}
return res;
};
var free = function (name) {
if (names[name]) {
delete names[name];
}
};
return {
claim: claim,
free: free,
get: get,
getGuestName: getGuestName
};
}());