@exyconn/common 2.3.3 → 2.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,7 +3,7 @@ export { StatusCode, StatusMessage, statusCode, statusMessage } from './enums/in
3
3
  export { LoggerConfig, createLogger, createMorganStream, logger, simpleLogger, stream } from './logger/index.mjs';
4
4
  export { DbConnectionOptions, connectDB, disconnectDB, getConnectionStatus } from './db/index.mjs';
5
5
  export { AuthRequest, BulkDeleteRequest, ColumnMeta, CrudConfig, JWTPayload, OrgRequest, PaginatedRequest, PaginatedResponse, PaginatedResult, PaginationMeta, ParsedQuery, SortConfig, SortOrder, authenticateApiKey, authenticateJWT, buildDeleteFilter, createBulkDeleteHandler, createCrudControllers, createPaginationMiddleware, extractOrganization, extractSchemaMeta, optionalAuthenticateJWT, parseBulkDelete, queryPagination, queryParser, requireOrganization } from './middleware/index.mjs';
6
- export { FilterOptions, PackageCheckResult, PackageJson, PackageVersion, PaginationOptions, PaginationResult, buildFilter, buildPagination, buildPaginationMeta, checkPackageServer, formatPackageCheckResult, generateNcuCommand, omitFields, packageCheckServer, pickFields, printPackageCheckSummary, sanitizeDocument, sanitizeUser } from './utils/index.mjs';
6
+ export { FilterOptions, HealthConfig, HealthResponse, PackageCheckResult, PackageJson, PackageVersion, PaginationOptions, PaginationResult, buildFilter, buildPagination, buildPaginationMeta, checkPackageServer, createHealthHandler, createRootHandler, formatPackageCheckResult, generateHealthResponse, generateNcuCommand, omitFields, packageCheckServer, pickFields, printPackageCheckSummary, sanitizeDocument, sanitizeUser } from './utils/index.mjs';
7
7
  export { AppConfig, AuthConfig, ConfigBuilder, CorsConfig, CorsOriginsConfig, DEFAULT_AUTH_CONFIG, DEFAULT_CORS_CONFIG, DEFAULT_CORS_ORIGINS, DEFAULT_DATABASE_CONFIG, DEFAULT_LOGGING_CONFIG, DEFAULT_RATE_LIMIT_CONFIG, DEFAULT_RATE_LIMIT_TIERS, DEFAULT_SERVER_CONFIG, DatabaseConfig, EXYCONN_CORS_CONFIG, Environment, LogLevel, LoggingConfig, PERMISSIVE_CORS_CONFIG, RATE_LIMIT_CONFIG, RateLimitConfig, RateLimitResponse, RateLimitTier, RateLimitTierConfig, RateLimiterBuilder, RateLimiterConfig, STRICT_CORS_CONFIG, ServerConfig, buildConfig, corsOptions, createApiKeyGenerator, createApiRateLimiter, createBrandCorsOptions, createConfig, createCorsOptions, createDdosRateLimiter, createMultiBrandCorsOptions, createPrefixedKeyGenerator, createRateLimiter, createStandardRateLimiter, createStrictRateLimiter, createUserKeyGenerator, ddosProtectionLimiter, defaultKeyGenerator, getDatabaseOptions, isDevelopment, isProduction, isTest, rateLimiter, standardRateLimiter, strictRateLimiter } from './configs/index.mjs';
8
8
  import 'express';
9
9
  import 'winston';
@@ -3,7 +3,7 @@ export { StatusCode, StatusMessage, statusCode, statusMessage } from './enums/in
3
3
  export { LoggerConfig, createLogger, createMorganStream, logger, simpleLogger, stream } from './logger/index.js';
4
4
  export { DbConnectionOptions, connectDB, disconnectDB, getConnectionStatus } from './db/index.js';
5
5
  export { AuthRequest, BulkDeleteRequest, ColumnMeta, CrudConfig, JWTPayload, OrgRequest, PaginatedRequest, PaginatedResponse, PaginatedResult, PaginationMeta, ParsedQuery, SortConfig, SortOrder, authenticateApiKey, authenticateJWT, buildDeleteFilter, createBulkDeleteHandler, createCrudControllers, createPaginationMiddleware, extractOrganization, extractSchemaMeta, optionalAuthenticateJWT, parseBulkDelete, queryPagination, queryParser, requireOrganization } from './middleware/index.js';
