Made swarm requests ACTUALLY not wait for them all to finish and stop saving swarmNodes as DB column

pull/132/head
Beaudan 6 years ago
parent 7b1799c418
commit 24553e29e7

@ -387,7 +387,6 @@ async function updateToSchemaVersion4(currentVersion, instance) {
type STRING, type STRING,
members TEXT, members TEXT,
name TEXT, name TEXT,
swarmNodes TEXT,
profileName TEXT profileName TEXT
);` );`
); );
@ -1052,7 +1051,7 @@ async function getConversationCount() {
async function saveConversation(data) { async function saveConversation(data) {
// eslint-disable-next-line camelcase // eslint-disable-next-line camelcase
const { id, active_at, type, members, name, friendRequestStatus, swarmNodes, profileName } = data; const { id, active_at, type, members, name, friendRequestStatus, profileName } = data;
await db.run( await db.run(
`INSERT INTO conversations ( `INSERT INTO conversations (
@ -1064,7 +1063,6 @@ async function saveConversation(data) {
members, members,
name, name,
friendRequestStatus, friendRequestStatus,
swarmNodes,
profileName profileName
) values ( ) values (
$id, $id,
@ -1075,7 +1073,6 @@ async function saveConversation(data) {
$members, $members,
$name, $name,
$friendRequestStatus, $friendRequestStatus,
$swarmNodes,
$profileName $profileName
);`, );`,
{ {
@ -1087,7 +1084,6 @@ async function saveConversation(data) {
$members: members ? members.join(' ') : null, $members: members ? members.join(' ') : null,
$name: name, $name: name,
$friendRequestStatus: friendRequestStatus, $friendRequestStatus: friendRequestStatus,
$swarmNodes: swarmNodes ? swarmNodes.join(' ') : null,
$profileName: profileName, $profileName: profileName,
} }
); );
@ -1111,7 +1107,7 @@ async function saveConversations(arrayOfConversations) {
async function updateConversation(data) { async function updateConversation(data) {
// eslint-disable-next-line camelcase // eslint-disable-next-line camelcase
const { id, active_at, type, members, name, friendRequestStatus, swarmNodes, profileName } = data; const { id, active_at, type, members, name, friendRequestStatus, profileName } = data;
await db.run( await db.run(
`UPDATE conversations SET `UPDATE conversations SET
@ -1122,7 +1118,6 @@ async function updateConversation(data) {
members = $members, members = $members,
name = $name, name = $name,
friendRequestStatus = $friendRequestStatus, friendRequestStatus = $friendRequestStatus,
swarmNodes = $swarmNodes,
profileName = $profileName profileName = $profileName
WHERE id = $id;`, WHERE id = $id;`,
{ {
@ -1134,7 +1129,6 @@ async function updateConversation(data) {
$members: members ? members.join(' ') : null, $members: members ? members.join(' ') : null,
$name: name, $name: name,
$friendRequestStatus: friendRequestStatus, $friendRequestStatus: friendRequestStatus,
$swarmNodes: swarmNodes ? swarmNodes.join(' ') : null,
$profileName: profileName, $profileName: profileName,
} }
); );

@ -96,7 +96,6 @@ class LokiMessageAPI {
} }
async retrieveMessages(callback) { async retrieveMessages(callback) {
let ourSwarmNodes = await window.LokiSnodeAPI.getOurSwarmNodes();
const ourKey = window.textsecure.storage.user.getNumber(); const ourKey = window.textsecure.storage.user.getNumber();
let completedRequests = 0; let completedRequests = 0;
@ -126,9 +125,10 @@ class LokiMessageAPI {
response = await fetch(options.url, fetchOptions); response = await fetch(options.url, fetchOptions);
} catch (e) { } catch (e) {
// TODO: Maybe we shouldn't immediately delete? // TODO: Maybe we shouldn't immediately delete?
// And differentiate between different connectivity issues
log.error(options.type, options.url, 0, `Error retrieving messages from ${nodeUrl}`); log.error(options.type, options.url, 0, `Error retrieving messages from ${nodeUrl}`);
window.LokiSnodeAPI.unreachableNode(ourKey, nodeUrl); window.LokiSnodeAPI.unreachableNode(ourKey, nodeUrl);
throw HTTPError('fetch error', 0, e.toString()); return;
} }
let result; let result;
@ -144,19 +144,20 @@ class LokiMessageAPI {
} }
completedRequests += 1; completedRequests += 1;
if (response.status >= 0 && response.status < 400) { if (response.status === 200) {
if (result.lastHash) { if (result.lastHash) {
window.LokiSnodeAPI.updateLastHash(nodeUrl, result.lastHash); window.LokiSnodeAPI.updateLastHash(nodeUrl, result.lastHash);
callback(result.messages);
} }
return result; return;
} }
// Handle error from snode
log.error(options.type, options.url, response.status, 'Error'); log.error(options.type, options.url, response.status, 'Error');
throw HTTPError('retrieveMessages: error response', response.status, result);
} }
while (completedRequests < MINIMUM_SUCCESSFUL_REQUESTS) { while (completedRequests < MINIMUM_SUCCESSFUL_REQUESTS) {
const remainingRequests = MINIMUM_SUCCESSFUL_REQUESTS - completedRequests; const remainingRequests = MINIMUM_SUCCESSFUL_REQUESTS - completedRequests;
ourSwarmNodes = await window.LokiSnodeAPI.getOurSwarmNodes(); const ourSwarmNodes = await window.LokiSnodeAPI.getOurSwarmNodes();
if (Object.keys(ourSwarmNodes).length < remainingRequests) { if (Object.keys(ourSwarmNodes).length < remainingRequests) {
if (completedRequests !== 0) { if (completedRequests !== 0) {
// TODO: Decide how to handle some completed requests but not enough // TODO: Decide how to handle some completed requests but not enough
@ -164,14 +165,11 @@ class LokiMessageAPI {
return; return;
} }
const requests = await Promise.all( await Promise.all(
Object.entries(ourSwarmNodes) Object.entries(ourSwarmNodes)
.splice(0, remainingRequests) .splice(0, remainingRequests)
.map(([nodeUrl, lastHash]) => doRequest(nodeUrl, lastHash).catch(() => null)) .map(([nodeUrl, lastHash]) => doRequest(nodeUrl, lastHash))
); );
// Requests is now an array of null for failed requests and the json for success
requests.filter(v => v !== null && 'messages' in v)
.forEach(v => callback(v.messages));
} }
} }
} }

Loading…
Cancel
Save