Renamed lokiSnodeAPI to start with lower case for consistency, refactor snode API to use conversation controller

pull/187/head
Beaudan 7 years ago
parent 1a810f4e4f
commit 5d823de6f9

@ -185,7 +185,6 @@
await window.Signal.Data.saveConversation(conversation.attributes, { await window.Signal.Data.saveConversation(conversation.attributes, {
Conversation: Whisper.Conversation, Conversation: Whisper.Conversation,
}); });
window.LokiSnodeAPI.refreshSwarmNodesForPubKey(id);
} catch (error) { } catch (error) {
window.log.error( window.log.error(
'Conversation save failed! ', 'Conversation save failed! ',
@ -200,9 +199,10 @@
return conversation; return conversation;
}; };
conversation.initialPromise = create().then(() => conversation.initialPromise = create().then(async () => {
conversation.updateProfileAvatar() window.lokiSnodeAPI.refreshSwarmNodesForPubKey(id);
); conversation.updateProfileAvatar();
});
return conversation; return conversation;
}, },

@ -78,7 +78,7 @@
friendRequestStatus: FriendRequestStatusEnum.none, friendRequestStatus: FriendRequestStatusEnum.none,
unlockTimestamp: null, // Timestamp used for expiring friend requests. unlockTimestamp: null, // Timestamp used for expiring friend requests.
sessionResetStatus: SessionResetEnum.none, sessionResetStatus: SessionResetEnum.none,
swarmNodes: new Set([]), swarmNodes: [],
isOnline: false, isOnline: false,
}; };
}, },
@ -1406,6 +1406,12 @@
}, },
}; };
}, },
async updateSwarmNodes(swarmNodes) {
this.set({ swarmNodes });
await window.Signal.Data.updateConversation(this.id, this.attributes, {
Conversation: Whisper.Conversation,
});
},
async updateLastMessage() { async updateLastMessage() {
if (!this.id) { if (!this.id) {
return; return;

@ -1,6 +1,6 @@
/* eslint-disable no-await-in-loop */ /* eslint-disable no-await-in-loop */
/* eslint-disable no-loop-func */ /* eslint-disable no-loop-func */
/* global log, dcodeIO, window, callWorker, Whisper, lokiP2pAPI */ /* global log, dcodeIO, window, callWorker, lokiP2pAPI, lokiSnodeAPI */
const nodeFetch = require('node-fetch'); const nodeFetch = require('node-fetch');
const _ = require('lodash'); const _ = require('lodash');
@ -109,7 +109,7 @@ class LokiMessageAPI {
let successfulRequests = 0; let successfulRequests = 0;
let canResolve = true; let canResolve = true;
let swarmNodes = await window.Signal.Data.getSwarmNodesByPubkey(pubKey); let swarmNodes = await lokiSnodeAPI.getSwarmNodesForPubKey(pubKey);
const nodeComplete = nodeUrl => { const nodeComplete = nodeUrl => {
completedNodes.push(nodeUrl); completedNodes.push(nodeUrl);
@ -148,7 +148,7 @@ class LokiMessageAPI {
nodeComplete(nodeUrl); nodeComplete(nodeUrl);
} else { } else {
log.error('Loki SendMessages:', e); log.error('Loki SendMessages:', e);
if (window.LokiSnodeAPI.unreachableNode(pubKey, nodeUrl)) { if (lokiSnodeAPI.unreachableNode(pubKey, nodeUrl)) {
nodeComplete(nodeUrl); nodeComplete(nodeUrl);
} }
} }
@ -160,7 +160,7 @@ class LokiMessageAPI {
throw new window.textsecure.DNSResolutionError('Sending messages'); throw new window.textsecure.DNSResolutionError('Sending messages');
} }
if (swarmNodes.length === 0) { if (swarmNodes.length === 0) {
const freshNodes = await window.LokiSnodeAPI.getFreshSwarmNodes(pubKey); const freshNodes = await lokiSnodeAPI.getFreshSwarmNodes(pubKey);
swarmNodes = _.difference(freshNodes, completedNodes); swarmNodes = _.difference(freshNodes, completedNodes);
if (swarmNodes.length === 0) { if (swarmNodes.length === 0) {
if (successfulRequests !== 0) { if (successfulRequests !== 0) {
@ -172,13 +172,11 @@ class LokiMessageAPI {
new Error('Ran out of swarm nodes to query') new Error('Ran out of swarm nodes to query')
); );
} }
await window.Signal.Data.saveSwarmNodesForPubKey(pubKey, swarmNodes, { lokiSnodeAPI.updateSwarmNodes(pubKey, swarmNodes);
Conversation: Whisper.Conversation,
});
} }
const remainingRequests = const remainingRequests =
MINIMUM_SUCCESSFUL_REQUESTS - completedNodes.length; MINIMUM_SUCCESSFUL_REQUESTS - successfulRequests;
await Promise.all( await Promise.all(
swarmNodes swarmNodes
@ -196,7 +194,7 @@ class LokiMessageAPI {
let ourSwarmNodes; let ourSwarmNodes;
try { try {
ourSwarmNodes = await window.LokiSnodeAPI.getOurSwarmNodes(); ourSwarmNodes = await lokiSnodeAPI.getOurSwarmNodes();
} catch (e) { } catch (e) {
throw new window.textsecure.EmptySwarmError(ourKey, e); throw new window.textsecure.EmptySwarmError(ourKey, e);
} }
@ -224,7 +222,7 @@ class LokiMessageAPI {
nodeComplete(nodeUrl); nodeComplete(nodeUrl);
if (result.lastHash) { if (result.lastHash) {
window.LokiSnodeAPI.updateLastHash(nodeUrl, result.lastHash); lokiSnodeAPI.updateLastHash(nodeUrl, result.lastHash);
callback(result.messages); callback(result.messages);
} }
successfulRequests += 1; successfulRequests += 1;
@ -242,7 +240,7 @@ class LokiMessageAPI {
nodeComplete(nodeUrl); nodeComplete(nodeUrl);
} else { } else {
log.error('Loki RetrieveMessages:', e); log.error('Loki RetrieveMessages:', e);
if (window.LokiSnodeAPI.unreachableNode(ourKey, nodeUrl)) { if (lokiSnodeAPI.unreachableNode(ourKey, nodeUrl)) {
nodeComplete(nodeUrl); nodeComplete(nodeUrl);
} }
} }
@ -255,7 +253,7 @@ class LokiMessageAPI {
} }
if (Object.keys(ourSwarmNodes).length === 0) { if (Object.keys(ourSwarmNodes).length === 0) {
try { try {
ourSwarmNodes = await window.LokiSnodeAPI.getOurSwarmNodes(); ourSwarmNodes = await lokiSnodeAPI.getOurSwarmNodes();
// Filter out the nodes we have already got responses from // Filter out the nodes we have already got responses from
completedNodes.forEach(nodeUrl => delete ourSwarmNodes[nodeUrl]); completedNodes.forEach(nodeUrl => delete ourSwarmNodes[nodeUrl]);
} catch (e) { } catch (e) {
@ -277,7 +275,7 @@ class LokiMessageAPI {
} }
const remainingRequests = const remainingRequests =
MINIMUM_SUCCESSFUL_REQUESTS - completedNodes.length; MINIMUM_SUCCESSFUL_REQUESTS - successfulRequests;
await Promise.all( await Promise.all(
Object.entries(ourSwarmNodes) Object.entries(ourSwarmNodes)

@ -1,5 +1,5 @@
/* eslint-disable class-methods-use-this */ /* eslint-disable class-methods-use-this */
/* global log, window, Whisper */ /* global log, window, ConversationController */
const fetch = require('node-fetch'); const fetch = require('node-fetch');
const is = require('@sindresorhus/is'); const is = require('@sindresorhus/is');
@ -58,17 +58,10 @@ class LokiSnodeAPI {
if (this.contactSwarmNodes[nodeUrl].failureCount < FAILURE_THRESHOLD) { if (this.contactSwarmNodes[nodeUrl].failureCount < FAILURE_THRESHOLD) {
return false; return false;
} }
const conversation = window.ConversationController.get(pubKey); const conversation = ConversationController.get(pubKey);
const swarmNodes = conversation.get('swarmNodes'); const swarmNodes = conversation.get('swarmNodes');
if (swarmNodes.delete(nodeUrl)) { if (swarmNodes.delete(nodeUrl)) {
conversation.set({ swarmNodes }); await conversation.updateSwarmNodes(swarmNodes);
await window.Signal.Data.updateConversation(
conversation.id,
conversation.attributes,
{
Conversation: Whisper.Conversation,
}
);
delete this.contactSwarmNodes[nodeUrl]; delete this.contactSwarmNodes[nodeUrl];
} }
return true; return true;
@ -84,6 +77,32 @@ class LokiSnodeAPI {
} }
} }
async getSwarmNodesForPubKey(pubKey) {
let conversation;
let swarmNodes;
try {
conversation = ConversationController.get(pubKey);
swarmNodes = conversation.get('swarmNodes');
} catch (e) {
throw new window.textsecure.ReplayableError({
message: 'Could not get conversation',
});
}
return swarmNodes;
}
async updateSwarmNodes(pubKey, newNodes) {
let conversation;
try {
conversation = ConversationController.get(pubKey);
} catch (e) {
throw new window.textsecure.ReplayableError({
message: 'Could not get conversation',
});
}
await conversation.updateSwarmNodes(newNodes);
}
async getOurSwarmNodes() { async getOurSwarmNodes() {
if ( if (
!this.ourSwarmNodes || !this.ourSwarmNodes ||
@ -108,9 +127,12 @@ class LokiSnodeAPI {
async refreshSwarmNodesForPubKey(pubKey) { async refreshSwarmNodesForPubKey(pubKey) {
const newNodes = await this.getFreshSwarmNodes(pubKey); const newNodes = await this.getFreshSwarmNodes(pubKey);
await window.Signal.Data.saveSwarmNodesForPubKey(pubKey, newNodes, { try {
Conversation: Whisper.Conversation, const conversation = ConversationController.get(pubKey);
}); await conversation.updateSwarmNodes(newNodes);
} catch (e) {
throw e;
}
} }
async getFreshSwarmNodes(pubKey) { async getFreshSwarmNodes(pubKey) {

@ -288,7 +288,7 @@ window.WebAPI = initializeWebAPI({
const LokiSnodeAPI = require('./js/modules/loki_snode_api'); const LokiSnodeAPI = require('./js/modules/loki_snode_api');
window.LokiSnodeAPI = new LokiSnodeAPI({ window.lokiSnodeAPI = new LokiSnodeAPI({
url: config.serverUrl, url: config.serverUrl,
swarmServerPort: config.swarmServerPort, swarmServerPort: config.swarmServerPort,
}); });

Loading…
Cancel
Save