6
- export { FilterOptions, PackageCheckResult, PackageJson, PackageVersion, PaginationOptions, PaginationResult, buildFilter, buildPagination, buildPaginationMeta, checkPackageServer, formatPackageCheckResult, generateNcuCommand, omitFields, packageCheckServer, pickFields, printPackageCheckSummary, sanitizeDocument, sanitizeUser } from './utils/index.js';
6
+ export { FilterOptions, HealthConfig, HealthResponse, PackageCheckResult, PackageJson, PackageVersion, PaginationOptions, PaginationResult, buildFilter, buildPagination, buildPaginationMeta, checkPackageServer, createHealthHandler, createRootHandler, formatPackageCheckResult, generateHealthResponse, generateNcuCommand, omitFields, packageCheckServer, pickFields, printPackageCheckSummary, sanitizeDocument, sanitizeUser } from './utils/index.js';
7
7
  export { AppConfig, AuthConfig, ConfigBuilder, CorsConfig, CorsOriginsConfig, DEFAULT_AUTH_CONFIG, DEFAULT_CORS_CONFIG, DEFAULT_CORS_ORIGINS, DEFAULT_DATABASE_CONFIG, DEFAULT_LOGGING_CONFIG, DEFAULT_RATE_LIMIT_CONFIG, DEFAULT_RATE_LIMIT_TIERS, DEFAULT_SERVER_CONFIG, DatabaseConfig, EXYCONN_CORS_CONFIG, Environment, LogLevel, LoggingConfig, PERMISSIVE_CORS_CONFIG, RATE_LIMIT_CONFIG, RateLimitConfig, RateLimitResponse, RateLimitTier, RateLimitTierConfig, RateLimiterBuilder, RateLimiterConfig, STRICT_CORS_CONFIG, ServerConfig, buildConfig, corsOptions, createApiKeyGenerator, createApiRateLimiter, createBrandCorsOptions, createConfig, createCorsOptions, createDdosRateLimiter, createMultiBrandCorsOptions, createPrefixedKeyGenerator, createRateLimiter, createStandardRateLimiter, createStrictRateLimiter, createUserKeyGenerator, ddosProtectionLimiter, defaultKeyGenerator, getDatabaseOptions, isDevelopment, isProduction, isTest, rateLimiter, standardRateLimiter, strictRateLimiter } from './configs/index.js';
8
8
  import 'express';
9
9
  import 'winston';
@@ -2,19 +2,22 @@
2
2
 
3
3
  var winston = require('winston');
4
4
  var DailyRotateFile = require('winston-daily-rotate-file');
5
- var path = require('path');
5
+ var path2 = require('path');
6
6
  var mongoose = require('mongoose');
7
7
  var jwt = require('jsonwebtoken');
8
8
  var fs = require('fs');
9
+ var os = require('os');
9
10
  var rateLimit = require('express-rate-limit');
10
11
 
11
12
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
12
13
 
13
14
  var winston__default = /*#__PURE__*/_interopDefault(winston);
14
15
  var DailyRotateFile__default = /*#__PURE__*/_interopDefault(DailyRotateFile);
15
- var path__default = /*#__PURE__*/_interopDefault(path);
16
+ var path2__default = /*#__PURE__*/_interopDefault(path2);
16
17
  var mongoose__default = /*#__PURE__*/_interopDefault(mongoose);
17
18
  var jwt__default = /*#__PURE__*/_interopDefault(jwt);
19
+ var fs__default = /*#__PURE__*/_interopDefault(fs);
20
+ var os__default = /*#__PURE__*/_interopDefault(os);
18
21
  var rateLimit__default = /*#__PURE__*/_interopDefault(rateLimit);
19
22
 
20
23
  // src/server/enums/status.ts
@@ -227,7 +230,7 @@ var createLogger = (config = {}) => {
227
230
  }),
228
231
  // Combined logs (all levels)
