forked from MirrorHub/synapse
Added event stream service which neatly blobs together requests / state for the event stream. This depends on matrix service to do the actual hit. Currently this has exactly the same behaviour as before.
This commit is contained in:
parent
c5f2da5875
commit
8bf3994c2e
5 changed files with 91 additions and 14 deletions
|
@ -20,7 +20,8 @@ var matrixWebClient = angular.module('matrixWebClient', [
|
|||
'LoginController',
|
||||
'RoomController',
|
||||
'RoomsController',
|
||||
'matrixService'
|
||||
'matrixService',
|
||||
'eventStreamService'
|
||||
]);
|
||||
|
||||
matrixWebClient.config(['$routeProvider', '$provide', '$httpProvider',
|
||||
|
|
69
webclient/components/matrix/event-stream-service.js
Normal file
69
webclient/components/matrix/event-stream-service.js
Normal file
|
@ -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();
|
||||
}
|
||||
};
|
||||
|
||||
}]);
|
|
@ -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() {
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue