UNPKG

podchat

Version:
534 lines (532 loc) 20.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _constants = require("../constants"); var _formData = _interopRequireDefault(require("form-data")); var _querystring = _interopRequireDefault(require("querystring")); var _request = _interopRequireDefault(require("request")); var _utility = _interopRequireDefault(require("../../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: _constants.CHAT_ERRORS[6201] }); return; } if (_utility["default"].isNode() && _request["default"]) { 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["default"].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: _constants.CHAT_ERRORS[6200] + ' (Request Error)', errorEvent: error }); callback && callback({ hasError: true, errorCode: 6200, errorMessage: _constants.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: _constants.CHAT_ERRORS[6303] }); callback({ hasError: true, errorCode: 6303, errorMessage: _constants.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["default"].stringify(data); } _request["default"].post({ url: url, body: data, 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: _constants.CHAT_ERRORS[6200] + ' (Request Error)', errorEvent: error }); } }); } } else if (params.method == 'GET') { if ((0, _typeof2["default"])(data) === 'object') { data = _querystring["default"].stringify(data); url += '?' + data; } else if (typeof data === 'string') { url += '?' + data; } _request["default"].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: _constants.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 && (0, _typeof2["default"])(data) === 'object' && (data.hasOwnProperty('image') || data.hasOwnProperty('file'))) { app.store.httpRequestObject[eval('fileUploadUniqueId')].timeout = settings && (0, _typeof2["default"])(parseInt(settings.timeout)) > 0 && settings.timeout > 0 ? settings.timeout : app.sdkParams.httpUploadRequestTimeout; } else { app.store.httpRequestObject[eval('fileUploadUniqueId')].timeout = settings && (0, _typeof2["default"])(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: _constants.CHAT_ERRORS[6200] + ' (XMLHttpRequest Error Event Listener)' }); } callback({ hasError: true, errorCode: 6200, errorMessage: _constants.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: _constants.CHAT_ERRORS[6303] }); } callback({ hasError: true, errorCode: 6303, errorMessage: _constants.CHAT_ERRORS[6303] }); } }, false); try { if (method == 'GET') { if ((0, _typeof2["default"])(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 ((0, _typeof2["default"])(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 ((0, _typeof2["default"])(params.headers) === 'object') { for (var key in params.headers) { app.store.httpRequestObject[eval('fileUploadUniqueId')].setRequestHeader(key, params.headers[key]); } } if ((0, _typeof2["default"])(data) == 'object') { if (data.hasOwnProperty('image') || data.hasOwnProperty('file')) { hasFile = true; var formData = new _formData["default"](); 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); var 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: _constants.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: _constants.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: httpRequest, cancelFileUpload: cancelFileUpload, cancelFileDownload: cancelFileDownload }; } var _default = HTTPRequestsManager; exports["default"] = _default;