@ -411,7 +411,11 @@ MessageSender.prototype = {
const ourNumber = textsecure . storage . user . getNumber ( ) ;
numbers . forEach ( number => {
// Note: Since we're just doing independant tasks,
// using `async` in the `forEach` loop should be fine.
// If however we want to use the results from forEach then
// we would need to convert this to a Promise.all(numbers.map(...))
numbers . forEach ( async number => {
// Note: if we are sending a private group message, we do our best to
// ensure we have signal protocol sessions with every member, but if we
// fail, let's at least send messages to those members with which we do:
@ -420,9 +424,17 @@ MessageSender.prototype = {
s => s . number === number
) ;
let keysFound = false ;
// If we don't have a session but we already have prekeys to
// start communication then we should use them
if ( ! haveSession && ! options . isPublic ) {
keysFound = await outgoing . getKeysForNumber ( number , [ ] ) ;
}
if (
number === ourNumber ||
haveSession ||
keysFound ||
options . isPublic ||
options . messageType === 'friend-request'
) {
@ -873,7 +885,14 @@ MessageSender.prototype = {
} ,
sendGroupProto ( providedNumbers , proto , timestamp = Date . now ( ) , options = { } ) {
if ( providedNumbers . length === 0 ) {
// We always assume that only primary device is a member in the group
const primaryDeviceKey =
window . storage . get ( 'primaryDevicePubKey' ) ||
textsecure . storage . user . getNumber ( ) ;
const numbers = providedNumbers . filter (
number => number !== primaryDeviceKey
) ;
if ( numbers . length === 0 ) {
return Promise . resolve ( {
successfulNumbers : [ ] ,
failoverNumbers : [ ] ,
@ -883,7 +902,7 @@ MessageSender.prototype = {
} ) ;
}
return new Promise ( ( resolve , reject ) => {
const sendPromise = new Promise ( ( resolve , reject ) => {
const silent = true ;
const callback = res => {
res . dataMessage = proto . toArrayBuffer ( ) ;
@ -896,13 +915,20 @@ MessageSender.prototype = {
this . sendMessageProto (
timestamp ,
providedN umbers,
n umbers,
proto ,
callback ,
silent ,
options
) ;
} ) ;
return sendPromise . then ( result => {
// Sync the group message to our other devices
const encoded = textsecure . protobuf . DataMessage . encode ( proto ) ;
this . sendSyncMessage ( encoded , timestamp , null , null , [ ] , [ ] , options ) ;
return result ;
} ) ;
} ,
async getMessageProto (
@ -1087,8 +1113,11 @@ MessageSender.prototype = {
profileKey ,
options
) {
const me = textsecure . storage . user . getNumber ( ) ;
let numbers = groupNumbers . filter ( number => number !== me ) ;
// We always assume that only primary device is a member in the group
const primaryDeviceKey =
window . storage . get ( 'primaryDevicePubKey' ) ||
textsecure . storage . user . getNumber ( ) ;
let numbers = groupNumbers . filter ( number => number !== primaryDeviceKey ) ;
if ( options . isPublic ) {
numbers = [ groupId ] ;
}
@ -1132,8 +1161,10 @@ MessageSender.prototype = {
proto . group . name = name ;
proto . group . members = members ;
const ourPK = textsecure . storage . user . getNumber ( ) ;
proto . group . admins = [ ourPK ] ;
const primaryDeviceKey =
window . storage . get ( 'primaryDevicePubKey' ) ||
textsecure . storage . user . getNumber ( ) ;
proto . group . admins = [ primaryDeviceKey ] ;
return this . makeAttachmentPointer ( avatar ) . then ( attachment => {
proto . group . avatar = attachment ;