{"version":3,"sources":["../../src/common/requestCounter.ts"],"sourcesContent":["import { RequestInfo, RequestsItem } from \"./types.js\";\n\nexport default class RequestCounter {\n  private requestCounts: Map<string, number>;\n  private requestSizeSums: Map<string, number>;\n  private responseSizeSums: Map<string, number>;\n  private responseTimes: Map<string, Map<number, number>>;\n  private requestSizes: Map<string, Map<number, number>>;\n  private responseSizes: Map<string, Map<number, number>>;\n\n  constructor() {\n    this.requestCounts = new Map<string, number>();\n    this.requestSizeSums = new Map<string, number>();\n    this.responseSizeSums = new Map<string, number>();\n    this.responseTimes = new Map<string, Map<number, number>>();\n    this.requestSizes = new Map<string, Map<number, number>>();\n    this.responseSizes = new Map<string, Map<number, number>>();\n  }\n\n  private getKey(requestInfo: RequestInfo) {\n    return [\n      requestInfo.consumer || \"\",\n      requestInfo.method.toUpperCase(),\n      requestInfo.path,\n      requestInfo.statusCode,\n    ].join(\"|\");\n  }\n\n  addRequest(requestInfo: RequestInfo) {\n    const key = this.getKey(requestInfo);\n\n    // Increment request count\n    this.requestCounts.set(key, (this.requestCounts.get(key) || 0) + 1);\n\n    // Add response time\n    if (!this.responseTimes.has(key)) {\n      this.responseTimes.set(key, new Map<number, number>());\n    }\n    const responseTimeMap = this.responseTimes.get(key)!;\n    const responseTimeMsBin = Math.floor(requestInfo.responseTime / 10) * 10; // Rounded to nearest 10ms\n    responseTimeMap.set(\n      responseTimeMsBin,\n      (responseTimeMap.get(responseTimeMsBin) || 0) + 1,\n    );\n\n    // Add request size\n    if (requestInfo.requestSize !== undefined) {\n      requestInfo.requestSize = Number(requestInfo.requestSize);\n      this.requestSizeSums.set(\n        key,\n        (this.requestSizeSums.get(key) || 0) + requestInfo.requestSize,\n      );\n      if (!this.requestSizes.has(key)) {\n        this.requestSizes.set(key, new Map<number, number>());\n      }\n      const requestSizeMap = this.requestSizes.get(key)!;\n      const requestSizeKbBin = Math.floor(requestInfo.requestSize / 1000); // Rounded down to nearest KB\n      requestSizeMap.set(\n        requestSizeKbBin,\n        (requestSizeMap.get(requestSizeKbBin) || 0) + 1,\n      );\n    }\n\n    // Add response size\n    if (requestInfo.responseSize !== undefined) {\n      requestInfo.responseSize = Number(requestInfo.responseSize);\n      this.responseSizeSums.set(\n        key,\n        (this.responseSizeSums.get(key) || 0) + requestInfo.responseSize,\n      );\n      if (!this.responseSizes.has(key)) {\n        this.responseSizes.set(key, new Map<number, number>());\n      }\n      const responseSizeMap = this.responseSizes.get(key)!;\n      const responseSizeKbBin = Math.floor(requestInfo.responseSize / 1000); // Rounded down to nearest KB\n      responseSizeMap.set(\n        responseSizeKbBin,\n        (responseSizeMap.get(responseSizeKbBin) || 0) + 1,\n      );\n    }\n  }\n\n  getAndResetRequests() {\n    const data: Array<RequestsItem> = [];\n    this.requestCounts.forEach((count, key) => {\n      const [consumer, method, path, statusCodeStr] = key.split(\"|\");\n      const responseTimes =\n        this.responseTimes.get(key) || new Map<number, number>();\n      const requestSizes =\n        this.requestSizes.get(key) || new Map<number, number>();\n      const responseSizes =\n        this.responseSizes.get(key) || new Map<number, number>();\n      data.push({\n        consumer: consumer || null,\n        method,\n        path,\n        status_code: parseInt(statusCodeStr),\n        request_count: count,\n        request_size_sum: this.requestSizeSums.get(key) || 0,\n        response_size_sum: this.responseSizeSums.get(key) || 0,\n        response_times: Object.fromEntries(responseTimes),\n        request_sizes: Object.fromEntries(requestSizes),\n        response_sizes: Object.fromEntries(responseSizes),\n      });\n    });\n\n    // Reset the counts and times\n    this.requestCounts.clear();\n    this.requestSizeSums.clear();\n    this.responseSizeSums.clear();\n    this.responseTimes.clear();\n    this.requestSizes.clear();\n    this.responseSizes.clear();\n\n    return data;\n  }\n}\n"],"mappings":"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","names":["RequestCounter","requestCounts","requestSizeSums","responseSizeSums","responseTimes","requestSizes","responseSizes","Map","getKey","requestInfo","consumer","method","toUpperCase","path","statusCode","join","addRequest","key","set","get","has","responseTimeMap","responseTimeMsBin","Math","floor","responseTime","requestSize","undefined","Number","requestSizeMap","requestSizeKbBin","responseSize","responseSizeMap","responseSizeKbBin","getAndResetRequests","data","forEach","count","statusCodeStr","split","push","status_code","parseInt","request_count","request_size_sum","response_size_sum","response_times","Object","fromEntries","request_sizes","response_sizes","clear"]}