podchat
Version:
Javascript SDK to use POD's Chat Service
534 lines (532 loc) • 20.7 kB
JavaScript
"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;