@webpieces/http-server 0.2.15 → 0.2.16
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/package.json +4 -5
- package/src/WebpiecesFactory.d.ts +23 -4
- package/src/WebpiecesFactory.js +25 -8
- package/src/WebpiecesFactory.js.map +1 -1
- package/src/WebpiecesMiddleware.d.ts +59 -0
- package/src/WebpiecesMiddleware.js +159 -0
- package/src/WebpiecesMiddleware.js.map +1 -0
- package/src/WebpiecesServer.d.ts +42 -5
- package/src/WebpiecesServer.js.map +1 -1
- package/src/WebpiecesServerImpl.d.ts +57 -28
- package/src/WebpiecesServerImpl.js +136 -135
- package/src/WebpiecesServerImpl.js.map +1 -1
- package/src/filters/ContextFilter.d.ts +1 -1
- package/src/filters/ContextFilter.js.map +1 -1
- package/src/filters/LogApiFilter.d.ts +40 -0
- package/src/filters/LogApiFilter.js +92 -0
- package/src/filters/LogApiFilter.js.map +1 -0
- package/src/index.d.ts +3 -4
- package/src/index.js +13 -15
- package/src/index.js.map +1 -1
- package/src/FilterMatcher.d.ts +0 -39
- package/src/FilterMatcher.js +0 -69
- package/src/FilterMatcher.js.map +0 -1
- package/src/MethodMeta.d.ts +0 -42
- package/src/MethodMeta.js +0 -40
- package/src/MethodMeta.js.map +0 -1
- package/src/RouteBuilderImpl.d.ts +0 -90
- package/src/RouteBuilderImpl.js +0 -141
- package/src/RouteBuilderImpl.js.map +0 -1
- package/src/RouteHandler.d.ts +0 -22
- package/src/RouteHandler.js +0 -20
- package/src/RouteHandler.js.map +0 -1
- package/src/filters/JsonFilter.d.ts +0 -62
- package/src/filters/JsonFilter.js +0 -146
- package/src/filters/JsonFilter.js.map +0 -1
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.HttpException = exports.ValidationException = exports.JsonFilter = exports.JsonFilterConfig = exports.FILTER_TYPES = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
const inversify_1 = require("inversify");
|
|
6
|
-
const http_routing_1 = require("@webpieces/http-routing");
|
|
7
|
-
const http_filters_1 = require("@webpieces/http-filters");
|
|
8
|
-
const core_util_1 = require("@webpieces/core-util");
|
|
9
|
-
/**
|
|
10
|
-
* DI tokens for JsonFilter.
|
|
11
|
-
*/
|
|
12
|
-
exports.FILTER_TYPES = {
|
|
13
|
-
JsonFilterConfig: Symbol.for('JsonFilterConfig'),
|
|
14
|
-
};
|
|
15
|
-
/**
|
|
16
|
-
* Configuration for JsonFilter.
|
|
17
|
-
* Register this in your DI container to customize JsonFilter behavior.
|
|
18
|
-
*/
|
|
19
|
-
let JsonFilterConfig = class JsonFilterConfig {
|
|
20
|
-
};
|
|
21
|
-
exports.JsonFilterConfig = JsonFilterConfig;
|
|
22
|
-
exports.JsonFilterConfig = JsonFilterConfig = tslib_1.__decorate([
|
|
23
|
-
(0, inversify_1.injectable)()
|
|
24
|
-
], JsonFilterConfig);
|
|
25
|
-
/**
|
|
26
|
-
* JsonFilter - Handles JSON serialization/deserialization and writes response to HTTP body.
|
|
27
|
-
*
|
|
28
|
-
* Similar to Java WebPieces JacksonCatchAllFilter.
|
|
29
|
-
*
|
|
30
|
-
* Flow:
|
|
31
|
-
* 1. Log request
|
|
32
|
-
* 2. Deserialize request body to DTO and set on meta.requestDto
|
|
33
|
-
* 3. Call next filter/controller
|
|
34
|
-
* 4. Get response (WpResponse)
|
|
35
|
-
* 5. Write response to Express response
|
|
36
|
-
* 6. On ANY exception, send 500
|
|
37
|
-
*/
|
|
38
|
-
let JsonFilter = class JsonFilter extends http_filters_1.Filter {
|
|
39
|
-
constructor(config) {
|
|
40
|
-
super();
|
|
41
|
-
this.config = config;
|
|
42
|
-
}
|
|
43
|
-
async filter(meta, nextFilter) {
|
|
44
|
-
// Get Express Request/Response from routeRequest
|
|
45
|
-
const expressRequest = meta.routeRequest.request;
|
|
46
|
-
const expressResponse = meta.routeRequest.response;
|
|
47
|
-
try {
|
|
48
|
-
// 1. Log request
|
|
49
|
-
this.logRequest(meta, expressRequest);
|
|
50
|
-
// 2. Deserialize request body to DTO
|
|
51
|
-
this.deserializeRequest(meta, expressRequest);
|
|
52
|
-
// 3. Call next filter/controller
|
|
53
|
-
const responseWrapper = await nextFilter.invoke(meta);
|
|
54
|
-
// 4. Log response
|
|
55
|
-
this.logResponse(responseWrapper);
|
|
56
|
-
// 5. Write response to Express response
|
|
57
|
-
this.writeResponse(expressResponse, responseWrapper);
|
|
58
|
-
return responseWrapper;
|
|
59
|
-
}
|
|
60
|
-
catch (err) {
|
|
61
|
-
const error = (0, core_util_1.toError)(err);
|
|
62
|
-
// 6. On ANY exception, send 500
|
|
63
|
-
console.error('[JsonFilter] Error:', error);
|
|
64
|
-
const errorResponse = new http_filters_1.WpResponse({ error: 'Internal server error' }, 500);
|
|
65
|
-
this.writeResponse(expressResponse, errorResponse);
|
|
66
|
-
return errorResponse;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Deserialize request body to DTO and set on meta.requestDto.
|
|
71
|
-
*/
|
|
72
|
-
deserializeRequest(meta, expressRequest) {
|
|
73
|
-
if (expressRequest.body) {
|
|
74
|
-
// Set the deserialized body as requestDto
|
|
75
|
-
meta.requestDto = expressRequest.body;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Write WpResponse to HTTP response body as JSON.
|
|
80
|
-
*/
|
|
81
|
-
writeResponse(expressResponse, responseWrapper) {
|
|
82
|
-
// Set status code
|
|
83
|
-
expressResponse.status(responseWrapper.statusCode);
|
|
84
|
-
// Set headers from wrapper
|
|
85
|
-
responseWrapper.headers.forEach((value, name) => {
|
|
86
|
-
expressResponse.setHeader(name, value);
|
|
87
|
-
});
|
|
88
|
-
// Set content type to JSON
|
|
89
|
-
expressResponse.setHeader('Content-Type', 'application/json');
|
|
90
|
-
// Serialize and write response body
|
|
91
|
-
if (responseWrapper.response !== undefined) {
|
|
92
|
-
expressResponse.json(responseWrapper.response);
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
expressResponse.end();
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Log the incoming request.
|
|
100
|
-
*/
|
|
101
|
-
logRequest(meta, expressRequest) {
|
|
102
|
-
console.log(`[JsonFilter] ${meta.httpMethod} ${meta.path}`);
|
|
103
|
-
if (expressRequest.body) {
|
|
104
|
-
console.log('[JsonFilter] Request body:', JSON.stringify(expressRequest.body, null, 2));
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Log the outgoing response.
|
|
109
|
-
*/
|
|
110
|
-
logResponse(responseWrapper) {
|
|
111
|
-
console.log(`[JsonFilter] Response: ${responseWrapper.statusCode}`);
|
|
112
|
-
if (responseWrapper.response) {
|
|
113
|
-
console.log('[JsonFilter] Response body:', JSON.stringify(responseWrapper.response, null, 2));
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
};
|
|
117
|
-
exports.JsonFilter = JsonFilter;
|
|
118
|
-
exports.JsonFilter = JsonFilter = tslib_1.__decorate([
|
|
119
|
-
(0, http_routing_1.provideSingleton)(),
|
|
120
|
-
(0, inversify_1.injectable)(),
|
|
121
|
-
tslib_1.__param(0, (0, inversify_1.inject)(exports.FILTER_TYPES.JsonFilterConfig)),
|
|
122
|
-
tslib_1.__metadata("design:paramtypes", [JsonFilterConfig])
|
|
123
|
-
], JsonFilter);
|
|
124
|
-
/**
|
|
125
|
-
* Exception thrown when validation fails.
|
|
126
|
-
*/
|
|
127
|
-
class ValidationException extends Error {
|
|
128
|
-
constructor(violations) {
|
|
129
|
-
super('Validation failed');
|
|
130
|
-
this.violations = violations;
|
|
131
|
-
this.name = 'ValidationException';
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
exports.ValidationException = ValidationException;
|
|
135
|
-
/**
|
|
136
|
-
* HTTP exception with status code.
|
|
137
|
-
*/
|
|
138
|
-
class HttpException extends Error {
|
|
139
|
-
constructor(message, statusCode) {
|
|
140
|
-
super(message);
|
|
141
|
-
this.statusCode = statusCode;
|
|
142
|
-
this.name = 'HttpException';
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
exports.HttpException = HttpException;
|
|
146
|
-
//# sourceMappingURL=JsonFilter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"JsonFilter.js","sourceRoot":"","sources":["../../../../../../packages/http/http-server/src/filters/JsonFilter.ts"],"names":[],"mappings":"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","sourcesContent":["import { injectable, inject } from 'inversify';\nimport { provideSingleton } from '@webpieces/http-routing';\nimport { Filter, WpResponse, Service } from '@webpieces/http-filters';\nimport { toError } from '@webpieces/core-util';\nimport { Request, Response } from 'express';\nimport { MethodMeta } from '../MethodMeta';\n\n/**\n * DI tokens for JsonFilter.\n */\nexport const FILTER_TYPES = {\n JsonFilterConfig: Symbol.for('JsonFilterConfig'),\n};\n\n/**\n * Configuration for JsonFilter.\n * Register this in your DI container to customize JsonFilter behavior.\n */\n@injectable()\nexport class JsonFilterConfig {\n // Configuration options can be added here\n}\n\n/**\n * JsonFilter - Handles JSON serialization/deserialization and writes response to HTTP body.\n *\n * Similar to Java WebPieces JacksonCatchAllFilter.\n *\n * Flow:\n * 1. Log request\n * 2. Deserialize request body to DTO and set on meta.requestDto\n * 3. Call next filter/controller\n * 4. Get response (WpResponse)\n * 5. Write response to Express response\n * 6. On ANY exception, send 500\n */\n@provideSingleton()\n@injectable()\nexport class JsonFilter extends Filter<MethodMeta, WpResponse<unknown>> {\n constructor(@inject(FILTER_TYPES.JsonFilterConfig) private config: JsonFilterConfig) {\n super();\n }\n\n async filter(\n meta: MethodMeta,\n nextFilter: Service<MethodMeta, WpResponse<unknown>>,\n ): Promise<WpResponse<unknown>> {\n // Get Express Request/Response from routeRequest\n const expressRequest = meta.routeRequest.request as Request;\n const expressResponse = meta.routeRequest.response as Response;\n\n try {\n // 1. Log request\n this.logRequest(meta, expressRequest);\n\n // 2. Deserialize request body to DTO\n this.deserializeRequest(meta, expressRequest);\n\n // 3. Call next filter/controller\n const responseWrapper = await nextFilter.invoke(meta);\n\n // 4. Log response\n this.logResponse(responseWrapper);\n\n // 5. Write response to Express response\n this.writeResponse(expressResponse, responseWrapper);\n\n return responseWrapper;\n } catch (err: unknown) {\n const error = toError(err);\n // 6. On ANY exception, send 500\n console.error('[JsonFilter] Error:', error);\n const errorResponse = new WpResponse({ error: 'Internal server error' }, 500);\n this.writeResponse(expressResponse, errorResponse);\n return errorResponse;\n }\n }\n\n /**\n * Deserialize request body to DTO and set on meta.requestDto.\n */\n private deserializeRequest(meta: MethodMeta, expressRequest: Request): void {\n if (expressRequest.body) {\n // Set the deserialized body as requestDto\n meta.requestDto = expressRequest.body;\n }\n }\n\n /**\n * Write WpResponse to HTTP response body as JSON.\n */\n private writeResponse(expressResponse: Response, responseWrapper: WpResponse<unknown>): void {\n // Set status code\n expressResponse.status(responseWrapper.statusCode);\n\n // Set headers from wrapper\n responseWrapper.headers.forEach((value, name) => {\n expressResponse.setHeader(name, value);\n });\n\n // Set content type to JSON\n expressResponse.setHeader('Content-Type', 'application/json');\n\n // Serialize and write response body\n if (responseWrapper.response !== undefined) {\n expressResponse.json(responseWrapper.response);\n } else {\n expressResponse.end();\n }\n }\n\n /**\n * Log the incoming request.\n */\n private logRequest(meta: MethodMeta, expressRequest: Request): void {\n console.log(`[JsonFilter] ${meta.httpMethod} ${meta.path}`);\n if (expressRequest.body) {\n console.log('[JsonFilter] Request body:', JSON.stringify(expressRequest.body, null, 2));\n }\n }\n\n /**\n * Log the outgoing response.\n */\n private logResponse(responseWrapper: WpResponse<unknown>): void {\n console.log(`[JsonFilter] Response: ${responseWrapper.statusCode}`);\n if (responseWrapper.response) {\n console.log(\n '[JsonFilter] Response body:',\n JSON.stringify(responseWrapper.response, null, 2),\n );\n }\n }\n}\n\n/**\n * Exception thrown when validation fails.\n */\nexport class ValidationException extends Error {\n constructor(public violations: string[]) {\n super('Validation failed');\n this.name = 'ValidationException';\n }\n}\n\n/**\n * HTTP exception with status code.\n */\nexport class HttpException extends Error {\n constructor(\n message: string,\n public statusCode: number,\n ) {\n super(message);\n this.name = 'HttpException';\n }\n}\n"]}
|