@nostr-dev-kit/ndk-svelte
Version:
This package provides convenience functionalities to make usage of NDK with Svelte nicer.
64 lines (63 loc) • 2.06 kB
JavaScript
// src/index.svelte.ts
import NDK from "@nostr-dev-kit/ndk";
import { onDestroy } from "svelte";
var NDKSvelte = class extends NDK {
/**
* Subscribes to NDK events and returns a reactive list of events.
* Automatically cleans up the subscription when no longer needed.
*/
$subscribe = (filters, opts, klass) => {
const eventList = $state([]);
const eventMap = /* @__PURE__ */ new Map();
const processEvent = (event) => {
let e = event;
if (klass) {
const convertedEvent = klass.from(event);
if (!convertedEvent) return;
e = convertedEvent;
e.relay = event.relay;
}
const dedupKey = e.deduplicationKey();
if (eventMap.has(dedupKey)) {
const existingEvent = eventMap.get(dedupKey);
if (existingEvent.created_at >= e.created_at) return;
}
const isDeleted = e.isParamReplaceable() && e.hasTag("deleted");
eventMap.set(dedupKey, e);
if (isDeleted && opts?.skipDeleted !== false) {
const index = eventList.findIndex((event2) => event2.deduplicationKey() === dedupKey);
if (index !== -1) {
eventList.splice(index, 1);
}
return;
}
const pos = eventList.findIndex((event2) => event2.created_at < e.created_at);
eventList.splice(pos, 0, e);
};
const subscription = this.subscribe(
Array.isArray(filters) ? filters : [filters],
opts,
// opts already contains relaySet if it was passed
// opts?.relaySet, // Removed: Passed via opts
false
// autoStart = false
);
subscription.on("event", (event, relay) => {
processEvent(event);
if (opts?.onEvent) opts.onEvent(event, relay);
});
subscription.on("eose", () => {
if (opts?.onEose) opts.onEose();
});
subscription.start();
onDestroy(() => {
subscription.stop();
});
eventList.unsubscribe = () => subscription.stop();
return eventList;
};
};
var index_svelte_default = NDKSvelte;
export {
index_svelte_default as default
};