From c2164913e2de5fdcb24b1d5b896eab4bce47a229 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Fri, 15 Dec 2017 11:00:05 -0800 Subject: [PATCH 1/3] Add error code name to status error messages --- packages/grpc-native-core/src/client.js | 27 ++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/packages/grpc-native-core/src/client.js b/packages/grpc-native-core/src/client.js index 24af23b8a..519b8d79f 100644 --- a/packages/grpc-native-core/src/client.js +++ b/packages/grpc-native-core/src/client.js @@ -53,6 +53,21 @@ var Duplex = stream.Duplex; var util = require('util'); var version = require('../package.json').version; +/** + * Create an Error object from a status object + * @private + * @param {grpc~StatusObject} status The status object + * @return {Error} The resulting Error + */ +function createStatusError(status) { + let statusName = _.invert(constants.status)[status.code]; + let message = `${status.code} ${status.name}: ${status.details}`; + let error = new Error(message); + error.code = status.code; + error.details = status.details; + return error; +} + /** * Initial response metadata sent by the server when it starts processing the * call @@ -252,9 +267,7 @@ function _emitStatusIfDone() { if (status.code === constants.status.OK) { this.push(null); } else { - var error = new Error(status.details); - error.code = status.code; - error.metadata = status.metadata; + var error = createStatusError(status); this.emit('error', error); } this.emit('status', status); @@ -551,9 +564,7 @@ Client.prototype.makeUnaryRequest = function(method, serialize, deserialize, } } if (status.code !== constants.status.OK) { - error = new Error(status.details); - error.code = status.code; - error.metadata = status.metadata; + error = new createStatusError(status); args.callback(error); } else { args.callback(null, deserialized); @@ -634,9 +645,7 @@ Client.prototype.makeClientStreamRequest = function(method, serialize, } } if (status.code !== constants.status.OK) { - error = new Error(response.status.details); - error.code = status.code; - error.metadata = status.metadata; + error = createStatusError(status); args.callback(error); } else { args.callback(null, deserialized); From 7edc14bb1a326ea4b31615555a4b8da591d3de64 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Fri, 15 Dec 2017 11:35:47 -0800 Subject: [PATCH 2/3] Attach the proper fields to the Error object --- packages/grpc-native-core/src/client.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/grpc-native-core/src/client.js b/packages/grpc-native-core/src/client.js index 519b8d79f..1e873d2cd 100644 --- a/packages/grpc-native-core/src/client.js +++ b/packages/grpc-native-core/src/client.js @@ -64,7 +64,7 @@ function createStatusError(status) { let message = `${status.code} ${status.name}: ${status.details}`; let error = new Error(message); error.code = status.code; - error.details = status.details; + error.metadata = status.metadata; return error; } From 01d66dd0b5c5be0a4d0230f67142d7d3c13ae5a1 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Fri, 12 Jan 2018 15:11:21 -0500 Subject: [PATCH 3/3] Add original details string to errors, update tests --- packages/grpc-native-core/src/client.js | 3 ++- test/api/credentials_test.js | 4 ++-- test/api/surface_test.js | 8 ++++---- test/interop/interop_client.js | 2 +- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/grpc-native-core/src/client.js b/packages/grpc-native-core/src/client.js index 1e873d2cd..389d06b00 100644 --- a/packages/grpc-native-core/src/client.js +++ b/packages/grpc-native-core/src/client.js @@ -61,10 +61,11 @@ var version = require('../package.json').version; */ function createStatusError(status) { let statusName = _.invert(constants.status)[status.code]; - let message = `${status.code} ${status.name}: ${status.details}`; + let message = `${status.code} ${statusName}: ${status.details}`; let error = new Error(message); error.code = status.code; error.metadata = status.metadata; + error.details = status.details; return error; } diff --git a/test/api/credentials_test.js b/test/api/credentials_test.js index e05ec7648..171892675 100644 --- a/test/api/credentials_test.js +++ b/test/api/credentials_test.js @@ -319,7 +319,7 @@ describe('client credentials', function() { client_options); client.unary({}, function(err, data) { assert(err); - assert.strictEqual(err.message, + assert.strictEqual(err.details, 'Getting metadata from plugin failed with error: ' + 'Authentication error'); assert.strictEqual(err.code, grpc.status.UNAUTHENTICATED); @@ -369,7 +369,7 @@ describe('client credentials', function() { client_options); client.unary({}, function(err, data) { assert(err); - assert.strictEqual(err.message, + assert.strictEqual(err.details, 'Getting metadata from plugin failed with error: ' + 'Authentication failure'); done(); diff --git a/test/api/surface_test.js b/test/api/surface_test.js index 5fdcbcfb7..3bffaf8e3 100644 --- a/test/api/surface_test.js +++ b/test/api/surface_test.js @@ -981,7 +981,7 @@ describe('Other conditions', function() { client.unary({error: true}, function(err, data) { assert(err); assert.strictEqual(err.code, grpc.status.UNKNOWN); - assert.strictEqual(err.message, 'Requested error'); + assert.strictEqual(err.details, 'Requested error'); done(); }); }); @@ -989,7 +989,7 @@ describe('Other conditions', function() { var call = client.clientStream(function(err, data) { assert(err); assert.strictEqual(err.code, grpc.status.UNKNOWN); - assert.strictEqual(err.message, 'Requested error'); + assert.strictEqual(err.details, 'Requested error'); done(); }); call.write({error: false}); @@ -1001,7 +1001,7 @@ describe('Other conditions', function() { call.on('data', function(){}); call.on('error', function(error) { assert.strictEqual(error.code, grpc.status.UNKNOWN); - assert.strictEqual(error.message, 'Requested error'); + assert.strictEqual(error.details, 'Requested error'); done(); }); }); @@ -1013,7 +1013,7 @@ describe('Other conditions', function() { call.on('data', function(){}); call.on('error', function(error) { assert.strictEqual(error.code, grpc.status.UNKNOWN); - assert.strictEqual(error.message, 'Requested error'); + assert.strictEqual(error.details, 'Requested error'); done(); }); }); diff --git a/test/interop/interop_client.js b/test/interop/interop_client.js index 73b84c38c..83890bca8 100644 --- a/test/interop/interop_client.js +++ b/test/interop/interop_client.js @@ -347,7 +347,7 @@ function statusCodeAndMessage(client, done) { client.unaryCall(arg, function(err, resp) { assert(err); assert.strictEqual(err.code, 2); - assert.strictEqual(err.message, 'test status message'); + assert.strictEqual(err.details, 'test status message'); done(); }); var duplex = client.fullDuplexCall();