UNPKG

aliyun-sdk

Version:
251 lines (213 loc) 8.95 kB
var ALY = require('./core'); require('./sequential_executor'); require('./service_interface/json'); require('./service_interface/query'); require('./service_interface/rest'); require('./service_interface/rest_json'); require('./service_interface/rest_xml'); require('./service_interface/pop'); require('./service_interface/top'); ALY.EventListeners = { Core: {} }; ALY.EventListeners = { Core: new ALY.SequentialExecutor().addNamedListeners(function(add, addAsync) { add('VALIDATE_PARAMETERS', 'validate', function VALIDATE_PARAMETERS(req) { var rules = req.service.api.operations[req.operation].input; new ALY.ParamValidator().validate(rules, req.params); }); add('SET_CONTENT_LENGTH', 'afterBuild', function SET_CONTENT_LENGTH(req) { if (req.httpRequest.headers['Content-Length'] === undefined) { var length = ALY.util.string.byteLength(req.httpRequest.body); req.httpRequest.headers['Content-Length'] = length; } }); add('SET_HTTP_HOST', 'afterBuild', function SET_HTTP_HOST(req) { req.httpRequest.headers['Host'] = req.httpRequest.endpoint.host; }); addAsync('SIGN', 'sign', function SIGN(req, done) { if (!req.service.api.signatureVersion) return done(); // none var credentials = req.service.config.getCredentials(); try { var date = ALY.util.date.getDate(); var SignerClass = req.service.getSignerClass(req); var signer = new SignerClass(req.httpRequest, req.service.api.signingName); // add new authorization var isRequestPayer = req.service.config.isRequestPayer; signer.addAuthorization(credentials, date, isRequestPayer); } catch (e) { req.response.error = e; } done(); }); add('VALIDATE_RESPONSE', 'validateResponse', function VALIDATE_RESPONSE(resp) { if (this.service.successfulResponse(resp, this)) { resp.data = {}; resp.error = null; } else { resp.data = null; resp.error = ALY.util.error(new Error(), {code: 'UnknownError', message: 'An unknown error occurred.'}); } }); addAsync('SEND', 'send', function SEND(resp, done) { function callback(httpResp) { resp.httpResponse.stream = httpResp; resp.httpResponse._abortCallback = done; httpResp.on('headers', function onHeaders(statusCode, headers) { resp.request.emit('httpHeaders', [statusCode, headers, resp]); if (!resp.request.httpRequest._streaming) { if (ALY.HttpClient.streamsApiVersion === 2) { // streams2 API check httpResp.on('readable', function onReadable() { var data = httpResp.read(); if (data !== null) { resp.request.emit('httpData', [data, resp]); } }); } else { // legacy streams API httpResp.on('data', function onData(data) { resp.request.emit('httpData', [data, resp]); }); } } }); httpResp.on('end', function onEnd() { resp.request.emit('httpDone'); done(); }); } function progress(httpResp) { httpResp.on('sendProgress', function onSendProgress(progress) { resp.request.emit('httpUploadProgress', [progress, resp]); }); httpResp.on('receiveProgress', function onReceiveProgress(progress) { resp.request.emit('httpDownloadProgress', [progress, resp]); }); } function error(err) { resp.error = ALY.util.error(err, { code: 'NetworkingError', region: resp.request.httpRequest.region, hostname: resp.request.httpRequest.endpoint.hostname, retryable: true }); resp.request.emit('httpError', [resp.error, resp], function() { done(); }); } resp.error = null; resp.data = null; var http = ALY.HttpClient.getInstance(); var httpOptions = resp.request.service.config.httpOptions || {}; this.httpRequest.debug(); var s = http.handleRequest(this.httpRequest, httpOptions, callback, error); progress(s); }); add('HTTP_HEADERS', 'httpHeaders', function HTTP_HEADERS(statusCode, headers, resp) { resp.httpResponse.statusCode = statusCode; resp.httpResponse.headers = headers; resp.httpResponse.body = new ALY.util.Buffer(''); resp.httpResponse.buffers = []; resp.httpResponse.numBytes = 0; }); add('HTTP_DATA', 'httpData', function HTTP_DATA(chunk, resp) { if (chunk) { if (ALY.util.isNode()) { resp.httpResponse.numBytes += chunk.length; var total = resp.httpResponse.headers['content-length']; var progress = { loaded: resp.httpResponse.numBytes, total: total }; resp.request.emit('httpDownloadProgress', [progress, resp]); } resp.httpResponse.buffers.push(new ALY.util.Buffer(chunk)); } }); add('HTTP_DONE', 'httpDone', function HTTP_DONE(resp) { // convert buffers array into single buffer if (resp.httpResponse.buffers && resp.httpResponse.buffers.length > 0) { var body = ALY.util.buffer.concat(resp.httpResponse.buffers); resp.httpResponse.body = body; } delete resp.httpResponse.numBytes; delete resp.httpResponse.buffers; }); add('FINALIZE_ERROR', 'retry', function FINALIZE_ERROR(resp) { if (resp.httpResponse.statusCode) { resp.error.statusCode = resp.httpResponse.statusCode; if (resp.error.retryable === undefined) { resp.error.retryable = this.service.retryableError(resp.error, this); } } }); }), Logger: new ALY.SequentialExecutor().addNamedListeners(function(add) { add('LOG_REQUEST', 'complete', function LOG_REQUEST(resp) { var req = resp.request; var logger = req.service.config.logger; if (!logger) return; function buildMessage() { var time = ALY.util.date.getDate().getTime(); var delta = (time - req.startTime.getTime()) / 1000; var ansi = logger.isTTY ? true : false; var status = resp.httpResponse.statusCode; var params = require('util').inspect(req.params, true, true); var message = ''; if (ansi) message += '\x1B[33m'; message += '[ALY ' + req.service.serviceIdentifier + ' ' + status; message += ' ' + delta.toString() + 's ' + resp.retryCount + ' retries]'; if (ansi) message += '\x1B[0;1m'; message += ' ' + req.operation + '(' + params + ')'; if (ansi) message += '\x1B[0m'; return message; } var message = buildMessage(); if (typeof logger.log === 'function') { logger.log(message); } else if (typeof logger.write === 'function') { logger.write(message + '\n'); } }); }), Json: new ALY.SequentialExecutor().addNamedListeners(function(add) { var svc = ALY.ServiceInterface.Json; add('BUILD', 'build', svc.buildRequest); add('EXTRACT_DATA', 'extractData', svc.extractData); add('EXTRACT_ERROR', 'extractError', svc.extractError); }), Rest: new ALY.SequentialExecutor().addNamedListeners(function(add) { var svc = ALY.ServiceInterface.Rest; add('BUILD', 'build', svc.buildRequest); add('EXTRACT_DATA', 'extractData', svc.extractData); add('EXTRACT_ERROR', 'extractError', svc.extractError); }), RestJson: new ALY.SequentialExecutor().addNamedListeners(function(add) { var svc = ALY.ServiceInterface.RestJson; add('BUILD', 'build', svc.buildRequest); add('EXTRACT_DATA', 'extractData', svc.extractData); add('EXTRACT_ERROR', 'extractError', svc.extractError); }), Pop: new ALY.SequentialExecutor().addNamedListeners(function(add) { var svc = ALY.ServiceInterface.Pop; add('BUILD', 'build', svc.buildRequest); add('EXTRACT_DATA', 'extractData', svc.extractData); add('EXTRACT_ERROR', 'extractError', svc.extractError); }), Top: new ALY.SequentialExecutor().addNamedListeners(function(add) { var svc = ALY.ServiceInterface.Top; add('BUILD', 'build', svc.buildRequest); add('EXTRACT_DATA', 'extractData', svc.extractData); add('EXTRACT_ERROR', 'extractError', svc.extractError); }), RestXml: new ALY.SequentialExecutor().addNamedListeners(function(add) { var svc = ALY.ServiceInterface.RestXml; add('BUILD', 'build', svc.buildRequest); add('EXTRACT_DATA', 'extractData', svc.extractData); add('EXTRACT_ERROR', 'extractError', svc.extractError); }), Query: new ALY.SequentialExecutor().addNamedListeners(function(add) { var svc = ALY.ServiceInterface.Query; add('BUILD', 'build', svc.buildRequest); add('EXTRACT_DATA', 'extractData', svc.extractData); add('EXTRACT_ERROR', 'extractError', svc.extractError); }) };