From 950d978fe81eace56453894a02526ce252a09d33 Mon Sep 17 00:00:00 2001
From: Wu Cheng-Han <jacky_cute0808@hotmail.com>
Date: Thu, 24 Sep 2015 11:36:41 +0800
Subject: [PATCH] Updated realtime.js, use socket.io built-in broadcast
 function instead self iterate to avoid extra issues

---
 app.js          |  3 +++
 lib/realtime.js | 23 +++++++++++++++++++++++
 2 files changed, 26 insertions(+)

diff --git a/app.js b/app.js
index a19715f..e48bd4b 100644
--- a/app.js
+++ b/app.js
@@ -65,6 +65,9 @@ mongoose.connect(process.env.MONGOLAB_URI || config.mongodbstring);
 var db = require("./lib/db.js");
 var realtime = require("./lib/realtime.js");
 
+//assign socket io to realtime
+realtime.io = io;
+
 //methodOverride
 app.use(methodOverride('_method'));
 
diff --git a/lib/realtime.js b/lib/realtime.js
index 0b5a46b..b5a3b18 100644
--- a/lib/realtime.js
+++ b/lib/realtime.js
@@ -26,6 +26,7 @@ var User = require("./user.js");
 
 //public
 var realtime = {
+    io: null,
     onAuthorizeSuccess: onAuthorizeSuccess,
     onAuthorizeFail: onAuthorizeFail,
     secure: secure,
@@ -67,10 +68,13 @@ function emitCheck(note) {
     var out = {
         updatetime: note.updatetime
     };
+    realtime.io.to(note.id).emit('check', out);
+    /*
     for (var i = 0, l = note.socks.length; i < l; i++) {
         var sock = note.socks[i];
         sock.emit('check', out);
     };
+    */
 }
 
 //actions
@@ -183,23 +187,29 @@ function emitOnlineUsers(socket) {
         users: users
     };
     out = LZString.compressToUTF16(JSON.stringify(out));
+    realtime.io.to(notename).emit('online users', out);
+    /*
     for (var i = 0, l = notes[notename].socks.length; i < l; i++) {
         var sock = notes[notename].socks[i];
         if (sock && out)
             sock.emit('online users', out);
     };
+    */
 }
 
 function emitUserStatus(socket) {
     var notename = getNotenameFromSocket(socket);
     if (!notename || !notes[notename]) return;
     var out = buildUserOutData(users[socket.id]);
+    socket.broadcast.to(notename).emit('user status', out);
+    /*
     for (var i = 0, l = notes[notename].socks.length; i < l; i++) {
         var sock = notes[notename].socks[i];
         if (sock != socket) {
             sock.emit('user status', out);
         }
     };
+    */
 }
 
 function emitRefresh(socket) {
@@ -287,6 +297,7 @@ function startConnection(socket) {
                 var updatetime = data.rows[0].update_time;
                 var server = new ot.EditorSocketIOServer(body, [], notename, ifMayEdit);
                 notes[notename] = {
+                    id: notename,
                     owner: owner,
                     permission: note.permission,
                     socks: [],
@@ -522,10 +533,13 @@ function connection(socket) {
                         var out = {
                             permission: permission
                         };
+                        realtime.io.to(note.id).emit('permission', out);
+                        /*
                         for (var i = 0, l = note.socks.length; i < l; i++) {
                             var sock = note.socks[i];
                             sock.emit('permission', out);
                         };
+                        */
                     });
                 });
             }
@@ -569,12 +583,15 @@ function connection(socket) {
         if (!notename || !notes[notename]) return;
         users[socket.id].cursor = data;
         var out = buildUserOutData(users[socket.id]);
+        socket.broadcast.to(notename).emit('cursor focus', out);
+        /*
         for (var i = 0, l = notes[notename].socks.length; i < l; i++) {
             var sock = notes[notename].socks[i];
             if (sock != socket) {
                 sock.emit('cursor focus', out);
             }
         };
+        */
     });
 
     //received cursor activity
@@ -583,12 +600,15 @@ function connection(socket) {
         if (!notename || !notes[notename]) return;
         users[socket.id].cursor = data;
         var out = buildUserOutData(users[socket.id]);
+        socket.broadcast.to(notename).emit('cursor activity', out);
+        /*
         for (var i = 0, l = notes[notename].socks.length; i < l; i++) {
             var sock = notes[notename].socks[i];
             if (sock != socket) {
                 sock.emit('cursor activity', out);
             }
         };
+        */
     });
 
     //received cursor blur
@@ -599,12 +619,15 @@ function connection(socket) {
         var out = {
             id: socket.id
         };
+        socket.broadcast.to(notename).emit('cursor blur', out);
+        /*
         for (var i = 0, l = notes[notename].socks.length; i < l; i++) {
             var sock = notes[notename].socks[i];
             if (sock != socket) {
                 sock.emit('cursor blur', out);
             }
         };
+        */
     });
 
     //when a new client disconnect