From c13e2f5b033567055136dea95d3f1b54ad4f8a2c Mon Sep 17 00:00:00 2001 From: murgatroid99 <mlumish@google.com> Date: Tue, 29 Nov 2016 18:16:57 -0800 Subject: [PATCH] Node: correctly bubble up errors caused by non-serializable writes --- src/node/src/client.js | 13 ++++++++++++- src/node/src/server.js | 7 ++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/node/src/client.js b/src/node/src/client.js index f75f951eb8..56aa890779 100644 --- a/src/node/src/client.js +++ b/src/node/src/client.js @@ -99,7 +99,18 @@ function ClientWritableStream(call, serialize) { function _write(chunk, encoding, callback) { /* jshint validthis: true */ var batch = {}; - var message = this.serialize(chunk); + var message; + try { + message = this.serialize(chunk); + } catch (e) { + /* Sending this error to the server and emitting it immediately on the + client may put the call in a slightly weird state on the client side, + but passing an object that causes a serialization failure is a misuse + of the API anyway, so that's OK. The primary purpose here is to give the + programmer a useful error and to stop the stream properly */ + this.call.cancelWithStatus(grpc.status.INTERNAL, "Serialization failure"); + callback(e); + } if (_.isFinite(encoding)) { /* Attach the encoding if it is a finite number. This is the closest we * can get to checking that it is valid flags */ diff --git a/src/node/src/server.js b/src/node/src/server.js index b3b414969a..bd0a5122ad 100644 --- a/src/node/src/server.js +++ b/src/node/src/server.js @@ -278,7 +278,12 @@ function _write(chunk, encoding, callback) { (new Metadata())._getCoreRepresentation(); this.call.metadataSent = true; } - var message = this.serialize(chunk); + var message; + try { + message = this.serialize(chunk); + } catch (e) { + callback(e); + } if (_.isFinite(encoding)) { /* Attach the encoding if it is a finite number. This is the closest we * can get to checking that it is valid flags */ -- GitLab