@promster/express 15.5.2 → 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
  };
@@ -94,7 +94,11 @@ const createMiddleware = ({ app, options } = {
94
94
  };
95
95
  //#endregion
96
96
  exports.Prometheus = _promster_metrics.Prometheus;
97
+ exports.createCounter = _promster_metrics.createCounter;
98
+ exports.createGauge = _promster_metrics.createGauge;
99
+ exports.createHistogram = _promster_metrics.createHistogram;
97
100
  exports.createMiddleware = createMiddleware;
101
+ exports.createSummary = _promster_metrics.createSummary;
98
102
  exports.defaultNormalizers = _promster_metrics.defaultNormalizers;
99
103
  exports.defaultRegister = _promster_metrics.defaultRegister;
100
104
  exports.getContentType = _promster_metrics.getContentType;
@@ -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
@@ -1,9 +1,8 @@
1
- import { Prometheus, TRequestRecorder, defaultNormalizers, defaultRegister, getContentType, getSummary, timing } from "@promster/metrics";
1
+ import { Prometheus, TRequestRecorder, createCounter, createGauge, createHistogram, createSummary, defaultNormalizers, defaultRegister, getContentType, getSummary, timing } from "@promster/metrics";
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
-
6
- //#region src/middleware/middleware.d.ts
5
+ //#region src/middleware.d.ts
7
6
  interface TApp extends Application {
8
7
  locals: Record<string, unknown>;
9
8
  }
@@ -18,10 +17,7 @@ type TMiddlewareOptions = {
18
17
  app?: TApp;
19
18
  options?: TPromsterOptions;
20
19
  };
21
- declare const createMiddleware: ({
22
- app,
23
- options
24
- }?: TMiddlewareOptions) => (request: Request, response: Response, next: NextFunction) => void;
20
+ declare const createMiddleware: ({ app, options }?: TMiddlewareOptions) => (request: Request, response: Response, next: NextFunction) => void;
25
21
  //#endregion
26
- export { Prometheus, type TPromsterOptions, createMiddleware, defaultNormalizers, defaultRegister, getContentType, getRequestRecorder, getSummary, signalIsNotUp, signalIsUp, timing };
22
+ export { Prometheus, type TPromsterOptions, createCounter, createGauge, createHistogram, createMiddleware, createSummary, defaultNormalizers, defaultRegister, getContentType, getRequestRecorder, getSummary, signalIsNotUp, signalIsUp, timing };
27
23
  //# sourceMappingURL=index.d.cts.map
package/dist/index.d.ts CHANGED
@@ -1,9 +1,8 @@
1
- import { Prometheus, Prometheus as Prometheus$1, TRequestRecorder, defaultNormalizers, defaultRegister, getContentType, getSummary, timing } from "@promster/metrics";
1
+ import { Prometheus, Prometheus as Prometheus$1, TRequestRecorder, createCounter, createGauge, createHistogram, createSummary, defaultNormalizers, defaultRegister, getContentType, getSummary, timing } from "@promster/metrics";
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
-
6
- //#region src/middleware/middleware.d.ts
5
+ //#region src/middleware.d.ts
7
6
  interface TApp extends Application {
8
7
  locals: Record<string, unknown>;
9
8
  }
@@ -18,10 +17,7 @@ type TMiddlewareOptions = {
18
17
  app?: TApp;
19
18
  options?: TPromsterOptions;
20
19
  };
21
- declare const createMiddleware: ({
22
- app,
23
- options
24
- }?: TMiddlewareOptions) => (request: Request, response: Response, next: NextFunction) => void;
20
+ declare const createMiddleware: ({ app, options }?: TMiddlewareOptions) => (request: Request, response: Response, next: NextFunction) => void;
25
21
  //#endregion
26
- export { Prometheus, type TPromsterOptions, createMiddleware, defaultNormalizers, defaultRegister, getContentType, getRequestRecorder, getSummary, signalIsNotUp, signalIsUp, timing };
22
+ export { Prometheus, type TPromsterOptions, createCounter, createGauge, createHistogram, createMiddleware, createSummary, defaultNormalizers, defaultRegister, getContentType, getRequestRecorder, getSummary, signalIsNotUp, signalIsUp, timing };
27
23
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import { Prometheus, Prometheus as Prometheus$1, createGcMetrics, createGcObserver, createHttpMetrics, createRequestRecorder, defaultNormalizers, defaultNormalizers as defaultNormalizers$1, defaultRegister, getContentType, getSummary, skipMetricsInEnvironment, timing, timing as timing$1 } from "@promster/metrics";
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
  };
@@ -69,6 +69,6 @@ const createMiddleware = ({ app, options } = {
69
69
  };
70
70
  };
71
71
  //#endregion
72
- export { Prometheus, createMiddleware, defaultNormalizers, defaultRegister, getContentType, getRequestRecorder, getSummary, signalIsNotUp, signalIsUp, timing };
72
+ export { Prometheus, createCounter, createGauge, createHistogram, createMiddleware, createSummary, defaultNormalizers, defaultRegister, getContentType, getRequestRecorder, getSummary, signalIsNotUp, signalIsUp, timing };
73
73
 
74
74
  //# sourceMappingURL=index.js.map
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.5.2",
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.5.2"
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.2",
56
- "@promster/server": "15.5.2",
57
- "@promster/tsconfig": "15.5.2",
58
- "@promster/tsdown-config": "15.5.2",
59
- "@promster/types": "15.5.2"
59
+ "tsdown": "0.22.14"
60
60
  },
61
61
  "engines": {
62
62
  "node": ">=20",