Refactor messageSender/OutgoingMessage

Move encrypt and transmit to OutgoingMessage
Restore per-number queueing to messageSender

// FREEBIE
This commit is contained in:
lilia 2015-11-17 12:00:41 -08:00
parent adf8445b85
commit 7b6820d2ac
4 changed files with 166 additions and 158 deletions

View file

@ -8,56 +8,6 @@ function MessageSender(url, username, password, attachment_server_url) {
MessageSender.prototype = {
constructor: MessageSender,
// message == DataMessage or ContentMessage proto
encryptToDevices: function(timestamp, number, deviceObjectList, message) {
var legacy = (message instanceof textsecure.protobuf.DataMessage);
var plaintext = message.toArrayBuffer();
var relay = deviceObjectList[0].relay;
for (var i=1; i < deviceObjectList.length; ++i) {
if (deviceObjectList[i].relay !== relay) {
throw new Error("Mismatched relays for number " + number);
}
}
return Promise.all(deviceObjectList.map(function(device) {
return textsecure.protocol_wrapper.encryptMessageFor(device, plaintext).then(function(encryptedMsg) {
return textsecure.protocol_wrapper.getRegistrationId(device.encodedNumber).then(function(registrationId) {
return textsecure.storage.devices.removeTempKeysFromDevice(device.encodedNumber).then(function() {
var json = {
type: encryptedMsg.type,
destinationDeviceId: textsecure.utils.unencodeNumber(device.encodedNumber)[1],
destinationRegistrationId: registrationId,
timestamp: timestamp
};
if (device.relay !== undefined) {
json.relay = device.relay;
}
var content = btoa(encryptedMsg.body);
if (legacy) {
json.body = content;
} else {
json.content = content;
}
return json;
});
});
});
}));
},
transmitMessage: function(number, jsonData) {
return this.server.sendMessages(number, jsonData).catch(function(e) {
if (e.name === 'HTTPError' && (e.code !== 409 && e.code !== 410)) {
// 409 and 410 should bubble and be handled by doSendMessage
// all other network errors can be retried later.
throw new textsecure.SendMessageNetworkError(number, jsonData, e);
}
throw e;
});
},
makeAttachmentPointer: function(attachment) {
if (typeof attachment !== 'object' || attachment == null) {
return Promise.resolve(undefined);
@ -75,14 +25,34 @@ MessageSender.prototype = {
}.bind(this));
},
retransmitMessage: function(number, jsonData, timestamp) {
var outgoing = new OutgoingMessage(this.server);
return outgoing.transmitMessage(number, jsonData, timestamp);
},
tryMessageAgain: function(number, encodedMessage, timestamp) {
var proto = textsecure.protobuf.DataMessage.decode(encodedMessage);
return this.sendIndividualProto(number, proto, timestamp);
},
queueJobForNumber: function(number, runJob) {
var runPrevious = this.pendingMessages[number] || Promise.resolve();
var runCurrent = this.pendingMessages[number] = runPrevious.then(runJob, runJob);
runCurrent.then(function() {
if (this.pendingMessages[number] === runCurrent) {
delete this.pendingMessages[number];
}
}.bind(this));
},
sendMessageProto: function(timestamp, numbers, message, callback) {
var outgoing = new OutgoingMessage(timestamp, numbers, message, callback, this);
outgoing.send();
var outgoing = new OutgoingMessage(this.server, timestamp, numbers, message, callback);
numbers.forEach(function(number) {
this.queueJobForNumber(number, function() {
return outgoing.sendToNumber(number);
});
}.bind(this));
},
sendIndividualProto: function(number, proto, timestamp) {
@ -322,7 +292,7 @@ window.textsecure = window.textsecure || {};
textsecure.MessageSender = function(url, username, password, attachment_server_url) {
var sender = new MessageSender(url, username, password, attachment_server_url);
textsecure.replay.registerFunction(sender.tryMessageAgain.bind(sender), textsecure.replay.Type.ENCRYPT_MESSAGE);
textsecure.replay.registerFunction(sender.transmitMessage.bind(sender), textsecure.replay.Type.TRANSMIT_MESSAGE);
textsecure.replay.registerFunction(sender.retransmitMessage.bind(sender), textsecure.replay.Type.TRANSMIT_MESSAGE);
this.sendRequestGroupSyncMessage = sender.sendRequestGroupSyncMessage .bind(sender);
this.sendRequestContactSyncMessage = sender.sendRequestContactSyncMessage.bind(sender);