chore: add server settings

This commit is contained in:
Louis 2024-01-16 10:35:38 +07:00 committed by Faisal Amir
parent f5eaa41d09
commit 5975237a39
2 changed files with 89 additions and 9 deletions

View File

@ -28,6 +28,7 @@
"copy:assets": "cpx \"models/**\" \"electron/models/\" && cpx \"docs/openapi/**\" \"electron/docs/openapi\"", "copy:assets": "cpx \"models/**\" \"electron/models/\" && cpx \"docs/openapi/**\" \"electron/docs/openapi\"",
"dev:electron": "yarn copy:assets && yarn workspace jan dev", "dev:electron": "yarn copy:assets && yarn workspace jan dev",
"dev:web": "yarn workspace jan-web dev", "dev:web": "yarn workspace jan-web dev",
"dev:server": "yarn workspace @janhq/server dev",
"dev": "concurrently --kill-others \"yarn dev:web\" \"wait-on http://localhost:3000 && yarn dev:electron\"", "dev": "concurrently --kill-others \"yarn dev:web\" \"wait-on http://localhost:3000 && yarn dev:electron\"",
"test-local": "yarn lint && yarn build:test && yarn test", "test-local": "yarn lint && yarn build:test && yarn test",
"dev:uikit": "yarn workspace @janhq/uikit install && yarn workspace @janhq/uikit dev", "dev:uikit": "yarn workspace @janhq/uikit install && yarn workspace @janhq/uikit dev",

View File

@ -5,25 +5,62 @@ import path from "path";
import os from "os"; import os from "os";
// Load environment variables
dotenv.config(); dotenv.config();
// Define default settings
const JAN_API_HOST = process.env.JAN_API_HOST || "127.0.0.1"; const JAN_API_HOST = process.env.JAN_API_HOST || "127.0.0.1";
const JAN_API_PORT = Number.parseInt(process.env.JAN_API_PORT || "1337"); const JAN_API_PORT = Number.parseInt(process.env.JAN_API_PORT || "1337");
const serverLogPath = path.join(os.homedir(), "jan", "logs", "server.log"); const serverLogPath = path.join(os.homedir(), "jan", "logs", "server.log");
// Initialize server settings
let server: any | undefined = undefined; let server: any | undefined = undefined;
let hostSetting: string = JAN_API_HOST;
let portSetting: number = JAN_API_PORT;
let corsEnbaled: boolean = true;
let isVerbose: boolean = true;
export const startServer = async (schemaPath?: string, baseDir?: string) => { /**
* Function to start the server
* @param host - The host address for the server
* @param port - The port number for the server
* @param isCorsEnabled - Flag to enable or disable CORS
* @param isVerboseEnabled - Flag to enable or disable verbose logging
* @param schemaPath - Path to the OpenAPI schema file
* @param baseDir - Base directory for the OpenAPI schema file
*/
export const startServer = async (
host?: string,
port?: number,
isCorsEnabled?: boolean,
isVerboseEnabled?: boolean,
schemaPath?: string,
baseDir?: string
) => {
// Update server settings
isVerbose = isVerboseEnabled ?? true;
hostSetting = host ?? JAN_API_HOST;
portSetting = port ?? JAN_API_PORT;
corsEnbaled = isCorsEnabled ?? true;
// Start the server
try { try {
log(`[API]::Debug: Starting JAN API server...`, "server.log") // Log server start
if (isVerbose)
log(`[API]::Debug: Starting JAN API server...`, "server.log");
// Initialize Fastify server with logging
server = fastify({ server = fastify({
logger: { logger: {
level: "info", level: "info",
file: serverLogPath, file: serverLogPath,
}, },
}); });
await server.register(require("@fastify/cors"), {});
// Register CORS if enabled
if (corsEnbaled) await server.register(require("@fastify/cors"), {});
// Register Swagger for API documentation
await server.register(require("@fastify/swagger"), { await server.register(require("@fastify/swagger"), {
mode: "static", mode: "static",
specification: { specification: {
@ -32,6 +69,7 @@ export const startServer = async (schemaPath?: string, baseDir?: string) => {
}, },
}); });
// Register Swagger UI
await server.register(require("@fastify/swagger-ui"), { await server.register(require("@fastify/swagger-ui"), {
routePrefix: "/", routePrefix: "/",
baseDir: baseDir ?? path.join(__dirname, "../..", "./docs/openapi"), baseDir: baseDir ?? path.join(__dirname, "../..", "./docs/openapi"),
@ -43,6 +81,8 @@ export const startServer = async (schemaPath?: string, baseDir?: string) => {
transformSpecificationClone: true, transformSpecificationClone: true,
}); });
// Register static file serving for extensions
// TODO: Watch extension files changes and reload
await server.register( await server.register(
(childContext: any, _: any, done: any) => { (childContext: any, _: any, done: any) => {
childContext.register(require("@fastify/static"), { childContext.register(require("@fastify/static"), {
@ -56,25 +96,64 @@ export const startServer = async (schemaPath?: string, baseDir?: string) => {
}, },
{ prefix: "extensions" } { prefix: "extensions" }
); );
// Register API routes
await server.register(v1Router, { prefix: "/v1" }); await server.register(v1Router, { prefix: "/v1" });
// Start listening for requests
await server await server
.listen({ .listen({
port: JAN_API_PORT, port: hostSetting,
host: JAN_API_HOST, host: portSetting,
}) })
.then(() => { .then(() => {
log(`[API]::Debug: JAN API listening at: http://${JAN_API_HOST}:${JAN_API_PORT}`); // Log server listening
if (isVerbose)
log(
`[API]::Debug: JAN API listening at: http://${JAN_API_HOST}:${JAN_API_PORT}`
);
}); });
} catch (e) { } catch (e) {
log(`[API]::Error: ${e}`); // Log any errors
if (isVerbose) log(`[API]::Error: ${e}`);
} }
}; };
/**
* Function to stop the server
*/
export const stopServer = async () => { export const stopServer = async () => {
try { try {
log(`[API]::Debug: Server stopped`, "server.log") // Log server stop
if (isVerbose) log(`[API]::Debug: Server stopped`, "server.log");
// Stop the server
await server.close(); await server.close();
} catch (e) { } catch (e) {
log(`[API]::Error: ${e}`); // Log any errors
if (isVerbose) log(`[API]::Error: ${e}`);
} }
}; };
/**
* Function to check if CORS is enabled
* @returns - True if CORS is enabled, false otherwise
*/
export const isCorsEnabled = () => corsEnbaled;
/**
* Function to check if verbose logging is enabled
* @returns - True if verbose logging is enabled, false otherwise
*/
export const isVerboseEnabled = () => isVerbose;
/**
* Function to get the host setting
* @returns - The current host setting
*/
export const getHost = () => hostSetting;
/**
* Function to get the port setting
* @returns - The current port setting
*/
export const getPort = () => portSetting;