After Aphlict reconnects, ask the server to replay recent messages

Summary:
Fixes T12563. If we've ever seen an "open", mark all future connections as reconnects. When we reconnect, replay recent history.

(Until duplicate messages (T12564) are handled better this may cause some notification duplication.)

Also emit a reconnect event (for T12566) but don't use it yet.

Test Plan: {F4912044}

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T12563

Differential Revision: https://secure.phabricator.com/D17708
This commit is contained in:
epriestley
2017-04-17 14:05:29 -07:00
parent 88157a9442
commit 02194f0fc8
7 changed files with 130 additions and 29 deletions

View File

@@ -16,10 +16,12 @@ JX.install('AphlictClientServer', {
this._server = server;
this._lists = {};
this._adminServers = [];
},
properties: {
logger: null,
adminServers: null
},
members: {
@@ -33,6 +35,20 @@ JX.install('AphlictClientServer', {
return this._lists[instance];
},
getHistory: function(age) {
var results = [];
var servers = this.getAdminServers();
for (var ii = 0; ii < servers.length; ii++) {
var messages = servers[ii].getHistory(age);
for (var jj = 0; jj < messages.length; jj++) {
results.push(messages[jj]);
}
}
return results;
},
log: function() {
var logger = this.getLogger();
if (!logger) {
@@ -117,6 +133,26 @@ JX.install('AphlictClientServer', {
listener.unsubscribe(message.data);
break;
case 'replay':
var age = message.data.age || 60000;
var min_age = (new Date().getTime() - age);
var old_messages = self.getHistory(min_age);
for (var ii = 0; ii < old_messages.length; ii++) {
var old_message = old_messages[ii];
if (!listener.isSubscribedToAny(old_message.subscribers)) {
continue;
}
try {
listener.writeMessage(old_message);
} catch (error) {
break;
}
}
break;
default:
log(
'Unrecognized command "%s".',