@loopback/express
Version:
Integrate with Express and expose middleware infrastructure for sequence and interceptors
83 lines (78 loc) • 2.54 kB
text/typescript
// Copyright IBM Corp. and LoopBack contributors 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,
config,
CoreTags,
extensionPoint,
inject,
} from '@loopback/core';
import debugFactory from 'debug';
import {DEFAULT_MIDDLEWARE_GROUP} from '../keys';
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
*/
(DEFAULT_MIDDLEWARE_CHAIN)
export class InvokeMiddlewareProvider {
static value(
/**
* Inject the binding so that we can access `extensionPoint` tag
*/
.binding()
binding: Binding<InvokeMiddleware>,
/**
* Default options for invoking the middleware chain
*/
()
defaultOptions: InvokeMiddlewareOptions = {
chain: DEFAULT_MIDDLEWARE_CHAIN,
orderedGroups: ['cors', 'apiSpec', DEFAULT_MIDDLEWARE_GROUP],
},
): InvokeMiddleware {
debug('Binding', binding);
debug('Default options', defaultOptions);
const invokeMiddlewareFn: InvokeMiddleware = (
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 ??
binding?.tagMap[CoreTags.EXTENSION_POINT] ??
defaultOptions.chain;
const middlewareOptions = {
...options,
chain,
orderedGroups: orderedGroups ?? defaultOptions.orderedGroups,
};
debug('Invoke middleware with', middlewareOptions);
return this.action(middlewareCtx, middlewareOptions);
};
return invokeMiddlewareFn;
}
static async action(
middlewareCtx: MiddlewareContext,
optionsOrHandlers?: InvokeMiddlewareOptions | ExpressRequestHandler[],
) {
if (Array.isArray(optionsOrHandlers)) {
return invokeExpressMiddleware(middlewareCtx, ...optionsOrHandlers);
}
return invokeMiddleware(middlewareCtx, optionsOrHandlers);
}
}