UNPKG

podchat-browser

Version:

Javascript SDK to use POD's Chat Service - Browser Only

362 lines (326 loc) 16 kB
import {CHAT_ERRORS} from "../constants"; function HTTPRequestsManager(app) { function cancelFileDownload(params, callback) { if (params) { if (typeof params.uniqueId == 'string') { var uniqueId = params.uniqueId; if(app.store.resumableRequestsObject[params.uniqueId]) { app.store.resumableRequestsObject[params.uniqueId].abort(); } else { 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.uploads.abort(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', hasError = false; if (!url) { callback({ hasError: true, errorCode: 6201, errorMessage: CHAT_ERRORS[6201] }); return; } var hasFile = false; app.store.httpRequestObject[eval('fileUploadUniqueId')] = new XMLHttpRequest(); var 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.uploadTimeout) > 0 && settings.uploadTimeout > 0) ? settings.uploadTimeout : app.sdkParams.httpUploadRequestTimeout; } else { app.store.httpRequestObject[eval('fileUploadUniqueId')].timeout = (settings && typeof parseInt(settings.timeout) > 0 && settings.timeout > 0) ? settings.timeout : app.sdkParams.httpRequestTimeout; } app.store.httpRequestObject[eval('fileUploadUniqueId')] .addEventListener('error', function (event) { if (callback && method === 'POST') { 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)' }); } else { if (callback) { callback({ hasError: true, errorCode: 6200, errorMessage: CHAT_ERRORS[6200] + ' (XMLHttpRequest Error Event Listener)' }); } if (params.enableDownloadProgressEvents) { app.chatEvents.fireEvent('fileDownloadEvents', { hashCode: params.hashCode, state: 'DOWNLOAD_ERROR', errorCode: 6200, errorMessage: CHAT_ERRORS[6200] + ' (XMLHttpRequest Error Event Listener)' }); } } }, false); if (params.enableDownloadProgressEvents) { app.store.httpRequestObject[eval('fileUploadUniqueId')].onprogress = (event) => { app.chatEvents.fireEvent('fileDownloadEvents', { hashCode: params.hashCode, state: 'DOWNLOADING', progress: Math.round((event.loaded / event.total) * 100), }); } } 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') { url += '?' + data; } app.store.httpRequestObject[eval('fileUploadUniqueId')].open(method, url, true); if (typeof params.headers === 'object') { for (var key in params.headers) { if (params.headers.hasOwnProperty(key)) app.store.httpRequestObject[eval('fileUploadUniqueId')].setRequestHeader(key, params.headers[key]); } } 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) { if (params.headers.hasOwnProperty(key)) app.store.httpRequestObject[eval('fileUploadUniqueId')].setRequestHeader(key, params.headers[key]); } } if(reqBody) { let data = reqBody; app.store.httpRequestObject[eval('fileUploadUniqueId')].send(data); } else if (typeof data == 'object') { if (data.hasOwnProperty('image') || data.hasOwnProperty('file')) { hasFile = true; var formData = new FormData(); for (var key in data) { if (data.hasOwnProperty(key)) 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) { 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); if (keys.length > 0) { var 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; var fileHashCode = ''; try { var fileUploadResult = JSON.parse(app.store.httpRequestObject[eval('fileUploadUniqueId')].response); if (!!fileUploadResult && fileUploadResult.hasOwnProperty('result')) { fileHashCode = fileUploadResult.result.hashCode; } } catch (e) { app.sdkParams.consoleLogging && console.log(e) } app.chatEvents.fireEvent('fileUploadEvents', { threadId: threadId, uniqueId: fileUniqueId, fileHash: fileHashCode, 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(), responseContentType: app.store.httpRequestObject[eval('fileUploadUniqueId')].getResponseHeader('content-type') } }); } 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 : 'ُAn error accoured!', errorCode: app.store.httpRequestObject[eval('fileUploadUniqueId')].status }); } } }; } return { httpRequest, cancelFileUpload, cancelFileDownload } } export default HTTPRequestsManager