@webpieces/http-server 0.2.12 → 0.2.14

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.
@@ -0,0 +1,146 @@
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
@@ -0,0 +1 @@
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\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(\n expressResponse: Response,\n responseWrapper: WpResponse<unknown>\n ): 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('[JsonFilter] Response body:', JSON.stringify(responseWrapper.response, null, 2));\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(message: string, public statusCode: number) {\n super(message);\n this.name = 'HttpException';\n }\n}\n"]}
package/src/index.d.ts CHANGED
@@ -1,2 +1,7 @@
1
1
  export { WebpiecesServer } from './WebpiecesServer';
2
- export { RouteBuilderImpl, RegisteredRoute } from './RouteBuilderImpl';
2
+ export { WebpiecesFactory } from './WebpiecesFactory';
3
+ export { RouteBuilderImpl, RouteHandlerWithMeta, FilterWithMeta, HttpFilter } from './RouteBuilderImpl';
4
+ export { RouteHandler } from './RouteHandler';
5
+ export { MethodMeta } from './MethodMeta';
6
+ export { ContextFilter } from './filters/ContextFilter';
7
+ export { JsonFilter, JsonFilterConfig, FILTER_TYPES, ValidationException, HttpException, } from './filters/JsonFilter';
package/src/index.js CHANGED
@@ -1,9 +1,22 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RegisteredRoute = exports.RouteBuilderImpl = exports.WebpiecesServer = void 0;
4
- var WebpiecesServer_1 = require("./WebpiecesServer");
5
- Object.defineProperty(exports, "WebpiecesServer", { enumerable: true, get: function () { return WebpiecesServer_1.WebpiecesServer; } });
3
+ exports.HttpException = exports.ValidationException = exports.FILTER_TYPES = exports.JsonFilterConfig = exports.JsonFilter = exports.ContextFilter = exports.MethodMeta = exports.RouteHandler = exports.FilterWithMeta = exports.RouteHandlerWithMeta = exports.RouteBuilderImpl = exports.WebpiecesFactory = void 0;
4
+ var WebpiecesFactory_1 = require("./WebpiecesFactory");
5
+ Object.defineProperty(exports, "WebpiecesFactory", { enumerable: true, get: function () { return WebpiecesFactory_1.WebpiecesFactory; } });
6
6
  var RouteBuilderImpl_1 = require("./RouteBuilderImpl");
7
7
  Object.defineProperty(exports, "RouteBuilderImpl", { enumerable: true, get: function () { return RouteBuilderImpl_1.RouteBuilderImpl; } });
8
- Object.defineProperty(exports, "RegisteredRoute", { enumerable: true, get: function () { return RouteBuilderImpl_1.RegisteredRoute; } });
8
+ Object.defineProperty(exports, "RouteHandlerWithMeta", { enumerable: true, get: function () { return RouteBuilderImpl_1.RouteHandlerWithMeta; } });
9
+ Object.defineProperty(exports, "FilterWithMeta", { enumerable: true, get: function () { return RouteBuilderImpl_1.FilterWithMeta; } });
10
+ var RouteHandler_1 = require("./RouteHandler");
11
+ Object.defineProperty(exports, "RouteHandler", { enumerable: true, get: function () { return RouteHandler_1.RouteHandler; } });
12
+ var MethodMeta_1 = require("./MethodMeta");
13
+ Object.defineProperty(exports, "MethodMeta", { enumerable: true, get: function () { return MethodMeta_1.MethodMeta; } });
14
+ var ContextFilter_1 = require("./filters/ContextFilter");
15
+ Object.defineProperty(exports, "ContextFilter", { enumerable: true, get: function () { return ContextFilter_1.ContextFilter; } });
16
+ var JsonFilter_1 = require("./filters/JsonFilter");
17
+ Object.defineProperty(exports, "JsonFilter", { enumerable: true, get: function () { return JsonFilter_1.JsonFilter; } });
18
+ Object.defineProperty(exports, "JsonFilterConfig", { enumerable: true, get: function () { return JsonFilter_1.JsonFilterConfig; } });
19
+ Object.defineProperty(exports, "FILTER_TYPES", { enumerable: true, get: function () { return JsonFilter_1.FILTER_TYPES; } });
20
+ Object.defineProperty(exports, "ValidationException", { enumerable: true, get: function () { return JsonFilter_1.ValidationException; } });
21
+ Object.defineProperty(exports, "HttpException", { enumerable: true, get: function () { return JsonFilter_1.HttpException; } });
9
22
  //# sourceMappingURL=index.js.map
package/src/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/http/http-server/src/index.ts"],"names":[],"mappings":";;;AAAA,qDAAoD;AAA3C,kHAAA,eAAe,OAAA;AACxB,uDAAuE;AAA9D,oHAAA,gBAAgB,OAAA;AAAE,mHAAA,eAAe,OAAA","sourcesContent":["export { WebpiecesServer } from './WebpiecesServer';\nexport { RouteBuilderImpl, RegisteredRoute } from './RouteBuilderImpl';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/http/http-server/src/index.ts"],"names":[],"mappings":";;;AACA,uDAAsD;AAA7C,oHAAA,gBAAgB,OAAA;AACzB,uDAAwG;AAA/F,oHAAA,gBAAgB,OAAA;AAAE,wHAAA,oBAAoB,OAAA;AAAE,kHAAA,cAAc,OAAA;AAC/D,+CAA8C;AAArC,4GAAA,YAAY,OAAA;AACrB,2CAA0C;AAAjC,wGAAA,UAAU,OAAA;AACnB,yDAAwD;AAA/C,8GAAA,aAAa,OAAA;AACtB,mDAM8B;AAL5B,wGAAA,UAAU,OAAA;AACV,8GAAA,gBAAgB,OAAA;AAChB,0GAAA,YAAY,OAAA;AACZ,iHAAA,mBAAmB,OAAA;AACnB,2GAAA,aAAa,OAAA","sourcesContent":["export { WebpiecesServer } from './WebpiecesServer';\nexport { WebpiecesFactory } from './WebpiecesFactory';\nexport { RouteBuilderImpl, RouteHandlerWithMeta, FilterWithMeta, HttpFilter } from './RouteBuilderImpl';\nexport { RouteHandler } from './RouteHandler';\nexport { MethodMeta } from './MethodMeta';\nexport { ContextFilter } from './filters/ContextFilter';\nexport {\n JsonFilter,\n JsonFilterConfig,\n FILTER_TYPES,\n ValidationException,\n HttpException,\n} from './filters/JsonFilter';\n"]}