UNPKG

travis-ci-access-token

Version:

Retrieve an access token to authenticate against Travis CI.

136 lines (115 loc) 2.77 kB
'use strict'; // MODULES // var debug = require( 'debug' )( 'travis-ci-access-token:request' ); var http = require( 'http' ); var https = require( 'https' ); var parse = require( 'utils-json-parse' ); // VARIABLES // var RE = /^https/; // REQUEST // /** * FUNCTION: request( opts, data, clbk ) * Queries an endpoint. * * @param {Object} opts - request options * @param {String} data - request data * @param {Function} clbk - callback to invoke upon querying an endpoint * @returns {Void} */ function request( opts, data, clbk ) { var body; var req; var res; var err; var r; // debug( 'Query options: %s', JSON.stringify( opts ) ); if ( RE.test( opts.protocol ) ) { req = https.request; } else { req = http.request; } body = ''; r = req( opts, onResponse ); r.on( 'error', onError ); r.write( data ); r.end(); /** * FUNCTION: onError( error ) * Event listener invoked after encountering an error. * * @private * @param {Error} error - error object * @returns {Void} */ function onError( error ) { debug( 'Error encountered while querying endpoint: %s', error.message ); if ( error instanceof Error ) { err = { 'status': 500, 'message': 'Request error: ' + error.message }; return clbk( err ); } return clbk( error, res, body ); } // end FUNCTION onError() /** * FUNCTION: onResponse( response ) * Callback invoked after receiving an HTTP response. * * @private * @param {Object} response - HTTP response object * @returns {Void} */ function onResponse( response ) { res = response; if ( res.statusCode !== 200 ) { err = { 'status': res.statusCode, 'message': '' }; } debug( 'Received a response from query endpoint.' ); debug( 'Response status: %s.', res.statusCode ); debug( 'Response headers: %s', JSON.stringify( res.headers ) ); res.setEncoding( 'utf8' ); res.on( 'data', onData ); res.on( 'end', onEnd ); } // end FUNCTION onResponse() /** * FUNCTION: onData( chunk ) * Event listener invoked upon receiving response data. * * @private * @param {String} chunk - data chunk * @returns {Void} */ function onData( chunk ) { body += chunk; } // end FUNCTION onData() /** * FUNCTION: onEnd() * Event listener invoked upon a response end. * * @private * @returns {Void} */ function onEnd() { var data; if ( err ) { err.message = body; return onError( err ); } // debug( 'Response body: %s', body ); data = parse( body ); if ( data instanceof Error ) { err = { 'status': 502, 'message': 'unable to parse endpoint response data as JSON: ' + data.message }; return onError( err ); } clbk( null, res, data ); } // end FUNCTION onEnd() } // end FUNCTION request() // EXPORTS // module.exports = request;