@pristine-ts/networking 0.0.172 → 0.0.176

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.
Files changed (117) hide show
  1. package/dist/lib/cjs/errors/errors.js +3 -0
  2. package/dist/lib/cjs/errors/errors.js.map +1 -1
  3. package/dist/lib/cjs/errors/request-handling.error.js +20 -0
  4. package/dist/lib/cjs/errors/request-handling.error.js.map +1 -0
  5. package/dist/lib/cjs/errors/request-interception-execution.error.js +21 -0
  6. package/dist/lib/cjs/errors/request-interception-execution.error.js.map +1 -0
  7. package/dist/lib/cjs/errors/response-interception-execution.error.js +23 -0
  8. package/dist/lib/cjs/errors/response-interception-execution.error.js.map +1 -0
  9. package/dist/lib/cjs/{enrichers/enrichers.js → handlers/handlers.js} +2 -2
  10. package/dist/lib/cjs/handlers/handlers.js.map +1 -0
  11. package/dist/lib/cjs/handlers/request.event-handler.js +71 -0
  12. package/dist/lib/cjs/handlers/request.event-handler.js.map +1 -0
  13. package/dist/lib/cjs/interceptors/interceptors.js +15 -0
  14. package/dist/lib/cjs/interceptors/interceptors.js.map +1 -0
  15. package/dist/lib/cjs/interceptors/request-body-converter.interceptor.js +89 -0
  16. package/dist/lib/cjs/interceptors/request-body-converter.interceptor.js.map +1 -0
  17. package/dist/lib/cjs/{enrichers/router-response.enricher.js → interceptors/response-headers.interceptor.js} +14 -12
  18. package/dist/lib/cjs/interceptors/response-headers.interceptor.js.map +1 -0
  19. package/dist/lib/cjs/interfaces/interfaces.js +1 -2
  20. package/dist/lib/cjs/interfaces/interfaces.js.map +1 -1
  21. package/dist/lib/cjs/interfaces/{router-request-enricher.interface.js → request-interceptor.interface.js} +1 -1
  22. package/dist/lib/cjs/interfaces/request-interceptor.interface.js.map +1 -0
  23. package/dist/lib/cjs/mappers/mappers.js +14 -0
  24. package/dist/lib/cjs/mappers/mappers.js.map +1 -0
  25. package/dist/lib/cjs/mappers/request.mapper.js +37 -0
  26. package/dist/lib/cjs/mappers/request.mapper.js.map +1 -0
  27. package/dist/lib/cjs/models/models.js +0 -2
  28. package/dist/lib/cjs/models/models.js.map +1 -1
  29. package/dist/lib/cjs/networking.module.js +14 -2
  30. package/dist/lib/cjs/networking.module.js.map +1 -1
  31. package/dist/lib/cjs/router.js +167 -49
  32. package/dist/lib/cjs/router.js.map +1 -1
  33. package/dist/lib/esm/errors/errors.js +3 -0
  34. package/dist/lib/esm/errors/errors.js.map +1 -1
  35. package/dist/lib/esm/errors/request-handling.error.js +16 -0
  36. package/dist/lib/esm/errors/request-handling.error.js.map +1 -0
  37. package/dist/lib/esm/errors/request-interception-execution.error.js +17 -0
  38. package/dist/lib/esm/errors/request-interception-execution.error.js.map +1 -0
  39. package/dist/lib/esm/errors/response-interception-execution.error.js +19 -0
  40. package/dist/lib/esm/errors/response-interception-execution.error.js.map +1 -0
  41. package/dist/lib/esm/handlers/handlers.js +2 -0
  42. package/dist/lib/esm/handlers/handlers.js.map +1 -0
  43. package/dist/lib/esm/handlers/request.event-handler.js +68 -0
  44. package/dist/lib/esm/handlers/request.event-handler.js.map +1 -0
  45. package/dist/lib/esm/interceptors/interceptors.js +3 -0
  46. package/dist/lib/esm/interceptors/interceptors.js.map +1 -0
  47. package/dist/lib/esm/interceptors/request-body-converter.interceptor.js +86 -0
  48. package/dist/lib/esm/interceptors/request-body-converter.interceptor.js.map +1 -0
  49. package/dist/lib/esm/{enrichers/router-response.enricher.js → interceptors/response-headers.interceptor.js} +13 -11
  50. package/dist/lib/esm/interceptors/response-headers.interceptor.js.map +1 -0
  51. package/dist/lib/esm/interfaces/interfaces.js +1 -2
  52. package/dist/lib/esm/interfaces/interfaces.js.map +1 -1
  53. package/dist/lib/esm/interfaces/request-interceptor.interface.js +2 -0
  54. package/dist/lib/esm/interfaces/request-interceptor.interface.js.map +1 -0
  55. package/dist/lib/esm/mappers/mappers.js +2 -0
  56. package/dist/lib/esm/mappers/mappers.js.map +1 -0
  57. package/dist/lib/esm/mappers/request.mapper.js +34 -0
  58. package/dist/lib/esm/mappers/request.mapper.js.map +1 -0
  59. package/dist/lib/esm/models/models.js +0 -2
  60. package/dist/lib/esm/models/models.js.map +1 -1
  61. package/dist/lib/esm/networking.module.js +14 -2
  62. package/dist/lib/esm/networking.module.js.map +1 -1
  63. package/dist/lib/esm/router.js +166 -48
  64. package/dist/lib/esm/router.js.map +1 -1
  65. package/dist/types/errors/errors.d.ts +3 -0
  66. package/dist/types/errors/request-handling.error.d.ts +7 -0
  67. package/dist/types/errors/request-interception-execution.error.d.ts +7 -0
  68. package/dist/types/errors/response-interception-execution.error.d.ts +7 -0
  69. package/dist/types/handlers/handlers.d.ts +1 -0
  70. package/dist/types/handlers/request.event-handler.d.ts +14 -0
  71. package/dist/types/interceptors/interceptors.d.ts +2 -0
  72. package/dist/types/interceptors/request-body-converter.interceptor.d.ts +9 -0
  73. package/dist/types/interceptors/response-headers.interceptor.d.ts +10 -0
  74. package/dist/types/interfaces/controller-method-parameter-decorator-resolver.interface.d.ts +1 -1
  75. package/dist/types/interfaces/interfaces.d.ts +1 -2
  76. package/dist/types/interfaces/request-interceptor.interface.d.ts +39 -0
  77. package/dist/types/interfaces/router.interface.d.ts +6 -3
  78. package/dist/types/mappers/mappers.d.ts +1 -0
  79. package/dist/types/mappers/request.mapper.d.ts +8 -0
  80. package/dist/types/models/models.d.ts +0 -2
  81. package/dist/types/networking.module.d.ts +3 -1
  82. package/dist/types/resolvers/body-parameter-decorator.resolver.d.ts +1 -1
  83. package/dist/types/resolvers/controller-method-parameter-decorator.resolver.d.ts +1 -1
  84. package/dist/types/resolvers/headers-parameter-decorator.resolver.d.ts +1 -1
  85. package/dist/types/resolvers/identity-parameter-decorator.resolver.d.ts +1 -1
  86. package/dist/types/resolvers/query-parameter-decorator.resolver.d.ts +1 -1
  87. package/dist/types/resolvers/query-parameters-decorator.resolver.d.ts +1 -1
  88. package/dist/types/resolvers/request-parameter-decorator.resolver.d.ts +1 -1
  89. package/dist/types/resolvers/route-parameter-decorator.resolver.d.ts +1 -1
  90. package/dist/types/router.d.ts +17 -7
  91. package/package.json +7 -5
  92. package/dist/lib/cjs/enrichers/enrichers.js.map +0 -1
  93. package/dist/lib/cjs/enrichers/router-response.enricher.js.map +0 -1
  94. package/dist/lib/cjs/interfaces/router-request-enricher.interface.js.map +0 -1
  95. package/dist/lib/cjs/interfaces/router-response-enricher.interface.js +0 -3
  96. package/dist/lib/cjs/interfaces/router-response-enricher.interface.js.map +0 -1
  97. package/dist/lib/cjs/models/request.js +0 -50
  98. package/dist/lib/cjs/models/request.js.map +0 -1
  99. package/dist/lib/cjs/models/response.js +0 -16
  100. package/dist/lib/cjs/models/response.js.map +0 -1
  101. package/dist/lib/esm/enrichers/enrichers.js +0 -2
  102. package/dist/lib/esm/enrichers/enrichers.js.map +0 -1
  103. package/dist/lib/esm/enrichers/router-response.enricher.js.map +0 -1
  104. package/dist/lib/esm/interfaces/router-request-enricher.interface.js +0 -2
  105. package/dist/lib/esm/interfaces/router-request-enricher.interface.js.map +0 -1
  106. package/dist/lib/esm/interfaces/router-response-enricher.interface.js +0 -2
  107. package/dist/lib/esm/interfaces/router-response-enricher.interface.js.map +0 -1
  108. package/dist/lib/esm/models/request.js +0 -46
  109. package/dist/lib/esm/models/request.js.map +0 -1
  110. package/dist/lib/esm/models/response.js +0 -12
  111. package/dist/lib/esm/models/response.js.map +0 -1
  112. package/dist/types/enrichers/enrichers.d.ts +0 -1
  113. package/dist/types/enrichers/router-response.enricher.d.ts +0 -11
  114. package/dist/types/interfaces/router-request-enricher.interface.d.ts +0 -18
  115. package/dist/types/interfaces/router-response-enricher.interface.d.ts +0 -20
  116. package/dist/types/models/request.d.ts +0 -45
  117. package/dist/types/models/response.d.ts +0 -24
