const {app, BrowserWindow, shell} = require('electron') const path = require('path') const express = require('express') const eApp = express() const portInUse = require('./portInUse.js') const frontendPath = 'frontend/' function createWindow() { // Create the browser window. const mainWindow = new BrowserWindow({ width: 1680, height: 960, webPreferences: { nodeIntegration: true, } }) // Open external links in the browser mainWindow.webContents.on('new-window', function (e, url) { e.preventDefault() shell.openExternal(url) }) // Hide the toolbar mainWindow.setMenuBarVisibility(false) // We try to use the same port every time and only use a different one if that does not succeed. let port = 45735 portInUse(port, used => { if(used) { console.log(`Port ${port} already used, switching to a random one`) port = 0 // This lets express choose a random port } // Start a local express server to serve static files eApp.use(express.static(path.join(__dirname, frontendPath))) // Handle urls set by the frontend eApp.get('*', (request, response, next) => { response.sendFile(`${__dirname}/${frontendPath}index.html`); }) const server = eApp.listen(port, '127.0.0.1', () => { console.log(`Server started on port ${server.address().port}`) mainWindow.loadURL(`http://127.0.0.1:${server.address().port}`) }) }) } // This method will be called when Electron has finished // initialization and is ready to create browser windows. // Some APIs can only be used after this event occurs. app.whenReady().then(() => { createWindow() app.on('activate', function () { // On macOS it's common to re-create a window in the app when the // dock icon is clicked and there are no other windows open. if (BrowserWindow.getAllWindows().length === 0) createWindow() }) }) // Quit when all windows are closed, except on macOS. There, it's common // for applications and their menu bar to stay active until the user quits // explicitly with Cmd + Q. app.on('window-all-closed', () => { if (process.platform !== 'darwin') app.quit() })