From 7fe58f4bdfb438492939062922ce0a9760b60a03 Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Mon, 7 Apr 2025 14:42:35 -0700 Subject: [PATCH] Handle non-unique relay urls passed to publish/request --- packages/app/src/router.ts | 2 +- packages/net/src/publish.ts | 12 +++++++++--- packages/net/src/request.ts | 9 +++++++-- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/packages/app/src/router.ts b/packages/app/src/router.ts index 312a623..3bcaeea 100644 --- a/packages/app/src/router.ts +++ b/packages/app/src/router.ts @@ -114,7 +114,7 @@ export type Selection = { } const makeSelection = (relays: string[], weight = 1): Selection => ({ - relays: relays.map(normalizeRelayUrl), + relays: relays.filter(isRelayUrl).map(normalizeRelayUrl), weight, }) diff --git a/packages/net/src/publish.ts b/packages/net/src/publish.ts index fa839f4..fa4fbcb 100644 --- a/packages/net/src/publish.ts +++ b/packages/net/src/publish.ts @@ -108,10 +108,16 @@ export class MultiPublish extends EventEmitter { _children: SinglePublish[] = [] _completed = new Set() - constructor({relays, ...options}: MultiPublishOptions) { + constructor(options: MultiPublishOptions) { super() - this.status = fromPairs(relays.map(relay => [relay, PublishStatus.Pending])) + const relays = new Set(options.relays) + + if (relays.size !== options.relays.length) { + console.warn("Non-unique relays passed to MultiPublish") + } + + this.status = fromPairs(Array.from(relays).map(relay => [relay, PublishStatus.Pending])) for (const relay of relays) { const unicast = new SinglePublish({relay, ...options}) @@ -140,7 +146,7 @@ export class MultiPublish extends EventEmitter { this._completed.add(relay) this.status[relay] = unicast.status - if (this._completed.size === relays.length) { + if (this._completed.size === relays.size) { this.emit(PublishEvent.Complete) this.cleanup() } diff --git a/packages/net/src/request.ts b/packages/net/src/request.ts index 89a9f1c..43dcb2f 100644 --- a/packages/net/src/request.ts +++ b/packages/net/src/request.ts @@ -176,10 +176,15 @@ export class MultiRequest extends EventEmitter { _children: SingleRequest[] = [] _closed = new Set() - constructor({relays, ...options}: MultiRequestOptions) { + constructor(options: MultiRequestOptions) { super() const tracker = new Tracker() + const relays = new Set(options.relays) + + if (relays.size !== options.relays.length) { + console.warn("Non-unique relays passed to MultiRequest") + } for (const relay of relays) { const req = new SingleRequest({relay, tracker, ...options}) @@ -215,7 +220,7 @@ export class MultiRequest extends EventEmitter { req.on(RequestEvent.Close, () => { this._closed.add(relay) - if (this._closed.size === relays.length) { + if (this._closed.size === relays.size) { this.emit(RequestEvent.Close) } })