asposestoragecloud
Version:
Aspose.Storage Cloud SDK for NodeJS
242 lines (180 loc) • 6.33 kB
JavaScript
var path = require('path');
var fs = require('fs');
var util = require('util');
var crypto = require('crypto');
var https = require('https');
var url = require('url');
var ResponseMessage = require('./response-message');
var Multipart = require('./multipart').Multipart;
// config values for api client
var config = {
'apiKey' : null,
'appSid' : null,
'baseURI' : 'https://api.aspose.cloud/v1.1',
'debug' : false
};
//config values required for api client
var required_for_api_client = [
'apiKey',
'appSid'
];
function ApiClient(aconfig){
var self = this;
self._validateConfigOrThrow(aconfig);
for (var key in aconfig) {
if (aconfig[key]) {
config[key] = aconfig[key];
}
}
this.config = config;
}
ApiClient.prototype._validateConfigOrThrow = function (config) {
//check config for proper format
if (typeof config !== 'object') {
throw new TypeError('config must be object, got ' + typeof config);
}
var required_keys = required_for_api_client;
required_keys.forEach(function (req_key) {
if (!config[req_key]) {
var err_msg = util.format('Config must include `%s` when using ApiClient.', req_key);
throw new Error(err_msg);
}
})
}
ApiClient.prototype.Sign = function(unsignedURL, privateKey){
if(this.config.debug){console.log("privateKey :: " + privateKey); console.log("unsignedURL :: " + unsignedURL);}
var signature = crypto.createHmac('sha1', privateKey)
.update(unsignedURL)
.digest('base64')
.replace('=', '');
return signature;
};
ApiClient.prototype.InvokeSimpleBody = function(resourceURL, method, postData, headerParams, callback){
if(this.config.debug){console.log("InvokeSimpleBody");}
var request_url = url.parse(resourceURL);
var options = {
method: method,
protocol: request_url.protocol,
hostname: request_url.hostname,
path: request_url.path,
headers:headerParams
};
if (postData) {
options.headers['Content-Length'] = postData.length;
} else {
options.headers['Content-Length'] = 0;
}
var response_buffer = null;
var responseMessage = new ResponseMessage();
var request = https.request(options);
request.on('response', function(response) {
responseMessage.code = response.statusCode;
responseMessage.status = response.statusMessage;
response.on('data', function(chunk) {
if (response_buffer) {
if (typeof (Buffer.concat) === 'function') {
response_buffer = Buffer.concat([response_buffer, chunk]);
} else {
var holder = new Buffer(response_buffer.length + chunk.length);
response_buffer.copy(holder);
chunk.copy(holder, response_buffer.length);
response_buffer = holder;
}
} else {
response_buffer = chunk;
}
});
response.on('end', function() {
if (typeof callback === 'function') {
if(response.headers['content-type'] !== 'undefined' && String(response.headers['content-type']).indexOf("application/json") > -1 ){
responseMessage.body = JSON.parse(response_buffer.toString('utf-8'));
}else{responseMessage.body = response_buffer;}
callback.call(null, responseMessage);
}
});
});
if (postData) {
request.end(postData);
} else {
request.end();
}
}
ApiClient.prototype.InvokeMultiPartBody = function(resourceURL, method, headerParams, files, callback){
if(this.config.debug){console.log("InvokeMultiPartBody")};
var request_url = url.parse(resourceURL);
var options = {
method: method,
protocol: request_url.protocol,
hostname: request_url.hostname,
path: request_url.path,
headers:headerParams
};
var response_buffer = null;
var responseMessage = new ResponseMessage();
var request = https.request(options);
var multipart = new Multipart(request);
var postData = multipart.build(files, false);
multipart.setHeaders(false);
request.on('response', function(response) {
console.log(response.statusCode);
responseMessage.code = response.statusCode;
responseMessage.status = response.statusMessage;
response.on('data', function(chunk) {
if (response_buffer) {
if (typeof (Buffer.concat) === 'function') {
response_buffer = Buffer.concat([response_buffer, chunk]);
} else {
var holder = new Buffer(response_buffer.length + chunk.length);
response_buffer.copy(holder);
chunk.copy(holder, response_buffer.length);
response_buffer = holder;
}
} else {
response_buffer = chunk;
}
});
response.on('end', function() {
if (typeof callback === 'function') {
console.log(response.headers['content-type']);
console.log(JSON.stringify(response.headers['content-type']));
if(response.headers['content-type'] !== 'undefined' && String(response.headers['content-type']).indexOf("application/json") > -1 ){
responseMessage.body = JSON.parse(response_buffer.toString('utf-8'));
}else{responseMessage.body = response_buffer;}
callback.call(null, responseMessage);
}
});
});
request.on('error', function(error) {
console.log("this is error " + error);
callback.call(null, responseMessage);
});
if (postData) {
if (Array.isArray(postData)) {
postData.forEach(function (part) {
request.write(part);
})
} else {
request.write(postData);
}
request.end();
} else {
request.end();
}
}
ApiClient.prototype.InvokeAPI = function(resourceURL, method, queryParams, postData, headerParams, files, callback){
resourceURL = resourceURL.replace("{appSid}", this.config.appSid);
var regex = new RegExp('\\{\\w*\\}', 'g');
resourceURL = resourceURL.replace(regex, "");
if(this.config.debug){console.log("resourceURL :: " + resourceURL);}
resourceURL = this.config.baseURI + resourceURL;
var signature = this.Sign(resourceURL, this.config.apiKey);
if(this.config.debug){console.log("signature :: " + signature);}
resourceURL = resourceURL + "&signature=" + signature;
if(this.config.debug){console.log("Final resourceURL :: " + method + " " + resourceURL);}
if(postData === null && Array.isArray(files) && files.length > 1 ){
return this.InvokeMultiPartBody(resourceURL, method, headerParams, files, callback)
}else{
return this.InvokeSimpleBody(resourceURL, method, postData, headerParams, callback)
}
}
module.exports = ApiClient;