From 3d57b4ce6af0d78c733be4e3046df06eebdbb7bc Mon Sep 17 00:00:00 2001 From: Kegan Dougal Date: Wed, 9 Dec 2015 16:41:36 +0000 Subject: [PATCH] Be paranoid on /sync processing --- lib/sync.js | 45 +++++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/lib/sync.js b/lib/sync.js index 26c604b4e..77146b160 100644 --- a/lib/sync.js +++ b/lib/sync.js @@ -175,20 +175,30 @@ SyncApi.prototype._sync = function(syncOptions, attempt) { // } console.log("Got data %s", data); - // handle presence events (User objects) - if (data.presence && utils.isArray(data.presence.events)) { - data.presence.events.map(client.getEventMapper()).forEach(function(presenceEvent) { - var user = client.store.getUser(presenceEvent.getSender()); - if (user) { - user.setPresenceEvent(presenceEvent); - } - else { - user = createNewUser(client, presenceEvent.getSender()); - user.setPresenceEvent(presenceEvent); - client.store.storeUser(user); - } - client.emit("event", presenceEvent); - }); + // set the sync token NOW *before* processing the events. We do this so if something + // barfs on an event we can skip it rather than constantly polling with the same token. + client.store.setSyncToken(data.next_batch); + + try { + // handle presence events (User objects) + if (data.presence && utils.isArray(data.presence.events)) { + data.presence.events.map(client.getEventMapper()).forEach(function(presenceEvent) { + var user = client.store.getUser(presenceEvent.getSender()); + if (user) { + user.setPresenceEvent(presenceEvent); + } + else { + user = createNewUser(client, presenceEvent.getSender()); + user.setPresenceEvent(presenceEvent); + client.store.storeUser(user); + } + client.emit("event", presenceEvent); + }); + } + } + catch (e) { + console.error("Caught /sync error:"); + console.error(e); } /* @@ -292,11 +302,10 @@ SyncApi.prototype._sync = function(syncOptions, attempt) { }); } + */ + - // assume success until we fail which may be 30+ secs */ - - client.store.setSyncToken(data.next_batch); - + // emit synced events if (!syncOptions.hasSyncedBefore) { updateSyncState(client, "PREPARED"); syncOptions.hasSyncedBefore = true;