@shrub/express 0.5.44 → 0.5.48

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,18 +1,33 @@
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) => void;
8
9
  /** Defines options for a controller invoker. */
9
10
  export interface IControllerInvokerOptions {
10
11
  readonly app: IExpressApplication;
11
12
  readonly handler?: RequestHandler;
13
+ readonly prepare?: RequestHandler;
14
+ readonly error?: ControllerErrorRequestHandler;
15
+ }
16
+ /** Defines options when creating a new controller invoker. */
17
+ export interface ICreateControllerInvokerOptions {
18
+ /** A handler that gets invoked prior to invoking the action but after any pre-configured application middleware. */
19
+ readonly handler?: RequestHandler;
20
+ /** A handler that gets invoked prior to invoking any middleware and is useful for pre-handling a request/response. */
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;
12
27
  }
13
28
  /** A service for creating controller invokers. */
14
29
  export interface IControllerInvokerService {
15
- createControllerInvoker<T>(ctor: ControllerInvokerConstructor<T>, handler?: RequestHandler): T;
30
+ createControllerInvoker<T>(ctor: ControllerInvokerConstructor<T>, options?: ICreateControllerInvokerOptions): T;
16
31
  }
17
32
  /** Defines options for invoking a controller action. */
18
33
  export interface IControllerRequestOptions<TController> {
@@ -31,6 +46,7 @@ export declare const IControllerInvokerService: import("@shrub/core").IService<I
31
46
  export declare abstract class ControllerInvoker {
32
47
  private readonly options;
33
48
  private readonly handler;
49
+ private readonly prepare;
34
50
  constructor(options: IControllerInvokerOptions);
35
51
  /** Invokes an express request handler directly which represents a single controller action and returns a result. */
36
52
  protected invokeAction<TController>(options: IControllerRequestOptions<TController>): Promise<IControllerResponse>;
@@ -19,29 +19,47 @@ class ControllerInvoker {
19
19
  constructor(options) {
20
20
  this.options = options;
21
21
  this.handler = !options.handler ? (_, __, next) => next() : options.handler;
22
+ this.prepare = !options.prepare ? (_, __, next) => next() : options.prepare;
22
23
  }
23
24
  /** Invokes an express request handler directly which represents a single controller action and returns a result. */
24
25
  invokeAction(options) {
25
26
  const router = controller_1.controller(options.controller);
26
27
  return new Promise((resolve, reject) => {
27
- // create the express Request object to pass down the request chain
28
- const req = this.createExpressRequest(options);
29
- // create the express Response object that will resovle the Promise when the response has ended (i.e. when res.end is inovked)
30
- const res = this.createExpressResponse(resolve);
31
28
  // if an error is returned at any point reject the promise
32
- const nextOrReject = (err, next) => {
29
+ const nextOrReject = (err, req, res, next) => {
33
30
  if (err) {
34
- reject(err);
31
+ if (this.options.error) {
32
+ // 1) if the error handler invokes next reject using the provided error
33
+ // 2) there doesn't seem to be a good way to retry a request so call invokeAction to rebuild request/response and try again
34
+ this.options.error(err, req, res, (err2) => reject(err2), () => invokeAction());
35
+ }
36
+ else {
37
+ reject(err);
38
+ }
35
39
  }
36
40
  else {
37
41
  next();
38
42
  }
39
43
  };
40
- this.options.app(req, res, (err) => nextOrReject(err, () => {
41
- // the handler is the custom handler provided to the controller invoker, this allows configuring the express middleware before invoking the controller
42
- // the router handles invoking the controller and if next is invoked assume an error or a 404
43
- this.handler(req, res, (err) => nextOrReject(err, () => router(req, res, (err) => reject(err || new Error(`Path ${options.path} not found.`)))));
44
- }));
44
+ const invokeAction = () => {
45
+ // create the express Request object to pass down the request chain
46
+ const req = this.createExpressRequest(options);
47
+ // create the express Response object that will resovle the Promise when the response has ended (i.e. when res.end is inovked)
48
+ const res = this.createExpressResponse(resolve);
49
+ // first invoke prepare
50
+ this.prepare(req, res, (err) => nextOrReject(err, req, res, () => {
51
+ // if successful, invoke the application middleware pipeline
52
+ this.options.app(req, res, (err) => nextOrReject(err, req, res, () => {
53
+ // next, invoke the handler prior to invoking the route/controller
54
+ // the router handles invoking the controller and if next is invoked assume an error or a 404
55
+ this.handler(req, res, (err) => nextOrReject(err, req, res, () => router(req, res, (err) => {
56
+ err = err || new Error(`Path ${options.path} not found.`);
57
+ nextOrReject(err, req, res, () => reject(new Error("Failed to process request successfully.")));
58
+ })));
59
+ }));
60
+ }));
61
+ };
62
+ invokeAction();
45
63
  });
46
64
  }
47
65
  createExpressRequest(options) {
@@ -102,8 +120,13 @@ let ControllerInvokerService = class ControllerInvokerService {
102
120
  constructor(app) {
103
121
  this.app = app;
104
122
  }
105
- createControllerInvoker(ctor, handler) {
106
- return new ctor({ app: this.app, handler });
123
+ createControllerInvoker(ctor, options) {
124
+ return new ctor({
125
+ app: this.app,
126
+ handler: options && options.handler,
127
+ prepare: options && options.prepare,
128
+ error: options && options.error
129
+ });
107
130
  }
108
131
  };
109
132
  ControllerInvokerService = __decorate([
@@ -111,4 +134,4 @@ ControllerInvokerService = __decorate([
111
134
  __param(0, app_1.IExpressApplication)
112
135
  ], ControllerInvokerService);
113
136
  exports.ControllerInvokerService = ControllerInvokerService;
114
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci1pbnZva2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnRyb2xsZXItaW52b2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxzQ0FBdUQ7QUFHdkQsK0JBQTRDO0FBQzVDLDZDQUF1RDtBQTZCMUMsUUFBQSx5QkFBeUIsR0FBRyxvQkFBYSxDQUE0Qiw0QkFBNEIsQ0FBQyxDQUFDO0FBRWhILGdGQUFnRjtBQUNoRixNQUFzQixpQkFBaUI7SUFHbkMsWUFBNkIsT0FBa0M7UUFBbEMsWUFBTyxHQUFQLE9BQU8sQ0FBMkI7UUFDM0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxvSEFBb0g7SUFDMUcsWUFBWSxDQUFjLE9BQStDO1FBQy9FLE1BQU0sTUFBTSxHQUFHLHVCQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDbkMsbUVBQW1FO1lBQ25FLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMvQyw4SEFBOEg7WUFDOUgsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELDBEQUEwRDtZQUMxRCxNQUFNLFlBQVksR0FBRyxDQUFDLEdBQVEsRUFBRSxJQUFnQixFQUFFLEVBQUU7Z0JBQ2hELElBQUksR0FBRyxFQUFFO29CQUNMLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDZjtxQkFDSTtvQkFDRCxJQUFJLEVB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
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci1pbnZva2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnRyb2xsZXItaW52b2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxzQ0FBdUQ7QUFHdkQsK0JBQTRDO0FBQzVDLDZDQUF1RDtBQTZDMUMsUUFBQSx5QkFBeUIsR0FBRyxvQkFBYSxDQUE0Qiw0QkFBNEIsQ0FBQyxDQUFDO0FBRWhILGdGQUFnRjtBQUNoRixNQUFzQixpQkFBaUI7SUFJbkMsWUFBNkIsT0FBa0M7UUFBbEMsWUFBTyxHQUFQLE9BQU8sQ0FBMkI7UUFDM0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQzVFLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztJQUNoRixDQUFDO0lBRUQsb0hBQW9IO0lBQzFHLFlBQVksQ0FBYyxPQUErQztRQUMvRSxNQUFNLE1BQU0sR0FBRyx1QkFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ25DLDBEQUEwRDtZQUMxRCxNQUFNLFlBQVksR0FBd0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRTtnQkFDOUQsSUFBSSxHQUFHLEVBQUU7b0JBQ0wsSUFBSSxJQUFJLENBQUMsT0FBTyxD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
@@ -16,29 +16,47 @@ export class ControllerInvoker {
16
16
  constructor(options) {
17
17
  this.options = options;
18
18
  this.handler = !options.handler ? (_, __, next) => next() : options.handler;
19
+ this.prepare = !options.prepare ? (_, __, next) => next() : options.prepare;
19
20
  }
20
21
  /** Invokes an express request handler directly which represents a single controller action and returns a result. */
21
22
  invokeAction(options) {
22
23
  const router = controller(options.controller);
23
24
  return new Promise((resolve, reject) => {
24
- // create the express Request object to pass down the request chain
25
- const req = this.createExpressRequest(options);
26
- // create the express Response object that will resovle the Promise when the response has ended (i.e. when res.end is inovked)
27
- const res = this.createExpressResponse(resolve);
28
25
  // if an error is returned at any point reject the promise
29
- const nextOrReject = (err, next) => {
26
+ const nextOrReject = (err, req, res, next) => {
30
27
  if (err) {
31
- reject(err);
28
+ if (this.options.error) {
29
+ // 1) if the error handler invokes next reject using the provided error
30
+ // 2) there doesn't seem to be a good way to retry a request so call invokeAction to rebuild request/response and try again
31
+ this.options.error(err, req, res, (err2) => reject(err2), () => invokeAction());
32
+ }
33
+ else {
34
+ reject(err);
35
+ }
32
36
  }
33
37
  else {
34
38
  next();
35
39
  }
36
40
  };
37
- this.options.app(req, res, (err) => nextOrReject(err, () => {
38
- // the handler is the custom handler provided to the controller invoker, this allows configuring the express middleware before invoking the controller
39
- // the router handles invoking the controller and if next is invoked assume an error or a 404
40
- this.handler(req, res, (err) => nextOrReject(err, () => router(req, res, (err) => reject(err || new Error(`Path ${options.path} not found.`)))));
41
- }));
41
+ const invokeAction = () => {
42
+ // create the express Request object to pass down the request chain
43
+ const req = this.createExpressRequest(options);
44
+ // create the express Response object that will resovle the Promise when the response has ended (i.e. when res.end is inovked)
45
+ const res = this.createExpressResponse(resolve);
46
+ // first invoke prepare
47
+ this.prepare(req, res, (err) => nextOrReject(err, req, res, () => {
48
+ // if successful, invoke the application middleware pipeline
49
+ this.options.app(req, res, (err) => nextOrReject(err, req, res, () => {
50
+ // next, invoke the handler prior to invoking the route/controller
51
+ // the router handles invoking the controller and if next is invoked assume an error or a 404
52
+ this.handler(req, res, (err) => nextOrReject(err, req, res, () => router(req, res, (err) => {
53
+ err = err || new Error(`Path ${options.path} not found.`);
54
+ nextOrReject(err, req, res, () => reject(new Error("Failed to process request successfully.")));
55
+ })));
56
+ }));
57
+ }));
58
+ };
59
+ invokeAction();
42
60
  });
43
61
  }
44
62
  createExpressRequest(options) {
@@ -98,8 +116,13 @@ let ControllerInvokerService = class ControllerInvokerService {
98
116
  constructor(app) {
99
117
  this.app = app;
100
118
  }
101
- createControllerInvoker(ctor, handler) {
102
- return new ctor({ app: this.app, handler });
119
+ createControllerInvoker(ctor, options) {
120
+ return new ctor({
121
+ app: this.app,
122
+ handler: options && options.handler,
123
+ prepare: options && options.prepare,
124
+ error: options && options.error
125
+ });
103
126
  }
104
127
  };
105
128
  ControllerInvokerService = __decorate([
@@ -107,4 +130,4 @@ ControllerInvokerService = __decorate([
107
130
  __param(0, IExpressApplication)
108
131
  ], ControllerInvokerService);
109
132
  export { ControllerInvokerService };
110
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci1pbnZva2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnRyb2xsZXItaW52b2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUd2RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDNUMsT0FBTyxFQUFFLFVBQVUsRUFBZSxNQUFNLGNBQWMsQ0FBQztBQTZCdkQsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsYUFBYSxDQUE0Qiw0QkFBNEIsQ0FBQyxDQUFDO0FBRWhILGdGQUFnRjtBQUNoRixNQUFNLE9BQWdCLGlCQUFpQjtJQUduQyxZQUE2QixPQUFrQztRQUFsQyxZQUFPLEdBQVAsT0FBTyxDQUEyQjtRQUMzRCxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7SUFDaEYsQ0FBQztJQUVELG9IQUFvSDtJQUMxRyxZQUFZLENBQWMsT0FBK0M7UUFDL0UsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ25DLG1FQUFtRTtZQUNuRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0MsOEhBQThIO1lBQzlILE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNoRCwwREFBMEQ7WUFDMUQsTUFBTSxZQUFZLEdBQUcs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
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci1pbnZva2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnRyb2xsZXItaW52b2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUd2RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDNUMsT0FBTyxFQUFFLFVBQVUsRUFBZSxNQUFNLGNBQWMsQ0FBQztBQTZDdkQsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsYUFBYSxDQUE0Qiw0QkFBNEIsQ0FBQyxDQUFDO0FBRWhILGdGQUFnRjtBQUNoRixNQUFNLE9BQWdCLGlCQUFpQjtJQUluQyxZQUE2QixPQUFrQztRQUFsQyxZQUFPLEdBQVAsT0FBTyxDQUEyQjtRQUMzRCxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDNUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxvSEFBb0g7SUFDMUcsWUFBWSxDQUFjLE9BQStDO1FBQy9FLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNuQywwREFBMEQ7WUFDMUQsTUFBTSxZ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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.44",
4
+ "version": "0.5.48",
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.44",
29
- "@shrub/http": "0.5.44",
28
+ "@shrub/core": "0.5.48",
29
+ "@shrub/http": "0.5.48",
30
30
  "express": "^4.17.1"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/express": "4.17.9"
34
34
  },
35
- "gitHead": "e98c26b32490507da514c22942785bad35ea27c5"
35
+ "gitHead": "881c0c9aeedab585880eade8f8a3c811e7c6290b"
36
36
  }