2023-01-03 11:55:46 -08:00
|
|
|
// Copyright 2019 Signal Messenger, LLC
|
2022-05-31 23:53:14 +00:00
|
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
|
|
|
|
import { debounce } from 'lodash';
|
2024-07-22 11:16:33 -07:00
|
|
|
import { DataReader } from '../sql/Client';
|
2022-05-31 23:53:14 +00:00
|
|
|
import { clearTimeoutIfNecessary } from '../util/clearTimeoutIfNecessary';
|
2024-10-15 15:43:06 -07:00
|
|
|
import { getMessageQueueTime } from '../util/getMessageQueueTime';
|
2022-11-22 10:43:43 -08:00
|
|
|
import * as Errors from '../types/errors';
|
2024-11-21 14:47:52 -05:00
|
|
|
import { strictAssert } from '../util/assert';
|
2024-12-19 11:15:52 -08:00
|
|
|
import { toBoundedDate } from '../util/timestamp';
|
2025-01-10 08:18:32 +10:00
|
|
|
import { getMessageIdForLogging } from '../util/idForLogging';
|
|
|
|
import { eraseMessageContents } from '../util/cleanup';
|
|
|
|
import { MessageModel } from '../models/messages';
|
2022-05-31 23:53:14 +00:00
|
|
|
|
|
|
|
async function eraseTapToViewMessages() {
|
|
|
|
try {
|
|
|
|
window.SignalContext.log.info(
|
|
|
|
'eraseTapToViewMessages: Loading messages...'
|
|
|
|
);
|
2024-10-15 15:43:06 -07:00
|
|
|
const maxTimestamp = Date.now() - getMessageQueueTime();
|
|
|
|
const messages =
|
|
|
|
await DataReader.getTapToViewMessagesNeedingErase(maxTimestamp);
|
2024-11-21 14:47:52 -05:00
|
|
|
|
2022-05-31 23:53:14 +00:00
|
|
|
await Promise.all(
|
|
|
|
messages.map(async fromDB => {
|
2024-11-21 14:47:52 -05:00
|
|
|
strictAssert(fromDB.isViewOnce === true, 'Must be view once');
|
|
|
|
strictAssert(
|
|
|
|
(fromDB.received_at_ms ?? 0) <= maxTimestamp,
|
|
|
|
'Must be older than maxTimestamp'
|
|
|
|
);
|
|
|
|
|
2025-01-10 08:18:32 +10:00
|
|
|
const message = window.MessageCache.register(new MessageModel(fromDB));
|
2022-05-31 23:53:14 +00:00
|
|
|
|
|
|
|
window.SignalContext.log.info(
|
|
|
|
'eraseTapToViewMessages: erasing message contents',
|
2025-01-10 08:18:32 +10:00
|
|
|
getMessageIdForLogging(message.attributes)
|
2022-05-31 23:53:14 +00:00
|
|
|
);
|
|
|
|
|
2022-06-22 17:21:38 -07:00
|
|
|
// We do this to update the UI, if this message is being displayed somewhere
|
2022-12-20 12:50:23 -05:00
|
|
|
window.reduxActions.conversations.messageExpired(message.id);
|
2022-06-22 17:21:38 -07:00
|
|
|
|
2025-01-10 08:18:32 +10:00
|
|
|
await eraseMessageContents(message);
|
2022-05-31 23:53:14 +00:00
|
|
|
})
|
|
|
|
);
|
|
|
|
} catch (error) {
|
|
|
|
window.SignalContext.log.error(
|
|
|
|
'eraseTapToViewMessages: Error erasing messages',
|
2022-11-22 10:43:43 -08:00
|
|
|
Errors.toLogFormat(error)
|
2022-05-31 23:53:14 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
window.SignalContext.log.info('eraseTapToViewMessages: complete');
|
|
|
|
}
|
|
|
|
|
|
|
|
class TapToViewMessagesDeletionService {
|
2025-01-14 11:11:52 -08:00
|
|
|
public update: () => Promise<void>;
|
2022-05-31 23:53:14 +00:00
|
|
|
|
2025-01-14 11:11:52 -08:00
|
|
|
#timeout?: ReturnType<typeof setTimeout>;
|
2022-05-31 23:53:14 +00:00
|
|
|
|
|
|
|
constructor() {
|
2025-01-14 11:11:52 -08:00
|
|
|
this.update = debounce(this.#checkTapToViewMessages, 1000);
|
2022-05-31 23:53:14 +00:00
|
|
|
}
|
|
|
|
|
2025-01-14 11:11:52 -08:00
|
|
|
async #checkTapToViewMessages() {
|
2024-11-21 14:47:52 -05:00
|
|
|
const receivedAtMsForOldestTapToViewMessage =
|
2024-07-22 11:16:33 -07:00
|
|
|
await DataReader.getNextTapToViewMessageTimestampToAgeOut();
|
2024-11-21 14:47:52 -05:00
|
|
|
if (!receivedAtMsForOldestTapToViewMessage) {
|
2022-05-31 23:53:14 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2024-11-21 14:47:52 -05:00
|
|
|
const nextCheck =
|
|
|
|
receivedAtMsForOldestTapToViewMessage + getMessageQueueTime();
|
2022-05-31 23:53:14 +00:00
|
|
|
window.SignalContext.log.info(
|
|
|
|
'checkTapToViewMessages: next check at',
|
2024-12-19 11:15:52 -08:00
|
|
|
toBoundedDate(nextCheck).toISOString()
|
2022-05-31 23:53:14 +00:00
|
|
|
);
|
|
|
|
|
|
|
|
let wait = nextCheck - Date.now();
|
|
|
|
|
|
|
|
// In the past
|
|
|
|
if (wait < 0) {
|
|
|
|
wait = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Too far in the future, since it's limited to a 32-bit value
|
|
|
|
if (wait > 2147483647) {
|
|
|
|
wait = 2147483647;
|
|
|
|
}
|
|
|
|
|
2025-01-14 11:11:52 -08:00
|
|
|
clearTimeoutIfNecessary(this.#timeout);
|
|
|
|
this.#timeout = setTimeout(async () => {
|
2022-05-31 23:53:14 +00:00
|
|
|
await eraseTapToViewMessages();
|
2022-12-21 10:41:48 -08:00
|
|
|
void this.update();
|
2022-05-31 23:53:14 +00:00
|
|
|
}, wait);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export const tapToViewMessagesDeletionService =
|
|
|
|
new TapToViewMessagesDeletionService();
|