1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-08-18 05:42:00 +03:00

Merge pull request #36 from matrix-org/kegan/event-stream-js-errors

Wrap /events response processing in a try/catch
This commit is contained in:
Kegsay
2015-11-02 17:13:17 +00:00

View File

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