@promster/hapi 8.0.5 → 9.0.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.
@@ -2,5 +2,5 @@ import type { TPromsterOptions } from '@promster/types';
2
2
  import type { Server } from '@hapi/hapi';
3
3
  import { createPlugin, getRequestRecorder, signalIsUp, signalIsNotUp } from './plugin';
4
4
  import { getSummary, getContentType, Prometheus, defaultRegister, defaultNormalizers, timing } from '@promster/metrics';
5
- declare const instrument: (server: Server, options: TPromsterOptions) => Promise<void>;
5
+ declare const instrument: (server: Server, options: TPromsterOptions) => Promise<Server<import("@hapi/hapi").ServerApplicationState> & void>;
6
6
  export { createPlugin, getRequestRecorder, signalIsUp, signalIsNotUp, getSummary, getContentType, Prometheus, defaultRegister, defaultNormalizers, instrument, timing, };
@@ -8,5 +8,5 @@ declare const getAreServerEventsSupported: (actualVersion: string) => boolean;
8
8
  declare const getDoesResponseNeedInvocation: (actualVersion: string) => boolean;
9
9
  declare const createPlugin: ({ options: pluginOptions, }?: {
10
10
  options?: TPromsterOptions;
11
- }) => Plugin<unknown>;
11
+ }) => Plugin<unknown, void>;
12
12
  export { createPlugin, getRequestRecorder, signalIsUp, signalIsNotUp, getAreServerEventsSupported, getDoesResponseNeedInvocation, };
@@ -13,7 +13,7 @@ var merge__default = /*#__PURE__*/_interopDefault(merge);
13
13
 
