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 { 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); }