summary refs log tree commit diff
path: root/webclient/components
diff options
context:
space:
mode:
authorEmmanuel ROHEE <erohee@amdocs.com>2014-09-10 12:01:00 +0200
committerEmmanuel ROHEE <erohee@amdocs.com>2014-09-10 12:01:00 +0200
commitb63dd9506ea286f8bdaffd213fa79a382933eb35 (patch)
tree27e712e450c2db9c027bed4f5e9f688041083dbc /webclient/components
parentMore rst formatting. (diff)
downloadsynapse-b63dd9506ea286f8bdaffd213fa79a382933eb35.tar.xz
Improved requests: pagination is done from the data received in initialSync
Diffstat (limited to 'webclient/components')
-rw-r--r--webclient/components/matrix/event-handler-service.js28
-rw-r--r--webclient/components/matrix/event-stream-service.js9
2 files changed, 31 insertions, 6 deletions
diff --git a/webclient/components/matrix/event-handler-service.js b/webclient/components/matrix/event-handler-service.js
index 94ac91db5e..24d634a28b 100644
--- a/webclient/components/matrix/event-handler-service.js
+++ b/webclient/components/matrix/event-handler-service.js
@@ -55,6 +55,11 @@ angular.module('eventHandlerService', [])
             $rootScope.events.rooms[room_id] = {};
             $rootScope.events.rooms[room_id].messages = [];
             $rootScope.events.rooms[room_id].members = {};
+
+            // Pagination information
+            $rootScope.events.rooms[room_id].pagination = {
+                earliest_token: "END"   // how far back we've paginated
+            }
         }
     };
 
@@ -187,17 +192,21 @@ angular.module('eventHandlerService', [])
         NAME_EVENT: NAME_EVENT,
     
         handleEvent: function(event, isLiveEvent) {
-            // FIXME: event duplication suppression is all broken as the code currently expect to handles
-            // events multiple times to get their side-effects...
-/*            
+            // Avoid duplicated events
+            // Needed for rooms where initialSync has not been done. 
+            // In this case, we do not know where to start pagination. So, it starts from the END
+            // and we can have the same event (ex: joined, invitation) coming from the pagination
+            // AND from the event stream.
+            // FIXME: This workaround should be no more required when /initialSync on a particular room
+            // will be available (as opposite to the global /initialSync done at startup)
             if (eventMap[event.event_id]) {
-                console.log("discarding duplicate event: " + JSON.stringify(event));
+                console.log("discarding duplicate event: " + JSON.stringify(event, undefined, 4));
                 return;
             }
             else {
                 eventMap[event.event_id] = 1;
             }
-*/            
+  
             if (event.type.indexOf('m.call.') === 0) {
                 handleCallEvent(event, isLiveEvent);
             }
@@ -247,6 +256,15 @@ angular.module('eventHandlerService', [])
             }
         },
 
+        // Handle messages from /initialSync or /messages
+        handleRoomMessages: function(room_id, messages, isLiveEvents) {
+            this.handleEvents(messages.chunk);
+
+            // Store how far back we've paginated
+            // This assumes the paginations requests are contiguous and in reverse chronological order
+            $rootScope.events.rooms[room_id].pagination.earliest_token = messages.end;
+        },
+
         handleInitialSyncDone: function(initialSyncData) {
             console.log("# handleInitialSyncDone");
             initialSyncDeferred.resolve(initialSyncData);
diff --git a/webclient/components/matrix/event-stream-service.js b/webclient/components/matrix/event-stream-service.js
index 1bc850a8fa..d7ccc63e89 100644
--- a/webclient/components/matrix/event-stream-service.js
+++ b/webclient/components/matrix/event-stream-service.js
@@ -112,9 +112,16 @@ angular.module('eventStreamService', [])
                 var rooms = response.data.rooms;
                 for (var i = 0; i < rooms.length; ++i) {
                     var room = rooms[i];
+
                     // console.log("got room: " + room.room_id);
                     if ("state" in room) {
-                        eventHandlerService.handleEvents(room.state, false);
+                        //eventHandlerService.handleEvents(room.state, false);
+                    }
+
+                    if ("messages" in room) {
+                        eventHandlerService.handleRoomMessages(room.room_id, room.messages, false);
+                        
+                        console.log(room.messages.start + " - " + room.messages.end);
                     }
                 }