export function expressConnectMiddleware()

in packages/dubbo-express/src/express-dubbo-middleware.ts [56:93]


export function expressConnectMiddleware(
  options: ExpressConnectMiddlewareOptions
): express.Handler {
  if (options.acceptCompression === undefined) {
    options.acceptCompression = [compressionGzip, compressionBrotli];
  }
  const router = createConnectRouter(options);
  options.routes(router);
  const prefix = options.requestPathPrefix ?? "";
  const paths = new Map<string, UniversalHandler>();
  for (const uHandler of router.handlers) {
    paths.set(prefix + uHandler.requestPath, uHandler);
  }
  return function handler(
    req: express.Request,
    res: express.Response,
    next: express.NextFunction
  ) {
    // Strip the query parameter when matching paths.
    const uHandler = paths.get(req.url.split("?", 2)[0]);
    if (!uHandler) {
      return next();
    }
    const uReq = universalRequestFromNodeRequest(req, getPreparsedBody(req));
    uHandler(uReq)
      .then((uRes) => universalResponseToNodeResponse(uRes, res))
      .catch((reason) => {
        if (ConnectError.from(reason).code == Code.Aborted) {
          return;
        }
        // eslint-disable-next-line no-console
        console.error(
          `handler for rpc ${uHandler.method.name} of ${uHandler.service.typeName} failed`,
          reason
        );
      });
  };
}