) => {
+ console.log(e);
+ if (!e.target.files) {
+ throw new Error('e.target.files cant be null');
+ }
+ if (e.target.files.length != 1)
+ throw new Error(
+ 'Number of selected files for DB import must be 1 but was ' +
+ e.target.files.length +
+ '.'
+ );
+ const file = e.target.files[0];
+ try {
+ if (!file) throw new Error('No DB found to import.');
+ console.log('Importing DB ' + file.name);
+ await StorageUtils.importDB(file);
+ console.log('Import complete');
+ window.location.reload();
+ } catch (error) {
+ console.error('' + error);
+ }
+ };
+ return (
+
+
+
+
+ );
+ },
+ },
{
type: SettingInputType.CHECKBOX,
label: 'Show tokens per second',
diff --git a/tools/server/webui/src/utils/storage.ts b/tools/server/webui/src/utils/storage.ts
index 505693e9272ac..680ce73068d81 100644
--- a/tools/server/webui/src/utils/storage.ts
+++ b/tools/server/webui/src/utils/storage.ts
@@ -4,6 +4,7 @@
import { CONFIG_DEFAULT } from '../Config';
import { Conversation, Message, TimingReport } from './types';
import Dexie, { Table } from 'dexie';
+import { exportDB as exportDexieDB } from 'dexie-export-import';
const event = new EventTarget();
@@ -35,6 +36,16 @@ const StorageUtils = {
/**
* manage conversations
*/
+ async exportDB() {
+ return await exportDexieDB(db);
+ },
+
+ async importDB(file: File) {
+ await db.delete();
+ await db.open();
+ return await db.import(file);
+ },
+
async getAllConversations(): Promise {
await migrationLStoIDB().catch(console.error); // noop if already migrated
return (await db.conversations.toArray()).sort(