Bring back some net context

This commit is contained in:
Jon Staab
2025-04-01 11:12:34 -07:00
parent 2dadcce48f
commit fd0cdf2c19
8 changed files with 42 additions and 29 deletions
+3 -4
View File
@@ -1,6 +1,5 @@
export const AppContext: { export type AppContext = {
dufflepudUrl?: string dufflepudUrl?: string
indexerRelays?: string[]
} = {
indexerRelays: ["wss://purplepag.es/", "wss://relay.nostr.band/", "wss://relay.primal.net/"],
} }
export const appContext: AppContext = {}
+2 -2
View File
@@ -3,7 +3,7 @@ import {MultiRequestOptions} from "@welshman/net"
import {tryCatch, fetchJson, uniq, batcher, postJson, last} from "@welshman/lib" import {tryCatch, fetchJson, uniq, batcher, postJson, last} from "@welshman/lib"
import {collection} from "./collection.js" import {collection} from "./collection.js"
import {deriveProfile} from "./profiles.js" import {deriveProfile} from "./profiles.js"
import {AppContext} from "./context.js" import {appContext} from "./context.js"
export type Handle = { export type Handle = {
nip05: string nip05: string
@@ -48,7 +48,7 @@ export async function queryProfile(nip05: string) {
export const handles = writable<Handle[]>([]) export const handles = writable<Handle[]>([])
export const fetchHandles = async (nip05s: string[]) => { export const fetchHandles = async (nip05s: string[]) => {
const base = AppContext.dufflepudUrl! const base = appContext.dufflepudUrl!
const handlesByNip05 = new Map<string, Handle>() const handlesByNip05 = new Map<string, Handle>()
// Use dufflepud if we it's set up to protect user privacy, otherwise fetch directly // Use dufflepud if we it's set up to protect user privacy, otherwise fetch directly
+2 -2
View File
@@ -5,7 +5,7 @@ import {RelayProfile} from "@welshman/util"
import {normalizeRelayUrl, displayRelayUrl, displayRelayProfile} from "@welshman/util" import {normalizeRelayUrl, displayRelayUrl, displayRelayProfile} from "@welshman/util"
import {Socket, SocketStatus, SocketEvent, ClientMessage, RelayMessage} from "@welshman/net" import {Socket, SocketStatus, SocketEvent, ClientMessage, RelayMessage} from "@welshman/net"
import {collection} from "./collection.js" import {collection} from "./collection.js"
import {AppContext} from "./context.js" import {appContext} from "./context.js"
export type RelayStats = { export type RelayStats = {
first_seen: number first_seen: number
@@ -65,7 +65,7 @@ export const relaysByPubkey = derived(relays, $relays =>
) )
export const fetchRelayProfiles = async (urls: string[]) => { export const fetchRelayProfiles = async (urls: string[]) => {
const base = AppContext.dufflepudUrl const base = appContext.dufflepudUrl
if (!base) { if (!base) {
throw new Error("ctx.app.dufflepudUrl is required to fetch relay metadata") throw new Error("ctx.app.dufflepudUrl is required to fetch relay metadata")
+2 -2
View File
@@ -13,12 +13,12 @@ import {
} from "@welshman/lib" } from "@welshman/lib"
import {collection} from "./collection.js" import {collection} from "./collection.js"
import {deriveProfile} from "./profiles.js" import {deriveProfile} from "./profiles.js"
import {AppContext} from "./context.js" import {appContext} from "./context.js"
export const zappers = writable<Zapper[]>([]) export const zappers = writable<Zapper[]>([])
export const fetchZappers = async (lnurls: string[]) => { export const fetchZappers = async (lnurls: string[]) => {
const base = AppContext.dufflepudUrl const base = appContext.dufflepudUrl
const zappersByLnurl = new Map<string, Zapper>() const zappersByLnurl = new Map<string, Zapper>()
// Use dufflepud if we it's set up to protect user privacy, otherwise fetch directly // Use dufflepud if we it's set up to protect user privacy, otherwise fetch directly
+9 -13
View File
@@ -1,11 +1,11 @@
import EventEmitter from "events" import EventEmitter from "events"
import {call, on} from "@welshman/lib" import {call, mergeRight, on} from "@welshman/lib"
import {isRelayUrl} from "@welshman/util" 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 {RelayMessage, ClientMessage} from "./message.js"
import {Socket, SocketEvent} from "./socket.js" import {Socket, SocketEvent} from "./socket.js"
import {TypedEmitter, Unsubscriber} from "./util.js" import {TypedEmitter, Unsubscriber} from "./util.js"
import {Pool} from "./pool.js" import {netContext, NetContext} from "./context.js"
export enum AdapterEvent { export enum AdapterEvent {
Receive = "adapter:event:receive", Receive = "adapter:event:receive",
@@ -99,13 +99,13 @@ export class MockAdapter extends AbstractAdapter {
} }
} }
export type AdapterContext = { export type AdapterContext = Partial<NetContext> & {
pool?: Pool
relay?: LocalRelay
getAdapter?: (url: string, context: AdapterContext) => AbstractAdapter 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) { if (context.getAdapter) {
const adapter = context.getAdapter(url, context) const adapter = context.getAdapter(url, context)
@@ -115,15 +115,11 @@ export const getAdapter = (url: string, context: AdapterContext = {}) => {
} }
if (url === LOCAL_RELAY_URL) { if (url === LOCAL_RELAY_URL) {
const relay = context.relay || new LocalRelay(Repository.getSingleton()) return new LocalAdapter(new LocalRelay(context.repository))
return new LocalAdapter(relay)
} }
if (isRelayUrl(url)) { if (isRelayUrl(url)) {
const pool = context.pool || Pool.getSingleton() return new SocketAdapter(context.pool.get(url))
return new SocketAdapter(pool.get(url))
} }
throw new Error(`Invalid relay url ${url}`) throw new Error(`Invalid relay url ${url}`)
+17
View File
@@ -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),
}
+1
View File
@@ -1,5 +1,6 @@
export * from "./adapter.js" export * from "./adapter.js"
export * from "./auth.js" export * from "./auth.js"
export * from "./context.js"
export * from "./diff.js" export * from "./diff.js"
export * from "./message.js" export * from "./message.js"
export * from "./negentropy.js" export * from "./negentropy.js"
+6 -6
View File
@@ -1,17 +1,17 @@
import {EventEmitter} from "events" 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 { import {
Filter, Filter,
unionFilters, unionFilters,
matchFilter, matchFilter,
TrustedEvent, TrustedEvent,
getFilterResultCardinality, getFilterResultCardinality,
verifyEvent as defaultVerifyEvent,
} from "@welshman/util" } from "@welshman/util"
import {RelayMessage, ClientMessageType, isRelayEvent, isRelayEose} from "./message.js" import {RelayMessage, ClientMessageType, isRelayEvent, isRelayEose} from "./message.js"
import {getAdapter, AdapterContext, AbstractAdapter, AdapterEvent} from "./adapter.js" import {getAdapter, AdapterContext, AbstractAdapter, AdapterEvent} from "./adapter.js"
import {SocketEvent, SocketStatus} from "./socket.js" import {SocketEvent, SocketStatus} from "./socket.js"
import {TypedEmitter, Unsubscriber} from "./util.js" import {TypedEmitter, Unsubscriber} from "./util.js"
import {netContext} from "./context.js"
import {Tracker} from "./tracker.js" import {Tracker} from "./tracker.js"
export enum RequestEvent { export enum RequestEvent {
@@ -45,8 +45,8 @@ export type SingleRequestOptions = {
timeout?: number timeout?: number
tracker?: Tracker tracker?: Tracker
autoClose?: boolean autoClose?: boolean
isEventValid?: (event: any, url: string) => boolean isEventValid?: (event: TrustedEvent, url: string) => boolean
isEventDeleted?: (event: any, url: string) => boolean isEventDeleted?: (event: TrustedEvent, url: string) => boolean
} }
export class SingleRequest extends (EventEmitter as new () => TypedEmitter<SingleRequestEvents>) { export class SingleRequest extends (EventEmitter as new () => TypedEmitter<SingleRequestEvents>) {
@@ -59,8 +59,8 @@ export class SingleRequest extends (EventEmitter as new () => TypedEmitter<Singl
super() super()
const tracker = options.tracker || new Tracker() const tracker = options.tracker || new Tracker()
const isEventValid = options.isEventValid || defaultVerifyEvent const isEventValid = options.isEventValid || netContext.isEventValid
const isEventDeleted = options.isEventDeleted || always(false) const isEventDeleted = options.isEventDeleted || netContext.isEventDeleted
// Set up our adapter // Set up our adapter
this._adapter = getAdapter(this.options.relay, this.options.context) this._adapter = getAdapter(this.options.relay, this.options.context)