Add config settings, no console logging

This commit is contained in:
Ewout Stortenbeker 2023-05-01 17:17:56 +02:00
parent 8daa2b3058
commit a48341b9f6

View file

@ -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(/^(?<storagePath>.*([\\\/]))(?<dbName>.+)\.acebase\2(?<storageType>[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();
}
}