From f4e9bc655a9caac6da74173e5b83bedd772fed75 Mon Sep 17 00:00:00 2001 From: Mikunj Date: Fri, 1 Feb 2019 11:27:31 +1100 Subject: [PATCH] Hooked up LokiP2pAPI with online stuff. --- js/conversation_controller.js | 23 +++++++++++++++++++++-- js/models/conversations.js | 10 +++------- js/modules/data.js | 12 +++++++++--- js/modules/loki_p2p_api.js | 4 ++++ 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/js/conversation_controller.js b/js/conversation_controller.js index 8decd5151..dd123f2c2 100644 --- a/js/conversation_controller.js +++ b/js/conversation_controller.js @@ -1,4 +1,4 @@ -/* global _, Whisper, Backbone, storage */ +/* global _, Whisper, Backbone, storage, lokiP2pAPI */ /* eslint-disable more/no-then */ @@ -248,6 +248,13 @@ async load() { window.log.info('ConversationController: starting initial fetch'); + // We setup online and offline listeners here because we want + // to minimize the amount of listeners we have to avoid memory leaks + if (!this.p2pListenersSet) { + lokiP2pAPI.on('online', this._handleOnline.bind(this)); + lokiP2pAPI.on('offline', this._handleOffline.bind(this)); + } + if (conversations.length) { throw new Error('ConversationController: Already loaded!'); } @@ -263,12 +270,12 @@ this._initialFetchComplete = true; const promises = []; conversations.forEach(conversation => { + // TODO This needs to be synchronous (one after the other) promises.concat([ conversation.updateLastMessage(), conversation.updateProfile(), conversation.updateProfileAvatar(), conversation.resetPendingSend(), - conversation.updateProfile(), ]); }); await Promise.all(promises); @@ -292,5 +299,17 @@ return this._initialPromise; }, + _handleOnline(pubKey) { + try { + const conversation = this.get(pubKey); + conversation.set({ isOnline: true }); + } catch (e) {} // eslint-disable-line + }, + _handleOffline(pubKey) { + try { + const conversation = this.get(pubKey); + conversation.set({ isOnline: false }); + } catch (e) {} // eslint-disable-line + }, }; })(); diff --git a/js/models/conversations.js b/js/models/conversations.js index 198e75de8..fe291c98c 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -156,6 +156,9 @@ this.setFriendRequestExpiryTimeout(); this.typingRefreshTimer = null; this.typingPauseTimer = null; + + // Online status handling + this.set({ isOnline: lokiP2pAPI.isOnline(this.id) }); }, isMe() { @@ -253,13 +256,6 @@ ); }, - async setIsOnline(online) { - this.set({ isOnline: online }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); - }, - async cleanup() { await window.Signal.Types.Conversation.deleteExternalFiles( this.attributes, diff --git a/js/modules/data.js b/js/modules/data.js index d4e2fb58e..1a46ba568 100644 --- a/js/modules/data.js +++ b/js/modules/data.js @@ -11,6 +11,7 @@ const { map, merge, set, + omit, } = require('lodash'); const { base64ToArrayBuffer, arrayBufferToBase64 } = require('./crypto'); @@ -688,11 +689,13 @@ async function getConversationCount() { } async function saveConversation(data) { - await channels.saveConversation(data); + const cleaned = omit(data, 'isOnine'); + await channels.saveConversation(cleaned); } async function saveConversations(data) { - await channels.saveConversations(data); + const cleaned = data.map(d => omit(d, 'isOnline')); + await channels.saveConversations(cleaned); } async function getConversationById(id, { Conversation }) { @@ -712,7 +715,10 @@ async function updateConversation(id, data, { Conversation }) { if (merged.swarmNodes instanceof Set) { merged.swarmNodes = Array.from(merged.swarmNodes); } - await channels.updateConversation(merged); + + // Don't save the online status of the object + const cleaned = omit(merged, 'isOnline'); + await channels.updateConversation(cleaned); } async function removeConversation(id, { Conversation }) { diff --git a/js/modules/loki_p2p_api.js b/js/modules/loki_p2p_api.js index 598a7d0a4..ca8a13597 100644 --- a/js/modules/loki_p2p_api.js +++ b/js/modules/loki_p2p_api.js @@ -66,6 +66,10 @@ class LokiP2pAPI extends EventEmitter { ); } + isOnline(pubKey) { + return !!(this.contactP2pDetails[pubKey] && this.contactP2pDetails[pubKey].isOnline); + } + pingContact(pubKey) { if (!this.contactP2pDetails[pubKey]) { return;