@@ -0,0 +1,86 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ import { injectable, inject } from "tsyringe";
23
+ import { moduleScoped, ServiceDefinitionTagEnum, tag } from "@pristine-ts/common";
24
+ import { NetworkingModuleKeyname } from "../networking.module.keyname";
25
+ import { InvalidBodyHttpError } from "../errors/invalid-body.http-error";
26
+ let RequestBodyConverterInterceptor = class RequestBodyConverterInterceptor {
27
+ constructor(isActive, logHandler) {
28
+ this.isActive = isActive;
29
+ this.logHandler = logHandler;
30
+ }
31
+ interceptRequest(request) {
32
+ return __awaiter(this, void 0, void 0, function* () {
33
+ if (this.isActive === false) {
34
+ return request;
35
+ }
36
+ let contentType;
37
+ for (let key in request.headers) {
38
+ if (request.headers.hasOwnProperty(key) === false) {
39
+ continue;
40
+ }
41
+ const requestHeader = request.headers[key];
42
+ if (key.toLowerCase() === "content-type") {
43
+ contentType = requestHeader;
44
+ break;
45
+ }
46
+ }
47
+ if (contentType === undefined) {
48
+ return request;
49
+ }
50
+ switch (contentType.toLowerCase()) {
51
+ case "application/json":
52
+ switch (typeof request.body) {
53
+ case "object":
54
+ return request;
55
+ case "string":
56
+ try {
57
+ if (request.body) {
58
+ request.body = JSON.parse(request.body);
59
+ }
60
+ }
61
+ catch (e) {
62
+ const errorMessage = "This request has the Content-Type header 'application/json' but the body contains invalid JSON.";
63
+ this.logHandler.error(errorMessage);
64
+ throw new InvalidBodyHttpError(errorMessage);
65
+ }
66
+ break;
67
+ default:
68
+ const errorMessage = "This request has the Content-Type header 'application/json' but the body contains invalid JSON.";
69
+ this.logHandler.error(errorMessage);
70
+ throw new InvalidBodyHttpError(errorMessage);
71
+ }
72
+ }
73
+ return request;
74
+ });
75
+ }
76
+ };
77
+ RequestBodyConverterInterceptor = __decorate([
78
+ tag(ServiceDefinitionTagEnum.RequestInterceptor),
79
+ moduleScoped(NetworkingModuleKeyname),
80
+ injectable(),
81
+ __param(0, inject("%" + NetworkingModuleKeyname + ".request_body_converter.is_active%")),
82
+ __param(1, inject("LogHandlerInterface")),
83
+ __metadata("design:paramtypes", [Boolean, Object])
84
+ ], RequestBodyConverterInterceptor);
85
+ export { RequestBodyConverterInterceptor };
86
+ //# sourceMappingURL=request-body-converter.interceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-body-converter.interceptor.js","sourceRoot":"","sources":["../../../../src/interceptors/request-body-converter.interceptor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAC,UAAU,EAAE,MAAM,EAAC,MAAM,UAAU,CAAC;AAE5C,OAAO,EAAC,YAAY,EAAW,wBAAwB,EAAE,GAAG,EAAC,MAAM,qBAAqB,CAAC;AACzF,OAAO,EAAC,uBAAuB,EAAC,MAAM,8BAA8B,CAAC;AAErE,OAAO,EAAC,oBAAoB,EAAC,MAAM,mCAAmC,CAAC;AAKvE,IAAa,+BAA+B,GAA5C,MAAa,+BAA+B;IACxC,YAA2G,QAAiB,EAChE,UAA+B;QADgB,aAAQ,GAAR,QAAQ,CAAS;QAChE,eAAU,GAAV,UAAU,CAAqB;IAC3F,CAAC;IAEK,gBAAgB,CAAC,OAAgB;;YACnC,IAAG,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE;gBACxB,OAAO,OAAO,CAAC;aAClB;YAED,IAAI,WAA+B,CAAC;YAEpC,KAAK,IAAI,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE;gBAC7B,IAAI,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE;oBAC/C,SAAS;iBACZ;gBAED,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAE3C,IAAG,GAAG,CAAC,WAAW,EAAE,KAAK,cAAc,EAAE;oBACrC,WAAW,GAAG,aAAa,CAAC;oBAC5B,MAAM;iBACT;aACJ;YAED,IAAG,WAAW,KAAK,SAAS,EAAE;gBAC1B,OAAO,OAAO,CAAC;aAClB;YAED,QAAQ,WAAW,CAAC,WAAW,EAAE,EAAE;gBAC/B,KAAK,kBAAkB;oBAEnB,QAAQ,OAAO,OAAO,CAAC,IAAI,EAAE;wBACzB,KAAK,QAAQ;4BACT,OAAO,OAAO,CAAC;wBAEnB,KAAK,QAAQ;4BACT,IAAI;gCACA,IAAG,OAAO,CAAC,IAAI,EAAE;oCACb,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;iCAC3C;6BACJ;4BACD,OAAO,CAAC,EAAE;gCACN,MAAM,YAAY,GAAG,iGAAiG,CAAC;gCACvH,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gCAEpC,MAAM,IAAI,oBAAoB,CAAC,YAAY,CAAC,CAAC;6BAChD;4BACD,MAAM;wBAEV;4BACI,MAAM,YAAY,GAAG,iGAAiG,CAAC;4BACvH,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;4BAEpC,MAAM,IAAI,oBAAoB,CAAC,YAAY,CAAC,CAAC;qBACpD;aAGR;YAED,OAAO,OAAO,CAAC;QACnB,CAAC;KAAA;CAEJ,CAAA;AA/DY,+BAA+B;IAH3C,GAAG,CAAC,wBAAwB,CAAC,kBAAkB,CAAC;IAChD,YAAY,CAAC,uBAAuB,CAAC;IACrC,UAAU,EAAE;IAEI,WAAA,MAAM,CAAC,GAAG,GAAG,uBAAuB,GAAG,oCAAoC,CAAC,CAAA;IAC5E,WAAA,MAAM,CAAC,qBAAqB,CAAC,CAAA;;GAFjC,+BAA+B,CA+D3C;SA/DY,+BAA+B"}
@@ -15,23 +15,25 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
15
15
  };
