From a48341b9f689bfcd9f08e6a4ebe5e916a3435bd2 Mon Sep 17 00:00:00 2001 From: Ewout Stortenbeker Date: Mon, 1 May 2023 17:17:56 +0200 Subject: [PATCH] Add config settings, no console logging --- src/ipc/service/index.ts | 77 ++++++++++++++++++++++------------------ 1 file changed, 43 insertions(+), 34 deletions(-) diff --git a/src/ipc/service/index.ts b/src/ipc/service/index.ts index c057d01..c6fd53d 100644 --- a/src/ipc/service/index.ts +++ b/src/ipc/service/index.ts @@ -1,6 +1,7 @@ import { createServer, Socket } from 'net'; import { getSocketPath } from './shared'; -import { AceBase } from '../../'; +import { AceBase, type AceBaseLocalSettings } from '../../'; +import { DebugLogger } from 'acebase-core'; const ERROR = Object.freeze({ ALREADY_RUNNING: { code: 'already_running', exitCode: 2 }, @@ -8,19 +9,19 @@ const ERROR = Object.freeze({ NO_DB: { code: 'no_db', exitCode: 4 }, }); -export async function startServer(dbFile: string, exit: (code: number) => void) { - +export async function startServer(dbFile: string, options: { logLevel: AceBaseLocalSettings['logLevel'], maxIdleTime: number, exit: (code: number) => void }) { const fileMatch = dbFile.match(/^(?.*([\\\/]))(?.+)\.acebase\2(?[a-z]+)\.db$/); if (!fileMatch) { - return exit(ERROR.NO_DB.exitCode); + return options.exit(ERROR.NO_DB.exitCode); } const { storagePath, dbName, storageType } = fileMatch.groups; + const logger = new DebugLogger(options.logLevel, `[IPC service ${dbName}:${storageType}]`); let db: AceBase; // Will be opened when listening const sockets = [] as Socket[]; const socketPath = getSocketPath(dbFile); - console.log(`starting socket server on path ${socketPath}`); + logger.log(`[starting socket server on path ${socketPath}`); const server = createServer(); server.listen({ @@ -31,55 +32,51 @@ export async function startServer(dbFile: string, exit: (code: number) => void) server.on('listening', () => { // Started successful - // state = STATE.STARTED; - // process.send(`state:${state}`); process.on('SIGINT', () => server.close()); process.on('exit', (code) => { - console.log(`exiting with code ${code}`); + logger.log(`exiting with code ${code}`); }); // Start the "master" IPC client - db = new AceBase(dbName, { storage: { type: storageType, path: storagePath, ipc: server } }); - // Bind socket server to the instance - // (db.api.storage.ipc as IPCSocketPeer).server = server; + db = new AceBase(dbName, { logLevel: options.logLevel, storage: { type: storageType, path: storagePath, ipc: server } }); }); server.on('error', (err: Error & { code: string }) => { - // state = STATE.ERROR; - // process.send(`state:${state}`); - // process.send(`error:${err.code ?? err.message}`); if (err.code === 'EADDRINUSE') { - console.log('socket server already running'); - return exit(ERROR.ALREADY_RUNNING.exitCode); + logger.log(`socket server already running`); + return options.exit(ERROR.ALREADY_RUNNING.exitCode); } - console.error(`socket server error ${err.code ?? err.message}`); - exit(ERROR.UNKNOWN.exitCode); + logger.error(`socket server error ${err.code ?? err.message}`); + options.exit(ERROR.UNKNOWN.exitCode); }); + let connectionsMade = false; server.on('connection', (socket) => { // New socket connected handler + connectionsMade = true; sockets.push(socket); - console.log(`socket connected, total: ${sockets.length}`); - - // socket.on('data', (data) => { - // // Received data from a connected client (master or worker) - // // Socket IPC implementation handles this - // }); + logger.log(`socket connected, total: ${sockets.length}`); socket.on('close', (hadError) => { // Socket is closed sockets.splice(sockets.indexOf(socket), 1); - console.log(`socket disconnected${hadError ? ' because of an error' : ''}, total: ${sockets.length}`); + logger.log(`socket disconnected${hadError ? ' because of an error' : ''}, total: ${sockets.length}`); if (sockets.length === 0) { - // setTimeout(() => { - // if (sockets.length === 0) { - console.log(`closing server socket because there are no more connected clients, exiting with code 0`); - // Stop socket server - server.close((err) => { - exit(0); - }); - // } - // }, 5000); + const stop = () => { + logger.log(`closing server socket because there are no more connected clients, exiting with code 0`); + // Stop socket server + server.close((err) => { + options.exit(err ? ERROR.UNKNOWN.exitCode : 0); + }); + }; + if (options.maxIdleTime > 0) { + setTimeout(() => { + if (sockets.length === 0) { stop(); } + }, 5000); + } + else { + stop(); + } } }); }); @@ -87,4 +84,16 @@ export async function startServer(dbFile: string, exit: (code: number) => void) server.on('close', () => { db.close(); }); + + if (options.maxIdleTime > 0) { + setTimeout(() => { + if (!connectionsMade) { + logger.log(`closing server socket because no clients connected, exiting with code 0`); + // Stop socket server + server.close((err) => { + options.exit(err ? ERROR.UNKNOWN.exitCode : 0); + }); + } + }, options.maxIdleTime).unref(); + } }