@@ -5,10 +5,11 @@ var express = require('express'), app = express();
5
5
var server = http . createServer ( app ) . listen ( port ) ;
6
6
var jade = require ( 'jade' ) ;
7
7
var io = require ( 'socket.io' ) . listen ( server ) ;
8
- var os = require ( 'os' )
8
+ var os = require ( 'os' ) ;
9
+ var redis = require ( "redis" ) ,
10
+ redisClient = redis . createClient ( ) ;
9
11
10
- var drawActionStack = [ ] ;
11
- var connectedClients = 0 ;
12
+ var localConnectedClients = 0 ;
12
13
var clients = { } ;
13
14
var netUsage = 0 ;
14
15
@@ -27,11 +28,27 @@ app.get('/', function(req, res){
27
28
28
29
io . set ( "log level" , 1 ) ;
29
30
31
+ redisClient . on ( "error" , function ( err ) {
32
+ console . log ( "Redis Error: " + err ) ;
33
+ } ) ;
34
+
35
+ //set client connection key if not exists
36
+ redisClient . setnx ( "clientcount" , 0 ) ;
37
+
30
38
io . sockets . on ( 'connection' , function ( socket ) {
39
+ var drawActions = [ ] ;
40
+ localConnectedClients += 1 ;
41
+ redisClient . incr ( "clientcount" ) ;
31
42
32
- connectedClients += 1 ;
33
- socket . emit ( 'drawActionHistory' , drawActionStack ) ;
34
- netUsage += sizeof ( drawActionStack ) ;
43
+ redisClient . lrange ( "drawactions" , 0 , - 1 , function ( err , replies ) {
44
+ replies . forEach ( function ( reply , i ) {
45
+ drawActions . push ( JSON . parse ( reply ) ) ;
46
+ } ) ;
47
+
48
+ //send data
49
+ socket . emit ( 'drawActionHistory' , drawActions ) ;
50
+ netUsage += sizeof ( drawActions ) ;
51
+ } ) ;
35
52
36
53
socket . on ( 'mousemove' , function ( data ) {
37
54
if ( data . id in clients ) {
@@ -45,7 +62,9 @@ io.sockets.on('connection', function(socket){
45
62
toY : data . y ,
46
63
color : data . color
47
64
} ;
48
- drawActionStack . push ( drawAction ) ;
65
+
66
+ redisClient . rpush ( "drawactions" ,
67
+ JSON . stringify ( drawAction ) ) ;
49
68
}
50
69
51
70
} else {
@@ -59,13 +78,14 @@ io.sockets.on('connection', function(socket){
59
78
clients [ data . id ] . x = data . x ;
60
79
clients [ data . id ] . y = data . y ;
61
80
62
- netUsage += sizeof ( data ) * connectedClients ;
81
+ netUsage += sizeof ( data ) * localConnectedClients ;
63
82
socket . broadcast . emit ( 'moving' , data ) ;
64
83
} ) ;
65
84
66
85
socket . on ( 'chatmessage' , function ( data ) {
67
- netUsage += sizeof ( data ) * connectedClients ;
68
- data . message = data . message . replace ( / ( < ( [ ^ > ] + ) > ) / ig, "" ) ; //take out possible tags.
86
+ netUsage += sizeof ( data ) * localConnectedClients ;
87
+ //take out possible tags.
88
+ data . message = data . message . replace ( / ( < ( [ ^ > ] + ) > ) / ig, "" ) ;
69
89
//limit chat message length.
70
90
if ( data . message . length <= 135 ) {
71
91
socket . broadcast . emit ( 'chatmessage' , {
@@ -75,22 +95,41 @@ io.sockets.on('connection', function(socket){
75
95
}
76
96
} ) ;
77
97
78
- socket . on ( 'ping' , function ( id ) {
98
+ socket . on ( 'stats' , function ( id ) {
99
+ var multi = redisClient . multi ( ) ;
79
100
var data = {
80
- drawStackSize : drawActionStack . length ,
81
- connectedClients : connectedClients ,
82
101
load1 : ( os . loadavg ( ) [ 0 ] ) . toFixed ( 2 ) ,
83
- netUsageKB : ( netUsage / 1000 ) . toFixed ( 1 )
102
+ netUsageKB : ( netUsage / 1000 ) . toFixed ( 1 ) ,
103
+ nodeConnections : localConnectedClients
84
104
} ;
85
- netUsage += sizeof ( data ) ;
86
- socket . emit ( 'pong' , data ) ;
105
+
106
+ multi . llen ( "drawactions" , function ( err , reply ) {
107
+ data [ 'drawStackSize' ] = reply ;
108
+ } ) ;
109
+
110
+ multi . get ( 'clientcount' , function ( err , reply ) {
111
+ data [ 'globalConnectedClients' ] = reply ;
112
+ } ) ;
113
+
114
+ multi . exec ( function ( err , replies ) {
115
+ socket . emit ( 'stats' , data ) ;
116
+ netUsage += sizeof ( data ) ;
117
+ } ) ;
118
+ } ) ;
119
+
120
+ socket . on ( 'ping' , function ( data ) {
121
+ socket . emit ( 'pong' ) ;
87
122
} ) ;
88
123
89
124
socket . on ( 'disconnect' , function ( ) {
90
- connectedClients -- ;
125
+ localConnectedClients -= 1 ;
126
+ redisClient . decr ( "clientcount" ) ;
91
127
} ) ;
92
128
} ) ;
93
129
130
+ /**
131
+ * Get the estimated size of an object in bytes
132
+ */
94
133
function sizeof ( object ) {
95
134
var objectList = [ ] ;
96
135
var stack = [ object ] ;
0 commit comments