import { schnorr } from "@noble/curves/secp256k1"; import { ReqFilter } from "../nostr"; import { expandFilter } from "./request-expander"; import { flatMerge, mergeSimilar } from "./request-merger"; import { diffFilters } from "./request-splitter"; export interface FlatReqFilter { keys: number; ids?: string; authors?: string; kinds?: number; "#e"?: string; "#p"?: string; "#t"?: string; "#d"?: string; "#r"?: string; search?: string; since?: number; until?: number; limit?: number; resultSetId: string; } export interface QueryOptimizer { expandFilter(f: ReqFilter): Array; getDiff(prev: Array, next: Array): Array; flatMerge(all: Array): Array; compress(all: Array): Array; schnorrVerify(hash: string, sig: string, pubkey: string): boolean; } export const DefaultQueryOptimizer = { expandFilter: (f: ReqFilter) => { return expandFilter(f); }, getDiff: (prev: Array, next: Array) => { const diff = diffFilters( prev.flatMap(a => expandFilter(a)), next.flatMap(a => expandFilter(a)), ); return diff.added; }, flatMerge: (all: Array) => { return flatMerge(all); }, compress: (all: Array) => { return mergeSimilar(all); }, schnorrVerify: (hash, sig, pubkey) => { return schnorr.verify(sig, hash, pubkey); }, } as QueryOptimizer;