index.js 3.12 KiB
Newer Older
Amaury Martiny's avatar
Amaury Martiny committed
// Copyright 2015-2018 Parity Technologies (UK) Ltd.
// This file is part of Parity.
//
Amaury Martiny's avatar
Amaury Martiny committed
// SPDX-License-Identifier: BSD-3-Clause
import electron from 'electron';
import path from 'path';
import url from 'url';
import { doesParityExist } from './operations/doesParityExist';
import fetchParity from './operations/fetchParity';
import handleError from './operations/handleError';
Amaury Martiny's avatar
Amaury Martiny committed
import Mb from 'menubar';
import messages from './messages';
import { productName } from '../../electron-builder.json';
import Pino from './utils/pino';
import { runParity, killParity } from './operations/runParity';
Amaury Martiny's avatar
Amaury Martiny committed
import staticPath from './utils/staticPath';
Amaury Martiny's avatar
Amaury Martiny committed
const { ipcMain, Menu, session } = electron;
const pino = Pino();
Amaury Martiny's avatar
Amaury Martiny committed
const menubar = Mb({
  height: 640,
  icon: path.join(staticPath, 'assets', 'menubar', 'icon.png'),
Amaury Martiny's avatar
Amaury Martiny committed
  index:
    // Opens file:///path/to/build/index.html in prod mode, or whatever is
    // passed to ELECTRON_START_URL
    process.env.ELECTRON_START_URL ||
    url.format({
Amaury Martiny's avatar
Amaury Martiny committed
      pathname: path.join(staticPath, 'build', 'index.html'),
Amaury Martiny's avatar
Amaury Martiny committed
      protocol: 'file:',
      slashes: true
    }),
  preloadWindow: true,
  resizable: false,
  transparent: true,
  webPreferences: {
    nodeIntegration: true
  },
  width: 360
});

function createWindow () {
Amaury Martiny's avatar
Amaury Martiny committed
  pino.info(`Starting ${productName}...`);
Amaury Martiny's avatar
Amaury Martiny committed

  doesParityExist()
Amaury Martiny's avatar
Amaury Martiny committed
    .catch(() => fetchParity(menubar.window)) // Install parity if not present
    .then(() => runParity(menubar.window))
Amaury Martiny's avatar
Amaury Martiny committed
    .catch(handleError); // Errors should be handled before, this is really just in case

  // Listen to messages from renderer process
  ipcMain.on('asynchronous-message', messages);

  // WS calls have Origin `file://` by default, which is not trusted.
  // We override Origin header on all WS connections with an authorized one.
  session.defaultSession.webRequest.onBeforeSendHeaders(
    {
      urls: ['ws://*/*', 'wss://*/*']
    },
    (details, callback) => {
Amaury Martiny's avatar
Amaury Martiny committed
      if (!menubar.window) {
        // There might be a split second where the user closes the app, so
Amaury Martiny's avatar
Amaury Martiny committed
        // menubar.window is null, but there is still a network request done.
Amaury Martiny's avatar
Amaury Martiny committed
      details.requestHeaders.Origin = `parity://${menubar.window.id}.ui.parity`;
Amaury Martiny's avatar
Amaury Martiny committed
      callback({ requestHeaders: details.requestHeaders }); // eslint-disable-line
  // Open external links in browser
Amaury Martiny's avatar
Amaury Martiny committed
  menubar.window.webContents.on('new-window', function (event, url) {
    event.preventDefault();
    electron.shell.openExternal(url);
  });
Amaury Martiny's avatar
Amaury Martiny committed
// Right click menu for Tray
Amaury Martiny's avatar
Amaury Martiny committed
menubar.on('after-create-window', function () {
  // Add right-click menu
Amaury Martiny's avatar
Amaury Martiny committed
  const contextMenu = Menu.buildFromTemplate([
    { role: 'about' },
    { type: 'separator' },
    {
      label: 'Restart',
      click: () => {
        menubar.app.relaunch();
        menubar.app.exit();
      }
    },
    {
      label: 'Quit',
      click: () => {
        menubar.app.quit();
      }
    }
  ]);
Amaury Martiny's avatar
Amaury Martiny committed
  menubar.tray.on('right-click', () => {
    menubar.tray.popUpContextMenu(contextMenu);
  });
Amaury Martiny's avatar
Amaury Martiny committed
});

// Make sure parity stops when UI stops
Amaury Martiny's avatar
Amaury Martiny committed
menubar.app.on('before-quit', killParity);
menubar.app.on('will-quit', killParity);
menubar.app.on('quit', killParity);
Amaury Martiny's avatar
Amaury Martiny committed
menubar.on('ready', createWindow);