handleFieldChange('filesCron', value)}
placeholder='0 0 */2 * * *'
- description='Cron expression for file cleanup schedule (6 fields: second minute hour day month day_of_week)'
+ description='Cron expression for cleaning up expired cached files and temporary data (6 fields: second minute hour day month day_of_week)'
error={getFieldError(CONFIG_PATHS.filesCron)}
/>
handleFieldChange('documentsCron', value)}
placeholder='0 0 */2 * * *'
- description='Cron expression for document cleanup schedule (6 fields: second minute hour day month day_of_week)'
+ description='Cron expression for auto-saving documents with pending changes and cleaning up expired user presence data (6 fields: second minute hour day month day_of_week)'
error={getFieldError(CONFIG_PATHS.documentsCron)}
/>
handleFieldChange('files', value)}
placeholder='3600'
- description='Time in seconds after which files expire and can be cleaned up'
+ description='How long to keep cached files before marking them as expired and eligible for cleanup (default: 86400 = 24 hours)'
min='0'
error={getFieldError(CONFIG_PATHS.files)}
/>
diff --git a/AdminPanel/client/src/pages/Login/LoginPage.js b/AdminPanel/client/src/pages/Login/LoginPage.js
index dae9d841..d1423255 100644
--- a/AdminPanel/client/src/pages/Login/LoginPage.js
+++ b/AdminPanel/client/src/pages/Login/LoginPage.js
@@ -46,6 +46,7 @@ export default function Login() {
onChange={setTenantName}
placeholder='Enter your tenant name'
description='The name of your tenant organization'
+ error={error}
onKeyDown={handleKeyDown}
/>
diff --git a/AdminPanel/server/sources/server.js b/AdminPanel/server/sources/server.js
index 54e392e7..f743d963 100644
--- a/AdminPanel/server/sources/server.js
+++ b/AdminPanel/server/sources/server.js
@@ -107,3 +107,6 @@ app.use((err, req, res, _next) => {
server.listen(port, () => {
operationContext.global.logger.warn('AdminPanel server listening on port %d', port);
});
+
+//after all required modules in all files
+moduleReloader.finalizeConfigWithRuntime();
diff --git a/Common/sources/moduleReloader.js b/Common/sources/moduleReloader.js
index 47c1390b..4426cc35 100644
--- a/Common/sources/moduleReloader.js
+++ b/Common/sources/moduleReloader.js
@@ -50,6 +50,10 @@ function reloadNpmModule(moduleName) {
}
}
+// Backup original NODE_CONFIG to avoid growing environment
+const prevNodeConfig = process.env.NODE_CONFIG;
+let nodeConfigOverridden = false;
+
/**
* Requires config module with runtime configuration support.
* Temporarily sets NODE_CONFIG for reload, then restores environment to prevent E2BIG.
@@ -59,10 +63,6 @@ function reloadNpmModule(moduleName) {
function requireConfigWithRuntime(opt_additionalConfig) {
let config = require('config');
- // Backup original NODE_CONFIG to avoid growing environment
- const prevNodeConfig = process.env.NODE_CONFIG;
- let nodeConfigOverridden = false;
-
try {
const configFilePath = config.get('runtimeConfig.filePath');
if (configFilePath) {
@@ -88,20 +88,23 @@ function requireConfigWithRuntime(opt_additionalConfig) {
if (err.code !== 'ENOENT') {
console.error('Failed to load runtime config: %s', err.stack);
}
- } finally {
- // Restore original NODE_CONFIG to keep env small and avoid E2BIG on Windows/pkg
- if (nodeConfigOverridden) {
- if (typeof prevNodeConfig === 'undefined') {
- delete process.env.NODE_CONFIG;
- } else {
- process.env.NODE_CONFIG = prevNodeConfig;
- }
- }
}
return config;
}
+function finalizeConfigWithRuntime() {
+ // Restore original NODE_CONFIG to keep env small and avoid E2BIG on Windows/pkg
+ if (nodeConfigOverridden) {
+ if (typeof prevNodeConfig === 'undefined') {
+ delete process.env.NODE_CONFIG;
+ } else {
+ process.env.NODE_CONFIG = prevNodeConfig;
+ }
+ }
+}
+
module.exports = {
reloadNpmModule,
- requireConfigWithRuntime
+ requireConfigWithRuntime,
+ finalizeConfigWithRuntime
};
diff --git a/DocService/sources/server.js b/DocService/sources/server.js
index 4bdbb4b4..5c55ddb8 100644
--- a/DocService/sources/server.js
+++ b/DocService/sources/server.js
@@ -509,3 +509,6 @@ process.on('uncaughtException', err => {
process.exit(1);
});
});
+
+//after all required modules in all files
+moduleReloader.finalizeConfigWithRuntime();
diff --git a/DocService/sources/utilsDocService.js b/DocService/sources/utilsDocService.js
index 3d748f81..10eed828 100644
--- a/DocService/sources/utilsDocService.js
+++ b/DocService/sources/utilsDocService.js
@@ -66,7 +66,7 @@ function initializeSharp() {
}
});
}
-
+
if (sharp) {
// todo test.
// Set concurrency to 2 for better performance
diff --git a/FileConverter/sources/convertermaster.js b/FileConverter/sources/convertermaster.js
index ce3e9809..62571f32 100644
--- a/FileConverter/sources/convertermaster.js
+++ b/FileConverter/sources/convertermaster.js
@@ -33,10 +33,10 @@
'use strict';
const cluster = require('cluster');
-const logger = require('./../../Common/sources/logger');
-const operationContext = require('./../../Common/sources/operationContext');
const moduleReloader = require('./../../Common/sources/moduleReloader');
const config = moduleReloader.requireConfigWithRuntime();
+const logger = require('./../../Common/sources/logger');
+const operationContext = require('./../../Common/sources/operationContext');
if (cluster.isMaster) {
const fs = require('fs');
@@ -104,3 +104,6 @@ process.on('uncaughtException', err => {
process.exit(1);
});
});
+
+//after all required modules in all files
+moduleReloader.finalizeConfigWithRuntime();