// types/ndk-extensions.ts import { NDKCommon } from '@/types/ndk-common'; // Extend NDKRelay with missing properties declare module '@nostr-dev-kit/ndk-mobile' { interface NDKRelay { read?: boolean; write?: boolean; } interface NDK { removeRelay(url: string): void; addRelay(url: string, opts?: { read?: boolean; write?: boolean }, authPolicy?: any): NDKRelay | undefined; } } export function extendNDK(ndk: any): any { // Only add methods if they don't already exist if (!ndk.hasOwnProperty('removeRelay')) { ndk.removeRelay = function(url: string) { console.log(`[NDK Extension] Removing relay: ${url}`); if (this.pool && this.pool.relays) { this.pool.relays.delete(url); } }; } if (!ndk.hasOwnProperty('addRelay')) { ndk.addRelay = function(url: string, opts?: { read?: boolean; write?: boolean }, authPolicy?: any) { console.log(`[NDK Extension] Adding relay: ${url}`); // Check if pool exists if (!this.pool) { console.error('[NDK Extension] NDK pool does not exist'); return undefined; } // Check if relay already exists let relay = this.pool.getRelay ? this.pool.getRelay(url) : undefined; if (!relay) { try { // Try to create a relay with the constructor from this NDK instance const NDKRelay = this.constructor.NDKRelay; if (NDKRelay) { relay = new NDKRelay(url); } else { // Fallback to importing from ndk-mobile const { NDKRelay: ImportedNDKRelay } = require('@nostr-dev-kit/ndk-mobile'); relay = new ImportedNDKRelay(url); } // Add to pool if (this.pool.relays && relay) { this.pool.relays.set(url, relay); } } catch (error) { console.error('[NDK Extension] Error creating relay:', error); return undefined; } } // Set read/write permissions if provided if (relay && opts) { if (opts.read !== undefined) { relay.read = opts.read; } if (opts.write !== undefined) { relay.write = opts.write; } } return relay; }; } return ndk; }