diff --git a/js/nostr.js b/js/nostr.js index ea7df804..6d241a3d 100644 --- a/js/nostr.js +++ b/js/nostr.js @@ -1171,8 +1171,23 @@ function publishEventToRelay(pool, url, event) { let handlerRegistered = false; handlerRegistered = registerHandler("ok", handleSuccess) || handlerRegistered; - handlerRegistered = - registerHandler("seen", handleSuccess) || handlerRegistered; + + const supportsSeenEvent = (() => { + if (!pub || typeof pub !== "object") { + return false; + } + const candidateArrays = [ + pub.seen, + pub._seen, + pub.listeners?.seen, + ]; + return candidateArrays.some((value) => Array.isArray(value)); + })(); + + if (supportsSeenEvent) { + handlerRegistered = + registerHandler("seen", handleSuccess) || handlerRegistered; + } handlerRegistered = registerHandler("failed", handleFailure) || handlerRegistered; diff --git a/tests/watch-history.test.mjs b/tests/watch-history.test.mjs index 0d58b000..1d266e90 100644 --- a/tests/watch-history.test.mjs +++ b/tests/watch-history.test.mjs @@ -604,11 +604,14 @@ const { publishedEvents: noSeenPublishedEvents, } = createPublishingClient(NO_SEEN_ACTOR); +let noSeenHandlerRequested = false; + noSeenClient.pool.publish = (_urls, event) => { noSeenPublishedEvents.push(event); return { on(eventName, handler) { if (eventName === "seen") { + noSeenHandlerRequested = true; throw new TypeError("seen unsupported"); } if (eventName === "ok") { @@ -634,6 +637,11 @@ assert( noSeenResult.events.length > 0, "publish should still return the emitted events when seen is unsupported" ); +assert.equal( + noSeenHandlerRequested, + false, + "publish should not attempt to register a seen handler when relay omits support" +); delete globalThis.window.nostr;