You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.3 KiB
TypeScript
95 lines
2.3 KiB
TypeScript
import { PubKey } from '../types';
|
|
import { onGroupReceived } from '../../receiver/receiver';
|
|
import { StringUtils } from '../utils';
|
|
import * as Data from '../../../js/modules/data';
|
|
import _ from 'lodash';
|
|
|
|
import {
|
|
createSenderKeyForGroup,
|
|
RatchetState,
|
|
saveSenderKeys,
|
|
saveSenderKeysInner,
|
|
} from './senderKeys';
|
|
import { getChainKey } from './ratchet';
|
|
import { MultiDeviceProtocol } from '../protocols';
|
|
|
|
export {
|
|
createSenderKeyForGroup,
|
|
saveSenderKeys,
|
|
saveSenderKeysInner,
|
|
getChainKey,
|
|
};
|
|
|
|
async function createSenderKeysForMembers(
|
|
groupId: string,
|
|
members: Array<string>
|
|
): Promise<Array<RatchetState>> {
|
|
const allDevices = await Promise.all(
|
|
members.map(async pk => {
|
|
return MultiDeviceProtocol.getAllDevices(pk);
|
|
})
|
|
);
|
|
|
|
const devicesFlat = _.flatten(allDevices);
|
|
|
|
return Promise.all(
|
|
devicesFlat.map(async pk => {
|
|
return createSenderKeyForGroup(groupId, PubKey.cast(pk));
|
|
})
|
|
);
|
|
}
|
|
|
|
export async function createMediumSizeGroup(
|
|
groupName: string,
|
|
members: Array<string>
|
|
) {
|
|
const { ConversationController, libsignal } = window;
|
|
|
|
// Create Group Identity
|
|
const identityKeys = await libsignal.KeyHelper.generateIdentityKeyPair();
|
|
const groupId = StringUtils.decode(identityKeys.pubKey, 'hex');
|
|
|
|
const groupSecretKeyHex = StringUtils.decode(identityKeys.privKey, 'hex');
|
|
|
|
const primary = window.storage.get('primaryDevicePubKey');
|
|
|
|
const allMembers = [primary, ...members];
|
|
|
|
const senderKeys = await createSenderKeysForMembers(groupId, allMembers);
|
|
|
|
// TODO: make this strongly typed!
|
|
await Data.createOrUpdateIdentityKey({
|
|
id: groupId,
|
|
secretKey: groupSecretKeyHex,
|
|
});
|
|
|
|
const groupDetails = {
|
|
id: groupId,
|
|
name: groupName,
|
|
members: allMembers,
|
|
recipients: allMembers,
|
|
active: true,
|
|
expireTimer: 0,
|
|
avatar: '',
|
|
secretKey: new Uint8Array(identityKeys.privKey),
|
|
senderKeys,
|
|
is_medium_group: true,
|
|
};
|
|
|
|
await onGroupReceived(groupDetails);
|
|
|
|
const convo = await ConversationController.getOrCreateAndWait(
|
|
groupId,
|
|
'group'
|
|
);
|
|
|
|
convo.updateGroupAdmins([primary]);
|
|
|
|
convo.updateGroup(groupDetails);
|
|
|
|
window.owsDesktopApp.appView.openConversation(groupId, {});
|
|
|
|
// Subscribe to this group id
|
|
window.SwarmPolling.addGroupId(new PubKey(groupId));
|
|
}
|