2024-01-01 17:28:10 +00:00
|
|
|
import { Dexie, Table } from "https://esm.sh/v135/dexie@3.2.4/dist/dexie.js";
|
|
|
|
import { NostrEvent, NostrKind } from "../../libs/nostr.ts/nostr.ts";
|
2023-11-17 07:50:53 +00:00
|
|
|
import { EventMark, EventMarker, EventRemover, EventsAdapter, Indices, RelayRecorder } from "../database.ts";
|
2024-01-01 17:28:10 +00:00
|
|
|
import { Tag } from "../nostr.ts";
|
2023-07-11 09:49:58 +00:00
|
|
|
|
2023-11-16 09:18:30 +00:00
|
|
|
export type RelayRecord = {
|
|
|
|
url: string;
|
|
|
|
event_id: string;
|
|
|
|
};
|
|
|
|
|
2024-01-01 17:28:10 +00:00
|
|
|
export class DexieDatabase extends Dexie implements EventsAdapter, RelayRecorder, EventMarker, EventRemover {
|
2023-09-07 14:58:53 +00:00
|
|
|
// 'events' is added by dexie when declaring the stores()
|
2023-07-11 09:49:58 +00:00
|
|
|
// We just tell the typing system this is the case
|
2024-03-17 17:05:32 +00:00
|
|
|
private events!: Table<NostrEvent>;
|
|
|
|
private relayRecords!: Table<RelayRecord>;
|
|
|
|
private eventMarks!: Table<EventMark>;
|
2023-07-11 09:49:58 +00:00
|
|
|
|
|
|
|
constructor() {
|
|
|
|
super("Events");
|
2023-11-17 07:06:11 +00:00
|
|
|
this.version(20).stores({
|
2023-07-11 09:49:58 +00:00
|
|
|
events: "&id, created_at, kind, tags, pubkey", // indices
|
2023-11-17 07:06:11 +00:00
|
|
|
relayRecords: "[url+event_id]", // RelayRecord
|
|
|
|
eventMarks: "&event_id, reason", // RemoveRecords
|
2023-07-11 09:49:58 +00:00
|
|
|
});
|
|
|
|
}
|
2023-11-17 07:06:11 +00:00
|
|
|
|
2023-09-18 23:23:03 +00:00
|
|
|
filter(f?: (e: NostrEvent) => boolean): Promise<NostrEvent[]> {
|
|
|
|
return this.events.toArray();
|
2023-09-07 14:58:53 +00:00
|
|
|
}
|
2023-11-17 07:06:11 +00:00
|
|
|
async get(keys: Indices) {
|
2024-03-17 17:05:32 +00:00
|
|
|
const e = await this.events.get(keys);
|
|
|
|
return e;
|
2023-09-07 14:58:53 +00:00
|
|
|
}
|
|
|
|
async put(e: NostrEvent<NostrKind, Tag>): Promise<void> {
|
2023-11-16 09:18:30 +00:00
|
|
|
await this.events.put(e);
|
2023-09-07 14:58:53 +00:00
|
|
|
}
|
2023-09-12 14:51:27 +00:00
|
|
|
async remove(id: string) {
|
2023-11-17 07:06:11 +00:00
|
|
|
return this.markEvent(id, "removed");
|
2023-09-12 14:51:27 +00:00
|
|
|
}
|
2023-11-16 09:18:30 +00:00
|
|
|
|
2023-11-17 07:06:11 +00:00
|
|
|
async setRelayRecord(eventID: string, url: string): Promise<void> {
|
2023-11-16 09:18:30 +00:00
|
|
|
await this.relayRecords.put({
|
|
|
|
url: url,
|
|
|
|
event_id: eventID,
|
|
|
|
});
|
2023-11-17 07:06:11 +00:00
|
|
|
}
|
2023-11-16 13:22:18 +00:00
|
|
|
|
2023-11-20 03:59:59 +00:00
|
|
|
getAllRelayRecords = async () => {
|
|
|
|
const resMap = new Map<string, Set<string>>();
|
|
|
|
for (const relay of await this.relayRecords.toArray()) {
|
|
|
|
const records = resMap.get(relay.event_id);
|
|
|
|
if (records) {
|
|
|
|
records.add(relay.url);
|
|
|
|
} else {
|
|
|
|
resMap.set(relay.event_id, new Set([relay.url]));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return resMap;
|
|
|
|
};
|
|
|
|
|
2023-11-17 07:06:11 +00:00
|
|
|
getMark(eventID: string): Promise<EventMark | undefined> {
|
|
|
|
return this.eventMarks.get(eventID);
|
|
|
|
}
|
|
|
|
async markEvent(eventID: string, reason: "removed"): Promise<void> {
|
|
|
|
await this.eventMarks.put({
|
|
|
|
event_id: eventID,
|
|
|
|
reason: reason,
|
|
|
|
});
|
|
|
|
}
|
2023-11-17 07:50:53 +00:00
|
|
|
async getAllMarks(): Promise<EventMark[]> {
|
|
|
|
return this.eventMarks.toArray();
|
|
|
|
}
|
2023-07-11 09:49:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
export function NewIndexedDB(): DexieDatabase | Error {
|
|
|
|
try {
|
|
|
|
const db = new DexieDatabase();
|
|
|
|
return db;
|
|
|
|
} catch (e) {
|
|
|
|
return e;
|
|
|
|
}
|
|
|
|
}
|