diff --git a/src/lib/components/LoginButton.svelte b/src/lib/components/LoginButton.svelte
index c65d00a..119e52e 100644
--- a/src/lib/components/LoginButton.svelte
+++ b/src/lib/components/LoginButton.svelte
@@ -1,5 +1,4 @@
{$shortListLength}
diff --git a/src/lib/workers.deprecated/firehose.ts b/src/lib/workers.deprecated/firehose.ts
deleted file mode 100644
index b34668f..0000000
--- a/src/lib/workers.deprecated/firehose.ts
+++ /dev/null
@@ -1,446 +0,0 @@
-import { NDKEvent, type NDKFilter, type NostrEvent } from '@nostr-dev-kit/ndk';
-import NDKSvelte, { type ExtendedBaseType, type NDKEventStore } from '@nostr-dev-kit/ndk-svelte';
-import { derived, get, writable, type Writable } from 'svelte/store';
-
-import NDKCacheAdapterDexie from '@nostr-dev-kit/ndk-cache-dexie';
-import {
- Command,
- EventTreeItem,
- FrontendData,
- WorkerData,
- type RecursiveEventMap
-} from './firehose.types';
-import { reducedRelays, seedRelays } from './seed_relays';
-import { tagSplits } from './firehose.utils';
-
-const __ndk = new NDKSvelte({
- //cacheAdapter: new NDKCacheAdapterDexie({ dbName: "firehose" }),
- explicitRelayUrls: ["wss://relay.nostrocket.org"],
- enableOutboxModel: true
-});
-
-const _ndk = writable(__ndk);
-
-const ndk = get(_ndk);
-let sub: NDKEventStore> | undefined = undefined;
-
-let workerData: WorkerData | undefined; // = new ResponseData();
-let frontendData = new FrontendData();
-export let frontendStore = writable(frontendData);
-const workerEventMap = new Map();
-const mostRecentReplaceableEvents: Map = new Map();
-const replaceableKinds = [0, 3];
-const processedIdForKind: Record = {};
-
-let workerStore: Writable | undefined; // =
-let printed = 0;
-let printedID = new Set();
-function init(pubkey?: string) {
- if (!workerData) {
- workerData = new WorkerData(pubkey);
- workerStore = writable(workerData);
- frontendStore.subscribe((data) => {
- postMessage(data);
- });
- workerStore.subscribe((response) => {
- let n = new FrontendData();
- n.rootEvents = Array.from(response.rootEvents);
- n.replies = new Map();
- n.events = response.events;
- for (let [id, event] of response.events) {
- if (event.kind == 1) {
- let _ndk_event = new NDKEvent(undefined, event);
- let tagsForEvent = new tagSplits(_ndk_event);
- if (tagsForEvent.unknown.size > 0) {
- if (printed < 20 && !printedID.has(_ndk_event.id)) {
- printed++;
- printedID.add(_ndk_event.id);
- console.log('unknown tag detected', printed, _ndk_event.rawEvent());
- }
- }
- if (
- (tagsForEvent.replies.size == 0 && tagsForEvent.unlabelled.size > 1) ||
- tagsForEvent.replies.size > 1
- ) {
- let events = new Map();
- let missing = new Set();
- let possibleReplies = new Set([...tagsForEvent.unlabelled, ...tagsForEvent.replies]);
- for (let _id of possibleReplies) {
- let _event = response.events.get(_id);
- if (_event) {
- events.set(_id, new NDKEvent(undefined, _event));
- }
- if (!_event) {
- missing.add(_id);
- }
- }
- if (missing.size == 0 && events.size > 0) {
- let allTaggedEvents = new Set();
- for (let [_, e] of events) {
- let splits = new tagSplits(e);
- for (let id of splits.All()) {
- allTaggedEvents.add(id);
- }
- }
- let tagsThatAreNotInTaggedEvents = new Set();
- for (let id of possibleReplies) {
- if (!allTaggedEvents.has(id)) {
- tagsThatAreNotInTaggedEvents.add(id);
- }
- }
- if (tagsThatAreNotInTaggedEvents.size == 1) {
- //console.log(96);
- tagsForEvent.replies = new Set([tagsThatAreNotInTaggedEvents][0]);
- }
- //if more than one in replies: find all the tagged events and see which tag among all these events is unique (the unique one is probably the reply, and the repeated one(s) are the root or further up in the thread)
- //console.log('implement me');
- } else {
- //console.log(missing)
- //todo: fetch missing events by ID
- }
- }
- if (tagsForEvent.replies.size == 1) {
- let existing = n.replies.get([...tagsForEvent.replies][0]);
- if (!existing) {
- existing = [];
- }
- existing.push(event.id!);
- n.replies.set([...tagsForEvent.replies][0], existing);
- }
- }
- }
- n.rootEvents.sort((a, b) => {
- let a_replies = n.replies.get(a);
- let b_replies = n.replies.get(b);
- if (a_replies && b_replies) {
- return b_replies.length - a_replies.length;
- }
- if (!a_replies && b_replies) {
- return 1;
- }
- if (!b_replies && a_replies) {
- return -1;
- }
- return 0;
- });
- frontendStore.set(n);
- });
-
- let rootEvents = derived(workerStore!, ($responseStore) => {
- return $responseStore.rootEvents.size;
- });
-
- rootEvents.subscribe(() => {
- updateEventMap();
- });
-
- let masterFollows = derived(workerStore, ($responseStore) => {
- if ($responseStore.masterPubkey) {
- return $responseStore.followLists.get($responseStore.masterPubkey)?.size;
- }
- });
-
- masterFollows.subscribe(() => {
- let $responseStore = get(workerStore!);
- if ($responseStore.masterPubkey) {
- let follows = $responseStore.followLists.get($responseStore.masterPubkey);
- if (follows) {
- subscribe($responseStore.masterPubkey, [...follows]);
- }
- }
- });
- let rootCount = derived(workerStore, ($responseStore) => {
- if ($responseStore.masterPubkey) {
- return $responseStore.etags.size;
- }
- });
- let lastUpdate = 0;
- rootCount.subscribe((num) => {
- if (num && num - lastUpdate > 200) {
- lastUpdate = num;
- subscribe();
- }
- });
- }
-}
-
-let subscribe = (pubkey?: string, pubkeys?: string[]) => {
- if (pubkey && pubkey.length != 64) {
- throw new Error('invalid pubkey');
- }
- if (!workerData && !pubkey) {
- return;
- }
- if (!workerData && pubkey) {
- init(pubkey);
- }
- if (!workerData) {
- throw new Error('this should not happen');
- }
- if (connectionStatus != 2) {
- workerStore!.update((current) => {
- current.errors.push(new Error('not connected!'));
- return current;
- });
- return;
- }
- if (pubkey) {
- workerData.masterPubkey = pubkey;
- }
- if (!sub && pubkey) {
- sub = ndk.storeSubscribe(
- { kinds: [3], authors: [pubkey] },
- { subId: 'master', closeOnEose: false }
- );
- sub.subscribe((events) => {
- for (let event of events) {
- //experimentalPub(event)
- workerEventMap.set(event.id, event);
- let shouldPush = true;
- if (replaceableKinds.includes(event.kind!)) {
- let existing = mostRecentReplaceableEvents.get(event.deduplicationKey());
- if (existing && event.created_at! < existing.created_at!) {
- shouldPush = false;
- } else {
- mostRecentReplaceableEvents.set(event.deduplicationKey(), event);
- }
- }
- if (shouldPush) {
- workerData!.PushEvent(event.rawEvent());
- }
- }
- workerStore!.update((current) => {
- current.rawCount = events.length;
- if (sub?.subscription) {
- for (let [s, relay] of sub.subscription.pool.relays) {
- current.connections.set(s, relay.activeSubscriptions().size);
- }
- } else {
- current.connections = new Map();
- }
- return current;
- });
- });
- } else if (sub) {
- sub.unsubscribe();
- let newFilters: NDKFilter[] = [];
- let authors = new Set();
- if (pubkeys) {
- authors = new Set(pubkeys);
- }
- if (pubkey) {
- authors.add(pubkey);
- }
- if (sub.filters) {
- for (let fi of sub.filters) {
- if (fi.authors) {
- for (let author of fi.authors) {
- authors.add(author);
- }
- }
- }
- }
- newFilters = [];
- _ndk.update((existing) => {
- if (workerData) {
- for (let r of workerData.relays) {
- existing.addExplicitRelay(r, undefined, true);
- }
- }
- return existing;
- });
- let $frontendData = get(frontendStore);
- let etags = [...Array.from(workerData.etags, ([id, _]) => id)];
- let roots = new Set([...Array.from($frontendData.replies, ([id, _]) => id)]);
- let missingRoots = [];
- for (let id of roots) {
- if (!workerData.events.get(id)) {
- missingRoots.push(id);
- }
- }
- let missingEventsSorted = missingRoots.toSorted((a, b) => {
- return $frontendData.replies.get(a)!.length - $frontendData.replies.get(b)!.length;
- });
-
- if (missingEventsSorted.length > 200) {
- missingEventsSorted.length = 200;
- }
-
- // missingEventsSorted.forEach((id)=>{
- // console.log(267, get(frontendStore).replies.get(id)!.length)
- // })
-
- let truncatedAuthors = [];
- for (let a of authors) {
- truncatedAuthors.push(a.substring(0, 32));
- }
-
- //console.log(etags)
- newFilters.push({ kinds: [1, 7], authors: truncatedAuthors, since: 1713087410 });
- //newFilters.push({ kinds: [10002], authors: truncatedAuthors });
- //newFilters.push({ kinds: [0, 3], authors: truncatedAuthors });
- //newFilters.push({ kinds: [1], authors: truncatedAuthors, since: 1713087410});
- newFilters.push({ kinds: [1], '#e': [...roots] });
- if (missingEventsSorted.length > 0) {
- // let i = 0
- // for (let id of missingEventsSorted)
- // newFilters.push({ids: [id]});
- // i++
- //let subFilters = [];
- newFilters.push({ ids: missingEventsSorted });
- // ndk.fetchEvents(subFilters).then((r) => {
- // console.log(r);
- // r.forEach(event=>{
- // workerEventMap.set(event.id, event);
- // let shouldPush = true;
- // if (replaceableKinds.includes(event.kind!)) {
- // let existing = mostRecentReplaceableEvents.get(event.deduplicationKey());
- // if (existing && event.created_at! < existing.created_at!) {
- // shouldPush = false;
- // } else {
- // mostRecentReplaceableEvents.set(event.deduplicationKey(), event);
- // }
- // }
- // if (shouldPush) {
- // workerData!.PushEvent(event.rawEvent());
- // }
- // })
- // });
- //experimentalSub(subFilters);
- }
-
- // newFilters.push({ kinds: [3], authors: [pubkey] });
- // for (let author of authors) {
- // newFilters.push({ kinds: [0, 1, 3, 7, 10002], authors: [author] });
- // }
-
- sub.changeFilters(newFilters);
- //console.log(261)
- console.log(sub.filters);
-
- sub.startSubscription();
- }
-};
-
-let connectionStatus = 0;
-
-onmessage = (m: MessageEvent) => {
- if (!workerData) {
- init();
- }
- if (m.data.command == 'connect') {
- ndk_fetcher.connect(2000);
- if (connectionStatus == 0) {
- workerData!.connected = 1;
- connectionStatus = 1;
- __ndk.connect(2000).then(() => {
- workerData!.connected = 2;
- connectionStatus = 2;
- if (m.data.pubkey) {
- subscribe(m.data.pubkey);
- }
- });
- }
- }
-
- if (m.data.command == 'start') {
- if (m.data.pubkey) {
- subscribe(m.data.pubkey);
- }
- }
- if (m.data.command == 'stop') {
- if (sub) {
- sub.unsubscribe();
- }
- }
- if (m.data.command == 'print') {
- updateEventMap();
- }
-};
-
-function updateEventMap() {
- //todo: crawl over all events and fetch parents up to the root if we don't already have them
- //todo: find all replies to root events (use outbox mode too)
- //these need to be live subs when user is viewing a thread, so we need to add/remove filters based on what they're looking at.
- let m: RecursiveEventMap = new Map();
- for (let id of workerData!.rootEvents) {
- m.set(id, new EventTreeItem(workerEventMap.get(id)!.rawEvent()));
- }
- workerData!.recursiveEvents.children = iterate(m);
-}
-
-function iterate(m: Map): Map {
- for (let [id, treeItem] of m) {
- let children: Map = new Map();
- let _children = workerData!.etags.get(treeItem.event.id!);
- if (_children) {
- for (let eventID of _children) {
- let _child_event = workerData!.events.get(eventID);
- if (_child_event && _child_event.kind == 1) {
- children.set(eventID, new EventTreeItem(_child_event));
- }
- }
- }
- treeItem.children = iterate(children);
- m.set(id, treeItem);
- }
- return m;
-}
-const ndk_fetcher = new NDKSvelte({
- //cacheAdapter: new NDKCacheAdapterDexie({ dbName: "firehose" }),
- explicitRelayUrls: seedRelays,
- enableOutboxModel: true
-});
-
-const ndk_pub = new NDKSvelte({
- //cacheAdapter: new NDKCacheAdapterDexie({ dbName: "firehose" }),
- explicitRelayUrls: ['wss://relay.nostrocket.org'],
- enableOutboxModel: true
-});
-
-let pubbing = false;
-
-let fetching = false;
-
-// let experimentalSub = (filter: NDKFilter[]) => {
-// // console.log(375,filter)
-// // ndk.fetchEvents(filter).then((r)=>{
-// // console.log(r)
-// // })
-// //ndk_fetcher.connect(5000).then(() => {
-// console.log(380, filter);
-// if (!fetching) {
-// fetching = true
-// ndk_fetcher.fetchEvents(filter).then((r) => {
-// fetching = false
-// console.log(r);
-// r.forEach((event) => {
-// workerEventMap.set(event.id, event);
-// let shouldPush = true;
-// if (replaceableKinds.includes(event.kind!)) {
-// let existing = mostRecentReplaceableEvents.get(event.deduplicationKey());
-// if (existing && event.created_at! < existing.created_at!) {
-// shouldPush = false;
-// } else {
-// mostRecentReplaceableEvents.set(event.deduplicationKey(), event);
-// }
-// }
-// if (shouldPush) {
-// workerData!.PushEvent(event.rawEvent());
-// }
-// });
-// });
-// }}
-
-let experimentalPub = (event: NDKEvent) => {
- if (!pubbing) {
- pubbing = true
- ndk_pub.connect(5000).then(() => {
- pubbing = false
- event.ndk = ndk_pub
- event.publish().then(x=>{
- console.log(x)
- })
- })
- }
-};
diff --git a/src/lib/workers.deprecated/firehose.types.ts b/src/lib/workers.deprecated/firehose.types.ts
deleted file mode 100644
index 8bdc9fc..0000000
--- a/src/lib/workers.deprecated/firehose.types.ts
+++ /dev/null
@@ -1,179 +0,0 @@
-import { NDKEvent, type NDKSigner, type NDKTag, type NostrEvent } from "@nostr-dev-kit/ndk";
-
-export class Command {
- command: "start" | "stop" | "connect" | "print" | "nip07";
- pubkey?: string;
- signer?:NDKSigner;
- constructor(
- command: "start" | "stop" | "connect" | "print" | "nip07",
- pubkey?: string
- ) {
- this.signer = this.signer;
- this.command = command;
- this.pubkey = pubkey ? pubkey : "";
- }
-}
-
-export class WorkerData {
- connected: number = 0;
- rawCount: number = 0;
- count(): number {
- return this.events.size;
- }
- connections: Map;
- errors: Error[];
- events: Map;
- etags: Map>;
- etagsFromFollows: Map>;
- kinds: Map;
- rootEvents: Set;
- rootEventsWithReplies: Set;
- missingRootEvents: Set;
- recursiveEvents: EventTreeItem;
- followLists: Map>;
- masterPubkey: string | undefined;
- relays: Set;
- constructor(pubkey?:string) {
- this.relays = new Set()
- this.masterPubkey = pubkey;
- this.recursiveEvents = new EventTreeItem({id:"", created_at:0, content:"", tags:[], pubkey:""})
- this.etags = new Map();
- this.followLists = new Map();
- this.connections = new Map();
- this.errors = [];
- this.events = new Map();
- this.kinds = new Map();
- this.rootEvents = new Set();
- }
- PushEvent(ev: NostrEvent): void {
- if (!this.events.has(ev.id!)) {
- this.events.set(ev.id!, ev);
- {
- let existing = this.kinds.get(ev.kind!);
- if (!existing) {
- existing = 0;
- }
- existing++;
- this.kinds.set(ev.kind!, existing);
- }
- if (ev.kind == 3) {
- this.followLists.set(ev.pubkey, new Set(ev.tags.filter((t: NDKTag) => t[0] == 'p').map((t: NDKTag) => t[1])))
- }
- if (ev.kind == 10002) {
- let n = ev.tags.filter((t: NDKTag) => t[0] === 'r').map((t: NDKTag) => t[1])
- if (n) {
- for (let r of n) {
- this.relays.add(r)
- }
- }
- }
- if (ev.kind == 1) {
- let e = new NDKEvent(undefined, ev);
- let found = false;
- for (let t of e.getMatchingTags("e")) {
- if (t[1].length == 64 && !t.includes("root")) { //why did I exlude events with root label?
- let existing = this.etags.get(t[1]);
- if (!existing) {
- existing = new Set();
- }
- existing.add(e.id);
- this.etags.set(t[1], existing);
- }
-
- if (!t.includes("mention")) {
- found = true;
- }
- }
- if (!found) {
- this.rootEvents.add(ev.id!);
- }
- }
- }
- }
-}
-
-
-
-function getNestedEvents(events: Map,
- etags: Map>) {
-
-}
-
-export type RecursiveEventMap = Map;
-function PopulateEventMap(
- m: RecursiveEventMap,
- nempool: Map
-) {
- m.forEach((treeItem) => {
- if (treeItem.dirty) {
- }
- });
-}
-
-export class EventTreeItem {
- //id: string; //if we have replies etc but don't have the event itself we need to fetch it
- event: NostrEvent; //pseudo event if root
- children: RecursiveEventMap;
- allChildrenInMap():Set {
- return iterate(this.children)
- }
- findChild(id:string):EventTreeItem | undefined {
- return find(this.children, id)
- }
- reacts(): Map {
- let m: Map = new Map();
- for (let [id, { event }] of this.children) {
- if (event.kind! == 7) {
- m.set(id, event);
- }
- }
- return m;
- }
- push(ev: NDKEvent) {
- for (let t of ev.getMatchingTags("e")) {
- if (t.includes(this.event.id!)) {
- if (!this.children.has(ev.id)) {
- this.children.set(ev.id, new EventTreeItem(ev.rawEvent()));
- }
- }
- }
- }
- dirty: boolean;
- root: string | undefined;
- constructor(e: NostrEvent) {
- this.dirty = true;
- this.event = e;
- this.children = new Map();
- }
-}
-
-function iterate(m:RecursiveEventMap):Set {
- let s = new Set()
- for (let [id, item] of m) {
- iterate(item.children)
- s.add(id);
- }
- return s
-}
-
-function find(m:RecursiveEventMap, id:string):EventTreeItem | undefined {
- if (m.get(id)) {return m.get(id)!}
- for (let [_, item] of m) {
- let c = find(item.children, id)
- if (c) {
- return c
- }
- }
-}
-
-
-export class FrontendData {
- events: Map
- rootEvents: string[]
- replies: Map; //indexed by what they are in reply to, on frontend distinguish between mention and reply (make mentions look different but in same thread)
- constructor() {
- this.events = new Map()
- this.rootEvents = []
- this.replies = new Map()
- }
-}
\ No newline at end of file
diff --git a/src/lib/workers.deprecated/firehose.utils.ts b/src/lib/workers.deprecated/firehose.utils.ts
deleted file mode 100644
index b8ca773..0000000
--- a/src/lib/workers.deprecated/firehose.utils.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import type { NDKEvent } from "@nostr-dev-kit/ndk"
-
-export class tagSplits {
- id: string
- roots: Set
- replies: Set
- mentions: Set
- unlabelled: Set
- unknown: Set
- All():Set {
- return new Set(...this.roots, this.replies, this.mentions, this.unlabelled, this.unknown)
- }
- constructor(event: NDKEvent) {
- this.id = event.id;
- this.roots = new Set();
- this.replies = new Set();
- this.mentions = new Set();
- this.unlabelled = new Set();
- this.unknown = new Set();
- let tags = event.getMatchingTags('e');
- for (const [i, tag] of tags.entries()) {
- if (tag[1] && tag[1].length == 64) {
- if (tag.includes('root')) {
- this.roots.add(tag[1]);
- } else if (tag.includes('mention')) {
- this.mentions.add(tag[1]);
- } else if (tag.includes('reply')) {
- this.replies.add(tag[1]);
- } else if (
- tag.length == 2 ||
- tag[tag.length - 1] == '' ||
- tag[tag.length - 1].includes('://')
- ) {
- this.unlabelled.add(tag[1]);
- } else {
- this.unknown.add(tag[1]);
- }
- }
- }
- if (this.replies.size == 0 && this.unlabelled.size == 1) {
- this.replies.add([...this.unlabelled][0]);
- }
- }
-}
\ No newline at end of file
diff --git a/src/lib/workers.deprecated/firehose_master.ts b/src/lib/workers.deprecated/firehose_master.ts
deleted file mode 100644
index d700294..0000000
--- a/src/lib/workers.deprecated/firehose_master.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-import { get, writable, type Writable } from 'svelte/store';
-import { Command, FrontendData, WorkerData } from './firehose.types';
-import { currentPubkey } from '@/stores/user';
-
-
-export let responseFromWorker: Writable = writable(new FrontendData());
-let initted = false
-export function Init() {
- if (!initted) {
- setupWorker();
- }
-
-}
-
-let firehoseWorker: Worker | undefined = undefined;
-
-const onWorkerMessage = (x: MessageEvent) => {
- // if (!responseFromWorker) {
- // responseFromWorker = writable(x.data);
- // }
- responseFromWorker.update((current) => {
- current = x.data;
- return current;
- });
-};
-let WorkerStarted = false;
-
-let setupWorker = async () => {
- if (!WorkerStarted) {
- WorkerStarted = true;
- const w = await import('./firehose.ts?worker');
- firehoseWorker = new w.default();
- firehoseWorker.onmessage = onWorkerMessage;
- firehoseWorker.postMessage(connect);
- console.log(30)
- }
-};
-
-let start: Command = {
- command: 'start',
- pubkey: 'd91191e30e00444b942c0e82cad470b32af171764c2275bee0bd99377efd4075'
-};
-
-currentPubkey.subscribe(pubkey=>{
- if (pubkey && firehoseWorker) {
- firehoseWorker.postMessage({
- command: 'start',
- pubkey: pubkey
- })
- }
-})
-
-let connect: Command = {
- command: 'connect',
- pubkey: get(currentPubkey) || 'd91191e30e00444b942c0e82cad470b32af171764c2275bee0bd99377efd4075'
-};
-
-let rootPubkey = 'd91191e30e00444b942c0e82cad470b32af171764c2275bee0bd99377efd4075';
\ No newline at end of file
diff --git a/src/lib/workers.deprecated/seed_relays.ts b/src/lib/workers.deprecated/seed_relays.ts
deleted file mode 100644
index a83438c..0000000
--- a/src/lib/workers.deprecated/seed_relays.ts
+++ /dev/null
@@ -1,148 +0,0 @@
-export let seedRelays = [
- // 'wss://purplepag.es',
- // 'wss://relay.nostr.band',
- // // "wss://nos.lol",
- // // "wss://relay.wikifreedia.xyz",
- // 'wss://relay.nostrocket.org',
- // 'wss://search.nos.today',
- // 'wss://relay.damus.io',
- // // "wss://relay.nostr.bg",
- // 'wss://relay.snort.social',
- // // "wss://offchain.pub",
- // 'wss://relay.primal.net'
- // // "wss://pyramid.fiatjaf.com",
- "wss://nostr.wine",
- "wss://nostr-01.yakihonne.com",
- "wss://nostr-02.dorafactory.org",
- "wss://nostr-02.yakihonne.com",
- "wss://nostr-03.dorafactory.org",
- "wss://relay.damus.io",
- "wss://relay.highlighter.com",
- "wss://relay.nostrocket.org",
- "wss://relay.primal.net",
- "wss://relay.nostr.band",
- "wss://relay.current.fyi",
- "wss://purplepag.es",
- "wss://nos.lol",
- "wss://pyramid.fiatjaf.com",
- "wss://nostr.plebchain.org",
- "wss://relay.nostr.info/",
- "wss://relay.f7z.io/",
- "wss://nostr.fmt.wiz.biz",
- "wss://atlas.nostr.land",
- "wss://lightningrelay.com",
- "wss://nostr.oxtr.dev",
- "wss://nostr-pub.semisol.dev",
- "wss://brb.io",
- "wss://nostr.bitcoiner.social",
- "wss://relay.nostr.bg",
- "wss://nostr-01.bolt.observer",
- "wss://nostr.mom",
- "wss://relay.snort.social",
- "wss://puravida.nostr.land",
- "wss://relay.thes.ai",
- "wss://nostr.lu.ke",
- "wss://offchain.pub",
- "wss://eden.nostr.land",
- "wss://nostr-pub.wellorder.net/",
- "wss://140.f7z.io",
- "wss://filter.nostr.wine/npub1rtlqca8r6auyaw5n5h3l5422dm4sry5dzfee4696fqe8s6qgudks7djtfs?broadcast=true",
- "wss://nostr.wine/",
- "wss://nos.lol/",
- "wss://relay.mostr.pub/",
- "wss://relay.snort.social/",
- "wss://relay.damus.io/",
- "wss://relay.nostr.band/",
- "wss://relay.shitforce.one/",
- "wss://nostr.fmt.wiz.biz/",
- "wss://relay.nostrich.land/",
- "wss://arnostr.permadao.io/",
- "wss://universe.nostrich.land/?lang=zh",
- "wss://relay.current.fyi/",
- "wss://no.str.cr/",
- "wss://nostr.cercatrova.me/",
- "wss://universe.nostrich.land/",
- "wss://eden.nostr.land/",
- "wss://knostr.neutrine.com/",
- "wss://relay.nostrfiles.dev/",
- "wss://bitcoiner.social/",
- "wss://nostr.kleofash.eu",
- "wss://nostr.greenfield.xyz",
- "wss://sfr0.nostr1.com",
- "wss://nostr.bit4use.com",
- "wss://relap.orzv.workers.dev/",
- "wss://nostr21.com/",
- "wss://offchain.pub/",
- "wss://relay.deezy.io/",
- "wss://rsslay.nostr.moe/",
- "wss://nostr.mom/",
- "wss://relay.vivo50.eu.org/",
- "wss://relay.mostr.pub",
- "wss://relay.shitforce.one",
- "wss://nostr.coinfundit.com",
- "wss://nostr.lopp.social/",
- "wss://e.nos.lol",
- "wss://nostr.thesamecat.io",
- "wss://relay.nostrcheck.me",
- "wss://nostr.orangepill.dev",
- "wss://nostr.app.runonflux.io/",
- "wss://ithurtswhenip.ee/",
- "wss://nostrue.com/",
- "wss://purplepag.es/",
- "wss://nostr.mutinywallet.com/",
- "wss://lunchbox.sandwich.farm/",
- "wss://a.nos.lol/",
- "wss://relay.stoner.com/",
- "wss://relay.primal.net/",
- "wss://relay.nostrplebs.com",
- "wss://nostr.roundrockbitcoiners.com",
- "wss://nostr.actn.io",
- "wss://nostr.einundzwanzig.space",
- "wss://rsslay.nostr.net",
- "wss://nostr.semisol.dev",
- "wss://nostr-relay.derekross.me",
- "wss://paid.no.str.cr",
- "wss://sg.qemura.xyz",
- "wss://nostr.bongbong.com",
- "wss://relay.farscapian.com",
- "wss://nostr.cercatrova.me",
- "wss://relay.nostr.au",
- "wss://nostr.slothy.win",
- "wss://nostr.sandwich.farm",
- "wss://nostr3.actn.io",
- "wss://nostr.noones.com",
- "wss://nostr.massmux.com",
- "wss://filter.nostr.wine/npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9?broadcast=true",
- "wss://filter.nostr.wine/npub1lelkh3hhxw9hdwlcpk6q9t0xt9f7yze0y0nxazvzqjmre3p98x3sthkvyz?broadcast=true",
- "wss://nostr.mutinywallet.com",
- "wss://relay.bitcoinpark.com",
- "wss://public.relaying.io",
- "wss://relay.chicagoplebs.com",
- "wss://relayable.org",
- "wss://nostr-relay.nokotaro.com",
- "wss://nostr.fractalized.net",
- "wss://welcome.nostr.wine",
- "wss://relay.plebstr.com",
- "wss://Nostr.wine",
- "wss://relay.utxo.one",
- "wss://nostr.bitcoiner.social/",
- "wss://nostr.huszonegy.world/",
- "wss://relay.nostr.bg/",
- "wss://relayable.org/",
- "wss://bitcoinmaximalists.online"
-]
-
-export let reducedRelays = [
- 'wss://purplepag.es',
- 'wss://relay.nostr.band',
- // "wss://nos.lol",
- // "wss://relay.wikifreedia.xyz",
- 'wss://relay.nostrocket.org',
- 'wss://search.nos.today',
- 'wss://relay.damus.io',
- // "wss://relay.nostr.bg",
- 'wss://relay.snort.social',
- // "wss://offchain.pub",
- 'wss://relay.primal.net'
- // "wss://pyramid.fiatjaf.com",
-]
\ No newline at end of file