From 49eb96631545581cd2e9a4ae69bd6efb61d3dd62 Mon Sep 17 00:00:00 2001 From: Hornwitser Date: Thu, 12 Nov 2020 04:05:24 +0100 Subject: [PATCH] Respond to unhandled requests Give an error response back to unhandled requests, this fixes requests hanging forever when the target does not support the given request. --- packages/lib/link/link.js | 12 ++++++++++++ test/lib/link/link.js | 10 ++++++++++ 2 files changed, 22 insertions(+) diff --git a/packages/lib/link/link.js b/packages/lib/link/link.js index d0b5e814..f602f92f 100644 --- a/packages/lib/link/link.js +++ b/packages/lib/link/link.js @@ -39,6 +39,18 @@ class Link { if (err.errors) { console.error(err.errors); } + + // Send back an error response if this was a request. + if ( + typeof payload.type === "string" + && payload.type.endsWith("_request") + && Number.isInteger(payload.seq) + ) { + this.connector.send( + `${payload.type.slice(0, -8)}_response`, + { seq: payload.seq, error: err.message } + ); + } } else { this.connector.emit("error", err); } diff --git a/test/lib/link/link.js b/test/lib/link/link.js index 724ecd08..b2152861 100644 --- a/test/lib/link/link.js +++ b/test/lib/link/link.js @@ -35,6 +35,16 @@ describe("lib/link/link", function() { await assert.rejects(result, new Error("Handler error")); }); + it("should give an error response back on an unhandled request", function() { + testConnector.sentMessages = []; + testConnector.emit("message", { seq: 1, type: "unhandled_request", data: {}}); + assert.deepEqual(testConnector.sentMessages, [{ + type: "unhandled_response", + seq: testConnector._seq - 1, + data: { seq: 1, error: "No validator for unhandled_request on source-target" } }, + ]) + }); + describe(".setValidator()", function() { it("should set the validator", function() { testLink.setValidator("test", () => true);