Skip to content

Commit b9804bd

Browse files
jackplesindresorhus
andcommitted
Preserve errors (#22)
Co-authored-by: Sindre Sorhus <[email protected]>
1 parent 4f80b83 commit b9804bd

File tree

6 files changed

+40
-13
lines changed

6 files changed

+40
-13
lines changed

package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
},
1212
"scripts": {
1313
"test": "xo && tsd",
14-
"// disabled until spectron is updated // test": "xo && (cd test/fixture && ava) && tsd"
14+
"test-with-spectron": "xo && (cd test/fixture && ava) && tsd"
1515
},
1616
"files": [
1717
"index.js",
@@ -34,6 +34,9 @@
3434
"async",
3535
"await"
3636
],
37+
"dependencies": {
38+
"serialize-error": "^5.0.0"
39+
},
3740
"devDependencies": {
3841
"ava": "^2.2.0",
3942
"electron": "^6.0.2",

source/main.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
'use strict';
22
const electron = require('electron');
3+
const {serializeError, deserializeError} = require('serialize-error');
34
const util = require('./util');
45

56
const {ipcMain, BrowserWindow} = electron;
@@ -28,7 +29,7 @@ ipc.callRenderer = (browserWindow, channel, data) => new Promise((resolve, rejec
2829
});
2930

3031
ipc.once(errorChannel, (event, error) => {
31-
onError(event, error);
32+
onError(event, deserializeError(error));
3233
});
3334

3435
const completeData = {
@@ -59,7 +60,7 @@ ipc.answerRenderer = (channel, callback) => {
5960
try {
6061
send(dataChannel, await callback(userData, browserWindow));
6162
} catch (error) {
62-
send(errorChannel, error);
63+
send(errorChannel, serializeError(error));
6364
}
6465
};
6566

source/renderer.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
'use strict';
22
const electron = require('electron');
3+
const {serializeError, deserializeError} = require('serialize-error');
34
const util = require('./util');
45

56
const {ipcRenderer} = electron;
@@ -28,7 +29,7 @@ ipc.callMain = (channel, data) => new Promise((resolve, reject) => {
2829
});
2930

3031
ipc.once(errorChannel, (event, error) => {
31-
onError(event, error);
32+
onError(event, deserializeError(error));
3233
});
3334

3435
const completeData = {
@@ -50,7 +51,7 @@ ipc.answerMain = (channel, callback) => {
5051
try {
5152
ipc.send(dataChannel, await callback(userData));
5253
} catch (error) {
53-
ipc.send(errorChannel, error);
54+
ipc.send(errorChannel, serializeError(error));
5455
}
5556
};
5657

test/fixture/index.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,24 @@ ipc.answerRenderer('test', async data => {
1010
return 'test:main:answer';
1111
});
1212

13+
ipc.answerRenderer('test-error', async () => {
14+
throw new Error('test-error:main:answer');
15+
});
16+
1317
let mainWindow;
1418

1519
(async () => {
1620
await app.whenReady();
1721

18-
mainWindow = new BrowserWindow();
22+
mainWindow = new BrowserWindow({
23+
// Why? See below:
24+
// https://github.com/electron-userland/spectron/issues/174#issuecomment-525540776
25+
webPreferences: {
26+
nodeIntegration: true
27+
}
28+
});
1929
await mainWindow.loadFile(path.join(__dirname, 'index.html'));
2030

21-
const answer = await ipc.callRenderer(win, 'test', 'optional-data');
31+
const answer = await ipc.callRenderer(mainWindow, 'test', 'optional-data');
2232
console.log('test:main:answer-from-renderer:', answer);
2333
})();

test/fixture/renderer.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,8 @@ ipc.answerMain('test', data => {
99
console.log('test:renderer:data-from-main:', data);
1010
return 'test:renderer:answer-data';
1111
});
12+
13+
ipc.callMain('test-error').catch(error => {
14+
console.log('test-error:renderer:from-main:is-error', error instanceof Error);
15+
console.log('test-error:renderer:from-main:error-message', error.message);
16+
});

test/fixture/test.js

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ test.beforeEach(async t => {
99
});
1010
});
1111

12-
test.afterEach.always(async t => {
13-
await t.context.app.stop();
12+
test.afterEach(t => {
13+
return t.context.app.stop();
1414
});
1515

1616
test('main', async t => {
@@ -33,15 +33,22 @@ test('main', async t => {
3333
// More useless cleanup because Spectron sucks
3434
logs = logs.filter(x =>
3535
!x.startsWith('DevTools listening') &&
36-
!/^\[.*:CONSOLE\(\d\)\]/.test(x) &&
37-
x !== ''
36+
!x.includes(':CONSOLE(') &&
37+
// Cannot match like this one: [79915:0924/100744.171411:INFO:CONSOLE(14)]
38+
// !/^\[.*:CONSOLE\(\d\)\]/.test(x) &&
39+
x !== '' &&
40+
x !== 'Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.'
3841
);
3942

43+
console.log(logs);
44+
4045
t.deepEqual(logs, [
4146
// TODO: The value is missing as Spectron only captures the first argument to `console.log`:
4247
// https://github.com/electron/spectron/issues/282
43-
'"test:renderer:answer-from-main:"',
44-
'"test:renderer:data-from-main:"',
48+
'"test-error:renderer:from-main:error-message" "test-error:main:answer"',
49+
'"test-error:renderer:from-main:is-error" true',
50+
'"test:renderer:answer-from-main:" "test:main:answer"',
51+
'"test:renderer:data-from-main:" "optional-data"',
4552
'test:main:answer-from-renderer: test:renderer:answer-data',
4653
'test:main:data-from-renderer: optional-data'
4754
]);

0 commit comments

Comments
 (0)