From 49b51e478fa75b8d5254662de3265edcf8906004 Mon Sep 17 00:00:00 2001 From: Cheng-Han, Wu Date: Wed, 20 Apr 2016 18:03:55 +0800 Subject: Refactor server with Sequelize ORM, refactor server configs, now will show note status (created or updated) and support docs (note alias) --- lib/realtime.js | 675 +++++++++++++++++++++++++------------------------------- 1 file changed, 299 insertions(+), 376 deletions(-) (limited to 'lib/realtime.js') diff --git a/lib/realtime.js b/lib/realtime.js index 081d401e..a8bef97a 100644 --- a/lib/realtime.js +++ b/lib/realtime.js @@ -5,24 +5,19 @@ var cookieParser = require('cookie-parser'); var url = require('url'); var async = require('async'); var LZString = require('lz-string'); -var shortId = require('shortid'); var randomcolor = require("randomcolor"); var Chance = require('chance'), chance = new Chance(); var moment = require('moment'); //core -var config = require("../config.js"); +var config = require("./config.js"); var logger = require("./logger.js"); +var models = require("./models"); //ot var ot = require("./ot/index.js"); -//others -var db = require("./db.js"); -var Note = require("./note.js"); -var User = require("./user.js"); - //public var realtime = { io: null, @@ -72,12 +67,6 @@ function emitCheck(note) { lastchangeuserprofile: note.lastchangeuserprofile }; 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 @@ -88,70 +77,82 @@ var updater = setInterval(function () { async.each(Object.keys(notes), function (key, callback) { var note = notes[key]; if (note.server.isDirty) { - if (config.debug) - logger.info("updater found dirty note: " + key); - updaterUpdateMongo(note, function(err, result) { - if (err) return callback(err, null); - updaterUpdatePostgres(note, function(err, result) { - if (err) return callback(err, null); - callback(null, null); - }); + if (config.debug) logger.info("updater found dirty note: " + key); + updateNote(note, function(err, _note) { + if (!_note) { + realtime.io.to(note.id).emit('info', { + code: 404 + }); + logger.error('note not found: ', note.id); + } + if (err || !_note) { + for (var i = 0, l = note.socks.length; i < l; i++) { + var sock = note.socks[i]; + sock.disconnect(true); + } + return callback(err, null); + } + note.server.isDirty = false; + note.updatetime = moment(_note.lastchangeAt).valueOf(); + emitCheck(note); + return callback(null, null); }); } else { - callback(null, null); + return callback(null, null); } }, function (err) { if (err) return logger.error('updater error', err); }); }, 1000); -function updaterUpdateMongo(note, callback) { - Note.findNote(note.id, function (err, _note) { - if (err || !_note) return callback(err, null); +function updateNote(note, callback) { + models.Note.findOne({ + where: { + id: note.id + } + }).then(function (_note) { + if (!_note) return callback(null, null); if (note.lastchangeuser) { - if (_note.lastchangeuser != note.lastchangeuser) { - var lastchangeuser = note.lastchangeuser; - var lastchangeuserprofile = null; - User.findUser(lastchangeuser, function (err, user) { - if (err) return callback(err, null); - if (user && user.profile) { - var profile = JSON.parse(user.profile); - if (profile) { - lastchangeuserprofile = { - name: profile.displayName || profile.username, - photo: User.parsePhotoByProfile(profile) - } - _note.lastchangeuser = lastchangeuser; - note.lastchangeuserprofile = lastchangeuserprofile; - Note.updateLastChangeUser(_note, lastchangeuser, function (err, result) { - if (err) return callback(err, null); - callback(null, null); - }); - } + if (_note.lastchangeuserId != note.lastchangeuser) { + models.User.findOne({ + where: { + id: note.lastchangeuser } + }).then(function (user) { + if (!user) return callback(null, null); + note.lastchangeuserprofile = models.User.parseProfile(user.profile); + return finishUpdateNote(note, _note, callback); + }).catch(function (err) { + logger.error(err); + return callback(err, null); }); + } else { + return finishUpdateNote(note, _note, callback); } } else { - _note.lastchangeuser = null; note.lastchangeuserprofile = null; - Note.updateLastChangeUser(_note, null, function (err, result) { - if (err) return callback(err, null); - callback(null, null); - }); + return finishUpdateNote(note, _note, callback); } + }).catch(function (err) { + logger.error(err); + return callback(err, null); }); } -function updaterUpdatePostgres(note, callback) { - //postgres update +function finishUpdateNote(note, _note, callback) { var body = note.server.document; - var title = Note.getNoteTitle(body); + var title = models.Note.parseNoteTitle(body); title = LZString.compressToBase64(title); body = LZString.compressToBase64(body); - db.saveToDB(note.id, title, body, function (err, result) { - if (err) return callback(err, null); - note.server.isDirty = false; - note.updatetime = Date.now(); - emitCheck(note); - callback(null, null); + var values = { + title: title, + content: body, + lastchangeuserId: note.lastchangeuser, + lastchangeAt: Date.now() + }; + _note.update(values).then(function (_note) { + return callback(null, _note); + }).catch(function (err) { + logger.error(err); + return callback(err, null); }); } //clean when user not in any rooms or user not in connected list @@ -170,15 +171,14 @@ var cleaner = setInterval(function () { disconnectSocketQueue.push(socket); disconnect(socket); } - callback(null, null); + return callback(null, null); }, function (err) { if (err) return logger.error('cleaner error', err); }); }, 60000); function getStatus(callback) { - db.countFromDB(function (err, data) { - if (err) return logger.info(err); + models.Note.count().then(function (notecount) { var distinctaddresses = []; var regaddresses = []; var distinctregaddresses = []; @@ -208,58 +208,58 @@ function getStatus(callback) { } } }); - User.getUserCount(function (err, regcount) { - if (err) { - logger.error('get status failed: ' + err); - return; - } - if (callback) - callback({ - onlineNotes: Object.keys(notes).length, - onlineUsers: Object.keys(users).length, - distinctOnlineUsers: distinctaddresses.length, - notesCount: data.rows[0].count, - registeredUsers: regcount, - onlineRegisteredUsers: regaddresses.length, - distinctOnlineRegisteredUsers: distinctregaddresses.length, - isConnectionBusy: isConnectionBusy, - connectionSocketQueueLength: connectionSocketQueue.length, - isDisconnectBusy: isDisconnectBusy, - disconnectSocketQueueLength: disconnectSocketQueue.length - }); + models.User.count().then(function (regcount) { + return callback ? callback({ + onlineNotes: Object.keys(notes).length, + onlineUsers: Object.keys(users).length, + distinctOnlineUsers: distinctaddresses.length, + notesCount: notecount, + registeredUsers: regcount, + onlineRegisteredUsers: regaddresses.length, + distinctOnlineRegisteredUsers: distinctregaddresses.length, + isConnectionBusy: isConnectionBusy, + connectionSocketQueueLength: connectionSocketQueue.length, + isDisconnectBusy: isDisconnectBusy, + disconnectSocketQueueLength: disconnectSocketQueue.length + }) : null; + }).catch(function (err) { + return logger.error('count user failed: ' + err); }); + }).catch(function (err) { + return logger.error('count note failed: ' + err); }); } -function getNotenameFromSocket(socket) { +function extractNoteIdFromSocket(socket) { if (!socket || !socket.handshake || !socket.handshake.headers) { - return; + return false; } var referer = socket.handshake.headers.referer; if (!referer) { - return socket.disconnect(true); + return false; } var hostUrl = url.parse(referer); - var notename = config.urlpath ? hostUrl.pathname.slice(config.urlpath.length + 1, hostUrl.pathname.length).split('/')[1] : hostUrl.pathname.split('/')[1]; - if (notename == config.featuresnotename) { - return notename; - } - if (!Note.checkNoteIdValid(notename)) { - socket.emit('info', { - code: 404 - }); - return socket.disconnect(true); + var noteId = config.urlpath ? hostUrl.pathname.slice(config.urlpath.length + 1, hostUrl.pathname.length).split('/')[1] : hostUrl.pathname.split('/')[1]; + return noteId; +} + +function parseNoteIdFromSocket(socket, callback) { + var noteId = extractNoteIdFromSocket(socket); + if (!noteId) { + return callback(null, null); } - notename = LZString.decompressFromBase64(notename); - return notename; + models.Note.parseNoteId(noteId, function (err, id) { + if (err || !id) return callback(err, id); + return callback(null, id); + }); } function emitOnlineUsers(socket) { - var notename = getNotenameFromSocket(socket); - if (!notename || !notes[notename]) return; + var noteId = socket.noteId; + if (!noteId || !notes[noteId]) return; var users = []; - Object.keys(notes[notename].users).forEach(function (key) { - var user = notes[notename].users[key]; + Object.keys(notes[noteId].users).forEach(function (key) { + var user = notes[noteId].users[key]; if (user) users.push(buildUserOutData(user)); }); @@ -267,35 +267,20 @@ 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); - }; - */ + realtime.io.to(noteId).emit('online users', out); } function emitUserStatus(socket) { - var notename = getNotenameFromSocket(socket); - if (!notename || !notes[notename]) return; + var noteId = socket.noteId; + if (!noteId || !notes[noteId]) 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); - } - }; - */ + socket.broadcast.to(noteId).emit('user status', out); } function emitRefresh(socket) { - var notename = getNotenameFromSocket(socket); - if (!notename || !notes[notename]) return; - var note = notes[notename]; + var noteId = socket.noteId; + if (!noteId || !notes[noteId]) return; + var note = notes[noteId]; socket.emit('refresh', { docmaxlength: config.documentmaxlength, owner: note.owner, @@ -326,15 +311,10 @@ function finishConnection(socket, note, user) { if (!socket || !note || !user) return; //check view permission if (note.permission == 'private') { - if (socket.request.user && socket.request.user.logged_in && socket.request.user._id == note.owner) { + if (socket.request.user && socket.request.user.logged_in && socket.request.user.id == note.owner) { //na } else { - socket.emit('info', { - code: 403 - }); - clearSocketQueue(connectionSocketQueue, socket); - isConnectionBusy = false; - return socket.disconnect(true); + return failConnection(403, 'connection forbidden', socket); } } note.users[socket.id] = user; @@ -354,8 +334,8 @@ function finishConnection(socket, note, user) { startConnection(connectionSocketQueue[0]); if (config.debug) { - var notename = getNotenameFromSocket(socket); - logger.info('SERVER connected a client to [' + notename + ']:'); + var noteId = socket.noteId; + logger.info('SERVER connected a client to [' + noteId + ']:'); logger.info(JSON.stringify(user)); //logger.info(notes); getStatus(function (data) { @@ -367,117 +347,76 @@ function finishConnection(socket, note, user) { function startConnection(socket) { if (isConnectionBusy) return; isConnectionBusy = true; + + var noteId = socket.noteId; + if (!noteId) { + return failConnection(404, 'note id not found', socket); + } - var notename = getNotenameFromSocket(socket); - if (!notename) { - clearSocketQueue(connectionSocketQueue, socket); - isConnectionBusy = false; - return; - } - - if (!notes[notename]) { - db.readFromDB(notename, function (err, data) { - if (err) { - socket.emit('info', { - code: 404 - }); - socket.disconnect(true); - //clear err socket in queue - clearSocketQueue(connectionSocketQueue, socket); - isConnectionBusy = false; - return logger.error(err); + if (!notes[noteId]) { + var include = [{ + model: models.User, + as: "owner" + }, { + model: models.User, + as: "lastchangeuser" + }]; + + models.Note.findOne({ + where: { + id: noteId + }, + include: include + }).then(function (note) { + if (!note) { + return failConnection(404, 'note not found', socket); } - - var owner = data.rows[0].owner; - var ownerprofile = null; - - //find or new note - Note.findOrNewNote(notename, owner, function (err, note) { - if (err) { - socket.emit('info', { - code: 404 - }); - socket.disconnect(true); - clearSocketQueue(connectionSocketQueue, socket); - isConnectionBusy = false; - return logger.error(err); - } - - var body = LZString.decompressFromBase64(data.rows[0].content); - //body = LZString.compressToUTF16(body); - var createtime = data.rows[0].create_time; - var updatetime = data.rows[0].update_time; - var server = new ot.EditorSocketIOServer(body, [], notename, ifMayEdit); - - var lastchangeuser = note.lastchangeuser || null; - var lastchangeuserprofile = null; - - notes[notename] = { - id: notename, - owner: owner, - ownerprofile: ownerprofile, - permission: note.permission, - lastchangeuser: lastchangeuser, - lastchangeuserprofile: lastchangeuserprofile, - socks: [], - users: {}, - createtime: moment(createtime).valueOf(), - updatetime: moment(updatetime).valueOf(), - server: server - }; - - async.parallel([ - function getlastchangeuser(callback) { - if (lastchangeuser) { - //find last change user profile if lastchangeuser exists - User.findUser(lastchangeuser, function (err, user) { - if (!err && user && user.profile) { - var profile = JSON.parse(user.profile); - if (profile) { - lastchangeuserprofile = { - name: profile.displayName || profile.username, - photo: User.parsePhotoByProfile(profile) - } - notes[notename].lastchangeuserprofile = lastchangeuserprofile; - } - } - callback(null, null); - }); - } else { - callback(null, null); - } - }, - function getowner(callback) { - if (owner && owner != "null") { - //find owner profile if owner exists - User.findUser(owner, function (err, user) { - if (!err && user && user.profile) { - var profile = JSON.parse(user.profile); - if (profile) { - ownerprofile = { - name: profile.displayName || profile.username, - photo: User.parsePhotoByProfile(profile) - } - notes[notename].ownerprofile = ownerprofile; - } - } - callback(null, null); - }); - } else { - callback(null, null); - } - } - ], function(err, results){ - if (err) return; - finishConnection(socket, notes[notename], users[socket.id]); - }); - }); + var owner = note.ownerId; + var ownerprofile = note.owner ? models.User.parseProfile(note.owner.profile) : null; + + var lastchangeuser = note.lastchangeuserId; + var lastchangeuserprofile = note.lastchangeuser ? models.User.parseProfile(note.lastchangeuser.profile) : null; + + var body = LZString.decompressFromBase64(note.content); + var createtime = note.createdAt; + var updatetime = note.lastchangeAt; + var server = new ot.EditorSocketIOServer(body, [], noteId, ifMayEdit); + + notes[noteId] = { + id: noteId, + owner: owner, + ownerprofile: ownerprofile, + permission: note.permission, + lastchangeuser: lastchangeuser, + lastchangeuserprofile: lastchangeuserprofile, + socks: [], + users: {}, + createtime: moment(createtime).valueOf(), + updatetime: moment(updatetime).valueOf(), + server: server + }; + + return finishConnection(socket, notes[noteId], users[socket.id]); + }).catch(function (err) { + return failConnection(500, err, socket); }); } else { - finishConnection(socket, notes[notename], users[socket.id]); + return finishConnection(socket, notes[noteId], users[socket.id]); } } +function failConnection(code, err, socket) { + logger.error(err); + // clear error socket in queue + clearSocketQueue(connectionSocketQueue, socket); + isConnectionBusy = false; + // emit error info + socket.emit('info', { + code: code + }); + return socket.disconnect(true); +} + function disconnect(socket) { if (isDisconnectBusy) return; isDisconnectBusy = true; @@ -490,8 +429,8 @@ function disconnect(socket) { if (users[socket.id]) { delete users[socket.id]; } - var notename = getNotenameFromSocket(socket); - var note = notes[notename]; + var noteId = socket.noteId; + var note = notes[noteId]; if (note) { delete note.users[socket.id]; do { @@ -502,22 +441,18 @@ function disconnect(socket) { } while (index != -1); if (Object.keys(note.users).length <= 0) { if (note.server.isDirty) { - var body = note.server.document; - var title = Note.getNoteTitle(body); - title = LZString.compressToBase64(title); - body = LZString.compressToBase64(body); - db.saveToDB(notename, title, body, - function (err, result) { - delete notes[notename]; - if (config.debug) { - //logger.info(notes); - getStatus(function (data) { - logger.info(JSON.stringify(data)); - }); - } - }); + updateNote(note, function (err, _note) { + if (err) return logger.error('disconnect note failed: ' + err); + delete notes[noteId]; + if (config.debug) { + //logger.info(notes); + getStatus(function (data) { + logger.info(JSON.stringify(data)); + }); + } + }); } else { - delete notes[notename]; + delete notes[noteId]; } } } @@ -556,10 +491,10 @@ function buildUserOutData(user) { function updateUserData(socket, user) { //retrieve user data from passport if (socket.request.user && socket.request.user.logged_in) { - var profile = JSON.parse(socket.request.user.profile); - user.photo = User.parsePhotoByProfile(profile); - user.name = profile.displayName || profile.username; - user.userid = socket.request.user._id; + var profile = models.User.parseProfile(socket.request.user.profile); + user.photo = profile.photo; + user.name = profile.name; + user.userid = socket.request.user.id; user.login = true; } else { user.userid = null; @@ -569,9 +504,9 @@ function updateUserData(socket, user) { } function ifMayEdit(socket, callback) { - var notename = getNotenameFromSocket(socket); - if (!notename || !notes[notename]) return; - var note = notes[notename]; + var noteId = socket.noteId; + if (!noteId || !notes[noteId]) return; + var note = notes[noteId]; var mayEdit = true; switch (note.permission) { case "freely": @@ -584,69 +519,78 @@ function ifMayEdit(socket, callback) { break; case "locked": case "private": //only owner can change - if (note.owner != socket.request.user._id) + if (note.owner != socket.request.user.id) mayEdit = false; break; } //if user may edit and this note have owner (not anonymous usage) - if (socket.origin == 'operation' && mayEdit && note.owner && note.owner != "null") { + if (socket.origin == 'operation' && mayEdit && note.owner) { //save for the last change user id if (socket.request.user && socket.request.user.logged_in) { - note.lastchangeuser = socket.request.user._id; + note.lastchangeuser = socket.request.user.id; } else { note.lastchangeuser = null; } } - callback(mayEdit); + return callback(mayEdit); } function connection(socket) { - //split notename from socket - var notename = getNotenameFromSocket(socket); - - //initialize user data - //random color - var color = randomcolor({ - luminosity: 'light' - }); - //make sure color not duplicated or reach max random count - if (notename && notes[notename]) { - var randomcount = 0; - var maxrandomcount = 5; - var found = false; - do { - Object.keys(notes[notename].users).forEach(function (user) { - if (user.color == color) { - found = true; - return; - } - }); - if (found) { - color = randomcolor({ - luminosity: 'light' + parseNoteIdFromSocket(socket, function (err, noteId) { + if (err) { + return failConnection(500, err, socket); + } + if (!noteId) { + return failConnection(404, 'note id not found', socket); + } + + // store noteId in this socket session + socket.noteId = noteId; + + //initialize user data + //random color + var color = randomcolor({ + luminosity: 'light' + }); + //make sure color not duplicated or reach max random count + if (notes[noteId]) { + var randomcount = 0; + var maxrandomcount = 5; + var found = false; + do { + Object.keys(notes[noteId].users).forEach(function (user) { + if (user.color == color) { + found = true; + return; + } }); - randomcount++; - } - } while (found && randomcount < maxrandomcount); - } - //create user data - users[socket.id] = { - id: socket.id, - address: socket.handshake.headers['x-forwarded-for'] || socket.handshake.address, - 'user-agent': socket.handshake.headers['user-agent'], - color: color, - cursor: null, - login: false, - userid: null, - name: null, - idle: false, - type: null - }; - updateUserData(socket, users[socket.id]); + if (found) { + color = randomcolor({ + luminosity: 'light' + }); + randomcount++; + } + } while (found && randomcount < maxrandomcount); + } + //create user data + users[socket.id] = { + id: socket.id, + address: socket.handshake.headers['x-forwarded-for'] || socket.handshake.address, + 'user-agent': socket.handshake.headers['user-agent'], + color: color, + cursor: null, + login: false, + userid: null, + name: null, + idle: false, + type: null + }; + updateUserData(socket, users[socket.id]); - //start connection - connectionSocketQueue.push(socket); - startConnection(socket); + //start connection + connectionSocketQueue.push(socket); + startConnection(socket); + }); //received client refresh request socket.on('refresh', function () { @@ -655,10 +599,10 @@ function connection(socket) { //received user status socket.on('user status', function (data) { - var notename = getNotenameFromSocket(socket); - if (!notename || !notes[notename]) return; + var noteId = socket.noteId; + if (!noteId || !notes[noteId]) return; if (config.debug) - logger.info('SERVER received [' + notename + '] user status from [' + socket.id + ']: ' + JSON.stringify(data)); + logger.info('SERVER received [' + noteId + '] user status from [' + socket.id + ']: ' + JSON.stringify(data)); if (data) { var user = users[socket.id]; user.idle = data.idle; @@ -671,41 +615,44 @@ function connection(socket) { socket.on('permission', function (permission) { //need login to do more actions if (socket.request.user && socket.request.user.logged_in) { - var notename = getNotenameFromSocket(socket); - if (!notename || !notes[notename]) return; - var note = notes[notename]; + var noteId = socket.noteId; + if (!noteId || !notes[noteId]) return; + var note = notes[noteId]; //Only owner can change permission - if (note.owner == socket.request.user._id) { + if (note.owner == socket.request.user.id) { note.permission = permission; - Note.findNote(notename, function (err, _note) { - if (err || !_note) { + models.Note.update({ + permission: permission + }, { + where: { + id: noteId + } + }).then(function (count) { + if (!count) { return; } - Note.updatePermission(_note, permission, function (err, _note) { - if (err || !_note) { - return; - } - 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]; - if (typeof sock !== 'undefined' && sock) { - //check view permission - if (permission == 'private') { - if (sock.request.user && sock.request.user.logged_in && sock.request.user._id == note.owner) { - //na - } else { - sock.emit('info', { - code: 403 - }); - return sock.disconnect(true); - } + 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]; + if (typeof sock !== 'undefined' && sock) { + //check view permission + if (permission == 'private') { + if (sock.request.user && sock.request.user.logged_in && sock.request.user.id == note.owner) { + //na + } else { + sock.emit('info', { + code: 403 + }); + return sock.disconnect(true); } } } - }); + } + }).catch(function (err) { + return logger.error('update note permission failed: ' + err); }); } } @@ -714,19 +661,19 @@ function connection(socket) { //reveiced when user logout or changed socket.on('user changed', function () { logger.info('user changed'); - var notename = getNotenameFromSocket(socket); - if (!notename || !notes[notename]) return; - updateUserData(socket, notes[notename].users[socket.id]); + var noteId = socket.noteId; + if (!noteId || !notes[noteId]) return; + updateUserData(socket, notes[noteId].users[socket.id]); emitOnlineUsers(socket); }); //received sync of online users request socket.on('online users', function () { - var notename = getNotenameFromSocket(socket); - if (!notename || !notes[notename]) return; + var noteId = socket.noteId; + if (!noteId || !notes[noteId]) return; var users = []; - Object.keys(notes[notename].users).forEach(function (key) { - var user = notes[notename].users[key]; + Object.keys(notes[noteId].users).forEach(function (key) { + var user = notes[noteId].users[key]; if (user) users.push(buildUserOutData(user)); }); @@ -744,55 +691,31 @@ function connection(socket) { //received cursor focus socket.on('cursor focus', function (data) { - var notename = getNotenameFromSocket(socket); - if (!notename || !notes[notename]) return; + var noteId = socket.noteId; + if (!noteId || !notes[noteId]) 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); - } - }; - */ + socket.broadcast.to(noteId).emit('cursor focus', out); }); //received cursor activity socket.on('cursor activity', function (data) { - var notename = getNotenameFromSocket(socket); - if (!notename || !notes[notename]) return; + var noteId = socket.noteId; + if (!noteId || !notes[noteId]) 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); - } - }; - */ + socket.broadcast.to(noteId).emit('cursor activity', out); }); //received cursor blur socket.on('cursor blur', function () { - var notename = getNotenameFromSocket(socket); - if (!notename || !notes[notename]) return; + var noteId = socket.noteId; + if (!noteId || !notes[noteId]) return; users[socket.id].cursor = null; 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); - } - }; - */ + socket.broadcast.to(noteId).emit('cursor blur', out); }); //when a new client disconnect -- cgit v1.2.3