Node: correctly bubble up errors caused by non-serializable writes
diff --git a/src/node/src/client.js b/src/node/src/client.js
index f75f951..56aa890 100644
--- a/src/node/src/client.js
+++ b/src/node/src/client.js
@@ -99,7 +99,18 @@
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 b3b4149..bd0a512 100644
--- a/src/node/src/server.js
+++ b/src/node/src/server.js
@@ -278,7 +278,12 @@
(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 */