16
16
  import { moduleScoped, ServiceDefinitionTagEnum, tag } from "@pristine-ts/common";
17
17
  import { NetworkingModuleKeyname } from "../networking.module.keyname";
18
+ import { injectable } from "tsyringe";
18
19
  /**
19
- * The RouterResponseEnricher enriches the response of the router by adding the response headers specified by the response header decorator.
20
- * It is tagged as an RouterResponseEnricher so it can be automatically injected with the all the other RouterResponseEnrichers.
20
+ * The Response Interceptor intercepts the response of the router by adding the response headers specified by the response header decorator.
21
+ * It is tagged as a RequestInterceptor so it can be automatically injected with the all the other RequestInterceptor.
21
22
  */
22
- let RouterResponseEnricher = class RouterResponseEnricher {
23
- enrichResponse(response, request, methodNode) {
23
+ let ResponseHeadersInterceptor = class ResponseHeadersInterceptor {
24
+ interceptResponse(response, request, methodNode) {
24
25
  return __awaiter(this, void 0, void 0, function* () {
25
- if (methodNode.route.context && methodNode.route.context.hasOwnProperty("responseHeaders")) {
26
+ if (methodNode && methodNode.route.context && methodNode.route.context.hasOwnProperty("responseHeaders")) {
26
27
  response.headers = Object.assign(Object.assign({}, response.headers), methodNode.route.context.responseHeaders);
27
28
  }
28
29
  return response;
29
30
  });
30
31
  }
31
32
  };
32
- RouterResponseEnricher = __decorate([
33
- tag(ServiceDefinitionTagEnum.RouterResponseEnricher),
34
- moduleScoped(NetworkingModuleKeyname)
35
- ], RouterResponseEnricher);
36
- export { RouterResponseEnricher };
37
- //# sourceMappingURL=router-response.enricher.js.map
33
+ ResponseHeadersInterceptor = __decorate([
34
+ tag(ServiceDefinitionTagEnum.RequestInterceptor),
35
+ moduleScoped(NetworkingModuleKeyname),
36
+ injectable()
37
+ ], ResponseHeadersInterceptor);
38
+ export { ResponseHeadersInterceptor };
39
+ //# sourceMappingURL=response-headers.interceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-headers.interceptor.js","sourceRoot":"","sources":["../../../../src/interceptors/response-headers.interceptor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,OAAO,EAAC,YAAY,EAAqB,wBAAwB,EAAE,GAAG,EAAC,MAAM,qBAAqB,CAAC;AACnG,OAAO,EAAC,uBAAuB,EAAC,MAAM,8BAA8B,CAAC;AAGrE,OAAO,EAAC,UAAU,EAAC,MAAM,UAAU,CAAC;AACpC;;;GAGG;AAIH,IAAa,0BAA0B,GAAvC,MAAa,0BAA0B;IAC7B,iBAAiB,CAAC,QAAkB,EAAE,OAAgB,EAAE,UAA6B;;YACvF,IAAG,UAAU,IAAI,UAAU,CAAC,KAAK,CAAC,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAC;gBACpG,QAAQ,CAAC,OAAO,mCAAO,QAAQ,CAAC,OAAO,GAAK,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;aACxF;YAED,OAAO,QAAQ,CAAC;QACpB,CAAC;KAAA;CACJ,CAAA;AARY,0BAA0B;IAHtC,GAAG,CAAC,wBAAwB,CAAC,kBAAkB,CAAC;IAChD,YAAY,CAAC,uBAAuB,CAAC;IACrC,UAAU,EAAE;GACA,0BAA0B,CAQtC;SARY,0BAA0B"}
@@ -5,10 +5,9 @@ export * from "./identity-parameteter-decorator.interface";
5
5
  export * from "./parameter-decorator.interface";
6
6
  export * from "./query-parameter-decorator.interface";
7
7
  export * from "./query-parameters-decorator.interface";
8
+ export * from "./request-interceptor.interface";
8
9
  export * from "./request-parameter-decorator.interface";
9
10
  export * from "./route-method-decorator.interface";
10
11
  export * from "./route-parameter-decorator.interface";
11
12
  export * from "./router.interface";
12
- export * from "./router-request-enricher.interface";
13
- export * from "./router-response-enricher.interface";
14
13
  //# sourceMappingURL=interfaces.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../../src/interfaces/interfaces.ts"],"names":[],"mappings":"AAAA,cAAc,sCAAsC,CAAC;AACrD,cAAc,4DAA4D,CAAC;AAC3E,cAAc,yCAAyC,CAAC;AACxD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,iCAAiC,CAAC;AAChD,cAAc,uCAAuC,CAAC;AACtD,cAAc,wCAAwC,CAAC;AACvD,cAAc,yCAAyC,CAAC;AACxD,cAAc,oCAAoC,CAAC;AACnD,cAAc,uCAAuC,CAAC;AACtD,cAAc,oBAAoB,CAAC;AACnC,cAAc,qCAAqC,CAAC;AACpD,cAAc,sCAAsC,CAAC"}
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../../src/interfaces/interfaces.ts"],"names":[],"mappings":"AAAA,cAAc,sCAAsC,CAAC;AACrD,cAAc,4DAA4D,CAAC;AAC3E,cAAc,yCAAyC,CAAC;AACxD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,iCAAiC,CAAC;AAChD,cAAc,uCAAuC,CAAC;AACtD,cAAc,wCAAwC,CAAC;AACvD,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AACxD,cAAc,oCAAoC,CAAC;AACnD,cAAc,uCAAuC,CAAC;AACtD,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=request-interceptor.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-interceptor.interface.js","sourceRoot":"","sources":["../../../../src/interfaces/request-interceptor.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export * from "./request.mapper";
2
+ //# sourceMappingURL=mappers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mappers.js","sourceRoot":"","sources":["../../../../src/mappers/mappers.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,34 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { moduleScoped, Request, Response, ServiceDefinitionTagEnum, tag } from "@pristine-ts/common";
8
+ import { injectable } from "tsyringe";
9
+ import { NetworkingModuleKeyname } from "../networking.module.keyname";
10
+ import { Event } from "@pristine-ts/core";
11
+ let RequestMapper = class RequestMapper {
12
+ supportsMapping(rawEvent, executionContext) {
13
+ return rawEvent instanceof Request;
14
+ }
15
+ map(rawEvent, executionContext) {
16
+ return {
17
+ executionOrder: "sequential",
18
+ events: [new Event("Request", rawEvent)],
19
+ };
20
+ }
21
+ supportsReverseMapping(eventResponse, response, executionContext) {
22
+ return eventResponse.response instanceof Response;
23
+ }
24
+ reverseMap(eventResponse, response, executionContext) {
25
+ return eventResponse.response;
26
+ }
27
+ };
28
+ RequestMapper = __decorate([
29
+ moduleScoped(NetworkingModuleKeyname),
30
+ tag(ServiceDefinitionTagEnum.EventMapper),
31
+ injectable()
32
+ ], RequestMapper);
33
+ export { RequestMapper };
34
+ //# sourceMappingURL=request.mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.mapper.js","sourceRoot":"","sources":["../../../../src/mappers/request.mapper.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAC,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,wBAAwB,EAAE,GAAG,EAAC,MAAM,qBAAqB,CAAC;AACnG,OAAO,EAAC,UAAU,EAAC,MAAM,UAAU,CAAC;AACpC,OAAO,EAAC,uBAAuB,EAAC,MAAM,8BAA8B,CAAC;AACrE,OAAO,EACH,KAAK,EAKR,MAAM,mBAAmB,CAAC;AAK3B,IAAa,aAAa,GAA1B,MAAa,aAAa;IACtB,eAAe,CAAC,QAAa,EAAE,gBAAgD;QAC3E,OAAO,QAAQ,YAAY,OAAO,CAAC;IACvC,CAAC;IAED,GAAG,CAAC,QAAa,EAAE,gBAAgD;QAC/D,OAAO;YACH,cAAc,EAAE,YAAY;YAC5B,MAAM,EAAE,CAAC,IAAI,KAAK,CAAU,SAAS,EAAE,QAAQ,CAAC,CAAC;SACpD,CAAC;IACN,CAAC;IAED,sBAAsB,CAAC,aAA+C,EAAE,QAAa,EAAE,gBAAgD;QACnI,OAAO,aAAa,CAAC,QAAQ,YAAY,QAAQ,CAAC;IACtD,CAAC;IAED,UAAU,CAAC,aAA+C,EAAE,QAAa,EAAE,gBAAgD;QACvH,OAAO,aAAa,CAAC,QAAQ,CAAC;IAClC,CAAC;CAEJ,CAAA;AApBY,aAAa;IAHzB,YAAY,CAAC,uBAAuB,CAAC;IACrC,GAAG,CAAC,wBAAwB,CAAC,WAAW,CAAC;IACzC,UAAU,EAAE;GACA,aAAa,CAoBzB;SApBY,aAAa"}
@@ -1,4 +1,2 @@
1
- export * from "./request";
2
- export * from "./response";
3
1
  export * from "./route";
4
2
  //# sourceMappingURL=models.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"models.js","sourceRoot":"","sources":["../../../../src/models/models.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../../../src/models/models.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC"}
@@ -1,10 +1,13 @@
1
1
  import { NetworkingModuleKeyname } from "./networking.module.keyname";
2
2
  import { SecurityModule } from "@pristine-ts/security";
3
3
  import { TelemetryModule } from "@pristine-ts/telemetry";
4
+ import { BooleanResolver, EnvironmentVariableResolver } from "@pristine-ts/configuration";
4
5
  export * from "./decorators/decorators";
5
- export * from "./enrichers/enrichers";
6
6
  export * from "./errors/errors";
7
+ export * from "./handlers/handlers";
8
+ export * from "./interceptors/interceptors";
7
9
  export * from "./interfaces/interfaces";
10
+ export * from "./mappers/mappers";
8
11
  export * from "./models/models";
9
12
  export * from "./nodes/nodes";
10
13
  export * from "./resolvers/resolvers";
@@ -16,6 +19,15 @@ export const NetworkingModule = {
16
19
  SecurityModule,
17
20
  TelemetryModule,
18
21
  ],
19
- configurationDefinitions: [],
22
+ configurationDefinitions: [
23
+ {
24
+ parameterName: NetworkingModuleKeyname + ".request_body_converter.is_active",
25
+ isRequired: false,
26
+ defaultValue: true,
27
+ defaultResolvers: [
28
+ new BooleanResolver(new EnvironmentVariableResolver("PRISTINE_NETWORKING_REQUEST_BODY_CONVERTER_IS_ACTIVE")),
29
+ ],
30
+ }
31
+ ],
20
32
  };
21
33
  //# sourceMappingURL=networking.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"networking.module.js","sourceRoot":"","sources":["../../../src/networking.module.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,uBAAuB,EAAC,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAC,cAAc,EAAC,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAC,eAAe,EAAC,MAAM,wBAAwB,CAAC;AAEvD,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAE9B,cAAc,UAAU,CAAC;AAEzB,MAAM,CAAC,MAAM,gBAAgB,GAAoB;IAC7C,OAAO,EAAE,uBAAuB;IAChC,aAAa,EAAE;QACX,cAAc;QACd,eAAe;KAClB;IACD,wBAAwB,EAAE,EAEzB;CACJ,CAAA"}
1
+ {"version":3,"file":"networking.module.js","sourceRoot":"","sources":["../../../src/networking.module.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,uBAAuB,EAAC,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAC,cAAc,EAAC,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAC,eAAe,EAAC,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAC,eAAe,EAAE,2BAA2B,EAAC,MAAM,4BAA4B,CAAC;AAExF,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAE9B,cAAc,UAAU,CAAC;AAEzB,MAAM,CAAC,MAAM,gBAAgB,GAAoB;IAC7C,OAAO,EAAE,uBAAuB;IAChC,aAAa,EAAE;QACX,cAAc;QACd,eAAe;KAClB;IACD,wBAAwB,EAAE;QACtB;YACI,aAAa,EAAE,uBAAuB,GAAG,mCAAmC;YAC5E,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,IAAI;YAClB,gBAAgB,EAAE;gBACd,IAAI,eAAe,CAAC,IAAI,2BAA2B,CAAC,sDAAsD,CAAC,CAAC;aAC/G;SACJ;KACJ;CACJ,CAAA"}
@@ -20,16 +20,19 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
20
20
  });
21
21
  };
