From d3df9bff1a71978eca33d297399afe05f98330cb Mon Sep 17 00:00:00 2001 From: Juan Cruz Viotti Date: Mon, 1 Dec 2014 13:23:47 -0400 Subject: [PATCH] Allow tracking progress of server requests --- lib/resin/server/server.coffee | 15 +++++++++++---- lib/resin/server/server.spec.coffee | 19 +++++++++++++++++++ package.json | 3 ++- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/lib/resin/server/server.coffee b/lib/resin/server/server.coffee index a1d041e7..88c1915b 100644 --- a/lib/resin/server/server.coffee +++ b/lib/resin/server/server.coffee @@ -1,12 +1,15 @@ _ = require('lodash') request = require('request') +progress = require('request-progress') urlResolve = require('url').resolve async = require('async') connection = require('../../connection/connection') config = require('../config') token = require('../token/token') -exports.request = (options = {}, callback) -> +exports.request = (options = {}, callback, onProgress) -> + + onProgress ?= _.noop if not options.url? throw new Error('Missing URL') @@ -37,7 +40,10 @@ exports.request = (options = {}, callback) -> _.extend options.headers, 'Authorization': "Bearer #{savedToken}" - request(options, callback) + progress(request(options, callback)) + .on('progress', onProgress) + .on('error', callback) + .on('end', onProgress) (response, body, callback) -> try @@ -52,18 +58,19 @@ exports.request = (options = {}, callback) -> createFacadeFunction = (method) -> lowerCaseMethod = method.toLowerCase() - exports[lowerCaseMethod] = (url, body, callback) -> + exports[lowerCaseMethod] = (url, body, callback, onProgress) -> options = { method url } if _.isFunction(body) + onProgress = callback callback = body else options.json = body - return exports.request(options, callback) + return exports.request(options, callback, onProgress) for method in [ 'GET' diff --git a/lib/resin/server/server.spec.coffee b/lib/resin/server/server.spec.coffee index ed7259e3..519b6042 100644 --- a/lib/resin/server/server.spec.coffee +++ b/lib/resin/server/server.spec.coffee @@ -1,6 +1,7 @@ expect = require('chai').expect nock = require('nock') url = require('url') +sinon = require('sinon') server = require('./server') config = require('../config') token = require('../token/token') @@ -144,13 +145,28 @@ describe 'Server:', -> expect(response.body.status).to.equal(STATUS.ok) done() + it 'should accept an onProgress function', (done) -> + spy = sinon.spy() + + server.request { + method: 'GET' + url: URI.ok + }, (error, response, body) -> + expect(error).to.not.exist + expect(spy).to.have.been.called + done() + , spy + checkRequestTypeWithoutBody = (type) -> return (done) -> + spy = sinon.spy() lowercaseType = type.toLowerCase() server[lowercaseType] URI.ok, (error, response) -> return done(error) if error? expect(response.request.method).to.equal(type) + expect(spy).to.have.been.called done() + , spy describe '#get()', -> it('should be a facade to request()', checkRequestTypeWithoutBody('GET')) @@ -163,11 +179,14 @@ describe 'Server:', -> checkRequestTypeWithBody = (type, body) -> return (done) -> + spy = sinon.spy() lowercaseType = type.toLowerCase() server[lowercaseType] URI.ok, body, (error, response) -> return done(error) if error? expect(response.request.method).to.equal(type) + expect(spy).to.have.been.called done() + , spy describe '#post()', -> it('should be a facade to request()', checkRequestTypeWithBody('POST', { hello: 'world' })) diff --git a/package.json b/package.json index 51d28f15..fc3f962e 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "is-online": "~3.0.0", "pluralize": "~1.1.0", "indefinite-article": "0.0.2", - "pubnub": "~3.7.0" + "pubnub": "~3.7.0", + "request-progress": "~0.3.1" } }