From ef77c6f989436d8dfe42c46dff78d371ec647098 Mon Sep 17 00:00:00 2001 From: Kegan Dougal Date: Tue, 23 Jun 2015 10:18:13 +0100 Subject: [PATCH] Sync room state when another device joins a room. --- examples/node/app.js | 4 ++-- lib/client.js | 20 +++++++++++++++----- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/examples/node/app.js b/examples/node/app.js index ed512b563..fed06ccf7 100644 --- a/examples/node/app.js +++ b/examples/node/app.js @@ -23,7 +23,7 @@ var rl = readline.createInterface({ terminal: false }); rl.on('line', function(line) { - if (line.indexOf("/enter ") === 0 && !viewingRoom) { + if (line.indexOf("/join ") === 0 && !viewingRoom) { var roomIndex = line.split(" ")[1]; viewingRoom = roomList[roomIndex]; if (viewingRoom.getMember(myUserId).membership === "invite") { @@ -103,7 +103,7 @@ function printHelp() { console.log("Global commands:"); console.log(" '/help' : Show this help."); console.log("Room list index commands:"); - console.log(" '/enter ' Enter a room, e.g. '/enter 5'"); + console.log(" '/join ' Join a room, e.g. '/join 5'"); console.log("Room commands:"); console.log(" '/exit' Return to the room list index."); console.log(" '/members' Show the room member list."); diff --git a/lib/client.js b/lib/client.js index 08e53cc40..88d8da420 100644 --- a/lib/client.js +++ b/lib/client.js @@ -67,6 +67,9 @@ function MatrixClient(opts) { userId: (opts.userId || null) }; this._http = new httpApi.MatrixHttpApi(httpOpts); + this._syncingRooms = { + // room_id: Promise + }; } utils.inherits(MatrixClient, EventEmitter); @@ -1084,9 +1087,9 @@ function _pollForEvents(client) { isBrandNewRoom = true; } - //var wasJoined = room.hasMembershipState( - // self.credentials.userId, "join" - //); + var wasJoined = room.hasMembershipState( + self.credentials.userId, "join" + ); room.addEvents(roomIdToEvents[roomId], "replace"); room.recalculate(self.credentials.userId); @@ -1097,7 +1100,7 @@ function _pollForEvents(client) { self.store.storeRoom(room); self.emit("Room", room); } - /* TODO invite->join trigger roominitialsync + var justJoined = room.hasMembershipState( self.credentials.userId, "join" ); @@ -1106,7 +1109,7 @@ function _pollForEvents(client) { // we've just transitioned into a join state for this room, // so sync state. _syncRoom(self, room); - } */ + } }); } if (data) { @@ -1127,15 +1130,22 @@ function _pollForEvents(client) { } function _syncRoom(client, room) { + if (client._syncingRooms[room.roomId]) { + return client._syncingRooms[room.roomId]; + } var defer = q.defer(); + client._syncingRooms[room.roomId] = defer.promise; client.roomInitialSync(room.roomId, 8).done(function(res) { + room.timeline = []; // blow away any previous messages. _processRoomEvents(room, res.state, res.messages); room.recalculate(client.credentials.userId); client.store.storeRoom(room); client.emit("Room", room); defer.resolve(room); + client._syncingRooms[room.roomId] = undefined; }, function(err) { defer.reject(err); + client._syncingRooms[room.roomId] = undefined; }); return defer.promise; }