@promster/express 15.6.0 → 15.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -16,7 +16,7 @@ var __copyProps = (to, from, except, desc) => {
16
16
  }
17
17
  return to;
18
18
  };
19
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule || !__hasOwnProp.call(mod, "default") ? __defProp(target, "default", {
20
20
  value: mod,
21
21
  enumerable: true
22
22
  }) : target, mod));
@@ -24,7 +24,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
24
24
  let _promster_metrics = require("@promster/metrics");
25
25
  let merge_options = require("merge-options");
26
26
  merge_options = __toESM(merge_options, 1);
27
- //#region src/middleware/middleware.ts
27
+ //#region src/middleware.ts
28
28
  const exposeOnLocals = ({ app, key, value }) => {
29
29
  if (app?.locals) app.locals[key] = value;
30
30
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["createHttpMetrics","createGcMetrics","createRequestRecorder","createGcObserver","defaultNormalizers","Prometheus","timing"],"sources":["../src/middleware/middleware.ts"],"sourcesContent":["import type { TRequestRecorder } from '@promster/metrics';\nimport {\n createGcMetrics,\n createGcObserver,\n createHttpMetrics,\n createRequestRecorder,\n defaultNormalizers,\n Prometheus,\n skipMetricsInEnvironment,\n timing,\n} from '@promster/metrics';\nimport type {\n TDefaultedPromsterOptions,\n TGcMetrics,\n THttpMetrics,\n TLabelValues,\n TOptionalPromsterOptions,\n} from '@promster/types';\nimport type { Application, NextFunction, Request, Response } from 'express';\nimport merge from 'merge-options';\n\ninterface TApp extends Application {\n locals: Record<string, unknown>;\n}\n\ntype TLocaleTarget = {\n app?: TApp;\n key: string;\n value: typeof Prometheus | TRequestRecorder;\n};\nconst exposeOnLocals = ({ app, key, value }: TLocaleTarget) => {\n if (app?.locals) {\n app.locals[key] = value;\n }\n};\n\nconst extractPath = (req: Request) => req.originalUrl || req.url;\n\nlet recordRequest: TRequestRecorder;\nlet upMetric: TGcMetrics['up'];\n\nconst getRequestRecorder = () => recordRequest;\nconst signalIsUp = () => {\n if (!upMetric) {\n return;\n }\n\n for (const upMetricType of upMetric) {\n upMetricType.set(1);\n }\n};\n\nconst signalIsNotUp = () => {\n if (!upMetric) {\n return;\n }\n\n for (const upMetricType of upMetric) {\n upMetricType.set(0);\n }\n};\n\ntype TSkipFunction = <TRequest = Request, TResponse = Response>(\n _req: TRequest,\n _res: TResponse,\n _labels: TLabelValues,\n) => boolean;\nexport type TPromsterOptions = TOptionalPromsterOptions & {\n skip?: TSkipFunction;\n};\ntype TMiddlewareOptions = {\n app?: TApp;\n options?: TPromsterOptions;\n};\nconst createMiddleware = (\n { app, options }: TMiddlewareOptions = { app: undefined, options: undefined },\n) => {\n const allDefaultedOptions: TDefaultedPromsterOptions & {\n skip?: TSkipFunction;\n } = merge(\n createHttpMetrics.defaultOptions,\n createGcMetrics.defaultOptions,\n createRequestRecorder.defaultOptions,\n // @ts-expect-error\n createGcObserver.defaultOptions,\n defaultNormalizers,\n options,\n );\n\n const shouldSkipMetricsByEnvironment =\n skipMetricsInEnvironment(allDefaultedOptions);\n\n const httpMetrics: THttpMetrics = createHttpMetrics(allDefaultedOptions);\n const gcMetrics: TGcMetrics = createGcMetrics(allDefaultedOptions);\n const observeGc = createGcObserver(gcMetrics, allDefaultedOptions);\n\n recordRequest = createRequestRecorder(httpMetrics, allDefaultedOptions);\n upMetric = gcMetrics?.up;\n\n exposeOnLocals({ app, key: 'Prometheus', value: Prometheus });\n exposeOnLocals({ app, key: 'recordRequest', value: recordRequest });\n\n if (!shouldSkipMetricsByEnvironment) {\n observeGc();\n }\n\n signalIsUp();\n\n return (request: Request, response: Response, next: NextFunction) => {\n const requestTiming = timing.start();\n\n response.on('finish', () => {\n const labels = Object.assign(\n {},\n {\n method: allDefaultedOptions.normalizeMethod(request.method, {\n req: request,\n res: response,\n }),\n status_code: allDefaultedOptions.normalizeStatusCode(\n response.statusCode,\n { req: request, res: response },\n ),\n path: allDefaultedOptions.normalizePath(extractPath(request), {\n req: request,\n res: response,\n }),\n },\n allDefaultedOptions.getLabelValues?.(request, response),\n );\n\n const shouldSkipByRequest = allDefaultedOptions.skip?.(\n request,\n response,\n labels,\n );\n\n const requestContentLength = Number(\n request.headers['content-length'] ?? 0,\n );\n const responseContentLength = Number(\n response.getHeader('content-length') ?? 0,\n );\n\n if (!shouldSkipByRequest && !shouldSkipMetricsByEnvironment) {\n recordRequest(requestTiming, {\n labels,\n requestContentLength,\n responseContentLength,\n });\n }\n });\n\n next();\n };\n};\n\nexport {\n createMiddleware,\n exposeOnLocals,\n extractPath,\n getRequestRecorder,\n signalIsUp,\n signalIsNotUp,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,MAAM,kBAAkB,EAAE,KAAK,KAAK,YAA2B;CAC7D,IAAI,KAAK,QACP,IAAI,OAAO,OAAO;AAEtB;AAEA,MAAM,eAAe,QAAiB,IAAI,eAAe,IAAI;AAE7D,IAAI;AACJ,IAAI;AAEJ,MAAM,2BAA2B;AACjC,MAAM,mBAAmB;CACvB,IAAI,CAAC,UACH;CAGF,KAAK,MAAM,gBAAgB,UACzB,aAAa,IAAI,CAAC;AAEtB;AAEA,MAAM,sBAAsB;CAC1B,IAAI,CAAC,UACH;CAGF,KAAK,MAAM,gBAAgB,UACzB,aAAa,IAAI,CAAC;AAEtB;AAcA,MAAM,oBACJ,EAAE,KAAK,YAAgC;CAAE,KAAK,KAAA;CAAW,SAAS,KAAA;AAAU,MACzE;CACH,MAAM,uBAAA,GAAA,cAAA,QAAA,CAGJA,kBAAAA,kBAAkB,gBAClBC,kBAAAA,gBAAgB,gBAChBC,kBAAAA,sBAAsB,gBAEtBC,kBAAAA,iBAAiB,gBACjBC,kBAAAA,oBACA,OACF;CAEA,MAAM,kCAAA,GAAA,kBAAA,yBAAA,CACqB,mBAAmB;CAE9C,MAAM,eAAA,GAAA,kBAAA,kBAAA,CAA8C,mBAAmB;CACvE,MAAM,aAAA,GAAA,kBAAA,gBAAA,CAAwC,mBAAmB;CACjE,MAAM,aAAA,GAAA,kBAAA,iBAAA,CAA6B,WAAW,mBAAmB;CAEjE,iBAAA,GAAA,kBAAA,sBAAA,CAAsC,aAAa,mBAAmB;CACtE,WAAW,WAAW;CAEtB,eAAe;EAAE;EAAK,KAAK;EAAc,OAAOC,kBAAAA;CAAW,CAAC;CAC5D,eAAe;EAAE;EAAK,KAAK;EAAiB,OAAO;CAAc,CAAC;CAElE,IAAI,CAAC,gCACH,UAAU;CAGZ,WAAW;CAEX,QAAQ,SAAkB,UAAoB,SAAuB;EACnE,MAAM,gBAAgBC,kBAAAA,OAAO,MAAM;EAEnC,SAAS,GAAG,gBAAgB;GAC1B,MAAM,SAAS,OAAO,OACpB,CAAC,GACD;IACE,QAAQ,oBAAoB,gBAAgB,QAAQ,QAAQ;KAC1D,KAAK;KACL,KAAK;IACP,CAAC;IACD,aAAa,oBAAoB,oBAC/B,SAAS,YACT;KAAE,KAAK;KAAS,KAAK;IAAS,CAChC;IACA,MAAM,oBAAoB,cAAc,YAAY,OAAO,GAAG;KAC5D,KAAK;KACL,KAAK;IACP,CAAC;GACH,GACA,oBAAoB,iBAAiB,SAAS,QAAQ,CACxD;GAEA,MAAM,sBAAsB,oBAAoB,OAC9C,SACA,UACA,MACF;GAEA,MAAM,uBAAuB,OAC3B,QAAQ,QAAQ,qBAAqB,CACvC;GACA,MAAM,wBAAwB,OAC5B,SAAS,UAAU,gBAAgB,KAAK,CAC1C;GAEA,IAAI,CAAC,uBAAuB,CAAC,gCAC3B,cAAc,eAAe;IAC3B;IACA;IACA;GACF,CAAC;EAEL,CAAC;EAED,KAAK;CACP;AACF"}
1
+ {"version":3,"file":"index.cjs","names":["merge","createHttpMetrics","createGcMetrics","createRequestRecorder","createGcObserver","defaultNormalizers","skipMetricsInEnvironment","Prometheus","timing"],"sources":["../src/middleware.ts"],"sourcesContent":["import type { TRequestRecorder } from '@promster/metrics';\nimport {\n createGcMetrics,\n createGcObserver,\n createHttpMetrics,\n createRequestRecorder,\n defaultNormalizers,\n Prometheus,\n skipMetricsInEnvironment,\n timing,\n} from '@promster/metrics';\nimport type {\n TDefaultedPromsterOptions,\n TGcMetrics,\n THttpMetrics,\n TLabelValues,\n TOptionalPromsterOptions,\n} from '@promster/types';\nimport type { Application, NextFunction, Request, Response } from 'express';\nimport merge from 'merge-options';\n\ninterface TApp extends Application {\n locals: Record<string, unknown>;\n}\n\ntype TLocaleTarget = {\n app?: TApp;\n key: string;\n value: typeof Prometheus | TRequestRecorder;\n};\nconst exposeOnLocals = ({ app, key, value }: TLocaleTarget) => {\n if (app?.locals) {\n app.locals[key] = value;\n }\n};\n\nconst extractPath = (req: Request) => req.originalUrl || req.url;\n\nlet recordRequest: TRequestRecorder;\nlet upMetric: TGcMetrics['up'];\n\nconst getRequestRecorder = () => recordRequest;\nconst signalIsUp = () => {\n if (!upMetric) {\n return;\n }\n\n for (const upMetricType of upMetric) {\n upMetricType.set(1);\n }\n};\n\nconst signalIsNotUp = () => {\n if (!upMetric) {\n return;\n }\n\n for (const upMetricType of upMetric) {\n upMetricType.set(0);\n }\n};\n\ntype TSkipFunction = <TRequest = Request, TResponse = Response>(\n _req: TRequest,\n _res: TResponse,\n _labels: TLabelValues,\n) => boolean;\nexport type TPromsterOptions = TOptionalPromsterOptions & {\n skip?: TSkipFunction;\n};\ntype TMiddlewareOptions = {\n app?: TApp;\n options?: TPromsterOptions;\n};\nconst createMiddleware = (\n { app, options }: TMiddlewareOptions = { app: undefined, options: undefined },\n) => {\n const allDefaultedOptions: TDefaultedPromsterOptions & {\n skip?: TSkipFunction;\n } = merge(\n createHttpMetrics.defaultOptions,\n createGcMetrics.defaultOptions,\n createRequestRecorder.defaultOptions,\n // @ts-expect-error\n createGcObserver.defaultOptions,\n defaultNormalizers,\n options,\n );\n\n const shouldSkipMetricsByEnvironment =\n skipMetricsInEnvironment(allDefaultedOptions);\n\n const httpMetrics: THttpMetrics = createHttpMetrics(allDefaultedOptions);\n const gcMetrics: TGcMetrics = createGcMetrics(allDefaultedOptions);\n const observeGc = createGcObserver(gcMetrics, allDefaultedOptions);\n\n recordRequest = createRequestRecorder(httpMetrics, allDefaultedOptions);\n upMetric = gcMetrics?.up;\n\n exposeOnLocals({ app, key: 'Prometheus', value: Prometheus });\n exposeOnLocals({ app, key: 'recordRequest', value: recordRequest });\n\n if (!shouldSkipMetricsByEnvironment) {\n observeGc();\n }\n\n signalIsUp();\n\n return (request: Request, response: Response, next: NextFunction) => {\n const requestTiming = timing.start();\n\n response.on('finish', () => {\n const labels = Object.assign(\n {},\n {\n method: allDefaultedOptions.normalizeMethod(request.method, {\n req: request,\n res: response,\n }),\n status_code: allDefaultedOptions.normalizeStatusCode(\n response.statusCode,\n { req: request, res: response },\n ),\n path: allDefaultedOptions.normalizePath(extractPath(request), {\n req: request,\n res: response,\n }),\n },\n allDefaultedOptions.getLabelValues?.(request, response),\n );\n\n const shouldSkipByRequest = allDefaultedOptions.skip?.(\n request,\n response,\n labels,\n );\n\n const requestContentLength = Number(\n request.headers['content-length'] ?? 0,\n );\n const responseContentLength = Number(\n response.getHeader('content-length') ?? 0,\n );\n\n if (!shouldSkipByRequest && !shouldSkipMetricsByEnvironment) {\n recordRequest(requestTiming, {\n labels,\n requestContentLength,\n responseContentLength,\n });\n }\n });\n\n next();\n };\n};\n\nexport {\n createMiddleware,\n exposeOnLocals,\n extractPath,\n getRequestRecorder,\n signalIsUp,\n signalIsNotUp,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,MAAM,kBAAkB,EAAE,KAAK,KAAK,YAA2B;CAC7D,IAAI,KAAK,QACP,IAAI,OAAO,OAAO;AAEtB;AAEA,MAAM,eAAe,QAAiB,IAAI,eAAe,IAAI;AAE7D,IAAI;AACJ,IAAI;AAEJ,MAAM,2BAA2B;AACjC,MAAM,mBAAmB;CACvB,IAAI,CAAC,UACH;CAGF,KAAK,MAAM,gBAAgB,UACzB,aAAa,IAAI,CAAC;AAEtB;AAEA,MAAM,sBAAsB;CAC1B,IAAI,CAAC,UACH;CAGF,KAAK,MAAM,gBAAgB,UACzB,aAAa,IAAI,CAAC;AAEtB;AAcA,MAAM,oBACJ,EAAE,KAAK,YAAgC;CAAE,KAAK,KAAA;CAAW,SAAS,KAAA;AAAU,MACzE;CACH,MAAM,uBAAA,GAEFA,cAAAA,QAAAA,CACFC,kBAAAA,kBAAkB,gBAClBC,kBAAAA,gBAAgB,gBAChBC,kBAAAA,sBAAsB,gBAEtBC,kBAAAA,iBAAiB,gBACjBC,kBAAAA,oBACA,OACF;CAEA,MAAM,kCAAA,GACJC,kBAAAA,yBAAAA,CAAyB,mBAAmB;CAE9C,MAAM,eAAA,GAA4BL,kBAAAA,kBAAAA,CAAkB,mBAAmB;CACvE,MAAM,aAAA,GAAwBC,kBAAAA,gBAAAA,CAAgB,mBAAmB;CACjE,MAAM,aAAA,GAAYE,kBAAAA,iBAAAA,CAAiB,WAAW,mBAAmB;CAEjE,iBAAA,GAAgBD,kBAAAA,sBAAAA,CAAsB,aAAa,mBAAmB;CACtE,WAAW,WAAW;CAEtB,eAAe;EAAE;EAAK,KAAK;EAAc,OAAOI,kBAAAA;CAAW,CAAC;CAC5D,eAAe;EAAE;EAAK,KAAK;EAAiB,OAAO;CAAc,CAAC;CAElE,IAAI,CAAC,gCACH,UAAU;CAGZ,WAAW;CAEX,QAAQ,SAAkB,UAAoB,SAAuB;EACnE,MAAM,gBAAgBC,kBAAAA,OAAO,MAAM;EAEnC,SAAS,GAAG,gBAAgB;GAC1B,MAAM,SAAS,OAAO,OACpB,CAAC,GACD;IACE,QAAQ,oBAAoB,gBAAgB,QAAQ,QAAQ;KAC1D,KAAK;KACL,KAAK;IACP,CAAC;IACD,aAAa,oBAAoB,oBAC/B,SAAS,YACT;KAAE,KAAK;KAAS,KAAK;IAAS,CAChC;IACA,MAAM,oBAAoB,cAAc,YAAY,OAAO,GAAG;KAC5D,KAAK;KACL,KAAK;IACP,CAAC;GACH,GACA,oBAAoB,iBAAiB,SAAS,QAAQ,CACxD;GAEA,MAAM,sBAAsB,oBAAoB,OAC9C,SACA,UACA,MACF;GAEA,MAAM,uBAAuB,OAC3B,QAAQ,QAAQ,qBAAqB,CACvC;GACA,MAAM,wBAAwB,OAC5B,SAAS,UAAU,gBAAgB,KAAK,CAC1C;GAEA,IAAI,CAAC,uBAAuB,CAAC,gCAC3B,cAAc,eAAe;IAC3B;IACA;IACA;GACF,CAAC;EAEL,CAAC;EAED,KAAK;CACP;AACF"}
package/dist/index.d.cts CHANGED
@@ -2,7 +2,7 @@ import { Prometheus, TRequestRecorder, createCounter, createGauge, createHistogr
2
2
  import { TLabelValues, TOptionalPromsterOptions } from "@promster/types";
3
3
  import { Application, NextFunction, Request, Response } from "express";
4
4
  export type * from "@promster/types";
5
- //#region src/middleware/middleware.d.ts
5
+ //#region src/middleware.d.ts
6
6
  interface TApp extends Application {
7
7
  locals: Record<string, unknown>;
8
8
  }
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ import { Prometheus, Prometheus as Prometheus$1, TRequestRecorder, createCounter
2
2
  import { TLabelValues, TOptionalPromsterOptions } from "@promster/types";
3
3
  import { Application, NextFunction, Request, Response } from "express";
4
4
  export type * from "@promster/types";
5
- //#region src/middleware/middleware.d.ts
5
+ //#region src/middleware.d.ts
6
6
  interface TApp extends Application {
7
7
  locals: Record<string, unknown>;
8
8
  }
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Prometheus, Prometheus as Prometheus$1, createCounter, createGauge, createGcMetrics, createGcObserver, createHistogram, createHttpMetrics, createRequestRecorder, createSummary, defaultNormalizers, defaultNormalizers as defaultNormalizers$1, defaultRegister, getContentType, getSummary, skipMetricsInEnvironment, timing, timing as timing$1 } from "@promster/metrics";
2
2
  import merge from "merge-options";
3
- //#region src/middleware/middleware.ts
3
+ //#region src/middleware.ts
4
4
  const exposeOnLocals = ({ app, key, value }) => {
5
5
  if (app?.locals) app.locals[key] = value;
6
6
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["defaultNormalizers","Prometheus","timing"],"sources":["../src/middleware/middleware.ts"],"sourcesContent":["import type { TRequestRecorder } from '@promster/metrics';\nimport {\n createGcMetrics,\n createGcObserver,\n createHttpMetrics,\n createRequestRecorder,\n defaultNormalizers,\n Prometheus,\n skipMetricsInEnvironment,\n timing,\n} from '@promster/metrics';\nimport type {\n TDefaultedPromsterOptions,\n TGcMetrics,\n THttpMetrics,\n TLabelValues,\n TOptionalPromsterOptions,\n} from '@promster/types';\nimport type { Application, NextFunction, Request, Response } from 'express';\nimport merge from 'merge-options';\n\ninterface TApp extends Application {\n locals: Record<string, unknown>;\n}\n\ntype TLocaleTarget = {\n app?: TApp;\n key: string;\n value: typeof Prometheus | TRequestRecorder;\n};\nconst exposeOnLocals = ({ app, key, value }: TLocaleTarget) => {\n if (app?.locals) {\n app.locals[key] = value;\n }\n};\n\nconst extractPath = (req: Request) => req.originalUrl || req.url;\n\nlet recordRequest: TRequestRecorder;\nlet upMetric: TGcMetrics['up'];\n\nconst getRequestRecorder = () => recordRequest;\nconst signalIsUp = () => {\n if (!upMetric) {\n return;\n }\n\n for (const upMetricType of upMetric) {\n upMetricType.set(1);\n }\n};\n\nconst signalIsNotUp = () => {\n if (!upMetric) {\n return;\n }\n\n for (const upMetricType of upMetric) {\n upMetricType.set(0);\n }\n};\n\ntype TSkipFunction = <TRequest = Request, TResponse = Response>(\n _req: TRequest,\n _res: TResponse,\n _labels: TLabelValues,\n) => boolean;\nexport type TPromsterOptions = TOptionalPromsterOptions & {\n skip?: TSkipFunction;\n};\ntype TMiddlewareOptions = {\n app?: TApp;\n options?: TPromsterOptions;\n};\nconst createMiddleware = (\n { app, options }: TMiddlewareOptions = { app: undefined, options: undefined },\n) => {\n const allDefaultedOptions: TDefaultedPromsterOptions & {\n skip?: TSkipFunction;\n } = merge(\n createHttpMetrics.defaultOptions,\n createGcMetrics.defaultOptions,\n createRequestRecorder.defaultOptions,\n // @ts-expect-error\n createGcObserver.defaultOptions,\n defaultNormalizers,\n options,\n );\n\n const shouldSkipMetricsByEnvironment =\n skipMetricsInEnvironment(allDefaultedOptions);\n\n const httpMetrics: THttpMetrics = createHttpMetrics(allDefaultedOptions);\n const gcMetrics: TGcMetrics = createGcMetrics(allDefaultedOptions);\n const observeGc = createGcObserver(gcMetrics, allDefaultedOptions);\n\n recordRequest = createRequestRecorder(httpMetrics, allDefaultedOptions);\n upMetric = gcMetrics?.up;\n\n exposeOnLocals({ app, key: 'Prometheus', value: Prometheus });\n exposeOnLocals({ app, key: 'recordRequest', value: recordRequest });\n\n if (!shouldSkipMetricsByEnvironment) {\n observeGc();\n }\n\n signalIsUp();\n\n return (request: Request, response: Response, next: NextFunction) => {\n const requestTiming = timing.start();\n\n response.on('finish', () => {\n const labels = Object.assign(\n {},\n {\n method: allDefaultedOptions.normalizeMethod(request.method, {\n req: request,\n res: response,\n }),\n status_code: allDefaultedOptions.normalizeStatusCode(\n response.statusCode,\n { req: request, res: response },\n ),\n path: allDefaultedOptions.normalizePath(extractPath(request), {\n req: request,\n res: response,\n }),\n },\n allDefaultedOptions.getLabelValues?.(request, response),\n );\n\n const shouldSkipByRequest = allDefaultedOptions.skip?.(\n request,\n response,\n labels,\n );\n\n const requestContentLength = Number(\n request.headers['content-length'] ?? 0,\n );\n const responseContentLength = Number(\n response.getHeader('content-length') ?? 0,\n );\n\n if (!shouldSkipByRequest && !shouldSkipMetricsByEnvironment) {\n recordRequest(requestTiming, {\n labels,\n requestContentLength,\n responseContentLength,\n });\n }\n });\n\n next();\n };\n};\n\nexport {\n createMiddleware,\n exposeOnLocals,\n extractPath,\n getRequestRecorder,\n signalIsUp,\n signalIsNotUp,\n};\n"],"mappings":";;;AA8BA,MAAM,kBAAkB,EAAE,KAAK,KAAK,YAA2B;CAC7D,IAAI,KAAK,QACP,IAAI,OAAO,OAAO;AAEtB;AAEA,MAAM,eAAe,QAAiB,IAAI,eAAe,IAAI;AAE7D,IAAI;AACJ,IAAI;AAEJ,MAAM,2BAA2B;AACjC,MAAM,mBAAmB;CACvB,IAAI,CAAC,UACH;CAGF,KAAK,MAAM,gBAAgB,UACzB,aAAa,IAAI,CAAC;AAEtB;AAEA,MAAM,sBAAsB;CAC1B,IAAI,CAAC,UACH;CAGF,KAAK,MAAM,gBAAgB,UACzB,aAAa,IAAI,CAAC;AAEtB;AAcA,MAAM,oBACJ,EAAE,KAAK,YAAgC;CAAE,KAAK,KAAA;CAAW,SAAS,KAAA;AAAU,MACzE;CACH,MAAM,sBAEF,MACF,kBAAkB,gBAClB,gBAAgB,gBAChB,sBAAsB,gBAEtB,iBAAiB,gBACjBA,sBACA,OACF;CAEA,MAAM,iCACJ,yBAAyB,mBAAmB;CAE9C,MAAM,cAA4B,kBAAkB,mBAAmB;CACvE,MAAM,YAAwB,gBAAgB,mBAAmB;CACjE,MAAM,YAAY,iBAAiB,WAAW,mBAAmB;CAEjE,gBAAgB,sBAAsB,aAAa,mBAAmB;CACtE,WAAW,WAAW;CAEtB,eAAe;EAAE;EAAK,KAAK;EAAc,OAAOC;CAAW,CAAC;CAC5D,eAAe;EAAE;EAAK,KAAK;EAAiB,OAAO;CAAc,CAAC;CAElE,IAAI,CAAC,gCACH,UAAU;CAGZ,WAAW;CAEX,QAAQ,SAAkB,UAAoB,SAAuB;EACnE,MAAM,gBAAgBC,SAAO,MAAM;EAEnC,SAAS,GAAG,gBAAgB;GAC1B,MAAM,SAAS,OAAO,OACpB,CAAC,GACD;IACE,QAAQ,oBAAoB,gBAAgB,QAAQ,QAAQ;KAC1D,KAAK;KACL,KAAK;IACP,CAAC;IACD,aAAa,oBAAoB,oBAC/B,SAAS,YACT;KAAE,KAAK;KAAS,KAAK;IAAS,CAChC;IACA,MAAM,oBAAoB,cAAc,YAAY,OAAO,GAAG;KAC5D,KAAK;KACL,KAAK;IACP,CAAC;GACH,GACA,oBAAoB,iBAAiB,SAAS,QAAQ,CACxD;GAEA,MAAM,sBAAsB,oBAAoB,OAC9C,SACA,UACA,MACF;GAEA,MAAM,uBAAuB,OAC3B,QAAQ,QAAQ,qBAAqB,CACvC;GACA,MAAM,wBAAwB,OAC5B,SAAS,UAAU,gBAAgB,KAAK,CAC1C;GAEA,IAAI,CAAC,uBAAuB,CAAC,gCAC3B,cAAc,eAAe;IAC3B;IACA;IACA;GACF,CAAC;EAEL,CAAC;EAED,KAAK;CACP;AACF"}
1
+ {"version":3,"file":"index.js","names":["defaultNormalizers","Prometheus","timing"],"sources":["../src/middleware.ts"],"sourcesContent":["import type { TRequestRecorder } from '@promster/metrics';\nimport {\n createGcMetrics,\n createGcObserver,\n createHttpMetrics,\n createRequestRecorder,\n defaultNormalizers,\n Prometheus,\n skipMetricsInEnvironment,\n timing,\n} from '@promster/metrics';\nimport type {\n TDefaultedPromsterOptions,\n TGcMetrics,\n THttpMetrics,\n TLabelValues,\n TOptionalPromsterOptions,\n} from '@promster/types';\nimport type { Application, NextFunction, Request, Response } from 'express';\nimport merge from 'merge-options';\n\ninterface TApp extends Application {\n locals: Record<string, unknown>;\n}\n\ntype TLocaleTarget = {\n app?: TApp;\n key: string;\n value: typeof Prometheus | TRequestRecorder;\n};\nconst exposeOnLocals = ({ app, key, value }: TLocaleTarget) => {\n if (app?.locals) {\n app.locals[key] = value;\n }\n};\n\nconst extractPath = (req: Request) => req.originalUrl || req.url;\n\nlet recordRequest: TRequestRecorder;\nlet upMetric: TGcMetrics['up'];\n\nconst getRequestRecorder = () => recordRequest;\nconst signalIsUp = () => {\n if (!upMetric) {\n return;\n }\n\n for (const upMetricType of upMetric) {\n upMetricType.set(1);\n }\n};\n\nconst signalIsNotUp = () => {\n if (!upMetric) {\n return;\n }\n\n for (const upMetricType of upMetric) {\n upMetricType.set(0);\n }\n};\n\ntype TSkipFunction = <TRequest = Request, TResponse = Response>(\n _req: TRequest,\n _res: TResponse,\n _labels: TLabelValues,\n) => boolean;\nexport type TPromsterOptions = TOptionalPromsterOptions & {\n skip?: TSkipFunction;\n};\ntype TMiddlewareOptions = {\n app?: TApp;\n options?: TPromsterOptions;\n};\nconst createMiddleware = (\n { app, options }: TMiddlewareOptions = { app: undefined, options: undefined },\n) => {\n const allDefaultedOptions: TDefaultedPromsterOptions & {\n skip?: TSkipFunction;\n } = merge(\n createHttpMetrics.defaultOptions,\n createGcMetrics.defaultOptions,\n createRequestRecorder.defaultOptions,\n // @ts-expect-error\n createGcObserver.defaultOptions,\n defaultNormalizers,\n options,\n );\n\n const shouldSkipMetricsByEnvironment =\n skipMetricsInEnvironment(allDefaultedOptions);\n\n const httpMetrics: THttpMetrics = createHttpMetrics(allDefaultedOptions);\n const gcMetrics: TGcMetrics = createGcMetrics(allDefaultedOptions);\n const observeGc = createGcObserver(gcMetrics, allDefaultedOptions);\n\n recordRequest = createRequestRecorder(httpMetrics, allDefaultedOptions);\n upMetric = gcMetrics?.up;\n\n exposeOnLocals({ app, key: 'Prometheus', value: Prometheus });\n exposeOnLocals({ app, key: 'recordRequest', value: recordRequest });\n\n if (!shouldSkipMetricsByEnvironment) {\n observeGc();\n }\n\n signalIsUp();\n\n return (request: Request, response: Response, next: NextFunction) => {\n const requestTiming = timing.start();\n\n response.on('finish', () => {\n const labels = Object.assign(\n {},\n {\n method: allDefaultedOptions.normalizeMethod(request.method, {\n req: request,\n res: response,\n }),\n status_code: allDefaultedOptions.normalizeStatusCode(\n response.statusCode,\n { req: request, res: response },\n ),\n path: allDefaultedOptions.normalizePath(extractPath(request), {\n req: request,\n res: response,\n }),\n },\n allDefaultedOptions.getLabelValues?.(request, response),\n );\n\n const shouldSkipByRequest = allDefaultedOptions.skip?.(\n request,\n response,\n labels,\n );\n\n const requestContentLength = Number(\n request.headers['content-length'] ?? 0,\n );\n const responseContentLength = Number(\n response.getHeader('content-length') ?? 0,\n );\n\n if (!shouldSkipByRequest && !shouldSkipMetricsByEnvironment) {\n recordRequest(requestTiming, {\n labels,\n requestContentLength,\n responseContentLength,\n });\n }\n });\n\n next();\n };\n};\n\nexport {\n createMiddleware,\n exposeOnLocals,\n extractPath,\n getRequestRecorder,\n signalIsUp,\n signalIsNotUp,\n};\n"],"mappings":";;;AA8BA,MAAM,kBAAkB,EAAE,KAAK,KAAK,YAA2B;CAC7D,IAAI,KAAK,QACP,IAAI,OAAO,OAAO;AAEtB;AAEA,MAAM,eAAe,QAAiB,IAAI,eAAe,IAAI;AAE7D,IAAI;AACJ,IAAI;AAEJ,MAAM,2BAA2B;AACjC,MAAM,mBAAmB;CACvB,IAAI,CAAC,UACH;CAGF,KAAK,MAAM,gBAAgB,UACzB,aAAa,IAAI,CAAC;AAEtB;AAEA,MAAM,sBAAsB;CAC1B,IAAI,CAAC,UACH;CAGF,KAAK,MAAM,gBAAgB,UACzB,aAAa,IAAI,CAAC;AAEtB;AAcA,MAAM,oBACJ,EAAE,KAAK,YAAgC;CAAE,KAAK,KAAA;CAAW,SAAS,KAAA;AAAU,MACzE;CACH,MAAM,sBAEF,MACF,kBAAkB,gBAClB,gBAAgB,gBAChB,sBAAsB,gBAEtB,iBAAiB,gBACjBA,sBACA,OACF;CAEA,MAAM,iCACJ,yBAAyB,mBAAmB;CAE9C,MAAM,cAA4B,kBAAkB,mBAAmB;CACvE,MAAM,YAAwB,gBAAgB,mBAAmB;CACjE,MAAM,YAAY,iBAAiB,WAAW,mBAAmB;CAEjE,gBAAgB,sBAAsB,aAAa,mBAAmB;CACtE,WAAW,WAAW;CAEtB,eAAe;EAAE;EAAK,KAAK;EAAc,OAAOC;CAAW,CAAC;CAC5D,eAAe;EAAE;EAAK,KAAK;EAAiB,OAAO;CAAc,CAAC;CAElE,IAAI,CAAC,gCACH,UAAU;CAGZ,WAAW;CAEX,QAAQ,SAAkB,UAAoB,SAAuB;EACnE,MAAM,gBAAgBC,SAAO,MAAM;EAEnC,SAAS,GAAG,gBAAgB;GAC1B,MAAM,SAAS,OAAO,OACpB,CAAC,GACD;IACE,QAAQ,oBAAoB,gBAAgB,QAAQ,QAAQ;KAC1D,KAAK;KACL,KAAK;IACP,CAAC;IACD,aAAa,oBAAoB,oBAC/B,SAAS,YACT;KAAE,KAAK;KAAS,KAAK;IAAS,CAChC;IACA,MAAM,oBAAoB,cAAc,YAAY,OAAO,GAAG;KAC5D,KAAK;KACL,KAAK;IACP,CAAC;GACH,GACA,oBAAoB,iBAAiB,SAAS,QAAQ,CACxD;GAEA,MAAM,sBAAsB,oBAAoB,OAC9C,SACA,UACA,MACF;GAEA,MAAM,uBAAuB,OAC3B,QAAQ,QAAQ,qBAAqB,CACvC;GACA,MAAM,wBAAwB,OAC5B,SAAS,UAAU,gBAAgB,KAAK,CAC1C;GAEA,IAAI,CAAC,uBAAuB,CAAC,gCAC3B,cAAc,eAAe;IAC3B;IACA;IACA;GACF,CAAC;EAEL,CAAC;EAED,KAAK;CACP;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@promster/express",
3
- "version": "15.6.0",
3
+ "version": "15.7.0",
4
4
  "description": "Express server integrations of promster",
5
5
  "keywords": [
6
6
  "continousdelivery",
@@ -44,19 +44,19 @@
44
44
  "access": "public"
45
45
  },
46
46
  "dependencies": {
47
+ "@promster/metrics": "15.7.0",
47
48
  "merge-options": "3.0.4",
48
- "tslib": "2.8.1",
49
- "@promster/metrics": "15.6.0"
49
+ "tslib": "2.8.1"
50
50
  },
51
51
  "devDependencies": {
52
+ "@promster/server": "15.7.0",
53
+ "@promster/tsconfig": "15.7.0",
54
+ "@promster/tsdown-config": "15.7.0",
55
+ "@promster/types": "15.7.0",
52
56
  "@types/express": "5.0.6",
53
57
  "express": "5.2.1",
54
58
  "parse-prometheus-text-format": "1.1.1",
55
- "tsdown": "0.22.7",
56
- "@promster/server": "15.6.0",
57
- "@promster/tsconfig": "15.6.0",
58
- "@promster/tsdown-config": "15.6.0",
59
- "@promster/types": "15.6.0"
59
+ "tsdown": "0.22.14"
60
60
  },
61
61
  "engines": {
62
62
  "node": ">=20",