fiberx-backend-toolkit 0.0.10 → 0.0.12
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.
|
@@ -80,14 +80,14 @@ declare class SecureHeadersMiddleWare {
|
|
|
80
80
|
constructor(options?: SecureHeadersOptions);
|
|
81
81
|
private getDefaultContentSecurityPolicy;
|
|
82
82
|
private getContentSecurityPolicyString;
|
|
83
|
-
|
|
83
|
+
middleWare(req: Request, res: Response, next: NextFunction): Promise<void | Response>;
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
declare class RequestLoggerMiddleWare {
|
|
87
87
|
private name;
|
|
88
88
|
private logger;
|
|
89
89
|
constructor();
|
|
90
|
-
|
|
90
|
+
middleWare(req: Request, res: Response, next: NextFunction): Promise<void | Response>;
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
declare class ResponseFormatterMiddleWare {
|
|
@@ -99,8 +99,9 @@ declare class ResponseFormatterMiddleWare {
|
|
|
99
99
|
private readonly default_info_message;
|
|
100
100
|
private readonly default_not_found_message;
|
|
101
101
|
constructor(options?: ResponseFormatterOptions);
|
|
102
|
-
|
|
103
|
-
|
|
102
|
+
handle404ErrorMiddleWare(req: Request, res: Response, next: NextFunction): Promise<void | Response>;
|
|
103
|
+
handleGeneralErrorMiddleWare(error: unknown, req: Request, res: Response, _next: NextFunction): Promise<void | Response>;
|
|
104
|
+
middleWare(req: Request, res: Response, next: NextFunction): Promise<void | Response>;
|
|
104
105
|
}
|
|
105
106
|
|
|
106
107
|
export { CookieManagerMiddleWare, CorsMiddleWare, HTTPSEnforcementMiddleWare, RateLimiterMiddleWare, RequestLoggerMiddleWare, ResponseFormatterMiddleWare, SecureHeadersMiddleWare };
|
|
@@ -313,7 +313,7 @@ var SecureHeadersMiddleWare = class {
|
|
|
313
313
|
getContentSecurityPolicyString(policy) {
|
|
314
314
|
return Object.entries(policy).map(([key, value]) => `${key} ${value.join(" ")}`).join("; ");
|
|
315
315
|
}
|
|
316
|
-
async
|
|
316
|
+
async middleWare(req, res, next) {
|
|
317
317
|
if (!this.enabled) {
|
|
318
318
|
return next();
|
|
319
319
|
}
|
|
@@ -345,7 +345,7 @@ var SecureHeadersMiddleWare = class {
|
|
|
345
345
|
};
|
|
346
346
|
__decorateClass([
|
|
347
347
|
safe_execute_util_default.safeExecuteThrow("secure_headers_middle_ware")
|
|
348
|
-
], SecureHeadersMiddleWare.prototype, "
|
|
348
|
+
], SecureHeadersMiddleWare.prototype, "middleWare", 1);
|
|
349
349
|
var secure_headers_middle_ware_default = SecureHeadersMiddleWare;
|
|
350
350
|
|
|
351
351
|
// src/middle_ware/request_logger_middle_ware.ts
|
|
@@ -355,7 +355,7 @@ var RequestLoggerMiddleWare = class {
|
|
|
355
355
|
constructor() {
|
|
356
356
|
safe_execute_util_default.setNamedInstance(this.name, this);
|
|
357
357
|
}
|
|
358
|
-
async
|
|
358
|
+
async middleWare(req, res, next) {
|
|
359
359
|
const origin = req.headers.origin || (req.headers.referer ? new URL(req.headers.referer).origin : "unknown");
|
|
360
360
|
const device_id = req.headers["x-device-id"] || "unknown";
|
|
361
361
|
const device_name = req.headers["x-device-name"] || "unknown";
|
|
@@ -372,7 +372,7 @@ var RequestLoggerMiddleWare = class {
|
|
|
372
372
|
};
|
|
373
373
|
__decorateClass([
|
|
374
374
|
safe_execute_util_default.safeExecuteThrow("request_logger_middle_ware")
|
|
375
|
-
], RequestLoggerMiddleWare.prototype, "
|
|
375
|
+
], RequestLoggerMiddleWare.prototype, "middleWare", 1);
|
|
376
376
|
var request_logger_middle_ware_default = RequestLoggerMiddleWare;
|
|
377
377
|
|
|
378
378
|
// src/middle_ware/response_formatter_middle_ware.ts
|
|
@@ -392,10 +392,10 @@ var ResponseFormatterMiddleWare = class {
|
|
|
392
392
|
this.default_not_found_message = options.default_not_found_message ?? "invalid_request_resource_not_found";
|
|
393
393
|
safe_execute_util_default.setNamedInstance(this.name, this);
|
|
394
394
|
}
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
395
|
+
async handle404ErrorMiddleWare(req, res, next) {
|
|
396
|
+
return res.status(404).json({ status: "error", msg: this.default_not_found_message });
|
|
397
|
+
}
|
|
398
|
+
async handleGeneralErrorMiddleWare(error, req, res, _next) {
|
|
399
399
|
const is_development = input_validator_util_default.isDevelopment();
|
|
400
400
|
const error_message = error instanceof Error ? error.message : String(error);
|
|
401
401
|
const error_stack = error instanceof Error ? { stack: error.stack } : void 0;
|
|
@@ -404,8 +404,8 @@ var ResponseFormatterMiddleWare = class {
|
|
|
404
404
|
res.locals.error = is_development ? error : {};
|
|
405
405
|
this.logger.error(`[${this.name}] Unhandled error for request ${request_id} Message ${error_message}`, { error_stack, error });
|
|
406
406
|
return res.status(500).json({ status: "error", code: 500, msg: this.default_error_message });
|
|
407
|
-
}
|
|
408
|
-
|
|
407
|
+
}
|
|
408
|
+
async middleWare(req, res, next) {
|
|
409
409
|
res.errResponse = (code = 500, msg = this.default_error_message, data = []) => {
|
|
410
410
|
return res.status(code).json({ status: "error", msg, data });
|
|
411
411
|
};
|
|
@@ -423,7 +423,13 @@ var ResponseFormatterMiddleWare = class {
|
|
|
423
423
|
};
|
|
424
424
|
__decorateClass([
|
|
425
425
|
safe_execute_util_default.safeExecuteThrow("response_formatter_middle_ware")
|
|
426
|
-
], ResponseFormatterMiddleWare.prototype, "
|
|
426
|
+
], ResponseFormatterMiddleWare.prototype, "handle404ErrorMiddleWare", 1);
|
|
427
|
+
__decorateClass([
|
|
428
|
+
safe_execute_util_default.safeExecuteThrow("response_formatter_middle_ware")
|
|
429
|
+
], ResponseFormatterMiddleWare.prototype, "handleGeneralErrorMiddleWare", 1);
|
|
430
|
+
__decorateClass([
|
|
431
|
+
safe_execute_util_default.safeExecuteThrow("response_formatter_middle_ware")
|
|
432
|
+
], ResponseFormatterMiddleWare.prototype, "middleWare", 1);
|
|
427
433
|
var response_formatter_middle_ware_default = ResponseFormatterMiddleWare;
|
|
428
434
|
export {
|
|
429
435
|
cookie_manager_middle_ware_default as CookieManagerMiddleWare,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/middle_ware/cookie_manager_middle_ware.ts","../../src/middle_ware/cors_middle_ware.ts","../../src/middle_ware/rate_limiter_middle_ware.ts","../../src/middle_ware/https_enforcement_middle_ware.ts","../../src/middle_ware/secure_headers_middle_ware.ts","../../src/middle_ware/request_logger_middle_ware.ts","../../src/middle_ware/response_formatter_middle_ware.ts"],"sourcesContent":["import crypto from \"crypto\";\nimport {\n Request,\n Response,\n NextFunction,\n CookieOptions\n} from \"express\";\n\nimport {\n InputValidatorUtil,\n LoggerUtil,\n SafeExecuteUtil\n} from \"@/utils\";\n\nimport { CookieManagerOptions } from \"@/types/middle_ware_type\";\n\nimport { REQUEST_ID_COOKIE_MAX_AGE } from \"@/config/constants\";\n\nclass CookieManagerMiddleWare {\n private name = \"cookie_manager_middle_ware\";\n private logger = new LoggerUtil(this.name);\n private readonly default_cookie_options: CookieOptions = this.getDefaultCookieOptions();\n private request_id_max_age: number;\n private request_id_generator: () => string\n\n constructor(options: CookieManagerOptions = {}) {\n this.request_id_max_age = options?.request_id_max_age || REQUEST_ID_COOKIE_MAX_AGE;\n this.request_id_generator = options?.request_id_generator || crypto.randomUUID;\n \n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // Method to get default cookie options\n private getDefaultCookieOptions (): CookieOptions {\n return {\n httpOnly: true,\n sameSite: \"strict\",\n path: \"/\",\n secure: InputValidatorUtil.isProduction(),\n };\n }\n\n /** Get cookie value safely */\n public get(req: Request, name: string): string | undefined {\n return req.cookies?.[name];\n }\n\n /** Set cookie with enforced defaults */\n public set(\n res: Response,\n name: string,\n value: string,\n options: { max_age?: number; } = {}\n ): void {\n const cookie_options = { ...this.default_cookie_options, maxAge: options.max_age, }\n res.cookie( name, value, cookie_options );\n }\n\n /** Clear cookie */\n public clear(res: Response, name: string): void {\n res.clearCookie(name, this.default_cookie_options);\n }\n\n /** Middleware */\n @SafeExecuteUtil.safeExecuteThrow(\"cookie_manager_middle_ware\")\n public async middleWare(\n req: Request, \n res: Response, \n next: NextFunction\n ): Promise<void | Response> {\n // Attach helpers\n req.getCookie = (name: string) => this.get(req, name);\n req.setCookie = (name, value, options = {}) => this.set(res, name, value, options);\n req.clearCookie = (name) => this.clear(res, name);\n\n // Request ID handling\n let request_id = req.getCookie(\"request_id\");\n\n if (!request_id) {\n request_id = this.request_id_generator();\n\n this.set( res, \"request_id\", request_id, { max_age: this.request_id_max_age } );\n\n res.setHeader(\"X-Request-Id\", request_id);\n\n this.logger.info(`Generated request_id: ${request_id}`);\n }\n\n this.logger.info(`[REQ:${request_id}] ${req.method} ${req.originalUrl}`);\n\n req.request_id = request_id;\n\n return next();\n }\n}\n\nexport default CookieManagerMiddleWare;\n","import { \n Request, \n Response, \n NextFunction \n} from \"express\";\n\nimport { \n CORS_ALLOWED_METHODS,\n CORS_ALLOWED_HEADERS,\n CORS_MAX_AGE_IN_SECONDS,\n CORS_MAX_AGE_IN_MICRO_SECONDS\n} from \"@/config/constants\";\n\nimport {\n SafeExecuteUtil,\n LoggerUtil,\n InMemoryCache\n} from \"@/utils\"\n\nimport { \n CorsOptions, \n CorsOriginResolver \n} from \"@/types/middle_ware_type\";\n\n\nclass CorsMiddleWare {\n private name = \"cors_middle_ware\";\n private logger: LoggerUtil = new LoggerUtil(this.name);\n private origin_cache: InMemoryCache = new InMemoryCache<boolean>();\n private origins: string[];\n private methods: string[];\n private headers: string[];\n private credentials: boolean;\n private max_age: number;\n private allow_null_origin: boolean\n private origin_resolver: CorsOriginResolver | null;\n\n constructor(options: CorsOptions = {}) {\n this.origins = options.origins || [];\n this.methods = options.methods ?? CORS_ALLOWED_METHODS;\n this.headers = options.headers ?? CORS_ALLOWED_HEADERS;\n this.credentials = options.credentials ?? true;\n this.max_age = options.max_age ?? CORS_MAX_AGE_IN_SECONDS\n this.allow_null_origin = options.allow_null_origin ?? false,\n this.origin_resolver = options?.origin_resolver || null;\n\n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // Method for Origin resolution logic\n @SafeExecuteUtil.safeExecuteReturn(\"cors_middle_ware\", [])\n private async resolveAllowedOrigins(): Promise<string[]> {\n if(Array.isArray(this.origins) && this.origins.length) {\n return this.origins\n }\n else if (this.origin_resolver && typeof this.origin_resolver === \"function\") {\n const result = await this.origin_resolver();\n return Array.isArray(result) ? result : [];\n\n }\n \n return [];\n }\n\n // Method to validate origin\n @SafeExecuteUtil.safeExecuteReturn(\"cors_middle_ware\", false)\n private async isValidOrigin(origin: string): Promise<boolean> {\n if (!origin) { return this.allow_null_origin; }\n\n // Cached\n if (this.origin_cache.has(origin)) { return true; }\n\n // Function validator\n else if (this.origin_resolver && typeof this.origin_resolver === \"function\") {\n const result = await this.origin_resolver(origin);\n\n if (typeof result === \"boolean\") {\n if (result) { \n this.origin_cache.set(origin, true, CORS_MAX_AGE_IN_MICRO_SECONDS); \n }\n return result;\n }\n }\n\n // List validator\n const allowed = await this.resolveAllowedOrigins();\n const is_valid = allowed.includes(origin);\n\n if (is_valid) { \n this.origin_cache.set(origin, true, CORS_MAX_AGE_IN_MICRO_SECONDS); \n }\n\n return is_valid;\n }\n\n // -------------------------\n // Origin detection\n // -------------------------\n\n @SafeExecuteUtil.safeExecuteReturn(\"cors_middle_ware\", \"unknown\")\n public async getRequestOrigin(req: Request): Promise<string> {\n const { headers, protocol } = req;\n\n if(headers?.origin) { return headers?.origin }\n\n else if(headers?.referer) { return new URL(headers.referer).origin }\n\n return `${protocol}://${req?.get('host')}` ;\n }\n\n // -------------------------\n // Middleware\n // -------------------------\n\n @SafeExecuteUtil.safeExecuteThrow(\"cors_middle_ware\")\n public async middleWare (\n req: Request,\n res: Response,\n next: NextFunction\n ): Promise<void | Response> {\n const origin = await this.getRequestOrigin(req);\n const is_allowed = await this.isValidOrigin(origin);\n\n res.setHeader(\"Vary\", \"Origin\");\n\n if (!is_allowed) {\n this.logger.error(`Blocked CORS request from origin: ${origin}`);\n return res.status(403).json({ status: \"error\", code: 403, msg: \"cors_blocked\" });\n }\n\n res.setHeader(\"Access-Control-Allow-Origin\", origin);\n res.setHeader(\"Access-Control-Allow-Methods\", this.methods.join(\",\"));\n res.setHeader(\"Access-Control-Allow-Headers\", this.headers.join(\",\"));\n\n if (this.credentials) {\n res.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\n }\n\n if (this.max_age) {\n res.setHeader( \"Access-Control-Max-Age\", this.max_age.toString());\n }\n\n if (req.method === \"OPTIONS\") {\n return res.sendStatus(204);\n }\n\n return next();\n };\n}\n\nexport default CorsMiddleWare;\n","import { \n Request, \n Response, \n NextFunction \n} from \"express\";\n\nimport {\n SafeExecuteUtil,\n LoggerUtil,\n InMemoryCache\n} from \"@/utils\"\n\nimport { \n RateLimitRecord,\n RateLimiterOptions\n} from \"@/types/middle_ware_type\";\n\nimport { \n REQUEST_RATE_LIMITTER_OPTIONS \n} from \"@/config/constants\";\n\n\n\nclass RateLimiterMiddleWare {\n public readonly name = \"rate_limiter_middle_ware\";\n\n private window_ms: number;\n private max_requests: number;\n private message: string;\n private cache: InMemoryCache<RateLimitRecord>;\n private logger: LoggerUtil;\n private key_generator: Function;\n\n constructor(options: RateLimiterOptions = {}) {\n this.window_ms = options?.window_ms ?? REQUEST_RATE_LIMITTER_OPTIONS.window_ms;\n this.max_requests = options?.max_requests ?? REQUEST_RATE_LIMITTER_OPTIONS.max_requests;\n this.message = options.message ?? REQUEST_RATE_LIMITTER_OPTIONS.message;\n this.key_generator = options?.key_generator || this.generateRequestIdentitfier\n\n this.cache = new InMemoryCache<RateLimitRecord>();\n this.logger = new LoggerUtil(this.name);\n\n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // Method to help generate request key\n private generateRequestIdentitfier (req: Request): string {\n return req?.request_id || req?.clientIp || req?.ip || \"unknown\";\n }\n\n // Method to reset seconds counter\n private getResetSeconds(expires_at: number): number {\n return Math.max(Math.ceil((expires_at - Date.now()) / 1000), 0);\n }\n\n @SafeExecuteUtil.safeExecuteThrow(\"rate_limiter_middle_ware\")\n public async middleWare(\n req: Request,\n res: Response,\n next: NextFunction\n ): Promise<void | Response> {\n const key = this.key_generator(req);\n const now = Date.now();\n\n let record = this.cache.get(key);\n\n if (!record) {\n record = {\n count: 1,\n expires_at: now + this.window_ms,\n };\n\n this.cache.set(key, record, this.window_ms);\n } \n else {\n record.count++;\n this.cache.update(key, record);\n }\n\n const remaining = Math.max(this.max_requests - record.count, 0);\n const reset_seconds = this.getResetSeconds(record.expires_at);\n\n // RFC-ish headers\n res.setHeader(\"X-RateLimit-Limit\", this.max_requests);\n res.setHeader(\"X-RateLimit-Remaining\", remaining);\n res.setHeader(\"X-RateLimit-Reset\", reset_seconds);\n\n if (record.count > this.max_requests) {\n this.logger.alert(`⚠️ Rate limit exceeded for key: ${key} (retry in ${reset_seconds}s)`);\n\n res.setHeader(\"Retry-After\", reset_seconds);\n\n return res.status(429).json({\n status: \"error\",\n code: 429,\n msg: \"rate_limit_exceeded\",\n data: {\n message: this.message,\n retry_after: `${reset_seconds}s`,\n },\n });\n }\n\n return next();\n };\n\n}\n\nexport default RateLimiterMiddleWare;\n\n\n\n\n","\nimport { \n Request, \n Response, \n NextFunction \n} from \"express\";\n\nimport {\n SafeExecuteUtil,\n LoggerUtil,\n InputValidatorUtil,\n} from \"@/utils\"\n\nimport { ForceHTTPSOptions } from \"@/types/middle_ware_type\";\n\nclass HTTPSEnforcementMiddleWare {\n private name = \"https_enforcement_middle_ware\";\n private logger: LoggerUtil = new LoggerUtil(this.name);\n private readonly enabled?: boolean;\n private readonly redirect_status?: number;\n private readonly trust_proxy?: boolean;\n\n constructor(options: ForceHTTPSOptions = {}) {\n this.enabled = options.enabled ?? !InputValidatorUtil.isDevelopment();\n this.redirect_status = options?.redirect_status ?? 301;\n this.trust_proxy = options.trust_proxy ?? true\n\n\n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // -------------------------\n // Middleware\n // -------------------------\n\n @SafeExecuteUtil.safeExecuteThrow(\"https_enforcement_middle_ware\")\n public async middleWare (\n req: Request,\n res: Response,\n next: NextFunction\n ): Promise<void | Response> {\n if (!this.enabled) { return next(); }\n\n const is_secure = req.secure || (this.trust_proxy && req.headers[\"x-forwarded-proto\"] === \"https\");\n\n if (is_secure) { return next(); }\n\n const host = req.headers.host;\n const url = req.originalUrl;\n const redirect_status = this.redirect_status || 301;\n\n this.logger.alert(`Redirecting HTTP → HTTPS: ${url}`);\n\n return res.redirect(redirect_status, `https://${host}${url}`);\n }\n \n\n}\n\nexport default HTTPSEnforcementMiddleWare","\nimport { \n Request, \n Response, \n NextFunction \n} from \"express\";\n\nimport {\n SafeExecuteUtil,\n LoggerUtil,\n InputValidatorUtil,\n} from \"@/utils\"\n\nimport { SecureHeadersOptions } from \"@/types/middle_ware_type\";\n\nclass SecureHeadersMiddleWare {\n private name = \"secure_headers_middle_ware\";\n private logger: LoggerUtil = new LoggerUtil(this.name);\n private readonly enabled?: boolean;\n private readonly HSTS_enabled?: boolean;\n private readonly HSTS_max_age?: number;\n private readonly frame_options: \"DENY\" | \"SAMEORIGIN\";\n private readonly xss_protection?: boolean;\n private readonly content_type_options?: boolean;\n private readonly referrer_policy: string;\n private readonly content_security_policy: Record<string, string[]>;\n private readonly HSTS_Extras: string;\n private readonly cors_policy: string;\n private readonly cors_opener_policy: string;\n\n constructor(options: SecureHeadersOptions = {}) {\n this.enabled = options.enabled ?? true;\n this.HSTS_enabled = options?.HSTS_enabled ?? InputValidatorUtil.isProduction();\n this.HSTS_max_age = options?.HSTS_max_age ?? 63072000;\n this.frame_options = options?.frame_options ?? \"SAMEORIGIN\";\n this.xss_protection = options?.xss_protection ?? true;\n this.content_type_options = options?.content_type_options ?? true;\n this.referrer_policy = options?.referrer_policy ?? \"no-referrer-when-downgrade\";\n this.content_security_policy = options?.content_security_policy ?? this.getDefaultContentSecurityPolicy(),\n this.HSTS_Extras = options?.HSTS_Extras ?? \"includeSubDomains; preload;\";\n this.cors_policy = options?.cors_policy ?? \"same-origin\";\n this.cors_opener_policy = options?.cors_opener_policy ?? \"same-origin\";\n\n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // Method to get default content security policy\n private getDefaultContentSecurityPolicy (): Record<string, string[]> {\n return {\n \"default-src\": [\"'self'\"],\n \"object-src\": [\"'none'\"],\n \"script-src\": [\"'self'\"],\n \"style-src\": [\"'self'\", \"https://fonts.googleapis.com\"],\n \"font-src\": [\"'self'\", \"https://fonts.gstatic.com\"],\n \"img-src\": [\"'self'\"],\n \"connect-src\": [\"'self'\"],\n \"base-uri\": [\"'self'\"],\n \"frame-ancestors\": [\"'self'\"],\n };\n }\n\n // Method to convert content security policy object to string\n private getContentSecurityPolicyString(\n policy: Record<string, string[]>\n ): string {\n return Object.entries(policy)\n .map(([key, value]) => `${key} ${value.join(\" \")}`)\n .join(\"; \");\n }\n\n // -------------------------\n // Middleware\n // -------------------------\n\n @SafeExecuteUtil.safeExecuteThrow(\"secure_headers_middle_ware\")\n public async middleware (\n req: Request,\n res: Response,\n next: NextFunction\n ): Promise<void | Response> {\n if (!this.enabled) { return next(); }\n\n // Prevent XSS\n if (this.xss_protection) {\n res.setHeader(\"X-XSS-Protection\", \"1; mode=block\");\n }\n else {\n res.setHeader(\"X-XSS-Protection\", \"0\");\n }\n\n // Prevent MIME-type sniffing\n if (this.content_type_options) {\n res.setHeader(\"X-Content-Type-Options\", \"nosniff\");\n }\n\n // Disable framing (clickjacking protection)\n res.setHeader(\"X-Frame-Options\", this.frame_options);\n res.setHeader(\"Referrer-Policy\", this.referrer_policy);\n\n if(this.cors_policy) {\n res.setHeader(\"Cross-Origin-Resource-Policy\", this.cors_policy);\n }\n\n if(this.cors_opener_policy) {\n res.setHeader(\"Cross-Origin-Opener-Policy\", this.cors_opener_policy);\n }\n\n // Content Security Policy\n if (this.content_security_policy) {\n const content_security_policy_string = this.getContentSecurityPolicyString(this.content_security_policy);\n res.setHeader(\"Content-Security-Policy\", content_security_policy_string);\n }\n\n if (this.HSTS_enabled) {\n res.setHeader(\"Strict-Transport-Security\", `max-age=${this.HSTS_max_age}; ${this.HSTS_Extras}`);\n }\n\n return next();\n }\n \n}\n\nexport default SecureHeadersMiddleWare","\n\nimport { \n Request, \n Response, \n NextFunction \n} from \"express\";\n\nimport {\n SafeExecuteUtil,\n LoggerUtil,\n} from \"@/utils\"\n\n\nclass RequestLoggerMiddleWare {\n private name = \"request_logger_middle_ware\";\n private logger: LoggerUtil = new LoggerUtil(this.name);\n\n\n constructor() {\n\n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // -------------------------\n // Middleware\n // -------------------------\n\n @SafeExecuteUtil.safeExecuteThrow(\"request_logger_middle_ware\")\n public async middleware (\n req: Request,\n res: Response,\n next: NextFunction\n ): Promise<void | Response> {\n const origin = req.headers.origin || (req.headers.referer ? new URL(req.headers.referer).origin : \"unknown\");\n const device_id = req.headers[\"x-device-id\"] || \"unknown\";\n const device_name = req.headers[\"x-device-name\"] || \"unknown\";\n const user_agent = req.headers[\"user-agent\"] || \"unknown\";\n const request_id = req.cookies?.request_id ?? null;\n const ip = req.clientIp || req.ip || \"unknown\";\n\n this.logger.info(`[${this.name}] ${req.method} ${req.originalUrl}`);\n this.logger.info(`[${this.name}] Origin: ${origin}, Host: ${req.get(\"host\")}`);\n this.logger.info(`[${this.name}] Device ID: ${device_id}, Device Name: ${device_name}`);\n this.logger.info(`[${this.name}] Request ID: ${request_id}, IP: ${ip}`);\n this.logger.info(`[${this.name}] User-Agent: ${user_agent}`);\n\n return next();\n }\n \n\n}\n\nexport default RequestLoggerMiddleWare","import { Request, Response, NextFunction } from \"express\";\nimport { SafeExecuteUtil, LoggerUtil, InputValidatorUtil } from \"@/utils\";\nimport { EnvConfigInterface } from \"@/types/util_type\";\nimport { ResponseFormatterOptions } from \"@/types/middle_ware_type\";\n\nclass ResponseFormatterMiddleWare {\n private readonly name = \"response_formatter_middle_ware\";\n private readonly logger: LoggerUtil = new LoggerUtil(this.name);;\n\n private readonly include_request_id: boolean;\n private readonly default_success_message: string;\n private readonly default_error_message: string;\n private readonly default_info_message: string;\n private readonly default_not_found_message: string;\n\n constructor(options: ResponseFormatterOptions = {}) {\n this.include_request_id = options.include_request_id ?? true;\n this.default_success_message = options.default_success_message ?? \"operation_successful\";\n this.default_error_message = options.default_error_message ?? \"server_error\";\n this.default_info_message = options.default_info_message ?? \"operation_information\";\n this.default_not_found_message = options.default_not_found_message ?? \"invalid_request_resource_not_found\";\n\n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // -------------------------\n // Express error middleware\n // -------------------------\n public handleGeneralError = (\n error: unknown,\n req: Request,\n res: Response,\n _next: NextFunction\n ): Response => {\n const is_development = InputValidatorUtil.isDevelopment();\n const error_message = error instanceof Error ? error.message : String(error);\n const error_stack = error instanceof Error ? { stack: error.stack } : undefined;\n const request_id = req.request_id\n\n res.locals.message = error_message;\n res.locals.error = is_development ? error : {};\n\n this.logger.error(`[${this.name}] Unhandled error for request ${request_id} Message ${error_message}`, { error_stack, error });\n\n return res.status(500).json({ status: \"error\", code: 500, msg: this.default_error_message });\n };\n\n // -------------------------\n // Middleware\n // -------------------------\n @SafeExecuteUtil.safeExecuteThrow(\"response_formatter_middle_ware\")\n public responseFormatterMiddleWare(\n req: Request,\n res: Response,\n next: NextFunction\n ): void {\n\n // Generic error response\n res.errResponse = (code = 500, msg = this.default_error_message, data: any = []) => {\n return res.status(code).json({ status: \"error\", msg, data });\n };\n\n // Generic success response\n res.successResponse = (code = 200, msg = this.default_success_message, data: any = []) => {\n return res.status(code).json({ status: \"success\", msg, data });\n };\n\n // Informational response\n res.infoResponse = (code = 200, msg = this.default_info_message, data: any = []) => {\n return res.status(code).json({ status: \"info\", msg, data });\n };\n\n // 404 handler\n res.handle404Error = () => {\n return res.status(404).json({ status: \"error\", msg: this.default_not_found_message });\n };\n\n next();\n }\n\n}\n\nexport default ResponseFormatterMiddleWare;\n\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/middle_ware/cookie_manager_middle_ware.ts","../../src/middle_ware/cors_middle_ware.ts","../../src/middle_ware/rate_limiter_middle_ware.ts","../../src/middle_ware/https_enforcement_middle_ware.ts","../../src/middle_ware/secure_headers_middle_ware.ts","../../src/middle_ware/request_logger_middle_ware.ts","../../src/middle_ware/response_formatter_middle_ware.ts"],"sourcesContent":["import crypto from \"crypto\";\nimport {\n Request,\n Response,\n NextFunction,\n CookieOptions\n} from \"express\";\n\nimport {\n InputValidatorUtil,\n LoggerUtil,\n SafeExecuteUtil\n} from \"@/utils\";\n\nimport { CookieManagerOptions } from \"@/types/middle_ware_type\";\n\nimport { REQUEST_ID_COOKIE_MAX_AGE } from \"@/config/constants\";\n\nclass CookieManagerMiddleWare {\n private name = \"cookie_manager_middle_ware\";\n private logger = new LoggerUtil(this.name);\n private readonly default_cookie_options: CookieOptions = this.getDefaultCookieOptions();\n private request_id_max_age: number;\n private request_id_generator: () => string\n\n constructor(options: CookieManagerOptions = {}) {\n this.request_id_max_age = options?.request_id_max_age || REQUEST_ID_COOKIE_MAX_AGE;\n this.request_id_generator = options?.request_id_generator || crypto.randomUUID;\n \n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // Method to get default cookie options\n private getDefaultCookieOptions (): CookieOptions {\n return {\n httpOnly: true,\n sameSite: \"strict\",\n path: \"/\",\n secure: InputValidatorUtil.isProduction(),\n };\n }\n\n /** Get cookie value safely */\n public get(req: Request, name: string): string | undefined {\n return req.cookies?.[name];\n }\n\n /** Set cookie with enforced defaults */\n public set(\n res: Response,\n name: string,\n value: string,\n options: { max_age?: number; } = {}\n ): void {\n const cookie_options = { ...this.default_cookie_options, maxAge: options.max_age, }\n res.cookie( name, value, cookie_options );\n }\n\n /** Clear cookie */\n public clear(res: Response, name: string): void {\n res.clearCookie(name, this.default_cookie_options);\n }\n\n /** Middleware */\n @SafeExecuteUtil.safeExecuteThrow(\"cookie_manager_middle_ware\")\n public async middleWare(\n req: Request, \n res: Response, \n next: NextFunction\n ): Promise<void | Response> {\n // Attach helpers\n req.getCookie = (name: string) => this.get(req, name);\n req.setCookie = (name, value, options = {}) => this.set(res, name, value, options);\n req.clearCookie = (name) => this.clear(res, name);\n\n // Request ID handling\n let request_id = req.getCookie(\"request_id\");\n\n if (!request_id) {\n request_id = this.request_id_generator();\n\n this.set( res, \"request_id\", request_id, { max_age: this.request_id_max_age } );\n\n res.setHeader(\"X-Request-Id\", request_id);\n\n this.logger.info(`Generated request_id: ${request_id}`);\n }\n\n this.logger.info(`[REQ:${request_id}] ${req.method} ${req.originalUrl}`);\n\n req.request_id = request_id;\n\n return next();\n }\n}\n\nexport default CookieManagerMiddleWare;\n","import { \n Request, \n Response, \n NextFunction \n} from \"express\";\n\nimport { \n CORS_ALLOWED_METHODS,\n CORS_ALLOWED_HEADERS,\n CORS_MAX_AGE_IN_SECONDS,\n CORS_MAX_AGE_IN_MICRO_SECONDS\n} from \"@/config/constants\";\n\nimport {\n SafeExecuteUtil,\n LoggerUtil,\n InMemoryCache\n} from \"@/utils\"\n\nimport { \n CorsOptions, \n CorsOriginResolver \n} from \"@/types/middle_ware_type\";\n\n\nclass CorsMiddleWare {\n private name = \"cors_middle_ware\";\n private logger: LoggerUtil = new LoggerUtil(this.name);\n private origin_cache: InMemoryCache = new InMemoryCache<boolean>();\n private origins: string[];\n private methods: string[];\n private headers: string[];\n private credentials: boolean;\n private max_age: number;\n private allow_null_origin: boolean\n private origin_resolver: CorsOriginResolver | null;\n\n constructor(options: CorsOptions = {}) {\n this.origins = options.origins || [];\n this.methods = options.methods ?? CORS_ALLOWED_METHODS;\n this.headers = options.headers ?? CORS_ALLOWED_HEADERS;\n this.credentials = options.credentials ?? true;\n this.max_age = options.max_age ?? CORS_MAX_AGE_IN_SECONDS\n this.allow_null_origin = options.allow_null_origin ?? false,\n this.origin_resolver = options?.origin_resolver || null;\n\n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // Method for Origin resolution logic\n @SafeExecuteUtil.safeExecuteReturn(\"cors_middle_ware\", [])\n private async resolveAllowedOrigins(): Promise<string[]> {\n if(Array.isArray(this.origins) && this.origins.length) {\n return this.origins\n }\n else if (this.origin_resolver && typeof this.origin_resolver === \"function\") {\n const result = await this.origin_resolver();\n return Array.isArray(result) ? result : [];\n\n }\n \n return [];\n }\n\n // Method to validate origin\n @SafeExecuteUtil.safeExecuteReturn(\"cors_middle_ware\", false)\n private async isValidOrigin(origin: string): Promise<boolean> {\n if (!origin) { return this.allow_null_origin; }\n\n // Cached\n if (this.origin_cache.has(origin)) { return true; }\n\n // Function validator\n else if (this.origin_resolver && typeof this.origin_resolver === \"function\") {\n const result = await this.origin_resolver(origin);\n\n if (typeof result === \"boolean\") {\n if (result) { \n this.origin_cache.set(origin, true, CORS_MAX_AGE_IN_MICRO_SECONDS); \n }\n return result;\n }\n }\n\n // List validator\n const allowed = await this.resolveAllowedOrigins();\n const is_valid = allowed.includes(origin);\n\n if (is_valid) { \n this.origin_cache.set(origin, true, CORS_MAX_AGE_IN_MICRO_SECONDS); \n }\n\n return is_valid;\n }\n\n // -------------------------\n // Origin detection\n // -------------------------\n\n @SafeExecuteUtil.safeExecuteReturn(\"cors_middle_ware\", \"unknown\")\n public async getRequestOrigin(req: Request): Promise<string> {\n const { headers, protocol } = req;\n\n if(headers?.origin) { return headers?.origin }\n\n else if(headers?.referer) { return new URL(headers.referer).origin }\n\n return `${protocol}://${req?.get('host')}` ;\n }\n\n // -------------------------\n // Middleware\n // -------------------------\n\n @SafeExecuteUtil.safeExecuteThrow(\"cors_middle_ware\")\n public async middleWare (\n req: Request,\n res: Response,\n next: NextFunction\n ): Promise<void | Response> {\n const origin = await this.getRequestOrigin(req);\n const is_allowed = await this.isValidOrigin(origin);\n\n res.setHeader(\"Vary\", \"Origin\");\n\n if (!is_allowed) {\n this.logger.error(`Blocked CORS request from origin: ${origin}`);\n return res.status(403).json({ status: \"error\", code: 403, msg: \"cors_blocked\" });\n }\n\n res.setHeader(\"Access-Control-Allow-Origin\", origin);\n res.setHeader(\"Access-Control-Allow-Methods\", this.methods.join(\",\"));\n res.setHeader(\"Access-Control-Allow-Headers\", this.headers.join(\",\"));\n\n if (this.credentials) {\n res.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\n }\n\n if (this.max_age) {\n res.setHeader( \"Access-Control-Max-Age\", this.max_age.toString());\n }\n\n if (req.method === \"OPTIONS\") {\n return res.sendStatus(204);\n }\n\n return next();\n };\n}\n\nexport default CorsMiddleWare;\n","import { \n Request, \n Response, \n NextFunction \n} from \"express\";\n\nimport {\n SafeExecuteUtil,\n LoggerUtil,\n InMemoryCache\n} from \"@/utils\"\n\nimport { \n RateLimitRecord,\n RateLimiterOptions\n} from \"@/types/middle_ware_type\";\n\nimport { \n REQUEST_RATE_LIMITTER_OPTIONS \n} from \"@/config/constants\";\n\n\n\nclass RateLimiterMiddleWare {\n public readonly name = \"rate_limiter_middle_ware\";\n\n private window_ms: number;\n private max_requests: number;\n private message: string;\n private cache: InMemoryCache<RateLimitRecord>;\n private logger: LoggerUtil;\n private key_generator: Function;\n\n constructor(options: RateLimiterOptions = {}) {\n this.window_ms = options?.window_ms ?? REQUEST_RATE_LIMITTER_OPTIONS.window_ms;\n this.max_requests = options?.max_requests ?? REQUEST_RATE_LIMITTER_OPTIONS.max_requests;\n this.message = options.message ?? REQUEST_RATE_LIMITTER_OPTIONS.message;\n this.key_generator = options?.key_generator || this.generateRequestIdentitfier\n\n this.cache = new InMemoryCache<RateLimitRecord>();\n this.logger = new LoggerUtil(this.name);\n\n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // Method to help generate request key\n private generateRequestIdentitfier (req: Request): string {\n return req?.request_id || req?.clientIp || req?.ip || \"unknown\";\n }\n\n // Method to reset seconds counter\n private getResetSeconds(expires_at: number): number {\n return Math.max(Math.ceil((expires_at - Date.now()) / 1000), 0);\n }\n\n @SafeExecuteUtil.safeExecuteThrow(\"rate_limiter_middle_ware\")\n public async middleWare(\n req: Request,\n res: Response,\n next: NextFunction\n ): Promise<void | Response> {\n const key = this.key_generator(req);\n const now = Date.now();\n\n let record = this.cache.get(key);\n\n if (!record) {\n record = {\n count: 1,\n expires_at: now + this.window_ms,\n };\n\n this.cache.set(key, record, this.window_ms);\n } \n else {\n record.count++;\n this.cache.update(key, record);\n }\n\n const remaining = Math.max(this.max_requests - record.count, 0);\n const reset_seconds = this.getResetSeconds(record.expires_at);\n\n // RFC-ish headers\n res.setHeader(\"X-RateLimit-Limit\", this.max_requests);\n res.setHeader(\"X-RateLimit-Remaining\", remaining);\n res.setHeader(\"X-RateLimit-Reset\", reset_seconds);\n\n if (record.count > this.max_requests) {\n this.logger.alert(`⚠️ Rate limit exceeded for key: ${key} (retry in ${reset_seconds}s)`);\n\n res.setHeader(\"Retry-After\", reset_seconds);\n\n return res.status(429).json({\n status: \"error\",\n code: 429,\n msg: \"rate_limit_exceeded\",\n data: {\n message: this.message,\n retry_after: `${reset_seconds}s`,\n },\n });\n }\n\n return next();\n };\n\n}\n\nexport default RateLimiterMiddleWare;\n\n\n\n\n","\nimport { \n Request, \n Response, \n NextFunction \n} from \"express\";\n\nimport {\n SafeExecuteUtil,\n LoggerUtil,\n InputValidatorUtil,\n} from \"@/utils\"\n\nimport { ForceHTTPSOptions } from \"@/types/middle_ware_type\";\n\nclass HTTPSEnforcementMiddleWare {\n private name = \"https_enforcement_middle_ware\";\n private logger: LoggerUtil = new LoggerUtil(this.name);\n private readonly enabled?: boolean;\n private readonly redirect_status?: number;\n private readonly trust_proxy?: boolean;\n\n constructor(options: ForceHTTPSOptions = {}) {\n this.enabled = options.enabled ?? !InputValidatorUtil.isDevelopment();\n this.redirect_status = options?.redirect_status ?? 301;\n this.trust_proxy = options.trust_proxy ?? true\n\n\n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // -------------------------\n // Middleware\n // -------------------------\n\n @SafeExecuteUtil.safeExecuteThrow(\"https_enforcement_middle_ware\")\n public async middleWare (\n req: Request,\n res: Response,\n next: NextFunction\n ): Promise<void | Response> {\n if (!this.enabled) { return next(); }\n\n const is_secure = req.secure || (this.trust_proxy && req.headers[\"x-forwarded-proto\"] === \"https\");\n\n if (is_secure) { return next(); }\n\n const host = req.headers.host;\n const url = req.originalUrl;\n const redirect_status = this.redirect_status || 301;\n\n this.logger.alert(`Redirecting HTTP → HTTPS: ${url}`);\n\n return res.redirect(redirect_status, `https://${host}${url}`);\n }\n \n\n}\n\nexport default HTTPSEnforcementMiddleWare","\nimport { \n Request, \n Response, \n NextFunction \n} from \"express\";\n\nimport {\n SafeExecuteUtil,\n LoggerUtil,\n InputValidatorUtil,\n} from \"@/utils\"\n\nimport { SecureHeadersOptions } from \"@/types/middle_ware_type\";\n\nclass SecureHeadersMiddleWare {\n private name = \"secure_headers_middle_ware\";\n private logger: LoggerUtil = new LoggerUtil(this.name);\n private readonly enabled?: boolean;\n private readonly HSTS_enabled?: boolean;\n private readonly HSTS_max_age?: number;\n private readonly frame_options: \"DENY\" | \"SAMEORIGIN\";\n private readonly xss_protection?: boolean;\n private readonly content_type_options?: boolean;\n private readonly referrer_policy: string;\n private readonly content_security_policy: Record<string, string[]>;\n private readonly HSTS_Extras: string;\n private readonly cors_policy: string;\n private readonly cors_opener_policy: string;\n\n constructor(options: SecureHeadersOptions = {}) {\n this.enabled = options.enabled ?? true;\n this.HSTS_enabled = options?.HSTS_enabled ?? InputValidatorUtil.isProduction();\n this.HSTS_max_age = options?.HSTS_max_age ?? 63072000;\n this.frame_options = options?.frame_options ?? \"SAMEORIGIN\";\n this.xss_protection = options?.xss_protection ?? true;\n this.content_type_options = options?.content_type_options ?? true;\n this.referrer_policy = options?.referrer_policy ?? \"no-referrer-when-downgrade\";\n this.content_security_policy = options?.content_security_policy ?? this.getDefaultContentSecurityPolicy(),\n this.HSTS_Extras = options?.HSTS_Extras ?? \"includeSubDomains; preload;\";\n this.cors_policy = options?.cors_policy ?? \"same-origin\";\n this.cors_opener_policy = options?.cors_opener_policy ?? \"same-origin\";\n\n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // Method to get default content security policy\n private getDefaultContentSecurityPolicy (): Record<string, string[]> {\n return {\n \"default-src\": [\"'self'\"],\n \"object-src\": [\"'none'\"],\n \"script-src\": [\"'self'\"],\n \"style-src\": [\"'self'\", \"https://fonts.googleapis.com\"],\n \"font-src\": [\"'self'\", \"https://fonts.gstatic.com\"],\n \"img-src\": [\"'self'\"],\n \"connect-src\": [\"'self'\"],\n \"base-uri\": [\"'self'\"],\n \"frame-ancestors\": [\"'self'\"],\n };\n }\n\n // Method to convert content security policy object to string\n private getContentSecurityPolicyString(\n policy: Record<string, string[]>\n ): string {\n return Object.entries(policy)\n .map(([key, value]) => `${key} ${value.join(\" \")}`)\n .join(\"; \");\n }\n\n // -------------------------\n // Middleware\n // -------------------------\n\n @SafeExecuteUtil.safeExecuteThrow(\"secure_headers_middle_ware\")\n public async middleWare (\n req: Request,\n res: Response,\n next: NextFunction\n ): Promise<void | Response> {\n if (!this.enabled) { return next(); }\n\n // Prevent XSS\n if (this.xss_protection) {\n res.setHeader(\"X-XSS-Protection\", \"1; mode=block\");\n }\n else {\n res.setHeader(\"X-XSS-Protection\", \"0\");\n }\n\n // Prevent MIME-type sniffing\n if (this.content_type_options) {\n res.setHeader(\"X-Content-Type-Options\", \"nosniff\");\n }\n\n // Disable framing (clickjacking protection)\n res.setHeader(\"X-Frame-Options\", this.frame_options);\n res.setHeader(\"Referrer-Policy\", this.referrer_policy);\n\n if(this.cors_policy) {\n res.setHeader(\"Cross-Origin-Resource-Policy\", this.cors_policy);\n }\n\n if(this.cors_opener_policy) {\n res.setHeader(\"Cross-Origin-Opener-Policy\", this.cors_opener_policy);\n }\n\n // Content Security Policy\n if (this.content_security_policy) {\n const content_security_policy_string = this.getContentSecurityPolicyString(this.content_security_policy);\n res.setHeader(\"Content-Security-Policy\", content_security_policy_string);\n }\n\n if (this.HSTS_enabled) {\n res.setHeader(\"Strict-Transport-Security\", `max-age=${this.HSTS_max_age}; ${this.HSTS_Extras}`);\n }\n\n return next();\n }\n \n}\n\nexport default SecureHeadersMiddleWare","\n\nimport { \n Request, \n Response, \n NextFunction \n} from \"express\";\n\nimport {\n SafeExecuteUtil,\n LoggerUtil,\n} from \"@/utils\"\n\n\nclass RequestLoggerMiddleWare {\n private name = \"request_logger_middle_ware\";\n private logger: LoggerUtil = new LoggerUtil(this.name);\n\n\n constructor() {\n\n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // -------------------------\n // Middleware\n // -------------------------\n\n @SafeExecuteUtil.safeExecuteThrow(\"request_logger_middle_ware\")\n public async middleWare (\n req: Request,\n res: Response,\n next: NextFunction\n ): Promise<void | Response> {\n const origin = req.headers.origin || (req.headers.referer ? new URL(req.headers.referer).origin : \"unknown\");\n const device_id = req.headers[\"x-device-id\"] || \"unknown\";\n const device_name = req.headers[\"x-device-name\"] || \"unknown\";\n const user_agent = req.headers[\"user-agent\"] || \"unknown\";\n const request_id = req.cookies?.request_id ?? null;\n const ip = req.clientIp || req.ip || \"unknown\";\n\n this.logger.info(`[${this.name}] ${req.method} ${req.originalUrl}`);\n this.logger.info(`[${this.name}] Origin: ${origin}, Host: ${req.get(\"host\")}`);\n this.logger.info(`[${this.name}] Device ID: ${device_id}, Device Name: ${device_name}`);\n this.logger.info(`[${this.name}] Request ID: ${request_id}, IP: ${ip}`);\n this.logger.info(`[${this.name}] User-Agent: ${user_agent}`);\n\n return next();\n }\n \n\n}\n\nexport default RequestLoggerMiddleWare","import { Request, Response, NextFunction } from \"express\";\nimport { SafeExecuteUtil, LoggerUtil, InputValidatorUtil } from \"@/utils\";\nimport { EnvConfigInterface } from \"@/types/util_type\";\nimport { ResponseFormatterOptions } from \"@/types/middle_ware_type\";\n\nclass ResponseFormatterMiddleWare {\n private readonly name = \"response_formatter_middle_ware\";\n private readonly logger: LoggerUtil = new LoggerUtil(this.name);;\n\n private readonly include_request_id: boolean;\n private readonly default_success_message: string;\n private readonly default_error_message: string;\n private readonly default_info_message: string;\n private readonly default_not_found_message: string;\n\n constructor(options: ResponseFormatterOptions = {}) {\n this.include_request_id = options.include_request_id ?? true;\n this.default_success_message = options.default_success_message ?? \"operation_successful\";\n this.default_error_message = options.default_error_message ?? \"server_error\";\n this.default_info_message = options.default_info_message ?? \"operation_information\";\n this.default_not_found_message = options.default_not_found_message ?? \"invalid_request_resource_not_found\";\n\n SafeExecuteUtil.setNamedInstance(this.name, this);\n }\n\n // Method to handle 404 error\n @SafeExecuteUtil.safeExecuteThrow(\"response_formatter_middle_ware\")\n public async handle404ErrorMiddleWare (\n req: Request, \n res: Response, \n next: NextFunction\n ): Promise<void | Response> {\n return res.status(404).json({ status: \"error\", msg: this.default_not_found_message });\n }\n\n // -------------------------\n // Express error middleware\n // -------------------------\n @SafeExecuteUtil.safeExecuteThrow(\"response_formatter_middle_ware\")\n public async handleGeneralErrorMiddleWare (\n error: unknown,\n req: Request,\n res: Response,\n _next: NextFunction\n ): Promise<void | Response> {\n const is_development = InputValidatorUtil.isDevelopment();\n const error_message = error instanceof Error ? error.message : String(error);\n const error_stack = error instanceof Error ? { stack: error.stack } : undefined;\n const request_id = req.request_id\n\n res.locals.message = error_message;\n res.locals.error = is_development ? error : {};\n\n this.logger.error(`[${this.name}] Unhandled error for request ${request_id} Message ${error_message}`, { error_stack, error });\n\n return res.status(500).json({ status: \"error\", code: 500, msg: this.default_error_message });\n };\n\n // -------------------------\n // Middleware\n // -------------------------\n @SafeExecuteUtil.safeExecuteThrow(\"response_formatter_middle_ware\")\n public async middleWare(\n req: Request,\n res: Response,\n next: NextFunction\n ): Promise<void | Response> {\n\n // Generic error response\n res.errResponse = (code = 500, msg = this.default_error_message, data: any = []) => {\n return res.status(code).json({ status: \"error\", msg, data });\n };\n\n // Generic success response\n res.successResponse = (code = 200, msg = this.default_success_message, data: any = []) => {\n return res.status(code).json({ status: \"success\", msg, data });\n };\n\n // Informational response\n res.infoResponse = (code = 200, msg = this.default_info_message, data: any = []) => {\n return res.status(code).json({ status: \"info\", msg, data });\n };\n\n // 404 handler\n res.handle404Error = () => {\n return res.status(404).json({ status: \"error\", msg: this.default_not_found_message });\n };\n\n next();\n }\n\n}\n\nexport default ResponseFormatterMiddleWare;\n\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fiberx-backend-toolkit",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.12",
|
|
4
4
|
"description": "A TypeScript backend toolkit providing shared domain logic, infrastructure helpers, and utilities for FiberX server-side applications and services.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|