diff --git a/.gitignore b/.gitignore index be40c42..0c7fba1 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ results *.tsbuildinfo .vscode docs/**/*.html +.local diff --git a/packages/client/src/client.ts b/packages/client/src/client.ts index ed182c5..0474570 100644 --- a/packages/client/src/client.ts +++ b/packages/client/src/client.ts @@ -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: (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 diff --git a/packages/client/src/giftWraps.ts b/packages/client/src/giftWraps.ts index 7888035..a4e71b2 100644 --- a/packages/client/src/giftWraps.ts +++ b/packages/client/src/giftWraps.ts @@ -18,7 +18,7 @@ export class GiftWraps { constructor(readonly ctx: IClient) { this.queue = new TaskQueue({ - batchSize: 5, + batchSize: 50, batchDelay: 30, processItem: async (wrap: TrustedEvent) => { const signer = this.ctx.user?.signer diff --git a/packages/client/src/policies.ts b/packages/client/src/policies.ts index 123a93d..2f717a7 100644 --- a/packages/client/src/policies.ts +++ b/packages/client/src/policies.ts @@ -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) diff --git a/packages/net/src/adapter.ts b/packages/net/src/adapter.ts index 0529d62..fe8cb90 100644 --- a/packages/net/src/adapter.ts +++ b/packages/net/src/adapter.ts @@ -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 -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) diff --git a/packages/net/src/context.ts b/packages/net/src/context.ts index 97b984f..5c8bfb5 100644 --- a/packages/net/src/context.ts +++ b/packages/net/src/context.ts @@ -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, -} diff --git a/packages/net/src/request.ts b/packages/net/src/request.ts index 7f1245c..c519b7b 100644 --- a/packages/net/src/request.ts +++ b/packages/net/src/request.ts @@ -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() 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)) {