|
|
@ -12,17 +12,22 @@ import {
|
|
|
|
} from '../GroupUpdateMessage';
|
|
|
|
} from '../GroupUpdateMessage';
|
|
|
|
|
|
|
|
|
|
|
|
type MembersAddedMessageParams = GroupUpdateMessageParams & {
|
|
|
|
type MembersAddedMessageParams = GroupUpdateMessageParams & {
|
|
|
|
typeOfChange: SignalService.GroupUpdateMemberChangeMessage.Type.ADDED;
|
|
|
|
typeOfChange: 'added';
|
|
|
|
|
|
|
|
added: Array<PubkeyType>;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
type MembersAddedWithHistoryMessageParams = GroupUpdateMessageParams & {
|
|
|
|
|
|
|
|
typeOfChange: 'addedWithHistory';
|
|
|
|
added: Array<PubkeyType>;
|
|
|
|
added: Array<PubkeyType>;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
type MembersRemovedMessageParams = GroupUpdateMessageParams & {
|
|
|
|
type MembersRemovedMessageParams = GroupUpdateMessageParams & {
|
|
|
|
typeOfChange: SignalService.GroupUpdateMemberChangeMessage.Type.REMOVED;
|
|
|
|
typeOfChange: 'removed';
|
|
|
|
removed: Array<PubkeyType>;
|
|
|
|
removed: Array<PubkeyType>;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
type MembersPromotedMessageParams = GroupUpdateMessageParams & {
|
|
|
|
type MembersPromotedMessageParams = GroupUpdateMessageParams & {
|
|
|
|
typeOfChange: SignalService.GroupUpdateMemberChangeMessage.Type.PROMOTED;
|
|
|
|
typeOfChange: 'promoted';
|
|
|
|
promoted: Array<PubkeyType>;
|
|
|
|
promoted: Array<PubkeyType>;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
@ -30,7 +35,8 @@ type MembersPromotedMessageParams = GroupUpdateMessageParams & {
|
|
|
|
* GroupUpdateInfoChangeMessage is sent to the group's swarm.
|
|
|
|
* GroupUpdateInfoChangeMessage is sent to the group's swarm.
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
export class GroupUpdateMemberChangeMessage extends GroupUpdateMessage {
|
|
|
|
export class GroupUpdateMemberChangeMessage extends GroupUpdateMessage {
|
|
|
|
public readonly typeOfChange: SignalService.GroupUpdateMemberChangeMessage.Type;
|
|
|
|
public readonly typeOfChange: 'added' | 'addedWithHistory' | 'removed' | 'promoted';
|
|
|
|
|
|
|
|
|
|
|
|
public readonly memberSessionIds: Array<PubkeyType> = []; // added, removed, promoted based on the type.
|
|
|
|
public readonly memberSessionIds: Array<PubkeyType> = []; // added, removed, promoted based on the type.
|
|
|
|
public readonly namespace = SnodeNamespaces.ClosedGroupMessages;
|
|
|
|
public readonly namespace = SnodeNamespaces.ClosedGroupMessages;
|
|
|
|
private readonly secretKey: Uint8Array; // not sent, only used for signing content as part of the message
|
|
|
|
private readonly secretKey: Uint8Array; // not sent, only used for signing content as part of the message
|
|
|
@ -41,11 +47,11 @@ export class GroupUpdateMemberChangeMessage extends GroupUpdateMessage {
|
|
|
|
| MembersAddedMessageParams
|
|
|
|
| MembersAddedMessageParams
|
|
|
|
| MembersRemovedMessageParams
|
|
|
|
| MembersRemovedMessageParams
|
|
|
|
| MembersPromotedMessageParams
|
|
|
|
| MembersPromotedMessageParams
|
|
|
|
|
|
|
|
| MembersAddedWithHistoryMessageParams
|
|
|
|
) &
|
|
|
|
) &
|
|
|
|
AdminSigDetails
|
|
|
|
AdminSigDetails
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
super(params);
|
|
|
|
super(params);
|
|
|
|
const { Type } = SignalService.GroupUpdateMemberChangeMessage;
|
|
|
|
|
|
|
|
const { typeOfChange } = params;
|
|
|
|
const { typeOfChange } = params;
|
|
|
|
|
|
|
|
|
|
|
|
this.typeOfChange = typeOfChange;
|
|
|
|
this.typeOfChange = typeOfChange;
|
|
|
@ -53,21 +59,28 @@ export class GroupUpdateMemberChangeMessage extends GroupUpdateMessage {
|
|
|
|
this.sodium = params.sodium;
|
|
|
|
this.sodium = params.sodium;
|
|
|
|
|
|
|
|
|
|
|
|
switch (typeOfChange) {
|
|
|
|
switch (typeOfChange) {
|
|
|
|
case Type.ADDED: {
|
|
|
|
case 'added': {
|
|
|
|
if (isEmpty(params.added)) {
|
|
|
|
if (isEmpty(params.added)) {
|
|
|
|
throw new Error('added members list cannot be empty');
|
|
|
|
throw new Error('added members list cannot be empty');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.memberSessionIds = params.added;
|
|
|
|
this.memberSessionIds = params.added;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case Type.REMOVED: {
|
|
|
|
case 'addedWithHistory': {
|
|
|
|
|
|
|
|
if (isEmpty(params.added)) {
|
|
|
|
|
|
|
|
throw new Error('addedWithHistory members list cannot be empty');
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
this.memberSessionIds = params.added;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
case 'removed': {
|
|
|
|
if (isEmpty(params.removed)) {
|
|
|
|
if (isEmpty(params.removed)) {
|
|
|
|
throw new Error('removed members list cannot be empty');
|
|
|
|
throw new Error('removed members list cannot be empty');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.memberSessionIds = params.removed;
|
|
|
|
this.memberSessionIds = params.removed;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case Type.PROMOTED: {
|
|
|
|
case 'promoted': {
|
|
|
|
if (isEmpty(params.promoted)) {
|
|
|
|
if (isEmpty(params.promoted)) {
|
|
|
|
throw new Error('promoted members list cannot be empty');
|
|
|
|
throw new Error('promoted members list cannot be empty');
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -80,8 +93,15 @@ export class GroupUpdateMemberChangeMessage extends GroupUpdateMessage {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public dataProto(): SignalService.DataMessage {
|
|
|
|
public dataProto(): SignalService.DataMessage {
|
|
|
|
|
|
|
|
const { Type } = SignalService.GroupUpdateMemberChangeMessage;
|
|
|
|
|
|
|
|
|
|
|
|
const memberChangeMessage = new SignalService.GroupUpdateMemberChangeMessage({
|
|
|
|
const memberChangeMessage = new SignalService.GroupUpdateMemberChangeMessage({
|
|
|
|
type: this.typeOfChange,
|
|
|
|
type:
|
|
|
|
|
|
|
|
this.typeOfChange === 'added' || this.typeOfChange === 'addedWithHistory'
|
|
|
|
|
|
|
|
? Type.ADDED
|
|
|
|
|
|
|
|
: this.typeOfChange === 'removed'
|
|
|
|
|
|
|
|
? Type.REMOVED
|
|
|
|
|
|
|
|
: Type.PROMOTED,
|
|
|
|
memberSessionIds: this.memberSessionIds,
|
|
|
|
memberSessionIds: this.memberSessionIds,
|
|
|
|
adminSignature: this.sodium.crypto_sign_detached(
|
|
|
|
adminSignature: this.sodium.crypto_sign_detached(
|
|
|
|
stringToUint8Array(`MEMBER_CHANGE${this.typeOfChange}${this.createAtNetworkTimestamp}`),
|
|
|
|
stringToUint8Array(`MEMBER_CHANGE${this.typeOfChange}${this.createAtNetworkTimestamp}`),
|
|
|
|