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/syncUtils.ts

78 lines
2.4 KiB
TypeScript

import { createOrUpdateItem, getItemById } from '../../../ts/data/data';
import { getMessageQueue } from '..';
import { ConversationController } from '../conversations';
import { getCurrentConfigurationMessage } from './Messages';
import { RawMessage } from '../types';
import { DAYS } from './Number';
const ITEM_ID_LAST_SYNC_TIMESTAMP = 'lastSyncedTimestamp';
const getLastSyncTimestampFromDb = async (): Promise<number | undefined> =>
(await getItemById(ITEM_ID_LAST_SYNC_TIMESTAMP))?.value;
const writeLastSyncTimestampToDb = async (timestamp: number) =>
createOrUpdateItem({ id: ITEM_ID_LAST_SYNC_TIMESTAMP, value: timestamp });
export const syncConfigurationIfNeeded = async () => {
const lastSyncedTimestamp = (await getLastSyncTimestampFromDb()) || 0;
const now = Date.now();
// if the last sync was less than 2 days before, return early.
if (Math.abs(now - lastSyncedTimestamp) < DAYS * 2) {
return;
}
const allConvos = ConversationController.getInstance().getConversations();
const configMessage = await getCurrentConfigurationMessage(allConvos);
try {
window.log.info('syncConfigurationIfNeeded with', configMessage);
await getMessageQueue().sendSyncMessage(configMessage);
} catch (e) {
window.log.warn(
'Caught an error while sending our ConfigurationMessage:',
e
);
// we do return early so that next time we use the old timestamp again
// and so try again to trigger a sync
return;
}
await writeLastSyncTimestampToDb(now);
};
export const forceSyncConfigurationNowIfNeeded = async (
waitForMessageSent = false
) => {
const allConvos = ConversationController.getInstance().getConversations();
const configMessage = await getCurrentConfigurationMessage(allConvos);
async function waitForMessageSentEvent(message: RawMessage) {
return new Promise(resolve => {
if (message.identifier === configMessage.identifier) {
resolve(true);
}
});
}
try {
// passing the callback like that
if (waitForMessageSent) {
await getMessageQueue().sendSyncMessage(
configMessage,
waitForMessageSentEvent as any
);
return Promise.resolve();
} else {
await getMessageQueue().sendSyncMessage(configMessage);
return waitForMessageSentEvent;
}
} catch (e) {
window.log.warn(
'Caught an error while sending our ConfigurationMessage:',
e
);
}
return Promise.resolve();
};