You've already forked matrix-js-sdk
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:
146
lib/client.js
146
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) {
|
||||
|
Reference in New Issue
Block a user