From af506f40edb1c9c339cc86baf40baccf2dc6da62 Mon Sep 17 00:00:00 2001 From: vantezzen Date: Fri, 18 Oct 2019 20:53:41 +0200 Subject: Develop local server feature --- src/electron/ipc-api/index.js | 2 ++ src/electron/ipc-api/localServer.js | 52 +++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 src/electron/ipc-api/localServer.js (limited to 'src/electron/ipc-api') diff --git a/src/electron/ipc-api/index.js b/src/electron/ipc-api/index.js index 3b7f31e4b..dcdef6b32 100644 --- a/src/electron/ipc-api/index.js +++ b/src/electron/ipc-api/index.js @@ -3,6 +3,7 @@ import settings from './settings'; import appIndicator from './appIndicator'; import download from './download'; import processManager from './processManager'; +import localServer from './localServer'; export default (params) => { settings(params); @@ -10,4 +11,5 @@ export default (params) => { appIndicator(params); download(params); processManager(params); + localServer(params); }; diff --git a/src/electron/ipc-api/localServer.js b/src/electron/ipc-api/localServer.js new file mode 100644 index 000000000..2f8f1020a --- /dev/null +++ b/src/electron/ipc-api/localServer.js @@ -0,0 +1,52 @@ +import { ipcMain, app } from 'electron'; +import path from 'path'; +import net from 'net'; +import startServer from '../../server/start'; + +const DEFAULT_PORT = 45569; + +const portInUse = function (port) { + return new Promise((resolve) => { + const server = net.createServer((socket) => { + socket.write('Echo server\r\n'); + socket.pipe(socket); + }); + + server.listen(port, '127.0.0.1'); + server.on('error', () => { + resolve(true); + }); + server.on('listening', () => { + server.close(); + resolve(false); + }); + }); +}; + +let localServerStarted = false; + +export default (params) => { + ipcMain.on('startLocalServer', () => { + if (!localServerStarted) { + // Find next unused port for server + let port = DEFAULT_PORT; + (async () => { + // eslint-disable-next-line no-await-in-loop + while (await portInUse(port) && port < DEFAULT_PORT + 10) { + port += 1; + } + console.log('Starting local server on port', port); + + startServer( + path.join(app.getPath('userData'), 'server.sqlite'), + port, + ); + + params.mainWindow.webContents.send('localServerPort', { + port, + }); + })(); + localServerStarted = true; + } + }); +}; -- cgit v1.2.3-70-g09d2