diff --git a/packages/api/src/controllers/connections.js b/packages/api/src/controllers/connections.js index a4a6eb7e1..cdaf3b0e7 100644 --- a/packages/api/src/controllers/connections.js +++ b/packages/api/src/controllers/connections.js @@ -27,7 +27,12 @@ module.exports = { }, test(req, res) { const subprocess = fork(process.argv[1], ['connectProcess']); - subprocess.on('message', (resp) => res.json(resp)); + subprocess.on('message', (resp) => { + const { msgtype } = res; + if (msgtype == 'connected' || msgtype == 'error') { + res.json(resp); + } + }); subprocess.send(req.body); }, diff --git a/packages/api/src/controllers/databaseConnections.js b/packages/api/src/controllers/databaseConnections.js index f4ef8ec6d..49378307f 100644 --- a/packages/api/src/controllers/databaseConnections.js +++ b/packages/api/src/controllers/databaseConnections.js @@ -24,6 +24,7 @@ module.exports = { resolve(response); delete this.requests[msgid]; }, + handle_ping() {}, async ensureOpened(conid, database) { const existing = this.opened.find((x) => x.conid == conid && x.database == database); diff --git a/packages/api/src/controllers/serverConnections.js b/packages/api/src/controllers/serverConnections.js index 8ba9e3c62..7dd16f226 100644 --- a/packages/api/src/controllers/serverConnections.js +++ b/packages/api/src/controllers/serverConnections.js @@ -14,6 +14,8 @@ module.exports = { handle_error(conid, { error }) { console.log(`Error in server connection ${conid}: ${error}`); }, + handle_ping() { + }, async ensureOpened(conid) { const existing = this.opened.find(x => x.conid == conid); diff --git a/packages/api/src/controllers/sessions.js b/packages/api/src/controllers/sessions.js index cc8e2a671..1482e523a 100644 --- a/packages/api/src/controllers/sessions.js +++ b/packages/api/src/controllers/sessions.js @@ -58,6 +58,8 @@ module.exports = { jsldata.notifyChangedStats(stats); }, + handle_ping() {}, + create_meta: 'post', async create({ conid, database }) { const sesid = uuidv1(); diff --git a/packages/api/src/proc/connectProcess.js b/packages/api/src/proc/connectProcess.js index 0f533da72..327da4f78 100644 --- a/packages/api/src/proc/connectProcess.js +++ b/packages/api/src/proc/connectProcess.js @@ -1,13 +1,15 @@ const engines = require('@dbgate/engines'); const driverConnect = require('../utility/driverConnect'); +const childProcessChecker = require('../utility/childProcessChecker'); function start() { - process.on('message', async connection => { + childProcessChecker(); + process.on('message', async (connection) => { try { const driver = engines(connection); const conn = await driverConnect(driver, connection); const res = await driver.getVersion(conn); - process.send(res); + process.send({ msgtype: 'connected', ...res }); } catch (e) { console.log(e); process.send({ msgtype: 'error', error: e.message }); diff --git a/packages/api/src/proc/databaseConnectionProcess.js b/packages/api/src/proc/databaseConnectionProcess.js index c80ded9ee..8e3ba92d1 100644 --- a/packages/api/src/proc/databaseConnectionProcess.js +++ b/packages/api/src/proc/databaseConnectionProcess.js @@ -1,5 +1,6 @@ const engines = require('@dbgate/engines'); const driverConnect = require('../utility/driverConnect'); +const childProcessChecker = require('../utility/childProcessChecker'); let systemConnection; let storedConnection; @@ -67,6 +68,7 @@ async function handleMessage({ msgtype, ...other }) { } function start() { + childProcessChecker(); process.on('message', async (message) => { try { await handleMessage(message); diff --git a/packages/api/src/proc/serverConnectionProcess.js b/packages/api/src/proc/serverConnectionProcess.js index bd4fb8f13..13ee8e087 100644 --- a/packages/api/src/proc/serverConnectionProcess.js +++ b/packages/api/src/proc/serverConnectionProcess.js @@ -1,5 +1,6 @@ const engines = require('@dbgate/engines'); const driverConnect = require('../utility/driverConnect'); +const childProcessChecker = require('../utility/childProcessChecker'); let systemConnection; let storedConnection; @@ -29,7 +30,8 @@ async function handleMessage({ msgtype, ...other }) { } function start() { - process.on('message', async message => { + childProcessChecker(); + process.on('message', async (message) => { try { await handleMessage(message); } catch (e) { diff --git a/packages/api/src/proc/sessionProcess.js b/packages/api/src/proc/sessionProcess.js index 67cc34a64..98198e601 100644 --- a/packages/api/src/proc/sessionProcess.js +++ b/packages/api/src/proc/sessionProcess.js @@ -3,6 +3,7 @@ const uuidv1 = require('uuid/v1'); const path = require('path'); const fs = require('fs'); const _ = require('lodash'); +const childProcessChecker = require('../utility/childProcessChecker'); const driverConnect = require('../utility/driverConnect'); const { jsldir } = require('../utility/directories'); @@ -132,6 +133,7 @@ async function handleMessage({ msgtype, ...other }) { } function start() { + childProcessChecker(); process.on('message', async (message) => { try { await handleMessage(message); diff --git a/packages/api/src/utility/childProcessChecker.js b/packages/api/src/utility/childProcessChecker.js new file mode 100644 index 000000000..1870897cc --- /dev/null +++ b/packages/api/src/utility/childProcessChecker.js @@ -0,0 +1,17 @@ +let counter = 0; + +function childProcessChecker() { + setInterval(() => { + try { + process.send({ msgtype: 'ping', counter: counter++ }); + } catch (ex) { + // This will come once parent dies. + // One way can be to check for error code ERR_IPC_CHANNEL_CLOSED + // and call process.exit() + console.log('parent died', ex.toString()); + process.exit(); + } + }, 1000); +} + +module.exports = childProcessChecker;