@naman_deep_singh/server-utils 1.4.3 → 1.4.4
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.
- package/README.md +1 -1
- package/dist/cjs/middleware/auth.middleware.d.ts +1 -2
- package/dist/cjs/middleware/auth.middleware.js +17 -14
- package/dist/cjs/middleware/errorHandler.middleware.d.ts +1 -1
- package/dist/cjs/middleware/errorHandler.middleware.js +30 -15
- package/dist/cjs/middleware/validation.middleware.js +2 -2
- package/dist/esm/middleware/auth.middleware.d.ts +1 -2
- package/dist/esm/middleware/auth.middleware.js +18 -15
- package/dist/esm/middleware/errorHandler.middleware.d.ts +1 -1
- package/dist/esm/middleware/errorHandler.middleware.js +30 -15
- package/dist/esm/middleware/validation.middleware.js +2 -2
- package/dist/types/middleware/auth.middleware.d.ts +1 -2
- package/dist/types/middleware/errorHandler.middleware.d.ts +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @naman_deep_singh/server-utils
|
|
2
2
|
|
|
3
|
-
**Version:** 1.4.
|
|
3
|
+
**Version:** 1.4.4 (with integrated cache & session support)
|
|
4
4
|
|
|
5
5
|
Extensible server utilities for Express.js microservices with multi-protocol support, integrated caching, session management, and TypeScript.
|
|
6
6
|
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import type { Request, RequestHandler } from '
|
|
1
|
+
import type { Request, RequestHandler } from 'express';
|
|
2
2
|
export interface AuthConfig {
|
|
3
3
|
secret: string;
|
|
4
|
-
unauthorizedMessage?: string;
|
|
5
4
|
tokenExtractor?: (req: Request) => string | null;
|
|
6
5
|
}
|
|
7
6
|
export declare function createAuthMiddleware(config: AuthConfig): RequestHandler;
|
|
@@ -4,7 +4,7 @@ exports.createAuthMiddleware = createAuthMiddleware;
|
|
|
4
4
|
const errors_utils_1 = require("@naman_deep_singh/errors-utils");
|
|
5
5
|
const security_1 = require("@naman_deep_singh/security");
|
|
6
6
|
function createAuthMiddleware(config) {
|
|
7
|
-
const { secret,
|
|
7
|
+
const { secret, tokenExtractor = (req) => (0, security_1.extractToken)({
|
|
8
8
|
header: req.headers.authorization || undefined,
|
|
9
9
|
cookies: req.cookies,
|
|
10
10
|
query: req.query,
|
|
@@ -12,30 +12,33 @@ function createAuthMiddleware(config) {
|
|
|
12
12
|
}), } = config;
|
|
13
13
|
return async (req, _res, next) => {
|
|
14
14
|
try {
|
|
15
|
-
// Extract token
|
|
15
|
+
// 1️⃣ Extract token
|
|
16
16
|
const token = tokenExtractor(req);
|
|
17
17
|
if (!token) {
|
|
18
|
-
|
|
18
|
+
// No cause → client mistake
|
|
19
|
+
return next(new errors_utils_1.TokenMalformedError({
|
|
19
20
|
reason: 'No token provided',
|
|
20
|
-
});
|
|
21
|
-
return next(error);
|
|
21
|
+
}));
|
|
22
22
|
}
|
|
23
|
-
//
|
|
23
|
+
// 2️⃣ Verify token
|
|
24
24
|
const result = (0, security_1.safeVerifyToken)(token, secret);
|
|
25
25
|
if (!result.valid) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
|
|
26
|
+
// Token expired
|
|
27
|
+
if (result.error?.name === 'TokenExpiredError') {
|
|
28
|
+
return next(new errors_utils_1.TokenExpiredError({ reason: 'Token expired' }, result.error));
|
|
29
|
+
}
|
|
30
|
+
// Token invalid / malformed
|
|
31
|
+
return next(new errors_utils_1.TokenMalformedError({
|
|
32
|
+
reason: 'Invalid token',
|
|
33
|
+
}, result.error));
|
|
31
34
|
}
|
|
32
|
-
// Attach
|
|
35
|
+
// 3️⃣ Attach payload
|
|
33
36
|
req.user = result.payload;
|
|
34
37
|
next();
|
|
35
38
|
}
|
|
36
39
|
catch (error) {
|
|
37
|
-
|
|
38
|
-
return next(
|
|
40
|
+
// Unexpected error → always pass cause
|
|
41
|
+
return next(new errors_utils_1.UnauthorizedError({ reason: 'Authentication failed' }, error instanceof Error ? error : undefined));
|
|
39
42
|
}
|
|
40
43
|
};
|
|
41
44
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { ErrorRequestHandler } from '
|
|
1
|
+
import type { ErrorRequestHandler } from 'express';
|
|
2
2
|
export declare function createErrorHandler(): ErrorRequestHandler;
|
|
@@ -1,29 +1,44 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createErrorHandler = createErrorHandler;
|
|
4
|
-
|
|
4
|
+
const errors_utils_1 = require("@naman_deep_singh/errors-utils");
|
|
5
5
|
function createErrorHandler() {
|
|
6
6
|
return (err, _req, res, next) => {
|
|
7
|
-
console.error('Error:', err);
|
|
8
7
|
if (res.headersSent) {
|
|
9
8
|
return next(err);
|
|
10
9
|
}
|
|
11
|
-
//
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
10
|
+
// Use responder if available
|
|
11
|
+
const responder = res.responder?.() ?? null;
|
|
12
|
+
// Known application error
|
|
13
|
+
if (err instanceof errors_utils_1.AppError) {
|
|
14
|
+
if (responder) {
|
|
15
|
+
return responder.status(err.statusCode).error(err.code, err.details);
|
|
16
|
+
}
|
|
17
|
+
// Fallback (if responder middleware is not mounted)
|
|
18
|
+
return res.status(err.statusCode).json({
|
|
19
|
+
success: false,
|
|
20
|
+
message: err.code,
|
|
21
|
+
error: {
|
|
22
|
+
message: err.code,
|
|
23
|
+
details: err.details,
|
|
24
|
+
},
|
|
25
|
+
data: undefined,
|
|
26
|
+
meta: null,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
// Unknown / unhandled error
|
|
30
|
+
console.error('Unhandled error:', err);
|
|
31
|
+
const status = 500;
|
|
32
|
+
const message = 'Internal Server Error';
|
|
33
|
+
if (responder) {
|
|
34
|
+
return responder.status(status).error(message);
|
|
35
|
+
}
|
|
36
|
+
// Final fallback
|
|
37
|
+
return res.status(status).json({
|
|
18
38
|
success: false,
|
|
19
39
|
message,
|
|
40
|
+
error: { message },
|
|
20
41
|
data: undefined,
|
|
21
|
-
error: {
|
|
22
|
-
message,
|
|
23
|
-
...(process.env.NODE_ENV !== 'production' && {
|
|
24
|
-
details: { stack: errorObj.stack },
|
|
25
|
-
}),
|
|
26
|
-
},
|
|
27
42
|
meta: null,
|
|
28
43
|
});
|
|
29
44
|
};
|
|
@@ -57,8 +57,8 @@ function createValidationMiddleware(rules) {
|
|
|
57
57
|
}
|
|
58
58
|
if (errors.length > 0) {
|
|
59
59
|
// Use ValidationError from errors-utils and let error middleware handle response
|
|
60
|
-
const validationError = new errors_utils_1.ValidationError(
|
|
61
|
-
|
|
60
|
+
const validationError = new errors_utils_1.ValidationError({
|
|
61
|
+
fieldErrors: errors,
|
|
62
62
|
});
|
|
63
63
|
return next(validationError);
|
|
64
64
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import type { Request, RequestHandler } from '
|
|
1
|
+
import type { Request, RequestHandler } from 'express';
|
|
2
2
|
export interface AuthConfig {
|
|
3
3
|
secret: string;
|
|
4
|
-
unauthorizedMessage?: string;
|
|
5
4
|
tokenExtractor?: (req: Request) => string | null;
|
|
6
5
|
}
|
|
7
6
|
export declare function createAuthMiddleware(config: AuthConfig): RequestHandler;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { UnauthorizedError } from '@naman_deep_singh/errors-utils';
|
|
1
|
+
import { TokenExpiredError, TokenMalformedError, UnauthorizedError, } from '@naman_deep_singh/errors-utils';
|
|
2
2
|
import { extractToken, safeVerifyToken } from '@naman_deep_singh/security';
|
|
3
3
|
export function createAuthMiddleware(config) {
|
|
4
|
-
const { secret,
|
|
4
|
+
const { secret, tokenExtractor = (req) => extractToken({
|
|
5
5
|
header: req.headers.authorization || undefined,
|
|
6
6
|
cookies: req.cookies,
|
|
7
7
|
query: req.query,
|
|
@@ -9,30 +9,33 @@ export function createAuthMiddleware(config) {
|
|
|
9
9
|
}), } = config;
|
|
10
10
|
return async (req, _res, next) => {
|
|
11
11
|
try {
|
|
12
|
-
// Extract token
|
|
12
|
+
// 1️⃣ Extract token
|
|
13
13
|
const token = tokenExtractor(req);
|
|
14
14
|
if (!token) {
|
|
15
|
-
|
|
15
|
+
// No cause → client mistake
|
|
16
|
+
return next(new TokenMalformedError({
|
|
16
17
|
reason: 'No token provided',
|
|
17
|
-
});
|
|
18
|
-
return next(error);
|
|
18
|
+
}));
|
|
19
19
|
}
|
|
20
|
-
//
|
|
20
|
+
// 2️⃣ Verify token
|
|
21
21
|
const result = safeVerifyToken(token, secret);
|
|
22
22
|
if (!result.valid) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
|
|
23
|
+
// Token expired
|
|
24
|
+
if (result.error?.name === 'TokenExpiredError') {
|
|
25
|
+
return next(new TokenExpiredError({ reason: 'Token expired' }, result.error));
|
|
26
|
+
}
|
|
27
|
+
// Token invalid / malformed
|
|
28
|
+
return next(new TokenMalformedError({
|
|
29
|
+
reason: 'Invalid token',
|
|
30
|
+
}, result.error));
|
|
28
31
|
}
|
|
29
|
-
// Attach
|
|
32
|
+
// 3️⃣ Attach payload
|
|
30
33
|
req.user = result.payload;
|
|
31
34
|
next();
|
|
32
35
|
}
|
|
33
36
|
catch (error) {
|
|
34
|
-
|
|
35
|
-
return next(
|
|
37
|
+
// Unexpected error → always pass cause
|
|
38
|
+
return next(new UnauthorizedError({ reason: 'Authentication failed' }, error instanceof Error ? error : undefined));
|
|
36
39
|
}
|
|
37
40
|
};
|
|
38
41
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { ErrorRequestHandler } from '
|
|
1
|
+
import type { ErrorRequestHandler } from 'express';
|
|
2
2
|
export declare function createErrorHandler(): ErrorRequestHandler;
|
|
@@ -1,26 +1,41 @@
|
|
|
1
|
-
|
|
1
|
+
import { AppError } from '@naman_deep_singh/errors-utils';
|
|
2
2
|
export function createErrorHandler() {
|
|
3
3
|
return (err, _req, res, next) => {
|
|
4
|
-
console.error('Error:', err);
|
|
5
4
|
if (res.headersSent) {
|
|
6
5
|
return next(err);
|
|
7
6
|
}
|
|
8
|
-
//
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
7
|
+
// Use responder if available
|
|
8
|
+
const responder = res.responder?.() ?? null;
|
|
9
|
+
// Known application error
|
|
10
|
+
if (err instanceof AppError) {
|
|
11
|
+
if (responder) {
|
|
12
|
+
return responder.status(err.statusCode).error(err.code, err.details);
|
|
13
|
+
}
|
|
14
|
+
// Fallback (if responder middleware is not mounted)
|
|
15
|
+
return res.status(err.statusCode).json({
|
|
16
|
+
success: false,
|
|
17
|
+
message: err.code,
|
|
18
|
+
error: {
|
|
19
|
+
message: err.code,
|
|
20
|
+
details: err.details,
|
|
21
|
+
},
|
|
22
|
+
data: undefined,
|
|
23
|
+
meta: null,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
// Unknown / unhandled error
|
|
27
|
+
console.error('Unhandled error:', err);
|
|
28
|
+
const status = 500;
|
|
29
|
+
const message = 'Internal Server Error';
|
|
30
|
+
if (responder) {
|
|
31
|
+
return responder.status(status).error(message);
|
|
32
|
+
}
|
|
33
|
+
// Final fallback
|
|
34
|
+
return res.status(status).json({
|
|
15
35
|
success: false,
|
|
16
36
|
message,
|
|
37
|
+
error: { message },
|
|
17
38
|
data: undefined,
|
|
18
|
-
error: {
|
|
19
|
-
message,
|
|
20
|
-
...(process.env.NODE_ENV !== 'production' && {
|
|
21
|
-
details: { stack: errorObj.stack },
|
|
22
|
-
}),
|
|
23
|
-
},
|
|
24
39
|
meta: null,
|
|
25
40
|
});
|
|
26
41
|
};
|
|
@@ -54,8 +54,8 @@ export function createValidationMiddleware(rules) {
|
|
|
54
54
|
}
|
|
55
55
|
if (errors.length > 0) {
|
|
56
56
|
// Use ValidationError from errors-utils and let error middleware handle response
|
|
57
|
-
const validationError = new ValidationError(
|
|
58
|
-
|
|
57
|
+
const validationError = new ValidationError({
|
|
58
|
+
fieldErrors: errors,
|
|
59
59
|
});
|
|
60
60
|
return next(validationError);
|
|
61
61
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import type { Request, RequestHandler } from '
|
|
1
|
+
import type { Request, RequestHandler } from 'express';
|
|
2
2
|
export interface AuthConfig {
|
|
3
3
|
secret: string;
|
|
4
|
-
unauthorizedMessage?: string;
|
|
5
4
|
tokenExtractor?: (req: Request) => string | null;
|
|
6
5
|
}
|
|
7
6
|
export declare function createAuthMiddleware(config: AuthConfig): RequestHandler;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { ErrorRequestHandler } from '
|
|
1
|
+
import type { ErrorRequestHandler } from 'express';
|
|
2
2
|
export declare function createErrorHandler(): ErrorRequestHandler;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@naman_deep_singh/server-utils",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.4",
|
|
4
4
|
"description": "Extensible server utilities for Express.js microservices with TypeScript",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/cjs/index.js",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"license": "ISC",
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"@naman_deep_singh/cache": "^1.3.1",
|
|
31
|
-
"@naman_deep_singh/errors-utils": "^1.
|
|
31
|
+
"@naman_deep_singh/errors-utils": "^1.3.4",
|
|
32
32
|
"@naman_deep_singh/security": "^1.3.2",
|
|
33
33
|
"@types/express": "^5.0.5",
|
|
34
34
|
"cookie-parser": "^1.4.6",
|