925c1bdb33
Similar in function to an xhr request, a textsecure.SyncRequest object is initialized from a message sender and receiver pair and initiates a request for sync from the master device. It later fires a success event when both contacts and groups are done syncing, or a timeout event after one minute. // FREEBIE
118 lines
4.1 KiB
JavaScript
118 lines
4.1 KiB
JavaScript
/*
|
|
* vim: ts=4:sw=4:expandtab
|
|
*/
|
|
|
|
|
|
;(function () {
|
|
'use strict';
|
|
window.textsecure = window.textsecure || {};
|
|
|
|
function SyncRequest(sender, receiver) {
|
|
this.receiver = receiver;
|
|
|
|
this.oncontact = this.onContactSyncComplete.bind(this);
|
|
receiver.addEventListener('contactsync', this.oncontact);
|
|
|
|
this.ongroup = this.onGroupSyncComplete.bind(this);
|
|
receiver.addEventListener('groupsync', this.ongroup);
|
|
|
|
sender.sendRequestContactSyncMessage().then(function() {
|
|
sender.sendRequestGroupSyncMessage();
|
|
});
|
|
this.timeout = setTimout(this.onTimeout.bind(this), 60000);
|
|
}
|
|
|
|
SyncRequest.prototype = {
|
|
constructor: SyncRequest,
|
|
onContactSyncComplete: function() {
|
|
this.contactSync = true;
|
|
this.update();
|
|
},
|
|
onGroupSyncComplete: function() {
|
|
this.groupSync = true;
|
|
this.update();
|
|
},
|
|
update: function() {
|
|
if (this.contactSync && this.groupSync) {
|
|
this.dispatchEvent(new Event('success'));
|
|
this.cleanup();
|
|
}
|
|
},
|
|
onTimeout: function() {
|
|
this.dispatchEvent(new Event('timeout'));
|
|
this.cleanup();
|
|
},
|
|
cleanup: function() {
|
|
clearTimeout(this.timeout);
|
|
this.receiver.removeEventListener('contactsync', this.oncontact);
|
|
this.receiver.removeEventListener('groupSync', this.ongroup);
|
|
delete this.listeners;
|
|
},
|
|
|
|
/* Implements EventTarget */ /// TODO: Dedupe this same code in MessageReceiver
|
|
dispatchEvent: function(ev) {
|
|
if (!(ev instanceof Event)) {
|
|
throw new Error('Expects an event');
|
|
}
|
|
if (this.listeners === null || typeof this.listeners !== 'object') {
|
|
this.listeners = {};
|
|
}
|
|
var listeners = this.listeners[ev.type];
|
|
if (typeof listeners === 'object') {
|
|
for (var i=0; i < listeners.length; ++i) {
|
|
if (typeof listeners[i] === 'function') {
|
|
listeners[i].call(null, ev);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
addEventListener: function(eventName, callback) {
|
|
if (typeof eventName !== 'string') {
|
|
throw new Error('First argument expects a string');
|
|
}
|
|
if (typeof callback !== 'function') {
|
|
throw new Error('Second argument expects a function');
|
|
}
|
|
if (this.listeners === null || typeof this.listeners !== 'object') {
|
|
this.listeners = {};
|
|
}
|
|
var listeners = this.listeners[eventName];
|
|
if (typeof listeners !== 'object') {
|
|
listeners = [];
|
|
}
|
|
listeners.push(callback);
|
|
this.listeners[eventName] = listeners;
|
|
},
|
|
removeEventListener: function(eventName, callback) {
|
|
if (typeof eventName !== 'string') {
|
|
throw new Error('First argument expects a string');
|
|
}
|
|
if (typeof callback !== 'function') {
|
|
throw new Error('Second argument expects a function');
|
|
}
|
|
if (this.listeners === null || typeof this.listeners !== 'object') {
|
|
this.listeners = {};
|
|
}
|
|
var listeners = this.listeners[eventName];
|
|
for (var i=0; i < listeners.length; ++ i) {
|
|
if (listeners[i] === callback) {
|
|
listeners.splice(i, 1);
|
|
return;
|
|
}
|
|
}
|
|
this.listeners[eventName] = listeners;
|
|
}
|
|
};
|
|
|
|
textsecure.SyncRequest = function(sender, receiver) {
|
|
var syncRequest = new SyncRequest(sender, receiver);
|
|
this.addEventListener = syncRequest.addEventListener.bind(syncRequest);
|
|
this.removeEventListener = syncRequest.removeEventListener.bind(syncRequest);
|
|
};
|
|
|
|
textsecure.SyncRequest.prototype = {
|
|
constructor: textsecure.SyncRequest
|
|
};
|
|
|
|
|
|
}());
|