feat: use worker relay for events cache
This commit is contained in:
@ -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 = {
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user