mirror of
https://github.com/appy-one/acebase.git
synced 2026-06-30 06:02:02 -06:00
Add config settings, no console logging
This commit is contained in:
parent
8daa2b3058
commit
a48341b9f6
1 changed files with 43 additions and 34 deletions
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue