summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@mullvad.net>2018-02-27 14:32:38 +0100
committerAndrej Mihajlov <and@mullvad.net>2018-02-27 18:08:22 +0100
commite40eefc63109458d638ce1403210471757a41a82 (patch)
tree9ba610af833057555053b5e9dcb788d852bdc6c7
parentc698ef90c1fbc30965c9fa9656254a8c97b7dbb9 (diff)
downloadmullvadvpn-e40eefc63109458d638ce1403210471757a41a82.tar.xz
mullvadvpn-e40eefc63109458d638ce1403210471757a41a82.zip
Rewrite collectProblemReport due to number of issues
-rw-r--r--app/lib/problem-report.js59
1 files changed, 31 insertions, 28 deletions
diff --git a/app/lib/problem-report.js b/app/lib/problem-report.js
index 17130fd05d..94a435b617 100644
--- a/app/lib/problem-report.js
+++ b/app/lib/problem-report.js
@@ -5,39 +5,42 @@ import { ipcRenderer } from 'electron';
import { log } from './platform';
import uuid from 'uuid';
-const collectProblemReport = (toRedact: string) => {
- const unAnsweredIpcCalls = new Map();
- function reapIpcCall(id) {
- const promise = unAnsweredIpcCalls.get(id);
- unAnsweredIpcCalls.delete(id);
+const collectProblemReport = (toRedact: Array<string>): Promise<string> => {
+ return new Promise((resolve, reject) => {
+ const requestId = uuid.v4();
+ let responseListener: Function;
+
+ const removeResponseListener = () => {
+ ipcRenderer.removeListener('collect-logs-reply', responseListener);
+ };
+
+ // timeout after 10 seconds if no ipc response received
+ const requestTimeout = setTimeout(() => {
+ removeResponseListener();
+ log.error('Timed out when collecting a problem report');
+ reject(new Error('Timed out'));
+ }, 10000);
- if (promise) {
- promise.reject(new Error('Timed out'));
- }
- }
- ipcRenderer.on('collect-logs-reply', (_event, id, err, reportId) => {
- const promise = unAnsweredIpcCalls.get(id);
- unAnsweredIpcCalls.delete(id);
- if(promise) {
- if(err) {
- promise.reject(err);
+ responseListener = (_event, id, error, reportPath) => {
+ if(id !== requestId) { return; }
+
+ clearTimeout(requestTimeout);
+ removeResponseListener();
+
+ if(error) {
+ log.error(`Cannot collect a problem report: ${ error.err }`);
+ log.error(`Stdout: ${ error.stdout }`);
+ reject(error);
} else {
- promise.resolve(reportId);
+ resolve(reportPath);
}
- }
- });
- return new Promise((resolve, reject) => {
+ };
- const id = uuid.v4();
- unAnsweredIpcCalls.set(id, { resolve, reject });
- ipcRenderer.send('collect-logs', id, toRedact);
- setTimeout(() => reapIpcCall(id), 1000);
- }).catch((e) => {
- const { err, stdout } = e;
- log.error('Failed collecting problem report', err);
- log.error(' stdout: ' + stdout);
+ // add ipc response listener
+ ipcRenderer.on('collect-logs-reply', responseListener);
- throw e;
+ // send ipc request
+ ipcRenderer.send('collect-logs', requestId, toRedact);
});
};