summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--webclient/app.js3
-rw-r--r--webclient/components/matrix/event-stream-service.js69
-rw-r--r--webclient/components/matrix/matrix-service.js9
-rw-r--r--webclient/index.html1
-rw-r--r--webclient/room/room-controller.js23
5 files changed, 91 insertions, 14 deletions
diff --git a/webclient/app.js b/webclient/app.js
index 0b613fa206..547431d9b2 100644
--- a/webclient/app.js
+++ b/webclient/app.js
@@ -20,7 +20,8 @@ var matrixWebClient = angular.module('matrixWebClient', [
     'LoginController',
     'RoomController',
     'RoomsController',
-    'matrixService'
+    'matrixService',
+    'eventStreamService'
 ]);
 
 matrixWebClient.config(['$routeProvider', '$provide', '$httpProvider',
diff --git a/webclient/components/matrix/event-stream-service.js b/webclient/components/matrix/event-stream-service.js
new file mode 100644
index 0000000000..0a3a12192b
--- /dev/null
+++ b/webclient/components/matrix/event-stream-service.js
@@ -0,0 +1,69 @@
+/*
+Copyright 2014 matrix.org
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+angular.module('eventStreamService', [])
+.factory('eventStreamService', ['matrixService', function(matrixService) {
+    var settings = {
+        from: "END",
+        to: undefined,
+        limit: undefined,
+        shouldPoll: true
+    };
+    
+    // interrupts the stream. Only valid if there is a stream conneciton 
+    // open.
+    var interrupt = function(shouldPoll) {
+        console.log("[EventStream] interrupt("+shouldPoll+") "+
+                    JSON.stringify(settings));
+    };
+    
+    var saveStreamSettings = function() {
+        localStorage.setItem("streamSettings", JSON.stringify(settings));
+    };
+    
+    return {
+        // resume the stream from whereever it last got up to. Typically used
+        // when the page is opened.
+        resume: function() {
+            console.log("[EventStream] resume "+JSON.stringify(settings));
+            // run the stream from the latest token
+            return matrixService.getEventStream(settings.from, 5000);
+        },
+        
+        // pause the stream. Resuming it will continue from the current position
+        pause: function() {
+            console.log("[EventStream] pause "+JSON.stringify(settings));
+            // kill any running stream
+            interrupt(false);
+            // save the latest token
+            saveStreamSettings();
+        },
+        
+        // stop the stream and wipe the position in the stream. Typically used
+        // when logging out.
+        stop: function() {
+            console.log("[EventStream] stop "+JSON.stringify(settings));
+            // kill any running stream
+            interrupt(false);
+            // clear the latest token
+            settings.from = "END";
+            saveStreamSettings();
+        }
+    };
+
+}]);
diff --git a/webclient/components/matrix/matrix-service.js b/webclient/components/matrix/matrix-service.js
index 6d66111469..0a2d8005b6 100644
--- a/webclient/components/matrix/matrix-service.js
+++ b/webclient/components/matrix/matrix-service.js
@@ -297,6 +297,15 @@ angular.module('matrixService', [])
             return doBaseRequest(config.identityServer, "POST", path, {}, data, headers); 
         },
         
+        // start listening on /events
+        getEventStream: function(from, timeout) {
+            var path = "/events";
+            var params = {
+                from: from,
+                timeout: timeout
+            };
+            return doRequest("GET", path, params);
+        },
         
         // 
         testLogin: function() {
diff --git a/webclient/index.html b/webclient/index.html
index e62ec39669..793b03d108 100644
--- a/webclient/index.html
+++ b/webclient/index.html
@@ -14,6 +14,7 @@
     <script src="room/room-controller.js"></script>
     <script src="rooms/rooms-controller.js"></script>
     <script src="components/matrix/matrix-service.js"></script>
+    <script src="components/matrix/event-stream-service.js"></script>
     <script src="components/fileInput/file-input-directive.js"></script>
     <script src="components/fileUpload/file-upload-service.js"></script>
 </head>
diff --git a/webclient/room/room-controller.js b/webclient/room/room-controller.js
index fb6e2025fc..3f69a12c23 100644
--- a/webclient/room/room-controller.js
+++ b/webclient/room/room-controller.js
@@ -15,8 +15,8 @@ limitations under the License.
 */
 
 angular.module('RoomController', [])
-.controller('RoomController', ['$scope', '$http', '$timeout', '$routeParams', '$location', 'matrixService',
-                               function($scope, $http, $timeout, $routeParams, $location, matrixService) {
+.controller('RoomController', ['$scope', '$http', '$timeout', '$routeParams', '$location', 'matrixService', 'eventStreamService',
+                               function($scope, $http, $timeout, $routeParams, $location, matrixService, eventStreamService) {
    'use strict';
     var MESSAGES_PER_PAGINATION = 10;
     $scope.room_id = $routeParams.room_id;
@@ -83,13 +83,8 @@ angular.module('RoomController', [])
     };
 
     var shortPoll = function() {
-        $http.get(matrixService.config().homeserver + matrixService.prefix + "/events", {
-            "params": {
-                "access_token": matrixService.config().access_token,
-                "from": $scope.state.events_from,
-                "timeout": 5000
-            }})
-            .then(function(response) {
+        eventStreamService.resume().then(
+            function(response) {
                 $scope.state.stream_failure = undefined;
                 console.log("Got response from "+$scope.state.events_from+" to "+response.data.end);
                 $scope.state.events_from = response.data.end;
@@ -103,10 +98,11 @@ angular.module('RoomController', [])
                 else {
                     $timeout(shortPoll, 0);
                 }
-            }, function(response) {
-                $scope.state.stream_failure = response;
+            }, 
+            function(error) {
+                $scope.state.stream_failure = error;
 
-                if (response.status == 403) {
+                if (error.status == 403) {
                     $scope.stopPoll = true;
                 }
                 
@@ -116,7 +112,8 @@ angular.module('RoomController', [])
                 else {
                     $timeout(shortPoll, 5000);
                 }
-            });
+            }
+        );
     };
 
     var updateMemberList = function(chunk) {