DRY up event target implementations
Dedupe event target code and make it extensible. // FREEBIE
This commit is contained in:
parent
925c1bdb33
commit
f7c4fd2fed
5 changed files with 176 additions and 228 deletions
|
@ -54,6 +54,7 @@ module.exports = function(grunt) {
|
|||
'libtextsecure/websocket-resources.js',
|
||||
'libtextsecure/helpers.js',
|
||||
'libtextsecure/stringview.js',
|
||||
'libtextsecure/event_target.js',
|
||||
'libtextsecure/api.js',
|
||||
'libtextsecure/account_manager.js',
|
||||
'libtextsecure/message_receiver.js',
|
||||
|
|
|
@ -36181,6 +36181,86 @@ window.textsecure.utils = function() {
|
|||
};
|
||||
}());
|
||||
|
||||
/*
|
||||
* vim: ts=4:sw=4:expandtab
|
||||
*
|
||||
* Implements EventTarget
|
||||
* https://developer.mozilla.org/en-US/docs/Web/API/EventTarget
|
||||
*
|
||||
*/
|
||||
|
||||
;(function () {
|
||||
'use strict';
|
||||
window.textsecure = window.textsecure || {};
|
||||
|
||||
function EventTarget() {
|
||||
}
|
||||
|
||||
EventTarget.prototype = {
|
||||
constructor: EventTarget,
|
||||
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;
|
||||
},
|
||||
extend: function(obj) {
|
||||
for (var prop in obj) {
|
||||
this[prop] = obj[prop];
|
||||
}
|
||||
return this;
|
||||
}
|
||||
};
|
||||
|
||||
textsecure.EventTarget = EventTarget;
|
||||
}());
|
||||
|
||||
/*
|
||||
* vim: ts=4:sw=4:expandtab
|
||||
*/
|
||||
|
@ -36745,7 +36825,9 @@ function MessageReceiver(url, username, password, signalingKey, attachment_serve
|
|||
this.number = unencoded[0];
|
||||
this.deviceId = unencoded[1];
|
||||
}
|
||||
MessageReceiver.prototype = {
|
||||
|
||||
MessageReceiver.prototype = new textsecure.EventTarget();
|
||||
MessageReceiver.prototype.extend({
|
||||
constructor: MessageReceiver,
|
||||
connect: function() {
|
||||
if (this.socket && this.socket.readyState !== WebSocket.CLOSED) {
|
||||
|
@ -37103,63 +37185,8 @@ MessageReceiver.prototype = {
|
|||
return Promise.all(promises).then(function() {
|
||||
return decrypted;
|
||||
});
|
||||
},
|
||||
|
||||
/* Implements EventTarget */
|
||||
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;
|
||||
}
|
||||
|
||||
};
|
||||
});
|
||||
|
||||
window.textsecure = window.textsecure || {};
|
||||
|
||||
|
@ -37698,10 +37725,11 @@ textsecure.MessageSender.prototype = {
|
|||
sender.sendRequestContactSyncMessage().then(function() {
|
||||
sender.sendRequestGroupSyncMessage();
|
||||
});
|
||||
this.timeout = setTimout(this.onTimeout.bind(this), 60000);
|
||||
this.timeout = setTimeout(this.onTimeout.bind(this), 60000);
|
||||
}
|
||||
|
||||
SyncRequest.prototype = {
|
||||
SyncRequest.prototype = new textsecure.EventTarget();
|
||||
SyncRequest.prototype.extend({
|
||||
constructor: SyncRequest,
|
||||
onContactSyncComplete: function() {
|
||||
this.contactSync = true;
|
||||
|
@ -37726,62 +37754,8 @@ textsecure.MessageSender.prototype = {
|
|||
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);
|
||||
|
|
79
libtextsecure/event_target.js
Normal file
79
libtextsecure/event_target.js
Normal file
|
@ -0,0 +1,79 @@
|
|||
/*
|
||||
* vim: ts=4:sw=4:expandtab
|
||||
*
|
||||
* Implements EventTarget
|
||||
* https://developer.mozilla.org/en-US/docs/Web/API/EventTarget
|
||||
*
|
||||
*/
|
||||
|
||||
;(function () {
|
||||
'use strict';
|
||||
window.textsecure = window.textsecure || {};
|
||||
|
||||
function EventTarget() {
|
||||
}
|
||||
|
||||
EventTarget.prototype = {
|
||||
constructor: EventTarget,
|
||||
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;
|
||||
},
|
||||
extend: function(obj) {
|
||||
for (var prop in obj) {
|
||||
this[prop] = obj[prop];
|
||||
}
|
||||
return this;
|
||||
}
|
||||
};
|
||||
|
||||
textsecure.EventTarget = EventTarget;
|
||||
}());
|
|
@ -13,7 +13,9 @@ function MessageReceiver(url, username, password, signalingKey, attachment_serve
|
|||
this.number = unencoded[0];
|
||||
this.deviceId = unencoded[1];
|
||||
}
|
||||
MessageReceiver.prototype = {
|
||||
|
||||
MessageReceiver.prototype = new textsecure.EventTarget();
|
||||
MessageReceiver.prototype.extend({
|
||||
constructor: MessageReceiver,
|
||||
connect: function() {
|
||||
if (this.socket && this.socket.readyState !== WebSocket.CLOSED) {
|
||||
|
@ -371,63 +373,8 @@ MessageReceiver.prototype = {
|
|||
return Promise.all(promises).then(function() {
|
||||
return decrypted;
|
||||
});
|
||||
},
|
||||
|
||||
/* Implements EventTarget */
|
||||
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;
|
||||
}
|
||||
|
||||
};
|
||||
});
|
||||
|
||||
window.textsecure = window.textsecure || {};
|
||||
|
||||
|
|
|
@ -19,10 +19,11 @@
|
|||
sender.sendRequestContactSyncMessage().then(function() {
|
||||
sender.sendRequestGroupSyncMessage();
|
||||
});
|
||||
this.timeout = setTimout(this.onTimeout.bind(this), 60000);
|
||||
this.timeout = setTimeout(this.onTimeout.bind(this), 60000);
|
||||
}
|
||||
|
||||
SyncRequest.prototype = {
|
||||
SyncRequest.prototype = new textsecure.EventTarget();
|
||||
SyncRequest.prototype.extend({
|
||||
constructor: SyncRequest,
|
||||
onContactSyncComplete: function() {
|
||||
this.contactSync = true;
|
||||
|
@ -47,62 +48,8 @@
|
|||
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);
|
||||
|
|
Loading…
Reference in a new issue