@shrub/express 0.5.47 → 0.5.50

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.
@@ -1,15 +1,17 @@
1
- import { RequestHandler } from "express";
1
+ import { NextFunction, Request, RequestHandler, Response } from "express";
2
2
  import { PathParams } from "express-serve-static-core";
3
3
  import { IExpressApplication } from "./app";
4
4
  import { Constructor } from "./controller";
5
5
  export declare type ControllerInvokerConstructor<T> = {
6
6
  new (options: IControllerInvokerOptions): T;
7
7
  };
8
+ export declare type ControllerErrorRequestHandler = (err: any, req: Request, res: Response, next: NextFunction, retry: Function, retryCount: number) => void;
8
9
  /** Defines options for a controller invoker. */
9
10
  export interface IControllerInvokerOptions {
10
11
  readonly app: IExpressApplication;
11
12
  readonly handler?: RequestHandler;
12
13
  readonly prepare?: RequestHandler;
14
+ readonly error?: ControllerErrorRequestHandler;
13
15
  }
14
16
  /** Defines options when creating a new controller invoker. */
15
17
  export interface ICreateControllerInvokerOptions {
@@ -17,6 +19,11 @@ export interface ICreateControllerInvokerOptions {
17
19
  readonly handler?: RequestHandler;
18
20
  /** A handler that gets invoked prior to invoking any middleware and is useful for pre-handling a request/response. */
19
21
  readonly prepare?: RequestHandler;
22
+ /**
23
+ * A callback that will get called when a request generates an error and allows the ability to retry a request.
24
+ * Note: when retrying a request there is no need to invoke 'next'; the retry attempt will rebuild the request/response and invoke the request pipeline again.
25
+ */
26
+ readonly error?: ControllerErrorRequestHandler;
20
27
  }
21
28
  /** A service for creating controller invokers. */
22
29
  export interface IControllerInvokerService {
@@ -25,28 +25,47 @@ class ControllerInvoker {
25
25
  invokeAction(options) {
26
26
  const router = controller_1.controller(options.controller);
27
27
  return new Promise((resolve, reject) => {
28
- // create the express Request object to pass down the request chain
29
- const req = this.createExpressRequest(options);
30
- // create the express Response object that will resovle the Promise when the response has ended (i.e. when res.end is inovked)
31
- const res = this.createExpressResponse(resolve);
28
+ let retryCount;
32
29
  // if an error is returned at any point reject the promise
33
- const nextOrReject = (err, next) => {
30
+ const nextOrReject = (err, req, res, next) => {
34
31
  if (err) {
35
- reject(err);
32
+ if (this.options.error) {
33
+ // 1) if the error handler invokes next reject using the provided error
34
+ // 2) there doesn't seem to be a good way to retry a request so call invokeAction to rebuild request/response and try again
35
+ const retry = () => {
36
+ retryCount = retryCount || 0;
37
+ retryCount++;
38
+ invokeAction();
39
+ };
40
+ this.options.error(err, req, res, (err2) => reject(err2), retry, retryCount || 0);
41
+ }
42
+ else {
43
+ reject(err);
44
+ }
36
45
  }
37
46
  else {
38
47
  next();
39
48
  }
40
49
  };
41
- // first invoke prepare
42
- this.prepare(req, res, (err) => nextOrReject(err, () => {
43
- // if successful, invoke the application middleware pipeline
44
- this.options.app(req, res, (err) => nextOrReject(err, () => {
45
- // next, invoke the handler prior to invoking the route/controller
46
- // the router handles invoking the controller and if next is invoked assume an error or a 404
47
- this.handler(req, res, (err) => nextOrReject(err, () => router(req, res, (err) => reject(err || new Error(`Path ${options.path} not found.`)))));
50
+ const invokeAction = () => {
51
+ // create the express Request object to pass down the request chain
52
+ const req = this.createExpressRequest(options);
53
+ // create the express Response object that will resovle the Promise when the response has ended (i.e. when res.end is inovked)
54
+ const res = this.createExpressResponse(resolve);
55
+ // first invoke prepare
56
+ this.prepare(req, res, (err) => nextOrReject(err, req, res, () => {
57
+ // if successful, invoke the application middleware pipeline
58
+ this.options.app(req, res, (err) => nextOrReject(err, req, res, () => {
59
+ // next, invoke the handler prior to invoking the route/controller
60
+ // the router handles invoking the controller and if next is invoked assume an error or a 404
61
+ this.handler(req, res, (err) => nextOrReject(err, req, res, () => router(req, res, (err) => {
62
+ err = err || new Error(`Path ${options.path} not found.`);
63
+ nextOrReject(err, req, res, () => reject(new Error("Failed to process request successfully.")));
64
+ })));
65
+ }));
48
66
  }));
49
- }));
67
+ };
68
+ invokeAction();
50
69
  });
51
70
  }
52
71
  createExpressRequest(options) {
@@ -108,7 +127,12 @@ let ControllerInvokerService = class ControllerInvokerService {
108
127
  this.app = app;
109
128
  }
110
129
  createControllerInvoker(ctor, options) {
111
- return new ctor({ app: this.app, handler: options && options.handler, prepare: options && options.prepare });
130
+ return new ctor({
131
+ app: this.app,
132
+ handler: options && options.handler,
133
+ prepare: options && options.prepare,
134
+ error: options && options.error
135
+ });
112
136
  }
113
137
  };
114
138
  ControllerInvokerService = __decorate([
@@ -116,4 +140,4 @@ ControllerInvokerService = __decorate([
116
140
  __param(0, app_1.IExpressApplication)
117
141
  ], ControllerInvokerService);
118
142
  exports.ControllerInvokerService = ControllerInvokerService;
119
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci1pbnZva2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnRyb2xsZXItaW52b2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxzQ0FBdUQ7QUFHdkQsK0JBQTRDO0FBQzVDLDZDQUF1RDtBQXNDMUMsUUFBQSx5QkFBeUIsR0FBRyxvQkFBYSxDQUE0Qiw0QkFBNEIsQ0FBQyxDQUFDO0FBRWhILGdGQUFnRjtBQUNoRixNQUFzQixpQkFBaUI7SUFJbkMsWUFBNkIsT0FBa0M7UUFBbEMsWUFBTyxHQUFQLE9BQU8sQ0FBMkI7UUFDM0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQzVFLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztJQUNoRixDQUFDO0lBRUQsb0hBQW9IO0lBQzFHLFlBQVksQ0FBYyxPQUErQztRQUMvRSxNQUFNLE1BQU0sR0FBRyx1QkFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ25DLG1FQUFtRTtZQUNuRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0MsOEhBQThIO1lBQzlILE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENB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
143
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci1pbnZva2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnRyb2xsZXItaW52b2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxzQ0FBdUQ7QUFHdkQsK0JBQTRDO0FBQzVDLDZDQUF1RDtBQTZDMUMsUUFBQSx5QkFBeUIsR0FBRyxvQkFBYSxDQUE0Qiw0QkFBNEIsQ0FBQyxDQUFDO0FBRWhILGdGQUFnRjtBQUNoRixNQUFzQixpQkFBaUI7SUFJbkMsWUFBNkIsT0FBa0M7UUFBbEMsWUFBTyxHQUFQLE9BQU8sQ0FBMkI7UUFDM0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQzVFLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztJQUNoRixDQUFDO0lBRUQsb0hBQW9IO0lBQzFHLFlBQVksQ0FBYyxPQUErQztRQUMvRSxNQUFNLE1BQU0sR0FBRyx1QkFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ25DLElBQUksVUFBOEIsQ0FBQztZQUNuQywwREFBMEQ7WUFDMUQsTUFBTSxZQUFZLEdBQXdCLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7Z0JBQzlELElBQUksR0FBRyxFQUFFO29CQUNM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
@@ -22,28 +22,47 @@ export class ControllerInvoker {
22
22
  invokeAction(options) {
23
23
  const router = controller(options.controller);
24
24
  return new Promise((resolve, reject) => {
25
- // create the express Request object to pass down the request chain
26
- const req = this.createExpressRequest(options);
27
- // create the express Response object that will resovle the Promise when the response has ended (i.e. when res.end is inovked)
28
- const res = this.createExpressResponse(resolve);
25
+ let retryCount;
29
26
  // if an error is returned at any point reject the promise
30
- const nextOrReject = (err, next) => {
27
+ const nextOrReject = (err, req, res, next) => {
31
28
  if (err) {
32
- reject(err);
29
+ if (this.options.error) {
30
+ // 1) if the error handler invokes next reject using the provided error
31
+ // 2) there doesn't seem to be a good way to retry a request so call invokeAction to rebuild request/response and try again
32
+ const retry = () => {
33
+ retryCount = retryCount || 0;
34
+ retryCount++;
35
+ invokeAction();
36
+ };
37
+ this.options.error(err, req, res, (err2) => reject(err2), retry, retryCount || 0);
38
+ }
39
+ else {
40
+ reject(err);
41
+ }
33
42
  }
34
43
  else {
35
44
  next();
36
45
  }
37
46
  };
38
- // first invoke prepare
39
- this.prepare(req, res, (err) => nextOrReject(err, () => {
40
- // if successful, invoke the application middleware pipeline
41
- this.options.app(req, res, (err) => nextOrReject(err, () => {
42
- // next, invoke the handler prior to invoking the route/controller
43
- // the router handles invoking the controller and if next is invoked assume an error or a 404
44
- this.handler(req, res, (err) => nextOrReject(err, () => router(req, res, (err) => reject(err || new Error(`Path ${options.path} not found.`)))));
47
+ const invokeAction = () => {
48
+ // create the express Request object to pass down the request chain
49
+ const req = this.createExpressRequest(options);
50
+ // create the express Response object that will resovle the Promise when the response has ended (i.e. when res.end is inovked)
51
+ const res = this.createExpressResponse(resolve);
52
+ // first invoke prepare
53
+ this.prepare(req, res, (err) => nextOrReject(err, req, res, () => {
54
+ // if successful, invoke the application middleware pipeline
55
+ this.options.app(req, res, (err) => nextOrReject(err, req, res, () => {
56
+ // next, invoke the handler prior to invoking the route/controller
57
+ // the router handles invoking the controller and if next is invoked assume an error or a 404
58
+ this.handler(req, res, (err) => nextOrReject(err, req, res, () => router(req, res, (err) => {
59
+ err = err || new Error(`Path ${options.path} not found.`);
60
+ nextOrReject(err, req, res, () => reject(new Error("Failed to process request successfully.")));
61
+ })));
62
+ }));
45
63
  }));
46
- }));
64
+ };
65
+ invokeAction();
47
66
  });
48
67
  }
49
68
  createExpressRequest(options) {
@@ -104,7 +123,12 @@ let ControllerInvokerService = class ControllerInvokerService {
104
123
  this.app = app;
105
124
  }
106
125
  createControllerInvoker(ctor, options) {
107
- return new ctor({ app: this.app, handler: options && options.handler, prepare: options && options.prepare });
126
+ return new ctor({
127
+ app: this.app,
128
+ handler: options && options.handler,
129
+ prepare: options && options.prepare,
130
+ error: options && options.error
131
+ });
108
132
  }
109
133
  };
110
134
  ControllerInvokerService = __decorate([
@@ -112,4 +136,4 @@ ControllerInvokerService = __decorate([
112
136
  __param(0, IExpressApplication)
113
137
  ], ControllerInvokerService);
114
138
  export { ControllerInvokerService };
115
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci1pbnZva2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnRyb2xsZXItaW52b2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUd2RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDNUMsT0FBTyxFQUFFLFVBQVUsRUFBZSxNQUFNLGNBQWMsQ0FBQztBQXNDdkQsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsYUFBYSxDQUE0Qiw0QkFBNEIsQ0FBQyxDQUFDO0FBRWhILGdGQUFnRjtBQUNoRixNQUFNLE9BQWdCLGlCQUFpQjtJQUluQyxZQUE2QixPQUFrQztRQUFsQyxZQUFPLEdBQVAsT0FBTyxDQUEyQjtRQUMzRCxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDNUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxvSEFBb0g7SUFDMUcsWUFBWSxDQUFjLE9BQStDO1FBQy9FLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNuQyxtRUFBbUU7WUFDbkUsTUFBTSxH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
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci1pbnZva2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnRyb2xsZXItaW52b2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUd2RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDNUMsT0FBTyxFQUFFLFVBQVUsRUFBZSxNQUFNLGNBQWMsQ0FBQztBQTZDdkQsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsYUFBYSxDQUE0Qiw0QkFBNEIsQ0FBQyxDQUFDO0FBRWhILGdGQUFnRjtBQUNoRixNQUFNLE9BQWdCLGlCQUFpQjtJQUluQyxZQUE2QixPQUFrQztRQUFsQyxZQUFPLEdBQVAsT0FBTyxDQUEyQjtRQUMzRCxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDNUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxvSEFBb0g7SUFDMUcsWUFBWSxDQUFjLE9BQStDO1FBQy9FLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNuQyxJQUFJLFVBQThCLENBQUM7WUFD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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@shrub/express",
3
3
  "description": "A module that adds support for Express based apps.",
4
- "version": "0.5.47",
4
+ "version": "0.5.50",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
@@ -25,12 +25,12 @@
25
25
  "test": "jest"
26
26
  },
27
27
  "dependencies": {
28
- "@shrub/core": "0.5.47",
29
- "@shrub/http": "0.5.47",
28
+ "@shrub/core": "0.5.50",
29
+ "@shrub/http": "0.5.50",
30
30
  "express": "^4.17.1"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/express": "4.17.9"
34
34
  },
35
- "gitHead": "fc54ebb4aabb49bda42dab6456054cc7715b2070"
35
+ "gitHead": "e32c3a3fc3cbbbfdebf6847a313f623de4976af1"
36
36
  }