22
22
  import { inject, singleton } from "tsyringe";
23
- import { Response } from "./models/response";
24
23
  import { UrlUtil } from "./utils/url.util";
25
24
  import { NotFoundHttpError } from "./errors/not-found.http-error";
26
25
  import { PathRouterNode } from "./nodes/path-router.node";
26
+ import { Route } from "./models/route";
27
27
  import { ForbiddenHttpError } from "./errors/forbidden.http-error";
28
28
  import { ControllerMethodParameterDecoratorResolver } from "./resolvers/controller-method-parameter-decorator.resolver";
29
29
  import Url from 'url-parse';
30
- import { ServiceDefinitionTagEnum } from "@pristine-ts/common";
30
+ import { tag, ServiceDefinitionTagEnum, Response } from "@pristine-ts/common";
31
31
  import { NetworkingModuleKeyname } from "./networking.module.keyname";
32
32
  import { SpanKeynameEnum } from "@pristine-ts/telemetry";
33
+ import { controllerRegistry } from "./decorators/controller.decorator";
34
+ import { mergeWith } from "lodash";
35
+ import { HttpError } from "./errors/http.error";
33
36
  /**
34
37
  * The router service is the service that creates the routing tree from the controllers.
35
38
  * It also executes a request properly by routing it to the intended controller and returns the response.
@@ -49,6 +52,8 @@ let Router = class Router {
49
52
  this.authorizerManager = authorizerManager;
50
53
  this.authenticationManager = authenticationManager;
51
54
  this.root = new PathRouterNode("/");
55
+ // This property is used to track whether the router has been already been properly instantiated or not.
56
+ this.setupCompleted = false;
52
57
  }
53
58
  /**
54
59
  * This method registers a Route into the Route Tree maintained by the router.
@@ -61,6 +66,59 @@ let Router = class Router {
61
66
  const splitPaths = UrlUtil.splitPath(path);
62
67
  this.root.add(splitPaths, method, route, 0);
63
68
  }
69
+ // /**
70
+ // * This method loops through the all the classes decorated with @controller, loops through all the methods decorated
71
+ // * with @route and builds the dependency tree of all the routes.
72
+ // *
73
+ // * @private
74
+ // */
75
+ setup() {
76
+ if (this.setupCompleted) {
77
+ return;
78
+ }
79
+ // Loop over all the controllers and control the Route Tree
80
+ controllerRegistry.forEach(controller => {
81
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
82
+ if (controller.hasOwnProperty("__metadata__") === false) {
83
+ return;
84
+ }
85
+ let basePath = (_b = (_a = controller.__metadata__) === null || _a === void 0 ? void 0 : _a.controller) === null || _b === void 0 ? void 0 : _b.basePath;
86
+ // Clean the base path by removing trailing slashes.
87
+ if (basePath.endsWith("/")) {
88
+ basePath = basePath.slice(0, basePath.length - 1);
89
+ }
90
+ for (const methodPropertyKey in (_c = controller.__metadata__) === null || _c === void 0 ? void 0 : _c.methods) {
91
+ if (((_e = (_d = controller.__metadata__) === null || _d === void 0 ? void 0 : _d.methods) === null || _e === void 0 ? void 0 : _e.hasOwnProperty(methodPropertyKey)) === false) {
92
+ continue;
93
+ }
94
+ const method = (_f = controller.__metadata__) === null || _f === void 0 ? void 0 : _f.methods[methodPropertyKey];
95
+ if (method.hasOwnProperty("route") === false) {
96
+ continue;
97
+ }
98
+ // Retrieve the "RouteMethodDecorator" object assigned by the @route decorator at .route
99
+ const routeMethodDecorator = method.route;
100
+ // Build the Route object that will be used the the router to dispatch a request to
101
+ // the appropriate controller method
102
+ const route = new Route(controller.constructor, routeMethodDecorator.methodKeyname);
103
+ route.methodArguments = (_g = method.arguments) !== null && _g !== void 0 ? _g : [];
104
+ route.context = mergeWith({}, (_j = (_h = controller.__metadata__) === null || _h === void 0 ? void 0 : _h.controller) === null || _j === void 0 ? void 0 : _j.__routeContext__, method.__routeContext__);
105
+ // Build the proper path
106
+ let path = routeMethodDecorator.path;
107
+ // Clean the path by removing the first and trailing slashes.
108
+ if (path.startsWith("/")) {
109
+ path = path.slice(1, path.length);
110
+ }
111
+ if (path.endsWith("/")) {
112
+ path = path.slice(0, path.length - 1);
113
+ }
114
+ // Build the proper path
115
+ const routePath = basePath + "/" + path;
116
+ // Register the route
117
+ this.register(routePath, routeMethodDecorator.httpMethod, route);
118
+ }
119
+ });
120
+ this.setupCompleted = true;
121
+ }
64
122
  /**
65
123
  * This method receives a Request object, identifies the "path" its trying to hit, navigates the internally
66
124
  * maintained Route Tree, identifies the method in the controller that represents this "path", and calls the
@@ -70,6 +128,8 @@ let Router = class Router {
70
128
  * @param container
71
129
  */
