import { SignalService } from '../../../../protobuf'; import { TTL_DEFAULT } from '../../../constants'; import { PubKey } from '../../../types'; import { StringUtils } from '../../../utils'; import { DataMessage } from '../DataMessage'; import { ExpirableMessageParams } from '../ExpirableMessage'; interface ExpirationTimerUpdateMessageParams extends ExpirableMessageParams { groupId?: string | PubKey; syncTarget?: string | PubKey; } // NOTE legacy messages used a data message for the expireTimer. // The new ones use properties on the Content Message export class ExpirationTimerUpdateMessage extends DataMessage { public readonly groupId?: PubKey; public readonly syncTarget?: string; constructor(params: ExpirationTimerUpdateMessageParams) { super({ timestamp: params.timestamp, identifier: params.identifier, expirationType: params.expirationType, expireTimer: params.expireTimer, }); const { groupId } = params; this.groupId = groupId ? PubKey.cast(groupId) : undefined; this.syncTarget = params.syncTarget ? PubKey.cast(params.syncTarget).key : undefined; } public contentProto(): SignalService.Content { return new SignalService.Content({ ...super.contentProto(), dataMessage: this.dataProto(), }); } public dataProto(): SignalService.DataMessage { const data = super.dataProto(); data.flags = SignalService.DataMessage.Flags.EXPIRATION_TIMER_UPDATE; // TODOLATER we won't need this once legacy groups are not supported anymore // the envelope stores the groupId for a closed group already. if (this.groupId) { const groupMessage = new SignalService.GroupContext(); const groupIdWithPrefix = PubKey.addTextSecurePrefixIfNeeded(this.groupId.key); const encoded = StringUtils.encode(groupIdWithPrefix, 'utf8'); const id = new Uint8Array(encoded); groupMessage.id = id; groupMessage.type = SignalService.GroupContext.Type.DELIVER; data.group = groupMessage; } if (this.syncTarget) { data.syncTarget = this.syncTarget; } return data; } public ttl(): number { if (this.groupId) { return TTL_DEFAULT.CONTENT_MESSAGE; } return super.ttl(); } }