add providers filter to runBackupCycle
This commit is contained in:
parent
ff09c98f3b
commit
ebfc79756f
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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": {
|
||||
|
Loading…
Reference in New Issue
Block a user