72
130
  execute(request, container) {
131
+ // todo: remove all the rejects and replace it with a response that contains an error.
132
+ // This method cannot throw.
73
133
  const tracingManager = container.resolve("TracingManagerInterface");
74
134
  const routerRequestExecutionSpan = tracingManager.startSpan(SpanKeynameEnum.RouterRequestExecution, SpanKeynameEnum.RequestExecution);
75
135
  return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
@@ -95,7 +155,7 @@ let Router = class Router {
95
155
  url,
96
156
  }, NetworkingModuleKeyname);
97
157
  routerRequestExecutionSpan.end();
98
- return reject(new NotFoundHttpError("No route found for path: '" + url.pathname + "'."));
158
+ return resolve(this.executeErrorResponseInterceptors(new NotFoundHttpError("No route found for path: '" + url.pathname + "'."), request, container));
99
159
  }
100
160
  // Get the route parameters
101
161
  const routeParameters = methodNode.parent.getRouteParameters(splitPath.reverse());
@@ -129,7 +189,7 @@ let Router = class Router {
129
189
  error = new ForbiddenHttpError("You are not allowed to access this.");
130
190
  }
131
191
  routerRequestExecutionSpan.end();
132
- return reject(error);
192
+ return resolve(this.executeErrorResponseInterceptors(error, request, container, methodNode));
133
193
  }