229
232
  new DailyRotateFile__default.default({
230
- filename: path__default.default.join(finalConfig.logsDir, "combined-%DATE%.log"),
233
+ filename: path2__default.default.join(finalConfig.logsDir, "combined-%DATE%.log"),
231
234
  datePattern: "YYYY-MM-DD",
232
235
  maxSize: finalConfig.maxSize,
233
236
  maxFiles: finalConfig.maxFiles,
@@ -235,7 +238,7 @@ var createLogger = (config = {}) => {
235
238
  }),
236
239
  // Error logs only
237
240
  new DailyRotateFile__default.default({
238
- filename: path__default.default.join(finalConfig.logsDir, "error-%DATE%.log"),
241
+ filename: path2__default.default.join(finalConfig.logsDir, "error-%DATE%.log"),
239
242
  datePattern: "YYYY-MM-DD",
240
243
  level: "error",
241
244
  maxSize: finalConfig.maxSize,
@@ -1190,7 +1193,7 @@ async function loadPackageJson(source) {
1190
1193
  }
1191
1194
  return response.json();
1192
1195
  }
1193
- const filePath = path.resolve(source);
1196
+ const filePath = path2.resolve(source);
1194
1197
  if (!fs.existsSync(filePath)) {
1195
1198
  throw new Error(`File not found: ${filePath}`);
1196
1199
  }
@@ -1344,6 +1347,150 @@ var packageCheckServer = {
1344
1347
  generateNcuCommand,
1345
1348
  print: printPackageCheckSummary
1346
1349
  };
1350
+ var serverStartTime = Date.now();
1351
+ function getTimezoneOffset() {
1352
+ const offset = (/* @__PURE__ */ new Date()).getTimezoneOffset();
1353
+ const hours = Math.floor(Math.abs(offset) / 60);
1354
+ const minutes = Math.abs(offset) % 60;
1355
+ const sign = offset <= 0 ? "+" : "-";
1356
+ return `${sign}${hours.toString().padStart(2, "0")}:${minutes.toString().padStart(2, "0")}`;
1357
+ }
1358
+ function getTimezoneName() {
1359
+ try {
1360
+ return Intl.DateTimeFormat().resolvedOptions().timeZone;
1361
+ } catch {
1362
+ return "UTC";
1363
+ }
1364
+ }
1365
+ function getPackageInfo(criticalPackages = []) {
1366
+ try {
1367
+ const possiblePaths = [
1368
+ path2__default.default.join(process.cwd(), "package.json"),
1369
+ path2__default.default.join(__dirname, "..", "..", "..", "..", "package.json"),
1370
+ path2__default.default.join(__dirname, "..", "..", "package.json")
1371
+ ];
1372
+ for (const pkgPath of possiblePaths) {
1373
+ if (fs__default.default.existsSync(pkgPath)) {
1374
+ const pkg = JSON.parse(fs__default.default.readFileSync(pkgPath, "utf-8"));
1375
+ const deps = pkg.dependencies || {};
1376
+ const devDeps = pkg.devDependencies || {};
1377
+ const total = Object.keys(deps).length + Object.keys(devDeps).length;
1378
+ const critical = {};
1379
+ for (const pkgName of criticalPackages) {
1380
+ if (deps[pkgName]) {
1381
+ critical[pkgName] = deps[pkgName].replace("^", "").replace("~", "");
1382
+ }
1383
+ }
1384
+ return { total, critical };
1385
+ }
1386
+ }
1387
+ } catch {
1388
+ }
1389
+ return { total: 0, critical: {} };
1390
+ }
1391
+ async function generateHealthResponse(config) {
1392
+ const startTime = Date.now();
1393
+ const now = /* @__PURE__ */ new Date();
1394
+ let dependencies = {};
1395
+ if (config.checkDependencies) {
1396
+ try {
1397
+ dependencies = await config.checkDependencies();
1398
+ } catch {
1399
+ dependencies = { error: "DOWN" };
1400
+ }
1401
+ }
1402
+ const hasDownDep = Object.values(dependencies).includes("DOWN");
1403
+ const status = hasDownDep ? "DEGRADED" : "UP";
1404
+ const defaultCriticalPackages = ["express", "mongoose", "cors", "dotenv"];
1405
+ const packageInfo = getPackageInfo(config.criticalPackages || defaultCriticalPackages);
1406
+ const totalMem = os__default.default.totalmem();
1407
+ const freeMem = os__default.default.freemem();
1408
+ const usedMem = totalMem - freeMem;
1409
+ const isProduction2 = process.env.NODE_ENV === "production";
1410
+ const serverUrl = isProduction2 ? `https://${config.domain}` : `http://localhost:${config.port}`;
1411
+ const response = {
1412
+ status,
1413
+ app: config.name,
1414
+ env: process.env.NODE_ENV || "development",
1415
+ version: config.version,
1416
+ urls: {
1417
+ ...config.uiUrl && { ui: config.uiUrl },
1418
+ server: config.serverUrl || serverUrl,
1419
+ health: `${config.serverUrl || serverUrl}/health`
1420
+ },
1421
+ time: {
1422
+ serverTime: now.toISOString(),
1423
+ timezone: getTimezoneName(),
1424
+ offset: getTimezoneOffset(),
1425
+ epoch: Math.floor(now.getTime() / 1e3)
1426
+ },
1427
+ uptimeSec: Math.floor((Date.now() - serverStartTime) / 1e3),
1428
+ node: {
1429
+ version: process.version,
1430
+ platform: os__default.default.platform(),
1431
+ arch: os__default.default.arch()
1432
+ },
1433
+ system: {
1434
+ hostname: os__default.default.hostname(),
1435
+ memoryUsedMB: Math.round(usedMem / 1024 / 1024),
1436
+ memoryTotalMB: Math.round(totalMem / 1024 / 1024),
1437
+ memoryFreePercent: Math.round(freeMem / totalMem * 100),
1438
+ cpuLoad: os__default.default.loadavg().map((l) => Math.round(l * 100) / 100),
1439
+ cpuCount: os__default.default.cpus().length
1440
+ },
1441
+ packages: {
1442
+ appVersion: config.version,
1443
+ totalDependencies: packageInfo.total,
1444
+ critical: packageInfo.critical
1445
+ },
1446
+ dependencies,
1447
+ ...config.infra && { infra: config.infra },
1448
+ responseTimeMs: Date.now() - startTime
1449
+ };
1450
+ return response;
1451
+ }
1452
+ function createHealthHandler(config) {
1453
+ return async (_req, res) => {
1454
+ try {
1455
+ const health = await generateHealthResponse(config);
1456
+ const statusCode2 = health.status === "UP" ? 200 : health.status === "DEGRADED" ? 200 : 503;
1457
+ res.status(statusCode2).json(health);
1458
+ } catch (error) {
1459
+ res.status(503).json({
1460
+ status: "DOWN",
1461
+ app: config.name,
1462
+ env: process.env.NODE_ENV || "development",
1463
+ version: config.version,
1464
+ error: error instanceof Error ? error.message : "Unknown error",
1465
+ time: {
1466
+ serverTime: (/* @__PURE__ */ new Date()).toISOString(),
1467
+ timezone: getTimezoneName(),
1468
+ offset: getTimezoneOffset(),
1469
+ epoch: Math.floor(Date.now() / 1e3)
1470
+ }
1471
+ });
1472
+ }
1473
+ };
1474
+ }
1475
+ function createRootHandler(config) {
1476
+ return async (_req, res) => {
1477
+ try {
1478
+ const health = await generateHealthResponse(config);
1479
+ res.json({
1480
+ message: `Welcome to ${config.name}`,
1481
+ description: config.description || `${config.name} API Server`,
1482
+ ...config.endpoints && { endpoints: config.endpoints },
1483
+ ...health
1484
+ });
1485
+ } catch (error) {
1486
+ res.status(503).json({
1487
+ status: "DOWN",
1488
+ app: config.name,
1489
+ error: error instanceof Error ? error.message : "Unknown error"
1490
+ });
1491
+ }
1492
+ };
1493
+ }
1347
1494
 
1348
1495
  // src/server/configs/cors.config.ts
1349
1496
  var DEFAULT_CORS_CONFIG = {
@@ -2041,12 +2188,14 @@ exports.createConfig = createConfig;
2041
2188
  exports.createCorsOptions = createCorsOptions;
2042
2189
  exports.createCrudControllers = createCrudControllers;
2043
2190
  exports.createDdosRateLimiter = createDdosRateLimiter;
2191
+ exports.createHealthHandler = createHealthHandler;
2044
2192
  exports.createLogger = createLogger;
2045
2193
  exports.createMorganStream = createMorganStream;
2046
2194
  exports.createMultiBrandCorsOptions = createMultiBrandCorsOptions;
2047
2195
  exports.createPaginationMiddleware = createPaginationMiddleware;
2048
2196
  exports.createPrefixedKeyGenerator = createPrefixedKeyGenerator;
2049
2197
  exports.createRateLimiter = createRateLimiter;
2198
+ exports.createRootHandler = createRootHandler;
2050
2199
  exports.createStandardRateLimiter = createStandardRateLimiter;
2051
2200
  exports.createStrictRateLimiter = createStrictRateLimiter;
2052
2201
  exports.createUserKeyGenerator = createUserKeyGenerator;
@@ -2060,6 +2209,7 @@ exports.extractOrganization = extractOrganization;
2060
2209
  exports.extractSchemaMeta = extractSchemaMeta;
2061
2210
  exports.forbiddenResponse = forbiddenResponse;
2062
2211
  exports.formatPackageCheckResult = formatPackageCheckResult;
2212
+ exports.generateHealthResponse = generateHealthResponse;
2063
2213
  exports.generateNcuCommand = generateNcuCommand;
2064
2214
  exports.getConnectionStatus = getConnectionStatus;
2065
2215
  exports.getDatabaseOptions = getDatabaseOptions;