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
285310TwitterClient . 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 ){
316350exports . 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