'use strict'; const electron = require('electron'); // Module to control application life. const app = electron.app; // Module to create native browser window. const BrowserWindow = electron.BrowserWindow; const {Menu, MenuItem} = electron; var http = require('http'); var express = require("express"); var RED = require("node-red"); // Create an Express app var red_app = express(); // Add a simple route for static content served from 'public' //red_app.use("/",express.static("public")); // Create a server var server = http.createServer(red_app); // Create the settings object - see default settings.js file for other options var settings = { verbose: true, httpAdminRoot:"/admin", httpNodeRoot: "/", userDir: __dirname, flowFile: "flows.json", functionGlobalContext: { } // enables global context }; // Initialise the runtime with a server and settings RED.init(server,settings); // Serve the editor UI from /red red_app.use(settings.httpAdminRoot,RED.httpAdmin); // Serve the http nodes UI from /api red_app.use(settings.httpNodeRoot,RED.httpNode); server.listen(8000); // Start the runtime RED.start(); // Create the Application's main menu var template = [{ label: "Application", submenu: [ { label: "About Application", selector: "orderFrontStandardAboutPanel:" }, { type: "separator" }, { label: "Quit", accelerator: "Command+Q", click: function() { app.quit(); }} ]}, { label: "Edit", submenu: [ { label: "Undo", accelerator: "CmdOrCtrl+Z", selector: "undo:" }, { label: "Redo", accelerator: "Shift+CmdOrCtrl+Z", selector: "redo:" }, { type: "separator" }, { label: "Cut", accelerator: "CmdOrCtrl+X", selector: "cut:" }, { label: "Copy", accelerator: "CmdOrCtrl+C", selector: "copy:" }, { label: "Paste", accelerator: "CmdOrCtrl+V", selector: "paste:" }, { label: "Select All", accelerator: "CmdOrCtrl+A", selector: "selectAll:" } ]} ]; // Keep a global reference of the window object, if you don't, the window will // be closed automatically when the JavaScript object is garbage collected. let mainWindow; function createWindow () { // Create the browser window. mainWindow = new BrowserWindow({ autoHideMenuBar: true, webPreferences: { nodeIntegration: false }, title: "Node-RED", width: 1024, height: 768, icon: __dirname + "/nodered.png" }); mainWindow.loadURL("http://localhost:8000/ui"); var webContents = mainWindow.webContents; webContents.on('did-get-response-details', function(event, status, newURL, originalURL, httpResponseCode) { if ((httpResponseCode == 404) && (newURL == "http://localhost:8000/ui")) { setTimeout(webContents.reload, 200); } Menu.setApplicationMenu(Menu.buildFromTemplate(template)); }); // Open the DevTools. //mainWindow.webContents.openDevTools(); mainWindow.webContents.on("new-window", function(e, url, frameName, disposition, options) { // if a child window opens... modify any other options such as width/height, etc // in this case make the child overlap the parent exactly... var w = mainWindow.getBounds(); options.x = w.x; options.y = w.y; options.width = w.width; options.height = w.height; //re-use the same child name so all "2nd" windows use the same one. //frameName = "child"; }) // Emitted when the window is closed. mainWindow.on('closed', function() { // Dereference the window object, usually you would store windows // in an array if your app supports multi windows, this is the time // when you should delete the corresponding element. mainWindow = null; }); } // This method will be called when Electron has finished // initialization and is ready to create browser windows. app.on('ready', createWindow); // Quit when all windows are closed. app.on('window-all-closed', function () { // On OS X it is common for applications and their menu bar // to stay active until the user quits explicitly with Cmd + Q if (process.platform !== 'darwin') { app.quit(); } }); app.on('activate', function () { // On OS X 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 (mainWindow === null) { createWindow(); } });