134
194
  // Call the controller with the resolved Method arguments
135
195
  try {
@@ -142,20 +202,20 @@ let Router = class Router {
142
202
  identity
143
203
  }, NetworkingModuleKeyname);
144
204
  routerRequestExecutionSpan.end();
145
- return reject(new ForbiddenHttpError("You are not allowed to access this."));
205
+ return resolve(this.executeErrorResponseInterceptors(new ForbiddenHttpError("You are not allowed to access this."), request, container, methodNode));
146
206
  }
147
- // Execute all the enrichers to enrich the request.
148
- const requestEnrichersSpan = tracingManager.startSpan(SpanKeynameEnum.RouterRequestEnrichers, SpanKeynameEnum.RouterRequestExecution);
149
- const enrichedRequest = yield this.executeRequestEnrichers(request, container, methodNode);
150
- requestEnrichersSpan.end();
207
+ // Execute all the interceptors
208
+ const requestInterceptorsSpan = tracingManager.startSpan(SpanKeynameEnum.RequestInterceptors, SpanKeynameEnum.RouterRequestExecution);
209
+ const interceptedRequest = yield this.executeRequestInterceptors(request, container, methodNode);
210
+ requestInterceptorsSpan.end();
151
211
  this.loghandler.debug("This request has been enriched", {
152
212
  request,
153
- enrichedRequest,
213
+ interceptedRequest,
154
214
  }, NetworkingModuleKeyname);
