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 {
|
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) {
|
||||||
|
Reference in New Issue
Block a user