diff --git a/packages/core/src/controllers/subscriber.ts b/packages/core/src/controllers/subscriber.ts index c9c1d2ec6..9d002b915 100644 --- a/packages/core/src/controllers/subscriber.ts +++ b/packages/core/src/controllers/subscriber.ts @@ -236,6 +236,7 @@ export class Subscriber extends ISubscriber { }; this.logger.debug(`Outgoing Relay Payload`); this.logger.trace({ type: "payload", direction: "outgoing", request }); + const shouldThrow = opts?.internal?.throwOnFailedPublish; try { const subId = hashMessage(topic + this.clientId); // in link mode, allow the app to update its network state (i.e. active airplane mode) with small delay before attempting to subscribe @@ -253,12 +254,15 @@ export class Subscriber extends ISubscriber { `Subscribing to ${topic} failed, please try again`, ); const result = await subscribe; + if (!result && shouldThrow) { + throw new Error(`Subscribing to ${topic} failed, please try again`); + } // return null to indicate that the subscription failed return result ? subId : null; } catch (err) { this.logger.debug(`Outgoing Relay Subscribe Payload stalled`); this.relayer.events.emit(RELAYER_EVENTS.connection_stalled); - if (opts?.internal?.throwOnFailedPublish) { + if (shouldThrow) { throw err; } } diff --git a/packages/core/test/relayer.spec.ts b/packages/core/test/relayer.spec.ts index 794dd9b21..995549cbc 100644 --- a/packages/core/test/relayer.spec.ts +++ b/packages/core/test/relayer.spec.ts @@ -188,6 +188,21 @@ describe("Relayer", () => { ); }); + it("should throw when subscribe publish fails", async () => { + await relayer.transportOpen(); + await relayer.toEstablishConnection(); + relayer.subscriber.subscribeTimeout = 5_000; + relayer.request = () => { + return new Promise((resolve) => { + resolve(); + }); + }; + const topic = generateRandomBytes32(); + await expect(relayer.subscribe(topic)).rejects.toThrow( + `Subscribing to ${topic} failed, please try again`, + ); + }); + it("should be able to resubscribe on topic that already exists", async () => { const topic = generateRandomBytes32(); const id = await relayer.subscribe(topic);