diff options
| author | Andrej Mihajlov <and@mullvad.net> | 2018-02-27 14:32:38 +0100 |
|---|---|---|
| committer | Andrej Mihajlov <and@mullvad.net> | 2018-02-27 18:08:22 +0100 |
| commit | e40eefc63109458d638ce1403210471757a41a82 (patch) | |
| tree | 9ba610af833057555053b5e9dcb788d852bdc6c7 | |
| parent | c698ef90c1fbc30965c9fa9656254a8c97b7dbb9 (diff) | |
| download | mullvadvpn-e40eefc63109458d638ce1403210471757a41a82.tar.xz mullvadvpn-e40eefc63109458d638ce1403210471757a41a82.zip | |
Rewrite collectProblemReport due to number of issues
| -rw-r--r-- | app/lib/problem-report.js | 59 |
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); }); }; |
