@nxtedition/lib 22.0.0 → 22.0.2

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.
Files changed (3) hide show
  1. package/http.js +21 -15
  2. package/package.json +1 -1
  3. package/serializers.js +8 -1
package/http.js CHANGED
@@ -53,8 +53,6 @@ export class Context {
53
53
  this.#req = req
54
54
  this.#res = res
55
55
  this.#logger = logger.child({ reqId: this.#id, url: req.url, userAgent: this.#userAgent })
56
-
57
- res.setHeader('request-id', this.id)
58
56
  }
59
57
 
60
58
  get id() {
@@ -144,20 +142,28 @@ export async function requestMiddleware(ctx, next) {
144
142
  logger.debug({ req }, 'request started')
145
143
  }
146
144
 
145
+ if (ctx.id) {
146
+ res.setHeader('request-id', ctx.id)
147
+ }
148
+
147
149
  const thenable = next()
148
150
 
149
151
  if (thenable?.then) {
150
152
  await thenable
151
153
  }
152
154
 
153
- const elapsedTime = Math.ceil(performance.now() - startTime)
155
+ assert(res.destroyed, 'response not completed')
156
+
157
+ const elapsedTime = performance.now() - startTime
154
158
 
155
159
  if (isHealthcheck) {
156
160
  // Do nothing...
161
+ } else if (res.errored) {
162
+ logger.error({ err: res.errored, res, elapsedTime }, 'request error')
157
163
  } else if (!res.writableEnded) {
158
164
  logger.debug({ res, elapsedTime }, 'request aborted')
159
- } else if (res.statusCode >= 500 || res.errored) {
160
- logger.error({ err: res.errored, res, elapsedTime }, 'request error')
165
+ } else if (res.statusCode >= 500) {
166
+ logger.error({ res, elapsedTime }, 'request error')
161
167
  } else if (res.statusCode >= 400) {
162
168
  logger.warn({ res, elapsedTime }, 'request failed')
163
169
  } else {
@@ -167,21 +173,19 @@ export async function requestMiddleware(ctx, next) {
167
173
  ctx[kAbortController]?.abort(err)
168
174
 
169
175
  const statusCode = err.statusCode || err.$metadata?.httpStatusCode || 500
170
- const elapsedTime = Math.ceil(performance.now() - startTime)
176
+ const elapsedTime = performance.now() - startTime
171
177
 
172
- if (!res.headersSent && !res.destroyed) {
178
+ // res.destroyed is not properly set by http2 compat so we need to
179
+ // also check res.closed.
180
+ if (!res.headersSent && !res.destroyed && !res.closed) {
173
181
  res.statusCode = statusCode
174
182
 
175
- let reqId = ctx.id || req?.id || err.id
176
183
  for (const name of res.getHeaderNames()) {
177
- if (!reqId && name === 'request-id') {
178
- reqId = res.getHeader(name)
179
- }
180
184
  res.removeHeader(name)
181
185
  }
182
186
 
183
- if (reqId) {
184
- res.setHeader('request-id', reqId)
187
+ if (ctx.id) {
188
+ res.setHeader('request-id', ctx.id)
185
189
  }
186
190
 
187
191
  const { headers } = err
@@ -202,6 +206,8 @@ export async function requestMiddleware(ctx, next) {
202
206
  res.setHeader(key, val)
203
207
  }
204
208
  }
209
+ } else if (err.headers != null) {
210
+ logger.warn({ err }, 'invalid headers')
205
211
  }
206
212
 
207
213
  if (fp.isPlainObject(err.body)) {
@@ -291,7 +297,7 @@ export async function request(ctx, next) {
291
297
  await responsePromise
292
298
  }
293
299
 
294
- const elapsedTime = Math.ceil(performance.now() - startTime)
300
+ const elapsedTime = performance.now() - startTime
295
301
 
296
302
  if (isHealthcheck) {
297
303
  // Do nothing...
@@ -308,7 +314,7 @@ export async function request(ctx, next) {
308
314
  ac?.abort(err)
309
315
 
310
316
  const statusCode = err.statusCode || err.$metadata?.httpStatusCode || 500
311
- const elapsedTime = Math.ceil(performance.now() - startTime)
317
+ const elapsedTime = performance.now() - startTime
312
318
 
313
319
  if (!res.headersSent && !res.destroyed) {
314
320
  res.statusCode = statusCode
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/lib",
3
- "version": "22.0.0",
3
+ "version": "22.0.2",
4
4
  "license": "MIT",
5
5
  "author": "Robert Nagy <robert.nagy@boffins.se>",
6
6
  "type": "module",
package/serializers.js CHANGED
@@ -17,7 +17,8 @@ function getHeaders(obj) {
17
17
  return (
18
18
  (obj.headers?.entries && Object.fromEntries(obj.headers.entries())) ||
19
19
  obj.headers ||
20
- obj.getHeaders?.()
20
+ obj.getHeaders?.() ||
21
+ undefined
21
22
  )
22
23
  }
23
24
 
@@ -59,6 +60,9 @@ export default {
59
60
  : undefined),
60
61
  headers: getHeaders(res),
61
62
  headersSent: res.headersSent,
63
+ aborted: res.aborted,
64
+ closed: res.closed,
65
+ destroyed: res.destroyed,
62
66
  },
63
67
  req: (req) =>
64
68
  req && {
@@ -81,6 +85,9 @@ export default {
81
85
  : undefined),
82
86
  remoteAddress: req.socket?.remoteAddress,
83
87
  remotePort: req.socket?.remotePort,
88
+ aborted: req.aborted,
89
+ closed: req.closed,
90
+ destroyed: req.destroyed,
84
91
  },
85
92
  ures: (ures) =>
86
93
  ures && {