logger-plugin.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.loggerPlugin = void 0;
  4. const url_1 = require("url");
  5. const logger_1 = require("../../logger");
  6. const logger_plugin_1 = require("../../utils/logger-plugin");
  7. const loggerPlugin = (proxyServer, options) => {
  8. const logger = (0, logger_1.getLogger)(options);
  9. proxyServer.on('error', (err, req, res, target) => {
  10. const hostname = req?.headers?.host;
  11. const requestHref = `${hostname}${req?.url}`;
  12. const targetHref = `${target?.href}`; // target is undefined when websocket errors
  13. const errorMessage = '[HPM] Error occurred while proxying request %s to %s [%s] (%s)';
  14. const errReference = 'https://nodejs.org/api/errors.html#errors_common_system_errors'; // link to Node Common Systems Errors page
  15. logger.error(errorMessage, requestHref, targetHref, err.code || err, errReference);
  16. });
  17. /**
  18. * Log request and response
  19. * @example
  20. * ```shell
  21. * [HPM] GET /users/ -> http://jsonplaceholder.typicode.com/users/ [304]
  22. * ```
  23. */
  24. proxyServer.on('proxyRes', (proxyRes, req, res) => {
  25. // BrowserSync uses req.originalUrl
  26. // Next.js doesn't have req.baseUrl
  27. const originalUrl = req.originalUrl ?? `${req.baseUrl || ''}${req.url}`;
  28. // construct targetUrl
  29. let target;
  30. try {
  31. const port = (0, logger_plugin_1.getPort)(proxyRes.req?.agent?.sockets);
  32. const obj = {
  33. protocol: proxyRes.req.protocol,
  34. host: proxyRes.req.host,
  35. pathname: proxyRes.req.path,
  36. };
  37. target = new url_1.URL(`${obj.protocol}//${obj.host}${obj.pathname}`);
  38. if (port) {
  39. target.port = port;
  40. }
  41. // eslint-disable-next-line @typescript-eslint/no-unused-vars
  42. }
  43. catch (err) {
  44. // nock issue (https://github.com/chimurai/http-proxy-middleware/issues/1035)
  45. // fallback to old implementation (less correct - without port)
  46. target = new url_1.URL(options.target);
  47. target.pathname = proxyRes.req.path;
  48. }
  49. const targetUrl = target.toString();
  50. const exchange = `[HPM] ${req.method} ${originalUrl} -> ${targetUrl} [${proxyRes.statusCode}]`;
  51. logger.info(exchange);
  52. });
  53. /**
  54. * When client opens WebSocket connection
  55. */
  56. proxyServer.on('open', (socket) => {
  57. logger.info('[HPM] Client connected: %o', socket.address());
  58. });
  59. /**
  60. * When client closes WebSocket connection
  61. */
  62. proxyServer.on('close', (req, proxySocket, proxyHead) => {
  63. logger.info('[HPM] Client disconnected: %o', proxySocket.address());
  64. });
  65. };
  66. exports.loggerPlugin = loggerPlugin;