Skip to content
This repository was archived by the owner on Feb 13, 2018. It is now read-only.

Commit cf77fb3

Browse files
author
Tim Whitlock
committed
implemented socket timeout
1 parent dd78d84 commit cf77fb3

File tree

1 file changed

+52
-5
lines changed

1 file changed

+52
-5
lines changed

lib/twitter.js

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
// pseudo constants
88
//
9-
var TWITTER_API_TIMEOUT = 5,
9+
var TWITTER_API_TIMEOUT = 10000,
1010
TWITTER_API_USERAGENT = 'Node/'+process.version.substr(1),
1111
TWITTER_API_BASE = 'https://api.twitter.com/1.1';
1212
TWITTER_STREAM_BASE = 'https://stream.twitter.com/1.1';
@@ -154,7 +154,16 @@ TwitterClient.prototype._rest = function( requestMethod, requestPath, requestArg
154154
throw new Error('Twitter REST client not authenticated');
155155
}
156156
var requestUri = TWITTER_API_BASE + '/' + requestPath + '.json';
157-
return this.call( requestMethod, requestUri, requestArgs, function( res ) {
157+
if( 'function' !== typeof callback ){
158+
callback = function(){
159+
console.error('No callback for '+requestMethod+' '+requestUri);
160+
}
161+
}
162+
return this.call( requestMethod, requestUri, requestArgs, function( res, err ) {
163+
if( ! res ){
164+
callback( null, err, 0 );
165+
return;
166+
}
158167
// started to receive response from twitter
159168
res.setEncoding('utf8');
160169
var body = '';
@@ -202,11 +211,14 @@ TwitterClient.prototype.stream = function( requestPath, requestArgs, callback ){
202211
}
203212
if( 'function' !== typeof callback ){
204213
callback = function( json ){
205-
console.log( json );
214+
json && console.log( json );
206215
};
207216
}
208217
var client = this;
209218
return this.call( requestMethod, requestUri, requestArgs, function(res){
219+
if( ! res ){
220+
callback();
221+
}
210222
client.response = res;
211223
res.setEncoding('utf8');
212224
if( 200 !== res.statusCode ){
@@ -250,6 +262,19 @@ TwitterClient.prototype.call = function( requestMethod, requestUri, requestArgs,
250262
http.path += '?' + query;
251263
}
252264
var req = require('https').get( http, callback );
265+
req.on('socket', function (socket) {
266+
socket.setTimeout( TWITTER_API_TIMEOUT );
267+
socket.on('timeout', function() {
268+
req.abort();
269+
} );
270+
} );
271+
req.on('error', function( e ) {
272+
console.error( String(e) );
273+
if( 'ECONNRESET' === e.code ){
274+
e = { message: 'Request timeout', code: 408 };
275+
}
276+
callback( null, e );
277+
} );
253278
if( 'POST' === requestMethod && query ){
254279
req.write( query );
255280
req.write( '\n' );
@@ -283,7 +308,16 @@ TwitterClient.prototype.fetchAccessToken = function( verifier, callback ){
283308
}
284309

285310
TwitterClient.prototype._oauthExchange = function( requestUri, requestArgs, callback ){
286-
this.call( 'POST', requestUri, requestArgs, function( res ){
311+
if( 'function' !== typeof callback ){
312+
callback = function(){
313+
console.error('No callback for POST '+requestUri);
314+
}
315+
}
316+
this.call( 'POST', requestUri, requestArgs, function( res, err ){
317+
if( ! res ){
318+
callback( null, err||{}, 0 );
319+
return;
320+
}
287321
// started to receive response from twitter
288322
res.setEncoding('utf8');
289323
var body = '';
@@ -293,7 +327,7 @@ TwitterClient.prototype._oauthExchange = function( requestUri, requestArgs, call
293327
res.on('end', function(){
294328
var params = require('querystring').parse( body );
295329
var token = params.oauth_token && params.oauth_token_secret && new OAuthToken( params.oauth_token, params.oauth_token_secret );
296-
'function' == typeof callback && callback( token, params, res.statusCode );
330+
callback( token, params, res.statusCode );
297331
} );
298332
} );
299333
}
@@ -316,3 +350,16 @@ exports.createOAuthToken = function( key, secret ){
316350
exports.createClient = function(){
317351
return new TwitterClient;
318352
}
353+
354+
355+
// expose some configuration setters
356+
357+
exports.setTimeout = function( ms ){
358+
ms = Number(ms);
359+
if( ! isNaN(ms) ){
360+
TWITTER_API_TIMEOUT = ms;
361+
}
362+
return exports;
363+
}
364+
365+

0 commit comments

Comments
 (0)