155
215
  // Resolve the value to inject in the method arguments that have a decorator resolver
156
216
  const resolvedMethodArguments = [];
157
217
  for (const methodArgument of methodNode.route.methodArguments) {
158
- resolvedMethodArguments.push(yield this.controllerMethodParameterDecoratorResolver.resolve(methodArgument, enrichedRequest, routeParameters, identity));
218
+ resolvedMethodArguments.push(yield this.controllerMethodParameterDecoratorResolver.resolve(methodArgument, interceptedRequest, routeParameters, identity));
159
219
  }
160
220
  this.loghandler.debug("Controller argument resolved", {
161
221
  resolvedMethodArguments,
@@ -179,12 +239,12 @@ let Router = class Router {
179
239
  returnedResponse.status = 200;
180
240
  returnedResponse.body = response;
181
241
  }
182
- const responseEnrichersSpan = tracingManager.startSpan(SpanKeynameEnum.RouterResponseEnrichers, SpanKeynameEnum.RouterRequestExecution);
183
- const enrichedResponse = yield this.executeResponseEnrichers(returnedResponse, request, container, methodNode);
184
- responseEnrichersSpan.end();
242
+ const responseInterceptorsSpan = tracingManager.startSpan(SpanKeynameEnum.ResponseInterceptors, SpanKeynameEnum.RouterRequestExecution);
243
+ const interceptedResponse = yield this.executeResponseInterceptors(returnedResponse, request, container, methodNode);
244
+ responseInterceptorsSpan.end();
185
245
  this.loghandler.debug("This response has been enriched", {
186
246
  returnedResponse,
187
- enrichedResponse,
247
+ enrichedResponse: interceptedResponse,
188
248
  }, NetworkingModuleKeyname);
189
249
  routerRequestExecutionSpan.end();
190
250
  return resolve(returnedResponse);
@@ -193,84 +253,142 @@ let Router = class Router {
193
253
  this.loghandler.error("There was an error trying to execute the request in the router", {
194
254
  error,
195
255
  }, NetworkingModuleKeyname);
256
+ // Execute router interceptors for the error response;
196
257
  routerRequestExecutionSpan.end();
197
- return reject(error);
258
+ return resolve(this.executeErrorResponseInterceptors(error, request, container, methodNode));
198
259
  }
199
260
  }));
200
261
  }
201
262
  /**
202
- * This method executes all the Router response enrichers and returns the response updated by the enrichers.
263
+ * This method executes all the Request Interceptors and returns the request updated by the interceptors.
203
264
  *
204
- * @param response
205
265
  * @param request
206
266
  * @param container
207
267
  * @param methodNode
208
268
  * @private
209
269
  */
