add providers filter to runBackupCycle

This commit is contained in:
Sebastian 2021-07-07 13:28:02 -03:00
parent ff09c98f3b
commit ebfc79756f
No known key found for this signature in database
GPG Key ID: BE4FF68352439FC1
3 changed files with 39 additions and 3 deletions

View File

@ -110,3 +110,18 @@ export function strcmp(s1: string, s2: string): number {
export function j2s(x: any): string {
return JSON.stringify(x, undefined, 2);
}
/**
* Use this to filter null or undefined from an array in a type-safe fashion
*
* example:
* const array: Array<T | undefined> = [undefined, null]
* const filtered: Array<T> = array.filter(notEmpty)
*
* @param value
* @returns
*/
export function notEmpty<T>(value: T | null | undefined): value is T {
return value !== null && value !== undefined;
}

View File

@ -33,6 +33,7 @@ import {
Codec,
codecForAmountString,
codecForBoolean,
codecForList,
codecForNumber,
codecForString,
codecOptional,
@ -41,6 +42,7 @@ import {
getTimestampNow,
j2s,
Logger,
notEmpty,
NotificationType,
PreparePayResultType,
RecoveryLoadRequest,
@ -520,6 +522,19 @@ export async function processBackupForProvider(
await guardOperationException(run, onOpErr);
}
export interface RunBackupCycleRequest {
/**
* List of providers to backup or empty for all known providers.
*/
providers?: Array<string>;
}
export const codecForRunBackupCycle = (): Codec<RunBackupCycleRequest> =>
buildCodecForObject<RunBackupCycleRequest>()
.property("providers", codecOptional(codecForList(codecForString())))
.build("RunBackupCycleRequest");
/**
* Do one backup cycle that consists of:
* 1. Exporting a backup and try to upload it.
@ -527,11 +542,15 @@ export async function processBackupForProvider(
* 2. Download, verify and import backups from connected sync accounts.
* 3. Upload the updated backup blob.
*/
export async function runBackupCycle(ws: InternalWalletState): Promise<void> {
export async function runBackupCycle(ws: InternalWalletState, req: RunBackupCycleRequest): Promise<void> {
const providers = await ws.db
.mktx((x) => ({ backupProviders: x.backupProviders }))
.runReadOnly(async (tx) => {
return await tx.backupProviders.iter().toArray();
if (req.providers) {
const rs = await Promise.all(req.providers.map(id => tx.backupProviders.get(id)))
return rs.filter(notEmpty)
}
return await tx.backupProviders.iter(req.providers).toArray();
});
const backupJson = await exportBackup(ws);
const backupConfig = await provideBackupState(ws);

View File

@ -41,6 +41,7 @@ import {
import {
addBackupProvider,
codecForAddBackupProviderRequest,
codecForRunBackupCycle,
getBackupInfo,
getBackupRecovery,
loadBackupRecovery,
@ -809,7 +810,8 @@ async function dispatchRequestInternal(
return {};
}
case "runBackupCycle": {
await runBackupCycle(ws);
const req = codecForRunBackupCycle().decode(payload);
await runBackupCycle(ws, req);
return {};
}
case "exportBackupRecovery": {