14
14
  var pkg = {
15
15
  name: "@promster/hapi",
16
- version: "8.0.5",
16
+ version: "9.0.0",
17
17
  description: "Hapi server integrations of promster",
18
18
  main: "dist/promster-hapi.cjs.js",
19
19
  typings: "dist/promster-hapi.cjs.d.ts",
@@ -29,8 +29,8 @@ var pkg = {
29
29
  access: "public"
30
30
  },
31
31
  engines: {
32
- node: ">=14",
33
- npm: ">=6"
32
+ node: ">=16",
33
+ npm: ">=8"
34
34
  },
35
35
  repository: {
36
36
  type: "git",
@@ -49,69 +49,58 @@ var pkg = {
49
49
  "prometheus"
50
50
  ],
51
51
  dependencies: {
52
- "@promster/metrics": "^9.1.5",
52
+ "@promster/metrics": "^10.0.0",
53
53
  "merge-options": "3.0.4",
54
- semver: "7.3.5",
55
- tslib: "2.3.1"
54
+ semver: "7.5.4",
55
+ tslib: "2.4.1"
56
56
  },
57
57
  devDependencies: {
58
- "@hapi/boom": "9.1.4",
59
- "@hapi/hapi": "20.2.1",
60
- "@promster/types": "^3.2.4",
61
- "@types/hapi__hapi": "20.0.10",
62
- "parse-prometheus-text-format": "1.1.1"
58
+ "@hapi/boom": "10.0.1",
59
+ "@hapi/hapi": "21.3.2",
60
+ "@promster/types": "^4.0.0",
61
+ "@types/hapi__hapi": "20.0.13",
62
+ "parse-prometheus-text-format": "1.1.1",
63
+ "@promster/server": "workspace:*"
63
64
  }
64
65
  };
65
66
 
66
- const extractPath = request => request.route.path.replace(/\?/g, '');
67
+ // eslint-disable-next-line @typescript-eslint/consistent-type-definitions
67
68
 
69
+ const extractPath = request => request.route.path.replace(/\?/g, '');
68
70
  const isBoomResponse = response => response.isBoom;
69
-
70
71
  const extractStatusCode = request => {
71
72
  const {
72
73
  response
73
74
  } = request;
74
-
75
75
  if (!response) {
76
76
  return 0;
77
77
  }
78
-
79
78
  if (isBoomResponse(response)) {
80
79
  return response.output.statusCode;
81
80
  }
82
-
83
81
  return response.statusCode;
84
82
  };
85
-
86
83
  let recordRequest;
87
84
  let upMetric;
88
-
89
85
  const getRequestRecorder = () => recordRequest;
90
-
91
86
  const signalIsUp = () => {
92
87
  if (!upMetric) {
93
88
  return;
94
89
  }
95
-
96
90
  upMetric.forEach(upMetricType => {
97
91
  upMetricType.set(1);
98
92
  });
99
93
  };
100
-
101
94
  const signalIsNotUp = () => {
102
95
  if (!upMetric) {
103
96
  return;
104
97
  }
105
-
106
98
  upMetric.forEach(upMetricType => {
107
99
  upMetricType.set(0);
108
100
  });
109
101
  };
110
-
111
102
  const getAreServerEventsSupported = actualVersion => Boolean(actualVersion && semver__default["default"].satisfies(actualVersion, '>= 17.0.0'));
112
-
113
103
  const getDoesResponseNeedInvocation = actualVersion => Boolean(actualVersion && semver__default["default"].satisfies(actualVersion, '< 17.0.0'));
114
-
115
104
  const createPlugin = ({
116
105
  options: pluginOptions
117
106
  } = {
@@ -124,31 +113,25 @@ const createPlugin = ({
124
113
  const observeGc = metrics.createGcObserver(gcMetrics, allDefaultedOptions);
125
114
  recordRequest = metrics.createRequestRecorder(httpMetrics, allDefaultedOptions);
126
115
  upMetric = gcMetrics === null || gcMetrics === void 0 ? void 0 : gcMetrics.up;
127
-
128
116
  if (!shouldSkipMetricsByEnvironment) {
129
117
  observeGc();
130
118
  }
131
-
132
119
  const plugin = {
133
120
  name: pkg.name,
134
121
  version: pkg.version,
135
-
136
122
  // @ts-expect-error
137
123
  register(server, _registrationOptions, onRegistrationFinished = () => null) {
138
124
  const areServerEventsSupported = getAreServerEventsSupported(server.version);
139
125
  const doesResponseNeedInvocation = getDoesResponseNeedInvocation(server.version);
140
-
141
126
  const onRequestHandler = (request, h) => {
142
127
  request.plugins.promster = {
143
128
  timing: metrics.timing.start()
144
- }; // @ts-expect-error
145
-
129
+ };
130
+ // @ts-expect-error
146
131
  return doesResponseNeedInvocation ? h.continue() : h.continue;
147
132
  };
148
-
149
133
  const onResponseHandler = (request, response) => {
150
- var _allDefaultedOptions$, _request$headers$cont, _request$headers, _request$response$hea, _request$response, _request$response$hea2, _allDefaultedOptions$2;
151
-
134
+ var _allDefaultedOptions$, _request$headers$cont, _request$headers, _request$response$hea, _request$response, _allDefaultedOptions$2;
152
135
  const labels = Object.assign({}, {
153
136
  path: allDefaultedOptions.normalizePath(extractPath(request), {
154
137
  req: request,
@@ -163,11 +146,10 @@ const createPlugin = ({
163
146
  res: response
164
147
  })
165
148
  }, (_allDefaultedOptions$ = allDefaultedOptions.getLabelValues) === null || _allDefaultedOptions$ === void 0 ? void 0 : _allDefaultedOptions$.call(allDefaultedOptions, request, {}));
166
- const requestContentLength = Number((_request$headers$cont = request === null || request === void 0 ? void 0 : (_request$headers = request.headers) === null || _request$headers === void 0 ? void 0 : _request$headers['content-length']) !== null && _request$headers$cont !== void 0 ? _request$headers$cont : 0);
149
+ const requestContentLength = Number((_request$headers$cont = request === null || request === void 0 || (_request$headers = request.headers) === null || _request$headers === void 0 ? void 0 : _request$headers['content-length']) !== null && _request$headers$cont !== void 0 ? _request$headers$cont : 0);
167
150
  const responseContentLength = Number( // @ts-expect-error
168
- (_request$response$hea = request === null || request === void 0 ? void 0 : (_request$response = request.response) === null || _request$response === void 0 ? void 0 : (_request$response$hea2 = _request$response.headers) === null || _request$response$hea2 === void 0 ? void 0 : _request$response$hea2['content-length']) !== null && _request$response$hea !== void 0 ? _request$response$hea : 0);
151
+ (_request$response$hea = request === null || request === void 0 || (_request$response = request.response) === null || _request$response === void 0 || (_request$response = _request$response.headers) === null || _request$response === void 0 ? void 0 : _request$response['content-length']) !== null && _request$response$hea !== void 0 ? _request$response$hea : 0);
169
152
  const shouldSkipByRequest = (_allDefaultedOptions$2 = allDefaultedOptions.skip) === null || _allDefaultedOptions$2 === void 0 ? void 0 : _allDefaultedOptions$2.call(allDefaultedOptions, request, response, labels);
170
-
171
153
  if (!shouldSkipByRequest && !shouldSkipMetricsByEnvironment) {
172
154
  recordRequest(request.plugins.promster.timing, {
173
155
  labels,
@@ -175,34 +157,32 @@ const createPlugin = ({
175
157
  responseContentLength
176
158
  });
177
159
  }
178
-
179
160
  if (doesResponseNeedInvocation) response.continue();
180
- }; // NOTE: This version detection allows us to gracefully support both new and old Hapi APIs.
181
- // This is very hard to type as we would have to import two aliased versions of types.
182
-
161
+ };
183
162
 
163
+ // NOTE: This version detection allows us to gracefully support both new and old Hapi APIs.
164
+ // This is very hard to type as we would have to import two aliased versions of types.
184
165
  if (areServerEventsSupported) {
185
166
  // @ts-expect-error
186
- server.ext('onRequest', onRequestHandler); // @ts-expect-error
187
-
167
+ server.ext('onRequest', onRequestHandler);
168
+ // @ts-expect-error
188
169
  server.events.on('response', onResponseHandler);
189
170
  } else {
190
171
  // @ts-expect-error
191
- server.ext('onRequest', onRequestHandler); // @ts-expect-error
192
-
172
+ server.ext('onRequest', onRequestHandler);
173
+ // @ts-expect-error
193
174
  server.ext('onPreResponse', onResponseHandler);
194
- } // NOTE: The type of the server.decorate only supports a function signature,
175
+ }
176
+
177
+ // NOTE: The type of the server.decorate only supports a function signature,
195
178
  // even when the docs state that it can also be "other value" in the case of `server`.
196
179
  // @ts-expect-error
197
-
198
-
199
180
  server.decorate('server', 'Prometheus', metrics.Prometheus);
200
181
  server.decorate('server', 'recordRequest', recordRequest);
201
182
  return onRegistrationFinished === null || onRegistrationFinished === void 0 ? void 0 : onRegistrationFinished();
202
183
  }
203
-
204
- }; // @ts-expect-error
205
-
184
+ };
185
+ // @ts-expect-error
206
186
  plugin.register.attributes = {
207
187
  pkg
208
188
  };
@@ -13,7 +13,7 @@ var merge__default = /*#__PURE__*/_interopDefault(merge);
13
13
 
14
14
  var pkg = {
15
15
  name: "@promster/hapi",
16
- version: "8.0.5",
16
+ version: "9.0.0",
17
17
  description: "Hapi server integrations of promster",
18
18
  main: "dist/promster-hapi.cjs.js",
19
19
  typings: "dist/promster-hapi.cjs.d.ts",
@@ -29,8 +29,8 @@ var pkg = {
29
29
  access: "public"
30
30
  },
31
31
  engines: {
32
- node: ">=14",
33
- npm: ">=6"
32
+ node: ">=16",
33
+ npm: ">=8"
34
34
  },
35
35
  repository: {
36
36
  type: "git",
@@ -49,69 +49,58 @@ var pkg = {
49
49
  "prometheus"
50
50
  ],
51
51
  dependencies: {
52
- "@promster/metrics": "^9.1.5",
52
+ "@promster/metrics": "^10.0.0",
53
53
  "merge-options": "3.0.4",
54
- semver: "7.3.5",
55
- tslib: "2.3.1"
54
+ semver: "7.5.4",
55
+ tslib: "2.4.1"
56
56
  },
57
57
  devDependencies: {
58
- "@hapi/boom": "9.1.4",
59
- "@hapi/hapi": "20.2.1",
60
- "@promster/types": "^3.2.4",
61
- "@types/hapi__hapi": "20.0.10",
62
- "parse-prometheus-text-format": "1.1.1"
58
+ "@hapi/boom": "10.0.1",
59
+ "@hapi/hapi": "21.3.2",
60
+ "@promster/types": "^4.0.0",
61
+ "@types/hapi__hapi": "20.0.13",
62
+ "parse-prometheus-text-format": "1.1.1",
63
+ "@promster/server": "workspace:*"
63
64
  }
64
65
  };
65
66
 
66
- const extractPath = request => request.route.path.replace(/\?/g, '');
67
+ // eslint-disable-next-line @typescript-eslint/consistent-type-definitions
67
68
 
69
+ const extractPath = request => request.route.path.replace(/\?/g, '');
68
70
  const isBoomResponse = response => response.isBoom;
69
-
70
71
  const extractStatusCode = request => {
71
72
  const {
72
73
  response
73
74
  } = request;
74
-
75
75
  if (!response) {
76
76
  return 0;
77
77
  }
78
-
79
78
  if (isBoomResponse(response)) {
80
79
  return response.output.statusCode;
81
80
  }
82
-
83
81
  return response.statusCode;
84
82
  };
85
-
86
83
  let recordRequest;
87
84
  let upMetric;
88
-
89
85
  const getRequestRecorder = () => recordRequest;
90
-
91
86
  const signalIsUp = () => {
92
87
  if (!upMetric) {
93
88
  return;
94
89
  }
95
-
96
90
  upMetric.forEach(upMetricType => {
97
91
  upMetricType.set(1);
98
92
  });
99
93
  };
100
-
101
94
  const signalIsNotUp = () => {
102
95
  if (!upMetric) {
103
96
  return;
104
97
  }
105
-
106
98
  upMetric.forEach(upMetricType => {
107
99
  upMetricType.set(0);
108
100
  });
109
101
  };
110
-
111
102
  const getAreServerEventsSupported = actualVersion => Boolean(actualVersion && semver__default["default"].satisfies(actualVersion, '>= 17.0.0'));
112
-
113
103
  const getDoesResponseNeedInvocation = actualVersion => Boolean(actualVersion && semver__default["default"].satisfies(actualVersion, '< 17.0.0'));
114
-
115
104
  const createPlugin = ({
116
105
  options: pluginOptions
117
106
  } = {
@@ -124,31 +113,25 @@ const createPlugin = ({
124
113
  const observeGc = metrics.createGcObserver(gcMetrics, allDefaultedOptions);
125
114
  recordRequest = metrics.createRequestRecorder(httpMetrics, allDefaultedOptions);
126
115
  upMetric = gcMetrics === null || gcMetrics === void 0 ? void 0 : gcMetrics.up;
127
-
128
116
  if (!shouldSkipMetricsByEnvironment) {
129
117
  observeGc();
130
118
  }
131
-
132
119
  const plugin = {
133
120
  name: pkg.name,
134
121
  version: pkg.version,
135
-
136
122
  // @ts-expect-error
137
123
  register(server, _registrationOptions, onRegistrationFinished = () => null) {
138
124
  const areServerEventsSupported = getAreServerEventsSupported(server.version);
139
125
  const doesResponseNeedInvocation = getDoesResponseNeedInvocation(server.version);
140
-
141
126
  const onRequestHandler = (request, h) => {
142
127
  request.plugins.promster = {
143
128
  timing: metrics.timing.start()
144
- }; // @ts-expect-error
145
-
129
+ };
130
+ // @ts-expect-error
146
131
  return doesResponseNeedInvocation ? h.continue() : h.continue;
147
132
  };
148
-
149
133
  const onResponseHandler = (request, response) => {
150
- var _allDefaultedOptions$, _request$headers$cont, _request$headers, _request$response$hea, _request$response, _request$response$hea2, _allDefaultedOptions$2;
151
-
134
+ var _allDefaultedOptions$, _request$headers$cont, _request$headers, _request$response$hea, _request$response, _allDefaultedOptions$2;
152
135
  const labels = Object.assign({}, {
153
136
  path: allDefaultedOptions.normalizePath(extractPath(request), {
154
137
  req: request,
@@ -163,11 +146,10 @@ const createPlugin = ({
163
146
  res: response
164
147
  })
165
148
  }, (_allDefaultedOptions$ = allDefaultedOptions.getLabelValues) === null || _allDefaultedOptions$ === void 0 ? void 0 : _allDefaultedOptions$.call(allDefaultedOptions, request, {}));
166
- const requestContentLength = Number((_request$headers$cont = request === null || request === void 0 ? void 0 : (_request$headers = request.headers) === null || _request$headers === void 0 ? void 0 : _request$headers['content-length']) !== null && _request$headers$cont !== void 0 ? _request$headers$cont : 0);
149
+ const requestContentLength = Number((_request$headers$cont = request === null || request === void 0 || (_request$headers = request.headers) === null || _request$headers === void 0 ? void 0 : _request$headers['content-length']) !== null && _request$headers$cont !== void 0 ? _request$headers$cont : 0);
167
150
  const responseContentLength = Number( // @ts-expect-error
168
- (_request$response$hea = request === null || request === void 0 ? void 0 : (_request$response = request.response) === null || _request$response === void 0 ? void 0 : (_request$response$hea2 = _request$response.headers) === null || _request$response$hea2 === void 0 ? void 0 : _request$response$hea2['content-length']) !== null && _request$response$hea !== void 0 ? _request$response$hea : 0);
151
+ (_request$response$hea = request === null || request === void 0 || (_request$response = request.response) === null || _request$response === void 0 || (_request$response = _request$response.headers) === null || _request$response === void 0 ? void 0 : _request$response['content-length']) !== null && _request$response$hea !== void 0 ? _request$response$hea : 0);
169
152
  const shouldSkipByRequest = (_allDefaultedOptions$2 = allDefaultedOptions.skip) === null || _allDefaultedOptions$2 === void 0 ? void 0 : _allDefaultedOptions$2.call(allDefaultedOptions, request, response, labels);
170
-
171
153
  if (!shouldSkipByRequest && !shouldSkipMetricsByEnvironment) {
172
154
  recordRequest(request.plugins.promster.timing, {
173
155
  labels,
@@ -175,34 +157,32 @@ const createPlugin = ({
175
157
  responseContentLength
176
158
  });
177
159
  }
178
-
179
160
  if (doesResponseNeedInvocation) response.continue();
180
- }; // NOTE: This version detection allows us to gracefully support both new and old Hapi APIs.
181
- // This is very hard to type as we would have to import two aliased versions of types.
182
-
161
+ };
183
162
 
163
+ // NOTE: This version detection allows us to gracefully support both new and old Hapi APIs.
164
+ // This is very hard to type as we would have to import two aliased versions of types.
184
165
  if (areServerEventsSupported) {
185
166
  // @ts-expect-error
186
- server.ext('onRequest', onRequestHandler); // @ts-expect-error
187
-
167
+ server.ext('onRequest', onRequestHandler);
168
+ // @ts-expect-error
188
169
  server.events.on('response', onResponseHandler);
189
170
  } else {
190
171
  // @ts-expect-error
191
- server.ext('onRequest', onRequestHandler); // @ts-expect-error
192
-
172
+ server.ext('onRequest', onRequestHandler);
173
+ // @ts-expect-error
193
174
  server.ext('onPreResponse', onResponseHandler);
194
- } // NOTE: The type of the server.decorate only supports a function signature,
175
+ }
176
+
177
+ // NOTE: The type of the server.decorate only supports a function signature,
195
178
  // even when the docs state that it can also be "other value" in the case of `server`.
196
179
  // @ts-expect-error
197
-
198
-
199
180
  server.decorate('server', 'Prometheus', metrics.Prometheus);
200
181
  server.decorate('server', 'recordRequest', recordRequest);
201
182
  return onRegistrationFinished === null || onRegistrationFinished === void 0 ? void 0 : onRegistrationFinished();
202
183
  }
203
-
204
- }; // @ts-expect-error
205
-
184
+ };
185
+ // @ts-expect-error
206
186
  plugin.register.attributes = {
207
187
  pkg
208
188
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@promster/hapi",
3
- "version": "8.0.5",
3
+ "version": "9.0.0",
4
4
  "description": "Hapi server integrations of promster",
5
5
  "main": "dist/promster-hapi.cjs.js",
6
6
  "typings": "dist/promster-hapi.cjs.d.ts",
@@ -16,8 +16,8 @@
16
16
  "access": "public"
17
17
  },
18
18
  "engines": {
19
- "node": ">=14",
20
- "npm": ">=6"
19
+ "node": ">=16",
20
+ "npm": ">=8"
21
21
  },
22
22
  "repository": {
23
23
  "type": "git",
@@ -36,16 +36,17 @@
36
36
  "prometheus"
37
37
  ],
38
38
  "dependencies": {
39
- "@promster/metrics": "^9.1.5",
39
+ "@promster/metrics": "^10.0.0",
40
40
  "merge-options": "3.0.4",
41
- "semver": "7.3.5",
42
- "tslib": "2.3.1"
41
+ "semver": "7.5.4",
42
+ "tslib": "2.4.1"
43
43
  },
44
44
  "devDependencies": {
45
- "@hapi/boom": "9.1.4",
46
- "@hapi/hapi": "20.2.1",
47
- "@promster/types": "^3.2.4",
48
- "@types/hapi__hapi": "20.0.10",
49
- "parse-prometheus-text-format": "1.1.1"
45
+ "@hapi/boom": "10.0.1",
46
+ "@hapi/hapi": "21.3.2",
47
+ "@promster/types": "^4.0.0",
48
+ "@types/hapi__hapi": "20.0.13",
49
+ "parse-prometheus-text-format": "1.1.1",
50
+ "@promster/server": "8.0.0"
50
51
  }
51
- }
52
+ }