Per-RPC retry support, used when subscribe() can't find an active instance.

This commit is contained in:
Ian Gulliver
2014-05-23 15:32:31 -07:00
parent ba82bf3dee
commit 1e91f5babb
2 changed files with 18 additions and 8 deletions

View File

@@ -469,7 +469,7 @@ Cosmopolite.prototype.sendRPCs_ = function(commands, delay) {
var xhr = new XMLHttpRequest();
xhr.responseType = 'json';
var retryAfterDelay = function() {
var retryAfterDelay = function(newCommands) {
var intDelay =
xhr.getResponseHeader('Retry-After') ||
Math.min(32, Math.max(2, delay || 2));
@@ -477,14 +477,14 @@ Cosmopolite.prototype.sendRPCs_ = function(commands, delay) {
this.loggingPrefix_(),
'RPC failed; will retry in ' + intDelay + ' seconds');
var retry = function() {
this.sendRPCs_(commands, Math.pow(intDelay, 2));
this.sendRPCs_(newCommands, Math.pow(intDelay, 2));
}.bind(this);
window.setTimeout(retry, intDelay * 1000);
}.bind(this);
xhr.addEventListener('load', function(e) {
if (xhr.status != 200) {
retryAfterDelay();
retryAfterDelay(commands);
return;
}
var data = xhr.response;
@@ -517,11 +517,22 @@ Cosmopolite.prototype.sendRPCs_ = function(commands, delay) {
// data.
data['events'].forEach(this.onServerEvent_, this);
var retryCommands = [];
for (var i = 0; i < data['responses'].length; i++) {
var response = data['responses'][i];
if (response['result'] == 'retry') {
retryCommands.push(commands[i]);
continue;
}
if (commands[i]['onSuccess']) {
commands[i]['onSuccess'].bind(this)(data['responses'][i]);
}
}
if (retryCommands.length) {
retryAfterDelay(retryCommands);
}
}.bind(this));
xhr.addEventListener('error', retryAfterDelay);