diff --git a/package.json b/package.json index ab68bab..db5efed 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,8 @@ "prepack": "tsc", "start": "node .", "dev": "DATA_PATH=./data nodemon --loader @swc-node/register/esm src/index.ts", - "mcp": "mcp-inspector node . --mcp", - "mcp-debug": "mcp-inspector node --inspect-brk . --mcp", + "mcp": "mcp-inspector node . --mcp --port 8080", + "mcp-debug": "mcp-inspector node --inspect-brk . --mcp --port 8080", "build": "tsc", "test": "vitest run", "format": "prettier -w .", diff --git a/src/const.ts b/src/const.ts index bdf06e3..1274aa2 100644 --- a/src/const.ts +++ b/src/const.ts @@ -1,3 +1,4 @@ +import { normalizeURL } from "applesauce-core/helpers"; import { EncryptedDirectMessage } from "nostr-tools/kinds"; export const DEFAULT_PORT = 9272; @@ -7,4 +8,8 @@ export const NIP_11_SOFTWARE_URL = "git+https://github.com/hzrd149/bakery.git"; export const OUTBOUND_PROXY_TYPES = ["SOCKS5", "HTTP"]; -export const DEFAULT_NOSTR_CONNECT_RELAYS = ["wss://relay.nsec.app"]; +export const DEFAULT_BOOTSTRAP_RELAYS = ["wss://nos.lol", "wss://relay.damus.io", "wss://relay.nostr.band"].map( + normalizeURL, +); +export const DEFAULT_LOOKUP_RELAYS = ["wss://purplepag.es/", "wss://user.kindpag.es/"].map(normalizeURL); +export const DEFAULT_NOSTR_CONNECT_RELAYS = ["wss://relay.nsec.app/"].map(normalizeURL); diff --git a/src/env.ts b/src/env.ts index 5293b51..7b2b0ee 100644 --- a/src/env.ts +++ b/src/env.ts @@ -4,7 +4,7 @@ import { normalizeURL } from "applesauce-core/helpers"; import { homedir } from "os"; import { join } from "path"; -import { DEFAULT_PORT, OUTBOUND_PROXY_TYPES } from "./const.js"; +import { DEFAULT_BOOTSTRAP_RELAYS, DEFAULT_LOOKUP_RELAYS, DEFAULT_PORT, OUTBOUND_PROXY_TYPES } from "./const.js"; import { normalizeToHexPubkey } from "./helpers/nip19.js"; import args from "./args.js"; @@ -29,15 +29,14 @@ export const TOR_ADDRESS = process.env.TOR_ADDRESS; if (!OUTBOUND_PROXY_TYPES.includes(TOR_PROXY_TYPE)) throw new Error("Invalid TOR_PROXY_TYPE, must be SOCKS5 or HTTP"); -// Default relay config +// nostr network config export const BOOTSTRAP_RELAYS = process.env.BOOTSTRAP_RELAYS ? process.env.BOOTSTRAP_RELAYS.split(",").map(normalizeURL) - : ["wss://nos.lol", "wss://relay.damus.io", "wss://relay.nostr.band"].map(normalizeURL); + : DEFAULT_BOOTSTRAP_RELAYS; -export const COMMON_CONTACT_RELAYS = process.env.COMMON_CONTACT_RELAYS - ? process.env.COMMON_CONTACT_RELAYS.split(",").map(normalizeURL) - : ["wss://purplepag.es", "wss://user.kindpag.es"].map(normalizeURL); +export const LOOKUP_RELAYS = process.env.LOOKUP_RELAYS + ? process.env.LOOKUP_RELAYS.split(",").map(normalizeURL) + : DEFAULT_LOOKUP_RELAYS; export const IS_DEV = process.env.NODE_ENV === "development"; - export const IS_MCP = args.values.mcp; diff --git a/src/modules/address-book.ts b/src/modules/address-book.ts index 290e5d8..087f549 100644 --- a/src/modules/address-book.ts +++ b/src/modules/address-book.ts @@ -4,7 +4,7 @@ import { getObservableValue, simpleTimeout } from "applesauce-core/observable"; import { getInboxes, getOutboxes } from "applesauce-core/helpers"; import { logger } from "../logger.js"; -import { COMMON_CONTACT_RELAYS } from "../env.js"; +import { LOOKUP_RELAYS } from "../env.js"; import { replaceableLoader } from "../services/loaders.js"; import { eventStore, queryStore } from "../services/stores.js"; import { arrayFallback } from "../helpers/array.js"; @@ -28,7 +28,7 @@ export default class AddressBook { } async loadMailboxes(pubkey: string, relays?: string[], force?: boolean) { - relays = arrayFallback(relays, COMMON_CONTACT_RELAYS); + relays = arrayFallback(relays, LOOKUP_RELAYS); replaceableLoader.next({ kind: kinds.RelayList, pubkey, relays, force }); return getObservableValue( diff --git a/src/modules/contact-book.ts b/src/modules/contact-book.ts index 012d2f0..eddcdc4 100644 --- a/src/modules/contact-book.ts +++ b/src/modules/contact-book.ts @@ -3,7 +3,7 @@ import { ReplaceableQuery, UserContactsQuery } from "applesauce-core/queries"; import { getObservableValue, simpleTimeout } from "applesauce-core/observable"; import { logger } from "../logger.js"; -import { COMMON_CONTACT_RELAYS } from "../env.js"; +import { LOOKUP_RELAYS } from "../env.js"; import { replaceableLoader } from "../services/loaders.js"; import { eventStore, queryStore } from "../services/stores.js"; import { arrayFallback } from "../helpers/array.js"; @@ -34,7 +34,7 @@ export default class ContactBook { } async loadContacts(pubkey: string, relays?: string[], force?: boolean) { - relays = arrayFallback(relays, COMMON_CONTACT_RELAYS); + relays = arrayFallback(relays, LOOKUP_RELAYS); replaceableLoader.next({ kind: kinds.Contacts, pubkey, relays, force }); return getObservableValue( @@ -46,7 +46,7 @@ export default class ContactBook { /** @deprecated */ async loadContactsEvent(pubkey: string, relays?: string[]) { - relays = arrayFallback(relays, COMMON_CONTACT_RELAYS); + relays = arrayFallback(relays, LOOKUP_RELAYS); replaceableLoader.next({ kind: kinds.Contacts, pubkey, relays }); return getObservableValue( diff --git a/src/modules/direct-message-manager.ts b/src/modules/direct-message-manager.ts index 81d2887..770daf8 100644 --- a/src/modules/direct-message-manager.ts +++ b/src/modules/direct-message-manager.ts @@ -9,7 +9,7 @@ import type App from "../app/index.js"; import { arrayFallback } from "../helpers/array.js"; import { rxNostr } from "../services/rx-nostr.js"; import { eventStore, queryStore } from "../services/stores.js"; -import { COMMON_CONTACT_RELAYS } from "../env.js"; +import { LOOKUP_RELAYS } from "../env.js"; import { bufferAudit } from "../helpers/rxjs.js"; import { getRelaysFromContactList } from "../helpers/contacts.js"; @@ -83,7 +83,7 @@ export default class DirectMessageManager extends EventEmitter { async watchInbox(pubkey: string) { if (this.watching.has(pubkey)) return; - this.app.addressBook.loadMailboxes(pubkey, COMMON_CONTACT_RELAYS, true); + this.app.addressBook.loadMailboxes(pubkey, LOOKUP_RELAYS, true); this.log(`Watching ${pubkey} inboxes for mail`); const subscription = queryStore diff --git a/src/modules/profile-book.ts b/src/modules/profile-book.ts index eede918..8c747a6 100644 --- a/src/modules/profile-book.ts +++ b/src/modules/profile-book.ts @@ -2,7 +2,7 @@ import { kinds } from "nostr-tools"; import { getObservableValue, simpleTimeout } from "applesauce-core/observable"; import { ProfileQuery } from "applesauce-core/queries"; -import { COMMON_CONTACT_RELAYS } from "../env.js"; +import { LOOKUP_RELAYS } from "../env.js"; import { logger } from "../logger.js"; import { replaceableLoader } from "../services/loaders.js"; import { eventStore, queryStore } from "../services/stores.js"; @@ -19,7 +19,7 @@ export default class ProfileBook { } async loadProfile(pubkey: string, relays?: string[], force?: boolean) { - relays = arrayFallback(relays, COMMON_CONTACT_RELAYS); + relays = arrayFallback(relays, LOOKUP_RELAYS); replaceableLoader.next({ kind: kinds.Metadata, pubkey, relays, force }); return getObservableValue( diff --git a/src/modules/receiver/index.ts b/src/modules/receiver/index.ts index 82d19df..85688e5 100644 --- a/src/modules/receiver/index.ts +++ b/src/modules/receiver/index.ts @@ -3,7 +3,7 @@ import { NostrEvent, SimplePool } from "nostr-tools"; import { Subscription } from "nostr-tools/abstract-relay"; import { getRelaysFromContactsEvent } from "applesauce-core/helpers"; -import { BOOTSTRAP_RELAYS, COMMON_CONTACT_RELAYS } from "../../env.js"; +import { BOOTSTRAP_RELAYS, LOOKUP_RELAYS } from "../../env.js"; import { logger } from "../../logger.js"; import App from "../../app/index.js"; import { arrayFallback } from "../../helpers/array.js"; @@ -61,7 +61,7 @@ export default class Receiver extends EventEmitter { const owner = this.app.config.data.owner; if (!owner) throw new Error("Missing owner"); - const commonMailboxesRelays = [...BOOTSTRAP_RELAYS, ...COMMON_CONTACT_RELAYS]; + const commonMailboxesRelays = [...BOOTSTRAP_RELAYS, ...LOOKUP_RELAYS]; const ownerMailboxes = await requestLoader.mailboxes({ pubkey: owner, relays: commonMailboxesRelays }, true); diff --git a/src/services/loaders.ts b/src/services/loaders.ts index 6148d57..03211ad 100644 --- a/src/services/loaders.ts +++ b/src/services/loaders.ts @@ -3,7 +3,7 @@ import { Filter } from "nostr-tools"; import { isFromCache, markFromCache } from "applesauce-core/helpers"; import { ReplaceableLoader, RequestLoader } from "applesauce-loaders/loaders"; -import { COMMON_CONTACT_RELAYS } from "../env.js"; +import { LOOKUP_RELAYS } from "../env.js"; import { rxNostr } from "./rx-nostr.js"; import eventCache from "./event-cache.js"; import { eventStore, queryStore } from "./stores.js"; @@ -13,7 +13,7 @@ function cacheRequest(filters: Filter[]) { return from(events).pipe(tap(markFromCache)); } -export const replaceableLoader = new ReplaceableLoader(rxNostr, { cacheRequest, lookupRelays: COMMON_CONTACT_RELAYS }); +export const replaceableLoader = new ReplaceableLoader(rxNostr, { cacheRequest, lookupRelays: LOOKUP_RELAYS }); replaceableLoader.subscribe((packet) => { // add it to event store