Browse Source

Use websocketpool in publication feed

master
silberengel 7 months ago
parent
commit
521db62f60
  1. 68
      src/lib/components/publications/PublicationFeed.svelte

68
src/lib/components/publications/PublicationFeed.svelte

@ -7,10 +7,9 @@
import { onMount, onDestroy } from "svelte"; import { onMount, onDestroy } from "svelte";
import { import {
getMatchingTags, getMatchingTags,
NDKRelaySetFromNDK,
type NDKEvent,
type NDKRelaySet,
} from "$lib/utils/nostrUtils"; } from "$lib/utils/nostrUtils";
import { WebSocketPool } from "$lib/data_structures/websocket_pool";
import { NDKEvent } from "@nostr-dev-kit/ndk";
import { searchCache } from "$lib/utils/searchCache"; import { searchCache } from "$lib/utils/searchCache";
import { indexEventCache } from "$lib/utils/indexEventCache"; import { indexEventCache } from "$lib/utils/indexEventCache";
import { isValidNip05Address } from "$lib/utils/search_utility"; import { isValidNip05Address } from "$lib/utils/search_utility";
@ -139,21 +138,54 @@
async function fetchFromRelay(relay: string): Promise<void> { async function fetchFromRelay(relay: string): Promise<void> {
try { try {
console.debug(`[PublicationFeed] Fetching from relay: ${relay}`); console.debug(`[PublicationFeed] Fetching from relay: ${relay}`);
const relaySet = NDKRelaySetFromNDK.fromRelayUrls([relay], ndk);
let eventSet = await ndk // Use WebSocketPool to get a pooled connection
.fetchEvents( const ws = await WebSocketPool.instance.acquire(relay);
{ const subId = crypto.randomUUID();
kinds: [indexKind],
limit: 1000, // Increased limit to get more events // Create a promise that resolves with the events
}, const eventPromise = new Promise<Set<NDKEvent>>((resolve, reject) => {
{ const events = new Set<NDKEvent>();
groupable: false,
skipVerification: false, const messageHandler = (ev: MessageEvent) => {
skipValidation: false, try {
}, const data = JSON.parse(ev.data);
relaySet,
) if (data[0] === "EVENT" && data[1] === subId) {
.withTimeout(5000); // Reduced timeout to 5 seconds for faster response const event = new NDKEvent(ndk, data[2]);
events.add(event);
} else if (data[0] === "EOSE" && data[1] === subId) {
resolve(events);
}
} catch (error) {
console.error(`[PublicationFeed] Error parsing message from ${relay}:`, error);
}
};
const errorHandler = (ev: Event) => {
reject(new Error(`WebSocket error for ${relay}: ${ev}`));
};
ws.addEventListener("message", messageHandler);
ws.addEventListener("error", errorHandler);
// Send the subscription request
ws.send(JSON.stringify([
"REQ",
subId,
{ kinds: [indexKind], limit: 1000 }
]));
// Set up cleanup
setTimeout(() => {
ws.removeEventListener("message", messageHandler);
ws.removeEventListener("error", errorHandler);
WebSocketPool.instance.release(ws);
resolve(events);
}, 5000);
});
let eventSet = await eventPromise;
console.debug(`[PublicationFeed] Raw events from ${relay}:`, eventSet.size); console.debug(`[PublicationFeed] Raw events from ${relay}:`, eventSet.size);
eventSet = filterValidIndexEvents(eventSet); eventSet = filterValidIndexEvents(eventSet);

Loading…
Cancel
Save