diff --git a/packages/pubsub/src/subscription.js b/packages/pubsub/src/subscription.js index e49f6479c3d..7d8e40b3ee7 100644 --- a/packages/pubsub/src/subscription.js +++ b/packages/pubsub/src/subscription.js @@ -409,6 +409,9 @@ Subscription.generateName_ = function() { * @throws {Error} If at least one ackId is not provided. * * @param {string|string[]} ackIds - An ackId or array of ackIds. + * @param {options=} options - Configuration object. + * @param {number} options.timeout - Set a maximum amount of time in + * milliseconds before giving up if no response is received. * @param {function=} callback - The callback function. * * @example @@ -423,7 +426,7 @@ Subscription.generateName_ = function() { * var apiResponse = data[0]; * }); */ -Subscription.prototype.ack = function(ackIds, callback) { +Subscription.prototype.ack = function(ackIds, options, callback) { var self = this; ackIds = arrify(ackIds); @@ -434,6 +437,12 @@ Subscription.prototype.ack = function(ackIds, callback) { ].join('')); } + if (is.fn(options)) { + callback = options; + options = {}; + } + + options = options || {}; callback = callback || common.util.noop; var protoOpts = { @@ -441,6 +450,10 @@ Subscription.prototype.ack = function(ackIds, callback) { method: 'acknowledge' }; + if (options && is.number(options.timeout)) { + protoOpts.timeout = options.timeout; + } + var reqOpts = { subscription: this.name, ackIds: ackIds diff --git a/packages/pubsub/test/subscription.js b/packages/pubsub/test/subscription.js index 4f8002615bd..4f365cc4342 100644 --- a/packages/pubsub/test/subscription.js +++ b/packages/pubsub/test/subscription.js @@ -53,7 +53,8 @@ describe('Subscription', function() { var SUB_NAME = 'test-subscription'; var SUB_FULL_NAME = 'projects/' + PROJECT_ID + '/subscriptions/' + SUB_NAME; var PUBSUB = { - projectId: PROJECT_ID + projectId: PROJECT_ID, + request: util.noop }; var message = 'howdy'; var messageBuffer = new Buffer(message).toString('base64'); @@ -410,6 +411,28 @@ describe('Subscription', function() { subscription.ack(IDS, assert.ifError); }); + it('should honor the timeout setting', function(done) { + var options = { + timeout: 10 + }; + + subscription.request = function(protoOpts) { + assert.strictEqual(protoOpts.timeout, options.timeout); + done(); + }; + + subscription.ack('abc', options, assert.ifError); + }); + + it('should not require a callback', function() { + assert.doesNotThrow(function() { + subscription.ack('abc'); + subscription.ack('abc', { + timeout: 10 + }); + }); + }); + it('should unmark the ack ids as being in progress', function(done) { subscription.request = function(protoOpts, reqOpts, callback) { callback();