From 2d3fdb386f0bd4888d9114c26530d3416d7117f8 Mon Sep 17 00:00:00 2001 From: Raymond Feng Date: Wed, 15 Apr 2020 16:45:19 -0700 Subject: [PATCH 01/10] feat(express): add @loopBack/express to integrate with Express middleware - add `Middleware` as interceptors that use request context - add `InvokeMiddleware` to invoke middleware in a chain - add extension points for Middleware extensions - add helper methods to adapt express middleware as interceptors - add helper methods to adapt LoopBack middleware chain as Express middleware - add ExpressServer and ExpressApplication to extend Express with LoopBack core --- CODEOWNERS | 1 + docs/site/MONOREPO.md | 2 +- packages/express/.npmrc | 1 + packages/express/LICENSE | 27 + packages/express/README.md | 153 +++++ packages/express/index.d.ts | 6 + packages/express/index.js | 6 + packages/express/index.ts | 6 + packages/express/package-lock.json | 600 ++++++++++++++++++ packages/express/package.json | 65 ++ .../invoke-middleware.acceptance.ts | 37 ++ .../middleware-action.acceptance.ts | 45 ++ .../middleware-interceptor.acceptance.ts | 176 +++++ .../middleware-registeration.acceptance.ts | 129 ++++ .../src/__tests__/acceptance/test-helpers.ts | 129 ++++ .../src/__tests__/fixtures/spy-config.ts | 21 + .../src/__tests__/fixtures/spy.middleware.ts | 41 ++ packages/express/src/express.application.ts | 23 + packages/express/src/express.server.ts | 118 ++++ packages/express/src/index.ts | 33 + packages/express/src/keys.ts | 16 + .../express/src/middleware-interceptor.ts | 299 +++++++++ packages/express/src/middleware-registry.ts | 145 +++++ packages/express/src/middleware.ts | 280 ++++++++ .../providers/invoke-middleware.provider.ts | 77 +++ packages/express/src/types.ts | 240 +++++++ packages/express/tsconfig.json | 26 + tsconfig.json | 3 + 28 files changed, 2704 insertions(+), 1 deletion(-) create mode 100644 packages/express/.npmrc create mode 100644 packages/express/LICENSE create mode 100644 packages/express/README.md create mode 100644 packages/express/index.d.ts create mode 100644 packages/express/index.js create mode 100644 packages/express/index.ts create mode 100644 packages/express/package-lock.json create mode 100644 packages/express/package.json create mode 100644 packages/express/src/__tests__/acceptance/invoke-middleware.acceptance.ts create mode 100644 packages/express/src/__tests__/acceptance/middleware-action.acceptance.ts create mode 100644 packages/express/src/__tests__/acceptance/middleware-interceptor.acceptance.ts create mode 100644 packages/express/src/__tests__/acceptance/middleware-registeration.acceptance.ts create mode 100644 packages/express/src/__tests__/acceptance/test-helpers.ts create mode 100644 packages/express/src/__tests__/fixtures/spy-config.ts create mode 100644 packages/express/src/__tests__/fixtures/spy.middleware.ts create mode 100644 packages/express/src/express.application.ts create mode 100644 packages/express/src/express.server.ts create mode 100644 packages/express/src/index.ts create mode 100644 packages/express/src/keys.ts create mode 100644 packages/express/src/middleware-interceptor.ts create mode 100644 packages/express/src/middleware-registry.ts create mode 100644 packages/express/src/middleware.ts create mode 100644 packages/express/src/providers/invoke-middleware.provider.ts create mode 100644 packages/express/src/types.ts create mode 100644 packages/express/tsconfig.json diff --git a/CODEOWNERS b/CODEOWNERS index d6a28c580df2..5831c37be04b 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -142,6 +142,7 @@ # - Standby owner(s): @deepakrkris @emonddr /packages/rest @deepakrkris @emonddr @hacksparrow /packages/http-server @deepakrkris @emonddr @hacksparrow +/packages/express @raymondfeng /packages/cli/generators/controller @deepakrkris @emonddr @hacksparrow /examples/hello-world @deepakrkris @emonddr @hacksparrow /examples/express-composition @deepakrkris @emonddr @hacksparrow diff --git a/docs/site/MONOREPO.md b/docs/site/MONOREPO.md index 697a0bc1789d..49ba50d30992 100644 --- a/docs/site/MONOREPO.md +++ b/docs/site/MONOREPO.md @@ -38,7 +38,7 @@ The [loopback-next](https://github.com/strongloop/loopback-next) repository uses | [example-todo-list](https://github.com/strongloop/loopback-next/tree/master/examples/todo-list) | @loopback/example-todo-list | Continuation of the todo example using relations in LoopBack 4 | | [example-todo](https://github.com/strongloop/loopback-next/tree/master/examples/todo) | @loopback/example-todo | A basic tutorial for getting started with Loopback 4 | | [example-validation-app](https://github.com/strongloop/loopback-next/tree/master/examples/validation-app) | @loopback/example-validation-app | An example demonstrating how to add validation in a LoopBack 4 application | -| [extension-health](https://github.com/strongloop/loopback-next/tree/master/extensions/health) | @loopback/extension-health | Expose health check related endpoints | +| [express](https://github.com/strongloop/loopback-next/tree/master/packages/express) | @loopback/express | Integrate with Express and expose middleware infrastructure for sequence and interceptors | | [extension-health](https://github.com/strongloop/loopback-next/tree/master/extensions/health) | @loopback/extension-health | Expose health check related endpoints | | [extension-logging](https://github.com/strongloop/loopback-next/tree/master/extensions/logging) | @loopback/extension-logging | Add Winston Logger and Fluentd integration | | [extension-metrics](https://github.com/strongloop/loopback-next/tree/master/extensions/metrics) | @loopback/extension-metrics | Report metrics to Prometheus | | [http-caching-proxy](https://github.com/strongloop/loopback-next/tree/master/packages/http-caching-proxy) | @loopback/http-caching-proxy | A caching HTTP proxy for integration tests. NOT SUITABLE FOR PRODUCTION USE! | diff --git a/packages/express/.npmrc b/packages/express/.npmrc new file mode 100644 index 000000000000..cafe685a112d --- /dev/null +++ b/packages/express/.npmrc @@ -0,0 +1 @@ +package-lock=true diff --git a/packages/express/LICENSE b/packages/express/LICENSE new file mode 100644 index 000000000000..dc2da40f9aa5 --- /dev/null +++ b/packages/express/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) IBM Corp. 2020. +Node module: @loopback/express +This project is licensed under the MIT License, full text below. + +-------- + +MIT License + +MIT License Copyright (c) IBM Corp. 2020 + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice (including the next +paragraph) shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/express/README.md b/packages/express/README.md new file mode 100644 index 000000000000..24a250bec15e --- /dev/null +++ b/packages/express/README.md @@ -0,0 +1,153 @@ +# @loopback/express + +This package adds middleware support for LoopBack 4 and allows Express +middleware to be plugged into LoopBack seamlessly. It's used by `@loopback/rest` +to support Express middleware with `InvokeMiddleware` action within the REST +sequence. + +See [documentation](https://loopback.io/doc/en/lb4/Express-middleware.html) for +more details. + +## Overview + +This module provides the following APIs: + +- Helper + +- new custom routing engine (special thanks to @bajtos)! +- tools for defining your application routes +- OpenAPI 3.0 spec (`openapi.json`/`openapi.yaml`) generation using + `@loopback/openapi-v3` +- a default sequence implementation to manage the request and response lifecycle + +## Installation + +To use this package, you'll need to install `@loopback/express`. + +```sh +npm i @loopback/express +``` + +## Basic Use + +1. Adapt an Express middleware + +The registration can happen in the constructor of an application. + +{% include code-caption.html content="src/application.ts" %} + +```ts +import morgan from 'morgan'; + +export class MyApplication extends RestApplication { + constructor(options: ApplicationConfig = {}) { + super(options); + + // Register `morgan` express middleware + this.expressMiddleware('middleware.morgan', morgan('combined')); + } +} +``` + +2. Create your own middleware + +The LoopBack middleware is defined as a function with the following signature: + +```ts +(context: MiddlewareContext, next: Next) => ValueOrPromise; +``` + +It's very easy to write a simple logging middleware using `async/await`: + +```ts +const log: Middleware = async (middlewareCtx, next) => { + const {request} = middlewareCtx; + console.log('Request: %s %s', request.method, request.originalUrl); + try { + // Proceed with next middleware + await next(); + // Process response + console.log( + 'Response received for %s %s', + request.method, + request.originalUrl, + ); + } catch (err) { + // Catch errors from downstream middleware + console.error( + 'Error received for %s %s', + request.method, + request.originalUrl, + ); + throw err; + } +}; +``` + +3. Use Express middleware as interceptors + +With the ability to wrap Express middleware as LoopBack 4 interceptors, we can +use the same programming model to register middleware as global interceptors or +local interceptors denoted by `@intercept` decorators at class and method +levels. + +The middleware interceptor function can be directly referenced by `@intercept`. + +```ts +import morgan from 'morgan'; +const morganInterceptor = toInterceptor(morgan('combined')); +class MyController { + @intercept(morganInterceptor) + hello(msg: string) { + return `Hello, ${msg}`; + } +} +``` + +It's also possible to bind the middleware to a context as a local or global +interceptor. + +```ts +// Register `morgan` express middleware +// Create a middleware factory wrapper for `morgan(format, options)` +const morganFactory = (config?: morgan.Options) => morgan('combined', config); +const binding = registerExpressMiddlewareInterceptor( + app, + morganFactory, + {}, // morgan options + { + // As a global interceptor + global: true, + }, +); +``` + +For a bound local interceptor with `{global: false}`, the binding key can now be +used with `@intercept`. + +```ts +@intercept('interceptors.morgan') +class MyController { + hello(msg: string) { + return `Hello, ${msg}`; + } +} +``` + +## Contributions + +- [Guidelines](https://github.com/strongloop/loopback-next/blob/master/docs/CONTRIBUTING.md) +- [Join the team](https://github.com/strongloop/loopback-next/issues/110) + +## Tests + +Run `npm test` from the root folder. + +## Contributors + +See +[all contributors](https://github.com/strongloop/loopback-next/graphs/contributors). + +## License + +MIT diff --git a/packages/express/index.d.ts b/packages/express/index.d.ts new file mode 100644 index 000000000000..c1fc0bb183b0 --- /dev/null +++ b/packages/express/index.d.ts @@ -0,0 +1,6 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/express +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +export * from './dist'; diff --git a/packages/express/index.js b/packages/express/index.js new file mode 100644 index 000000000000..a5d74e30fe29 --- /dev/null +++ b/packages/express/index.js @@ -0,0 +1,6 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/express +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +module.exports = require('./dist'); diff --git a/packages/express/index.ts b/packages/express/index.ts new file mode 100644 index 000000000000..362689217c3d --- /dev/null +++ b/packages/express/index.ts @@ -0,0 +1,6 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/express +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +export * from './src'; diff --git a/packages/express/package-lock.json b/packages/express/package-lock.json new file mode 100644 index 000000000000..2605b0e1d255 --- /dev/null +++ b/packages/express/package-lock.json @@ -0,0 +1,600 @@ +{ + "name": "@loopback/express", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + }, + "dependencies": { + "@types/node": { + "version": "13.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz", + "integrity": "sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==" + } + } + }, + "@types/connect": { + "version": "3.4.33", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", + "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", + "requires": { + "@types/node": "*" + }, + "dependencies": { + "@types/node": { + "version": "13.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz", + "integrity": "sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==" + } + } + }, + "@types/debug": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", + "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==", + "dev": true + }, + "@types/express": { + "version": "4.17.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.6.tgz", + "integrity": "sha512-n/mr9tZI83kd4azlPG5y997C/M4DNABK9yErhFM6hKdym4kkmd9j0vtsJyjFIwfRBxtrxZtAfGZCNRIBMFLK5w==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.5.tgz", + "integrity": "sha512-578YH5Lt88AKoADy0b2jQGwJtrBxezXtVe/MBqWXKZpqx91SnC0pVkVCcxcytz3lWW+cHBYDi3Ysh0WXc+rAYw==", + "requires": { + "@types/node": "*", + "@types/range-parser": "*" + }, + "dependencies": { + "@types/node": { + "version": "13.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz", + "integrity": "sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==" + } + } + }, + "@types/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-4KCE/agIcoQ9bIfa4sBxbZdnORzRjIw8JNQPLfqoNv7wQl/8f8mRbW68Q8wBsQFoJkPUHGlQYZ9sqi5WpfGSEQ==" + }, + "@types/mime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", + "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==" + }, + "@types/node": { + "version": "10.17.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.21.tgz", + "integrity": "sha512-PQKsydPxYxF1DsAFWmunaxd3sOi3iMt6Zmx/tgaagHYmwJ/9cRH91hQkeJZaUGWbvn0K5HlSVEXkn5U/llWPpQ==", + "dev": true + }, + "@types/on-finished": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@types/on-finished/-/on-finished-2.3.1.tgz", + "integrity": "sha512-mzVYaYcFs5Jd2n/O6uYIRUsFRR1cHyZLRvkLCU0E7+G5WhY0qBDAR5fUCeZbvecYOSh9ikhlesyi2UfI8B9ckQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/qs": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.1.tgz", + "integrity": "sha512-lhbQXx9HKZAPgBkISrBcmAcMpZsmpe/Cd/hY7LGZS5OfkySUBItnPZHgQPssWYUET8elF+yCFBbP1Q0RZPTdaw==" + }, + "@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" + }, + "@types/serve-static": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz", + "integrity": "sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g==", + "requires": { + "@types/express-serve-static-core": "*", + "@types/mime": "*" + } + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + } + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typescript": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + } + } +} diff --git a/packages/express/package.json b/packages/express/package.json new file mode 100644 index 000000000000..62130d2901dc --- /dev/null +++ b/packages/express/package.json @@ -0,0 +1,65 @@ +{ + "name": "@loopback/express", + "version": "1.0.0", + "description": "@loopback/express", + "keywords": [ + "loopback-extension", + "loopback" + ], + "main": "index.js", + "engines": { + "node": ">=10" + }, + "scripts": { + "build": "lb-tsc", + "build:watch": "lb-tsc --watch", + "pretest": "npm run clean && npm run build", + "test": "lb-mocha --allow-console-logs \"dist/__tests__\"", + "test:dev": "lb-mocha --allow-console-logs dist/__tests__/**/*.js", + "clean": "lb-clean dist *.tsbuildinfo .eslintcache" + }, + "repository": { + "type": "git", + "url": "https://github.com/strongloop/loopback-next.git", + "directory": "packages/express" + }, + "author": "IBM Corp.", + "license": "MIT", + "files": [ + "README.md", + "index.js", + "index.d.ts", + "dist", + "src", + "!*/__tests__" + ], + "dependencies": { + "@loopback/context": "^3.6.0", + "@loopback/core": "^2.4.2", + "@loopback/http-server": "^2.1.2", + "@types/body-parser": "^1.19.0", + "@types/express": "^4.17.6", + "@types/express-serve-static-core": "^4.17.5", + "@types/http-errors": "^1.6.3", + "body-parser": "^1.19.0", + "debug": "^4.1.1", + "express": "^4.17.1", + "http-errors": "^1.7.3", + "on-finished": "^2.3.0", + "tslib": "^1.10.0" + }, + "devDependencies": { + "@loopback/build": "^5.3.0", + "@loopback/testlab": "^3.1.2", + "@types/debug": "^4.1.5", + "@types/node": "^10.17.21", + "@types/on-finished": "^2.3.1", + "http-errors": "^1.7.3", + "source-map-support": "^0.5.19", + "typescript": "~3.8.3" + }, + "copyright.owner": "IBM Corp.", + "publishConfig": { + "access": "public" + } +} diff --git a/packages/express/src/__tests__/acceptance/invoke-middleware.acceptance.ts b/packages/express/src/__tests__/acceptance/invoke-middleware.acceptance.ts new file mode 100644 index 000000000000..797724c44029 --- /dev/null +++ b/packages/express/src/__tests__/acceptance/invoke-middleware.acceptance.ts @@ -0,0 +1,37 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/express +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import {ExpressServer, invokeExpressMiddleware} from '../../'; +import {spy, TestHelper} from './test-helpers'; + +describe('Express middleware registry', () => { + let helper: TestHelper; + let server: ExpressServer; + + beforeEach(givenTestApp); + afterEach(() => helper?.stop()); + + it('invokes Express middleware', async () => { + server.middleware( + async (ctx, next) => { + const finished = await invokeExpressMiddleware( + ctx, + spy({action: 'log'}), + ); + if (finished) return; + return next(); + }, + {key: 'middleware.listOfExpressHandlers'}, + ); + await helper.assertSpyLog(); + }); + + async function givenTestApp() { + helper = new TestHelper(); + helper.bindController(); + await helper.start(); + server = helper.app.expressServer; + } +}); diff --git a/packages/express/src/__tests__/acceptance/middleware-action.acceptance.ts b/packages/express/src/__tests__/acceptance/middleware-action.acceptance.ts new file mode 100644 index 000000000000..571a13584443 --- /dev/null +++ b/packages/express/src/__tests__/acceptance/middleware-action.acceptance.ts @@ -0,0 +1,45 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/express +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import {expect} from '@loopback/testlab'; +import {registerExpressMiddleware} from '../../'; +import {SpyAction} from '../fixtures/spy-config'; +import {spy, SpyConfig, TestFunction, TestHelper} from './test-helpers'; + +describe('Middleware request interceptor', () => { + let helper: TestHelper; + + function runTests(action: SpyAction, testFn: TestFunction) { + describe(`registerMiddleware - ${action}`, () => { + const spyConfig: SpyConfig = {action}; + beforeEach(givenTestApp); + afterEach(() => helper?.stop()); + + it('registers a middleware interceptor provider class by factory', () => { + const binding = registerExpressMiddleware(helper.app, spy, spyConfig); + return testFn(binding); + }); + + it('registers a middleware interceptor as handler function', () => { + const binding = registerExpressMiddleware(helper.app, spy, spyConfig, { + injectConfiguration: false, + key: 'interceptors.middleware.spy', + }); + expect(binding.key).to.eql('interceptors.middleware.spy'); + return testFn(binding); + }); + }); + } + + runTests('log', binding => helper.testSpyLog(binding)); + runTests('mock', binding => helper.testSpyMock(binding)); + runTests('reject', binding => helper.testSpyReject(binding)); + + function givenTestApp() { + helper = new TestHelper(); + helper.bindController(); + return helper.start(); + } +}); diff --git a/packages/express/src/__tests__/acceptance/middleware-interceptor.acceptance.ts b/packages/express/src/__tests__/acceptance/middleware-interceptor.acceptance.ts new file mode 100644 index 000000000000..2c26743f022a --- /dev/null +++ b/packages/express/src/__tests__/acceptance/middleware-interceptor.acceptance.ts @@ -0,0 +1,176 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/express +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import { + config, + Constructor, + Context, + createBindingFromClass, + Interceptor, + Provider, +} from '@loopback/context'; +import {InterceptorOrKey} from '@loopback/core'; +import {expect} from '@loopback/testlab'; +import { + createInterceptor, + createMiddlewareInterceptorBinding, + defineInterceptorProvider, + ExpressMiddlewareInterceptorProvider, + registerExpressMiddlewareInterceptor, + toInterceptor, +} from '../..'; +import {ExpressMiddlewareFactory} from '../../types'; +import {SpyAction} from '../fixtures/spy-config'; +import {spy, SpyConfig, TestFunction, TestHelper} from './test-helpers'; + +describe('Middleware interceptor', () => { + let helper: TestHelper; + + context('helpers', () => { + let spyConfig: SpyConfig; + before(() => { + spyConfig = { + action: 'log', + }; + helper = new TestHelper(); + }); + before(givenTestApp); + after(() => helper?.stop()); + + it('wraps a middleware handler to interceptor', async () => { + const fn = spy(spyConfig); + const interceptor = toInterceptor(fn); + await testLocalSpyLog(interceptor); + }); + + it('wraps a middleware factory to interceptor', async () => { + const interceptor = createInterceptor(spy, spyConfig); + await testLocalSpyLog(interceptor); + }); + }); + + context('defineInterceptorProvider', () => { + it('defines a middleware interceptor provider class by factory', () => { + const cls = defineInterceptorProvider(spy); + expect(cls.name).to.eql('spyMiddlewareFactory'); + assertProviderClass(cls); + }); + + it('defines a middleware interceptor provider class with name', () => { + const cls = defineInterceptorProvider( + spy, + undefined, + 'SpyMiddlewareInterceptorProvider', + ); + expect(cls.name).to.eql('SpyMiddlewareInterceptorProvider'); + assertProviderClass(cls); + }); + + function assertProviderClass(cls: Constructor>) { + const ctx = new Context(); + const binding = createBindingFromClass(cls); + ctx.add(binding); + const corsFn = ctx.getSync(binding.key); + expect(corsFn).to.be.a.Function(); + } + }); + + function runTests(action: SpyAction, testFn: TestFunction) { + describe(`registerMiddleware - ${action}`, () => { + const spyConfig: SpyConfig = {action}; + beforeEach(givenTestApp); + beforeEach(() => helper.bindController()); + afterEach(() => helper?.stop()); + + it('registers a middleware interceptor provider class by factory', () => { + const binding = registerExpressMiddlewareInterceptor( + helper.app, + spy, + spyConfig, + { + global: true, + }, + ); + return testFn(binding); + }); + + it('registers a middleware interceptor as handler function', () => { + const binding = registerExpressMiddlewareInterceptor( + helper.app, + spy, + spyConfig, + { + global: true, + injectConfiguration: false, + key: 'interceptors.middleware.spy', + }, + ); + expect(binding.key).to.eql('interceptors.middleware.spy'); + return testFn(binding); + }); + + it('registers a middleware interceptor as handler function with name', () => { + const namedSpyFactory: ExpressMiddlewareFactory = cfg => + spy(cfg); + const binding = registerExpressMiddlewareInterceptor( + helper.app, + namedSpyFactory, + spyConfig, + { + global: true, + injectConfiguration: false, + }, + ); + expect(binding.key).to.eql('interceptors.middleware.namedSpyFactory'); + return testFn(binding); + }); + + it('registers a middleware interceptor as handler function without key', () => { + const binding = registerExpressMiddlewareInterceptor( + helper.app, + spy, + spyConfig, + { + global: true, + injectConfiguration: false, + }, + ); + expect(binding.key).to.match(/^interceptors\.middleware\./); + return testFn(binding); + }); + + it('registers a middleware interceptor provider class', () => { + class SpyInterceptorProvider extends ExpressMiddlewareInterceptorProvider< + SpyConfig + > { + constructor(@config() _spyConfig?: SpyConfig) { + super(spy, _spyConfig); + } + } + const binding = createMiddlewareInterceptorBinding( + SpyInterceptorProvider, + ); + expect(binding.key).to.eql('interceptors.SpyInterceptorProvider'); + helper.app.add(binding); + return testFn(binding); + }); + }); + } + + runTests('log', binding => helper.testSpyLog(binding)); + runTests('mock', binding => helper.testSpyMock(binding)); + runTests('reject', binding => helper.testSpyReject(binding)); + + function givenTestApp() { + helper = new TestHelper(); + return helper.start(); + } + + async function testLocalSpyLog(interceptor: InterceptorOrKey) { + helper.bindController(interceptor); + + await helper.assertSpyLog(); + } +}); diff --git a/packages/express/src/__tests__/acceptance/middleware-registeration.acceptance.ts b/packages/express/src/__tests__/acceptance/middleware-registeration.acceptance.ts new file mode 100644 index 000000000000..6d0cee55ef21 --- /dev/null +++ b/packages/express/src/__tests__/acceptance/middleware-registeration.acceptance.ts @@ -0,0 +1,129 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/express +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import {config, Provider} from '@loopback/core'; +import {Client, expect} from '@loopback/testlab'; +import {ExpressServer, Middleware} from '../../'; +import {SpyAction} from '../fixtures/spy-config'; +import {spy, SpyConfig, TestFunction, TestHelper} from './test-helpers'; + +describe('Express middleware registry', () => { + let helper: TestHelper; + let server: ExpressServer; + let client: Client; + + beforeEach(givenTestApp); + afterEach(() => helper?.stop()); + + function runTests(action: SpyAction, testFn: TestFunction) { + describe(`app.expressMiddleware - ${action}`, () => { + const spyConfig: SpyConfig = {action}; + + it('registers a middleware interceptor provider class by factory', () => { + const binding = server.expressMiddleware(spy, spyConfig); + return testFn(binding); + }); + + it('registers a middleware interceptor as handler function', () => { + const binding = server.expressMiddleware(spy, spyConfig, { + injectConfiguration: false, + key: 'interceptors.middleware.spy', + }); + expect(binding.key).to.eql('interceptors.middleware.spy'); + return testFn(binding); + }); + + it('registers a middleware interceptor as handler function without a key', () => { + const binding = server.expressMiddleware(spy, spyConfig, { + injectConfiguration: false, + }); + expect(binding.key).to.match(/^middleware\./); + return testFn(binding); + }); + }); + } + + runTests('log', binding => helper.testSpyLog(binding)); + runTests('mock', binding => helper.testSpyMock(binding)); + runTests('reject', binding => helper.testSpyReject(binding)); + + describe('LoopBack middleware registry', () => { + const spyMiddleware: Middleware = async (middlewareCtx, next) => { + const {request, response} = middlewareCtx; + response.set('x-spy-log-req', `${request.method} ${request.path}`); + await next(); + response.set('x-spy-log-res', `${request.method} ${request.path}`); + }; + + it('registers a LoopBack middleware handler', async () => { + server.middleware(spyMiddleware, { + key: 'middleware.spy', + }); + await testSpyLog(); + }); + + it('registers a LoopBack middleware provider', async () => { + class SpyMiddlewareProvider implements Provider { + value() { + return spyMiddleware; + } + } + server.middleware(SpyMiddlewareProvider, { + key: 'middleware.spy', + }); + await testSpyLog(); + }); + + it('registers a LoopBack middleware provider with config injection', async () => { + type SpyConfig = {headerName: string}; + class SpyMiddlewareProviderWithConfig implements Provider { + @config() + private options: SpyConfig; + value(): Middleware { + return async ({request, response}, next) => { + response.set( + `${this.options.headerName}-req`, + `${request.method} ${request.path}`, + ); + await next(); + response.set( + `${this.options.headerName}-res`, + `${request.method} ${request.path}`, + ); + }; + } + } + const binding = server.middleware(SpyMiddlewareProviderWithConfig, { + key: 'middleware.spy', + }); + server.configure(binding.key).to({headerName: 'x-spy'}); + await client + .post('/hello') + .send('"World"') + .set('content-type', 'application/json') + .expect(200, 'Hello, World') + .expect('x-spy-req', 'POST /hello') + .expect('x-spy-res', 'POST /hello'); + }); + + async function testSpyLog() { + await client + .post('/hello') + .send('"World"') + .set('content-type', 'application/json') + .expect(200, 'Hello, World') + .expect('x-spy-log-req', 'POST /hello') + .expect('x-spy-log-res', 'POST /hello'); + } + }); + + async function givenTestApp() { + helper = new TestHelper(); + helper.bindController(); + await helper.start(); + server = helper.app.expressServer; + client = helper.client; + } +}); diff --git a/packages/express/src/__tests__/acceptance/test-helpers.ts b/packages/express/src/__tests__/acceptance/test-helpers.ts new file mode 100644 index 000000000000..466f181c4b9c --- /dev/null +++ b/packages/express/src/__tests__/acceptance/test-helpers.ts @@ -0,0 +1,129 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/express +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import { + Binding, + createProxyWithInterceptors, + intercept, + InterceptorOrKey, +} from '@loopback/context'; +import {Client, givenHttpServerConfig, supertest} from '@loopback/testlab'; +import bodyParser from 'body-parser'; +import {ExpressApplication} from '../../express.application'; +import {SpyAction, SpyConfig} from '../fixtures/spy-config'; +import spyFactory from '../fixtures/spy.middleware'; +export const spy = spyFactory; +export {SpyConfig} from '../fixtures/spy-config'; + +export type TestFunction = (spyBinding: Binding) => Promise; + +export class TestHelper { + readonly app: ExpressApplication; + client: Client; + + constructor() { + this.app = new ExpressApplication({ + express: { + ...givenHttpServerConfig(), + settings: { + env: 'test', + }, + }, + }); + this.app.expressServer.expressMiddleware( + bodyParser.json, + {strict: false}, + {key: 'middleware.bodyParser'}, + ); + } + + async start() { + await this.app.start(); + this.client = supertest(this.app.expressServer.url); + } + + stop() { + return this.app.stop(); + } + + bindController(interceptor?: InterceptorOrKey) { + const interceptors: InterceptorOrKey[] = []; + if (interceptor) interceptors.push(interceptor); + class MyController { + @intercept(...interceptors) + hello(msg: string) { + return `Hello, ${msg}`; + } + } + const binding = this.app.controller(MyController); + this.app.expressServer.expressApp.post('/hello', async (req, res, next) => { + try { + const controller = await this.app.get(binding.key); + const proxy = createProxyWithInterceptors( + controller, + this.app.expressServer.getMiddlewareContext(req), + undefined, + { + type: 'route', + value: controller, + }, + ); + res.send(await proxy.hello(req.body)); + } catch (err) { + next(err); + } + }); + } + + private configureSpy( + spyBinding: Binding, + action: SpyAction = 'log', + ) { + this.app.expressServer.configure(spyBinding.key).to({action}); + } + + async testSpyLog(spyBinding: Binding) { + this.configureSpy(spyBinding); + + await this.assertSpyLog(); + } + + async assertSpyLog() { + await this.client + .post('/hello') + .send('"World"') + .set('content-type', 'application/json') + .expect(200, 'Hello, World') + .expect('x-spy-log', 'POST /hello'); + } + + async testSpyMock(spyBinding: Binding) { + this.configureSpy(spyBinding, 'mock'); + await this.assertSpyMock(); + } + + async assertSpyMock() { + await this.client + .post('/hello') + .send('"World"') + .set('content-type', 'application/json') + .expect(200, 'Hello, Spy') + .expect('x-spy-mock', 'POST /hello'); + } + + async testSpyReject(spyBinding: Binding) { + this.configureSpy(spyBinding, 'reject'); + await this.assertSpyReject(); + } + + private async assertSpyReject() { + await this.client + .post('/hello') + .send('"World"') + .set('content-type', 'application/json') + .expect(400) + .expect('x-spy-reject', 'POST /hello'); + } +} diff --git a/packages/express/src/__tests__/fixtures/spy-config.ts b/packages/express/src/__tests__/fixtures/spy-config.ts new file mode 100644 index 000000000000..3a82f06f0061 --- /dev/null +++ b/packages/express/src/__tests__/fixtures/spy-config.ts @@ -0,0 +1,21 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/express +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +export type SpyAction = 'log' | 'mock' | 'reject'; +/** + * Configuration for `spy` middleware + */ +export interface SpyConfig { + /** + * Action for the spy to enforce + * - `log`: set `x-spy-log` http response header and proceed with the + * invocation + * - `mock`: set `x-spy-mock` http response header and return a mock response + * without calling the target + * - `reject`: set `x-spy-reject` http response header and reject the request + * with 400 status code + */ + action: SpyAction; +} diff --git a/packages/express/src/__tests__/fixtures/spy.middleware.ts b/packages/express/src/__tests__/fixtures/spy.middleware.ts new file mode 100644 index 000000000000..ffa3c71af857 --- /dev/null +++ b/packages/express/src/__tests__/fixtures/spy.middleware.ts @@ -0,0 +1,41 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/express +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import debugFactory from 'debug'; +import HttpErrors from 'http-errors'; +import {ExpressMiddlewareFactory} from '../..'; +import {SpyConfig} from './spy-config'; + +const debug = debugFactory('loopback:middleware:spy'); + +/** + * An Express middleware factory function that creates a handler to spy on + * requests + */ +const spyMiddlewareFactory: ExpressMiddlewareFactory = config => { + const options: SpyConfig = {action: 'log', ...config}; + return function spy(req, res, next) { + debug('config', options); + switch (options?.action) { + case 'mock': + debug('spy - MOCK'); + res.set('x-spy-mock', `${req.method} ${req.path}`); + res.send('Hello, Spy'); + break; + case 'reject': + debug('spy - REJECT'); + res.set('x-spy-reject', `${req.method} ${req.path}`); + next(new HttpErrors.BadRequest('Request rejected by spy')); + break; + default: + debug('spy - LOG'); + res.set('x-spy-log', `${req.method} ${req.path}`); + next(); + break; + } + }; +}; + +export = spyMiddlewareFactory; diff --git a/packages/express/src/express.application.ts b/packages/express/src/express.application.ts new file mode 100644 index 000000000000..154b5b3e9b86 --- /dev/null +++ b/packages/express/src/express.application.ts @@ -0,0 +1,23 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/express +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import {Application, ApplicationConfig} from '@loopback/core'; +import {ExpressServer} from './express.server'; + +/** + * A LoopBack application with Express server + */ +export class ExpressApplication extends Application { + /** + * Embedded Express Server + */ + readonly expressServer: ExpressServer; + + constructor(readonly config?: ApplicationConfig) { + super(config); + const binding = this.server(ExpressServer); + this.expressServer = this.getSync(binding.key); + } +} diff --git a/packages/express/src/express.server.ts b/packages/express/src/express.server.ts new file mode 100644 index 000000000000..9e5f315d5be0 --- /dev/null +++ b/packages/express/src/express.server.ts @@ -0,0 +1,118 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/express +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import {Context, CoreBindings, inject, Server} from '@loopback/core'; +import {HttpServer, HttpServerOptions} from '@loopback/http-server'; +import debugFactory from 'debug'; +import express from 'express'; +import {toExpressMiddleware} from './middleware'; +import {MiddlewareRegistry} from './middleware-registry'; +import {MiddlewareContext, MIDDLEWARE_CONTEXT, Request} from './types'; + +const debug = debugFactory('loopback:middleware'); + +/** + * Configuration for a LoopBack based Express server + */ +export type ExpressServerConfig = HttpServerOptions & { + /** + * Base path to mount the LoopBack middleware chain + */ + basePath?: string; + /** + * Express settings + */ + settings?: Record; +}; + +/** + * An Express server that provides middleware composition and injection + */ +export class ExpressServer extends MiddlewareRegistry implements Server { + /** + * Base path to mount middleware + */ + readonly basePath: string; + /** + * Embedded Express application + */ + readonly expressApp: express.Application; + + /** + * HTTP/HTTPS server + */ + protected httpServer: HttpServer; + constructor( + @inject(CoreBindings.APPLICATION_CONFIG.deepProperty('express')) + protected readonly config?: ExpressServerConfig, + @inject(CoreBindings.APPLICATION_INSTANCE) + parent?: Context, + ) { + super(parent); + let basePath = config?.basePath ?? ''; + // Trim leading and trailing `/` + basePath = basePath.replace(/(^\/)|(\/$)/, ''); + if (basePath) basePath = '/' + basePath; + this.basePath = basePath; + + this.expressApp = express(); + if (config?.settings) { + for (const p in config?.settings) { + this.expressApp.set(p, config?.settings[p]); + } + } + this.httpServer = new HttpServer(this.expressApp, config); + + // Set up the middleware chain as the 1st Express middleware + this.expressApp.use(this.basePath, toExpressMiddleware(this)); + } + + /** + * Some of the methods below are copied from RestServer + * TODO(rfeng): We might want to refactor some methods from RestServer into + * the base ExpressServer. + */ + get listening(): boolean { + return this.httpServer ? this.httpServer.listening : false; + } + + /** + * The base url for the server, including the basePath if set. For example, + * the value will be 'http://localhost:3000/api' if `basePath` is set to + * '/api'. + */ + get url(): string | undefined { + let serverUrl = this.rootUrl; + if (!serverUrl) return serverUrl; + serverUrl = serverUrl + this.basePath; + return serverUrl; + } + + /** + * The root url for the server without the basePath. For example, the value + * will be 'http://localhost:3000' regardless of the `basePath`. + */ + get rootUrl(): string | undefined { + return this.httpServer && this.httpServer.url; + } + + async start() { + await this.httpServer.start(); + debug('ExpressServer listening at %s', this.httpServer.url); + } + + stop() { + return this.httpServer.stop(); + } + + /** + * Retrieve the middleware context from the request + * @param request - Request object + */ + getMiddlewareContext(request: Request): MiddlewareContext | undefined { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return (request as any)[MIDDLEWARE_CONTEXT]; + } +} diff --git a/packages/express/src/index.ts b/packages/express/src/index.ts new file mode 100644 index 000000000000..b6042224cf32 --- /dev/null +++ b/packages/express/src/index.ts @@ -0,0 +1,33 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/express +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +/** + * The Express integration package for loopback-next. + * + * @remarks + * + * This module introduces Koa style cascading middleware that leverage + * `async/await`. It also enables the ability to plug in existing Express + * middleware as LoopBack middleware or interceptors so that they can be used at + * sequence/action, global interceptor, and local interceptor tiers. + * + * This module also serves as a standalone extension to Express to provide + * extensibility and composability for large-scale Express applications by + * leveraging LoopBack's Dependency Injection and Extension Point/Extension + * pattern. + * + * @packageDocumentation + */ + +// Re-export express namespace from `express` +export * as express from 'express'; +export * from './express.application'; +export * from './express.server'; +export * from './keys'; +export * from './middleware'; +export * from './middleware-interceptor'; +export * from './middleware-registry'; +export * from './providers/invoke-middleware.provider'; +export * from './types'; diff --git a/packages/express/src/keys.ts b/packages/express/src/keys.ts new file mode 100644 index 000000000000..7d00385d505b --- /dev/null +++ b/packages/express/src/keys.ts @@ -0,0 +1,16 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/express +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import {BindingKey} from '@loopback/context'; +import {MiddlewareContext} from './types'; + +export namespace MiddlewareBindings { + /** + * Binding key for setting and injecting the http request context + */ + export const CONTEXT = BindingKey.create( + 'middleware.http.context', + ); +} diff --git a/packages/express/src/middleware-interceptor.ts b/packages/express/src/middleware-interceptor.ts new file mode 100644 index 000000000000..7306eecb9350 --- /dev/null +++ b/packages/express/src/middleware-interceptor.ts @@ -0,0 +1,299 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/express +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import { + asGlobalInterceptor, + BindingKey, + BindingScope, + config, + Constructor, + Context, + ContextTags, + createBindingFromClass, + GenericInterceptor, + Interceptor, + InvocationContext, + Provider, +} from '@loopback/core'; +import assert from 'assert'; +import debugFactory from 'debug'; +import onFinished from 'on-finished'; +import {promisify} from 'util'; +import {MiddlewareBindings} from './keys'; +import { + ExpressMiddlewareFactory, + ExpressRequestHandler, + MiddlewareContext, + MiddlewareInterceptorBindingOptions, + Request, + Response, +} from './types'; + +const debug = debugFactory('loopback:middleware'); + +const onFinishedAsync = promisify(onFinished); + +/** + * Execute an Express-style callback-based request handler. + * + * @param handler - Express middleware handler function + * @param request + * @param response + * @returns A promise resolved to: + * - `true` when the request was handled + * - `false` when the handler called `next()` to proceed to the next + * handler (middleware) in the chain. + */ +export function executeExpressRequestHandler( + handler: ExpressRequestHandler, + request: Request, + response: Response, +): Promise { + const responseWritten = onFinishedAsync(response).then(() => true); + const handlerFinished = new Promise((resolve, reject) => { + handler(request, response, err => { + if (err) { + reject(err); + } else { + // Express router called next, which means no route was matched + debug('[%s] Handler calling next()', handler.name, err); + resolve(false); + } + }); + }); + /** + * Express middleware may handle the response by itself and not call + * `next`. We use `Promise.race()` to determine if we need to proceed + * with next interceptor in the chain or just return. + */ + return Promise.race([handlerFinished, responseWritten]); +} + +/** + * Wrap an express middleware handler function as an interceptor + * @param handlerFn - Express middleware handler function + * + * @typeParam CTX - Context type + */ +export function toInterceptor( + handlerFn: ExpressRequestHandler, +): GenericInterceptor { + return async (context, next) => { + const middlewareCtx = await context.get( + MiddlewareBindings.CONTEXT, + ); + const finished = await executeExpressRequestHandler( + handlerFn, + middlewareCtx.request, + middlewareCtx.response, + ); + if (!finished) { + debug('[%s] Proceed with downstream interceptors', handlerFn.name); + const val = await next(); + debug( + '[%s] Result received from downstream interceptors', + handlerFn.name, + ); + return val; + } + // Return response to indicate the response has been produced + return middlewareCtx.response; + }; +} + +/** + * Create an interceptor function from express middleware. + * @param middlewareFactory - Express middleware factory function. A wrapper + * can be created if the Express middleware module does not conform to the + * factory pattern and signature. + * @param middlewareConfig - Configuration for the Express middleware + * + * @typeParam CFG - Configuration type + * @typeParam CTX - Context type + */ +export function createInterceptor( + middlewareFactory: ExpressMiddlewareFactory, + middlewareConfig?: CFG, +): GenericInterceptor { + const handlerFn = middlewareFactory(middlewareConfig); + return toInterceptor(handlerFn); +} + +/** + * Base class for MiddlewareInterceptor provider classes + * + * @example + * ``` + * class SpyInterceptorProvider extends ExpressMiddlewareInterceptorProvider< + * SpyConfig + * > { + * constructor(@config() spyConfig?: SpyConfig) { + * super(spy, spyConfig); + * } + * } + * ``` + * + * @typeParam CFG - Configuration type + */ +export abstract class ExpressMiddlewareInterceptorProvider + implements Provider { + constructor( + protected middlewareFactory: ExpressMiddlewareFactory, + protected middlewareConfig?: CFG, + ) {} + + value() { + return createInterceptor(this.middlewareFactory, this.middlewareConfig); + } +} + +/** + * Define a provider class that wraps the middleware as an interceptor + * @param middlewareFactory - Express middleware factory function + * @param defaultMiddlewareConfig - Default middleware config + * @param className - Class name for the generated provider class + * + * @typeParam CFG - Configuration type + * @typeParam CTX - Context type + */ +export function defineInterceptorProvider< + CFG, + CTX extends Context = InvocationContext +>( + middlewareFactory: ExpressMiddlewareFactory, + defaultMiddlewareConfig?: CFG, + className?: string, +): Constructor>> { + className = buildName(middlewareFactory, className); + assert(className, 'className is missing and it cannot be inferred.'); + + const defineNamedClass = new Function( + 'middlewareFactory', + 'defaultMiddlewareConfig', + 'MiddlewareInterceptorProvider', + 'createInterceptor', + `return class ${className} extends MiddlewareInterceptorProvider { + constructor(middlewareConfig) { + super( + middlewareFactory, + middlewareConfig != null ? middlewareConfig: defaultMiddlewareConfig, + ); + } + value() { + return createInterceptor(this.middlewareFactory, this.middlewareConfig); + } + };`, + ); + + const cls = defineNamedClass( + middlewareFactory, + defaultMiddlewareConfig, + ExpressMiddlewareInterceptorProvider, + createInterceptor, + ); + config()(cls, '', 0); + return cls; +} + +/** + * Build a name for the middleware + * @param middlewareFactory - Express middleware factory function + * @param providedName - Provided name + * @param suffix - Suffix + */ +export function buildName( + middlewareFactory: ExpressMiddlewareFactory, + providedName?: string, + suffix?: string, +) { + if (!providedName) { + let name = middlewareFactory.name; + name = name.replace(/[^\w]/g, '_'); + if (name) { + providedName = `${name}${suffix ?? ''}`; + } + } + return providedName; +} + +/** + * Bind a middleware interceptor to the given context + * + * @param ctx - Context object + * @param middlewareFactory - Express middleware factory function + * @param middlewareConfig - Express middleware config + * @param options - Options for registration + * + * @typeParam CFG - Configuration type + */ +export function registerExpressMiddlewareInterceptor( + ctx: Context, + middlewareFactory: ExpressMiddlewareFactory, + middlewareConfig?: CFG, + options: MiddlewareInterceptorBindingOptions = {}, +) { + options = { + injectConfiguration: true, + global: true, + group: 'middleware', + ...options, + }; + if (!options.injectConfiguration) { + let key = options.key; + if (!key) { + const name = buildName(middlewareFactory); + key = name + ? `interceptors.middleware.${name}` + : BindingKey.generate('interceptors.middleware'); + } + const binding = ctx + .bind(key!) + .to(createInterceptor(middlewareFactory, middlewareConfig)); + if (options.global) { + binding.tag({[ContextTags.GLOBAL_INTERCEPTOR_SOURCE]: 'route'}); + binding.apply(asGlobalInterceptor(options.group)); + } + return binding; + } + const providerClass = defineInterceptorProvider( + middlewareFactory, + middlewareConfig, + options.providerClassName, + ); + const binding = createMiddlewareInterceptorBinding( + providerClass, + options, + ); + ctx.add(binding); + return binding; +} + +/** + * Create a binding for the middleware based interceptor + * + * @param middlewareProviderClass - Middleware provider class + * @param options - Options to create middlewareFactory interceptor binding + * + * @typeParam CFG - Configuration type + */ +export function createMiddlewareInterceptorBinding( + middlewareProviderClass: Constructor>, + options: MiddlewareInterceptorBindingOptions = {}, +) { + options = { + global: true, + group: 'middleware', + ...options, + }; + const binding = createBindingFromClass(middlewareProviderClass, { + defaultScope: BindingScope.TRANSIENT, + namespace: 'interceptors', + }); + if (options.global) { + binding.tag({[ContextTags.GLOBAL_INTERCEPTOR_SOURCE]: 'route'}); + binding.apply(asGlobalInterceptor(options.group)); + } + return binding; +} diff --git a/packages/express/src/middleware-registry.ts b/packages/express/src/middleware-registry.ts new file mode 100644 index 000000000000..c68e5b71de40 --- /dev/null +++ b/packages/express/src/middleware-registry.ts @@ -0,0 +1,145 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/express +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import { + Binding, + BindingAddress, + Constructor, + Context, + isBindingAddress, + Provider, +} from '@loopback/core'; +import { + registerExpressMiddleware, + registerMiddleware, + toMiddleware, +} from './middleware'; +import { + ExpressMiddlewareFactory, + ExpressRequestHandler, + Middleware, + MiddlewareBindingOptions, +} from './types'; + +/** + * Base Context that provides APIs to register middleware + */ +export abstract class MiddlewareRegistry extends Context { + /** + * Bind an Express middleware to this server context + * + * @example + * ```ts + * import myExpressMiddlewareFactory from 'my-express-middleware'; + * const myExpressMiddlewareConfig= {}; + * const myExpressMiddleware = myExpressMiddlewareFactory(myExpressMiddlewareConfig); + * server.expressMiddleware('middleware.express.my', myExpressMiddleware); + * // Or + * server.expressMiddleware('middleware.express.my', [myExpressMiddleware]); + * ``` + * @param key - Middleware binding key + * @param middleware - Express middleware handler function(s) + * + */ + expressMiddleware( + key: BindingAddress, + middleware: ExpressRequestHandler | ExpressRequestHandler[], + options?: MiddlewareBindingOptions, + ): Binding; + + /** + * Bind an Express middleware to this server context + * + * @example + * ```ts + * import myExpressMiddlewareFactory from 'my-express-middleware'; + * const myExpressMiddlewareConfig= {}; + * server.expressMiddleware(myExpressMiddlewareFactory, myExpressMiddlewareConfig); + * ``` + * @param middlewareFactory - Middleware module name or factory function + * @param middlewareConfig - Middleware config + * @param options - Options for registration + * + * @typeParam CFG - Configuration type + */ + expressMiddleware( + middlewareFactory: ExpressMiddlewareFactory, + middlewareConfig?: CFG, + options?: MiddlewareBindingOptions, + ): Binding; + + /** + * @internal + * + * This signature is only used by RestApplication for delegation + */ + expressMiddleware( + factoryOrKey: ExpressMiddlewareFactory | BindingAddress, + configOrHandler: CFG | ExpressRequestHandler | ExpressRequestHandler[], + options?: MiddlewareBindingOptions, + ): Binding; + + /** + * @internal + * Implementation of `expressMiddleware` + */ + expressMiddleware( + factoryOrKey: ExpressMiddlewareFactory | BindingAddress, + configOrHandlers: CFG | ExpressRequestHandler | ExpressRequestHandler[], + options: MiddlewareBindingOptions = {}, + ): Binding { + const key = factoryOrKey as BindingAddress; + if (isBindingAddress(key)) { + const handlers = Array.isArray(configOrHandlers) + ? configOrHandlers + : [configOrHandlers as ExpressRequestHandler]; + if (handlers.length === 0) { + throw new Error('No Express middleware handler function is provided.'); + } + if (handlers.length > 1) { + // Create middleware that wraps all Express handlers + return registerMiddleware(this, toMiddleware(...handlers), { + ...options, + key, + }); + } else { + // Use the single Express middleware handler + return registerExpressMiddleware(this, () => handlers[0], undefined, { + ...options, + key, + injectConfiguration: false, + }); + } + } else { + return registerExpressMiddleware( + this, + factoryOrKey as ExpressMiddlewareFactory, + configOrHandlers as CFG, + options, + ); + } + } + + /** + * Register a middleware function or provider class + * + * @example + * ```ts + * const log: Middleware = async (requestCtx, next) { + * // ... + * } + * server.middleware(log); + * ``` + * + * @param middleware - Middleware function or provider class + * @param options - Middleware binding options + */ + middleware( + middleware: Middleware | Constructor>, + options: MiddlewareBindingOptions = {}, + ): Binding { + return registerMiddleware(this, middleware, options); + } +} diff --git a/packages/express/src/middleware.ts b/packages/express/src/middleware.ts new file mode 100644 index 000000000000..8a803ccb409b --- /dev/null +++ b/packages/express/src/middleware.ts @@ -0,0 +1,280 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/express +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import { + Binding, + BindingKey, + BindingScope, + BindingTemplate, + compareBindingsByTag, + Constructor, + Context, + createBindingFromClass, + InvocationResult, + isProviderClass, + Provider, + transformValueOrPromise, + ValueOrPromise, +} from '@loopback/context'; +import {extensionFilter, extensionFor} from '@loopback/core'; +import debugFactory from 'debug'; +import { + buildName, + createInterceptor, + defineInterceptorProvider, + toInterceptor, +} from './middleware-interceptor'; +import { + DEFAULT_MIDDLEWARE_CHAIN, + ExpressMiddlewareFactory, + ExpressRequestHandler, + InvokeMiddlewareOptions, + Middleware, + MiddlewareBindingOptions, + MiddlewareChain, + MiddlewareContext, + MIDDLEWARE_CONTEXT, +} from './types'; + +const debug = debugFactory('loopback:middleware'); + +/** + * An adapter function to create a LoopBack middleware that invokes the list + * of Express middleware handler functions in the order of their positions + * + * @param handlers A list of Express middleware handler functions + * @returns A LoopBack middleware function that wraps the list of Express + * middleware + */ +export function toMiddleware(...handlers: ExpressRequestHandler[]): Middleware { + const middlewareList = handlers.map(handler => + toInterceptor(handler), + ); + return (middlewareCtx, next) => { + const middlewareChain = new MiddlewareChain(middlewareCtx, middlewareList); + const result = middlewareChain.invokeInterceptors(); + return transformValueOrPromise(result, val => + val === middlewareCtx.response ? val : next(), + ); + }; +} + +/** + * An adapter function to create a LoopBack middleware from Express middleware + * factory function and configuration object. + * + * @param middlewareFactory - Express middleware factory function + * @param middlewareConfig - Express middleware config + * + * @returns A LoopBack middleware function that wraps the Express middleware + */ +export function createMiddleware( + middlewareFactory: ExpressMiddlewareFactory, + middlewareConfig?: CFG, +): Middleware { + return createInterceptor( + middlewareFactory, + middlewareConfig, + ); +} + +/** + * Bind a Express middleware to the given context + * + * @param ctx - Context object + * @param middlewareFactory - Middleware module name or factory function + * @param middlewareConfig - Middleware config + * @param options - Options for registration + * + * @typeParam CFG - Configuration type + */ +export function registerExpressMiddleware( + ctx: Context, + middlewareFactory: ExpressMiddlewareFactory, + middlewareConfig?: CFG, + options: MiddlewareBindingOptions = {}, +): Binding { + options = {injectConfiguration: true, ...options}; + options.chain = options.chain ?? DEFAULT_MIDDLEWARE_CHAIN; + if (!options.injectConfiguration) { + let key = options.key; + if (!key) { + const name = buildName(middlewareFactory); + key = name ? `interceptors.${name}` : BindingKey.generate('interceptors'); + } + const middleware = createMiddleware(middlewareFactory, middlewareConfig); + return registerMiddleware(ctx, middleware, options); + } + + const providerClass = defineInterceptorProvider( + middlewareFactory, + middlewareConfig, + options.providerClassName, + ); + return registerMiddleware(ctx, providerClass, options); +} + +/** + * Template function for middleware bindings + * @param options - Options to configure the binding + */ +export function asMiddleware( + options: MiddlewareBindingOptions = {}, +): BindingTemplate { + return function middlewareBindingTemplate(binding) { + binding + .apply(extensionFor(options.chain ?? DEFAULT_MIDDLEWARE_CHAIN)) + .tag({group: options.group ?? ''}); + }; +} + +/** + * Bind the middleware function or provider class to the context + * @param ctx - Context object + * @param middleware - Middleware function or provider class + * @param options - Middleware binding options + */ +export function registerMiddleware( + ctx: Context, + middleware: Middleware | Constructor>, + options: MiddlewareBindingOptions, +) { + if (isProviderClass(middleware as Constructor>)) { + const binding = createMiddlewareBinding( + middleware as Constructor>, + options, + ); + ctx.add(binding); + return binding; + } + const key = options.key ?? BindingKey.generate('middleware'); + return ctx + .bind(key) + .to(middleware as Middleware) + .apply(asMiddleware(options)); +} + +/** + * Create a binding for the middleware provider class + * + * @param middlewareProviderClass - Middleware provider class + * @param options - Options to create middleware binding + * + */ +export function createMiddlewareBinding( + middlewareProviderClass: Constructor>, + options: MiddlewareBindingOptions = {}, +) { + options.chain = options.chain ?? DEFAULT_MIDDLEWARE_CHAIN; + const binding = createBindingFromClass(middlewareProviderClass, { + defaultScope: BindingScope.TRANSIENT, + namespace: 'middleware', + key: options.key, + }).apply(asMiddleware(options)); + return binding; +} + +/** + * Discover and invoke registered middleware in a chain for the given extension + * point. + * + * @param middlewareCtx - Middleware context + * @param options - Options to invoke the middleware chain + */ +export function invokeMiddleware( + middlewareCtx: MiddlewareContext, + options?: InvokeMiddlewareOptions, +): ValueOrPromise { + debug( + 'Invoke middleware chain for %s %s with options', + middlewareCtx.request.method, + middlewareCtx.request.originalUrl, + options, + ); + const {chain = DEFAULT_MIDDLEWARE_CHAIN, orderedGroups} = options ?? {}; + // Find extensions for the given extension point binding + const filter = extensionFilter(chain); + if (debug.enabled) { + debug( + 'Middleware for extension point "%s":', + chain, + middlewareCtx.find(filter).map(b => b.key), + ); + } + const _middlewareChain = new MiddlewareChain( + middlewareCtx, + filter, + compareBindingsByTag('group', orderedGroups), + ); + return _middlewareChain.invokeInterceptors(); +} + +/** + * Invoke a list of Express middleware handler functions + * + * @example + * ```ts + * import cors from 'cors'; + * import helmet from 'helmet'; + * import morgan from 'morgan'; + * import {MiddlewareContext, invokeExpressMiddleware} from '@loopback/express'; + * + * // ... Either an instance of `MiddlewareContext` is passed in or a new one + * // can be instantiated from Express request and response objects + * + * const middlewareCtx = new MiddlewareContext(request, response); + * const finished = await invokeExpressMiddleware( + * middlewareCtx, + * cors(), + * helmet(), + * morgan('combined')); + * + * if (finished) { + * // Http response is sent by one of the middleware + * } else { + * // Http response is yet to be produced + * } + * ``` + * @param middlewareCtx - Middleware context + * @param handlers - A list of Express middleware handler functions + */ +export function invokeExpressMiddleware( + middlewareCtx: MiddlewareContext, + ...handlers: ExpressRequestHandler[] +): ValueOrPromise { + const middleware = toMiddleware(...handlers); + debug( + 'Invoke Express middleware for %s %s', + middlewareCtx.request.method, + middlewareCtx.request.originalUrl, + ); + // Invoke the middleware with a no-op next() + const result = middleware(middlewareCtx, () => undefined); + // Check if the response is finished + return transformValueOrPromise(result, val => val === middlewareCtx.response); +} + +/** + * An adapter function to create an Express middleware handler to discover and + * invoke registered LoopBack-style middleware in the context. + * @param ctx - Context object to discover registered middleware + */ +export function toExpressMiddleware(ctx: Context): ExpressRequestHandler { + return async (req, res, next) => { + const middlewareCtx = new MiddlewareContext(req, res, ctx); + // Set the middleware context to `request` object + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (req as any)[MIDDLEWARE_CONTEXT] = middlewareCtx; + + try { + const result = await invokeMiddleware(middlewareCtx); + if (result !== res) { + next(); + } + } catch (err) { + next(err); + } + }; +} diff --git a/packages/express/src/providers/invoke-middleware.provider.ts b/packages/express/src/providers/invoke-middleware.provider.ts new file mode 100644 index 000000000000..14d69e30cfb0 --- /dev/null +++ b/packages/express/src/providers/invoke-middleware.provider.ts @@ -0,0 +1,77 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/rest +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import { + Binding, + config, + CoreTags, + extensionPoint, + inject, + Provider, +} from '@loopback/core'; +import debugFactory from 'debug'; +import {invokeExpressMiddleware, invokeMiddleware} from '../middleware'; +import { + DEFAULT_MIDDLEWARE_CHAIN, + ExpressRequestHandler, + InvokeMiddleware, + InvokeMiddlewareOptions, + MiddlewareContext, +} from '../types'; +const debug = debugFactory('loopback:rest:middleware'); + +/** + * Extension point for middleware to be run as part of the sequence actions + */ +@extensionPoint(DEFAULT_MIDDLEWARE_CHAIN) +export class InvokeMiddlewareProvider implements Provider { + /** + * Inject the binding so that we can access `extensionPoint` tag + */ + @inject.binding() + protected binding: Binding; + + /** + * Default options for invoking the middleware chain + */ + @config() + protected defaultOptions: InvokeMiddlewareOptions = { + chain: DEFAULT_MIDDLEWARE_CHAIN, + orderedGroups: ['cors', 'apiSpec', ''], + }; + + value(): InvokeMiddleware { + debug('Binding', this.binding); + return ( + middlewareCtx: MiddlewareContext, + optionsOrHandlers?: InvokeMiddlewareOptions | ExpressRequestHandler[], + ) => { + if (Array.isArray(optionsOrHandlers)) { + return this.action(middlewareCtx, optionsOrHandlers); + } + const options = optionsOrHandlers; + let chain = options?.chain; + const orderedGroups = options?.orderedGroups; + chain = + chain ?? + this.binding?.tagMap[CoreTags.EXTENSION_POINT] ?? + this.defaultOptions.chain; + return this.action(middlewareCtx, { + chain, + orderedGroups: orderedGroups ?? this.defaultOptions.orderedGroups, + }); + }; + } + + async action( + middlewareCtx: MiddlewareContext, + optionsOrHandlers?: InvokeMiddlewareOptions | ExpressRequestHandler[], + ) { + if (Array.isArray(optionsOrHandlers)) { + return invokeExpressMiddleware(middlewareCtx, ...optionsOrHandlers); + } + return invokeMiddleware(middlewareCtx, optionsOrHandlers); + } +} diff --git a/packages/express/src/types.ts b/packages/express/src/types.ts new file mode 100644 index 000000000000..27eca91fc4e0 --- /dev/null +++ b/packages/express/src/types.ts @@ -0,0 +1,240 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/express +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import { + BindingAddress, + Context, + GenericInterceptor, + GenericInterceptorChain, + InvocationContext, + ValueOrPromise, +} from '@loopback/core'; +import {Request, RequestHandler, Response} from 'express'; +import onFinished from 'on-finished'; +import {MiddlewareBindings} from './keys'; + +export {Request, Response} from 'express'; + +/** + * An object holding HTTP request, response and other data + * needed to handle an incoming HTTP request. + */ +export interface HandlerContext { + readonly request: Request; + readonly response: Response; +} + +/** + * Type alias for Express RequestHandler + */ +export type ExpressRequestHandler = RequestHandler; + +/** + * A per-request Context for middleware to combine an IoC container with handler + * context (request, response, etc.). + */ +export class MiddlewareContext extends Context implements HandlerContext { + /** + * Constructor for `MiddlewareContext` + * @param request - Express request object + * @param response - Express response object + * @param parent - Parent context + * @param name - Name of the middleware context + */ + constructor( + public readonly request: Request, + public readonly response: Response, + parent?: Context, + name?: string, + ) { + super(parent, name); + this.setupBindings(); + onFinished(this.response, () => { + // Close the request context when the http response is finished so that + // it can be recycled by GC + this.emit('close'); + this.close(); + }); + } + + protected setupBindings() { + this.bind(MiddlewareBindings.CONTEXT).to(this).lock(); + } +} + +/** + * Interface LoopBack 4 middleware to be executed within sequence of actions. + * A middleware for LoopBack is basically a generic interceptor that uses + * `RequestContext`. + * + * The signature of a middleware function is as follows. It's very much the same + * as {@link https://github.com/koajs/koa/blob/master/docs/guide.md#writing-middleware | Koa middleware}. + * ```ts + * (context: MiddlewareContext, next: Next) => ValueOrPromise; + * ``` + * + * @example + * ```ts + * const log: Middleware = async (requestCtx, next) => { + * const {request} = requestCtx; + * console.log('Request: %s %s', request.method, request.originalUrl); + * try { + * // Proceed with next middleware + * await next(); + * console.log('Response received for %s %s', request.method, request.originalUrl); + * } catch(err) { + * console.error('Error received for %s %s', request.method, request.originalUrl); + * throw err; + * } + * } + * ``` + */ +export interface Middleware extends GenericInterceptor {} + +/** + * An interceptor chain of middleware. This represents a list of cascading + * middleware functions to be executed by the order of `group` names. + */ +export class MiddlewareChain extends GenericInterceptorChain< + MiddlewareContext +> {} + +/** + * Default extension point name for middleware + */ +export const DEFAULT_MIDDLEWARE_CHAIN = 'middlewareChain.default'; + +/** + * Options for `InvokeMiddleware` + */ +export interface InvokeMiddlewareOptions { + /** + * Name of the extension point. Default to the `extensionPoint` tag value + * from the binding + */ + chain?: string; + /** + * An array of group names to denote the order of execution + */ + orderedGroups?: string[]; +} + +/** + * Interface for the invoker of middleware registered under the an extension + * point name. + */ +export interface InvokeMiddleware { + /** + * Invoke the request interceptors in the chain. + * @param middlewareCtx - Middleware Context + * @param options - Options for the invocation + */ + ( + middlewareCtx: MiddlewareContext, + options?: InvokeMiddlewareOptions, + ): ValueOrPromise; + + /** + * Invoke a list of Express middleware handler functions + * + * @example + * ```ts + * import cors from 'cors'; + * import helmet from 'helmet'; + * import morgan from 'morgan'; + * + * + * const finished = await this.invokeMiddleware( + * middlewareCtx, [ + * cors(), + * helmet(), + * morgan('combined'), + * ]); + * + * if (finished) { + * // Http response is sent by one of the middleware + * } else { + * // Http response is yet to be produced + * } + * ``` + * @param middlewareCtx - Middleware context + * @param handlers - A list of Express middleware handler functions + */ + ( + middlewareCtx: MiddlewareContext, + handlers: ExpressRequestHandler[], + ): ValueOrPromise; +} + +/** + * Options for defining a middleware + */ +export interface MiddlewareCreationOptions { + /** + * A flag to control if configuration for the middleware can be injected + * lazily. + * + * - `true` (default): creates a provider class with `@config` + * - `false`: creates a dynamic value that creates the middleware + */ + injectConfiguration?: boolean; + /** + * Class name for the created provider class. It's only used if + * `injectConfiguration` is not set to `false`. + */ + providerClassName?: string; +} + +/** + * Options to create a middleware binding for the sequence action or interceptor. + * @typeParam CTX - Context class + */ +export interface BaseMiddlewareBindingOptions + extends MiddlewareCreationOptions { + /** + * Binding key for the middleware. + */ + key?: BindingAddress>; + /** + * An optional `group` name to be used for order of executions + */ + group?: string; +} + +/** + * Options to bind a middleware as an interceptor to the context + */ +export interface MiddlewareInterceptorBindingOptions + extends BaseMiddlewareBindingOptions { + /** + * A flag to control if the interceptor should be global. Default to `true`. + */ + global?: boolean; +} + +/** + * Options to bind middleware as a request context based interceptor within an + * `InvokeMiddleware` action of the sequence. + */ +export interface MiddlewareBindingOptions + extends BaseMiddlewareBindingOptions { + /** + * Name of the middleware extension point. Default to `DEFAULT_MIDDLEWARE_CHAIN`. + */ + chain?: string; +} + +/** + * Interface for an express middleware factory + * @typeParam C - Configuration type + */ +export interface ExpressMiddlewareFactory { + (middlewareConfig?: C): ExpressRequestHandler; +} + +/** + * A symbol to store `MiddlewareContext` on the request object + */ +export const MIDDLEWARE_CONTEXT = Symbol('loopback.middleware.context'); diff --git a/packages/express/tsconfig.json b/packages/express/tsconfig.json new file mode 100644 index 000000000000..c61b1782f6a8 --- /dev/null +++ b/packages/express/tsconfig.json @@ -0,0 +1,26 @@ +{ + "$schema": "http://json.schemastore.org/tsconfig", + "extends": "@loopback/build/config/tsconfig.common.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + "composite": true + }, + "include": [ + "src" + ], + "references": [ + { + "path": "../testlab/tsconfig.json" + }, + { + "path": "../context/tsconfig.json" + }, + { + "path": "../core/tsconfig.json" + }, + { + "path": "../http-server/tsconfig.json" + } + ] +} diff --git a/tsconfig.json b/tsconfig.json index f06e59237d8d..52d3cad8fc19 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -118,6 +118,9 @@ { "path": "packages/core/tsconfig.json" }, + { + "path": "packages/express/tsconfig.json" + }, { "path": "packages/http-caching-proxy/tsconfig.json" }, From da15e7b42bd54ee0d21f13709e71c1c165ed3b4d Mon Sep 17 00:00:00 2001 From: Raymond Feng Date: Sat, 18 Apr 2020 15:42:17 -0700 Subject: [PATCH 02/10] feat(rest): use @loopback/express for sequence, cors, and OpenAPI spec - add `InvokeMiddleware` action to the default sequence - add `middleware/expressMiddleware` APIs to RestServer/RestApplication - use middleware APIs to register CORS and OpenAPI spec endpoints BREAKING CHANGE: `basePath` now also applies to endpoints that serve OpenAPI specs. For example, the OpenAPI specs are available at `/api/openapi.json` or `/api/openapi.yaml` if the base path is set to `/api`. --- packages/rest/package.json | 1 + .../middleware-registeration.acceptance.ts | 135 +++++++++++++ .../middleware-sequence.acceptance.ts | 177 ++++++++++++++++++ .../acceptance/middleware/test-helpers.ts | 120 ++++++++++++ .../fixtures/middleware/spy-config.ts | 21 +++ .../fixtures/middleware/spy.middleware.ts | 41 ++++ .../integration/rest.server.integration.ts | 15 +- packages/rest/src/keys.ts | 7 + packages/rest/src/providers/index.ts | 2 +- packages/rest/src/request-context.ts | 28 ++- packages/rest/src/rest.application.ts | 95 +++++++++- packages/rest/src/rest.component.ts | 3 + packages/rest/src/rest.server.ts | 91 ++++----- .../src/router/external-express-routes.ts | 55 +----- packages/rest/src/sequence.ts | 14 +- packages/rest/src/types.ts | 12 +- packages/rest/tsconfig.json | 3 + 17 files changed, 679 insertions(+), 141 deletions(-) create mode 100644 packages/rest/src/__tests__/acceptance/middleware/middleware-registeration.acceptance.ts create mode 100644 packages/rest/src/__tests__/acceptance/middleware/middleware-sequence.acceptance.ts create mode 100644 packages/rest/src/__tests__/acceptance/middleware/test-helpers.ts create mode 100644 packages/rest/src/__tests__/fixtures/middleware/spy-config.ts create mode 100644 packages/rest/src/__tests__/fixtures/middleware/spy.middleware.ts diff --git a/packages/rest/package.json b/packages/rest/package.json index a0fa5a80e27c..a7858ddd6e38 100644 --- a/packages/rest/package.json +++ b/packages/rest/package.json @@ -23,6 +23,7 @@ "@loopback/core": "^2.4.2", "@loopback/http-server": "^2.1.2", "@loopback/openapi-v3": "^3.3.0", + "@loopback/express": "^1.0.0", "@openapi-contrib/openapi-schema-to-json-schema": "^3.0.0", "@types/body-parser": "^1.19.0", "@types/cors": "^2.8.6", diff --git a/packages/rest/src/__tests__/acceptance/middleware/middleware-registeration.acceptance.ts b/packages/rest/src/__tests__/acceptance/middleware/middleware-registeration.acceptance.ts new file mode 100644 index 000000000000..c51cfd557f7e --- /dev/null +++ b/packages/rest/src/__tests__/acceptance/middleware/middleware-registeration.acceptance.ts @@ -0,0 +1,135 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/rest +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import {Component, config, Provider} from '@loopback/core'; +import { + createMiddlewareBinding, + defineInterceptorProvider, + Middleware, +} from '@loopback/express'; +import {SpyAction} from '@loopback/express/src/__tests__/fixtures/spy-config'; +import {Client, expect} from '@loopback/testlab'; +import {RestApplication} from '../../..'; +import {spy, SpyConfig, TestFunction, TestHelper} from './test-helpers'; + +describe('Express middleware registry', () => { + let helper: TestHelper; + let app: RestApplication; + let client: Client; + + beforeEach(givenTestApp); + afterEach(() => helper?.stop()); + + function runTests(action: SpyAction, testFn: TestFunction) { + describe(`app.expressMiddleware - ${action}`, () => { + const spyConfig: SpyConfig = {action}; + + it('registers an Express middleware interceptor provider class by factory', () => { + const binding = app.expressMiddleware(spy, spyConfig); + return testFn(binding); + }); + + it('registers an Express middleware by component', () => { + const binding = createMiddlewareBinding(defineInterceptorProvider(spy)); + class MyComponent implements Component { + bindings = [binding]; + } + app.component(MyComponent); + return testFn(binding); + }); + + it('registers an Express middleware interceptor as handler function', () => { + const binding = app.expressMiddleware(spy, spyConfig, { + injectConfiguration: false, + key: 'interceptors.middleware.spy', + }); + expect(binding.key).to.eql('interceptors.middleware.spy'); + return testFn(binding); + }); + }); + } + + runTests('log', binding => helper.testSpyLog(binding)); + runTests('mock', binding => helper.testSpyMock(binding)); + runTests('reject', binding => helper.testSpyReject(binding)); + + describe('LoopBack middleware registry', () => { + const spyMiddleware: Middleware = async (middlewareCtx, next) => { + const {request, response} = middlewareCtx; + response.set('x-spy-log-req', `${request.method} ${request.path}`); + await next(); + response.set('x-spy-log-res', `${request.method} ${request.path}`); + }; + + it('registers a LoopBack middleware handler', async () => { + app.middleware(spyMiddleware, { + key: 'middleware.spy', + }); + await testSpyLog(); + }); + + it('registers a LoopBack middleware provider', async () => { + class SpyMiddlewareProvider implements Provider { + value() { + return spyMiddleware; + } + } + app.middleware(SpyMiddlewareProvider, { + key: 'middleware.spy', + }); + await testSpyLog(); + }); + + it('registers a LoopBack middleware provider with config injection', async () => { + type SpyConfig = {headerName: string}; + class SpyMiddlewareProviderWithConfig implements Provider { + @config() + private options: SpyConfig; + value(): Middleware { + return async ({request, response}, next) => { + response.set( + `${this.options.headerName}-req`, + `${request.method} ${request.path}`, + ); + await next(); + response.set( + `${this.options.headerName}-res`, + `${request.method} ${request.path}`, + ); + }; + } + } + const binding = app.middleware(SpyMiddlewareProviderWithConfig, { + key: 'middleware.spy', + }); + app.configure(binding.key).to({headerName: 'x-spy'}); + await client + .post('/hello') + .send('"World"') + .set('content-type', 'application/json') + .expect(200, 'Hello, World') + .expect('x-spy-req', 'POST /hello') + .expect('x-spy-res', 'POST /hello'); + }); + + async function testSpyLog() { + await client + .post('/hello') + .send('"World"') + .set('content-type', 'application/json') + .expect(200, 'Hello, World') + .expect('x-spy-log-req', 'POST /hello') + .expect('x-spy-log-res', 'POST /hello'); + } + }); + + async function givenTestApp() { + helper = new TestHelper(); + helper.bindController(); + await helper.start(); + app = helper.app; + client = helper.client; + } +}); diff --git a/packages/rest/src/__tests__/acceptance/middleware/middleware-sequence.acceptance.ts b/packages/rest/src/__tests__/acceptance/middleware/middleware-sequence.acceptance.ts new file mode 100644 index 000000000000..34631d6ca224 --- /dev/null +++ b/packages/rest/src/__tests__/acceptance/middleware/middleware-sequence.acceptance.ts @@ -0,0 +1,177 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/rest +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import {BindingScope, Constructor, CoreTags, inject} from '@loopback/core'; +import {InvokeMiddleware, InvokeMiddlewareProvider} from '@loopback/express'; +import {RequestContext} from '../../../request-context'; +import {DefaultSequence} from '../../../sequence'; +import {SpyAction} from '../../fixtures/middleware/spy-config'; +import {spy, TestHelper} from './test-helpers'; + +const POST_INVOCATION_MIDDLEWARE = 'middleware.postInvocation'; +describe('Middleware in sequence', () => { + let helper: TestHelper; + + beforeEach(givenTestApp); + afterEach(() => helper?.stop()); + + it('registers a middleware in default slot', () => { + const binding = helper.app.expressMiddleware(spy, undefined); + return helper.testSpyLog(binding); + }); + + it('registers a middleware in postInvoke slot', () => { + const binding = helper.app.expressMiddleware(spy, undefined, { + chain: POST_INVOCATION_MIDDLEWARE, + }); + return helper.testSpyLog(binding); + }); + + it('registers a middleware in both slots', async () => { + const firstSpy = helper.app.expressMiddleware(spy, undefined, { + key: 'middleware.firstSpy', + }); + const secondSpy = helper.app + .expressMiddleware(spy, undefined, { + key: 'middleware.secondSpy', + chain: POST_INVOCATION_MIDDLEWARE, + }) + // Set the scope to be `TRANSIENT` so that the new config can be loaded + .inScope(BindingScope.TRANSIENT); + await helper.testSpyLog(firstSpy); + await helper.testSpyReject(secondSpy); + }); + + it('registers a middleware in default slot with sequence 2', () => { + helper.app.sequence(SequenceWithTwoInvokeMiddleware); + const binding = helper.app.expressMiddleware(spy, undefined); + return helper.testSpyLog(binding); + }); + + function givenTestApp() { + helper = new TestHelper(); + // Create another middleware phase + helper.app + .bind('middleware.postInvoke') + .toProvider(InvokeMiddlewareProvider) + // Configure a different extension point name + .tag({[CoreTags.EXTENSION_POINT]: POST_INVOCATION_MIDDLEWARE}); + helper.app.sequence(SequenceWithOneInvokeMiddleware); + helper.bindController(); + return helper.start(); + } + + /** + * Use `invokeMiddleware` to invoke two sets of middleware + */ + class SequenceWithOneInvokeMiddleware extends DefaultSequence { + async handle(context: RequestContext): Promise { + try { + const {request, response} = context; + // The default middleware chain + let finished = await this.invokeMiddleware(context); + if (finished) return; + const route = this.findRoute(request); + const args = await this.parseParams(request, route); + const result = await this.invoke(route, args); + + // The second middleware chain for post-invocation processing + context.bind('invocation.result').to(result); + + // Invoke another chain of middleware + finished = await this.invokeMiddleware(context, { + chain: POST_INVOCATION_MIDDLEWARE, + }); + if (finished) return; + this.send(response, result); + } catch (error) { + this.reject(context, error); + } + } + } + + /** + * Use another injected `invokeMiddleware` to invoke middleware after the + * invocation returns. + */ + class SequenceWithTwoInvokeMiddleware extends DefaultSequence { + /** + * Inject another middleware chain for post invocation + */ + @inject('middleware.postInvoke', {optional: true}) + protected invokeMiddlewareAfterInvoke: InvokeMiddleware = () => false; + + async handle(context: RequestContext): Promise { + try { + const {request, response} = context; + // The default middleware chain + let finished = await this.invokeMiddleware(context); + if (finished) return; + + const route = this.findRoute(request); + const args = await this.parseParams(request, route); + const result = await this.invoke(route, args); + + // The second middleware chain for post-invocation processing + context.bind('invocation.result').to(result); + finished = await this.invokeMiddlewareAfterInvoke(context); + if (finished) return; + this.send(response, result); + } catch (error) { + this.reject(context, error); + } + } + } +}); + +describe('Invoke a list of Express Middleware in sequence', () => { + let helper: TestHelper; + + beforeEach(givenTestApp); + afterEach(() => helper?.stop()); + + function runTest(action: SpyAction, fn: () => Promise) { + it(`invokes a ${action} middleware`, () => { + helper.app.sequence(givenSequence(action)); + return fn(); + }); + } + + runTest('log', () => helper.assertSpyLog()); + runTest('mock', () => helper.assertSpyMock()); + runTest('reject', () => helper.assertSpyReject()); + + function givenTestApp() { + helper = new TestHelper(); + helper.bindController(); + return helper.start(); + } + + function givenSequence(action: SpyAction): Constructor { + /** + * Use `invokeMiddleware` to invoke two sets of middleware + */ + class SequenceWithExpressMiddleware extends DefaultSequence { + async handle(context: RequestContext): Promise { + try { + const {request, response} = context; + // The default middleware chain + const finished = await this.invokeMiddleware(context, [ + spy({action}), + ]); + if (finished) return; + const route = this.findRoute(request); + const args = await this.parseParams(request, route); + const result = await this.invoke(route, args); + + this.send(response, result); + } catch (error) { + this.reject(context, error); + } + } + } + return SequenceWithExpressMiddleware; + } +}); diff --git a/packages/rest/src/__tests__/acceptance/middleware/test-helpers.ts b/packages/rest/src/__tests__/acceptance/middleware/test-helpers.ts new file mode 100644 index 000000000000..7e505ad73386 --- /dev/null +++ b/packages/rest/src/__tests__/acceptance/middleware/test-helpers.ts @@ -0,0 +1,120 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/rest +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import {Binding, intercept, InterceptorOrKey} from '@loopback/context'; +import {post, requestBody} from '@loopback/openapi-v3'; +import { + Client, + createRestAppClient, + givenHttpServerConfig, +} from '@loopback/testlab'; +import {RestApplication} from '../../..'; +import {SpyConfig} from '../../fixtures/middleware/spy-config'; +import spyFactory from '../../fixtures/middleware/spy.middleware'; +export const spy = spyFactory; +export {SpyConfig} from '../../fixtures/middleware/spy-config'; + +export type TestFunction = (spyBinding: Binding) => Promise; + +export class TestHelper { + readonly app: RestApplication; + client: Client; + + constructor() { + this.app = new RestApplication({rest: givenHttpServerConfig()}); + } + + async start() { + await this.app.start(); + this.client = createRestAppClient(this.app); + } + + stop() { + return this.app.stop(); + } + + bindController(interceptor?: InterceptorOrKey) { + const interceptors: InterceptorOrKey[] = []; + if (interceptor) interceptors.push(interceptor); + class MyController { + @intercept(...interceptors) + @post('/hello', { + responses: { + '200': { + content: {'application/json': {schema: {type: 'string'}}}, + }, + }, + }) + hello( + @requestBody({ + content: { + 'application/json': { + schema: {type: 'string'}, + }, + }, + }) + msg: string, + ) { + return `Hello, ${msg}`; + } + } + return this.app.controller(MyController); + } + + async testSpyLog(spyBinding: Binding) { + // We have to re-configure at restServer level + // as `this.app.middleware()` delegates to `restServer` + this.app.restServer + .configure(spyBinding.key) + .to({action: 'log'}); + + await this.assertSpyLog(); + } + + async assertSpyLog() { + await this.client + .post('/hello') + .send('"World"') + .set('content-type', 'application/json') + .expect(200, 'Hello, World') + .expect('x-spy-log', 'POST /hello'); + } + + async testSpyMock(spyBinding: Binding) { + // We have to re-configure at restServer level + // as `this.app.middleware()` delegates to `restServer` + this.app.restServer + .configure(spyBinding.key) + .to({action: 'mock'}); + await this.assertSpyMock(); + } + + async assertSpyMock() { + await this.client + .post('/hello') + .send('"World"') + .set('content-type', 'application/json') + .expect(200, 'Hello, Spy') + .expect('x-spy-mock', 'POST /hello'); + } + + async testSpyReject(spyBinding: Binding) { + // We have to re-configure at restServer level + // as `this.app.middleware()` delegates to `restServer` + this.app.restServer + .configure(spyBinding.key) + .to({action: 'reject'}); + await this.assertSpyReject(); + } + + async assertSpyReject() { + await this.client + .post('/hello') + .send('"World"') + .set('content-type', 'application/json') + .expect(400) + .expect('x-spy-reject', 'POST /hello'); + } +} diff --git a/packages/rest/src/__tests__/fixtures/middleware/spy-config.ts b/packages/rest/src/__tests__/fixtures/middleware/spy-config.ts new file mode 100644 index 000000000000..9083cea61f2c --- /dev/null +++ b/packages/rest/src/__tests__/fixtures/middleware/spy-config.ts @@ -0,0 +1,21 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/rest +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +export type SpyAction = 'log' | 'mock' | 'reject'; +/** + * Configuration for `spy` middleware + */ +export interface SpyConfig { + /** + * Action for the spy to enforce + * - `log`: set `x-spy-log` http response header and proceed with the + * invocation + * - `mock`: set `x-spy-mock` http response header and return a mock response + * without calling the target + * - `reject`: set `x-spy-reject` http response header and reject the request + * with 400 status code + */ + action: SpyAction; +} diff --git a/packages/rest/src/__tests__/fixtures/middleware/spy.middleware.ts b/packages/rest/src/__tests__/fixtures/middleware/spy.middleware.ts new file mode 100644 index 000000000000..b641bccf7730 --- /dev/null +++ b/packages/rest/src/__tests__/fixtures/middleware/spy.middleware.ts @@ -0,0 +1,41 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/rest +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import {ExpressMiddlewareFactory} from '@loopback/express'; +import debugFactory from 'debug'; +import {HttpErrors} from '../../..'; +import {SpyConfig} from './spy-config'; + +const debug = debugFactory('loopback:rest:middleware:spy'); + +/** + * An Express middleware factory function that creates a handler to spy on + * requests + */ +const spyMiddlewareFactory: ExpressMiddlewareFactory = config => { + const options: SpyConfig = {action: 'log', ...config}; + return function spy(req, res, next) { + debug('config', options); + switch (options?.action) { + case 'mock': + debug('spy - MOCK'); + res.set('x-spy-mock', `${req.method} ${req.path}`); + res.send('Hello, Spy'); + break; + case 'reject': + debug('spy - REJECT'); + res.set('x-spy-reject', `${req.method} ${req.path}`); + next(new HttpErrors.BadRequest('Request rejected by spy')); + break; + default: + debug('spy - LOG'); + res.set('x-spy-log', `${req.method} ${req.path}`); + next(); + break; + } + }; +}; + +export = spyMiddlewareFactory; diff --git a/packages/rest/src/__tests__/integration/rest.server.integration.ts b/packages/rest/src/__tests__/integration/rest.server.integration.ts index 0644b3f84887..cda86856788b 100644 --- a/packages/rest/src/__tests__/integration/rest.server.integration.ts +++ b/packages/rest/src/__tests__/integration/rest.server.integration.ts @@ -9,6 +9,7 @@ import { anOpenApiSpec, anOperationSpec, } from '@loopback/openapi-spec-builder'; +import {invokeMiddleware} from '@loopback/express'; import { createClientForHandler, createRestAppClient, @@ -19,7 +20,6 @@ import { supertest, } from '@loopback/testlab'; import fs from 'fs'; -import {IncomingMessage, ServerResponse} from 'http'; import yaml from 'js-yaml'; import path from 'path'; import {is} from 'type-is'; @@ -1262,7 +1262,7 @@ paths: it('controls server urls', async () => { const response = await createClientForHandler(server.requestHandler).get( - '/openapi.json', + '/api/openapi.json', ); expect(response.body.servers).to.containEql({url: '/api'}); }); @@ -1270,7 +1270,7 @@ paths: it('controls server urls even when set via server.basePath() API', async () => { server.basePath('/v2'); const response = await createClientForHandler(server.requestHandler).get( - '/openapi.json', + '/v2/openapi.json', ); expect(response.body.servers).to.containEql({url: '/v2'}); }); @@ -1296,11 +1296,10 @@ paths: return app.getServer(RestServer); } - function dummyRequestHandler(handler: { - request: IncomingMessage; - response: ServerResponse; - }) { - const {response} = handler; + async function dummyRequestHandler(requestContext: RequestContext) { + const {response} = requestContext; + const result = await invokeMiddleware(requestContext); + if (result === response) return; response.write('Hello'); response.end(); } diff --git a/packages/rest/src/keys.ts b/packages/rest/src/keys.ts index 650edb855d3b..9dd212391544 100644 --- a/packages/rest/src/keys.ts +++ b/packages/rest/src/keys.ts @@ -5,6 +5,7 @@ import {BindingKey, Context} from '@loopback/context'; import {CoreBindings} from '@loopback/core'; +import {InvokeMiddleware} from '@loopback/express'; import {HttpProtocol} from '@loopback/http-server'; import {OpenApiSpec, OperationObject} from '@loopback/openapi-v3'; import https from 'https'; @@ -181,6 +182,12 @@ export namespace RestBindings { * Bindings for potential actions that could be used in a sequence */ export namespace SequenceActions { + /** + * Binding key for setting and injecting a route finding function + */ + export const INVOKE_MIDDLEWARE = BindingKey.create( + 'rest.sequence.actions.invokeMiddleware', + ); /** * Binding key for setting and injecting a route finding function */ diff --git a/packages/rest/src/providers/index.ts b/packages/rest/src/providers/index.ts index ab4294803b9e..c3c8b25b821b 100644 --- a/packages/rest/src/providers/index.ts +++ b/packages/rest/src/providers/index.ts @@ -8,6 +8,6 @@ export * from './find-route.provider'; export * from './get-from-context.provider'; export * from './invoke-method.provider'; export * from './log-error.provider'; -export * from './reject.provider'; export * from './parse-params.provider'; +export * from './reject.provider'; export * from './send.provider'; diff --git a/packages/rest/src/request-context.ts b/packages/rest/src/request-context.ts index fdc7316a31fe..8a04b275b6be 100644 --- a/packages/rest/src/request-context.ts +++ b/packages/rest/src/request-context.ts @@ -4,16 +4,21 @@ // License text available at https://opensource.org/licenses/MIT import {Context} from '@loopback/context'; -import onFinished from 'on-finished'; +import { + HandlerContext, + MiddlewareContext, + Request, + Response, +} from '@loopback/express'; import {RestBindings} from './keys'; import {RestServerResolvedConfig} from './rest.server'; -import {HandlerContext, Request, Response} from './types'; /** * A per-request Context combining an IoC container with handler context * (request, response, etc.). */ -export class RequestContext extends Context implements HandlerContext { +export class RequestContext extends MiddlewareContext + implements HandlerContext { /** * Get the protocol used by the client to make the request. * Please note this protocol may be different from what we are observing @@ -97,20 +102,13 @@ export class RequestContext extends Context implements HandlerContext { public readonly serverConfig: RestServerResolvedConfig, name?: string, ) { - super(parent, name); - this._setupBindings(request, response); - onFinished(this.response, () => { - // Close the request context when the http response is finished so that - // it can be recycled by GC - this.close(); - }); + super(request, response, parent, name); } - private _setupBindings(request: Request, response: Response) { - this.bind(RestBindings.Http.REQUEST).to(request).lock(); - - this.bind(RestBindings.Http.RESPONSE).to(response).lock(); - + protected setupBindings() { + super.setupBindings(); + this.bind(RestBindings.Http.REQUEST).to(this.request).lock(); + this.bind(RestBindings.Http.RESPONSE).to(this.response).lock(); this.bind(RestBindings.Http.CONTEXT).to(this).lock(); } } diff --git a/packages/rest/src/rest.application.ts b/packages/rest/src/rest.application.ts index 0445295cc961..6cb7b91580e2 100644 --- a/packages/rest/src/rest.application.ts +++ b/packages/rest/src/rest.application.ts @@ -3,8 +3,20 @@ // This file is licensed under the MIT License. // License text available at https://opensource.org/licenses/MIT -import {Binding, BindingAddress, Constructor, Context} from '@loopback/context'; +import { + Binding, + BindingAddress, + Constructor, + Context, + Provider, +} from '@loopback/context'; import {Application, ApplicationConfig, Server} from '@loopback/core'; +import { + ExpressMiddlewareFactory, + ExpressRequestHandler, + Middleware, + MiddlewareBindingOptions, +} from '@loopback/express'; import {OpenApiSpec, OperationObject} from '@loopback/openapi-v3'; import {PathParams} from 'express-serve-static-core'; import {ServeStaticOptions} from 'serve-static'; @@ -13,12 +25,7 @@ import {BodyParser} from './body-parsers'; import {RestBindings} from './keys'; import {RestComponent} from './rest.component'; import {HttpRequestListener, HttpServerLike, RestServer} from './rest.server'; -import { - ControllerClass, - ControllerFactory, - ExpressRequestHandler, - RouteEntry, -} from './router'; +import {ControllerClass, ControllerFactory, RouteEntry} from './router'; import {RouterSpec} from './router/router-spec'; import {SequenceFunction, SequenceHandler} from './sequence'; @@ -133,6 +140,80 @@ export class RestApplication extends Application implements HttpServerLike { this.restServer.basePath(path); } + /** + * Bind an Express middleware to this server context + * + * @example + * ```ts + * import myExpressMiddlewareFactory from 'my-express-middleware'; + * const myExpressMiddlewareConfig= {}; + * const myExpressMiddleware = myExpressMiddlewareFactory(myExpressMiddlewareConfig); + * server.expressMiddleware('middleware.express.my', myExpressMiddleware); + * ``` + * @param key - Middleware binding key + * @param middleware - Express middleware handler function(s) + * + */ + expressMiddleware( + key: BindingAddress, + middleware: ExpressRequestHandler | ExpressRequestHandler[], + options?: MiddlewareBindingOptions, + ): Binding; + + /** + * Bind an Express middleware to this server context + * + * @example + * ```ts + * import myExpressMiddlewareFactory from 'my-express-middleware'; + * const myExpressMiddlewareConfig= {}; + * server.expressMiddleware(myExpressMiddlewareFactory, myExpressMiddlewareConfig); + * ``` + * @param middlewareFactory - Middleware module name or factory function + * @param middlewareConfig - Middleware config + * @param options - Options for registration + * + * @typeParam CFG - Configuration type + */ + expressMiddleware( + middlewareFactory: ExpressMiddlewareFactory, + middlewareConfig?: CFG, + options?: MiddlewareBindingOptions, + ): Binding; + + expressMiddleware( + factoryOrKey: ExpressMiddlewareFactory | BindingAddress, + configOrHandlers: CFG | ExpressRequestHandler | ExpressRequestHandler[], + options: MiddlewareBindingOptions = {}, + ): Binding { + return this.restServer.expressMiddleware( + factoryOrKey, + configOrHandlers, + options, + ); + } + + /** + * Register a middleware function or provider class + * + * @example + * ```ts + * const log: Middleware = async (requestCtx, next) { + * // ... + * } + * server.middleware(log); + * ``` + * + * @param middleware - Middleware function or provider class + * @param options - Middleware binding options + */ + middleware( + middleware: Middleware | Constructor>, + options: MiddlewareBindingOptions = {}, + ): Binding { + return this.restServer.middleware(middleware, options); + } + /** * Register a new Controller-based route. * diff --git a/packages/rest/src/rest.component.ts b/packages/rest/src/rest.component.ts index 53e4fde8251c..4b1d4ed0350f 100644 --- a/packages/rest/src/rest.component.ts +++ b/packages/rest/src/rest.component.ts @@ -16,6 +16,7 @@ import { ProviderMap, Server, } from '@loopback/core'; +import {InvokeMiddlewareProvider} from '@loopback/express'; import {createEmptyApiSpec} from '@loopback/openapi-v3'; import { JsonBodyParser, @@ -49,6 +50,8 @@ import {AjvFactoryProvider} from './validation/ajv-factory.provider'; export class RestComponent implements Component { providers: ProviderMap = { [RestBindings.SequenceActions.LOG_ERROR.key]: LogErrorProvider, + [RestBindings.SequenceActions.INVOKE_MIDDLEWARE + .key]: InvokeMiddlewareProvider, [RestBindings.SequenceActions.FIND_ROUTE.key]: FindRouteProvider, [RestBindings.SequenceActions.INVOKE_METHOD.key]: InvokeMethodProvider, [RestBindings.SequenceActions.REJECT.key]: RejectProvider, diff --git a/packages/rest/src/rest.server.ts b/packages/rest/src/rest.server.ts index 81e99532ab1e..b8412d7fa8e8 100644 --- a/packages/rest/src/rest.server.ts +++ b/packages/rest/src/rest.server.ts @@ -8,7 +8,6 @@ import { BindingAddress, BindingScope, Constructor, - Context, ContextObserver, createBindingFromClass, filterByKey, @@ -17,6 +16,7 @@ import { Subscription, } from '@loopback/context'; import {Application, CoreBindings, Server} from '@loopback/core'; +import {ExpressRequestHandler, MiddlewareRegistry} from '@loopback/express'; import {HttpServer, HttpServerOptions} from '@loopback/http-server'; import { getControllerSpec, @@ -49,7 +49,6 @@ import { ControllerRoute, createControllerFactoryForBinding, createRoutesForController, - ExpressRequestHandler, ExternalExpressRoutes, RedirectRoute, RestRouterOptions, @@ -60,16 +59,7 @@ import { } from './router'; import {assignRouterSpec} from './router/router-spec'; import {DefaultSequence, SequenceFunction, SequenceHandler} from './sequence'; -import { - FindRoute, - InvokeMethod, - ParseParams, - Reject, - Request, - RequestBodyParserOptions, - Response, - Send, -} from './types'; +import {Request, RequestBodyParserOptions, Response} from './types'; const debug = debugFactory('loopback:rest:server'); @@ -111,7 +101,8 @@ const SequenceActions = RestBindings.SequenceActions; * const server = await app.get('servers.foo'); * ``` */ -export class RestServer extends Context implements Server, HttpServerLike { +export class RestServer extends MiddlewareRegistry + implements Server, HttpServerLike { /** * Handle incoming HTTP(S) request by invoking the corresponding * Controller method via the configured Sequence. @@ -251,7 +242,11 @@ export class RestServer extends Context implements Server, HttpServerLike { // Allow CORS support for all endpoints so that users // can test with online SwaggerUI instance - this._expressApp.use(cors(this.config.cors)); + this.expressMiddleware(cors, this.config.cors, { + injectConfiguration: false, + key: 'middleware.cors', + group: 'cors', + }); // Set up endpoints for OpenAPI spec/ui this._setupOpenApiSpecEndpoints(); @@ -311,49 +306,52 @@ export class RestServer extends Context implements Server, HttpServerLike { */ protected _setupOpenApiSpecEndpoints() { if (this.config.openApiSpec.disabled) return; + const router = express.Router(); const mapping = this.config.openApiSpec.endpointMapping!; // Serving OpenAPI spec for (const p in mapping) { - this.addOpenApiSpecEndpoint(p, mapping[p]); + this.addOpenApiSpecEndpoint(p, mapping[p], router); } - const explorerPaths = ['/swagger-ui', '/explorer']; - this._expressApp.get(explorerPaths, (req, res, next) => + router.get(explorerPaths, (req, res, next) => this._redirectToSwaggerUI(req, res, next), ); + this.expressMiddleware('middleware.apiSpec.defaults', router, { + group: 'apiSpec', + }); } /** * Add a new non-controller endpoint hosting a form of the OpenAPI spec. * * @param path Path at which to host the copy of the OpenAPI - * @param form Form that should be renedered from that path + * @param form Form that should be rendered from that path */ - addOpenApiSpecEndpoint(path: string, form: OpenApiSpecForm) { - if (this._expressApp) { - // if the app is already started, try to hot-add it - // this only actually "works" mid-startup, once this._handleHttpRequest - // has been added to express, adding any later routes won't work - - // NOTE(bajtos) Regular routes are handled through Sequence. - // IMO, this built-in endpoint should not run through a Sequence, - // because it's not part of the application API itself. - // E.g. if the app implements access/audit logs, I don't want - // this endpoint to trigger a log entry. If the server implements - // content-negotiation to support XML clients, I don't want the OpenAPI - // spec to be converted into an XML response. - this._expressApp.get(path, (req, res) => - this._serveOpenApiSpec(req, res, form), - ); - } else { - // if the app is not started, add the mapping to the config - const mapping = this.config.openApiSpec.endpointMapping!; - if (path in mapping) { + addOpenApiSpecEndpoint( + path: string, + form: OpenApiSpecForm, + router?: express.Router, + ) { + if (router == null) { + const key = `middleware.apiSpec.${path}.${form}`; + if (this.contains(key)) { throw new Error( `The path ${path} is already configured for OpenApi hosting`, ); } - mapping[path] = form; + const newRouter = express.Router(); + newRouter.get(path, (req, res) => this._serveOpenApiSpec(req, res, form)); + this.expressMiddleware( + () => newRouter, + {}, + { + injectConfiguration: false, + key: `middleware.apiSpec.${path}.${form}`, + group: 'apiSpec', + }, + ); + } else { + router.get(path, (req, res) => this._serveOpenApiSpec(req, res, form)); } } @@ -883,21 +881,8 @@ export class RestServer extends Context implements Server, HttpServerLike { */ public handler(handlerFn: SequenceFunction) { class SequenceFromFunction extends DefaultSequence { - // NOTE(bajtos) Unfortunately, we have to duplicate the constructor - // in order for our DI/IoC framework to inject constructor arguments - constructor( - @inject(SequenceActions.FIND_ROUTE) protected findRoute: FindRoute, - @inject(SequenceActions.PARSE_PARAMS) - protected parseParams: ParseParams, - @inject(SequenceActions.INVOKE_METHOD) protected invoke: InvokeMethod, - @inject(SequenceActions.SEND) public send: Send, - @inject(SequenceActions.REJECT) public reject: Reject, - ) { - super(findRoute, parseParams, invoke, send, reject); - } - async handle(context: RequestContext): Promise { - await Promise.resolve(handlerFn(context, this)); + return handlerFn(context, this); } } diff --git a/packages/rest/src/router/external-express-routes.ts b/packages/rest/src/router/external-express-routes.ts index 64448bf33efc..9422ef9f3e4b 100644 --- a/packages/rest/src/router/external-express-routes.ts +++ b/packages/rest/src/router/external-express-routes.ts @@ -4,30 +4,25 @@ // License text available at https://opensource.org/licenses/MIT import {Context} from '@loopback/context'; +import { + executeExpressRequestHandler, + ExpressRequestHandler, + Request, +} from '@loopback/express'; import { OpenApiSpec, OperationObject, SchemasObject, } from '@loopback/openapi-v3'; -import express, {RequestHandler} from 'express'; +import express from 'express'; import {PathParams} from 'express-serve-static-core'; import HttpErrors from 'http-errors'; -import onFinished from 'on-finished'; import {ServeStaticOptions} from 'serve-static'; -import {promisify} from 'util'; import {RequestContext} from '../request-context'; -import { - OperationArgs, - OperationRetval, - PathParameterValues, - Request, - Response, -} from '../types'; +import {OperationArgs, OperationRetval, PathParameterValues} from '../types'; import {ResolvedRoute, RouteEntry} from './route-entry'; import {assignRouterSpec, RouterSpec} from './router-spec'; -export type ExpressRequestHandler = express.RequestHandler; - /** * A registry of external, Express-style routes. These routes are invoked * _after_ no LB4 route (controller or handler based) matched the incoming @@ -99,14 +94,14 @@ class ExternalRoute implements RouteEntry, ResolvedRoute { {request, response}: RequestContext, args: OperationArgs, ): Promise { - let handled = await executeRequestHandler( + let handled = await executeExpressRequestHandler( this._externalRouter, request, response, ); if (handled) return; - handled = await executeRequestHandler( + handled = await executeExpressRequestHandler( this._staticAssets, request, response, @@ -142,35 +137,3 @@ export function rebaseOpenApiSpec>( return spec; } - -const onFinishedAsync = promisify(onFinished); - -/** - * Execute an Express-style callback-based request handler. - * - * @param handler - * @param request - * @param response - * @returns A promise resolved to: - * - `true` when the request was handled - * - `false` when the handler called `next()` to proceed to the next - * handler (middleware) in the chain. - */ -function executeRequestHandler( - handler: RequestHandler, - request: Request, - response: Response, -): Promise { - const responseWritten = onFinishedAsync(response).then(() => true); - const handlerFinished = new Promise((resolve, reject) => { - handler(request, response, err => { - if (err) { - reject(err); - } else { - // Express router called next, which means no route was matched - resolve(false); - } - }); - }); - return Promise.race([handlerFinished, responseWritten]); -} diff --git a/packages/rest/src/sequence.ts b/packages/rest/src/sequence.ts index 2e29674bee25..b3c05f9c9496 100644 --- a/packages/rest/src/sequence.ts +++ b/packages/rest/src/sequence.ts @@ -4,7 +4,8 @@ // License text available at https://opensource.org/licenses/MIT const debug = require('debug')('loopback:rest:sequence'); -import {inject} from '@loopback/context'; +import {inject, ValueOrPromise} from '@loopback/context'; +import {InvokeMiddleware} from '@loopback/express'; import {RestBindings} from './keys'; import {RequestContext} from './request-context'; import {FindRoute, InvokeMethod, ParseParams, Reject, Send} from './types'; @@ -18,7 +19,7 @@ const SequenceActions = RestBindings.SequenceActions; export type SequenceFunction = ( context: RequestContext, sequence: DefaultSequence, -) => Promise | void; +) => ValueOrPromise; /** * A sequence handler is a class implementing sequence of actions @@ -53,6 +54,13 @@ export interface SequenceHandler { * ``` */ export class DefaultSequence implements SequenceHandler { + /** + * Optional invoker for registered middleware in a chain. + * To be injected via SequenceActions.INVOKE_MIDDLEWARE. + */ + @inject(SequenceActions.INVOKE_MIDDLEWARE, {optional: true}) + protected invokeMiddleware: InvokeMiddleware = () => false; + /** * Constructor: Injects findRoute, invokeMethod & logError * methods as promises. @@ -95,6 +103,8 @@ export class DefaultSequence implements SequenceHandler { async handle(context: RequestContext): Promise { try { const {request, response} = context; + // Invoke registered Express middleware + await this.invokeMiddleware(context); const route = this.findRoute(request); const args = await this.parseParams(request, route); const result = await this.invoke(route, args); diff --git a/packages/rest/src/types.ts b/packages/rest/src/types.ts index c0a621e84738..0d9fb6013f03 100644 --- a/packages/rest/src/types.ts +++ b/packages/rest/src/types.ts @@ -4,6 +4,7 @@ // License text available at https://opensource.org/licenses/MIT import {Binding, BoundValue} from '@loopback/context'; +import {HandlerContext, Request, Response} from '@loopback/express'; import {ReferenceObject, SchemaObject} from '@loopback/openapi-v3'; import ajv, {Ajv, FormatDefinition, KeywordDefinition} from 'ajv'; import { @@ -12,19 +13,12 @@ import { OptionsText, OptionsUrlencoded, } from 'body-parser'; -import {Request, Response} from 'express'; import {ResolvedRoute, RouteEntry} from './router'; -export {Request, Response}; - /** - * An object holding HTTP request, response and other data - * needed to handle an incoming HTTP request. + * Re-export types from `./middleware` */ -export interface HandlerContext { - readonly request: Request; - readonly response: Response; -} +export * from '@loopback/express'; /** * Find a route matching the incoming request. diff --git a/packages/rest/tsconfig.json b/packages/rest/tsconfig.json index 5206f41c7f42..4b7c3fb651ed 100644 --- a/packages/rest/tsconfig.json +++ b/packages/rest/tsconfig.json @@ -30,6 +30,9 @@ }, { "path": "../openapi-v3/tsconfig.json" + }, + { + "path": "../express/tsconfig.json" } ] } From 3887b5b1e12a155521aecfc9cc3510df017ce815 Mon Sep 17 00:00:00 2001 From: Raymond Feng Date: Sat, 18 Apr 2020 15:42:59 -0700 Subject: [PATCH 03/10] feat(docs): add docs for @loopback/express and its usage in @loopback/rest --- docs/site/Express-middleware.md | 343 ++++++++++++++++++++ docs/site/FAQ.md | 14 +- docs/site/Middleware.md | 340 +++++++++++++++++++ docs/site/express-with-lb4-rest-tutorial.md | 9 +- docs/site/imgs/middleware-classes.png | Bin 0 -> 232434 bytes docs/site/imgs/middleware.png | Bin 0 -> 229761 bytes docs/site/sidebars/lb4_sidebar.yml | 8 + 7 files changed, 702 insertions(+), 12 deletions(-) create mode 100644 docs/site/Express-middleware.md create mode 100644 docs/site/Middleware.md create mode 100644 docs/site/imgs/middleware-classes.png create mode 100644 docs/site/imgs/middleware.png diff --git a/docs/site/Express-middleware.md b/docs/site/Express-middleware.md new file mode 100644 index 000000000000..378463901dc4 --- /dev/null +++ b/docs/site/Express-middleware.md @@ -0,0 +1,343 @@ +--- +lang: en +title: 'Using Express middleware' +keywords: LoopBack 4.0, LoopBack 4, Express, Middleware +sidebar: lb4_sidebar +permalink: /doc/en/lb4/Express-middleware.html +--- + +## Overview + +Express is the most popular web framework for Node.js developers. As quoted +below from the +[Express web site](https://expressjs.com/en/guide/using-middleware.html), +middleware are the basic building blocks for Express applications. + +> Express is a routing and middleware web framework that has minimal +> functionality of its own: An Express application is essentially a series of +> middleware function calls. + +LookBack 4 leverages Express behind the scenes for its REST server +implementation. We decided to not expose middleware capabilities to users while +we pursue an elegant and non-invasive way to fit Express middleware into the +LoopBack 4 programming model nicely. Meanwhile, we have received various +requests and questions from our users on how to use Express middleware with +LoopBack 4 or migrate their usage of Express middleware from LoopBack 3 to +LoopBack 4. + +## Use cases + +The following use cases are identified to allow Express middleware to work with +LoopBack 4: + +### For application developers + +1. Invoke one or more Express middleware handler functions in the REST sequence + before, after, or between existing actions. +2. Apply Express middleware globally to all controllers, or locally to certain + controller classes and methods. +3. Migrate LoopBack 3 applications that use Express middleware +4. Be able to separate Express middleware configuration from its registration + and allow configuration changes at runtime to be effective without restarting + the application. + +### For extension developers + +1. Allow new actions to be added to the REST sequence without requiring code + changes to the application as long as the extension component is mounted to + the application. For example, `@loopback/authentication` contributes an + `Authenticate` action. It should be possible to build an extension module for + [`Helmet`](https://helmetjs.github.io/) to provide better protection for + LoopBack. +2. Allow actions to be invoked in a configurable order. +3. Allow extensions to leverage LoopBack's dependency injection and extension + point/extension capabilities. + +Let's start with a few examples to illustrate how we can bring Express +middleware to LoopBack applications with minimal effort. + +## Use Express middleware within the sequence of actions + +Express middleware can now be plugged into the REST sequence with an +`InvokeMiddleware` action being injected to the default sequence. + +### Invoke Express middleware explicitly in the sequence + +The custom sequence class below invokes two Express middleware +([`helmet`](https://helmetjs.github.io/) and +[`morgan`](https://github.com/expressjs/morgan)) handler functions as the first +step. + +{% include code-caption.html content="src/sequence.ts" %} + +```ts +import helmet from 'helmet'; // For security +import morgan from 'morgan'; // For http access logging + +const middlewareList: ExpressRequestHandler[] = [ + helmet({}), // options for helmet is fixed and cannot be changed at runtime + morgan('combined', {}), // options for morgan is fixed and cannot be changed at runtime +]; + +export class MySequence extends DefaultSequence { + async handle(context: RequestContext): Promise { + try { + const {request, response} = context; + // `this.invokeMiddleware` is an injected function to invoke a list of + // Express middleware handler functions + const finished = await this.invokeMiddleware(context, middlewareList); + if (finished) { + // The http response has already been produced by one of the Express + // middleware. We should not call further actions. + return; + } + const route = this.findRoute(request); + const args = await this.parseParams(request, route); + const result = await this.invoke(route, args); + + this.send(response, result); + } catch (error) { + this.reject(context, error); + } + } +} +``` + +### Register Express middleware to be executed by `InvokeMiddleware` actions + +While the explicit Express middleware invocation is easy and simple, there are +some limitations. + +1. The list of Express middleware has to be hard-coded in `src/sequence.ts`. + It's not easy to plug in a new middleware. +2. The configuration of Express middleware is fixed unless we use dependency + injections for such values in `src/sequence.ts`. + +We provide another option to make invocation of Express middleware more flexible +and extensible. The `InvokeMiddleware` actions within the sequence can discover +registered middleware and invoke them in a chain. + +We first register middleware against the default or a named chain using APIs +from `RestApplication`. It can happen in the constructor of an application. + +{% include code-caption.html content="src/application.ts" %} + +```ts +import morgan from 'morgan'; +import {ApplicationConfig} from '@loopback/core'; +import {RestApplication} from '@loopback/rest'; + +export class MyApplication extends RestApplication { + constructor(config: ApplicationConfig) { + this.expressMiddleware( + morgan, + {}, // default config + { + // Allow configuration to be injected to allow dynamic changes to + // morgan logging by configuring `middleware.morgan` to a new value + injectConfiguration: true, + key: 'middleware.morgan', + }, + ); + } +} +``` + +## Use Express middleware as interceptors for controllers + +The LoopBack global and local interceptors now also serve as an avenue to attach +middleware logic to specific points of controller invocations, such as global, +class, or method levels. + +There are a few options to wrap an Express middleware module into an LoopBack 4 +interceptor. + +- toInterceptor: wraps an Express handler function to a LoopBack interceptor + function +- createInterceptor: creates a LoopBack interceptor function from an Express + factory function with configuration +- defineInterceptorProvider: creates a LoopBack provider class for interceptors + from an Express factory function with configuration. This is only necessary + that injection and/or change of configuration is needed. The provider class + then needs to be bound to the application context hierarchy as a global or + local interceptor. + +Let's walk through a few examples: + +### Adapt an Express middleware handler function to an interceptor + +If the Express middleware only exposes the handler function without a factory or +a single instance is desired, use `toInterceptor`. + +```ts +import {toInterceptor} from '@loopback/express'; +import morgan from 'morgan'; + +const morganInterceptor = toInterceptor(morgan('combined')); +``` + +### Create an interceptor from Express middleware factory function and configuration + +When the Express middleware module exports a factory function that takes an +optional argument for configuration, use `createInterceptor`. + +```ts +import {createInterceptor} from '@loopback/express'; +import helmet, {IHelmetConfiguration} from 'helmet'; +const helmetConfig: IHelmetConfiguration = {}; +const helmetInterceptor = createInterceptor(helmet, helmetConfig); +``` + +If the Express middleware module does not expose a factory function conforming +to the `ExpressMiddlewareFactory` signature, a wrapper can be created. For +example: + +```ts +import morgan from 'morgan'; + +// Register `morgan` express middleware +// Create a middleware factory wrapper for `morgan(format, options)` +const morganFactory = (config?: morgan.Options) => morgan('combined', config); +``` + +### Define a provider class for middleware-based interceptor + +It's often desirable to allow dependency injection of middleware configuration +for the middleware. We can use `defineInterceptorProvider` to simplify +definition of such provider classes. + +```ts +import {defineInterceptorProvider} from '@loopback/express'; +import helmet, {IHelmetConfiguration} from 'helmet'; + +const helmetProviderClass = defineInterceptorProvider( + helmet, + {}, // default config +); +``` + +Alternatively, we can create a subclass of +`ExpressMiddlewareInterceptorProvider`. + +```ts +import {config} from '@loopback/context'; +import { + ExpressMiddlewareInterceptorProvider, + createMiddlewareInterceptorBinding, +} from '@loopback/express'; +import helmet, {IHelmetConfiguration} from 'helmet'; + +class HelmetInterceptorProvider extends ExpressMiddlewareInterceptorProvider< + IHelmetConfiguration +> { + constructor(@config() helmetConfig?: IHelmetConfiguration) { + super(helmet, helmetConfig); + } +} +``` + +The provider class can then be registered to the application. For example, the +code below can be used in the constructor of your `Application` subclass. + +```ts +const binding = createMiddlewareInterceptorBinding(HelmetInterceptorProvider); +this.add(binding); +``` + +### Apply Express middleware as invocation interceptors + +With the ability to wrap Express middleware as LoopBack 4 interceptors, we can +use the same programming model to register middleware as global interceptors or +local interceptors denoted by `@intercept` decorators at class and method +levels. + +The middleware interceptor function can be directly referenced by `@intercept`. + +```ts +import morgan from 'morgan'; +const morganInterceptor = toInterceptor(morgan('combined')); +class MyController { + @intercept(morganInterceptor) + hello(msg: string) { + return `Hello, ${msg}`; + } +} +``` + +It's also possible to bind the middleware to a context as a local or global +interceptor. + +```ts +import helmet, {IHelmetConfiguration} from 'helmet'; +const binding = registerExpressMiddlewareInterceptor( + app, + helmet, + {}, + { + // As a global interceptor + global: true, + key: 'interceptors.helmet', + }, +); +``` + +For a bound local interceptor, the binding key can now be used with +`@intercept`. + +```ts +@intercept('interceptors.helmet') +class MyController { + hello(msg: string) { + return `Hello, ${msg}`; + } +} +``` + +### Use `lb4 interceptor` command to create interceptors for Express middleware + +The `lb4 interceptor` can be used to generate a skeleton implementation of +global or local interceptors. We can update the generated code to plug in +Express middleware. For example, to add +[helmet](https://github.com/helmetjs/helmet) as the security middleware: + +```sh +lb4 interceptor +? Interceptor name: Helmet +? Is it a global interceptor? Yes +? Group name for the global interceptor: ('') middleware + create src/interceptors/helmet.interceptor.ts + update src/interceptors/index.ts + +Interceptor Helmet was created in src/interceptors/ +``` + +Let's update `src/interceptors/helmet.interceptor.ts: + +```ts +import {config, globalInterceptor} from '@loopback/core'; +import helmet, {IHelmetConfiguration} from 'helmet'; +import {ExpressMiddlewareInterceptorProvider} from '@loopback/express'; + +@globalInterceptor('middleware', {tags: {name: 'Helmet'}}) +export class MorganInterceptor extends ExpressMiddlewareInterceptorProvider< + IHelmetConfiguration +> { + constructor( + @config() + options: IHelmetConfiguration = { + hidePoweredBy: true, + }, + ) { + super(helmet, options); + } +} +``` + +## What's behind the scenes + +`Middleware` and `Interceptor` are key concepts that allow Express middleware +into LoopBack seamlessly. Please read the following pages to better understand +the architecture. + +- [Interceptors](Interceptors.md) +- [Middleware](Middleware.md) diff --git a/docs/site/FAQ.md b/docs/site/FAQ.md index 1ceb4e8e94cf..7ea75f527b72 100644 --- a/docs/site/FAQ.md +++ b/docs/site/FAQ.md @@ -79,8 +79,8 @@ statements. ### LoopBack 3 vs LoopBack 4 We recommend that current users migrate to LoopBack 4, which can be done through -following the [migration guide](migration-overview.html) and new users start -with LoopBack 4. See +following the [migration guide](migration/overview.md) and new users start with +LoopBack 4. See [Differences between LoopBack v3 and v4](Understanding-the-differences.md) if you're interested in the differences between the two versions. @@ -91,7 +91,7 @@ LoopBack provides a self-hosted and a redirect to an Documentation to disable both API Explorers: -- [Disable redirect to API Explorer](https://loopback.io/doc/en/lb4/Self-hosted-rest-api-explorer.html#disable-self-hosted-api-explorer) +- [Disable redirect to API Explorer](https://loopback.io/doc/en/lb4/Server.html#disable-redirect-to-api-explorer) - [Disable Self-Hosted API Explorer](https://loopback.io/doc/en/lb4/Self-hosted-rest-api-explorer.html#disable-self-hosted-api-explorer) ### How do I send a custom response? @@ -179,7 +179,7 @@ This will result in a custom response body and a new header, `x-secret-sauce`. ### Where do I find the default binding keys? Binding keys used by `@loopback/*` packages are consolidated under -[Reserved binding keys](https://loopback.io/doc/en/lb4/Reserved-binding-keys.html). +[Reserved binding keys](Reserved-binding-keys.md). ### What is the difference between general and configuration bindings? @@ -190,10 +190,8 @@ create a completely separate key. See ### Can I attach an Express router? -Yes. See -[Mounting an Express router](https://loopback.io/doc/en/lb4/Routes.html#mounting-an-express-router) +Yes. See [Mounting an Express Router](Routes.md#mounting-an-express-router). ### Can I mount an Express middleware? -LoopBack 4 doesn't have first-class support for Express middleware. However, -[there are workarounds](https://github.com/strongloop/loopback-next/issues/1293). +Yes. See [Using Express Middleware](Express-middleware.md). diff --git a/docs/site/Middleware.md b/docs/site/Middleware.md new file mode 100644 index 000000000000..f3c7feeddb9b --- /dev/null +++ b/docs/site/Middleware.md @@ -0,0 +1,340 @@ +--- +lang: en +title: 'Middleware' +keywords: LoopBack 4.0, LoopBack 4, Express, Middleware +sidebar: lb4_sidebar +permalink: /doc/en/lb4/Middleware.html +--- + +## Overview + +Node.js web frameworks such as `Express` and `Koa` use middleware as the basic +building blocks to compose a pipeline of functions that handles HTTP requests +and responses. + +LookBack 4 leverages Express behind the scenes for its REST server +implementation. We decided to not expose Express's native middleware +capabilities to users while we pursue an elegant and non-invasive way to fit +Express middleware into the LoopBack 4 programming model nicely. Meanwhile, we +have received various requests and questions from our users on how to use +Express middleware with LoopBack 4 or migrate their usage of Express middleware +from LoopBack 3 to LoopBack 4. + +We agree that middleware is a powerful construct for LoopBack developers. Being +able to reuse the great assets from Express's middleware ecosystem is a critical +objective. It's also very important to fully leverage LoopBack's extensibility +and composability to plug middleware into the framework. Let's look at some of +key perspectives to map use cases to our design. + +## Design goals + +The core of LoopBack is built upon patterns of Inversion of Control, Dependency +Injection, as well as Extension Point and Extensions. + +- Open up the [Sequence](Sequence.md) to expose + [extension points](Extension-point-and-extensions.md) that allow custom logic, + such as logging, monitoring, and rate limiting, to be plugged in as middleware + for http request/response processing. It should be possible to contribute + middleware without requiring manual update of the `Sequence` class. Components + should be able to leverage dependency injection to externalize the + configuration. For example, we can build a Helmet component for LoopBack to + add security protection middleware to our Sequence. + +- Embrace and adapt existing Express middleware modules with minimal effort + + - Run an explicit list of Express middleware handler functions + - Support the factory and configuration pattern used by most Express + middleware + - Register middleware in any order with the ability to control the order of + execution + - Allow configuration to be updated at runtime by simply rebinding the + configuration value and make it possible for the middleware to pick up. For + example, adjust logging level from info to debug if necessary. + - Allow Express middleware to used with LoopBack in two tiers: + - As middleware in the sequence to handle all requests/responses + - As global or local interceptors around controller method invocations + +- Build on top of the [Interceptors](Interceptors.md) infrastructure. We have + used interceptors within the `InvokeMethod` action of a sequence. Expanding + such capability to other actions is a natural choice. We're not reinventing + the wheel as we are just extending the interceptor idea to new use cases.The + Middleware and MiddlewareChain are not new concepts. They are just + specialization of GenericInterceptor and GenericInterceptorChain. Being able + to use the same programming model concepts for different tiers provide the + consistency and ease of learning. + +## LoopBack style middleware + +Built on top of idea of interceptors, middleware is specialized functions that +work with the `MiddlewareContext` - a wrapper object for `request` and +`response`. The signature is of `Middleware` is: + +```ts +import {MiddlewareContext} from '@loopback/express'; +import {Next, ValueOrPromise, InvocationResult} from '@loopback/context'; + +(context: MiddlewareContext, next: Next) => ValueOrPromise; +``` + +For example, a simple logging middleware can be created and registered as +follows. + +{% include code-caption.html content="src/middleware/log.middleware.ts" %} + +```ts +const log: Middleware = async (middlewareCtx, next) => { + const {request} = middlewareCtx; + console.log('Request: %s %s', request.method, request.originalUrl); + try { + // Proceed with next middleware + await next(); + // Process response + console.log( + 'Response received for %s %s', + request.method, + request.originalUrl, + ); + } catch (err) { + // Catch errors from downstream middleware + console.error( + 'Error received for %s %s', + request.method, + request.originalUrl, + ); + throw err; + } +}; + +app.middleware(log); +``` + +### Why not use Express middleware as-is? + +You may wonder why we don't expose Express middleware directly. There are some +gaps in Express middleware that we would like to close to better align with +LoopBack's architecture. + +1. Express middleware are one-way handlers that mostly process requests and + there is no first-class facility to handle responses. We would love to + support + [Koa style middleware](https://github.com/koajs/koa/blob/master/docs/guide.md#writing-middleware) + that use `async/await` to allow cascading behaviors. +2. Express middleware are added by the order of `app.use()` and it's hard to + contribute middleware from other modules. +3. Express does not allow dependency injection. We would like to enable + injection of middleware configurations. + +To harvest the best of breeds of both frameworks, we build the integration on +top of the [interceptor](Interceptors.md) with community input as illustrated in +the diagram below: + +![middleware](imgs/middleware.png) + +In the diagram, a specialized type of interceptors is introduced as `Middleware` +for LoopBack. Our middleware is basically a function with the signature: + +```ts +(context: MiddlewareContext, next: Next) => ValueOrPromise; +``` + +LoopBack organizes middleware into one or more extension points exposed by +`InvokeMiddleware` providers. Middleware are registered as extensions. Within +the sequence, when `invokeMiddleware` is executed, a chain is formed with +discovered middleware, which are then invoked in a cascading fashion. + +Please note that `Middleware` and related concepts are inherited from +interceptors. + +![middleware-classes](imgs/middleware-classes.png) + +### Introduce middleware to REST sequence of actions + +There are a few actions involved in the default sequence. See `Sequence.md` for +more details. + +It's often desirable to reuse Express middleware in the sequence to handle API +requests/responses without reinventing the wheel. We now add an +`InvokeMiddleware` action as the first step in the default sequence. The action +itself is an interceptor chain of `MiddlewareContext`. It uses the powerful +[extension point/extension pattern](Extension-point-and-extensions.md) to +discover registered Express middleware and invoke them as a chain. + +#### Default sequence + +The generated `src/sequence.ts` now has a new `middleware` property in +`DefaultSequence` to allow injection of the middleware chain while maintaining +backward compatibility of the constructor. + +{% include code-caption.html content="src/sequence.ts" %} + +```ts +export class DefaultSequence implements SequenceHandler { + /** + * Optional middleware chain + * Invokes registered middleware (injected via SequenceActions.MIDDLEWARE). + */ + @inject(SequenceActions.MIDDLEWARE, {optional: true}) + protected invokeMiddleware: InvokeMiddleware = () => false; + + // ... + async handle(context: RequestContext): Promise { + try { + const {request, response} = context; + const finished = await this.invokeMiddleware(context); + if (finished) return; + const route = this.findRoute(request); + const args = await this.parseParams(request, route); + const result = await this.invoke(route, args); + + debug('%s result -', route.describe(), result); + this.send(response, result); + } catch (error) { + this.reject(context, error); + } + } +} +``` + +#### Extend sequence with more than one middleware actions + +Sometimes we want to add middleware to the sequence in between other actions, +for example, do some post-processing before the result is written to the HTTP +response. This can be achieved by overriding the sequence implementation to call +`invokeMiddleware` as needed. + +{% include code-caption.html content="src/sequence.ts" %} + +```ts +export class SequenceWithMiddleware extends DefaultSequence { + async handle(context: RequestContext): Promise { + try { + const {request, response} = context; + // The default middleware chain + let finished = await this.invokeMiddleware(context); + if (finished) return; + const route = this.findRoute(request); + const args = await this.parseParams(request, route); + const result = await this.invoke(route, args); + + // The result from the invocation can be bound to the request context + // so that downstream middleware can receive the value via dependency + // injection or context lookup + context.bind('invocation.result').to(result); + + // The second middleware chain for post-invocation processing + // POST_INVOCATION_MIDDLEWARE is the name of the extension point + // for post-invocation middleware + finished = await this.invokeMiddleware(context, { + extensionPoint: POST_INVOCATION_MIDDLEWARE, + }); + if (finished) return; + this.send(response, result); + } catch (error) { + this.reject(context, error); + } + } +} +``` + +It's also possible to inject multiple instances of `InvokeMiddleware`, each of +which has its own extension point name. + +{% include code-caption.html content="src/sequence.ts" %} + +```ts +export class SequenceWithMiddleware extends DefaultSequence { + /** + * Optional middleware chain + * Invokes registered middleware (injected via SequenceActions.MIDDLEWARE). + */ + @inject('middleware.postInvoke', {optional: true}) + protected middlewarePostInvoke: InvokeMiddleware = () => {}; + + async handle(context: RequestContext): Promise { + try { + const {request, response} = context; + // The default middleware chain + await this.invokeMiddleware(context); + const route = this.findRoute(request); + const args = await this.parseParams(request, route); + const result = await this.invoke(route, args); + + // The second middleware chain for post-invocation processing + await this.middlewarePostInvoke(context); + this.send(response, result); + } catch (error) { + this.reject(context, error); + } + } +} +``` + +Now we can set up applications to leverage the new sequence: + +{% include code-caption.html content="src/application.ts" %} + +```ts +export class MyApplication extends RestApplication { + constructor(config: ApplicationConfig) { + // Create another middleware phase. This is NOT needed if we call the same + // `invokeMiddleware()` with different extension point (chain) names. + this.bind('middleware.postInvoke') + .toProvider(InvokeMiddlewareProvider) + .tag({[CoreTags.EXTENSION_POINT]: POST_INVOCATION_MIDDLEWARE}); + this.sequence(SequenceWithMiddleware); + + // Register a middleware + // `spy` is the factory function of a middleware + // + const spyBinding = this.expressMiddleware( + spy, + undefined, // configuration will be needed here as we bind it to the context + { + key: 'middleware.spy', + extensionPointName: POST_INVOCATION_MIDDLEWARE, + }, + ) + // Set the scope to be `TRANSIENT` so that the new config can be loaded + .inScope(BindingScope.TRANSIENT); + + this.configure(spyBinding.key).to({action: 'log'}); + } +} +``` + +### Register middleware to be executed by `InvokeMiddleware` actions + +To use existing Express middleware, please check out +[Using Express Middleware](./Express-middleware.md). + +{% include code-caption.html content="src/application.ts" %} + +```ts +import {ApplicationConfig} from '@loopback/core'; +import {RestApplication} from '@loopback/rest'; +import {log} from './middleware/log.middleware'; + +export class MyApplication extends RestApplication { + constructor(config: ApplicationConfig) { + this.middleware(log); + } +} +``` + +Middleware can also be contributed using components. + +```ts +import morgan from 'morgan'; +import {Component} from '@loopback/core'; +import { + createMiddlewareBinding, + defineInterceptorProvider, +} from '@loopback/express'; + +const binding = createMiddlewareBinding(defineInterceptorProvider(morgan)); +class MyComponent implements Component { + bindings = [binding]; +} +app.configure(binding.key).to({}); +app.component(MyComponent); +``` diff --git a/docs/site/express-with-lb4-rest-tutorial.md b/docs/site/express-with-lb4-rest-tutorial.md index c98bde0cece2..3359053c89f9 100644 --- a/docs/site/express-with-lb4-rest-tutorial.md +++ b/docs/site/express-with-lb4-rest-tutorial.md @@ -9,14 +9,15 @@ summary: A simple Express application with LoopBack 4 REST API ## Overview -[Express](https://expressjs.com) is an unopinionated Node.js framework. LoopBack -REST API can be mounted to an Express application and be used as middleware. -This way the user can mix and match features from both frameworks to suit their -needs. +[Express](https://expressjs.com) is an un-opinionated Node.js framework. +LoopBack REST API can be mounted to an Express application and be used as +middleware. This way the user can mix and match features from both frameworks to +suit their needs. {% include note.html content=" If you want to use LoopBack as the host instead and mount your Express application on a LoopBack 4 application, see +[Using Express Middleware](Express-middleware.md) and [Mounting an Express Router](Routes.md#mounting-an-express-router). " %} diff --git a/docs/site/imgs/middleware-classes.png b/docs/site/imgs/middleware-classes.png new file mode 100644 index 0000000000000000000000000000000000000000..69de5adfe25bdae62469f6f2423cf400071bc6f8 GIT binary patch literal 232434 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

