export function connectNodeAdapter()

in packages/dubbo-node/src/dubbo-node-adapter.ts [65:102]


export function connectNodeAdapter(
  options: ConnectNodeAdapterOptions
): NodeHandlerFn {
  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 nodeRequestHandler(
    req: NodeServerRequest,
    res: NodeServerResponse
  ): void {
    // Strip the query parameter when matching paths.
    const uHandler = paths.get(req.url?.split("?", 2)[0] ?? "");
    if (!uHandler) {
      (options.fallback ?? fallback)(req, res);
      return;
    }
    const uReq = universalRequestFromNodeRequest(req, undefined);
    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
        );
      });
  };
}