Commit 7470a6f4 by Daniel Cadenas Committed by GitHub

Merge pull request #22 from clearbit/dc-add-timeout

Add timeout
parents f53e0c16 b62c9fe0
...@@ -27,6 +27,7 @@ var clearbit = new Client({key: 'api_key'}); ...@@ -27,6 +27,7 @@ var clearbit = new Client({key: 'api_key'});
* `webhook_id` *String*: Custom identifier for the webhook request * `webhook_id` *String*: Custom identifier for the webhook request
* `subscribe` *Boolean*: Set to `true` to subscribe to the changes * `subscribe` *Boolean*: Set to `true` to subscribe to the changes
* `stream` *Boolean*: Set to `true` to use the [streaming API](https://clearbit.com/docs?shell#streaming) instead of webhooks * `stream` *Boolean*: Set to `true` to use the [streaming API](https://clearbit.com/docs?shell#streaming) instead of webhooks
* `timeout` *Integer*: The timeout in milliseconds after which a socket closed error will be thrown.
```js ```js
var Person = clearbit.Person; var Person = clearbit.Person;
...@@ -51,6 +52,7 @@ Person.find({email: 'email@domain.com'}) ...@@ -51,6 +52,7 @@ Person.find({email: 'email@domain.com'})
* `domain` *String*: The company domain to look up **(required)** * `domain` *String*: The company domain to look up **(required)**
* `webhook_id` *String*: Custom identifier for the webhook request * `webhook_id` *String*: Custom identifier for the webhook request
* `stream` *Boolean*: Set to `true` to use the [streaming API](https://clearbit.com/docs?shell#streaming) instead of webhooks * `stream` *Boolean*: Set to `true` to use the [streaming API](https://clearbit.com/docs?shell#streaming) instead of webhooks
* `timeout` *Integer*: The timeout in milliseconds after which a socket closed error will be thrown.
```js ```js
var Company = clearbit.Company; var Company = clearbit.Company;
......
{ {
"name": "clearbit", "name": "clearbit",
"version": "1.2.3", "version": "1.3.0",
"description": "Client for Clearbit.co business intelligence APIs", "description": "Client for Clearbit.co business intelligence APIs",
"main": "./src", "main": "./src",
"scripts": { "scripts": {
......
...@@ -59,6 +59,8 @@ ClearbitClient.prototype.request = function (options) { ...@@ -59,6 +59,8 @@ ClearbitClient.prototype.request = function (options) {
method: 'get' method: 'get'
}); });
var timeout = options.timeout || options.stream && 60000 || 10000;
return needle.requestAsync( return needle.requestAsync(
options.method, options.method,
this.url(options), this.url(options),
...@@ -66,7 +68,7 @@ ClearbitClient.prototype.request = function (options) { ...@@ -66,7 +68,7 @@ ClearbitClient.prototype.request = function (options) {
{ {
json: options.json, json: options.json,
headers: options.headers, headers: options.headers,
timeout: options.stream ? 60000 : 10000, timeout: timeout,
username: this.key, username: this.key,
password: '', password: '',
user_agent: 'ClearbitNode/v' + pkg.version user_agent: 'ClearbitNode/v' + pkg.version
......
...@@ -111,7 +111,7 @@ function extractParams (options) { ...@@ -111,7 +111,7 @@ function extractParams (options) {
var params = _.omit(options || {}, var params = _.omit(options || {},
'path', 'method', 'params', 'path', 'method', 'params',
'client', 'api', 'stream', 'client', 'api', 'stream',
'headers' 'headers', 'timeout'
); );
return _.isEmpty(params) ? null : params; return _.isEmpty(params) ? null : params;
......
...@@ -100,18 +100,51 @@ describe('Client', function () { ...@@ -100,18 +100,51 @@ describe('Client', function () {
}); });
}); });
it('uses a timeout of 60 seconds for streaming requests', function () { function requestWithOptions(clientRequestOptions) {
sinon.stub(needle, 'request').yieldsAsync(null, {}, undefined); sinon.stub(needle, 'request').yieldsAsync(null, {}, undefined);
return client.request({
return client
.request(clientRequestOptions)
.then(function() { return needle.request.firstCall.args[3]; })
.finally(function() { return needle.request.restore(); });
}
it('can specify a custom timeout for a request', function () {
return requestWithOptions({
api: 'person',
timeout: 30000
})
.then(function(needleOptions) {
expect(needleOptions).to.have.property('timeout', 30000);
});
});
it('sets the default timeout to 10 seconds', function () {
return requestWithOptions({ api: 'person' })
.then(function(needleOptions) {
expect(needleOptions).to.have.property('timeout', 10000);
});
});
it('uses a default timeout of 60 seconds for streaming requests', function () {
return requestWithOptions({
api: 'person', api: 'person',
stream: true stream: true
}) })
.then(function () { .then(function(needleOptions) {
expect(needle.request.firstCall.args[3]) expect(needleOptions).to.have.property('timeout', 60000);
.to.have.property('timeout', 60000); });
});
it('can specify a custom timeout for streaming requests', function () {
return requestWithOptions({
api: 'person',
stream: true,
timeout: 30000
}) })
.finally(function () { .then(function(needleOptions) {
needle.request.restore(); expect(needleOptions).to.have.property('timeout', 30000);
}); });
}); });
......
...@@ -38,6 +38,13 @@ describe('Person', function () { ...@@ -38,6 +38,13 @@ describe('Person', function () {
return Person.find({email: 'alex@alexmaccaw.com', subscribe: true}); return Person.find({email: 'alex@alexmaccaw.com', subscribe: true});
}); });
it('removes non query options from the url', function () {
mock
.get('/v2/people/find?email=alex%40alexmaccaw.com')
.reply(200, alex);
return Person.find({email: 'alex@alexmaccaw.com', timeout: 10000});
});
it('can handle queued requests', function () { it('can handle queued requests', function () {
mock mock
.get('/v2/people/find?email=alex%40alexmaccaw.com') .get('/v2/people/find?email=alex%40alexmaccaw.com')
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment