remove net global state
This commit is contained in:
@@ -9,3 +9,4 @@ results
|
|||||||
*.tsbuildinfo
|
*.tsbuildinfo
|
||||||
.vscode
|
.vscode
|
||||||
docs/**/*.html
|
docs/**/*.html
|
||||||
|
.local
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user