UNPKG

@nostr-dev-kit/ndk

Version:

NDK - Nostr Development Kit

85 lines (71 loc) 2.81 kB
import type { NDKEvent, NDKEventId } from "./index.js"; import type { NDKRelay } from "../relay/index.js"; let worker: Worker | undefined; const processingQueue: Record< NDKEventId, { event: NDKEvent; resolves: ((result: boolean) => void)[]; relay?: NDKRelay } > = {}; export function signatureVerificationInit(w: Worker) { worker = w; worker.onmessage = (msg: MessageEvent) => { const [eventId, result] = msg.data as [NDKEventId, boolean]; const record = processingQueue[eventId]; if (!record) { console.error("No record found for event", eventId); return; } delete processingQueue[eventId]; for (const resolve of record.resolves) { resolve(result); } }; } /** * Verify a signature asynchronously using either a custom function or a worker. * * This function first checks if a custom verification function is provided in the NDK instance. * If available, it uses that function. Otherwise, it falls back to the worker-based verification. * * @param event The event to verify * @param _persist Whether to persist the verification result * @param relay The relay that provided the event (optional) * @returns A promise that resolves to a boolean indicating if the signature is valid */ export async function verifySignatureAsync( event: NDKEvent, _persist: boolean, relay?: NDKRelay ): Promise<boolean> { // Measure total time spent in signature verification const ndkInstance = event.ndk!; const start = Date.now(); let result: boolean; // Use custom verification function if provided if (ndkInstance.signatureVerificationFunction) { console.log("[NDK-CORE] Using custom signature verification function async"); result = await ndkInstance.signatureVerificationFunction(event); console.log("Custom signature verification result", event.id, { result }); } else { console.log("Using worker-based signature verification async"); // Otherwise use the worker-based verification result = await new Promise<boolean>((resolve) => { const serialized = event.serialize(); let enqueue = false; if (!processingQueue[event.id]) { processingQueue[event.id] = { event, resolves: [], relay }; enqueue = true; } processingQueue[event.id].resolves.push(resolve); if (!enqueue) return; worker?.postMessage({ serialized, id: event.id, sig: event.sig, pubkey: event.pubkey, }); }); } // Accumulate elapsed time ndkInstance.signatureVerificationTimeMs += Date.now() - start; return result; }