diff --git a/lib/client.js b/lib/client.js index 886c00bc0..c3c4a93b8 100644 --- a/lib/client.js +++ b/lib/client.js @@ -2066,85 +2066,91 @@ function _pollForEvents(client) { else { clearTimeout(timeoutObj); } - var events = []; - if (data) { - events = utils.map(data.chunk, _PojoToMatrixEventMapper(self)); - } - if (!(self.store instanceof StubStore)) { - var roomIdsWithNewInvites = {}; - // bucket events based on room. - var i = 0; - var roomIdToEvents = {}; - for (i = 0; i < events.length; i++) { - var roomId = events[i].getRoomId(); - // possible to have no room ID e.g. for presence events. - if (roomId) { - if (!roomIdToEvents[roomId]) { - roomIdToEvents[roomId] = []; - } - roomIdToEvents[roomId].push(events[i]); - if (events[i].getType() === "m.room.member" && - events[i].getContent().membership === "invite") { - roomIdsWithNewInvites[roomId] = true; - } - } - else if (events[i].getType() === "m.presence") { - var usr = self.store.getUser(events[i].getContent().user_id); - if (usr) { - usr.setPresenceEvent(events[i]); - } - else { - usr = createNewUser(self, events[i].getContent().user_id); - usr.setPresenceEvent(events[i]); - self.store.storeUser(usr); - } - } + try { + var events = []; + if (data) { + events = utils.map(data.chunk, _PojoToMatrixEventMapper(self)); } - - // add events to room - var roomIds = utils.keys(roomIdToEvents); - utils.forEach(roomIds, function(roomId) { - var room = self.store.getRoom(roomId); - var isBrandNewRoom = false; - if (!room) { - room = createNewRoom(self, roomId); - isBrandNewRoom = true; + if (!(self.store instanceof StubStore)) { + var roomIdsWithNewInvites = {}; + // bucket events based on room. + var i = 0; + var roomIdToEvents = {}; + for (i = 0; i < events.length; i++) { + var roomId = events[i].getRoomId(); + // possible to have no room ID e.g. for presence events. + if (roomId) { + if (!roomIdToEvents[roomId]) { + roomIdToEvents[roomId] = []; + } + roomIdToEvents[roomId].push(events[i]); + if (events[i].getType() === "m.room.member" && + events[i].getContent().membership === "invite") { + roomIdsWithNewInvites[roomId] = true; + } + } + else if (events[i].getType() === "m.presence") { + var usr = self.store.getUser(events[i].getContent().user_id); + if (usr) { + usr.setPresenceEvent(events[i]); + } + else { + usr = createNewUser(self, events[i].getContent().user_id); + usr.setPresenceEvent(events[i]); + self.store.storeUser(usr); + } + } } - var wasJoined = room.hasMembershipState( - self.credentials.userId, "join" - ); + // add events to room + var roomIds = utils.keys(roomIdToEvents); + utils.forEach(roomIds, function(roomId) { + var room = self.store.getRoom(roomId); + var isBrandNewRoom = false; + if (!room) { + room = createNewRoom(self, roomId); + isBrandNewRoom = true; + } - room.addEvents(roomIdToEvents[roomId], "replace"); - room.recalculate(self.credentials.userId); + var wasJoined = room.hasMembershipState( + self.credentials.userId, "join" + ); - // store the Room for things like invite events so developers - // can update the UI - if (isBrandNewRoom) { - self.store.storeRoom(room); - self.emit("Room", room); - } + room.addEvents(roomIdToEvents[roomId], "replace"); + room.recalculate(self.credentials.userId); - var justJoined = room.hasMembershipState( - self.credentials.userId, "join" - ); + // store the Room for things like invite events so developers + // can update the UI + if (isBrandNewRoom) { + self.store.storeRoom(room); + self.emit("Room", room); + } - if (!wasJoined && justJoined) { - // we've just transitioned into a join state for this room, - // so sync state. - _syncRoom(self, room); - } - }); + var justJoined = room.hasMembershipState( + self.credentials.userId, "join" + ); - Object.keys(roomIdsWithNewInvites).forEach(function(inviteRoomId) { - _resolveInvites(self, self.store.getRoom(inviteRoomId)); - }); + if (!wasJoined && justJoined) { + // we've just transitioned into a join state for this room, + // so sync state. + _syncRoom(self, room); + } + }); + + Object.keys(roomIdsWithNewInvites).forEach(function(inviteRoomId) { + _resolveInvites(self, self.store.getRoom(inviteRoomId)); + }); + } + if (data) { + self.store.setSyncToken(data.end); + utils.forEach(events, function(e) { + self.emit("event", e); + }); + } } - if (data) { - self.store.setSyncToken(data.end); - utils.forEach(events, function(e) { - self.emit("event", e); - }); + catch (e) { + console.error("Event stream error:"); + console.error(e); } _pollForEvents(self); }, function(err) {