feat: setExpirationStartTimestamp uses DisappearingMessageConversationType

easier to manage starting a legacy disappearing message and always pass expiration type and timer
pull/2971/head
William Grant 2 years ago
parent 82bb74a9df
commit e8c927f580

@ -122,7 +122,6 @@ import {
changeToDisappearingMessageType, changeToDisappearingMessageType,
} from '../util/expiringMessages'; } from '../util/expiringMessages';
import { markAttributesAsReadIfNeeded } from './messageFactory'; import { markAttributesAsReadIfNeeded } from './messageFactory';
import { ReleasedFeatures } from '../util/releaseFeature';
type InMemoryConvoInfos = { type InMemoryConvoInfos = {
mentionedUs: boolean; mentionedUs: boolean;
@ -890,13 +889,9 @@ export class ConversationModel extends Backbone.Model<ConversationAttributes> {
source, source,
fromSync, fromSync,
}, },
// TODO legacy messages support will be removed in a future release // TODO Confirm that legacy devices ignore this and that everything works
expirationType: ReleasedFeatures.isDisappearMessageV2FeatureReleasedCached() expirationType: messageExpirationType,
? messageExpirationType expireTimer,
: undefined,
expireTimer: ReleasedFeatures.isDisappearMessageV2FeatureReleasedCached()
? expireTimer
: undefined,
}; };
if (!message) { if (!message) {

@ -94,7 +94,6 @@ import {
DisappearingMessageType, DisappearingMessageType,
DisappearingMessageUpdate, DisappearingMessageUpdate,
ExpirationTimerOptions, ExpirationTimerOptions,
isLegacyDisappearingModeEnabled,
setExpirationStartTimestamp, setExpirationStartTimestamp,
changeToDisappearingMessageConversationType, changeToDisappearingMessageConversationType,
} from '../util/expiringMessages'; } from '../util/expiringMessages';
@ -1129,22 +1128,23 @@ export class MessageModel extends Backbone.Model<MessageAttributes> {
public markMessageReadNoCommit(readAt: number) { public markMessageReadNoCommit(readAt: number) {
this.set({ unread: READ_MESSAGE_STATE.read }); this.set({ unread: READ_MESSAGE_STATE.read });
const expirationType = this.get('expirationType');
// TODO legacy messages support will be removed in a future release
const convo = this.getConversation(); const convo = this.getConversation();
const isLegacyMode = const canBeDeleteAfterRead = convo && !convo.isMe() && convo.isPrivate();
convo && const expirationType = this.get('expirationType');
!convo.isMe() && const expireTimer = this.get('expireTimer');
convo.isPrivate() &&
isLegacyDisappearingModeEnabled(expirationType); if (canBeDeleteAfterRead && expirationType && expireTimer > 0) {
if ((isLegacyMode || expirationType === 'deleteAfterRead') && this.get('expireTimer')) { const expirationMode = changeToDisappearingMessageConversationType(
this.set({ convo,
expirationStartTimestamp: setExpirationStartTimestamp( expirationType,
'deleteAfterRead', expireTimer
readAt, );
isLegacyMode
), if (expirationMode === 'legacy' || expirationMode === 'deleteAfterRead') {
}); this.set({
expirationStartTimestamp: setExpirationStartTimestamp(expirationMode, readAt),
});
}
} }
Notifications.clearByMessageId(this.id); Notifications.clearByMessageId(this.id);

@ -39,7 +39,6 @@ import {
changeToDisappearingMessageType, changeToDisappearingMessageType,
checkForExpireUpdateInContentMessage, checkForExpireUpdateInContentMessage,
checkHasOutdatedClient, checkHasOutdatedClient,
isLegacyDisappearingModeEnabled,
setExpirationStartTimestamp, setExpirationStartTimestamp,
} from '../util/expiringMessages'; } from '../util/expiringMessages';
@ -451,12 +450,17 @@ export async function innerHandleSwarmContentMessage(
if (isEmpty(content.dataMessage.profileKey)) { if (isEmpty(content.dataMessage.profileKey)) {
content.dataMessage.profileKey = null; content.dataMessage.profileKey = null;
} }
window.log.debug(`WIP: innerHandleSwarmContentMessage: ${JSON.stringify(content)}`);
const expireUpdate = await checkForExpireUpdateInContentMessage( const expireUpdate = await checkForExpireUpdateInContentMessage(
conversationModelForUIUpdate, conversationModelForUIUpdate,
content content
); );
window.log.debug(
`WIP:innerHandleSwarmContentMessage expireUpdate: ${JSON.stringify(expireUpdate)}`
);
// TODO legacy messages support will be removed in a future release // TODO legacy messages support will be removed in a future release
if (expireUpdate && !isEmpty(expireUpdate) && expireUpdate.isDisappearingMessagesV2Released) { if (expireUpdate && !isEmpty(expireUpdate) && expireUpdate.isDisappearingMessagesV2Released) {
await checkHasOutdatedClient( await checkHasOutdatedClient(
@ -832,10 +836,22 @@ export async function handleDataExtractionNotification(
if (timestamp) { if (timestamp) {
const envelopeTimestamp = toNumber(timestamp); const envelopeTimestamp = toNumber(timestamp);
const referencedAttachmentTimestamp = toNumber(referencedAttachment); const referencedAttachmentTimestamp = toNumber(referencedAttachment);
const expirationType = convo.get('expirationType');
// TODO legacy messages support will be removed in a future release const expirationMode = convo.get('expirationType');
const isLegacyMode = const expireTimer = convo.get('expireTimer');
convo && convo.isPrivate() && isLegacyDisappearingModeEnabled(expirationType); let expirationType;
let expirationStartTimestamp;
if (convo && expirationMode && expireTimer > 0) {
expirationType =
expirationType !== 'off'
? changeToDisappearingMessageType(convo, expirationMode)
: undefined;
if (expirationMode === 'legacy' || expirationMode === 'deleteAfterSend') {
expirationStartTimestamp = setExpirationStartTimestamp(expirationMode);
}
}
await convo.addSingleIncomingMessage({ await convo.addSingleIncomingMessage({
source, source,
@ -847,16 +863,9 @@ export async function handleDataExtractionNotification(
}, },
unread: READ_MESSAGE_STATE.unread, // 1 means unread unread: READ_MESSAGE_STATE.unread, // 1 means unread
expirationType: expirationType,
expirationType !== 'off' expireTimer,
? changeToDisappearingMessageType(convo, expirationType) expirationStartTimestamp,
: undefined,
expireTimer: convo.get('expireTimer') ? convo.get('expireTimer') : 0,
// TODO should this only be for delete after send?
expirationStartTimestamp:
isLegacyMode || expirationType === 'deleteAfterSend'
? setExpirationStartTimestamp('deleteAfterSend', undefined, isLegacyMode)
: undefined,
}); });
convo.updateLastMessage(); convo.updateLastMessage();

@ -263,6 +263,7 @@ export async function handleSwarmDataMessage(
if (!isEmpty(expireUpdate)) { if (!isEmpty(expireUpdate)) {
msgModel = handleExpireUpdate(convoToAddMessageTo, msgModel, expireUpdate); msgModel = handleExpireUpdate(convoToAddMessageTo, msgModel, expireUpdate);
window.log.debug(`WIP: innerHandleSwarmContentMessage msgModel ${JSON.stringify(msgModel)}`);
} }
await handleSwarmMessage( await handleSwarmMessage(

@ -17,7 +17,6 @@ import { getHideMessageRequestBannerOutsideRedux } from '../state/selectors/user
import { GoogleChrome } from '../util'; import { GoogleChrome } from '../util';
import { import {
changeToDisappearingMessageConversationType, changeToDisappearingMessageConversationType,
isLegacyDisappearingModeEnabled,
setExpirationStartTimestamp, setExpirationStartTimestamp,
} from '../util/expiringMessages'; } from '../util/expiringMessages';
import { LinkPreviews } from '../util/linkPreviews'; import { LinkPreviews } from '../util/linkPreviews';
@ -181,22 +180,23 @@ async function processProfileKeyNoCommit(
function updateReadStatus(message: MessageModel) { function updateReadStatus(message: MessageModel) {
if (message.isExpirationTimerUpdate()) { if (message.isExpirationTimerUpdate()) {
message.set({ unread: READ_MESSAGE_STATE.read }); message.set({ unread: READ_MESSAGE_STATE.read });
const expirationType = message.get('expirationType');
// TODO legacy messages support will be removed in a future release
const convo = message.getConversation(); const convo = message.getConversation();
const isLegacyMode = const canBeDeleteAfterRead = convo && !convo.isMe() && convo.isPrivate();
convo && const expirationType = message.get('expirationType');
!convo.isMe() && const expireTimer = message.get('expireTimer');
convo.isPrivate() &&
isLegacyDisappearingModeEnabled(expirationType); if (canBeDeleteAfterRead && expirationType && expireTimer > 0) {
if ((isLegacyMode || expirationType === 'deleteAfterRead') && message.get('expireTimer')) { const expirationMode = changeToDisappearingMessageConversationType(
message.set({ convo,
expirationStartTimestamp: setExpirationStartTimestamp( expirationType,
'deleteAfterRead', expireTimer
undefined, );
isLegacyMode
), if (expirationMode === 'legacy' || expirationMode === 'deleteAfterRead') {
}); message.set({
expirationStartTimestamp: setExpirationStartTimestamp(expirationMode),
});
}
} }
} }
} }
@ -391,21 +391,31 @@ export async function handleMessageJob(
try { try {
messageModel.set({ flags: regularDataMessage.flags }); messageModel.set({ flags: regularDataMessage.flags });
// TODO legacy messages support will be removed in a future release const expirationType = messageModel.get('expirationType');
const isLegacyMode = isLegacyDisappearingModeEnabled(messageModel.get('expirationType')); const expireTimer = messageModel.get('expireTimer');
// NOTE we handle incoming disappear afer send messages and are Note To Self sync messages here
if ( if (
messageModel.isIncoming() && conversation &&
Boolean(messageModel.get('expirationStartTimestamp')) === false && (messageModel.isIncoming() || conversation.isMe()) &&
((isLegacyMode && (conversation.isMe() || conversation.isClosedGroup())) || expirationType &&
messageModel.get('expirationType') === 'deleteAfterSend') expireTimer > 0 &&
Boolean(messageModel.get('expirationStartTimestamp')) === false
) { ) {
messageModel.set({ const expirationMode = changeToDisappearingMessageConversationType(
expirationStartTimestamp: setExpirationStartTimestamp( conversation,
'deleteAfterSend', expirationType,
messageModel.get('sent_at'), expireTimer
isLegacyMode );
),
}); if (expirationMode === 'legacy' || expirationMode === 'deleteAfterSend') {
messageModel.set({
expirationStartTimestamp: setExpirationStartTimestamp(
expirationMode,
messageModel.get('sent_at')
),
});
}
} }
if (messageModel.isExpirationTimerUpdate()) { if (messageModel.isExpirationTimerUpdate()) {
@ -423,11 +433,11 @@ export async function handleMessageJob(
return; return;
} }
const expireTimer = expirationTimerUpdate?.expireTimer || 0; const expireTimerUpdate = expirationTimerUpdate?.expireTimer || 0;
const expirationType = changeToDisappearingMessageConversationType( const expirationTypeUpdate = changeToDisappearingMessageConversationType(
conversation, conversation,
expirationTimerUpdate?.expirationType, expirationTimerUpdate?.expirationType,
expireTimer expireTimerUpdate
); );
const lastDisappearingMessageChangeTimestamp = const lastDisappearingMessageChangeTimestamp =
expirationTimerUpdate?.lastDisappearingMessageChangeTimestamp || expirationTimerUpdate?.lastDisappearingMessageChangeTimestamp ||
@ -435,8 +445,8 @@ export async function handleMessageJob(
// Compare mode and timestamp // Compare mode and timestamp
if ( if (
isEqual(expirationType, conversation.get('expirationType')) && isEqual(expirationTypeUpdate, conversation.get('expirationType')) &&
isEqual(expireTimer, conversation.get('expireTimer')) isEqual(expireTimerUpdate, conversation.get('expireTimer'))
) { ) {
confirm?.(); confirm?.();
window?.log?.info( window?.log?.info(
@ -446,8 +456,8 @@ export async function handleMessageJob(
} }
await conversation.updateExpireTimer({ await conversation.updateExpireTimer({
providedExpirationType: expirationType, providedExpirationType: expirationTypeUpdate,
providedExpireTimer: expireTimer, providedExpireTimer: expireTimerUpdate,
providedChangeTimestamp: lastDisappearingMessageChangeTimestamp, providedChangeTimestamp: lastDisappearingMessageChangeTimestamp,
providedSource: source, providedSource: source,
receivedAt: messageModel.get('received_at'), receivedAt: messageModel.get('received_at'),

@ -82,7 +82,7 @@ async function processExpirationResults(
// TODO need proper typing for swarm and results // TODO need proper typing for swarm and results
const results: Record<string, { hashes: Array<string>; expiry: number }> = {}; const results: Record<string, { hashes: Array<string>; expiry: number }> = {};
window.log.debug(`WIP: processExpirationResults start`, swarm, messageHashes); // window.log.debug(`WIP: processExpirationResults start`, swarm, messageHashes);
for (const nodeKey of Object.keys(swarm)) { for (const nodeKey of Object.keys(swarm)) {
if (!isEmpty(swarm[nodeKey].failed)) { if (!isEmpty(swarm[nodeKey].failed)) {

@ -28,7 +28,6 @@ import { fromHexToArray, toHex } from '../utils/String';
import { import {
DisappearingMessageConversationType, DisappearingMessageConversationType,
changeToDisappearingMessageType, changeToDisappearingMessageType,
isLegacyDisappearingModeEnabled,
setExpirationStartTimestamp, setExpirationStartTimestamp,
} from '../../util/expiringMessages'; } from '../../util/expiringMessages';
@ -164,22 +163,26 @@ export async function addUpdateMessage(
groupUpdate.kicked = diff.kickedMembers; groupUpdate.kicked = diff.kickedMembers;
} }
const expirationType = changeToDisappearingMessageType(convo, convo.get('expirationType')); const expirationMode = convo.get('expirationType');
const expireTimer = convo.get('expireTimer'); const expireTimer = convo.get('expireTimer') || 0;
let expirationType;
let expirationStartTimestamp;
if (convo && expirationMode && expireTimer > 0) {
expirationType =
expirationMode !== 'off' ? changeToDisappearingMessageType(convo, expirationMode) : undefined;
if (expirationMode === 'legacy' || expirationMode === 'deleteAfterSend') {
expirationStartTimestamp = setExpirationStartTimestamp(expirationMode, sentAt);
}
}
const msgModel = { const msgModel = {
sent_at: sentAt, sent_at: sentAt,
group_update: groupUpdate, group_update: groupUpdate,
expirationType: expirationType || undefined, expirationType,
expireTimer: expireTimer || 0, expireTimer,
// closed groups are always deleteAfterSend expirationStartTimestamp,
expirationStartTimestamp: expirationType
? setExpirationStartTimestamp(
'deleteAfterSend',
sentAt,
isLegacyDisappearingModeEnabled(expirationType)
)
: undefined,
}; };
if (UserUtils.isUsFromCache(sender)) { if (UserUtils.isUsFromCache(sender)) {

@ -30,7 +30,7 @@ export class ExpirableMessage extends ContentMessage {
? SignalService.Content.ExpirationType.DELETE_AFTER_SEND ? SignalService.Content.ExpirationType.DELETE_AFTER_SEND
: this.expirationType === 'deleteAfterRead' : this.expirationType === 'deleteAfterRead'
? SignalService.Content.ExpirationType.DELETE_AFTER_READ ? SignalService.Content.ExpirationType.DELETE_AFTER_READ
: this.expirationType : this.expirationType === 'unknown'
? SignalService.Content.ExpirationType.UNKNOWN ? SignalService.Content.ExpirationType.UNKNOWN
: undefined, : undefined,
expirationTimer: this.expireTimer && this.expireTimer > -1 ? this.expireTimer : undefined, expirationTimer: this.expireTimer && this.expireTimer > -1 ? this.expireTimer : undefined,
@ -40,7 +40,12 @@ export class ExpirableMessage extends ContentMessage {
public dataProto(): SignalService.DataMessage { public dataProto(): SignalService.DataMessage {
return new SignalService.DataMessage({ return new SignalService.DataMessage({
// TODO legacy messages support will be removed in a future release // TODO legacy messages support will be removed in a future release
expireTimer: !this.expirationType ? this.expireTimer : undefined, expireTimer:
(this.expirationType === 'unknown' || !this.expirationType) &&
this.expireTimer &&
this.expireTimer > -1
? this.expireTimer
: undefined,
}); });
} }

@ -2,7 +2,7 @@ import _ from 'lodash';
import { Data } from '../../data/data'; import { Data } from '../../data/data';
import { SignalService } from '../../protobuf'; import { SignalService } from '../../protobuf';
import { import {
isLegacyDisappearingModeEnabled, changeToDisappearingMessageConversationType,
setExpirationStartTimestamp, setExpirationStartTimestamp,
} from '../../util/expiringMessages'; } from '../../util/expiringMessages';
import { PnServer } from '../apis/push_notification_api'; import { PnServer } from '../apis/push_notification_api';
@ -124,40 +124,37 @@ async function handleMessageSentSuccess(
sentTo = _.union(sentTo, [sentMessage.device]); sentTo = _.union(sentTo, [sentMessage.device]);
const expirationType = fetchedMessage.get('expirationType');
// TODO legacy messages support will be removed in a future release
const convo = fetchedMessage.getConversation();
const isLegacyMode = isLegacyDisappearingModeEnabled(expirationType);
const isLegacyReadMode = convo && !convo.isMe() && convo.isPrivate() && isLegacyMode;
const isLegacySentMode = convo && (convo.isMe() || convo.isClosedGroup()) && isLegacyMode;
fetchedMessage.set({ fetchedMessage.set({
sent_to: sentTo, sent_to: sentTo,
sent: true, sent: true,
sent_at: effectiveTimestamp, sent_at: effectiveTimestamp,
}); });
// TODO legacy messages support will be removed in a future release const convo = fetchedMessage.getConversation();
// NOTE we treat all outbound disappearing messages as read as soon as they are sent. const expireTimer = fetchedMessage.get('expireTimer');
const expirationType = fetchedMessage.get('expirationType');
if ( if (
(isLegacyReadMode || convo &&
isLegacySentMode || expirationType &&
expirationType === 'deleteAfterRead' || expireTimer > 0 &&
expirationType === 'deleteAfterSend') &&
Boolean(fetchedMessage.get('expirationStartTimestamp')) === false Boolean(fetchedMessage.get('expirationStartTimestamp')) === false
) { ) {
const expirationMode = const expirationMode = changeToDisappearingMessageConversationType(
isLegacyReadMode || expirationType === 'deleteAfterRead' convo,
? 'deleteAfterRead' expirationType,
: 'deleteAfterSend'; expireTimer
);
fetchedMessage.set({
expirationStartTimestamp: setExpirationStartTimestamp( // NOTE we treat all outbound disappearing messages as read as soon as they are sent.
expirationMode, if (expirationMode !== 'off') {
fetchedMessage.get('sent_at'), fetchedMessage.set({
isLegacyReadMode || isLegacySentMode expirationStartTimestamp: setExpirationStartTimestamp(
), expirationMode,
}); fetchedMessage.get('sent_at')
),
});
}
} }
await fetchedMessage.commit(); await fetchedMessage.commit();

@ -35,7 +35,6 @@ import { SnodeNamespaces } from '../../apis/snode_api/namespaces';
import { READ_MESSAGE_STATE } from '../../../models/conversationAttributes'; import { READ_MESSAGE_STATE } from '../../../models/conversationAttributes';
import { import {
changeToDisappearingMessageType, changeToDisappearingMessageType,
isLegacyDisappearingModeEnabled,
setExpirationStartTimestamp, setExpirationStartTimestamp,
} from '../../../util/expiringMessages'; } from '../../../util/expiringMessages';
@ -517,22 +516,25 @@ export async function USER_callRecipient(recipient: string) {
await calledConvo.unhideIfNeeded(false); await calledConvo.unhideIfNeeded(false);
weAreCallerOnCurrentCall = true; weAreCallerOnCurrentCall = true;
// TODO legacy messages support will be removed in a future release const expirationMode = calledConvo.get('expirationType');
const isLegacyMode = isLegacyDisappearingModeEnabled(calledConvo.get('expirationType')); const expireTimer = calledConvo.get('expireTimer') || 0;
const expirationType = changeToDisappearingMessageType( let expirationType;
calledConvo, let expirationStartTimestamp;
calledConvo.get('expirationType')
); if (calledConvo && expirationMode && expireTimer > 0) {
expirationType = changeToDisappearingMessageType(calledConvo, expirationMode);
if (expirationMode === 'legacy' || expirationMode === 'deleteAfterSend') {
expirationStartTimestamp = setExpirationStartTimestamp(expirationMode, now);
}
}
await calledConvo?.addSingleOutgoingMessage({ await calledConvo?.addSingleOutgoingMessage({
callNotificationType: 'started-call', callNotificationType: 'started-call',
sent_at: now, sent_at: now,
expirationType: calledConvo.get('expireTimer') > 0 ? expirationType : undefined, expirationType,
expireTimer: calledConvo.get('expireTimer') ? calledConvo.get('expireTimer') : 0, expireTimer,
expirationStartTimestamp: setExpirationStartTimestamp( expirationStartTimestamp,
expirationType,
expirationType === 'deleteAfterSend' ? now : undefined,
isLegacyMode
),
}); });
// initiating a call is analogous to sending a message request // initiating a call is analogous to sending a message request
@ -894,25 +896,28 @@ export async function USER_acceptIncomingCallRequest(fromSender: string) {
callerConvo.set('active_at', networkTimestamp); callerConvo.set('active_at', networkTimestamp);
await callerConvo.unhideIfNeeded(false); await callerConvo.unhideIfNeeded(false);
// TODO legacy messages support will be removed in a future release const expirationMode = callerConvo.get('expirationType');
const isLegacyMode = isLegacyDisappearingModeEnabled(callerConvo.get('expirationType')); const expireTimer = callerConvo.get('expireTimer') || 0;
const expirationType = changeToDisappearingMessageType( let expirationType;
callerConvo, let expirationStartTimestamp;
callerConvo.get('expirationType')
); if (callerConvo && expirationMode && expireTimer > 0) {
expirationType = changeToDisappearingMessageType(callerConvo, expirationMode);
if (expirationMode === 'legacy' || expirationMode === 'deleteAfterSend') {
expirationStartTimestamp = setExpirationStartTimestamp(expirationMode, networkTimestamp);
}
}
await callerConvo?.addSingleIncomingMessage({ await callerConvo?.addSingleIncomingMessage({
callNotificationType: 'answered-a-call', callNotificationType: 'answered-a-call',
source: UserUtils.getOurPubKeyStrFromCache(), source: UserUtils.getOurPubKeyStrFromCache(),
sent_at: networkTimestamp, sent_at: networkTimestamp,
received_at: networkTimestamp, received_at: networkTimestamp,
unread: READ_MESSAGE_STATE.read, unread: READ_MESSAGE_STATE.read,
expirationType: callerConvo.get('expireTimer') > 0 ? expirationType : undefined, expirationType,
expireTimer: callerConvo.get('expireTimer') ? callerConvo.get('expireTimer') : 0, expireTimer,
expirationStartTimestamp: setExpirationStartTimestamp( expirationStartTimestamp,
expirationType,
expirationType === 'deleteAfterSend' ? networkTimestamp : undefined,
isLegacyMode
),
}); });
await buildAnswerAndSendIt(fromSender); await buildAnswerAndSendIt(fromSender);
@ -1243,29 +1248,28 @@ async function addMissedCallMessage(callerPubkey: string, sentAt: number) {
await incomingCallConversation.unhideIfNeeded(false); await incomingCallConversation.unhideIfNeeded(false);
} }
// TODO legacy messages support will be removed in a future release const expirationMode = incomingCallConversation.get('expirationType');
const isLegacyMode = isLegacyDisappearingModeEnabled( const expireTimer = incomingCallConversation.get('expireTimer') || 0;
incomingCallConversation.get('expirationType') let expirationType;
); let expirationStartTimestamp;
const expirationType = changeToDisappearingMessageType(
incomingCallConversation, if (incomingCallConversation && expirationMode && expireTimer > 0) {
incomingCallConversation.get('expirationType') expirationType = changeToDisappearingMessageType(incomingCallConversation, expirationMode);
);
if (expirationMode === 'legacy' || expirationMode === 'deleteAfterSend') {
expirationStartTimestamp = setExpirationStartTimestamp(expirationMode, sentAt);
}
}
await incomingCallConversation?.addSingleIncomingMessage({ await incomingCallConversation?.addSingleIncomingMessage({
callNotificationType: 'missed-call', callNotificationType: 'missed-call',
source: callerPubkey, source: callerPubkey,
sent_at: sentAt, sent_at: sentAt,
received_at: GetNetworkTime.getNowWithNetworkOffset(), received_at: GetNetworkTime.getNowWithNetworkOffset(),
unread: READ_MESSAGE_STATE.unread, unread: READ_MESSAGE_STATE.unread,
expirationType: incomingCallConversation.get('expireTimer') > 0 ? expirationType : undefined, expirationType,
expireTimer: incomingCallConversation.get('expireTimer') expireTimer,
? incomingCallConversation.get('expireTimer') expirationStartTimestamp,
: 0,
expirationStartTimestamp: setExpirationStartTimestamp(
expirationType,
expirationType === 'deleteAfterSend' ? sentAt : undefined,
isLegacyMode
),
}); });
} }

@ -239,18 +239,15 @@ export const ExpirationTimerOptions = {
}; };
export function setExpirationStartTimestamp( export function setExpirationStartTimestamp(
mode: DisappearingMessageType, mode: DisappearingMessageConversationType,
timestamp?: number, timestamp?: number
isLegacyMode?: boolean
): number | undefined { ): number | undefined {
let expirationStartTimestamp: number | undefined = GetNetworkTime.getNowWithNetworkOffset(); let expirationStartTimestamp: number | undefined = GetNetworkTime.getNowWithNetworkOffset();
// TODO legacy messages support will be removed in a future release // TODO legacy messages support will be removed in a future release
if (timestamp) { if (timestamp) {
window.log.debug( window.log.debug(
`We compare 2 timestamps for a disappear ${ `WIP: We compare 2 timestamps for a disappearing message (${mode}): expirationStartTimestamp `,
isLegacyMode ? 'legacy' : mode === 'deleteAfterRead' ? 'after read' : 'after send'
} message: expirationStartTimestamp `,
new Date(expirationStartTimestamp).toLocaleTimeString(), new Date(expirationStartTimestamp).toLocaleTimeString(),
'\ntimestamp ', '\ntimestamp ',
new Date(timestamp).toLocaleTimeString() new Date(timestamp).toLocaleTimeString()
@ -261,24 +258,28 @@ export function setExpirationStartTimestamp(
// TODO legacy messages support will be removed in a future release // TODO legacy messages support will be removed in a future release
if (mode === 'deleteAfterRead') { if (mode === 'deleteAfterRead') {
window.log.debug( window.log.debug(
`We set the start timestamp for a ${ `WIP: We set the start timestamp for a delete after read message to ${new Date(
isLegacyMode ? 'legacy ' : '' expirationStartTimestamp
}delete after read message to ${new Date(expirationStartTimestamp).toLocaleTimeString()}` ).toLocaleTimeString()}`
); );
} else if (mode === 'deleteAfterSend') { } else if (mode === 'deleteAfterSend') {
window.log.debug( window.log.debug(
`We set the start timestamp for a ${ `WIP: We set the start timestamp for a delete after send message to ${new Date(
isLegacyMode ? 'legacy ' : '' expirationStartTimestamp
}delete after send message to ${new Date(expirationStartTimestamp).toLocaleTimeString()}` ).toLocaleTimeString()}`
); );
// TODO needs improvement // TODO needs improvement
} else if (mode === 'unknown') { } else if (mode === 'legacy') {
window.log.debug( window.log.debug(
`Disappearing message mode "${mode}"set. This could be a legacy message or we are turning off disappearing messages` `WIP: We set the start timestamp for a legacy message to ${new Date(
expirationStartTimestamp
).toLocaleTimeString()}`
); );
} else if (mode === 'off') {
window.log.debug('Disappearing message mode has been turned off. We can safely ignore this.');
expirationStartTimestamp = undefined; expirationStartTimestamp = undefined;
} else { } else {
window.log.debug(`Invalid disappearing message mode "${mode}" set. Ignoring`); window.log.debug(`WIP: Invalid disappearing message mode "${mode}" set. Ignoring`);
expirationStartTimestamp = undefined; expirationStartTimestamp = undefined;
} }
@ -372,6 +373,7 @@ export async function checkForExpireUpdateInContentMessage(
const dataMessage = content.dataMessage as SignalService.DataMessage; const dataMessage = content.dataMessage as SignalService.DataMessage;
// We will only support legacy disappearing messages for a short period before disappearing messages v2 is unlocked // We will only support legacy disappearing messages for a short period before disappearing messages v2 is unlocked
const isDisappearingMessagesV2Released = await ReleasedFeatures.checkIsDisappearMessageV2FeatureReleased(); const isDisappearingMessagesV2Released = await ReleasedFeatures.checkIsDisappearMessageV2FeatureReleased();
// debugger;
const isLegacyContentMessage = checkIsLegacyContentMessage(content); const isLegacyContentMessage = checkIsLegacyContentMessage(content);
const isLegacyDataMessage = Boolean( const isLegacyDataMessage = Boolean(

Loading…
Cancel
Save