From e3fb80d4c5733bde3446451b70b0c5c30e597031 Mon Sep 17 00:00:00 2001 From: Ruslan Konviser Date: Mon, 29 Apr 2024 18:29:41 +0200 Subject: [PATCH] fix: detect correctly that API server is running in Desktop Server app --- packages/core/src/bootstrap/index.ts | 49 +++++++++---------- packages/desktop-api/src/main.ts | 7 ++- .../src/lib/server/service/api-service.ts | 4 ++ 3 files changed, 32 insertions(+), 28 deletions(-) diff --git a/packages/core/src/bootstrap/index.ts b/packages/core/src/bootstrap/index.ts index c039e9971b8..735ae115796 100644 --- a/packages/core/src/bootstrap/index.ts +++ b/packages/core/src/bootstrap/index.ts @@ -71,7 +71,7 @@ export async function bootstrap(pluginConfig?: Partial) // Create the NestJS application const app = await NestFactory.create(BootstrapModule, { logger: ['log', 'error', 'warn', 'debug', 'verbose'], // Set logging levels - bufferLogs: true, // Buffer logs to avoid loss during startup + bufferLogs: true // Buffer logs to avoid loss during startup }); // Register custom entity fields for Mikro ORM @@ -106,7 +106,8 @@ export async function bootstrap(pluginConfig?: Partial) origin: '*', methods: 'GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS', credentials: true, - allowedHeaders: 'Authorization, Language, Tenant-Id, Organization-Id, X-Requested-With, X-Auth-Token, X-HTTP-Method-Override, Content-Type, Content-Language, Accept, Accept-Language, Observe' + allowedHeaders: + 'Authorization, Language, Tenant-Id, Organization-Id, X-Requested-With, X-Auth-Token, X-HTTP-Method-Override, Content-Type, Content-Language, Accept, Accept-Language, Observe' }); // TODO: enable csurf is not good idea because it was deprecated. @@ -262,11 +263,16 @@ export async function bootstrap(pluginConfig?: Partial) await app.listen(port, host, () => { console.timeEnd('Application Bootstrap Time'); // End timing - console.log(chalk.magenta(`Server listening at http://${host}:${port}/${globalPrefix}`)); + + // Note: do not change this prefix because we may use it to detect the success message from the running server! + const successMessagePrefix = 'Listening at http'; + + const message = `${successMessagePrefix}://${host}:${port}/${globalPrefix}`; + console.log(chalk.magenta(message)); // Send message to parent process (desktop app) if (process.send) { - process.send(`Server started at http://${host}:${port}/${globalPrefix}`); + process.send(message); } if (env.demo) { @@ -303,9 +309,7 @@ function handleUnhandledRejection(reason: any, promise: Promise) { * @param config - The partial application configuration to be pre-bootstrapped. * @returns A promise that resolves to the pre-bootstrapped application configuration. */ -export async function registerPluginConfig( - config: Partial -): Promise { +export async function registerPluginConfig(config: Partial): Promise { // Apply pre-bootstrap operations and return the updated configuration return await preBootstrapApplicationConfig(config); } @@ -318,9 +322,7 @@ export async function registerPluginConfig( * @param applicationConfig - The initial application configuration. * @returns A promise that resolves to the final application configuration after pre-bootstrap operations. */ -export async function preBootstrapApplicationConfig( - applicationConfig: Partial -) { +export async function preBootstrapApplicationConfig(applicationConfig: Partial) { if (Object.keys(applicationConfig).length > 0) { // Set initial configuration if any properties are provided setConfig(applicationConfig); @@ -329,8 +331,8 @@ export async function preBootstrapApplicationConfig( // Configure migration settings setConfig({ dbConnectionOptions: { - ...getMigrationsSetting(), - }, + ...getMigrationsSetting() + } }); // Log the current database configuration (for debugging or informational purposes) @@ -344,12 +346,12 @@ export async function preBootstrapApplicationConfig( setConfig({ dbConnectionOptions: { entities: entities as Array>, // Core and plugin entities - subscribers: subscribers as Array>, // Core and plugin subscribers + subscribers: subscribers as Array> // Core and plugin subscribers }, dbMikroOrmConnectionOptions: { entities: entities as Array>, // MikroORM entities - subscribers: subscribers as Array, // MikroORM subscribers - }, + subscribers: subscribers as Array // MikroORM subscribers + } }); // Apply additional plugin configurations @@ -369,9 +371,7 @@ export async function preBootstrapApplicationConfig( * @param config - The initial application configuration to be modified. * @returns A promise that resolves to the updated application configuration. */ -async function preBootstrapPluginConfigurations( - config: ApplicationPluginConfig -): Promise { +async function preBootstrapPluginConfigurations(config: ApplicationPluginConfig): Promise { // Retrieve a list of plugin configuration functions based on the provided config const pluginConfigurations = getPluginConfigurations(config.plugins); @@ -395,9 +395,7 @@ async function preBootstrapPluginConfigurations( * @param config - Plugin configuration containing plugin entities. * @returns A promise that resolves to an array of registered entity types. */ -async function preBootstrapRegisterEntities( - config: Partial -): Promise>> { +async function preBootstrapRegisterEntities(config: Partial): Promise>> { try { // Retrieve the list of core entities const coreEntitiesList = coreEntities as Array>; @@ -412,7 +410,7 @@ async function preBootstrapRegisterEntities( // If a core entity has the same name as a plugin entity, throw a conflict exception if (coreEntitiesList.some((entity) => entity.name === entityName)) { throw new ConflictException({ - message: `Error: ${entityName} conflicts with default entities.`, + message: `Error: ${entityName} conflicts with default entities.` }); } @@ -453,7 +451,7 @@ async function preBootstrapRegisterSubscribers( if (subscribers.some((subscriber) => subscriber.name === subscriberName)) { // Throw an exception if there's a conflict throw new ConflictException({ - message: `Error: ${subscriberName} conflicts with default subscribers.`, + message: `Error: ${subscriberName} conflicts with default subscribers.` }); } else { // Add the new plugin subscriber to the list if no conflict @@ -469,7 +467,6 @@ async function preBootstrapRegisterSubscribers( } } - /** * Gets the migrations directory and CLI migration paths. * @@ -489,7 +486,7 @@ export function getMigrationsSetting() { return { migrations: [migrationsPath], // An array of migration file paths cli: { - migrationsDir: cliMigrationsDir, // Directory for CLI migrations - }, + migrationsDir: cliMigrationsDir // Directory for CLI migrations + } }; } diff --git a/packages/desktop-api/src/main.ts b/packages/desktop-api/src/main.ts index 1a0d1af8c53..bb8c5179d7b 100644 --- a/packages/desktop-api/src/main.ts +++ b/packages/desktop-api/src/main.ts @@ -12,7 +12,8 @@ async function bootstrap() { origin: '*', methods: 'GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS', credentials: true, - allowedHeaders: 'Authorization, Language, Tenant-Id, Organization-Id, X-Requested-With, X-Auth-Token, X-HTTP-Method-Override, Content-Type, Content-Language, Accept, Accept-Language, Observe' + allowedHeaders: + 'Authorization, Language, Tenant-Id, Organization-Id, X-Requested-With, X-Auth-Token, X-HTTP-Method-Override, Content-Type, Content-Language, Accept, Accept-Language, Observe' }); const globalPrefix = 'api'; @@ -22,7 +23,9 @@ async function bootstrap() { const port = environment.DESKTOP_API_DEFAULT_PORT; await app.listen(port, () => { - const message = 'Internal API listening at http://localhost:' + port + '/' + globalPrefix; + // Note: do not change this prefix because we may use it to detect the success message from the running server! + const successMessagePrefix = 'Listening at http'; + const message = `${successMessagePrefix}://localhost:${port}/${globalPrefix}`; Logger.log(message); }); } diff --git a/packages/desktop-libs/src/lib/server/service/api-service.ts b/packages/desktop-libs/src/lib/server/service/api-service.ts index 02f3c8f667e..c60545a55d0 100644 --- a/packages/desktop-libs/src/lib/server/service/api-service.ts +++ b/packages/desktop-libs/src/lib/server/service/api-service.ts @@ -9,8 +9,12 @@ export class ApiService extends ServerTask { readonly signal: AbortSignal ) { const args = { ...env, serviceName: 'api' }; + + // Note: do not change this prefix because we may use it to detect the success message from the running server! const successMessage = 'Listening at http'; + const errorMessage = 'Error running API server:'; + super(path, args, window, successMessage, errorMessage, signal); }