diff --git a/packages/app/src/context.ts b/packages/app/src/context.ts index c769806..f198ae0 100644 --- a/packages/app/src/context.ts +++ b/packages/app/src/context.ts @@ -1,6 +1,5 @@ -export const AppContext: { +export type AppContext = { dufflepudUrl?: string - indexerRelays?: string[] -} = { - indexerRelays: ["wss://purplepag.es/", "wss://relay.nostr.band/", "wss://relay.primal.net/"], } + +export const appContext: AppContext = {} diff --git a/packages/app/src/handles.ts b/packages/app/src/handles.ts index 55c9739..4ac3f74 100644 --- a/packages/app/src/handles.ts +++ b/packages/app/src/handles.ts @@ -3,7 +3,7 @@ import {MultiRequestOptions} from "@welshman/net" import {tryCatch, fetchJson, uniq, batcher, postJson, last} from "@welshman/lib" import {collection} from "./collection.js" import {deriveProfile} from "./profiles.js" -import {AppContext} from "./context.js" +import {appContext} from "./context.js" export type Handle = { nip05: string @@ -48,7 +48,7 @@ export async function queryProfile(nip05: string) { export const handles = writable([]) export const fetchHandles = async (nip05s: string[]) => { - const base = AppContext.dufflepudUrl! + const base = appContext.dufflepudUrl! const handlesByNip05 = new Map() // Use dufflepud if we it's set up to protect user privacy, otherwise fetch directly diff --git a/packages/app/src/relays.ts b/packages/app/src/relays.ts index 4d9d549..b00212f 100644 --- a/packages/app/src/relays.ts +++ b/packages/app/src/relays.ts @@ -5,7 +5,7 @@ import {RelayProfile} from "@welshman/util" import {normalizeRelayUrl, displayRelayUrl, displayRelayProfile} from "@welshman/util" import {Socket, SocketStatus, SocketEvent, ClientMessage, RelayMessage} from "@welshman/net" import {collection} from "./collection.js" -import {AppContext} from "./context.js" +import {appContext} from "./context.js" export type RelayStats = { first_seen: number @@ -65,7 +65,7 @@ export const relaysByPubkey = derived(relays, $relays => ) export const fetchRelayProfiles = async (urls: string[]) => { - const base = AppContext.dufflepudUrl + const base = appContext.dufflepudUrl if (!base) { throw new Error("ctx.app.dufflepudUrl is required to fetch relay metadata") diff --git a/packages/app/src/zappers.ts b/packages/app/src/zappers.ts index a2a982e..23f7af8 100644 --- a/packages/app/src/zappers.ts +++ b/packages/app/src/zappers.ts @@ -13,12 +13,12 @@ import { } from "@welshman/lib" import {collection} from "./collection.js" import {deriveProfile} from "./profiles.js" -import {AppContext} from "./context.js" +import {appContext} from "./context.js" export const zappers = writable([]) export const fetchZappers = async (lnurls: string[]) => { - const base = AppContext.dufflepudUrl + const base = appContext.dufflepudUrl const zappersByLnurl = new Map() // Use dufflepud if we it's set up to protect user privacy, otherwise fetch directly diff --git a/packages/net/src/adapter.ts b/packages/net/src/adapter.ts index 9af9282..aa1aa7a 100644 --- a/packages/net/src/adapter.ts +++ b/packages/net/src/adapter.ts @@ -1,11 +1,11 @@ import EventEmitter from "events" -import {call, on} from "@welshman/lib" +import {call, mergeRight, on} from "@welshman/lib" import {isRelayUrl} from "@welshman/util" -import {LocalRelay, LOCAL_RELAY_URL, Repository} from "@welshman/relay" +import {LocalRelay, LOCAL_RELAY_URL} from "@welshman/relay" import {RelayMessage, ClientMessage} from "./message.js" import {Socket, SocketEvent} from "./socket.js" import {TypedEmitter, Unsubscriber} from "./util.js" -import {Pool} from "./pool.js" +import {netContext, NetContext} from "./context.js" export enum AdapterEvent { Receive = "adapter:event:receive", @@ -99,13 +99,13 @@ export class MockAdapter extends AbstractAdapter { } } -export type AdapterContext = { - pool?: Pool - relay?: LocalRelay +export type AdapterContext = Partial & { getAdapter?: (url: string, context: AdapterContext) => AbstractAdapter } -export const getAdapter = (url: string, context: AdapterContext = {}) => { +export const getAdapter = (url: string, adapterContext: AdapterContext = {}) => { + const context = mergeRight(netContext, adapterContext as any) + if (context.getAdapter) { const adapter = context.getAdapter(url, context) @@ -115,15 +115,11 @@ export const getAdapter = (url: string, context: AdapterContext = {}) => { } if (url === LOCAL_RELAY_URL) { - const relay = context.relay || new LocalRelay(Repository.getSingleton()) - - return new LocalAdapter(relay) + return new LocalAdapter(new LocalRelay(context.repository)) } if (isRelayUrl(url)) { - const pool = context.pool || Pool.getSingleton() - - return new SocketAdapter(pool.get(url)) + return new SocketAdapter(context.pool.get(url)) } throw new Error(`Invalid relay url ${url}`) diff --git a/packages/net/src/context.ts b/packages/net/src/context.ts new file mode 100644 index 0000000..e848560 --- /dev/null +++ b/packages/net/src/context.ts @@ -0,0 +1,17 @@ +import {Repository} from "@welshman/relay" +import {verifyEvent, TrustedEvent, SignedEvent} from "@welshman/util" +import {Pool} from "./pool.js" + +export type NetContext = { + pool: Pool + repository: Repository + isEventValid: (event: TrustedEvent, url: string) => boolean + isEventDeleted: (event: TrustedEvent, url: string) => boolean +} + +export const netContext: NetContext = { + pool: Pool.getSingleton(), + repository: Repository.getSingleton(), + isEventValid: (event, url) => Boolean(event.sig && verifyEvent(event as SignedEvent)), + isEventDeleted: (event, url) => netContext.repository.isDeleted(event), +} diff --git a/packages/net/src/index.ts b/packages/net/src/index.ts index 924a8f2..7060e0b 100644 --- a/packages/net/src/index.ts +++ b/packages/net/src/index.ts @@ -1,5 +1,6 @@ export * from "./adapter.js" export * from "./auth.js" +export * from "./context.js" export * from "./diff.js" export * from "./message.js" export * from "./negentropy.js" diff --git a/packages/net/src/request.ts b/packages/net/src/request.ts index e6edeed..bb397a1 100644 --- a/packages/net/src/request.ts +++ b/packages/net/src/request.ts @@ -1,17 +1,17 @@ import {EventEmitter} from "events" -import {on, always, call, randomId, yieldThread, pushToMapKey, batcher} from "@welshman/lib" +import {on, call, randomId, yieldThread, pushToMapKey, batcher} from "@welshman/lib" import { Filter, unionFilters, matchFilter, TrustedEvent, getFilterResultCardinality, - verifyEvent as defaultVerifyEvent, } from "@welshman/util" import {RelayMessage, ClientMessageType, isRelayEvent, isRelayEose} from "./message.js" import {getAdapter, AdapterContext, AbstractAdapter, AdapterEvent} from "./adapter.js" import {SocketEvent, SocketStatus} from "./socket.js" import {TypedEmitter, Unsubscriber} from "./util.js" +import {netContext} from "./context.js" import {Tracker} from "./tracker.js" export enum RequestEvent { @@ -45,8 +45,8 @@ export type SingleRequestOptions = { timeout?: number tracker?: Tracker autoClose?: boolean - isEventValid?: (event: any, url: string) => boolean - isEventDeleted?: (event: any, url: string) => boolean + isEventValid?: (event: TrustedEvent, url: string) => boolean + isEventDeleted?: (event: TrustedEvent, url: string) => boolean } export class SingleRequest extends (EventEmitter as new () => TypedEmitter) { @@ -59,8 +59,8 @@ export class SingleRequest extends (EventEmitter as new () => TypedEmitter