210
- executeResponseEnrichers(response, request, container, methodNode) {
270
+ executeRequestInterceptors(request, container, methodNode) {
271
+ var _a, _b, _c;
211
272
  return __awaiter(this, void 0, void 0, function* () {
212
- // Execute all the request enrichers
213
- let enrichedResponse = response;
214
- // Check first if there are any Router Response enrichers
215
- if (container.isRegistered(ServiceDefinitionTagEnum.RouterResponseEnricher, true)) {
216
- const enrichers = container.resolveAll(ServiceDefinitionTagEnum.RouterResponseEnricher);
217
- for (const enricher of enrichers) {
218
- // We don't have a guarantee that the Router response enrichers will implement the Interface, even though we specify it should.
273
+ // Execute all the request interceptors
274
+ let interceptedRequest = request;
275
+ // Check first if there are any Request Interceptors
276
+ if (container.isRegistered(ServiceDefinitionTagEnum.RequestInterceptor, true)) {
277
+ const interceptors = container.resolveAll(ServiceDefinitionTagEnum.RequestInterceptor);
278
+ for (const interceptor of interceptors) {
279
+ // We don't have a guarantee that the Router Interceptors will implement the Interface, even though we specify it should.
219
280
  // So, we have to verify that the method exists, and if it doesn't we throw
220
- if (typeof enricher.enrichResponse === "undefined") {
221
- //todo should we type this error ?
222
- throw new Error("The Router Response Enricher named: '" + enricher.constructor.name + "' doesn't have the 'enrichResponse' method. RouterResponseEnrichers should implement the RouterResponseEnricher interface.");
281
+ if (typeof interceptor.interceptRequest === "undefined") {
282
+ // Simply log a message for now that the interceptors doesn't implement the 'interceptRequest' method.
283
+ this.loghandler.info("The Request Interceptor doesn't implement the interceptRequest method.", { name: interceptor.constructor.name, interceptor });
284
+ continue;
223
285
  }
224
286
  try {
225
287
  // https://stackoverflow.com/a/27760489/684101
226
- enrichedResponse = yield Promise.resolve(enricher.enrichResponse(enrichedResponse, request, methodNode));
288
+ interceptedRequest = (_c = yield ((_b = (_a = interceptor).interceptRequest) === null || _b === void 0 ? void 0 : _b.call(_a, interceptedRequest, methodNode))) !== null && _c !== void 0 ? _c : interceptedRequest;
227
289
  }
228
290
  catch (e) {
229
- this.loghandler.error("There was an exception thrown while executing the 'enrichResponse' method of the RouterResponseEnricher named: '" + enricher.constructor.name + "'.", { e }, NetworkingModuleKeyname);
291
+ this.loghandler.error("There was an exception thrown while executing the 'interceptedRequest' method of the RequestInterceptor named: '" + interceptor.constructor.name + "'.", { e }, NetworkingModuleKeyname);
230
292
  throw e;
231
293
  }
232
294
  }
233
295
  }
234
- return enrichedResponse;
296
+ return interceptedRequest;
235
297
  });
236
298
  }
237
299
  /**
238
- * This method executes all the Router request enrichers and returns the request updated by the enrichers.
300
+ * This method executes all the Request Interceptors and returns the response updated by the interceptors.
239
301
  *
302
+ * @param response
240
303
  * @param request
241
304
  * @param container
242
305
  * @param methodNode
243
306
  * @private
244
307
  */
245
- executeRequestEnrichers(request, container, methodNode) {
308
+ executeResponseInterceptors(response, request, container, methodNode) {
309
+ var _a, _b, _c;
246
310
  return __awaiter(this, void 0, void 0, function* () {
247
- // Execute all the request enrichers
248
- let enrichedRequest = request;
249
- // Check first if there are any Router Request enrichers
250
- if (container.isRegistered(ServiceDefinitionTagEnum.RouterRequestEnricher, true)) {
251
- const enrichers = container.resolveAll(ServiceDefinitionTagEnum.RouterRequestEnricher);
252
- for (const enricher of enrichers) {
253
- // We don't have a guarantee that the Router response enrichers will implement the Interface, even though we specify it should.
311
+ // Execute all the request interceptors
312
+ let interceptedResponse = response;
313
+ // Check first if there are any Request interceptors
314
+ if (container.isRegistered(ServiceDefinitionTagEnum.RequestInterceptor, true)) {
315
+ const interceptors = container.resolveAll(ServiceDefinitionTagEnum.RequestInterceptor);
316
+ for (const interceptor of interceptors) {
317
+ // We don't have a guarantee that the Router response interceptors will implement the Interface, even though we specify it should.
254
318
  // So, we have to verify that the method exists, and if it doesn't we throw
255
- if (typeof enricher.enrichRequest === "undefined") {
256
- //todo should we type this error ?
257
- throw new Error("The Router Request Enricher named: '" + enricher.constructor.name + "' doesn't have the 'enrichRequest' method. RouterRequestEnrichers should implement the RouterRequestEnricher interface.");
319
+ if (typeof interceptor.interceptResponse === "undefined") {
320
+ // Simply log a message for now that the interceptors doesn't implement the 'interceptResponse' method.
321
+ this.loghandler.info("The Request Interceptor doesn't implement the interceptResponse method.", { name: interceptor.constructor.name, interceptor });
322
+ continue;
258
323
  }
259
324
  try {
260
- // https://stackoverflow.com/a/27760489/684101
261
- enrichedRequest = yield Promise.resolve(enricher.enrichRequest(enrichedRequest, methodNode));
325
+ interceptedResponse = (_c = yield ((_b = (_a = interceptor).interceptResponse) === null || _b === void 0 ? void 0 : _b.call(_a, interceptedResponse, request, methodNode))) !== null && _c !== void 0 ? _c : interceptedResponse;
326
+ }
327
+ catch (e) {
328
+ this.loghandler.error("There was an exception thrown while executing the 'interceptResponse' method of the RequestInterceptor named: '" + interceptor.constructor.name + "'.", { e }, NetworkingModuleKeyname);
329
+ throw e;
330
+ }
331
+ }
332
+ }
333
+ return interceptedResponse;
334
+ });
335
+ }
336
+ /**
337
+ * This method executes all the Request Interceptors and returns the response updated by the error interceptors.
338
+ *
339
+ * @param error
340
+ * @param request
341
+ * @param container
342
+ * @param methodNode
343
+ * @private
344
+ */
345
+ executeErrorResponseInterceptors(error, request, container, methodNode) {
346
+ var _a, _b, _c;
347
+ return __awaiter(this, void 0, void 0, function* () {
348
+ // Execute all the request interceptors
349
+ let interceptedResponse = new Response();
350
+ if (error instanceof HttpError) {
351
+ interceptedResponse.status = error.httpStatus;
352
+ interceptedResponse.body = {
353
+ name: error.name,
354
+ message: error.message,
355
+ stack: error.stack,
356
+ errors: error.errors,
357
+ extra: error.extra,
358
+ };
359
+ }
360
+ else {
361
+ interceptedResponse.status = 500;
362
+ interceptedResponse.body = { name: error.name, message: error.message, stack: error.stack };
363
+ }
364
+ interceptedResponse.request = request;
365
+ // Check first if there are any Request interceptors
366
+ if (container.isRegistered(ServiceDefinitionTagEnum.RequestInterceptor, true)) {
367
+ const interceptors = container.resolveAll(ServiceDefinitionTagEnum.RequestInterceptor);
368
+ for (const interceptor of interceptors) {
369
+ // We don't have a guarantee that the Router response interceptors will implement the Interface, even though we specify it should.
370
+ // So, we have to verify that the method exists, and if it doesn't we throw
371
+ if (typeof interceptor.interceptError === "undefined") {
372
+ // Simply log a message for now that the interceptors doesn't implement the 'interceptError' method.
373
+ this.loghandler.info("The Request Interceptor doesn't implement the interceptError method.", { name: interceptor.constructor.name, interceptor });
374
+ continue;
375
+ }
376
+ try {
377
+ interceptedResponse = (_c = yield ((_b = (_a = interceptor).interceptError) === null || _b === void 0 ? void 0 : _b.call(_a, error, interceptedResponse, request, methodNode))) !== null && _c !== void 0 ? _c : interceptedResponse;
262
378
  }
263
379
  catch (e) {
264
- this.loghandler.error("There was an exception thrown while executing the 'enrichedRequest' method of the RouterRequestEnricher named: '" + enricher.constructor.name + "'.", { e }, NetworkingModuleKeyname);
380
+ this.loghandler.error("There was an exception thrown while executing the 'interceptError' method of the RequestInterceptor named: '" + interceptor.constructor.name + "'.", { e }, NetworkingModuleKeyname);
265
381
  throw e;
266
382
  }
267
383
  }
268
384
  }
269
- return enrichedRequest;
385
+ interceptedResponse = yield this.executeResponseInterceptors(interceptedResponse, request, container, methodNode);
386
+ return interceptedResponse;
270
387
  });
271
388
  }
272
389
  };
273
390
  Router = __decorate([
391
+ tag("RouterInterface"),
274
392
  singleton(),
275
393
  __param(0, inject("LogHandlerInterface")),
276
394
  __param(2, inject("AuthorizerManagerInterface")),