podchat
Version:
Javascript SDK to use POD's Chat Service
585 lines (540 loc) • 27.7 kB
JavaScript
import {CHAT_ERRORS} from "../constants";
import FormData from "form-data";
import QueryString from 'querystring';
import Request from 'request';
import Utility from "../../utility/utility";
function HTTPRequestsManager(app) {
function cancelFileDownload(params, callback) {
if (params) {
if (typeof params.uniqueId == 'string') {
var uniqueId = params.uniqueId;
app.store.httpRequestObject[eval('uniqueId')] && app.store.httpRequestObject[eval('uniqueId')].abort();
app.store.httpRequestObject[eval('uniqueId')] && delete (app.store.httpRequestObject[eval('uniqueId')]);
callback && callback(uniqueId);
}
}
}
function cancelFileUpload(params, callback) {
if (params) {
if (typeof params.uniqueId == 'string') {
var uniqueId = params.uniqueId;
app.store.httpRequestObject[eval('uniqueId')] && app.store.httpRequestObject[eval('uniqueId')].abort();
app.store.httpRequestObject[eval('uniqueId')] && delete (app.store.httpRequestObject[eval('uniqueId')]);
app.messageQueues.deleteFromChatUploadQueue({
message: {
uniqueId: uniqueId
}
}, callback);
}
}
}
/**
* HTTP Request class
*
* Manages all HTTP Requests
*
* @access private
*
* @param {object} params Given parameters including (Headers, ...)
* @param {function} callback The callback function to run after
*
* @return {undefined}
*/
function httpRequest (params, callback) {
var url = params.url,
xhrResponseType = params.responseType || 'text',
fileSize,
originalFileName,
threadId,
fileUniqueId,
fileObject,
reqBody = params.body,
data = params.data,
method = (typeof params.method == 'string')
? params.method
: 'GET',
fileUploadUniqueId = (typeof params.uniqueId == 'string')
? params.uniqueId
: 'uniqueId',
settings,
hasError = false;
if (!url) {
callback({
hasError: true,
errorCode: 6201,
errorMessage: CHAT_ERRORS[6201]
});
return;
}
if (Utility.isNode() && Request) {
var headers = params.headers;
if (params.method == 'POST' && data) {
if (data.hasOwnProperty('image') || data.hasOwnProperty('file')) {
headers['Content-Type'] = 'multipart/form-data';
var postFormData = {};
for (var i in data) {
if (i == 'image' || i == 'file') {
fileSize = data.fileSize;
originalFileName = data.originalFileName;
threadId = data.threadId;
fileUniqueId = data.uniqueId;
fileObject = data[i];
postFormData[i] = app.fs.createReadStream(data[i]);
} else {
postFormData[i] = data[i];
}
}
var r = app.store.httpRequestObject[eval('fileUploadUniqueId')] = Request.post({
url: url,
formData: postFormData,
headers: headers
}, function (error, response, body) {
if (!error) {
if (response.statusCode == 200) {
var body = JSON.parse(body);
if (typeof body.hasError !== 'undefined' && body.hasError) {
hasError = true;
app.chatEvents.fireEvent('fileUploadEvents', {
threadId: threadId,
uniqueId: fileUniqueId,
state: 'UPLOAD_ERROR',
progress: 0,
fileInfo: {
fileName: originalFileName,
fileSize: fileSize
},
fileObject: params.file,
errorCode: body.errorCode,
errorMessage: body.message,
errorEvent: body
});
callback && callback({
hasError: true,
errorCode: body.errorCode,
errorMessage: body.message,
errorEvent: body
});
} else {
hasError = false;
app.chatEvents.fireEvent('fileUploadEvents', {
threadId: threadId,
uniqueId: fileUniqueId,
state: 'UPLOADED',
progress: 100,
fileInfo: {
fileName: originalFileName,
fileSize: fileSize
},
fileObject: params.file
});
callback && callback({
hasError: false,
cache: false,
result: {
responseText: body
}
});
}
} else {
hasError = true;
app.chatEvents.fireEvent('fileUploadEvents', {
threadId: threadId,
uniqueId: fileUniqueId,
state: 'UPLOAD_ERROR',
progress: 0,
fileInfo: {
fileName: originalFileName,
fileSize: fileSize
},
fileObject: params.file,
errorCode: response.statusCode,
errorMessage: body
});
callback && callback({
hasError: true,
errorCode: response.statusCode,
errorMessage: body
});
}
} else {
hasError = true;
app.chatEvents.fireEvent('fileUploadEvents', {
threadId: threadId,
uniqueId: fileUniqueId,
state: 'UPLOAD_ERROR',
progress: 0,
fileInfo: {
fileName: originalFileName,
fileSize: fileSize
},
fileObject: params.file,
errorCode: 6200,
errorMessage: CHAT_ERRORS[6200] + ' (Request Error)',
errorEvent: error
});
callback && callback({
hasError: true,
errorCode: 6200,
errorMessage: CHAT_ERRORS[6200] + ' (Request Error)',
errorEvent: error
});
}
})
.on('abort', function () {
hasError = true;
app.chatEvents.fireEvent('fileUploadEvents', {
threadId: threadId,
uniqueId: fileUniqueId,
state: 'UPLOAD_CANCELED',
progress: 0,
fileInfo: {
fileName: originalFileName,
fileSize: fileSize
},
fileObject: fileObject,
errorCode: 6303,
errorMessage: CHAT_ERRORS[6303]
});
callback({
hasError: true,
errorCode: 6303,
errorMessage: CHAT_ERRORS[6303]
});
});
var oldPercent = 0;
var q = setInterval(function () {
if (r.req && r.req.connection) {
var dispatched = r.req.connection._bytesDispatched;
var percent = Math.round(dispatched * 100 / fileSize);
if (percent < 100 && !hasError) {
oldPercent = percent;
app.chatEvents.fireEvent('fileUploadEvents', {
threadId: threadId,
uniqueId: fileUniqueId,
state: 'UPLOADING',
progress: percent,
fileInfo: {
fileName: originalFileName,
fileSize: fileSize
},
fileObject: params.file
});
} else {
clearInterval(q);
}
}
}, 10);
} else {
headers['Content-Type'] = 'application/x-www-form-urlencoded';
if(reqBody) {
data = reqBody.toString();
} else {
data = QueryString.stringify(data);
}
Request.post({
url,
body: data,
headers
}, function (error, response, body) {
if (!error) {
if (response.statusCode == 200) {
callback && callback({
hasError: false,
cache: false,
result: {
responseText: body
}
});
} else {
callback && callback({
hasError: true,
errorCode: response.statusCode,
errorMessage: body
});
}
} else {
callback && callback({
hasError: true,
errorCode: 6200,
errorMessage: CHAT_ERRORS[6200] + ' (Request Error)',
errorEvent: error
});
}
});
}
} else if (params.method == 'GET') {
if (typeof data === 'object') {
data = QueryString.stringify(data);
url += '?' + data;
} else if (typeof data === 'string') {
url += '?' + data;
}
Request.get({
url: url,
headers: headers
}, function (error, response, body) {
if (!error) {
if (response.statusCode == 200) {
callback && callback({
hasError: false,
cache: false,
result: {
responseText: body
}
});
} else {
callback && callback({
hasError: true,
errorCode: response.statusCode,
errorMessage: body
});
}
} else {
callback && callback({
hasError: true,
errorCode: 6200,
errorMessage: CHAT_ERRORS[6200] + ' (Request Error)',
errorEvent: error
});
}
});
}
} else {
var hasFile = false;
app.store.httpRequestObject[eval('fileUploadUniqueId')] = new XMLHttpRequest(),
settings = params.settings;
app.store.httpRequestObject[eval('fileUploadUniqueId')].responseType = xhrResponseType;
if (data && typeof data === 'object' && (data.hasOwnProperty('image') || data.hasOwnProperty('file'))) {
app.store.httpRequestObject[eval('fileUploadUniqueId')].timeout = (settings && typeof parseInt(settings.timeout) > 0 && settings.timeout > 0)
? settings.timeout
: app.sdkParams.httpUploadRequestTimeout;
} else {
app.store.httpRequestObject[eval('fileUploadUniqueId')].timeout = (settings && typeof parseInt(settings.uploadTimeout) > 0 && settings.uploadTimeout > 0)
? settings.uploadTimeout
: app.sdkParams.httpRequestTimeout;
}
app.store.httpRequestObject[eval('fileUploadUniqueId')]
.addEventListener('error', function (event) {
if (callback) {
if (hasFile) {
hasError = true;
app.chatEvents.fireEvent('fileUploadEvents', {
threadId: threadId,
uniqueId: fileUniqueId,
state: 'UPLOAD_ERROR',
progress: 0,
fileInfo: {
fileName: originalFileName,
fileSize: fileSize
},
fileObject: fileObject,
errorCode: 6200,
errorMessage: CHAT_ERRORS[6200] + ' (XMLHttpRequest Error Event Listener)'
});
}
callback({
hasError: true,
errorCode: 6200,
errorMessage: CHAT_ERRORS[6200] + ' (XMLHttpRequest Error Event Listener)'
});
}
}, false);
app.store.httpRequestObject[eval('fileUploadUniqueId')].addEventListener('abort',
function (event) {
if (callback) {
if (hasFile) {
hasError = true;
app.chatEvents.fireEvent('fileUploadEvents', {
threadId: threadId,
uniqueId: fileUniqueId,
state: 'UPLOAD_CANCELED',
progress: 0,
fileInfo: {
fileName: originalFileName,
fileSize: fileSize
},
fileObject: fileObject,
errorCode: 6303,
errorMessage: CHAT_ERRORS[6303]
});
}
callback({
hasError: true,
errorCode: 6303,
errorMessage: CHAT_ERRORS[6303]
});
}
}, false);
try {
if (method == 'GET') {
if (typeof data === 'object' && data !== null) {
var keys = Object.keys(data);
if (keys.length > 0) {
url += '?';
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
url += key + '=' + data[key];
if (i < keys.length - 1) {
url += '&';
}
}
}
} else if (typeof data === 'string' && data !== null) {
url += '?' + data;
}
app.store.httpRequestObject[eval('fileUploadUniqueId')].open(method, url, true);
if (typeof params.headers === 'object') {
for (var key in params.headers) {
app.store.httpRequestObject[eval('fileUploadUniqueId')].setRequestHeader(key, params.headers[key]);
}
}
app.store.httpRequestObject[eval('fileUploadUniqueId')].onprogress = function (event) {
if (event.lengthComputable && !hasError) {
// console.log('total bytes', event.total);
// console.log('loaded bytes', event.loaded);
app.chatEvents.fireEvent('fileDownloadEvents', {
threadId: threadId,
uniqueId: fileUniqueId,
state: 'DOWNLOADING',
progress: Math.round((event.loaded / event.total) * 100),
fileInfo: {
fileName: originalFileName,
fileSize: fileSize
},
fileObject: fileObject
});
}
};
app.store.httpRequestObject[eval('fileUploadUniqueId')].send();
}
if (method === 'POST' && data) {
app.store.httpRequestObject[eval('fileUploadUniqueId')].open(method, url, true);
if (typeof params.headers === 'object') {
for (var key in params.headers) {
app.store.httpRequestObject[eval('fileUploadUniqueId')].setRequestHeader(key, params.headers[key]);
}
}
if (typeof data == 'object') {
if (data.hasOwnProperty('image') || data.hasOwnProperty('file')) {
hasFile = true;
var formData = new FormData();
for (var key in data) {
formData.append(key, data[key]);
}
fileSize = data.fileSize;
originalFileName = data.originalFileName;
threadId = data.threadId;
fileUniqueId = data.uniqueId;
fileObject = (data['image'])
? data['image']
: data['file'];
app.store.httpRequestObject[eval('fileUploadUniqueId')].upload.onprogress = function (event) {
if (event.lengthComputable && !hasError) {
// console.log('total bytes', event.total);
// console.log('loaded bytes', event.loaded);
app.chatEvents.fireEvent('fileUploadEvents', {
threadId: threadId,
uniqueId: fileUniqueId,
state: 'UPLOADING',
progress: Math.round((event.loaded / event.total) * 100),
fileInfo: {
fileName: originalFileName,
fileSize: fileSize
},
fileObject: fileObject
});
}
};
app.store.httpRequestObject[eval('fileUploadUniqueId')].send(formData);
} else {
app.store.httpRequestObject[eval('fileUploadUniqueId')].setRequestHeader(
'Content-Type',
'application/x-www-form-urlencoded');
var keys = Object.keys(data);
let sendData
if (keys.length > 0) {
sendData = '';
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
sendData += key + '=' + data[key];
if (i < keys.length - 1) {
sendData += '&';
}
}
}
app.store.httpRequestObject[eval('fileUploadUniqueId')].send(sendData);
}
} else {
app.store.httpRequestObject[eval('fileUploadUniqueId')].send(data);
}
}
} catch (e) {
callback && callback({
hasError: true,
cache: false,
errorCode: 6200,
errorMessage: CHAT_ERRORS[6200] + ' (Request Catch Error)' + e
});
}
app.store.httpRequestObject[eval('fileUploadUniqueId')].onreadystatechange = function () {
if (app.store.httpRequestObject[eval('fileUploadUniqueId')].readyState == 4) {
if (app.store.httpRequestObject[eval('fileUploadUniqueId')].status == 200) {
if (hasFile) {
hasError = false;
app.chatEvents.fireEvent('fileUploadEvents', {
threadId: threadId,
uniqueId: fileUniqueId,
state: 'UPLOADED',
progress: 100,
fileInfo: {
fileName: originalFileName,
fileSize: fileSize
},
fileObject: fileObject
});
}
callback && callback({
hasError: false,
cache: false,
result: {
response: app.store.httpRequestObject[eval('fileUploadUniqueId')].response,
responseText: (xhrResponseType === 'text') ? app.store.httpRequestObject[eval('fileUploadUniqueId')].responseText : '',
responseHeaders: app.store.httpRequestObject[eval('fileUploadUniqueId')].getAllResponseHeaders()
}
});
} else {
if (hasFile) {
hasError = true;
app.chatEvents.fireEvent('fileUploadEvents', {
threadId: threadId,
uniqueId: fileUniqueId,
state: 'UPLOAD_ERROR',
progress: 0,
fileInfo: {
fileName: originalFileName,
fileSize: fileSize
},
fileObject: fileObject,
errorCode: 6200,
errorMessage: CHAT_ERRORS[6200] + ' (Request Status != 200)',
statusCode: app.store.httpRequestObject[eval('fileUploadUniqueId')].status
});
}
callback && callback({
hasError: true,
errorMessage: (xhrResponseType === 'text') ? app.store.httpRequestObject[eval('fileUploadUniqueId')].responseText : '',
errorCode: app.store.httpRequestObject[eval('fileUploadUniqueId')].status,
responseHeaders: app.store.httpRequestObject[eval('fileUploadUniqueId')].getAllResponseHeaders()
});
}
}
};
}
}
return {
httpRequest,
cancelFileUpload,
cancelFileDownload
}
}
export default HTTPRequestsManager