session-desktop/ts/receiver/cache.ts
2020-07-02 15:02:32 +10:00

103 lines
2.6 KiB
TypeScript

import { EnvelopePlus } from './types';
import { StringUtils } from '../session/utils';
import _ from 'lodash';
export async function removeFromCache(envelope: EnvelopePlus) {
const { id } = envelope;
return window.textsecure.storage.unprocessed.remove(id);
}
export async function addToCache(
envelope: EnvelopePlus,
plaintext: ArrayBuffer
) {
const { id } = envelope;
const encodedEnvelope = StringUtils.decode(plaintext, 'base64');
const data: any = {
id,
version: 2,
envelope: encodedEnvelope,
timestamp: Date.now(),
attempts: 1,
};
if (envelope.senderIdentity) {
data.senderIdentity = envelope.senderIdentity;
}
return window.textsecure.storage.unprocessed.add(data);
}
export async function getAllFromCache() {
window.log.info('getAllFromCache');
const { textsecure } = window;
const count = await textsecure.storage.unprocessed.getCount();
if (count > 1500) {
await textsecure.storage.unprocessed.removeAll();
window.log.warn(
`There were ${count} messages in cache. Deleted all instead of reprocessing`
);
return [];
}
const items = await textsecure.storage.unprocessed.getAll();
window.log.info('getAllFromCache loaded', items.length, 'saved envelopes');
return Promise.all(
_.map(items, async (item: any) => {
const attempts = _.toNumber(item.attempts || 0) + 1;
try {
if (attempts >= 3) {
window.log.warn(
'getAllFromCache final attempt for envelope',
item.id
);
await textsecure.storage.unprocessed.remove(item.id);
} else {
await textsecure.storage.unprocessed.updateAttempts(
item.id,
attempts
);
}
} catch (error) {
window.log.error(
'getAllFromCache error updating item after load:',
error && error.stack ? error.stack : error
);
}
return item;
})
);
}
export async function updateCache(
envelope: EnvelopePlus,
plaintext: ArrayBuffer
): Promise<void> {
const { id } = envelope;
const item = await window.textsecure.storage.unprocessed.get(id);
if (!item) {
window.log.error(`updateCache: Didn't find item ${id} in cache to update`);
return;
}
item.source = envelope.source;
item.sourceDevice = envelope.sourceDevice;
item.serverTimestamp = envelope.serverTimestamp;
// For medium-size closed groups
if (envelope.senderIdentity) {
item.senderIdentity = envelope.senderIdentity;
}
item.decrypted = StringUtils.decode(plaintext, 'base64');
return window.textsecure.storage.unprocessed.addDecryptedData(item.id, item);
}