UNPKG

podchat

Version:
585 lines (540 loc) 27.7 kB
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