Files
nostash/Shared (Extension)/Resources/db.js
2023-02-15 23:02:38 -05:00

70 lines
1.9 KiB
JavaScript

import { openDB } from 'idb';
async function openEventsDb() {
return await openDB('events', 1, {
upgrade(db) {
const events = db.createObjectStore('events', {
keyPath: 'event.id',
});
events.createIndex('pubkey', 'event.pubkey');
events.createIndex('created_at', 'event.created_at');
events.createIndex('kind', 'event.kind');
events.createIndex('host', 'metadata.host');
},
});
}
export async function saveEvent(event) {
let db = await openEventsDb();
return db.put('events', event);
}
export async function sortByIndex(index, query, asc, max) {
let db = await openEventsDb();
let events = [];
let cursor = await db
.transaction('events')
.store.index(index)
.openCursor(query, asc ? 'next' : 'prev');
while (cursor) {
events.push(cursor.value);
if (events.length >= max) {
break;
}
cursor = await cursor.continue();
}
return events;
}
export async function getHosts() {
let db = await openEventsDb();
let hosts = new Set();
let cursor = await db.transaction('events').store.openCursor();
while (cursor) {
hosts.add(cursor.value.metadata.host);
cursor = await cursor.continue();
}
return [...hosts];
}
export async function downloadAllContents() {
let db = await openEventsDb();
let events = [];
let cursor = await db.transaction('events').store.openCursor();
while (cursor) {
events.push(cursor.value.event);
cursor = await cursor.continue();
}
events = events.map(e => JSON.stringify(e));
events = events.join('\n');
console.log(events);
const file = new File([events], 'events.jsonl', {
type: 'application/octet-stream',
});
const blob = new Blob([events], { type: 'plain/text' });
return blob;
}