Files
snort/packages/worker-relay/src/memory-relay.ts
2024-02-05 11:06:46 +02:00

87 lines
1.9 KiB
TypeScript

import EventEmitter from "eventemitter3";
import { NostrEvent, RelayHandler, RelayHandlerEvents, ReqFilter, eventMatchesFilter, EventMetadata } from "./types";
import debug from "debug";
/**
* A very simple dumb fallback relay using a flat table
*/
export class InMemoryRelay extends EventEmitter<RelayHandlerEvents> implements RelayHandler {
#events: Map<string, NostrEvent> = new Map();
#log = debug("InMemoryRelay");
init(path: string): Promise<void> {
this.#log("Using in-memory relay");
return Promise.resolve();
}
count(req: ReqFilter): number {
let ret = 0;
for (const [, e] of this.#events) {
if (eventMatchesFilter(e, req)) {
ret++;
}
}
return ret;
}
summary(): Record<string, number> {
let ret = {} as Record<string, number>;
for (const [k, v] of this.#events) {
ret[v.kind.toString()] ??= 0;
ret[v.kind.toString()]++;
}
return ret;
}
dump(): Promise<Uint8Array> {
return Promise.resolve(new Uint8Array());
}
close(): void {
// nothing
}
event(ev: NostrEvent) {
if (this.#events.has(ev.id)) return false;
this.#events.set(ev.id, ev);
this.emit("event", [ev]);
return true;
}
eventBatch(evs: NostrEvent[]) {
const inserted = [];
for (const ev of evs) {
if (this.#events.has(ev.id)) continue;
this.#events.set(ev.id, ev);
inserted.push(ev);
}
if (inserted.length > 0) {
this.emit("event", inserted);
return true;
}
return false;
}
sql(sql: string, params: (string | number)[]): (string | number)[][] {
return [];
}
req(id: string, filter: ReqFilter) {
const ret = [];
for (const [, e] of this.#events) {
if (eventMatchesFilter(e, filter)) {
if (filter.ids_only === true) {
ret.push(e.id);
} else {
ret.push(e);
}
}
}
return ret;
}
setEventMetadata(_id: string, _meta: EventMetadata) {
return;
}
}