Download backup file
This commit is contained in:
parent
5fe5493548
commit
bb70f092d5
@ -24,7 +24,7 @@
|
|||||||
<div class="menu-content" id="menu">
|
<div class="menu-content" id="menu">
|
||||||
<!-- <a onclick="unpair()">Revoke</a> -->
|
<!-- <a onclick="unpair()">Revoke</a> -->
|
||||||
<a onclick="importJSON()">Import</a>
|
<a onclick="importJSON()">Import</a>
|
||||||
<a onclick="importJSON()">Export</a>
|
<a onclick="createBackUp()">Export</a>
|
||||||
<a onclick="navigate('account')">Account</a>
|
<a onclick="navigate('account')">Account</a>
|
||||||
<a onclick="navigate('chat')">Chat</a>
|
<a onclick="navigate('chat')">Chat</a>
|
||||||
<a onclick="navigate('signature')">Signatures</a>
|
<a onclick="navigate('signature')">Signatures</a>
|
||||||
|
@ -151,3 +151,31 @@ async function importJSON() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
(window as any).importJSON = importJSON;
|
(window as any).importJSON = importJSON;
|
||||||
|
|
||||||
|
async function createBackUp() {
|
||||||
|
const service = await Services.getInstance();
|
||||||
|
const backUp = await service.createBackUp();
|
||||||
|
if (!backUp) {
|
||||||
|
console.error("No device to backup");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const backUpJson = JSON.stringify(backUp, null, 2)
|
||||||
|
const blob = new Blob([backUpJson], { type: 'application/json' });
|
||||||
|
const url = URL.createObjectURL(blob);
|
||||||
|
|
||||||
|
const a = document.createElement('a');
|
||||||
|
a.href = url;
|
||||||
|
a.download = '4nk-backup.json';
|
||||||
|
a.click();
|
||||||
|
|
||||||
|
URL.revokeObjectURL(url);
|
||||||
|
|
||||||
|
console.log('Backup successfully prepared for download');
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(window as any).createBackUp = createBackUp;
|
||||||
|
7
src/models/backup.model.ts
Normal file
7
src/models/backup.model.ts
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
import { Device, Process, SecretsStore } from "pkg/sdk_client";
|
||||||
|
|
||||||
|
export interface BackUp {
|
||||||
|
device: Device,
|
||||||
|
secrets: SecretsStore,
|
||||||
|
processes: Record<string, Process>,
|
||||||
|
}
|
@ -3,10 +3,11 @@ import { INotification } from '~/models/notification.model';
|
|||||||
import { IProcess } from '~/models/process.model';
|
import { IProcess } from '~/models/process.model';
|
||||||
// import Database from './database';
|
// import Database from './database';
|
||||||
import { initWebsocket, sendMessage } from '../websockets';
|
import { initWebsocket, sendMessage } from '../websockets';
|
||||||
import { ApiReturn, Member, Process, RoleDefinition, UserDiff } from '../../pkg/sdk_client';
|
import { ApiReturn, Device, Member, Process, RoleDefinition, SecretsStore, UserDiff } from '../../pkg/sdk_client';
|
||||||
import ModalService from './modal.service';
|
import ModalService from './modal.service';
|
||||||
import Database from './database.service';
|
import Database from './database.service';
|
||||||
import { storeData, retrieveData } from './storage.service';
|
import { storeData, retrieveData } from './storage.service';
|
||||||
|
import { BackUp } from '~/models/backup.model';
|
||||||
|
|
||||||
export const U32_MAX = 4294967295;
|
export const U32_MAX = 4294967295;
|
||||||
|
|
||||||
@ -146,6 +147,19 @@ export default class Services {
|
|||||||
return await db.getObject('shared_secrets', address);
|
return await db.getObject('shared_secrets', address);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async getAllSecrets(): Promise<SecretsStore> {
|
||||||
|
const db = await Database.getInstance();
|
||||||
|
const sharedSecrets = await db.dumpStore('shared_secrets');
|
||||||
|
const unconfirmedSecrets = await db.dumpStore('unconfirmed_secrets'); // keys are numeric values
|
||||||
|
|
||||||
|
const secretsStore = {
|
||||||
|
shared_secrets: sharedSecrets,
|
||||||
|
unconfirmed_secrets: Object.values(unconfirmedSecrets),
|
||||||
|
};
|
||||||
|
|
||||||
|
return secretsStore;
|
||||||
|
}
|
||||||
|
|
||||||
public async connectMember(members: Member[]): Promise<ApiReturn> {
|
public async connectMember(members: Member[]): Promise<ApiReturn> {
|
||||||
if (members.length === 0) {
|
if (members.length === 0) {
|
||||||
throw new Error('Trying to connect to empty members list');
|
throw new Error('Trying to connect to empty members list');
|
||||||
@ -675,6 +689,32 @@ export default class Services {
|
|||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async createBackUp(): Promise<BackUp | null> {
|
||||||
|
// Get the device from indexedDB
|
||||||
|
const deviceStr = await this.getDeviceFromDatabase();
|
||||||
|
if (!deviceStr) {
|
||||||
|
console.error('No device loaded');
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const device: Device = JSON.parse(deviceStr);
|
||||||
|
|
||||||
|
// Get the processes
|
||||||
|
const processes = await this.getProcesses();
|
||||||
|
|
||||||
|
// Get the shared secrets
|
||||||
|
const secrets = await this.getAllSecrets();
|
||||||
|
|
||||||
|
// Create a backup object
|
||||||
|
const backUp = {
|
||||||
|
device: device,
|
||||||
|
secrets: secrets,
|
||||||
|
processes: processes,
|
||||||
|
};
|
||||||
|
|
||||||
|
return backUp;
|
||||||
|
}
|
||||||
|
|
||||||
// Device 1 wait Device 2
|
// Device 1 wait Device 2
|
||||||
public device1: boolean = false;
|
public device1: boolean = false;
|
||||||
public device2Ready: boolean = false;
|
public device2Ready: boolean = false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user