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
+1
View File
@@ -9,3 +9,4 @@ results
*.tsbuildinfo *.tsbuildinfo
.vscode .vscode
docs/**/*.html docs/**/*.html
.local
+3 -3
View File
@@ -1,7 +1,7 @@
import type {Unsubscriber} from "svelte/store" import type {Unsubscriber} from "svelte/store"
import {call} from "@welshman/lib" import {call} from "@welshman/lib"
import {Pool, Socket, Tracker, Repository, WrapManager, defaultSocketPolicies} from "@welshman/net" 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 {User} from "./user.js"
import type {ClientPolicy} from "./policies.js" import type {ClientPolicy} from "./policies.js"
@@ -24,7 +24,7 @@ export interface IClient {
user?: User user?: User
config: ClientConfig config: ClientConfig
use: <T>(Ctor: new (ctx: IClient) => T) => T use: <T>(Ctor: new (ctx: IClient) => T) => T
netContext: AdapterContext netContext: NetContext
pool: Pool pool: Pool
tracker: Tracker tracker: Tracker
repository: Repository repository: Repository
@@ -40,7 +40,7 @@ export interface IClient {
export class Client implements IClient { export class Client implements IClient {
user?: User user?: User
config: ClientConfig config: ClientConfig
netContext: AdapterContext netContext: NetContext
pool: Pool pool: Pool
tracker: Tracker tracker: Tracker
repository: Repository repository: Repository
+1 -1
View File
@@ -18,7 +18,7 @@ export class GiftWraps {
constructor(readonly ctx: IClient) { constructor(readonly ctx: IClient) {
this.queue = new TaskQueue<TrustedEvent>({ this.queue = new TaskQueue<TrustedEvent>({
batchSize: 5, batchSize: 50,
batchDelay: 30, batchDelay: 30,
processItem: async (wrap: TrustedEvent) => { processItem: async (wrap: TrustedEvent) => {
const signer = this.ctx.user?.signer const signer = this.ctx.user?.signer
+3 -3
View File
@@ -1,8 +1,8 @@
import type {Unsubscriber} from "svelte/store" import type {Unsubscriber} from "svelte/store"
import {on} from "@welshman/lib" 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 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 {RelayMessage} from "@welshman/net"
import type {IClient} from "./client.js" import type {IClient} from "./client.js"
import {RelayStats} from "./relayStats.js" import {RelayStats} from "./relayStats.js"
@@ -30,7 +30,7 @@ export const clientPolicyIngest: ClientPolicy = client =>
const event = message[2] const event = message[2]
if (isDVMKind(event.kind) || isEphemeralKind(event.kind)) return 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.tracker.track(event.id, socket.url)
client.repository.publish(event) client.repository.publish(event)
+3 -5
View File
@@ -1,5 +1,5 @@
import EventEmitter from "events" 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 {isRelayUrl, matchFilters, Filter} from "@welshman/util"
import {LOCAL_RELAY_URL, Repository} from "./repository.js" import {LOCAL_RELAY_URL, Repository} from "./repository.js"
import { import {
@@ -13,7 +13,7 @@ import {
} from "./message.js" } from "./message.js"
import {Socket, SocketEvent} from "./socket.js" import {Socket, SocketEvent} from "./socket.js"
import {Unsubscriber} from "./util.js" import {Unsubscriber} from "./util.js"
import {netContext, NetContext} from "./context.js" import type {NetContext} from "./context.js"
export enum AdapterEvent { export enum AdapterEvent {
Receive = "receive", Receive = "receive",
@@ -150,9 +150,7 @@ export class MockAdapter extends AbstractAdapter {
export type AdapterContext = Partial<NetContext> export type AdapterContext = Partial<NetContext>
export const getAdapter = (url: string, adapterContext: AdapterContext = {}) => { export const getAdapter = (url: string, context: 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)
-8
View File
@@ -1,4 +1,3 @@
import {verifyEvent, TrustedEvent} from "@welshman/util"
import {AbstractAdapter} from "./adapter.js" import {AbstractAdapter} from "./adapter.js"
import {Repository} from "./repository.js" import {Repository} from "./repository.js"
import {Pool} from "./pool.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 AdapterFactory = (url: string, context: NetContext) => AbstractAdapter
export type NetContext = { export type NetContext = {
isEventValid: (event: TrustedEvent, url: string) => boolean
isEventDeleted: (event: TrustedEvent, url: string) => boolean
pool?: Pool pool?: Pool
repository?: Repository repository?: Repository
getAdapter?: AdapterFactory 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, unionFilters,
matchFilters, matchFilters,
TrustedEvent, TrustedEvent,
verifyEvent,
deduplicateEvents, deduplicateEvents,
getFilterResultCardinality, getFilterResultCardinality,
} from "@welshman/util" } from "@welshman/util"
@@ -27,7 +28,6 @@ import {
} from "./message.js" } from "./message.js"
import {getAdapter, AdapterContext, AdapterEvent} from "./adapter.js" import {getAdapter, AdapterContext, AdapterEvent} from "./adapter.js"
import {SocketEvent, SocketStatus} from "./socket.js" import {SocketEvent, SocketStatus} from "./socket.js"
import {netContext} from "./context.js"
import {Tracker} from "./tracker.js" import {Tracker} from "./tracker.js"
export type BaseRequestOptions = { export type BaseRequestOptions = {
@@ -36,7 +36,6 @@ export type BaseRequestOptions = {
context?: AdapterContext context?: AdapterContext
autoClose?: boolean autoClose?: boolean
isEventValid?: (event: TrustedEvent, url: string) => boolean isEventValid?: (event: TrustedEvent, url: string) => boolean
isEventDeleted?: (event: TrustedEvent, url: string) => boolean
onEvent?: (event: TrustedEvent, url: string) => void onEvent?: (event: TrustedEvent, url: string) => void
onDeleted?: (event: unknown, url: string) => void onDeleted?: (event: unknown, url: string) => void
onInvalid?: (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 deferred = defer<TrustedEvent[]>()
const tracker = options.tracker || new Tracker() const tracker = options.tracker || new Tracker()
const adapter = getAdapter(options.relay, options.context) const adapter = getAdapter(options.relay, options.context)
const isEventValid = options.isEventValid || netContext.isEventValid const isEventValid: (event: TrustedEvent, url: string) => boolean =
const isEventDeleted = options.isEventDeleted || netContext.isEventDeleted options.isEventValid || (event => verifyEvent(event))
let closed = false let closed = false
@@ -88,7 +87,7 @@ export const requestOne = (options: RequestOneOptions) => {
if (ids.has(id)) { if (ids.has(id)) {
if (tracker.track(event.id, url)) { if (tracker.track(event.id, url)) {
options.onDuplicate?.(event, url) options.onDuplicate?.(event, url)
} else if (isEventDeleted(event, url)) { } else if (options.context?.repository?.isDeleted(event)) {
options.onDeleted?.(event, url) options.onDeleted?.(event, url)
} else if (!isEventValid(event, url)) { } else if (!isEventValid(event, url)) {
options.onInvalid?.(event, url) options.onInvalid?.(event, url)
@@ -216,7 +215,6 @@ export type LoaderOptions = {
threshold?: number threshold?: number
context?: AdapterContext context?: AdapterContext
isEventValid?: (event: TrustedEvent, url: string) => boolean isEventValid?: (event: TrustedEvent, url: string) => boolean
isEventDeleted?: (event: TrustedEvent, url: string) => boolean
} }
export type LoadOptions = { export type LoadOptions = {
@@ -320,7 +318,6 @@ export const makeLoader = (options: LoaderOptions) =>
signal: signalsByRelay.get(relay), signal: signalsByRelay.get(relay),
context: options.context, context: options.context,
isEventValid: options.isEventValid, isEventValid: options.isEventValid,
isEventDeleted: options.isEventDeleted,
onEvent: (event: TrustedEvent, url: string) => { onEvent: (event: TrustedEvent, url: string) => {
for (const request of getOpenRequests()) { for (const request of getOpenRequests()) {
if (matchFilters(request.filters, event)) { if (matchFilters(request.filters, event)) {