podchat
Version:
Javascript SDK to use POD's Chat Service
357 lines (346 loc) • 12.2 kB
JavaScript
;
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 _utility = _interopRequireDefault(require("../../utility/utility"));
var _dataFormatters = require("../helpers/dataFormatters");
function MessageQueues(app) {
function putInMessagesDeliveryQueue(threadId, messageId) {
if (app.sdkParams.messagesDelivery.hasOwnProperty(threadId) && typeof app.sdkParams.messagesDelivery[threadId] === 'number' && !!app.sdkParams.messagesDelivery[threadId]) {
if (app.sdkParams.messagesDelivery[threadId] < messageId) {
app.sdkParams.messagesDelivery[threadId] = messageId;
}
} else {
app.sdkParams.messagesDelivery[threadId] = messageId;
}
}
function putInMessagesSeenQueue(threadId, messageId) {
if (app.sdkParams.messagesSeen.hasOwnProperty(threadId) && typeof app.sdkParams.messagesSeen[threadId] === 'number' && !!app.sdkParams.messagesSeen[threadId]) {
if (app.sdkParams.messagesSeen[threadId] < messageId) {
app.sdkParams.messagesSeen[threadId] = messageId;
}
} else {
app.sdkParams.messagesSeen[threadId] = messageId;
}
}
/**
* Get Chat Wait Queue
*
* This function checks if cache is enbled on client's
* machine, and if it is, retrieves WaitQueue from
* cache. Otherwise returns WaitQueue from RAM
* After getting failed messages from cache or RAM
* we should check them with server to be sure if
* they have been sent already or not?
*
* @access private
*
* @return {array} An array of messages on Wait Queue
*/
function getChatWaitQueue(threadId, active, callback) {
callback && callback([]);
// if (active && threadId > 0) {
// var uniqueIds = [],
// queueToBeSent = [];
//
// for (var i = 0; i < chatWaitQueue.length; i++) {
// if (chatWaitQueue[i].subjectId == threadId) {
// queueToBeSent.push(chatWaitQueue[i]);
// uniqueIds.push(chatWaitQueue[i].uniqueId);
// }
// }
//
// if (uniqueIds.length) {
// app.messenger.sendMessage({
// chatMessageVOType: chatMessageVOTypes.GET_HISTORY,
// content: {
// uniqueIds: uniqueIds
// },
// subjectId: threadId
// }, {
// onResult: function (result) {
// if (!result.hasError) {
// var messageContent = result.result;
//
// for (var i = 0; i < messageContent.length; i++) {
// for (var j = 0; j < uniqueIds.length; j++) {
// if (uniqueIds[j] === messageContent[i].uniqueId) {
// uniqueIds.splice(j, 1);
// queueToBeSent.splice(j, 1);
// }
// }
// }
// }
// }
// });
// callback && callback([]);
// } else {
// callback && callback([]);
// }
// } else {
// callback && callback([]);
// }
}
/**
* Get Chat Upload Queue
*
* This function checks if cache is enabled on client's
* machine, and if it is, retrieves uploadQueue from
* cache. Otherwise returns uploadQueue from RAM
*
* @access private
*
* @return {array} An array of messages on uploadQueue
*/
function getChatUploadQueue(threadId, callback) {
var uploadQ = [];
for (var i = 0; i < app.store.chatUploadQueue.length; i++) {
if (parseInt(app.store.chatUploadQueue[i].message.subjectId) === threadId) {
uploadQ.push(app.store.chatUploadQueue[i]);
}
}
callback && callback(uploadQ);
}
/**
* Delete an Item from Chat Send Queue
*
* This function gets an item and deletes it
* from Chat Send Queue
*
* @access private
*
* @return {undefined}
*/
function deleteFromChatSentQueue(item, callback) {
for (var i = 0; i < app.store.chatSendQueue.length; i++) {
if (app.store.chatSendQueue[i].message.uniqueId === item.message.uniqueId) {
app.store.chatSendQueue.splice(i, 1);
}
}
callback && callback();
}
/**
* Delete an Item from Chat Wait Queue
*
* This function gets an item and deletes it
* from Chat Wait Queue, from either cached
* queue or the queue on RAM memory
*
* @access private
*
* @return {undefined}
*/
function deleteFromChatWaitQueue(item, callback) {
for (var i = 0; i < app.store.chatWaitQueue.length; i++) {
if (app.store.chatWaitQueue[i].uniqueId === item.uniqueId) {
app.store.chatWaitQueue.splice(i, 1);
}
}
callback && callback();
}
/**
* Delete an Item from Chat Upload Queue
*
* This function gets an item and deletes it
* from Chat Upload Queue
*
* @access private
*
* @return {undefined}
*/
function deleteFromChatUploadQueue(item, callback) {
for (var i = 0; i < app.store.chatUploadQueue.length; i++) {
if (app.store.chatUploadQueue[i].message.uniqueId === item.message.uniqueId) {
app.store.chatUploadQueue.splice(i, 1);
}
}
callback && callback();
}
function deleteThreadFailedMessagesFromWaitQueue(threadId, callback) {
for (var i = 0; i < app.store.chatWaitQueue.length; i++) {
if (app.store.chatWaitQueue[i].uniqueId === item.uniqueId) {
app.store.chatWaitQueue.splice(i, 1);
}
}
callback && callback();
}
/**
* Push Message Into Send Queue
*
* This functions takes a message and puts it
* into chat's send queue
*
* @access private
*
* @param {object} params The Message and its callbacks to be enqueued
*
* @return {undefined}
*/
function putInChatSendQueue(params, callback, skip) {
app.store.chatSendQueue.push(params);
if (!skip) {
var time = new Date().getTime();
params.message.time = time;
params.message.timeNanos = time % 1000 * 1000000;
putInChatWaitQueue(params.message, function () {
callback && callback();
});
} else {
callback && callback();
}
}
/**
* Put an Item inside Chat Wait Queue
*
* This function takes an item and puts it
* inside Chat Wait Queue, either on cached
* wait queue or the wait queue on RAM memory
*
* @access private
*
* @return {undefined}
*/
function putInChatWaitQueue(item, callback) {
if (item.uniqueId !== '') {
var waitQueueUniqueId = typeof item.uniqueId == 'string' ? item.uniqueId : Array.isArray(item.uniqueId) ? item.uniqueId[0] : null;
if (waitQueueUniqueId != null) {
app.sdkParams.consoleLogging && console.log('Forced to use in memory cache');
item.uniqueId = waitQueueUniqueId;
app.store.chatWaitQueue.push(item);
callback && callback();
}
}
}
function getItemFromChatWaitQueue(uniqueId, callback) {
for (var i = 0; i < app.store.chatWaitQueue.length; i++) {
if (app.store.chatWaitQueue[i].uniqueId === uniqueId) {
var decryptedEnqueuedMessage = app.store.chatWaitQueue[i];
var time = new Date().getTime();
var message = (0, _dataFormatters.formatDataToMakeMessage)(decryptedEnqueuedMessage.threadId, {
uniqueId: decryptedEnqueuedMessage.uniqueId,
ownerId: app.store.user.get().id,
message: decryptedEnqueuedMessage.content,
metadata: decryptedEnqueuedMessage.metadata,
systemMetadata: decryptedEnqueuedMessage.systemMetadata,
replyInfo: decryptedEnqueuedMessage.replyInfo,
forwardInfo: decryptedEnqueuedMessage.forwardInfo,
participant: app.store.user.get(),
time: time,
timeNanos: time % 1000 * 1000000
});
callback && callback(message);
break;
}
}
}
/**
* Put an Item inside Chat Upload Queue
*
* This function takes an item and puts it
* inside Chat upload Queue
*
* @access private
*
* @return {undefined}
*/
function putInChatUploadQueue(params, callback) {
app.store.chatUploadQueue.push(params);
callback && callback();
}
/**
* Transfer an Item from uploadQueue to sendQueue
*
* This function takes an uniqueId, finds that item
* inside uploadQ. takes it's uploaded metadata and
* attaches them to the message. Finally removes item
* from uploadQueue and pushes it inside sendQueue
*
* @access private
*
* @return {undefined}
*/
function transferFromUploadQToSendQ(threadId, uniqueId, metadata, callback) {
app.messageQueues.getChatUploadQueue(threadId, function (uploadQueue) {
for (var i = 0; i < uploadQueue.length; i++) {
if (uploadQueue[i].message.uniqueId == uniqueId) {
try {
var message = uploadQueue[i].message,
callbacks = uploadQueue[i].callbacks;
var oldMetadata = JSON.parse(message.metadata),
newMetadata = JSON.parse(metadata);
var finalMetaData = _utility["default"].objectDeepMerger(newMetadata, oldMetadata);
if (message && (0, _typeof2["default"])(message.content) === 'object' && typeof message.content.message !== 'undefined') {
message.content.message['metadata'] = JSON.stringify(finalMetaData);
}
if (message && (0, _typeof2["default"])(message.content) === 'object' && typeof message.content.metadata !== 'undefined') {
message.content['metadata'] = JSON.stringify(finalMetaData);
}
if (message.chatMessageVOType == 21) {
app.fileMethods.getImageDownloadLinkFromPodspace({
hashCode: finalMetaData.fileHash
}, function (result) {
if (!result.hasError) {
message.content.image = result.downloadUrl;
}
});
}
message.metadata = JSON.stringify(finalMetaData);
} catch (e) {
console.log(e);
}
app.messageQueues.deleteFromChatUploadQueue(uploadQueue[i], function () {
putInChatSendQueue({
message: message,
callbacks: callbacks
}, function () {
callback && callback();
});
});
break;
}
}
});
}
/**
* Get Chat Send Queue
*
* This function returns chat send queue
*
* @access private
*
* @return {array} An array of messages on sendQueue
*/
function getChatSendQueue(threadId, callback) {
if (threadId) {
var tempSendQueue = [];
for (var i = 0; i < app.store.chatSendQueue.length; i++) {
if (app.store.chatSendQueue[i].threadId === threadId) {
tempSendQueue.push(app.store.chatSendQueue[i]);
}
}
callback && callback(tempSendQueue);
} else {
callback && callback(app.store.chatSendQueue);
}
}
return {
putInMessagesDeliveryQueue: putInMessagesDeliveryQueue,
putInMessagesSeenQueue: putInMessagesSeenQueue,
putInChatSendQueue: putInChatSendQueue,
putInChatUploadQueue: putInChatUploadQueue,
getChatWaitQueue: getChatWaitQueue,
deleteFromChatUploadQueue: deleteFromChatUploadQueue,
deleteFromChatSentQueue: deleteFromChatSentQueue,
deleteFromChatWaitQueue: deleteFromChatWaitQueue,
deleteThreadFailedMessagesFromWaitQueue: deleteThreadFailedMessagesFromWaitQueue,
getChatUploadQueue: getChatUploadQueue,
getChatSendQueue: getChatSendQueue,
getItemFromChatWaitQueue: getItemFromChatWaitQueue,
transferFromUploadQToSendQ: transferFromUploadQToSendQ
};
}
var _default = MessageQueues;
exports["default"] = _default;