feat: use worker relay for events cache

This commit is contained in:
2024-01-18 21:11:48 +00:00
parent c2f78dad1e
commit 32a6d56cf5
16 changed files with 172 additions and 330 deletions

View File

@ -56,6 +56,10 @@ export class WorkerRelayInterface {
return (await this.#workerRpc<void, Uint8Array>("dumpDb")).result;
}
async sql(sql: string, params: Array<string | number>) {
return (await this.#workerRpc<object, Array<Array<any>>>("sql", { sql, params })).result;
}
#workerRpc<T, R>(cmd: string, args?: T, timeout = 30_000) {
const id = uuid();
const msg = {

View File

@ -83,10 +83,18 @@ export class WorkerRelay extends EventEmitter<WorkerRelayEvents> {
return eventInserted;
}
/**
* Run any SQL command
*/
sql(sql: string, params: Array<any>) {
return this.#db?.selectArrays(sql, params);
}
/**
* Write multiple events
*/
eventBatch(evs: Array<NostrEvent>) {
const start = unixNowMs();
let eventsInserted: Array<NostrEvent> = [];
this.#db?.transaction(db => {
for (const ev of evs) {
@ -96,7 +104,7 @@ export class WorkerRelay extends EventEmitter<WorkerRelayEvents> {
}
});
if (eventsInserted.length > 0) {
this.#log(`Inserted Batch: ${eventsInserted.length}/${evs.length}`);
this.#log(`Inserted Batch: ${eventsInserted.length}/${evs.length}, ${(unixNowMs() - start).toLocaleString()}ms`);
this.emit("event", eventsInserted);
}
return eventsInserted.length > 0;
@ -169,7 +177,7 @@ export class WorkerRelay extends EventEmitter<WorkerRelayEvents> {
const res = this.#db?.selectArrays(sql, params);
const results = res?.map(a => JSON.parse(a[0] as string) as NostrEvent) ?? [];
const time = unixNowMs() - start;
//this.#log(`Query ${id} results took ${time.toLocaleString()}ms`);
this.#log(`Query ${id} results took ${time.toLocaleString()}ms`);
return results;
}

View File

@ -1,6 +1,6 @@
export interface WorkerMessage<T> {
id: string;
cmd: "reply" | "init" | "open" | "migrate" | "event" | "req" | "count" | "summary" | "close" | "dumpDb";
cmd: "reply" | "init" | "open" | "migrate" | "event" | "req" | "count" | "summary" | "close" | "dumpDb" | "sql";
args: T;
}

View File

@ -138,6 +138,17 @@ globalThis.onmessage = ev => {
});
break;
}
case "sql": {
barrierQueue(cmdQueue, async () => {
const req = msg.args as {
sql: string;
params: Array<any>;
};
const res = relay.sql(req.sql, req.params);
reply(msg.id, res);
});
break;
}
default: {
reply(msg.id, { error: "Unknown command" });
break;