diff --git a/ui/desktop/app/initializers/ipc.js b/ui/desktop/app/initializers/ipc.js new file mode 100644 index 000000000..367c38691 --- /dev/null +++ b/ui/desktop/app/initializers/ipc.js @@ -0,0 +1,51 @@ +import Ember from 'ember'; +import config from '../config/environment'; + +/** + * We strive to make this application runnable in a regular web browser, since + * it is a convenient environment for development and testing. But only an + * Electron environment has true IPC. Outside of Electron, we mock the handling + * of the message-based IPC requests originating from the + * renderer (the Ember app). + */ +class MockIPC { + async invoke(method, payload) { + console.log('MockIPC:', method, payload); + return await this[method](payload); + } + + origin = null; + + getOrigin() { + return this.origin; + } + + setOrigin(origin) { + this.origin = origin; + return this.origin; + } +} + +/** + * Establishes a mock IPC handler, which mimics the behavior of the Electron + * main process, and routes messages to it in a way similar to our + * preload.js script. + * + * Initializes mock IPC only in a non-Electron non-testing context. + */ +export function initialize() { + if (!config.isElectron && !Ember.testing) { + const mockIPC = new MockIPC(); + window.addEventListener('message', async function (event) { + if (event.origin !== window.location.origin) return; + const { method, payload } = event.data; + if (method) { + const response = + await mockIPC.invoke(method, payload); + event.ports[0].postMessage(response); + } + }); + } +} + +export default { initialize }; diff --git a/ui/desktop/mirage/config.js b/ui/desktop/mirage/config.js index 100a18dfa..475ff24eb 100644 --- a/ui/desktop/mirage/config.js +++ b/ui/desktop/mirage/config.js @@ -6,38 +6,6 @@ import { Response } from 'miragejs'; export default function() { - if (!config.isElectron && !Ember.testing) { - class MockIPC { - invoke(method, payload) { - console.log('MockIPC:', method, payload); - return this[method](payload); - } - - origin = null; - - getOrigin() { - return this.origin; - } - - setOrigin(origin) { - this.origin = origin; - return this.origin; - } - } - - const mockIPC = new MockIPC(); - - window.addEventListener('message', async function (event) { - if (event.origin !== window.location.origin) return; - const { method, payload } = event.data; - if (method) { - const response = - await mockIPC.invoke(method, payload); - event.ports[0].postMessage(response); - } - }); - } - // make this `http://localhost:8080`, for example, if your API is on a different server // this.urlPrefix = ''; // make this `/api`, for example, if your API is namespaced diff --git a/ui/desktop/tests/unit/initializers/ipc-test.js b/ui/desktop/tests/unit/initializers/ipc-test.js new file mode 100644 index 000000000..6efc5c816 --- /dev/null +++ b/ui/desktop/tests/unit/initializers/ipc-test.js @@ -0,0 +1,28 @@ +import Application from '@ember/application'; + +import { initialize } from 'desktop/initializers/ipc'; +import { module, test } from 'qunit'; +import { run } from '@ember/runloop'; + +module('Unit | Initializer | ipc', function(hooks) { + hooks.beforeEach(function() { + this.TestApplication = Application.extend(); + this.TestApplication.initializer({ + name: 'initializer under test', + initialize + }); + + this.application = this.TestApplication.create({ autoboot: false }); + }); + + hooks.afterEach(function() { + run(this.application, 'destroy'); + }); + + // TODO: Replace this with your real tests. + test('it works', async function(assert) { + await this.application.boot(); + + assert.ok(true); + }); +});