0QB3Rw;z19Wbk8^${z4dcTb^L=Pc=UkO%TeSjK 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 literal 0 HcmV?d00001 diff --git a/docs/site/imgs/middleware.png b/docs/site/imgs/middleware.png new file mode 100644 index 0000000000000000000000000000000000000000..2d0eee348b8c8af2621ac02c82889f1ff67e2ff2 GIT binary patch literal 229761 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

YXvuFe=+IhV~ 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 literal 0 HcmV?d00001 diff --git a/docs/site/sidebars/lb4_sidebar.yml b/docs/site/sidebars/lb4_sidebar.yml index 5cd3fd1643d2..4b0ff9643260 100644 --- a/docs/site/sidebars/lb4_sidebar.yml +++ b/docs/site/sidebars/lb4_sidebar.yml @@ -103,6 +103,14 @@ children: url: Parsing-requests.html output: 'web, pdf' + - title: 'Middleware' + url: Middleware.html + output: 'web, pdf' + + - title: 'Using Express Middleware' + url: Express-middleware.html + output: 'web, pdf' + - title: 'Decorators' url: Decorators.html output: 'web, pdf' From e8fccccd199e9046c6c7b4ec6e9361f7934cc309 Mon Sep 17 00:00:00 2001 From: Raymond Feng Date: Thu, 16 Apr 2020 11:11:19 -0700 Subject: [PATCH 04/10] feat(cli): add middleware support in sequence.ts template --- .../cli/generators/app/templates/src/sequence.ts.ejs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/cli/generators/app/templates/src/sequence.ts.ejs b/packages/cli/generators/app/templates/src/sequence.ts.ejs index 24339017ff1e..e99e267a51e5 100644 --- a/packages/cli/generators/app/templates/src/sequence.ts.ejs +++ b/packages/cli/generators/app/templates/src/sequence.ts.ejs @@ -2,6 +2,7 @@ import {inject} from '@loopback/context'; import { FindRoute, InvokeMethod, + InvokeMiddleware, ParseParams, Reject, RequestContext, @@ -13,6 +14,13 @@ import { const SequenceActions = RestBindings.SequenceActions; export class MySequence implements SequenceHandler { + /** + * Optional invoker for registered middleware in a chain. + * To be injected via SequenceActions.INVOKE_MIDDLEWARE. + */ + @inject(SequenceActions.INVOKE_MIDDLEWARE, {optional: true}) + protected invokeMiddleware: InvokeMiddleware = () => false; + constructor( @inject(SequenceActions.FIND_ROUTE) protected findRoute: FindRoute, @inject(SequenceActions.PARSE_PARAMS) protected parseParams: ParseParams, @@ -24,6 +32,8 @@ export class MySequence implements SequenceHandler { async handle(context: RequestContext) { try { const {request, response} = context; + const finished = await this.invokeMiddleware(context); + if (finished) return; const route = this.findRoute(request); const args = await this.parseParams(request, route); const result = await this.invoke(route, args); From bebe95460ef071f304a49e534ec78796b3867a74 Mon Sep 17 00:00:00 2001 From: Raymond Feng Date: Mon, 20 Apr 2020 13:48:23 -0700 Subject: [PATCH 05/10] feat(example-todo): add morgan middleware if env var DEBUG is set --- examples/todo/package-lock.json | 143 ++++++++++++++++++ examples/todo/package.json | 2 + .../__tests__/acceptance/todo.acceptance.ts | 18 +++ examples/todo/src/application.ts | 25 +++ examples/todo/src/sequence.ts | 16 +- 5 files changed, 200 insertions(+), 4 deletions(-) diff --git a/examples/todo/package-lock.json b/examples/todo/package-lock.json index c7997617e56d..fa7586354429 100644 --- a/examples/todo/package-lock.json +++ b/examples/todo/package-lock.json @@ -30,18 +30,59 @@ "js-tokens": "^4.0.0" } }, + "@types/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, + "@types/connect": { + "version": "3.4.33", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", + "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", "dev": true }, + "@types/express": { + "version": "4.17.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.6.tgz", + "integrity": "sha512-n/mr9tZI83kd4azlPG5y997C/M4DNABK9yErhFM6hKdym4kkmd9j0vtsJyjFIwfRBxtrxZtAfGZCNRIBMFLK5w==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.5.tgz", + "integrity": "sha512-578YH5Lt88AKoADy0b2jQGwJtrBxezXtVe/MBqWXKZpqx91SnC0pVkVCcxcytz3lWW+cHBYDi3Ysh0WXc+rAYw==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/range-parser": "*" + } + }, "@types/json-schema": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", @@ -54,12 +95,49 @@ "integrity": "sha512-kMNLM5JBcasgYscD9x/Gvr6lTAv2NVgsKtet/hm93qMyf/D1pt+7jeEZklKJKxMVmXjxbRVQQGfqDSfipYCO6w==", "dev": true }, + "@types/mime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", + "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==", + "dev": true + }, + "@types/morgan": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.0.tgz", + "integrity": "sha512-warrzirh5dlTMaETytBTKR886pRXwr+SMZD87ZE13gLMR8Pzz69SiYFkvoDaii78qGP1iyBIUYz5GiXyryO//A==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, "@types/node": { "version": "10.17.21", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.21.tgz", "integrity": "sha512-PQKsydPxYxF1DsAFWmunaxd3sOi3iMt6Zmx/tgaagHYmwJ/9cRH91hQkeJZaUGWbvn0K5HlSVEXkn5U/llWPpQ==", "dev": true }, + "@types/qs": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.1.tgz", + "integrity": "sha512-lhbQXx9HKZAPgBkISrBcmAcMpZsmpe/Cd/hY7LGZS5OfkySUBItnPZHgQPssWYUET8elF+yCFBbP1Q0RZPTdaw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", + "dev": true + }, + "@types/serve-static": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz", + "integrity": "sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/mime": "*" + } + }, "@typescript-eslint/eslint-plugin": { "version": "2.30.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.30.0.tgz", @@ -265,6 +343,21 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, "bcp47": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/bcp47/-/bcp47-1.1.2.tgz", @@ -417,6 +510,11 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -435,6 +533,11 @@ "safer-buffer": "^2.1.0" } }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -1189,6 +1292,33 @@ "minimist": "^1.2.5" } }, + "morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "requires": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -1224,6 +1354,19 @@ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", diff --git a/examples/todo/package.json b/examples/todo/package.json index 5b14566d0b92..44bbfb7f92bb 100644 --- a/examples/todo/package.json +++ b/examples/todo/package.json @@ -45,6 +45,7 @@ "@loopback/rest-explorer": "^2.1.2", "@loopback/service-proxy": "^2.1.2", "loopback-connector-rest": "^3.6.0", + "morgan": "^1.10.0", "tslib": "^1.11.1" }, "devDependencies": { @@ -56,6 +57,7 @@ "@types/node": "^10.17.21", "@typescript-eslint/eslint-plugin": "^2.30.0", "@typescript-eslint/parser": "^2.30.0", + "@types/morgan": "^1.9.0", "eslint": "^6.8.0", "eslint-config-prettier": "^6.11.0", "eslint-plugin-eslint-plugin": "^2.2.1", diff --git a/examples/todo/src/__tests__/acceptance/todo.acceptance.ts b/examples/todo/src/__tests__/acceptance/todo.acceptance.ts index 9c75e5dd6db4..d95fe1bc7a1a 100644 --- a/examples/todo/src/__tests__/acceptance/todo.acceptance.ts +++ b/examples/todo/src/__tests__/acceptance/todo.acceptance.ts @@ -11,6 +11,7 @@ import { givenHttpServerConfig, toJSON, } from '@loopback/testlab'; +import morgan from 'morgan'; import {TodoListApplication} from '../../application'; import {Todo} from '../../models/'; import {TodoRepository} from '../../repositories/'; @@ -184,6 +185,23 @@ describe('TodoApplication', () => { }); }); + context('allows logging to be reconfigured', () => { + it('logs http requests', async () => { + const logs: string[] = []; + const logToArray = (str: string) => { + logs.push(str); + }; + app.configure('middleware.morgan').to({ + stream: { + write: logToArray, + }, + }); + await client.get('/todos'); + expect(logs.length).to.eql(1); + expect(logs[0]).to.match(/"GET \/todos HTTP\/1\.1" 200 - "-"/); + }); + }); + it('queries todos with a filter', async () => { await givenTodoInstance({title: 'wake up', isComplete: true}); diff --git a/examples/todo/src/application.ts b/examples/todo/src/application.ts index 2290f971ce7a..3aa0d56016ca 100644 --- a/examples/todo/src/application.ts +++ b/examples/todo/src/application.ts @@ -9,6 +9,7 @@ import {RepositoryMixin} from '@loopback/repository'; import {RestApplication} from '@loopback/rest'; import {RestExplorerComponent} from '@loopback/rest-explorer'; import {ServiceMixin} from '@loopback/service-proxy'; +import morgan from 'morgan'; import path from 'path'; import {MySequence} from './sequence'; @@ -36,5 +37,29 @@ export class TodoListApplication extends BootMixin( nested: true, }, }; + + this.setupLogging(); + } + + private setupLogging() { + // Register `morgan` express middleware + // Create a middleware factory wrapper for `morgan(format, options)` + const morganFactory = (config?: morgan.Options) => { + this.debug('Morgan configuration', config); + return morgan('combined', config); + }; + + // Print out logs using `debug` + const defaultConfig: morgan.Options = { + stream: { + write: str => { + this._debug(str); + }, + }, + }; + this.expressMiddleware(morganFactory, defaultConfig, { + injectConfiguration: true, + key: 'middleware.morgan', + }); } } diff --git a/examples/todo/src/sequence.ts b/examples/todo/src/sequence.ts index 2cf45180d379..db85cb4d7d17 100644 --- a/examples/todo/src/sequence.ts +++ b/examples/todo/src/sequence.ts @@ -3,10 +3,11 @@ // This file is licensed under the MIT License. // License text available at https://opensource.org/licenses/MIT -import {Context, inject} from '@loopback/context'; +import {inject} from '@loopback/context'; import { FindRoute, InvokeMethod, + InvokeMiddleware, ParseParams, Reject, RequestContext, @@ -18,8 +19,14 @@ import { const SequenceActions = RestBindings.SequenceActions; export class MySequence implements SequenceHandler { + /** + * Optional invoker for registered middleware in a chain. + * To be injected via SequenceActions.INVOKE_MIDDLEWARE. + */ + @inject(SequenceActions.INVOKE_MIDDLEWARE, {optional: true}) + protected invokeMiddleware: InvokeMiddleware = () => false; + constructor( - @inject(RestBindings.Http.CONTEXT) public ctx: Context, @inject(SequenceActions.FIND_ROUTE) protected findRoute: FindRoute, @inject(SequenceActions.PARSE_PARAMS) protected parseParams: ParseParams, @inject(SequenceActions.INVOKE_METHOD) protected invoke: InvokeMethod, @@ -30,12 +37,13 @@ export class MySequence implements SequenceHandler { async handle(context: RequestContext) { try { const {request, response} = context; + await this.invokeMiddleware(context); const route = this.findRoute(request); const args = await this.parseParams(request, route); const result = await this.invoke(route, args); this.send(response, result); - } catch (error) { - this.reject(context, error); + } catch (err) { + this.reject(context, err); } } } From ca469e012caadbc02dbbf6b0b8e551b229eebd31 Mon Sep 17 00:00:00 2001 From: Raymond Feng Date: Wed, 29 Apr 2020 22:42:20 -0700 Subject: [PATCH 06/10] feat(express): allows dynamic configuration changes for Express middleware --- docs/site/Express-middleware.md | 2 +- examples/todo/src/application.ts | 2 +- .../middleware-interceptor.acceptance.ts | 43 ++++++- .../src/__tests__/acceptance/test-helpers.ts | 2 +- .../express/src/middleware-interceptor.ts | 121 +++++++++++++++--- packages/express/src/middleware.ts | 2 +- packages/express/src/types.ts | 5 +- 7 files changed, 149 insertions(+), 28 deletions(-) diff --git a/docs/site/Express-middleware.md b/docs/site/Express-middleware.md index 378463901dc4..939d975a2224 100644 --- a/docs/site/Express-middleware.md +++ b/docs/site/Express-middleware.md @@ -135,7 +135,7 @@ export class MyApplication extends RestApplication { { // Allow configuration to be injected to allow dynamic changes to // morgan logging by configuring `middleware.morgan` to a new value - injectConfiguration: true, + injectConfiguration: 'watch', key: 'middleware.morgan', }, ); diff --git a/examples/todo/src/application.ts b/examples/todo/src/application.ts index 3aa0d56016ca..eb883fc2246e 100644 --- a/examples/todo/src/application.ts +++ b/examples/todo/src/application.ts @@ -58,7 +58,7 @@ export class TodoListApplication extends BootMixin( }, }; this.expressMiddleware(morganFactory, defaultConfig, { - injectConfiguration: true, + injectConfiguration: 'watch', key: 'middleware.morgan', }); } diff --git a/packages/express/src/__tests__/acceptance/middleware-interceptor.acceptance.ts b/packages/express/src/__tests__/acceptance/middleware-interceptor.acceptance.ts index 2c26743f022a..8c1a92a3c021 100644 --- a/packages/express/src/__tests__/acceptance/middleware-interceptor.acceptance.ts +++ b/packages/express/src/__tests__/acceptance/middleware-interceptor.acceptance.ts @@ -7,6 +7,7 @@ import { config, Constructor, Context, + ContextView, createBindingFromClass, Interceptor, Provider, @@ -59,11 +60,9 @@ describe('Middleware interceptor', () => { }); it('defines a middleware interceptor provider class with name', () => { - const cls = defineInterceptorProvider( - spy, - undefined, - 'SpyMiddlewareInterceptorProvider', - ); + const cls = defineInterceptorProvider(spy, undefined, { + providerClassName: 'SpyMiddlewareInterceptorProvider', + }); expect(cls.name).to.eql('SpyMiddlewareInterceptorProvider'); assertProviderClass(cls); }); @@ -77,6 +76,30 @@ describe('Middleware interceptor', () => { } }); + context('defineInterceptorProvider with watch', () => { + let spyConfig: SpyConfig; + before(() => { + spyConfig = { + action: 'log', + }; + helper = new TestHelper(); + }); + before(givenTestApp); + after(() => helper?.stop()); + + it('reloads config changes', async () => { + const providerClass = defineInterceptorProvider(spy, spyConfig, { + injectConfiguration: 'watch', + }); + const binding = createMiddlewareInterceptorBinding(providerClass); + helper.app.add(binding); + await testLocalSpyLog(binding.key); + + helper.app.configure(binding.key).to({action: 'mock'}); + await testLocalSpyMock(binding.key); + }); + }); + function runTests(action: SpyAction, testFn: TestFunction) { describe(`registerMiddleware - ${action}`, () => { const spyConfig: SpyConfig = {action}; @@ -145,8 +168,8 @@ describe('Middleware interceptor', () => { class SpyInterceptorProvider extends ExpressMiddlewareInterceptorProvider< SpyConfig > { - constructor(@config() _spyConfig?: SpyConfig) { - super(spy, _spyConfig); + constructor(@config.view() configView?: ContextView) { + super(spy, configView); } } const binding = createMiddlewareInterceptorBinding( @@ -173,4 +196,10 @@ describe('Middleware interceptor', () => { await helper.assertSpyLog(); } + + async function testLocalSpyMock(interceptor: InterceptorOrKey) { + helper.bindController(interceptor); + + await helper.assertSpyMock(); + } }); diff --git a/packages/express/src/__tests__/acceptance/test-helpers.ts b/packages/express/src/__tests__/acceptance/test-helpers.ts index 466f181c4b9c..27b082f67c92 100644 --- a/packages/express/src/__tests__/acceptance/test-helpers.ts +++ b/packages/express/src/__tests__/acceptance/test-helpers.ts @@ -81,7 +81,7 @@ export class TestHelper { spyBinding: Binding, action: SpyAction = 'log', ) { - this.app.expressServer.configure(spyBinding.key).to({action}); + this.app.configure(spyBinding.key).to({action}); } async testSpyLog(spyBinding: Binding) { diff --git a/packages/express/src/middleware-interceptor.ts b/packages/express/src/middleware-interceptor.ts index 7306eecb9350..438bc0f77204 100644 --- a/packages/express/src/middleware-interceptor.ts +++ b/packages/express/src/middleware-interceptor.ts @@ -5,16 +5,20 @@ import { asGlobalInterceptor, + Binding, BindingKey, BindingScope, config, Constructor, Context, ContextTags, + ContextView, createBindingFromClass, GenericInterceptor, + inject, Interceptor, InvocationContext, + NamespacedReflect, Provider, } from '@loopback/core'; import assert from 'assert'; @@ -26,6 +30,7 @@ import { ExpressMiddlewareFactory, ExpressRequestHandler, MiddlewareContext, + MiddlewareCreationOptions, MiddlewareInterceptorBindingOptions, Request, Response, @@ -125,7 +130,10 @@ export function createInterceptor( * Base class for MiddlewareInterceptor provider classes * * @example - * ``` + * + * To inject the configuration without automatic reloading: + * + * ```ts * class SpyInterceptorProvider extends ExpressMiddlewareInterceptorProvider< * SpyConfig * > { @@ -135,17 +143,92 @@ export function createInterceptor( * } * ``` * + * To inject the configuration without automatic reloading: + * ```ts + * class SpyInterceptorProvider extends ExpressMiddlewareInterceptorProvider< + * SpyConfig + * > { + * constructor(@config.view() configView?: ContextView) { + * super(spy, configView); + * } + * } + * ``` + * * @typeParam CFG - Configuration type */ -export abstract class ExpressMiddlewareInterceptorProvider - implements Provider { +export abstract class ExpressMiddlewareInterceptorProvider< + CFG, + CTX extends Context = InvocationContext +> implements Provider> { + protected middlewareConfigView?: ContextView; + protected middlewareConfig?: CFG; + constructor( protected middlewareFactory: ExpressMiddlewareFactory, - protected middlewareConfig?: CFG, - ) {} + middlewareConfig?: CFG | ContextView, + ) { + if (middlewareConfig != null && middlewareConfig instanceof ContextView) { + this.middlewareConfigView = middlewareConfig; + } else { + this.middlewareConfig = middlewareConfig; + } + this.setupConfigView(); + } - value() { - return createInterceptor(this.middlewareFactory, this.middlewareConfig); + // Inject current binding for debugging + @inject.binding() + private binding?: Binding>; + + /** + * Cached interceptor instance. It has three states: + * + * - undefined: Not initialized + * - null: To be recreated as the configuration is changed + * - function: The interceptor function created from the latest configuration + */ + private interceptor?: GenericInterceptor | null; + + private setupConfigView() { + if (this.middlewareConfigView) { + // Set up a listener to reset the cached interceptor function for the + // first time + this.middlewareConfigView.on('refresh', () => { + if (this.binding != null) { + debug( + 'Configuration change is detected for binding %s.' + + ' The Express middleware handler function will be recreated.', + this.binding.key, + ); + } + this.interceptor = null; + }); + } + } + + value(): GenericInterceptor { + return async (ctx, next) => { + // Get the latest configuration + if (this.middlewareConfigView != null) { + this.middlewareConfig = + (await this.middlewareConfigView.singleValue()) ?? + this.middlewareConfig; + } + + if (this.interceptor == null) { + // Create a new interceptor for the first time or recreate it if it + // was reset to `null` when its configuration changed + debug( + 'Creating interceptor for %s with config', + this.middlewareFactory.name, + this.middlewareConfig, + ); + this.interceptor = createInterceptor( + this.middlewareFactory, + this.middlewareConfig, + ); + } + return this.interceptor(ctx, next); + }; } } @@ -164,8 +247,9 @@ export function defineInterceptorProvider< >( middlewareFactory: ExpressMiddlewareFactory, defaultMiddlewareConfig?: CFG, - className?: string, + options?: MiddlewareCreationOptions, ): Constructor>> { + let className = options?.providerClassName; className = buildName(middlewareFactory, className); assert(className, 'className is missing and it cannot be inferred.'); @@ -178,11 +262,11 @@ export function defineInterceptorProvider< constructor(middlewareConfig) { super( middlewareFactory, - middlewareConfig != null ? middlewareConfig: defaultMiddlewareConfig, + middlewareConfig, ); - } - value() { - return createInterceptor(this.middlewareFactory, this.middlewareConfig); + if (this.middlewareConfig == null) { + this.middlewareConfig = defaultMiddlewareConfig; + } } };`, ); @@ -193,7 +277,14 @@ export function defineInterceptorProvider< ExpressMiddlewareInterceptorProvider, createInterceptor, ); - config()(cls, '', 0); + if (options?.injectConfiguration === 'watch') { + // Inject the config view + config.view()(cls, '', 0); + new NamespacedReflect().metadata('design:paramtypes', [ContextView])(cls); + } else { + // Inject the config + config()(cls, '', 0); + } return cls; } @@ -260,7 +351,7 @@ export function registerExpressMiddlewareInterceptor( const providerClass = defineInterceptorProvider( middlewareFactory, middlewareConfig, - options.providerClassName, + options, ); const binding = createMiddlewareInterceptorBinding( providerClass, @@ -288,7 +379,7 @@ export function createMiddlewareInterceptorBinding( ...options, }; const binding = createBindingFromClass(middlewareProviderClass, { - defaultScope: BindingScope.TRANSIENT, + defaultScope: BindingScope.SINGLETON, namespace: 'interceptors', }); if (options.global) { diff --git a/packages/express/src/middleware.ts b/packages/express/src/middleware.ts index 8a803ccb409b..2e395d2911c5 100644 --- a/packages/express/src/middleware.ts +++ b/packages/express/src/middleware.ts @@ -111,7 +111,7 @@ export function registerExpressMiddleware( const providerClass = defineInterceptorProvider( middlewareFactory, middlewareConfig, - options.providerClassName, + options, ); return registerMiddleware(ctx, providerClass, options); } diff --git a/packages/express/src/types.ts b/packages/express/src/types.ts index 27eca91fc4e0..c702b73ccc77 100644 --- a/packages/express/src/types.ts +++ b/packages/express/src/types.ts @@ -177,9 +177,10 @@ export interface MiddlewareCreationOptions { * lazily. * * - `true` (default): creates a provider class with `@config` - * - `false`: creates a dynamic value that creates the middleware + * - `false`: No configuration injection is supported + * - 'watch': creates a provider class with `@config.view` */ - injectConfiguration?: boolean; + injectConfiguration?: boolean | 'watch'; /** * Class name for the created provider class. It's only used if * `injectConfiguration` is not set to `false`. From 25392584f94b154a8b75d369f0ee398d0359c747 Mon Sep 17 00:00:00 2001 From: Raymond Feng Date: Thu, 30 Apr 2020 21:01:58 -0700 Subject: [PATCH 07/10] feat(express): allow `toInterceptor` to take one or more Express middleware handlers --- .../middleware-interceptor.acceptance.ts | 17 +++++++++ .../express/src/middleware-interceptor.ts | 38 ++++++++++++++++++- packages/express/src/middleware-registry.ts | 19 ++++------ packages/express/src/middleware.ts | 24 ++++++++++-- 4 files changed, 80 insertions(+), 18 deletions(-) diff --git a/packages/express/src/__tests__/acceptance/middleware-interceptor.acceptance.ts b/packages/express/src/__tests__/acceptance/middleware-interceptor.acceptance.ts index 8c1a92a3c021..fa823c76d454 100644 --- a/packages/express/src/__tests__/acceptance/middleware-interceptor.acceptance.ts +++ b/packages/express/src/__tests__/acceptance/middleware-interceptor.acceptance.ts @@ -46,6 +46,23 @@ describe('Middleware interceptor', () => { await testLocalSpyLog(interceptor); }); + it('wraps multiple middleware handlers to interceptor', async () => { + const log = spy({action: 'log'}); + const mock = spy({action: 'mock'}); + + // Chain two Express middleware into one interceptor + const interceptor = toInterceptor(log, mock); + helper.bindController(interceptor); + + await helper.client + .post('/hello') + .send('"World"') + .set('content-type', 'application/json') + .expect(200, 'Hello, Spy') + .expect('x-spy-log', 'POST /hello') + .expect('x-spy-mock', 'POST /hello'); + }); + it('wraps a middleware factory to interceptor', async () => { const interceptor = createInterceptor(spy, spyConfig); await testLocalSpyLog(interceptor); diff --git a/packages/express/src/middleware-interceptor.ts b/packages/express/src/middleware-interceptor.ts index 438bc0f77204..62796d3a13ab 100644 --- a/packages/express/src/middleware-interceptor.ts +++ b/packages/express/src/middleware-interceptor.ts @@ -15,11 +15,13 @@ import { ContextView, createBindingFromClass, GenericInterceptor, + GenericInterceptorChain, inject, Interceptor, InvocationContext, NamespacedReflect, Provider, + transformValueOrPromise, } from '@loopback/core'; import assert from 'assert'; import debugFactory from 'debug'; @@ -78,13 +80,45 @@ export function executeExpressRequestHandler( /** * Wrap an express middleware handler function as an interceptor - * @param handlerFn - Express middleware handler function + * + * @example + * ```ts + * toInterceptor(fn); + * toInterceptor(fn1, fn2, fn3); + * ``` + * @param firstHandler - An Express middleware handler + * @param additionalHandlers - A list of Express middleware handler function * * @typeParam CTX - Context type */ export function toInterceptor( - handlerFn: ExpressRequestHandler, + firstHandler: ExpressRequestHandler, + ...additionalHandlers: ExpressRequestHandler[] ): GenericInterceptor { + if (additionalHandlers.length === 0) { + const handlerFn = firstHandler; + return toInterceptorFromExpressMiddleware(handlerFn); + } + const handlers = [firstHandler, ...additionalHandlers]; + const interceptorList = handlers.map(handler => toInterceptor(handler)); + return async (invocationCtx, next) => { + const middlewareCtx = await invocationCtx.get( + MiddlewareBindings.CONTEXT, + ); + const middlewareChain = new GenericInterceptorChain( + invocationCtx, + interceptorList, + ); + const result = middlewareChain.invokeInterceptors(); + return transformValueOrPromise(result, val => + val === middlewareCtx.response ? val : next(), + ); + }; +} + +function toInterceptorFromExpressMiddleware< + CTX extends Context = InvocationContext +>(handlerFn: ExpressRequestHandler): GenericInterceptor { return async (context, next) => { const middlewareCtx = await context.get( MiddlewareBindings.CONTEXT, diff --git a/packages/express/src/middleware-registry.ts b/packages/express/src/middleware-registry.ts index c68e5b71de40..6fb252784918 100644 --- a/packages/express/src/middleware-registry.ts +++ b/packages/express/src/middleware-registry.ts @@ -95,23 +95,18 @@ export abstract class MiddlewareRegistry extends Context { const handlers = Array.isArray(configOrHandlers) ? configOrHandlers : [configOrHandlers as ExpressRequestHandler]; + // Create middleware that wraps all Express handlers if (handlers.length === 0) { throw new Error('No Express middleware handler function is provided.'); } - if (handlers.length > 1) { - // Create middleware that wraps all Express handlers - return registerMiddleware(this, toMiddleware(...handlers), { - ...options, - key, - }); - } else { - // Use the single Express middleware handler - return registerExpressMiddleware(this, () => handlers[0], undefined, { + return registerMiddleware( + this, + toMiddleware(handlers[0], ...handlers.slice(1)), + { ...options, key, - injectConfiguration: false, - }); - } + }, + ); } else { return registerExpressMiddleware( this, diff --git a/packages/express/src/middleware.ts b/packages/express/src/middleware.ts index 2e395d2911c5..8f2a7c3c28f2 100644 --- a/packages/express/src/middleware.ts +++ b/packages/express/src/middleware.ts @@ -43,16 +43,29 @@ const debug = debugFactory('loopback:middleware'); /** * An adapter function to create a LoopBack middleware that invokes the list * of Express middleware handler functions in the order of their positions - * - * @param handlers A list of Express middleware handler functions + * @example + * ```ts + * toMiddleware(fn); + * toMiddleware(fn1, fn2, fn3); + * ``` + * @param firstHandler - An Express middleware handler + * @param additionalHandlers A list of Express middleware handler functions * @returns A LoopBack middleware function that wraps the list of Express * middleware */ -export function toMiddleware(...handlers: ExpressRequestHandler[]): Middleware { +export function toMiddleware( + firstHandler: ExpressRequestHandler, + ...additionalHandlers: ExpressRequestHandler[] +): Middleware { + if (additionalHandlers.length === 0) return toInterceptor(firstHandler); + const handlers = [firstHandler, ...additionalHandlers]; const middlewareList = handlers.map(handler => toInterceptor(handler), ); return (middlewareCtx, next) => { + if (middlewareList.length === 1) { + return middlewareList[0](middlewareCtx, next); + } const middlewareChain = new MiddlewareChain(middlewareCtx, middlewareList); const result = middlewareChain.invokeInterceptors(); return transformValueOrPromise(result, val => @@ -244,7 +257,10 @@ export function invokeExpressMiddleware( middlewareCtx: MiddlewareContext, ...handlers: ExpressRequestHandler[] ): ValueOrPromise { - const middleware = toMiddleware(...handlers); + if (handlers.length === 0) { + throw new Error('No Express middleware handler function is provided.'); + } + const middleware = toMiddleware(handlers[0], ...handlers.slice(1)); debug( 'Invoke Express middleware for %s %s', middlewareCtx.request.method, From ac5efccd66931ed631f7aefc932edae41aeda6f3 Mon Sep 17 00:00:00 2001 From: Raymond Feng Date: Thu, 30 Apr 2020 22:27:33 -0700 Subject: [PATCH 08/10] feat(express): add MiddlewareMixin --- packages/express/src/express.server.ts | 4 +- packages/express/src/index.ts | 1 + packages/express/src/middleware-registry.ts | 70 ++------ .../express/src/mixins/middleware.mixin.ts | 162 ++++++++++++++++++ packages/rest/src/rest.server.ts | 4 +- 5 files changed, 178 insertions(+), 63 deletions(-) create mode 100644 packages/express/src/mixins/middleware.mixin.ts diff --git a/packages/express/src/express.server.ts b/packages/express/src/express.server.ts index 9e5f315d5be0..881e31a9723e 100644 --- a/packages/express/src/express.server.ts +++ b/packages/express/src/express.server.ts @@ -8,7 +8,7 @@ import {HttpServer, HttpServerOptions} from '@loopback/http-server'; import debugFactory from 'debug'; import express from 'express'; import {toExpressMiddleware} from './middleware'; -import {MiddlewareRegistry} from './middleware-registry'; +import {BaseMiddlewareRegistry} from './middleware-registry'; import {MiddlewareContext, MIDDLEWARE_CONTEXT, Request} from './types'; const debug = debugFactory('loopback:middleware'); @@ -30,7 +30,7 @@ export type ExpressServerConfig = HttpServerOptions & { /** * An Express server that provides middleware composition and injection */ -export class ExpressServer extends MiddlewareRegistry implements Server { +export class ExpressServer extends BaseMiddlewareRegistry implements Server { /** * Base path to mount middleware */ diff --git a/packages/express/src/index.ts b/packages/express/src/index.ts index b6042224cf32..ec933fcbb9bd 100644 --- a/packages/express/src/index.ts +++ b/packages/express/src/index.ts @@ -29,5 +29,6 @@ export * from './keys'; export * from './middleware'; export * from './middleware-interceptor'; export * from './middleware-registry'; +export * from './mixins/middleware.mixin'; export * from './providers/invoke-middleware.provider'; export * from './types'; diff --git a/packages/express/src/middleware-registry.ts b/packages/express/src/middleware-registry.ts index 6fb252784918..db10fb5607bb 100644 --- a/packages/express/src/middleware-registry.ts +++ b/packages/express/src/middleware-registry.ts @@ -8,14 +8,9 @@ import { BindingAddress, Constructor, Context, - isBindingAddress, Provider, } from '@loopback/core'; -import { - registerExpressMiddleware, - registerMiddleware, - toMiddleware, -} from './middleware'; +import {MiddlewareMixin} from './mixins/middleware.mixin'; import { ExpressMiddlewareFactory, ExpressRequestHandler, @@ -24,9 +19,9 @@ import { } from './types'; /** - * Base Context that provides APIs to register middleware + * A context that allows middleware registration */ -export abstract class MiddlewareRegistry extends Context { +export interface MiddlewareRegistry { /** * Bind an Express middleware to this server context * @@ -70,53 +65,6 @@ export abstract class MiddlewareRegistry extends Context { options?: MiddlewareBindingOptions, ): Binding; - /** - * @internal - * - * This signature is only used by RestApplication for delegation - */ - expressMiddleware( - factoryOrKey: ExpressMiddlewareFactory | BindingAddress, - configOrHandler: CFG | ExpressRequestHandler | ExpressRequestHandler[], - options?: MiddlewareBindingOptions, - ): Binding; - - /** - * @internal - * Implementation of `expressMiddleware` - */ - expressMiddleware( - factoryOrKey: ExpressMiddlewareFactory | BindingAddress, - configOrHandlers: CFG | ExpressRequestHandler | ExpressRequestHandler[], - options: MiddlewareBindingOptions = {}, - ): Binding { - const key = factoryOrKey as BindingAddress; - if (isBindingAddress(key)) { - const handlers = Array.isArray(configOrHandlers) - ? configOrHandlers - : [configOrHandlers as ExpressRequestHandler]; - // Create middleware that wraps all Express handlers - if (handlers.length === 0) { - throw new Error('No Express middleware handler function is provided.'); - } - return registerMiddleware( - this, - toMiddleware(handlers[0], ...handlers.slice(1)), - { - ...options, - key, - }, - ); - } else { - return registerExpressMiddleware( - this, - factoryOrKey as ExpressMiddlewareFactory, - configOrHandlers as CFG, - options, - ); - } - } - /** * Register a middleware function or provider class * @@ -133,8 +81,12 @@ export abstract class MiddlewareRegistry extends Context { */ middleware( middleware: Middleware | Constructor>, - options: MiddlewareBindingOptions = {}, - ): Binding { - return registerMiddleware(this, middleware, options); - } + options?: MiddlewareBindingOptions, + ): Binding; } + +/** + * Base Context that provides APIs to register middleware + */ +export abstract class BaseMiddlewareRegistry extends MiddlewareMixin(Context) + implements MiddlewareRegistry {} diff --git a/packages/express/src/mixins/middleware.mixin.ts b/packages/express/src/mixins/middleware.mixin.ts new file mode 100644 index 000000000000..85544d16a18c --- /dev/null +++ b/packages/express/src/mixins/middleware.mixin.ts @@ -0,0 +1,162 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/express +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import { + Binding, + BindingAddress, + Constructor, + Context, + isBindingAddress, + Provider, +} from '@loopback/core'; +import { + registerExpressMiddleware, + registerMiddleware, + toMiddleware, +} from '../middleware'; +import {MiddlewareRegistry} from '../middleware-registry'; +import { + ExpressMiddlewareFactory, + ExpressRequestHandler, + Middleware, + MiddlewareBindingOptions, +} from '../types'; + +function extendsFrom( + subClass: Constructor, + baseClass: Constructor, +) { + let cls = subClass; + while (cls) { + if (cls === baseClass) return true; + cls = Object.getPrototypeOf(cls); + } + return false; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function MiddlewareMixin>(superClass: T) { + if (!extendsFrom(superClass, Context)) { + throw new TypeError('The super class does not extend from Context'); + } + return class extends superClass implements MiddlewareRegistry { + /** + * Bind an Express middleware to this server context + * + * @example + * ```ts + * import myExpressMiddlewareFactory from 'my-express-middleware'; + * const myExpressMiddlewareConfig= {}; + * const myExpressMiddleware = myExpressMiddlewareFactory(myExpressMiddlewareConfig); + * server.expressMiddleware('middleware.express.my', myExpressMiddleware); + * // Or + * server.expressMiddleware('middleware.express.my', [myExpressMiddleware]); + * ``` + * @param key - Middleware binding key + * @param middleware - Express middleware handler function(s) + * + */ + expressMiddleware( + key: BindingAddress, + middleware: ExpressRequestHandler | ExpressRequestHandler[], + options?: MiddlewareBindingOptions, + ): Binding; + + /** + * Bind an Express middleware to this server context + * + * @example + * ```ts + * import myExpressMiddlewareFactory from 'my-express-middleware'; + * const myExpressMiddlewareConfig= {}; + * server.expressMiddleware(myExpressMiddlewareFactory, myExpressMiddlewareConfig); + * ``` + * @param middlewareFactory - Middleware module name or factory function + * @param middlewareConfig - Middleware config + * @param options - Options for registration + * + * @typeParam CFG - Configuration type + */ + expressMiddleware( + middlewareFactory: ExpressMiddlewareFactory, + middlewareConfig?: CFG, + options?: MiddlewareBindingOptions, + ): Binding; + + /** + * @internal + * + * This signature is only used by RestApplication for delegation + */ + expressMiddleware( + factoryOrKey: ExpressMiddlewareFactory | BindingAddress, + configOrHandler: CFG | ExpressRequestHandler | ExpressRequestHandler[], + options?: MiddlewareBindingOptions, + ): Binding; + + /** + * @internal + * Implementation of `expressMiddleware` + */ + expressMiddleware( + factoryOrKey: ExpressMiddlewareFactory | BindingAddress, + configOrHandlers: CFG | ExpressRequestHandler | ExpressRequestHandler[], + options: MiddlewareBindingOptions = {}, + ): Binding { + const key = factoryOrKey as BindingAddress; + if (isBindingAddress(key)) { + const handlers = Array.isArray(configOrHandlers) + ? configOrHandlers + : [configOrHandlers as ExpressRequestHandler]; + // Create middleware that wraps all Express handlers + if (handlers.length === 0) { + throw new Error( + 'No Express middleware handler function is provided.', + ); + } + return registerMiddleware( + (this as unknown) as Context, + toMiddleware(handlers[0], ...handlers.slice(1)), + { + ...options, + key, + }, + ); + } else { + return registerExpressMiddleware( + (this as unknown) as Context, + factoryOrKey as ExpressMiddlewareFactory, + configOrHandlers as CFG, + options, + ); + } + } + + /** + * Register a middleware function or provider class + * + * @example + * ```ts + * const log: Middleware = async (requestCtx, next) { + * // ... + * } + * server.middleware(log); + * ``` + * + * @param middleware - Middleware function or provider class + * @param options - Middleware binding options + */ + middleware( + middleware: Middleware | Constructor>, + options: MiddlewareBindingOptions = {}, + ): Binding { + return registerMiddleware( + (this as unknown) as Context, + middleware, + options, + ); + } + }; +} diff --git a/packages/rest/src/rest.server.ts b/packages/rest/src/rest.server.ts index b8412d7fa8e8..5ccc6cd2fa7c 100644 --- a/packages/rest/src/rest.server.ts +++ b/packages/rest/src/rest.server.ts @@ -16,7 +16,7 @@ import { Subscription, } from '@loopback/context'; import {Application, CoreBindings, Server} from '@loopback/core'; -import {ExpressRequestHandler, MiddlewareRegistry} from '@loopback/express'; +import {BaseMiddlewareRegistry, ExpressRequestHandler} from '@loopback/express'; import {HttpServer, HttpServerOptions} from '@loopback/http-server'; import { getControllerSpec, @@ -101,7 +101,7 @@ const SequenceActions = RestBindings.SequenceActions; * const server = await app.get('servers.foo'); * ``` */ -export class RestServer extends MiddlewareRegistry +export class RestServer extends BaseMiddlewareRegistry implements Server, HttpServerLike { /** * Handle incoming HTTP(S) request by invoking the corresponding From 16bce4406859536a4c81a3f4d7b0d8e002f34574 Mon Sep 17 00:00:00 2001 From: DEEPAK RAJAMOHAN Date: Thu, 30 Apr 2020 19:45:28 -0700 Subject: [PATCH 09/10] feat: try mw with passport login example --- examples/passport-login/data/db.json | 8 ++- examples/passport-login/package-lock.json | 21 +++++-- examples/passport-login/package.json | 3 + examples/passport-login/src/application.ts | 8 +++ .../src/authentication-strategies/types.ts | 37 +++++++++++ .../src/controllers/facebook.controller.ts | 62 +++++++++++++++++++ .../passport-login/src/controllers/index.ts | 1 + examples/passport-login/tsconfig.json | 3 + .../web-application/views/pages/login.jade | 2 +- 9 files changed, 137 insertions(+), 8 deletions(-) create mode 100644 examples/passport-login/src/controllers/facebook.controller.ts diff --git a/examples/passport-login/data/db.json b/examples/passport-login/data/db.json index 22fa883bcb82..01dfbc5e7ff2 100644 --- a/examples/passport-login/data/db.json +++ b/examples/passport-login/data/db.json @@ -1,13 +1,17 @@ { "ids": { - "User": 1, - "UserIdentity": 1, + "User": 3, + "UserIdentity": 3463934540288188, "UserCredentials": 1 }, "models": { "User": { + "1": "{\"name\":\"Deepak Rajamohan\",\"username\":\"deepak.r.kris@gmail.com\",\"email\":\"deepak.r.kris@gmail.com\",\"id\":1}", + "2": "{\"name\":\"Open User\",\"username\":\"dplojbdiuc_1585460374@tfbnw.net\",\"email\":\"dplojbdiuc_1585460374@tfbnw.net\",\"id\":2}" }, "UserIdentity": { + "3463934540288186": "{\"id\":\"3463934540288186\",\"provider\":\"facebook\",\"profile\":{\"emails\":[{\"value\":\"deepak.r.kris@gmail.com\"}]},\"authScheme\":\"facebook\",\"created\":\"2020-05-01T02:41:33.452Z\",\"userId\":1}", + "104566694532668": "{\"id\":\"104566694532668\",\"provider\":\"facebook\",\"profile\":{\"emails\":[{\"value\":\"dplojbdiuc_1585460374@tfbnw.net\"}]},\"authScheme\":\"facebook\",\"created\":\"2020-05-01T01:43:23.082Z\",\"userId\":2}" }, "UserCredentials": {} } diff --git a/examples/passport-login/package-lock.json b/examples/passport-login/package-lock.json index 32aa17b72764..92c47dbd4e4f 100644 --- a/examples/passport-login/package-lock.json +++ b/examples/passport-login/package-lock.json @@ -1684,12 +1684,12 @@ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "passport": { - "version": "0.1.18", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.1.18.tgz", - "integrity": "sha1-yCZEedy2QUytu2Z1LRKzfgtlJaE=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz", + "integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==", "requires": { - "pause": "0.0.1", - "pkginfo": "0.2.x" + "passport-strategy": "1.x.x", + "pause": "0.0.1" } }, "passport-facebook": { @@ -1753,6 +1753,17 @@ "openid": "0.5.x", "passport": "~0.1.3", "pkginfo": "0.2.x" + }, + "dependencies": { + "passport": { + "version": "0.1.18", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.1.18.tgz", + "integrity": "sha1-yCZEedy2QUytu2Z1LRKzfgtlJaE=", + "requires": { + "pause": "0.0.1", + "pkginfo": "0.2.x" + } + } } }, "passport-strategy": { diff --git a/examples/passport-login/package.json b/examples/passport-login/package.json index cc15fdb0b823..c6fc6c9173f5 100644 --- a/examples/passport-login/package.json +++ b/examples/passport-login/package.json @@ -40,6 +40,7 @@ "@loopback/boot": "^2.1.2", "@loopback/context": "^3.6.0", "@loopback/core": "^2.4.2", + "@loopback/express": "^1.0.0", "@loopback/openapi-v3": "^3.3.0", "@loopback/repository": "^2.3.0", "@loopback/rest": "^3.3.2", @@ -49,6 +50,7 @@ "@loopback/service-proxy": "^2.1.2", "@types/jsonwebtoken": "8.3.9", "@types/lodash": "^4.14.149", + "@types/passport": "^1.0.3", "@types/passport-facebook": "^2.1.9", "@types/passport-google-oauth": "^1.0.41", "@types/passport-google-oauth2": "^0.1.3", @@ -63,6 +65,7 @@ "jade": "^1.11.0", "lodash": "^4.17.15", "p-event": "^4.1.0", + "passport": "^0.4.1", "passport-facebook": "^3.0.0", "passport-google": "^0.3.0", "passport-google-oauth2": "^0.2.0", diff --git a/examples/passport-login/src/application.ts b/examples/passport-login/src/application.ts index deb090487de2..289f8eb3bdeb 100644 --- a/examples/passport-login/src/application.ts +++ b/examples/passport-login/src/application.ts @@ -16,10 +16,14 @@ import { LocalAuthStrategy, SessionStrategy, BasicStrategy, + FacebookOauth2MW, + PassportInitMW, + PassportSessionMW, } from './authentication-strategies'; import {PassportUserIdentityService, UserServiceBindings} from './services'; import {ApplicationConfig, createBindingFromClass} from '@loopback/core'; import {CrudRestComponent} from '@loopback/rest-crud'; +import {createMiddlewareInterceptorBinding} from '@loopback/rest'; export class OAuth2LoginApplication extends BootMixin( ServiceMixin(RepositoryMixin(RestApplication)), @@ -35,6 +39,10 @@ export class OAuth2LoginApplication extends BootMixin( this.component(AuthenticationComponent); this.component(CrudRestComponent); + this.add(createMiddlewareInterceptorBinding(PassportInitMW)); + this.add(createMiddlewareInterceptorBinding(PassportSessionMW)); + this.add(createMiddlewareInterceptorBinding(FacebookOauth2MW)); + this.projectRoot = __dirname; // Customize @loopback/boot Booter Conventions here this.bootOptions = { diff --git a/examples/passport-login/src/authentication-strategies/types.ts b/examples/passport-login/src/authentication-strategies/types.ts index efbb77101e8e..dd0afd6483a2 100644 --- a/examples/passport-login/src/authentication-strategies/types.ts +++ b/examples/passport-login/src/authentication-strategies/types.ts @@ -5,9 +5,15 @@ import axios from 'axios'; import {Profile} from 'passport'; +let passport = require('passport'); import {UserIdentityService} from '@loopback/authentication'; import {User} from '../models'; import {UserProfile, securityId} from '@loopback/security'; +import {toInterceptor} from '@loopback/rest'; +import {StrategyOption} from 'passport-facebook'; +import {inject, Provider, Interceptor} from '@loopback/core'; +import { UserServiceBindings } from '../services'; +import {Strategy as FacebookStrategy} from 'passport-facebook'; export type profileFunction = ( accessToken: string, @@ -91,3 +97,34 @@ export const mapProfile = function (user: User): UserProfile { }; return userProfile; }; + +export class PassportInitMW implements Provider { + constructor() {} + + value() { + return toInterceptor(passport.initialize()); + } +} + +export class PassportSessionMW implements Provider { + constructor() {} + + value() { + return toInterceptor(passport.session()); + } +} + +export class FacebookOauth2MW implements Provider { + constructor( + @inject('facebookOAuth2Options') + public facebookOptions: StrategyOption, + @inject(UserServiceBindings.PASSPORT_USER_IDENTITY_SERVICE) + public userService: UserIdentityService, + ) { + passport.use(new FacebookStrategy(this.facebookOptions, verifyFunctionFactory(this.userService))); + } + + value() { + return toInterceptor(passport.authenticate('facebook')); + } +} diff --git a/examples/passport-login/src/controllers/facebook.controller.ts b/examples/passport-login/src/controllers/facebook.controller.ts new file mode 100644 index 000000000000..6ceeedda2f2f --- /dev/null +++ b/examples/passport-login/src/controllers/facebook.controller.ts @@ -0,0 +1,62 @@ +// Copyright IBM Corp. 2020. All Rights Reserved. +// Node module: @loopback/example-passport-login +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import { + get, + RestBindings, + Response, + RequestWithSession, +} from '@loopback/rest'; +import {inject, intercept} from '@loopback/core'; +import {SecurityBindings, UserProfile} from '@loopback/security'; + +/** + * Login controller for facebook + */ +export class FacebookController { + constructor( + ) {} + + @intercept('PassportInitMW') + @intercept('PassportSessionMW') + @intercept('FacebookOauth2MW') + @get('/auth/facebook') + /** + * Endpoint: '/auth/facebook' + */ + loginToThirdParty( + @inject('authentication.redirect.url') + redirectUrl: string, + @inject('authentication.redirect.status') + status: number, + @inject(RestBindings.Http.RESPONSE) + response: Response, + ) { + response.statusCode = status || 302; + response.setHeader('Location', redirectUrl); + response.end(); + return response; + } + + @intercept('PassportInitMW') + @intercept('PassportSessionMW') + @intercept('FacebookOauth2MW') + @get('/facebook/callback') + /** + * Endpoint: '/auth/facebook/callback' + */ + async thirdPartyCallBack( + @inject(SecurityBindings.USER) user: UserProfile, + @inject(RestBindings.Http.REQUEST) request: RequestWithSession, + @inject(RestBindings.Http.RESPONSE) response: Response, + ) { + const profile = { + ...user.profile, + }; + request.session.user = profile; + response.redirect('/auth/account'); + return response; + } +} diff --git a/examples/passport-login/src/controllers/index.ts b/examples/passport-login/src/controllers/index.ts index 84232fb79d88..6f92defa4850 100644 --- a/examples/passport-login/src/controllers/index.ts +++ b/examples/passport-login/src/controllers/index.ts @@ -6,3 +6,4 @@ export * from './oauth2.controller'; export * from './user.controller'; export * from './ping.controller'; +export * from './facebook.controller'; diff --git a/examples/passport-login/tsconfig.json b/examples/passport-login/tsconfig.json index ec89e209689a..b57a17c97d8f 100644 --- a/examples/passport-login/tsconfig.json +++ b/examples/passport-login/tsconfig.json @@ -33,6 +33,9 @@ { "path": "../../packages/core/tsconfig.json" }, + { + "path": "../../packages/express/tsconfig.json" + }, { "path": "../../packages/openapi-v3/tsconfig.json" }, diff --git a/examples/passport-login/web-application/views/pages/login.jade b/examples/passport-login/web-application/views/pages/login.jade index 5dc15916f817..560c9a53b8a8 100644 --- a/examples/passport-login/web-application/views/pages/login.jade +++ b/examples/passport-login/web-application/views/pages/login.jade @@ -26,7 +26,7 @@ block content h1 Other Login Options ul.list-inline.list-unstyled li - a.btn.btn-primary(href="/api/auth/thirdparty/facebook") Login with Facebook + a.btn.btn-primary(href="/api/auth/facebook") Login with Facebook li a.btn.btn-primary(href="/api/auth/thirdparty/google") Login with Google li From bda5b701200c03e6802aa5f479f95082866f8d2a Mon Sep 17 00:00:00 2001 From: DEEPAK RAJAMOHAN Date: Fri, 1 May 2020 10:56:28 -0700 Subject: [PATCH 10/10] fix: interceptor --- examples/passport-login/src/application.ts | 21 ++++++++++++------- .../src/authentication-strategies/types.ts | 18 +--------------- .../src/controllers/facebook.controller.ts | 14 +++++-------- 3 files changed, 19 insertions(+), 34 deletions(-) diff --git a/examples/passport-login/src/application.ts b/examples/passport-login/src/application.ts index 289f8eb3bdeb..7156fb2b293a 100644 --- a/examples/passport-login/src/application.ts +++ b/examples/passport-login/src/application.ts @@ -5,7 +5,7 @@ import {BootMixin} from '@loopback/boot'; import {RepositoryMixin} from '@loopback/repository'; -import {RestApplication} from '@loopback/rest'; +import {RestApplication, toInterceptor} from '@loopback/rest'; import {ServiceMixin} from '@loopback/service-proxy'; import {MySequence} from './sequence'; import {AuthenticationComponent} from '@loopback/authentication'; @@ -16,14 +16,12 @@ import { LocalAuthStrategy, SessionStrategy, BasicStrategy, - FacebookOauth2MW, - PassportInitMW, - PassportSessionMW, + FacebookOauth, } from './authentication-strategies'; import {PassportUserIdentityService, UserServiceBindings} from './services'; import {ApplicationConfig, createBindingFromClass} from '@loopback/core'; import {CrudRestComponent} from '@loopback/rest-crud'; -import {createMiddlewareInterceptorBinding} from '@loopback/rest'; +import passport from "passport"; export class OAuth2LoginApplication extends BootMixin( ServiceMixin(RepositoryMixin(RestApplication)), @@ -39,9 +37,16 @@ export class OAuth2LoginApplication extends BootMixin( this.component(AuthenticationComponent); this.component(CrudRestComponent); - this.add(createMiddlewareInterceptorBinding(PassportInitMW)); - this.add(createMiddlewareInterceptorBinding(PassportSessionMW)); - this.add(createMiddlewareInterceptorBinding(FacebookOauth2MW)); + this.bind('passport-init-mw').to(toInterceptor(passport.initialize())); + this.bind('passport-session-mw').to(toInterceptor(passport.session())); + passport.serializeUser(function(user: any, done) { + done(null, user); + }); + + passport.deserializeUser(function(user: any, done) { + done(null, user); + }); + this.bind('passport-facebook').toProvider(FacebookOauth); this.projectRoot = __dirname; // Customize @loopback/boot Booter Conventions here diff --git a/examples/passport-login/src/authentication-strategies/types.ts b/examples/passport-login/src/authentication-strategies/types.ts index dd0afd6483a2..69acd9f107d3 100644 --- a/examples/passport-login/src/authentication-strategies/types.ts +++ b/examples/passport-login/src/authentication-strategies/types.ts @@ -98,23 +98,7 @@ export const mapProfile = function (user: User): UserProfile { return userProfile; }; -export class PassportInitMW implements Provider { - constructor() {} - - value() { - return toInterceptor(passport.initialize()); - } -} - -export class PassportSessionMW implements Provider { - constructor() {} - - value() { - return toInterceptor(passport.session()); - } -} - -export class FacebookOauth2MW implements Provider { +export class FacebookOauth implements Provider { constructor( @inject('facebookOAuth2Options') public facebookOptions: StrategyOption, diff --git a/examples/passport-login/src/controllers/facebook.controller.ts b/examples/passport-login/src/controllers/facebook.controller.ts index 6ceeedda2f2f..90f1f827a31f 100644 --- a/examples/passport-login/src/controllers/facebook.controller.ts +++ b/examples/passport-login/src/controllers/facebook.controller.ts @@ -10,7 +10,7 @@ import { RequestWithSession, } from '@loopback/rest'; import {inject, intercept} from '@loopback/core'; -import {SecurityBindings, UserProfile} from '@loopback/security'; +import {UserProfile} from '@loopback/security'; /** * Login controller for facebook @@ -19,9 +19,7 @@ export class FacebookController { constructor( ) {} - @intercept('PassportInitMW') - @intercept('PassportSessionMW') - @intercept('FacebookOauth2MW') + @intercept('passport-init-mw', 'passport-session-mw', 'passport-facebook') @get('/auth/facebook') /** * Endpoint: '/auth/facebook' @@ -40,20 +38,18 @@ export class FacebookController { return response; } - @intercept('PassportInitMW') - @intercept('PassportSessionMW') - @intercept('FacebookOauth2MW') + @intercept('passport-init-mw', 'passport-session-mw', 'passport-facebook') @get('/facebook/callback') /** * Endpoint: '/auth/facebook/callback' */ async thirdPartyCallBack( - @inject(SecurityBindings.USER) user: UserProfile, @inject(RestBindings.Http.REQUEST) request: RequestWithSession, @inject(RestBindings.Http.RESPONSE) response: Response, ) { + let user: any = request.user; const profile = { - ...user.profile, + ...user, }; request.session.user = profile; response.redirect('/auth/account');