From 406be10f53eeff9798e51d610386c44a9a96b2a3 Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Wed, 24 Dec 2014 18:45:51 -0500 Subject: [PATCH] s/\t/ /g in sendmessage.js --- js/sendmessage.js | 606 +++++++++++++++++++++++----------------------- 1 file changed, 303 insertions(+), 303 deletions(-) diff --git a/js/sendmessage.js b/js/sendmessage.js index 6b4ee46393..25ebd71357 100644 --- a/js/sendmessage.js +++ b/js/sendmessage.js @@ -15,106 +15,106 @@ */ // sendMessage(numbers = [], message = PushMessageContentProto, callback(success/failure map)) window.textsecure.messaging = function() { - 'use strict'; + 'use strict'; - var self = {}; + var self = {}; - function getKeysForNumber(number, updateDevices) { - var handleResult = function(response) { - for (var i in response.devices) { - if (updateDevices === undefined || updateDevices.indexOf(response.devices[i].deviceId) > -1) - textsecure.storage.devices.saveKeysToDeviceObject({ - encodedNumber: number + "." + response.devices[i].deviceId, - identityKey: response.identityKey, - preKey: response.devices[i].preKey.publicKey, - preKeyId: response.devices[i].preKey.keyId, - signedKey: response.devices[i].signedPreKey.publicKey, - signedKeyId: response.devices[i].signedPreKey.keyId, - registrationId: response.devices[i].registrationId - }); - } - }; + function getKeysForNumber(number, updateDevices) { + var handleResult = function(response) { + for (var i in response.devices) { + if (updateDevices === undefined || updateDevices.indexOf(response.devices[i].deviceId) > -1) + textsecure.storage.devices.saveKeysToDeviceObject({ + encodedNumber: number + "." + response.devices[i].deviceId, + identityKey: response.identityKey, + preKey: response.devices[i].preKey.publicKey, + preKeyId: response.devices[i].preKey.keyId, + signedKey: response.devices[i].signedPreKey.publicKey, + signedKeyId: response.devices[i].signedPreKey.keyId, + registrationId: response.devices[i].registrationId + }); + } + }; - var promises = []; - if (updateDevices !== undefined) - for (var i in updateDevices) - promises[promises.length] = textsecure.api.getKeysForNumber(number, updateDevices[i]).then(handleResult); - else - return textsecure.api.getKeysForNumber(number).then(handleResult); + var promises = []; + if (updateDevices !== undefined) + for (var i in updateDevices) + promises[promises.length] = textsecure.api.getKeysForNumber(number, updateDevices[i]).then(handleResult); + else + return textsecure.api.getKeysForNumber(number).then(handleResult); - return Promise.all(promises); - } + return Promise.all(promises); + } - // success_callback(server success/failure map), error_callback(error_msg) - // message == PushMessageContentProto (NOT STRING) - function sendMessageToDevices(timestamp, number, deviceObjectList, message, success_callback, error_callback) { - var jsonData = []; - var relay = undefined; - var promises = []; + // success_callback(server success/failure map), error_callback(error_msg) + // message == PushMessageContentProto (NOT STRING) + function sendMessageToDevices(timestamp, number, deviceObjectList, message, success_callback, error_callback) { + var jsonData = []; + var relay = undefined; + var promises = []; - var addEncryptionFor = function(i) { - if (deviceObjectList[i].relay !== undefined) { - if (relay === undefined) - relay = deviceObjectList[i].relay; - else if (relay != deviceObjectList[i].relay) - return new Promise(function() { throw new Error("Mismatched relays for number " + number); }); - } else { - if (relay === undefined) - relay = ""; - else if (relay != "") - return new Promise(function() { throw new Error("Mismatched relays for number " + number); }); - } + var addEncryptionFor = function(i) { + if (deviceObjectList[i].relay !== undefined) { + if (relay === undefined) + relay = deviceObjectList[i].relay; + else if (relay != deviceObjectList[i].relay) + return new Promise(function() { throw new Error("Mismatched relays for number " + number); }); + } else { + if (relay === undefined) + relay = ""; + else if (relay != "") + return new Promise(function() { throw new Error("Mismatched relays for number " + number); }); + } - return textsecure.protocol.encryptMessageFor(deviceObjectList[i], message).then(function(encryptedMsg) { - jsonData[i] = { - type: encryptedMsg.type, - destinationDeviceId: textsecure.utils.unencodeNumber(deviceObjectList[i].encodedNumber)[1], - destinationRegistrationId: deviceObjectList[i].registrationId, - body: encryptedMsg.body, - timestamp: timestamp - }; + return textsecure.protocol.encryptMessageFor(deviceObjectList[i], message).then(function(encryptedMsg) { + jsonData[i] = { + type: encryptedMsg.type, + destinationDeviceId: textsecure.utils.unencodeNumber(deviceObjectList[i].encodedNumber)[1], + destinationRegistrationId: deviceObjectList[i].registrationId, + body: encryptedMsg.body, + timestamp: timestamp + }; - if (deviceObjectList[i].relay !== undefined) - jsonData[i].relay = deviceObjectList[i].relay; - }); - } + if (deviceObjectList[i].relay !== undefined) + jsonData[i].relay = deviceObjectList[i].relay; + }); + } - for (var i = 0; i < deviceObjectList.length; i++) - promises[i] = addEncryptionFor(i); - return Promise.all(promises).then(function() { - return textsecure.api.sendMessages(number, jsonData); - }); - } + for (var i = 0; i < deviceObjectList.length; i++) + promises[i] = addEncryptionFor(i); + return Promise.all(promises).then(function() { + return textsecure.api.sendMessages(number, jsonData); + }); + } - var sendGroupProto; - var makeAttachmentPointer; - var refreshGroups = function(number) { - var groups = textsecure.storage.groups.getGroupListForNumber(number); - var promises = []; - for (var i in groups) { - var group = textsecure.storage.groups.getGroup(groups[i]); + var sendGroupProto; + var makeAttachmentPointer; + var refreshGroups = function(number) { + var groups = textsecure.storage.groups.getGroupListForNumber(number); + var promises = []; + for (var i in groups) { + var group = textsecure.storage.groups.getGroup(groups[i]); - var proto = new textsecure.protobuf.PushMessageContent(); - proto.group = new textsecure.protobuf.PushMessageContent.GroupContext(); + var proto = new textsecure.protobuf.PushMessageContent(); + proto.group = new textsecure.protobuf.PushMessageContent.GroupContext(); - proto.group.id = toArrayBuffer(group.id); - proto.group.type = textsecure.protobuf.PushMessageContent.GroupContext.Type.UPDATE; - proto.group.members = group.numbers; - proto.group.name = group.name === undefined ? null : group.name; + proto.group.id = toArrayBuffer(group.id); + proto.group.type = textsecure.protobuf.PushMessageContent.GroupContext.Type.UPDATE; + proto.group.members = group.numbers; + proto.group.name = group.name === undefined ? null : group.name; - if (group.avatar !== undefined) { - return makeAttachmentPointer(group.avatar).then(function(attachment) { - proto.group.avatar = attachment; - promises.push(sendGroupProto([number], proto)); - }); - } else { - promises.push(sendGroupProto([number], proto)); - } - } - return Promise.all(promises); - } + if (group.avatar !== undefined) { + return makeAttachmentPointer(group.avatar).then(function(attachment) { + proto.group.avatar = attachment; + promises.push(sendGroupProto([number], proto)); + }); + } else { + promises.push(sendGroupProto([number], proto)); + } + } + return Promise.all(promises); + } - var tryMessageAgain = function(number, encodedMessage, message_id) { + var tryMessageAgain = function(number, encodedMessage, message_id) { var message = new Whisper.MessageCollection().add({id: message_id}); message.fetch().then(function() { textsecure.storage.removeEncrypted("devices" + number); @@ -131,264 +131,264 @@ window.textsecure.messaging = function() { }); }); }); - }; - textsecure.replay.registerFunction(tryMessageAgain, textsecure.replay.Type.SEND_MESSAGE); + }; + textsecure.replay.registerFunction(tryMessageAgain, textsecure.replay.Type.SEND_MESSAGE); - var sendMessageProto = function(timestamp, numbers, message, callback) { - var numbersCompleted = 0; - var errors = []; - var successfulNumbers = []; + var sendMessageProto = function(timestamp, numbers, message, callback) { + var numbersCompleted = 0; + var errors = []; + var successfulNumbers = []; - var numberCompleted = function() { - numbersCompleted++; - if (numbersCompleted >= numbers.length) - callback({success: successfulNumbers, failure: errors}); - } + var numberCompleted = function() { + numbersCompleted++; + if (numbersCompleted >= numbers.length) + callback({success: successfulNumbers, failure: errors}); + } - var registerError = function(number, message, error) { - if (error) { - if (error.humanError) - message = error.humanError; - } else - error = new Error(message); - errors[errors.length] = { number: number, reason: message, error: error }; - numberCompleted(); - } + var registerError = function(number, message, error) { + if (error) { + if (error.humanError) + message = error.humanError; + } else + error = new Error(message); + errors[errors.length] = { number: number, reason: message, error: error }; + numberCompleted(); + } - var doSendMessage; - var reloadDevicesAndSend = function(number, recurse) { - return function() { - var devicesForNumber = textsecure.storage.devices.getDeviceObjectsForNumber(number); - if (devicesForNumber.length == 0) - return registerError(number, "Got empty device list when loading device keys", null); - refreshGroups(number).then(function() { - doSendMessage(number, devicesForNumber, recurse); - }); - } - } + var doSendMessage; + var reloadDevicesAndSend = function(number, recurse) { + return function() { + var devicesForNumber = textsecure.storage.devices.getDeviceObjectsForNumber(number); + if (devicesForNumber.length == 0) + return registerError(number, "Got empty device list when loading device keys", null); + refreshGroups(number).then(function() { + doSendMessage(number, devicesForNumber, recurse); + }); + } + } - doSendMessage = function(number, devicesForNumber, recurse) { - return sendMessageToDevices(timestamp, number, devicesForNumber, message).then(function(result) { - successfulNumbers[successfulNumbers.length] = number; - numberCompleted(); - }).catch(function(error) { - if (error instanceof Error && error.name == "HTTPError" && (error.message == 410 || error.message == 409)) { - if (!recurse) - return registerError(number, "Hit retry limit attempting to reload device list", error); + doSendMessage = function(number, devicesForNumber, recurse) { + return sendMessageToDevices(timestamp, number, devicesForNumber, message).then(function(result) { + successfulNumbers[successfulNumbers.length] = number; + numberCompleted(); + }).catch(function(error) { + if (error instanceof Error && error.name == "HTTPError" && (error.message == 410 || error.message == 409)) { + if (!recurse) + return registerError(number, "Hit retry limit attempting to reload device list", error); - if (error.message == 409) - textsecure.storage.devices.removeDeviceIdsForNumber(number, error.response.extraDevices); + if (error.message == 409) + textsecure.storage.devices.removeDeviceIdsForNumber(number, error.response.extraDevices); - var resetDevices = ((error.message == 410) ? error.response.staleDevices : error.response.missingDevices); - getKeysForNumber(number, resetDevices) - .then(reloadDevicesAndSend(number, false)) - .catch(function(error) { - if (error.message !== "Identity key changed") - registerError(number, "Failed to reload device keys", error); - else { + var resetDevices = ((error.message == 410) ? error.response.staleDevices : error.response.missingDevices); + getKeysForNumber(number, resetDevices) + .then(reloadDevicesAndSend(number, false)) + .catch(function(error) { + if (error.message !== "Identity key changed") + registerError(number, "Failed to reload device keys", error); + else { error = new textsecure.OutgoingIdentityKeyError(number, getString(message.encode())); - registerError(number, "Identity key changed", error); - } - }); - } else - registerError(number, "Failed to create or send message", error); - }); - } + registerError(number, "Identity key changed", error); + } + }); + } else + registerError(number, "Failed to create or send message", error); + }); + } _.each(numbers, function(number) { - var devicesForNumber = textsecure.storage.devices.getDeviceObjectsForNumber(number); + var devicesForNumber = textsecure.storage.devices.getDeviceObjectsForNumber(number); - var promises = []; - for (var j in devicesForNumber) - if (devicesForNumber[j].registrationId === undefined) - promises[promises.length] = getKeysForNumber(number, [parseInt(textsecure.utils.unencodeNumber(devicesForNumber[j].encodedNumber)[1])]); + var promises = []; + for (var j in devicesForNumber) + if (devicesForNumber[j].registrationId === undefined) + promises[promises.length] = getKeysForNumber(number, [parseInt(textsecure.utils.unencodeNumber(devicesForNumber[j].encodedNumber)[1])]); - Promise.all(promises).then(function() { - devicesForNumber = textsecure.storage.devices.getDeviceObjectsForNumber(number); + Promise.all(promises).then(function() { + devicesForNumber = textsecure.storage.devices.getDeviceObjectsForNumber(number); - if (devicesForNumber.length == 0) { - getKeysForNumber(number) - .then(reloadDevicesAndSend(number, true)) - .catch(function(error) { - registerError(number, "Failed to retreive new device keys for number " + number, error); - }); - } else - doSendMessage(number, devicesForNumber, true); - }); - }); - } + if (devicesForNumber.length == 0) { + getKeysForNumber(number) + .then(reloadDevicesAndSend(number, true)) + .catch(function(error) { + registerError(number, "Failed to retreive new device keys for number " + number, error); + }); + } else + doSendMessage(number, devicesForNumber, true); + }); + }); + } - makeAttachmentPointer = function(attachment) { - var proto = new textsecure.protobuf.PushMessageContent.AttachmentPointer(); - proto.key = textsecure.crypto.getRandomBytes(64); + makeAttachmentPointer = function(attachment) { + var proto = new textsecure.protobuf.PushMessageContent.AttachmentPointer(); + proto.key = textsecure.crypto.getRandomBytes(64); - var iv = textsecure.crypto.getRandomBytes(16); - return textsecure.protocol.encryptAttachment(attachment.data, proto.key, iv).then(function(encryptedBin) { - return textsecure.api.putAttachment(encryptedBin).then(function(id) { - proto.id = id; - proto.contentType = attachment.contentType; - return proto; - }); - }); - } + var iv = textsecure.crypto.getRandomBytes(16); + return textsecure.protocol.encryptAttachment(attachment.data, proto.key, iv).then(function(encryptedBin) { + return textsecure.api.putAttachment(encryptedBin).then(function(id) { + proto.id = id; + proto.contentType = attachment.contentType; + return proto; + }); + }); + } - var sendIndividualProto = function(number, proto, timestamp) { - return new Promise(function(resolve, reject) { - sendMessageProto(timestamp, [number], proto, function(res) { - if (res.failure.length > 0) - reject(res.failure); - else - resolve(); - }); - }); - } + var sendIndividualProto = function(number, proto, timestamp) { + return new Promise(function(resolve, reject) { + sendMessageProto(timestamp, [number], proto, function(res) { + if (res.failure.length > 0) + reject(res.failure); + else + resolve(); + }); + }); + } - sendGroupProto = function(numbers, proto, timestamp) { + sendGroupProto = function(numbers, proto, timestamp) { timestamp = timestamp || Date.now(); - var me = textsecure.utils.unencodeNumber(textsecure.storage.getUnencrypted("number_id"))[0]; - numbers = numbers.filter(function(number) { return number != me; }); + var me = textsecure.utils.unencodeNumber(textsecure.storage.getUnencrypted("number_id"))[0]; + numbers = numbers.filter(function(number) { return number != me; }); - return new Promise(function(resolve, reject) { - sendMessageProto(timestamp, numbers, proto, function(res) { - if (res.failure.length > 0) - reject(res.failure); - else - resolve(); - }); - }); - } + return new Promise(function(resolve, reject) { + sendMessageProto(timestamp, numbers, proto, function(res) { + if (res.failure.length > 0) + reject(res.failure); + else + resolve(); + }); + }); + } - self.sendMessageToNumber = function(number, messageText, attachments, timestamp) { - var proto = new textsecure.protobuf.PushMessageContent(); - proto.body = messageText; + self.sendMessageToNumber = function(number, messageText, attachments, timestamp) { + var proto = new textsecure.protobuf.PushMessageContent(); + proto.body = messageText; - var promises = []; - for (var i in attachments) - promises.push(makeAttachmentPointer(attachments[i])); - return Promise.all(promises).then(function(attachmentsArray) { - proto.attachments = attachmentsArray; - return sendIndividualProto(number, proto, timestamp); - }); - } + var promises = []; + for (var i in attachments) + promises.push(makeAttachmentPointer(attachments[i])); + return Promise.all(promises).then(function(attachmentsArray) { + proto.attachments = attachmentsArray; + return sendIndividualProto(number, proto, timestamp); + }); + } - self.closeSession = function(number) { - var proto = new textsecure.protobuf.PushMessageContent(); - proto.body = "TERMINATE"; - proto.flags = textsecure.protobuf.PushMessageContent.Flags.END_SESSION; - return sendIndividualProto(number, proto).then(function(res) { - var devices = textsecure.storage.devices.getDeviceObjectsForNumber(number); - for (var i in devices) - textsecure.protocol.closeOpenSessionForDevice(devices[i].encodedNumber); + self.closeSession = function(number) { + var proto = new textsecure.protobuf.PushMessageContent(); + proto.body = "TERMINATE"; + proto.flags = textsecure.protobuf.PushMessageContent.Flags.END_SESSION; + return sendIndividualProto(number, proto).then(function(res) { + var devices = textsecure.storage.devices.getDeviceObjectsForNumber(number); + for (var i in devices) + textsecure.protocol.closeOpenSessionForDevice(devices[i].encodedNumber); - return res; - }); - } + return res; + }); + } - self.sendMessageToGroup = function(groupId, messageText, attachments, timestamp) { - var proto = new textsecure.protobuf.PushMessageContent(); - proto.body = messageText; - proto.group = new textsecure.protobuf.PushMessageContent.GroupContext(); - proto.group.id = toArrayBuffer(groupId); - proto.group.type = textsecure.protobuf.PushMessageContent.GroupContext.Type.DELIVER; + self.sendMessageToGroup = function(groupId, messageText, attachments, timestamp) { + var proto = new textsecure.protobuf.PushMessageContent(); + proto.body = messageText; + proto.group = new textsecure.protobuf.PushMessageContent.GroupContext(); + proto.group.id = toArrayBuffer(groupId); + proto.group.type = textsecure.protobuf.PushMessageContent.GroupContext.Type.DELIVER; - var numbers = textsecure.storage.groups.getNumbers(groupId); - if (numbers === undefined) - return new Promise(function(resolve, reject) { reject(new Error("Unknown Group")); }); + var numbers = textsecure.storage.groups.getNumbers(groupId); + if (numbers === undefined) + return new Promise(function(resolve, reject) { reject(new Error("Unknown Group")); }); - var promises = []; - for (var i in attachments) - promises.push(makeAttachmentPointer(attachments[i])); - return Promise.all(promises).then(function(attachmentsArray) { - proto.attachments = attachmentsArray; - return sendGroupProto(numbers, proto, timestamp); - }); - } + var promises = []; + for (var i in attachments) + promises.push(makeAttachmentPointer(attachments[i])); + return Promise.all(promises).then(function(attachmentsArray) { + proto.attachments = attachmentsArray; + return sendGroupProto(numbers, proto, timestamp); + }); + } - self.createGroup = function(numbers, name, avatar) { - var proto = new textsecure.protobuf.PushMessageContent(); - proto.group = new textsecure.protobuf.PushMessageContent.GroupContext(); + self.createGroup = function(numbers, name, avatar) { + var proto = new textsecure.protobuf.PushMessageContent(); + proto.group = new textsecure.protobuf.PushMessageContent.GroupContext(); - var group = textsecure.storage.groups.createNewGroup(numbers); - proto.group.id = toArrayBuffer(group.id); - var numbers = group.numbers; + var group = textsecure.storage.groups.createNewGroup(numbers); + proto.group.id = toArrayBuffer(group.id); + var numbers = group.numbers; - proto.group.type = textsecure.protobuf.PushMessageContent.GroupContext.Type.UPDATE; - proto.group.members = numbers; - proto.group.name = name; + proto.group.type = textsecure.protobuf.PushMessageContent.GroupContext.Type.UPDATE; + proto.group.members = numbers; + proto.group.name = name; - if (avatar !== undefined) { - return makeAttachmentPointer(avatar).then(function(attachment) { - proto.group.avatar = attachment; - return sendGroupProto(numbers, proto).then(function() { - return proto.group.id; - }); - }); - } else { - return sendGroupProto(numbers, proto).then(function() { - return proto.group.id; - }); - } - } + if (avatar !== undefined) { + return makeAttachmentPointer(avatar).then(function(attachment) { + proto.group.avatar = attachment; + return sendGroupProto(numbers, proto).then(function() { + return proto.group.id; + }); + }); + } else { + return sendGroupProto(numbers, proto).then(function() { + return proto.group.id; + }); + } + } - self.addNumberToGroup = function(groupId, number) { - var proto = new textsecure.protobuf.PushMessageContent(); - proto.group = new textsecure.protobuf.PushMessageContent.GroupContext(); - proto.group.id = toArrayBuffer(groupId); - proto.group.type = textsecure.protobuf.PushMessageContent.GroupContext.Type.UPDATE; + self.addNumberToGroup = function(groupId, number) { + var proto = new textsecure.protobuf.PushMessageContent(); + proto.group = new textsecure.protobuf.PushMessageContent.GroupContext(); + proto.group.id = toArrayBuffer(groupId); + proto.group.type = textsecure.protobuf.PushMessageContent.GroupContext.Type.UPDATE; - var numbers = textsecure.storage.groups.addNumbers(groupId, [number]); - if (numbers === undefined) - return new Promise(function(resolve, reject) { reject(new Error("Unknown Group")); }); - proto.group.members = numbers; + var numbers = textsecure.storage.groups.addNumbers(groupId, [number]); + if (numbers === undefined) + return new Promise(function(resolve, reject) { reject(new Error("Unknown Group")); }); + proto.group.members = numbers; - return sendGroupProto(numbers, proto); - } + return sendGroupProto(numbers, proto); + } - self.setGroupName = function(groupId, name) { - var proto = new textsecure.protobuf.PushMessageContent(); - proto.group = new textsecure.protobuf.PushMessageContent.GroupContext(); - proto.group.id = toArrayBuffer(groupId); - proto.group.type = textsecure.protobuf.PushMessageContent.GroupContext.Type.UPDATE; - proto.group.name = name; + self.setGroupName = function(groupId, name) { + var proto = new textsecure.protobuf.PushMessageContent(); + proto.group = new textsecure.protobuf.PushMessageContent.GroupContext(); + proto.group.id = toArrayBuffer(groupId); + proto.group.type = textsecure.protobuf.PushMessageContent.GroupContext.Type.UPDATE; + proto.group.name = name; - var numbers = textsecure.storage.groups.getNumbers(groupId); - if (numbers === undefined) - return new Promise(function(resolve, reject) { reject(new Error("Unknown Group")); }); - proto.group.members = numbers; + var numbers = textsecure.storage.groups.getNumbers(groupId); + if (numbers === undefined) + return new Promise(function(resolve, reject) { reject(new Error("Unknown Group")); }); + proto.group.members = numbers; - return sendGroupProto(numbers, proto); - } + return sendGroupProto(numbers, proto); + } - self.setGroupAvatar = function(groupId, avatar) { - var proto = new textsecure.protobuf.PushMessageContent(); - proto.group = new textsecure.protobuf.PushMessageContent.GroupContext(); - proto.group.id = toArrayBuffer(groupId); - proto.group.type = textsecure.protobuf.PushMessageContent.GroupContext.Type.UPDATE; + self.setGroupAvatar = function(groupId, avatar) { + var proto = new textsecure.protobuf.PushMessageContent(); + proto.group = new textsecure.protobuf.PushMessageContent.GroupContext(); + proto.group.id = toArrayBuffer(groupId); + proto.group.type = textsecure.protobuf.PushMessageContent.GroupContext.Type.UPDATE; - var numbers = textsecure.storage.groups.getNumbers(groupId); - if (numbers === undefined) - return new Promise(function(resolve, reject) { reject(new Error("Unknown Group")); }); - proto.group.members = numbers; + var numbers = textsecure.storage.groups.getNumbers(groupId); + if (numbers === undefined) + return new Promise(function(resolve, reject) { reject(new Error("Unknown Group")); }); + proto.group.members = numbers; - return makeAttachmentPointer(avatar).then(function(attachment) { - proto.group.avatar = attachment; - return sendGroupProto(numbers, proto); - }); - } + return makeAttachmentPointer(avatar).then(function(attachment) { + proto.group.avatar = attachment; + return sendGroupProto(numbers, proto); + }); + } - self.leaveGroup = function(groupId) { - var proto = new textsecure.protobuf.PushMessageContent(); - proto.group = new textsecure.protobuf.PushMessageContent.GroupContext(); - proto.group.id = toArrayBuffer(groupId); - proto.group.type = textsecure.protobuf.PushMessageContent.GroupContext.Type.QUIT; + self.leaveGroup = function(groupId) { + var proto = new textsecure.protobuf.PushMessageContent(); + proto.group = new textsecure.protobuf.PushMessageContent.GroupContext(); + proto.group.id = toArrayBuffer(groupId); + proto.group.type = textsecure.protobuf.PushMessageContent.GroupContext.Type.QUIT; - var numbers = textsecure.storage.groups.getNumbers(groupId); - if (numbers === undefined) - return new Promise(function(resolve, reject) { reject(new Error("Unknown Group")); }); - textsecure.storage.groups.deleteGroup(groupId); + var numbers = textsecure.storage.groups.getNumbers(groupId); + if (numbers === undefined) + return new Promise(function(resolve, reject) { reject(new Error("Unknown Group")); }); + textsecure.storage.groups.deleteGroup(groupId); - return sendGroupProto(numbers, proto); - } + return sendGroupProto(numbers, proto); + } - return self; + return self; }();