diff --git a/packages/pubsub/src/subscription.js b/packages/pubsub/src/subscription.js index 6610e7ef814..91847efe974 100644 --- a/packages/pubsub/src/subscription.js +++ b/packages/pubsub/src/subscription.js @@ -347,7 +347,7 @@ modelo.inherits(Subscription, commonGrpc.ServiceObject, events.EventEmitter); * * @private */ -Subscription.formatMessage_ = function(msg, encoding) { +Subscription.formatMessage_ = function(msg, enc) { var innerMessage = msg.message; var message = { ackId: msg.ackId @@ -357,11 +357,16 @@ Subscription.formatMessage_ = function(msg, encoding) { message.id = innerMessage.messageId; if (innerMessage.data) { - message.data = new Buffer(innerMessage.data, 'base64').toString(encoding); + if (enc === 'base64') { + // Prevent decoding and then re-encoding to base64. + message.data = innerMessage.data; + } else { + message.data = Buffer.from(innerMessage.data, 'base64').toString(enc); - try { - message.data = JSON.parse(message.data); - } catch(e) {} + try { + message.data = JSON.parse(message.data); + } catch(e) {} + } } if (innerMessage.attributes) { diff --git a/packages/pubsub/test/subscription.js b/packages/pubsub/test/subscription.js index bb0f65b9b14..a84bc9b9c2d 100644 --- a/packages/pubsub/test/subscription.js +++ b/packages/pubsub/test/subscription.js @@ -77,6 +77,11 @@ describe('Subscription', function() { data: messageBinary, id: 7 }; + var expectedMessageAsBase64 = { + ackId: 'abc', + data: messageBuffer, + id: 7 + }; before(function() { Subscription = proxyquire('../src/subscription.js', { @@ -342,6 +347,12 @@ describe('Subscription', function() { assert.deepEqual(msg, expectedMessage); }); + it('should decode buffer to base64', function() { + var msg = Subscription + .formatMessage_(messageObj.receivedMessages[0], 'base64'); + assert.deepEqual(msg, expectedMessageAsBase64); + }); + it('should decode buffer to specified encoding', function() { var msg = Subscription .formatMessage_(messageObj.receivedMessages[0], 'binary');