index.js 2.93 KiB
Newer Older
Amaury Martiny's avatar
Amaury Martiny committed
// Copyright 2015-2018 Parity Technologies (UK) Ltd.
// This file is part of Parity.
//
// SPDX-License-Identifier: MIT

Amaury Martiny's avatar
Amaury Martiny committed
/* global __static */

Amaury Martiny's avatar
Amaury Martiny committed
const electron = require('electron');
const path = require('path');
const url = require('url');

const addMenu = require('./menu');
Amaury Martiny's avatar
Amaury Martiny committed
const { cli } = require('./cli');
Amaury Martiny's avatar
Amaury Martiny committed
const { doesParityExist } = require('./operations/doesParityExist');
Amaury Martiny's avatar
Amaury Martiny committed
const fetchParity = require('./operations/fetchParity');
const handleError = require('./operations/handleError');
const messages = require('./messages');
Amaury Martiny's avatar
Amaury Martiny committed
const { productName } = require('../../electron-builder.json');
Amaury Martiny's avatar
Amaury Martiny committed
const pino = require('./utils/pino')({ name: 'electron' });
Amaury Martiny's avatar
Amaury Martiny committed
const { runParity, killParity } = require('./operations/runParity');

const { app, BrowserWindow, ipcMain, session } = electron;
let mainWindow;

function createWindow () {
Amaury Martiny's avatar
Amaury Martiny committed
  pino.info(`Starting ${productName}...`);
Amaury Martiny's avatar
Amaury Martiny committed
  mainWindow = new BrowserWindow({
    height: 800,
    width: 1200
  });

  doesParityExist()
    .catch(() => fetchParity(mainWindow)) // Install parity if not present
    .then(() => runParity(mainWindow))
    .catch(handleError); // Errors should be handled before, this is really just in case

  if (cli.uiDev === true) {
Amaury Martiny's avatar
Amaury Martiny committed
    // Opens http://127.0.0.1:3000 in --ui-dev mode
    mainWindow.loadURL('http://127.0.0.1:3000');
    mainWindow.webContents.openDevTools();
  } else {
    // Opens file:///path/to/.build/index.html in prod mode
    mainWindow.loadURL(
      url.format({
Amaury Martiny's avatar
Amaury Martiny committed
        pathname: path.join(__static, 'build', 'index.html'),
Amaury Martiny's avatar
Amaury Martiny committed
        protocol: 'file:',
        slashes: true
      })
    );
  }

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

  // Add application menu
  addMenu(mainWindow);

  // 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) => {
      if (!mainWindow) {
        // There might be a split second where the user closes the app, so
        // mainWindow is null, but there is still a network request done.
        return;
      }
Amaury Martiny's avatar
Amaury Martiny committed
      details.requestHeaders.Origin = `parity://${mainWindow.id}.ui.parity`;
Amaury Martiny's avatar
Amaury Martiny committed
      callback({ requestHeaders: details.requestHeaders }); // eslint-disable-line
  // Open external links in browser
  mainWindow.webContents.on('new-window', function (event, url) {
    event.preventDefault();
    electron.shell.openExternal(url);
  });

Amaury Martiny's avatar
Amaury Martiny committed
  mainWindow.on('closed', () => {
    mainWindow = null;
  });
}

app.on('ready', createWindow);

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    killParity();
    app.quit();
  }
});

// Make sure parity stops when UI stops
app.on('before-quit', killParity);
app.on('will-quit', killParity);
app.on('quit', killParity);

app.on('activate', () => {
  if (mainWindow === null) {
    createWindow();
  }
});