class ChatRoomComponent implements absSpartan.IChatServerListener { public chatMessages: Array = []; public serviceListener: (eventName: string, data: any) => void; public notifyEvent: (eventName: string, data: any) => void; private dataManager: DataManager; private main: Main; private serverImp: ChatServer.ServerImplemented; private chatRoomApi: ChatServer.ChatRoomApiProvider; private roomId: string; private messageDAL: MessageDAL; constructor(main: Main, room_id: string, messageDAL: MessageDAL) { this.main = main; this.serverImp = this.main.getServerImp(); this.chatRoomApi = this.main.getChatRoomApi(); this.dataManager = this.main.getDataManager(); this.roomId = room_id; this.messageDAL = messageDAL; console.log("constructor ChatRoomComponent"); } onChat(chatMessageImp: Message) { let self = this; if (this.roomId === chatMessageImp.rid) { let secure = new SecureService(); if (chatMessageImp.type.toString() === ContentType[ContentType.Text]) { if (self.serverImp.appConfig.encryption == true) { secure.decryptWithSecureRandom(chatMessageImp.body, (err, res) => { if (!err) { chatMessageImp.body = res; self.chatMessages.push(chatMessageImp); self.messageDAL.saveData(self.roomId, self.chatMessages); if (!!this.serviceListener) this.serviceListener(ChatServer.ServerEventListener.ON_CHAT, chatMessageImp); } else { console.log(err, res); self.chatMessages.push(chatMessageImp); self.messageDAL.saveData(self.roomId, self.chatMessages); if (!!this.serviceListener) this.serviceListener(ChatServer.ServerEventListener.ON_CHAT, chatMessageImp); } }) } else { self.chatMessages.push(chatMessageImp); self.messageDAL.saveData(self.roomId, self.chatMessages); if (!!this.serviceListener) this.serviceListener(ChatServer.ServerEventListener.ON_CHAT, chatMessageImp); } } else { self.chatMessages.push(chatMessageImp); self.messageDAL.saveData(self.roomId, self.chatMessages); if (!!this.serviceListener) this.serviceListener(ChatServer.ServerEventListener.ON_CHAT, chatMessageImp); } } else { console.log("this msg come from other room."); if (!!this.notifyEvent) { this.notifyEvent(ChatServer.ServerEventListener.ON_CHAT, chatMessageImp); } } } onLeaveRoom(data) { } onRoomJoin(data) { } onMessageRead(dataEvent) { console.log("onMessageRead", JSON.stringify(dataEvent)); let self = this; let newMsg: Message = JSON.parse(JSON.stringify(dataEvent)); let promise = new Promise(function (resolve, reject) { self.chatMessages.some(function callback(value) { if (value._id === newMsg._id) { value.readers = newMsg.readers; if (!!self.serviceListener) self.serviceListener(ChatServer.ServerEventListener.ON_MESSAGE_READ, null); resolve(); return true; } }); }).then((value) => { self.messageDAL.saveData(self.roomId, self.chatMessages); }); } onGetMessagesReaders(dataEvent) { console.log('onGetMessagesReaders', dataEvent); let self = this; interface Ireaders { _id: string; readers: Array; } let myMessagesArr: Array = JSON.parse(JSON.stringify(dataEvent.data)); self.chatMessages.forEach((originalMsg, id, arr) => { if (self.dataManager.isMySelf(originalMsg.sender)) { myMessagesArr.some((myMsg, index, array) => { if (originalMsg._id === myMsg._id) { originalMsg.readers = myMsg.readers; return true; } }); } }); self.messageDAL.saveData(self.roomId, self.chatMessages); } public getPersistentMessage(rid: string, done: (err, messages) => void) { var self = this; self.messageDAL.getData(rid, (err, messages) => { if (messages !== null) { let chats = messages.slice(0); async.mapSeries(chats, function iterator(item, result) { if (item.type === ContentType.Text) { if (self.serverImp.appConfig.encryption == true) { self.main.decodeService(item.body, function (err, res) { if (!err) { item.body = res; self.chatMessages.push(item); } else { self.chatMessages.push(item); } result(null, item); }); } else { self.chatMessages.push(item); result(null, item); } } else { self.chatMessages.push(item); result(null, item); } }, (err, results) => { console.log("decode chats text completed.", self.chatMessages.length); done(err, messages); }); } else { self.chatMessages = []; console.debug("chatMessages", self.chatMessages.length); done(err, messages); } }); } public getNewerMessageRecord(callback: (err, res) => void) { let self = this; let lastMessageTime = new Date(); new Promise(function promise(resolve, reject) { if (self.chatMessages[self.chatMessages.length - 1] != null) { lastMessageTime = self.chatMessages[self.chatMessages.length - 1].createTime; resolve(); } else { var roomAccess = self.dataManager.getRoomAccess(); async.some(roomAccess, (item, cb) => { if (item.roomId === self.roomId) { lastMessageTime = item.accessTime; cb(null, true); } else cb(null, false); }, (result) => { console.log(result); if (result) { resolve(); } else { reject(); } }); } }) .then((value) => { self.getNewerMessageFromNet(lastMessageTime, callback); }) .catch((err) => { console.warn("this room_id is not contain in roomAccess list."); self.getNewerMessageFromNet(lastMessageTime, callback); }); } private getNewerMessageFromNet(lastMessageTime: Date, callback: (err, res) => void) { var self = this; self.chatRoomApi.getChatHistory(self.roomId, lastMessageTime, function (err, result) { var histories = []; if (result.code === 200) { histories = result.data; console.log("Newer message counts.", histories.length); if (histories.length > 0) { var messages: Array = JSON.parse(JSON.stringify(histories)); async.mapSeries(messages, function (item, cb) { if (item.type.toString() === ContentType[ContentType.Text]) { if (self.serverImp.appConfig.encryption == true) { self.main.decodeService(item.body, function (err, res) { if (!err) { item.body = res; self.chatMessages.push(item); } else { self.chatMessages.push(item); } cb(null, item); }); } else { self.chatMessages.push(item); cb(null, item); } } else { self.chatMessages.push(item); cb(null, item); } }, function done(err) { if (!err) { console.log("get newer message completed."); } else { console.error('get newer message error', err); } console.debug("chatMessage.Count", self.chatMessages.length); //