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.
session-desktop/ts/session/utils/job_runners/jobs/UpdateMsgExpirySwarmJob.ts

99 lines
2.9 KiB
TypeScript

/* eslint-disable no-await-in-loop */
import { isEmpty, isNumber, uniq } from 'lodash';
import { v4 } from 'uuid';
import { Data } from '../../../../data/data';
import { isSignInByLinking } from '../../../../util/storage';
import { DisappearingMessages } from '../../../disappearing_messages';
import { runners } from '../JobRunner';
import {
AddJobCheckReturn,
PersistedJob,
RunJobResult,
UpdateMsgExpirySwarmPersistedData,
} from '../PersistedJob';
class UpdateMsgExpirySwarmJob extends PersistedJob<UpdateMsgExpirySwarmPersistedData> {
constructor({
identifier,
nextAttemptTimestamp,
maxAttempts,
currentRetry,
msgIds,
}: Partial<
Pick<
UpdateMsgExpirySwarmPersistedData,
'identifier' | 'nextAttemptTimestamp' | 'currentRetry' | 'maxAttempts'
>
> &
Pick<UpdateMsgExpirySwarmPersistedData, 'msgIds'>) {
super({
jobType: 'UpdateMsgExpirySwarmJobType',
identifier: identifier || v4(),
delayBetweenRetries: 2000,
maxAttempts: isNumber(maxAttempts) ? maxAttempts : 2,
currentRetry: isNumber(currentRetry) ? currentRetry : 0,
nextAttemptTimestamp: nextAttemptTimestamp || Date.now(),
msgIds: uniq(msgIds),
});
}
public async run(): Promise<RunJobResult> {
const start = Date.now();
try {
if (!this.persistedData.msgIds || isEmpty(this.persistedData.msgIds)) {
return RunJobResult.Success;
}
const msgModels = await Data.getMessagesById(this.persistedData.msgIds);
if (isEmpty(msgModels)) {
return RunJobResult.Success;
}
await DisappearingMessages.updateMessageExpiriesOnSwarm(msgModels);
await DisappearingMessages.destroyExpiredMessages();
return RunJobResult.Success;
} finally {
window.log.debug(`UpdateMsgExpirySwarmJob run() took ${Date.now() - start}ms`);
}
}
public serializeJob(): UpdateMsgExpirySwarmPersistedData {
const fromParent = super.serializeBase();
return fromParent;
}
public addJobCheck(jobs: Array<UpdateMsgExpirySwarmPersistedData>): AddJobCheckReturn {
// if all ids we are trying to add are already tracked as other jobs in the job runner,
// there is no need to add this job at all.
return this.addJobCheckEveryMsgIdsAlreadyPresent(jobs);
}
public nonRunningJobsToRemove(_jobs: Array<UpdateMsgExpirySwarmPersistedData>) {
return [];
}
public getJobTimeoutMs(): number {
return 20000;
}
}
async function queueNewJobIfNeeded(msgIds: Array<string>) {
if (isSignInByLinking()) {
window.log.info('NOT Scheduling UpdateMsgExpirySwarmJob: as we are linking a device');
return;
}
if (isEmpty(msgIds)) {
return;
}
await runners.updateMsgExpiryRunner.addJob(
new UpdateMsgExpirySwarmJob({ nextAttemptTimestamp: Date.now() + 1000, msgIds })
);
}
export const UpdateMsgExpirySwarm = {
UpdateMsgExpirySwarmJob,
queueNewJobIfNeeded,
};