diff options
-rw-r--r-- | webclient/app.js | 3 | ||||
-rw-r--r-- | webclient/components/matrix/event-stream-service.js | 69 | ||||
-rw-r--r-- | webclient/components/matrix/matrix-service.js | 9 | ||||
-rw-r--r-- | webclient/index.html | 1 | ||||
-rw-r--r-- | webclient/room/room-controller.js | 23 |
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) { |