fix message order when mix multidevice messages, improve error logging

pull/934/head
Ryan Tharp 5 years ago
parent 5b412f74ad
commit 97393ef25d

@ -627,6 +627,12 @@ class LokiAppDotNetServerAPI {
url url
); );
} }
if (mode === '_sendToProxy') {
// if we can detect, certain types of failures, we can retry...
if (e.code === 'ECONNRESET') {
// retry with counter?
}
}
return { return {
err: e, err: e,
}; };
@ -1476,6 +1482,14 @@ class LokiPublicChannelAPI {
}); });
if (res.err || !res.response) { if (res.err || !res.response) {
log.error(
'Could not get messages from',
this.serverAPI.baseServerUrl,
this.baseChannelUrl
);
if (res.err) {
log.error('pollOnceForMessages receive error', res.err);
}
return; return;
} }
@ -1663,18 +1677,31 @@ class LokiPublicChannelAPI {
// filter out invalid messages // filter out invalid messages
pendingMessages = pendingMessages.filter(messageData => !!messageData); pendingMessages = pendingMessages.filter(messageData => !!messageData);
// separate messages coming from primary and secondary devices // separate messages coming from primary and secondary devices
const [primaryMessages, slaveMessages] = _.partition( let [primaryMessages, slaveMessages] = _.partition(
pendingMessages, pendingMessages,
message => !(message.source in slavePrimaryMap) message => !(message.source in slavePrimaryMap)
); );
// process primary devices' message directly // get minimum ID for primaryMessages and slaveMessages
primaryMessages.forEach(message => const firstPrimaryId = Math.min(...primaryMessages.map(msg => msg.serverId));
this.chatAPI.emit('publicMessage', { const firstSlaveId = Math.min(...slaveMessages.map(msg => msg.serverId));
message, if (firstPrimaryId < firstSlaveId) {
}) // early send
); // split off count from pendingMessages
let sendNow = [];
pendingMessages = []; // allow memory to be freed ([sendNow, pendingMessages] = _.partition(
pendingMessages,
message => message.serverId < firstSlaveId
));
sendNow.forEach(message => {
// send them out now
log.info('emitting primary message', message.serverId);
this.chatAPI.emit('publicMessage', {
message,
});
});
sendNow = false;
}
primaryMessages = false; // free memory
// get actual chat server data (mainly the name rn) of primary device // get actual chat server data (mainly the name rn) of primary device
const verifiedDeviceResults = await this.serverAPI.getUsers( const verifiedDeviceResults = await this.serverAPI.getUsers(
@ -1731,11 +1758,25 @@ class LokiPublicChannelAPI {
messageData.message.profileKey = profileKey; messageData.message.profileKey = profileKey;
} }
} }
/* eslint-enable no-param-reassign */ });
slaveMessages = false; // free memory
// process all messages in the order received
pendingMessages.forEach(message => {
// if slave device
if (message.source in slavePrimaryMap) {
// prevent our own device sent messages from coming back in
if (message.source === ourNumberDevice) {
// we originally sent these
return;
}
}
log.info('emitting pending message', message.serverId);
this.chatAPI.emit('publicMessage', { this.chatAPI.emit('publicMessage', {
message: messageData, message,
}); });
}); });
/* eslint-enable no-param-reassign */ /* eslint-enable no-param-reassign */
// if we received one of our own messages // if we received one of our own messages

Loading…
Cancel
Save