remove net global state

This commit is contained in:
Jon Staab
2026-06-16 12:31:46 -07:00
parent 34065a18cf
commit 87d8a0832d
7 changed files with 15 additions and 27 deletions
+3 -3
View File
@@ -1,7 +1,7 @@
import type {Unsubscriber} from "svelte/store"
import {call} from "@welshman/lib"
import {Pool, Socket, Tracker, Repository, WrapManager, defaultSocketPolicies} from "@welshman/net"
import type {AdapterContext, AdapterFactory, SocketPolicy} from "@welshman/net"
import type {NetContext, AdapterFactory, SocketPolicy} from "@welshman/net"
import type {User} from "./user.js"
import type {ClientPolicy} from "./policies.js"
@@ -24,7 +24,7 @@ export interface IClient {
user?: User
config: ClientConfig
use: <T>(Ctor: new (ctx: IClient) => T) => T
netContext: AdapterContext
netContext: NetContext
pool: Pool
tracker: Tracker
repository: Repository
@@ -40,7 +40,7 @@ export interface IClient {
export class Client implements IClient {
user?: User
config: ClientConfig
netContext: AdapterContext
netContext: NetContext
pool: Pool
tracker: Tracker
repository: Repository
+1 -1
View File
@@ -18,7 +18,7 @@ export class GiftWraps {
constructor(readonly ctx: IClient) {
this.queue = new TaskQueue<TrustedEvent>({
batchSize: 5,
batchSize: 50,
batchDelay: 30,
processItem: async (wrap: TrustedEvent) => {
const signer = this.ctx.user?.signer
+3 -3
View File
@@ -1,8 +1,8 @@
import type {Unsubscriber} from "svelte/store"
import {on} from "@welshman/lib"
import {WRAP, isDVMKind, isEphemeralKind} from "@welshman/util"
import {WRAP, isDVMKind, isEphemeralKind, verifyEvent} from "@welshman/util"
import type {TrustedEvent} from "@welshman/util"
import {SocketEvent, netContext, isRelayEvent} from "@welshman/net"
import {SocketEvent, isRelayEvent} from "@welshman/net"
import type {RelayMessage} from "@welshman/net"
import type {IClient} from "./client.js"
import {RelayStats} from "./relayStats.js"
@@ -30,7 +30,7 @@ export const clientPolicyIngest: ClientPolicy = client =>
const event = message[2]
if (isDVMKind(event.kind) || isEphemeralKind(event.kind)) return
if (!netContext.isEventValid(event, socket.url)) return
if (!verifyEvent(event)) return
client.tracker.track(event.id, socket.url)
client.repository.publish(event)
+3 -5
View File
@@ -1,5 +1,5 @@
import EventEmitter from "events"
import {call, sleep, mergeRight, on} from "@welshman/lib"
import {call, sleep, on} from "@welshman/lib"
import {isRelayUrl, matchFilters, Filter} from "@welshman/util"
import {LOCAL_RELAY_URL, Repository} from "./repository.js"
import {
@@ -13,7 +13,7 @@ import {
} from "./message.js"
import {Socket, SocketEvent} from "./socket.js"
import {Unsubscriber} from "./util.js"
import {netContext, NetContext} from "./context.js"
import type {NetContext} from "./context.js"
export enum AdapterEvent {
Receive = "receive",
@@ -150,9 +150,7 @@ export class MockAdapter extends AbstractAdapter {
export type AdapterContext = Partial<NetContext>
export const getAdapter = (url: string, adapterContext: AdapterContext = {}) => {
const context = mergeRight(netContext, adapterContext as any)
export const getAdapter = (url: string, context: AdapterContext = {}) => {
if (context.getAdapter) {
const adapter = context.getAdapter(url, context)
-8
View File
@@ -1,4 +1,3 @@
import {verifyEvent, TrustedEvent} from "@welshman/util"
import {AbstractAdapter} from "./adapter.js"
import {Repository} from "./repository.js"
import {Pool} from "./pool.js"
@@ -6,14 +5,7 @@ import {Pool} from "./pool.js"
export type AdapterFactory = (url: string, context: NetContext) => AbstractAdapter
export type NetContext = {
isEventValid: (event: TrustedEvent, url: string) => boolean
isEventDeleted: (event: TrustedEvent, url: string) => boolean
pool?: Pool
repository?: Repository
getAdapter?: AdapterFactory
}
export const netContext: NetContext = {
isEventValid: (event, url) => verifyEvent(event),
isEventDeleted: (event, url) => netContext.repository?.isDeleted(event) ?? false,
}
+4 -7
View File
@@ -15,6 +15,7 @@ import {
unionFilters,
matchFilters,
TrustedEvent,
verifyEvent,
deduplicateEvents,
getFilterResultCardinality,
} from "@welshman/util"
@@ -27,7 +28,6 @@ import {
} from "./message.js"
import {getAdapter, AdapterContext, AdapterEvent} from "./adapter.js"
import {SocketEvent, SocketStatus} from "./socket.js"
import {netContext} from "./context.js"
import {Tracker} from "./tracker.js"
export type BaseRequestOptions = {
@@ -36,7 +36,6 @@ export type BaseRequestOptions = {
context?: AdapterContext
autoClose?: boolean
isEventValid?: (event: TrustedEvent, url: string) => boolean
isEventDeleted?: (event: TrustedEvent, url: string) => boolean
onEvent?: (event: TrustedEvent, url: string) => void
onDeleted?: (event: unknown, url: string) => void
onInvalid?: (event: unknown, url: string) => void
@@ -60,8 +59,8 @@ export const requestOne = (options: RequestOneOptions) => {
const deferred = defer<TrustedEvent[]>()
const tracker = options.tracker || new Tracker()
const adapter = getAdapter(options.relay, options.context)
const isEventValid = options.isEventValid || netContext.isEventValid
const isEventDeleted = options.isEventDeleted || netContext.isEventDeleted
const isEventValid: (event: TrustedEvent, url: string) => boolean =
options.isEventValid || (event => verifyEvent(event))
let closed = false
@@ -88,7 +87,7 @@ export const requestOne = (options: RequestOneOptions) => {
if (ids.has(id)) {
if (tracker.track(event.id, url)) {
options.onDuplicate?.(event, url)
} else if (isEventDeleted(event, url)) {
} else if (options.context?.repository?.isDeleted(event)) {
options.onDeleted?.(event, url)
} else if (!isEventValid(event, url)) {
options.onInvalid?.(event, url)
@@ -216,7 +215,6 @@ export type LoaderOptions = {
threshold?: number
context?: AdapterContext
isEventValid?: (event: TrustedEvent, url: string) => boolean
isEventDeleted?: (event: TrustedEvent, url: string) => boolean
}
export type LoadOptions = {
@@ -320,7 +318,6 @@ export const makeLoader = (options: LoaderOptions) =>
signal: signalsByRelay.get(relay),
context: options.context,
isEventValid: options.isEventValid,
isEventDeleted: options.isEventDeleted,
onEvent: (event: TrustedEvent, url: string) => {
for (const request of getOpenRequests()) {
if (matchFilters(request.filters, event)) {