From 77f21f696dbb48f6fbd6ef50774e06d117638ace Mon Sep 17 00:00:00 2001 From: Randall Morey Date: Thu, 3 Dec 2020 15:08:36 -0500 Subject: [PATCH] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20Ember=20IPC=20service=20?= =?UTF-8?q?rejects=20when=20receiving=20error=20instance?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui/desktop/app/services/ipc.js | 8 ++++++-- ui/desktop/tests/unit/services/ipc-test.js | 22 ++++++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/ui/desktop/app/services/ipc.js b/ui/desktop/app/services/ipc.js index 4c0cca671..d1295d052 100644 --- a/ui/desktop/app/services/ipc.js +++ b/ui/desktop/app/services/ipc.js @@ -59,10 +59,14 @@ export class IPCRequest { this.payload = payload; this.origin = window?.location?.origin; this.#channel = new MessageChannel(); - this.#promise = new Promise((resolve /*, reject*/) => { + this.#promise = new Promise((resolve, reject) => { this.#channel.port1.onmessage = (event) => { this.close(); - resolve(event.data); + if (event.data instanceof Error) { + reject(JSON.parse(event.data.message)); + } else { + resolve(event.data); + } }; }); window.postMessage( diff --git a/ui/desktop/tests/unit/services/ipc-test.js b/ui/desktop/tests/unit/services/ipc-test.js index 05007f96c..f9c262130 100644 --- a/ui/desktop/tests/unit/services/ipc-test.js +++ b/ui/desktop/tests/unit/services/ipc-test.js @@ -53,4 +53,26 @@ module('Unit | Service | ipc', function (hooks) { test: 42, }); }); + + test('IPCRequests reject if receiving an Error instance, where the rejection value is the parsed JSON Error message', async (assert) => { + assert.expect(1); + const stringifiedPayload = JSON.stringify({ + foo: 'bar', + test: 42 + }); + const myWindow = { + postMessage(request, origin, [port]) { + // Post back an error on the response port + port.postMessage(new Error(stringifiedPayload)); + } + }; + try { + await new IPCRequest('hello', 'world', myWindow); + } catch (e) { + assert.deepEqual(e, { + foo: 'bar', + test: 42, + }); + } + }); });