electron build uses random free port, fixes #142

This commit is contained in:
azivner 2018-07-31 19:50:18 +02:00
parent 365c37604b
commit 9452fc236b
5 changed files with 51 additions and 75 deletions

View file

@ -3,6 +3,7 @@
instanceName=
[Network]
# port setting is relevant only for web deployments, desktop builds run on random free port
port=8080
# true for TLS/SSL/HTTPS (secure), false for HTTP (unsecure).
https=false

View file

@ -2,9 +2,9 @@
const electron = require('electron');
const path = require('path');
const config = require('./src/services/config');
const log = require('./src/services/log');
const url = require("url");
const port = require('./src/services/port');
const app = electron.app;
const globalShortcut = electron.globalShortcut;
@ -23,7 +23,7 @@ function onClosed() {
mainWindow = null;
}
function createMainWindow() {
async function createMainWindow() {
const win = new electron.BrowserWindow({
width: 1200,
height: 900,
@ -31,10 +31,8 @@ function createMainWindow() {
icon: path.join(__dirname, 'src/public/images/app-icons/png/256x256.png')
});
const port = config['Network']['port'] || '3000';
win.setMenu(null);
win.loadURL('http://localhost:' + port);
win.loadURL('http://localhost:' + await port);
win.on('closed', onClosed);
win.webContents.on('new-window', (e, url) => {

View file

@ -37,6 +37,7 @@
"express": "~4.16.3",
"express-session": "^1.15.6",
"fs-extra": "^6.0.1",
"get-port": "^4.0.0",
"helmet": "^3.12.1",
"html": "^1.0.0",
"image-type": "^3.0.0",

10
src/services/port.js Normal file
View file

@ -0,0 +1,10 @@
const getPort = require('get-port');
const config = require('./config');
const utils = require('./utils');
if (utils.isElectron()) {
module.exports = getPort();
}
else {
module.exports = Promise.resolve(config['Network']['port'] || '3000');
}

106
src/www
View file

@ -18,70 +18,53 @@ const log = require('./services/log');
const appInfo = require('./services/app_info');
const messagingService = require('./services/messaging');
const utils = require('./services/utils');
const sqlInit = require('./services/sql_init.js');
const sqlInit = require('./services/sql_init');
const port = require('./services/port');
const port = normalizePort(config['Network']['port'] || '3000');
app.set('port', port);
/**
* Create HTTP server.
*/
let httpServer;
if (config['Network']['https']) {
const options = {
key: fs.readFileSync(config['Network']['keyPath']),
cert: fs.readFileSync(config['Network']['certPath'])
};
async function startTrilium() {
const usedPort = await port;
httpServer = https.createServer(options, app);
app.set('port', usedPort);
log.info("App HTTPS server starting up at port " + port);
}
else {
httpServer = http.createServer(app);
if (config['Network']['https']) {
const options = {
key: fs.readFileSync(config['Network']['keyPath']),
cert: fs.readFileSync(config['Network']['certPath'])
};
log.info("App HTTP server starting up at port " + port);
}
httpServer = https.createServer(options, app);
log.info(JSON.stringify(appInfo, null, 2));
log.info("App HTTPS server starting up at port " + usedPort);
}
else {
httpServer = http.createServer(app);
/**
* Listen on provided port, on all network interfaces.
*/
httpServer.keepAliveTimeout = 120000 * 5;
httpServer.listen(port);
httpServer.on('error', onError);
httpServer.on('listening', onListening);
sqlInit.dbReady.then(() => messagingService.init(httpServer, sessionParser));
if (utils.isElectron()) {
const electronRouting = require('./routes/electron');
electronRouting(app);
}
/**
* Normalize a port into a number, string, or false.
*/
function normalizePort(val) {
const port = parseInt(val, 10);
if (isNaN(port)) {
// named pipe
return val;
log.info("App HTTP server starting up at port " + usedPort);
}
if (port >= 0) {
// port number
return port;
}
log.info(JSON.stringify(appInfo, null, 2));
return false;
/**
* Listen on provided port, on all network interfaces.
*/
httpServer.keepAliveTimeout = 120000 * 5;
httpServer.listen(usedPort);
httpServer.on('error', onError);
httpServer.on('listening', () => debug('Listening on port' + httpServer.address().port));
sqlInit.dbReady.then(() => messagingService.init(httpServer, sessionParser));
if (utils.isElectron()) {
const electronRouting = require('./routes/electron');
electronRouting(app);
}
}
startTrilium();
/**
* Event listener for HTTP server "error" event.
*/
@ -91,36 +74,19 @@ function onError(error) {
throw error;
}
const bind = typeof port === 'string'
? 'Pipe ' + port
: 'Port ' + port;
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
console.error('Port requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
console.error('Port is already in use');
process.exit(1);
break;
default:
throw error;
}
}
/**
* Event listener for HTTP server "listening" event.
*/
function onListening() {
const addr = httpServer.address();
const bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
}