@nxtedition/lib 26.0.19 → 26.0.21

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 +32 -39
  2. package/package.json +1 -1
  3. package/serializers.js +11 -6
package/http.js CHANGED
@@ -74,14 +74,7 @@ export class Context {
74
74
  if (this.#req.target) {
75
75
  return this.#req.target
76
76
  }
77
-
78
- this.#target ??= Object.freeze(requestTarget(this.#req))
79
-
80
- if (!this.#target) {
81
- throw new createError.BadRequest('invalid url')
82
- }
83
-
84
- return this.#target
77
+ return (this.#target ??= Object.freeze(requestTarget(this.#req)))
85
78
  }
86
79
 
87
80
  get query() {
@@ -151,10 +144,11 @@ export async function upgradeMiddleware(ctx, next) {
151
144
  }
152
145
  })
153
146
 
147
+ const reqLogger = ctx.logger?.child({ req })
154
148
  try {
155
149
  const isHealthcheck = req.url === '/healthcheck' || req.url === '/_up'
156
150
  if (!isHealthcheck) {
157
- ctx.logger?.debug({ req }, 'request started')
151
+ reqLogger?.debug({ req }, 'request started')
158
152
  }
159
153
 
160
154
  const thenable = next()
@@ -172,15 +166,15 @@ export async function upgradeMiddleware(ctx, next) {
172
166
  if (isHealthcheck) {
173
167
  // Do nothing...
174
168
  } else if (socket.errored) {
175
- ctx.logger?.error({ err: socket.errored, req, socket, elapsedTime }, 'stream error')
169
+ reqLogger?.error({ err: socket.errored, req, socket, elapsedTime }, 'stream error')
176
170
  } else if (!socket.writableEnded) {
177
- ctx.logger?.debug({ socket, elapsedTime }, 'stream aborted')
171
+ reqLogger?.debug({ socket, elapsedTime }, 'stream aborted')
178
172
  } else if (socket.statusCode >= 500) {
179
- ctx.logger?.error({ socket, elapsedTime }, 'stream error')
173
+ reqLogger?.error({ socket, elapsedTime }, 'stream error')
180
174
  } else if (socket.statusCode >= 400) {
181
- ctx.logger?.warn({ socket, elapsedTime }, 'stream failed')
175
+ reqLogger?.warn({ socket, elapsedTime }, 'stream failed')
182
176
  } else {
183
- ctx.logger?.debug({ socket, elapsedTime }, 'stream completed')
177
+ reqLogger?.debug({ socket, elapsedTime }, 'stream completed')
184
178
  }
185
179
  } catch (err) {
186
180
  ctx[kAbortController]?.abort(err)
@@ -189,29 +183,34 @@ export async function upgradeMiddleware(ctx, next) {
189
183
  const elapsedTime = performance.now() - startTime
190
184
 
191
185
  if (req.aborted || aborted || (!socket.errored && socket.closed) || err.name === 'AbortError') {
192
- ctx.logger?.debug({ err, req, socket, elapsedTime }, 'stream aborted')
186
+ reqLogger?.debug({ err, req, socket, elapsedTime }, 'stream aborted')
193
187
  } else if (statusCode < 500) {
194
- ctx.logger?.warn({ err, req, socket, elapsedTime }, 'stream failed')
188
+ reqLogger?.warn({ err, req, socket, elapsedTime }, 'stream failed')
195
189
  } else {
196
- ctx.logger?.error({ err, req, socket, elapsedTime }, 'stream error')
190
+ reqLogger?.error({ err, req, socket, elapsedTime }, 'stream error')
197
191
  }
198
192
  socket.destroy(err)
199
193
  } finally {
200
194
  if (!socket.writableEnded && !socket.destroyed) {
201
195
  socket.destroy()
202
- ctx.logger?.warn('socket destroyed')
196
+ reqLogger?.warn('socket destroyed')
203
197
  }
204
198
  }
205
199
  }
206
200
 
207
201
  export async function requestMiddleware(ctx, next) {
208
- const { req, res } = ctx
202
+ const { req, res, target } = ctx
209
203
  const startTime = performance.now()
210
204
 
205
+ const reqLogger = ctx.logger?.child({ req })
211
206
  try {
212
207
  const isHealthcheck = req.url === '/healthcheck' || req.url === '/_up'
213
208
  if (!isHealthcheck) {
214
- ctx.logger?.debug({ req }, 'request started')
209
+ reqLogger?.debug({ req }, 'request started')
210
+ }
211
+
212
+ if (!target) {
213
+ throw new createError.BadRequest('invalid url')
215
214
  }
216
215
 
217
216
  if (ctx.id) {
@@ -257,15 +256,15 @@ export async function requestMiddleware(ctx, next) {
257
256
  if (isHealthcheck) {
258
257
  // Do nothing...
259
258
  } else if (res.errored) {
260
- ctx.logger?.error({ err: res.errored, res, elapsedTime }, 'request error')
259
+ reqLogger?.error({ err: res.errored, res, elapsedTime }, 'request error')
261
260
  } else if (!res.writableEnded) {
262
- ctx.logger?.debug({ res, elapsedTime }, 'request aborted')
261
+ reqLogger?.debug({ res, elapsedTime }, 'request aborted')
263
262
  } else if (res.statusCode >= 500) {
264
- ctx.logger?.error({ res, elapsedTime }, 'request error')
263
+ reqLogger?.error({ res, elapsedTime }, 'request error')
265
264
  } else if (res.statusCode >= 400) {
266
- ctx.logger?.warn({ res, elapsedTime }, 'request failed')
265
+ reqLogger?.warn({ res, elapsedTime }, 'request failed')
267
266
  } else {
268
- ctx.logger?.debug({ res, elapsedTime }, 'request completed')
267
+ reqLogger?.debug({ res, elapsedTime }, 'request completed')
269
268
  }
270
269
  } catch (err) {
271
270
  ctx[kAbortController]?.abort(err)
@@ -305,7 +304,7 @@ export async function requestMiddleware(ctx, next) {
305
304
  }
306
305
  }
307
306
  } else if (err.headers != null) {
308
- ctx.logger?.warn({ req, err }, 'invalid headers')
307
+ reqLogger?.warn({ req, err }, 'invalid headers')
309
308
  }
310
309
 
311
310
  if (fp.isPlainObject(err.body)) {
@@ -320,17 +319,17 @@ export async function requestMiddleware(ctx, next) {
320
319
  }
321
320
 
322
321
  if (statusCode < 500) {
323
- ctx.logger?.warn({ req, res, err, elapsedTime }, 'request failed')
322
+ reqLogger?.warn({ req, res, err, elapsedTime }, 'request failed')
324
323
  } else {
325
- ctx.logger?.error({ req, res, err, elapsedTime }, 'request error')
324
+ reqLogger?.error({ req, res, err, elapsedTime }, 'request error')
326
325
  }
327
326
  } else {
328
327
  if (req.aborted || (!res.errored && res.closed) || err.name === 'AbortError') {
329
- ctx.logger?.debug({ req, res, err, elapsedTime }, 'request aborted')
328
+ reqLogger?.debug({ req, res, err, elapsedTime }, 'request aborted')
330
329
  } else if (statusCode < 500) {
331
- ctx.logger?.warn({ req, res, err, elapsedTime }, 'request failed')
330
+ reqLogger?.warn({ req, res, err, elapsedTime }, 'request failed')
332
331
  } else {
333
- ctx.logger?.error({ req, res, err, elapsedTime }, 'request error')
332
+ reqLogger?.error({ req, res, err, elapsedTime }, 'request error')
334
333
  }
335
334
  res.destroy(err)
336
335
  }
@@ -370,13 +369,7 @@ export class IncomingMessage extends http.IncomingMessage {
370
369
  this.#target = undefined
371
370
  }
372
371
 
373
- this.#target ??= Object.freeze(requestTarget(this))
374
-
375
- if (!this.#target) {
376
- throw new createError.BadRequest('invalid url')
377
- }
378
-
379
- return this.#target
372
+ return (this.#target ??= Object.freeze(requestTarget(this)))
380
373
  }
381
374
 
382
375
  get query() {
@@ -618,7 +611,7 @@ export class Http2ServerRequest extends http2.Http2ServerRequest {
618
611
  this.#target = undefined
619
612
  }
620
613
 
621
- return (this.#target ??= requestTarget(this))
614
+ return (this.#target ??= Object.freeze(requestTarget(this)))
622
615
  }
623
616
 
624
617
  get query() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/lib",
3
- "version": "26.0.19",
3
+ "version": "26.0.21",
4
4
  "license": "MIT",
5
5
  "author": "Robert Nagy <robert.nagy@boffins.se>",
6
6
  "type": "module",
package/serializers.js CHANGED
@@ -83,12 +83,17 @@ function getTarget(obj) {
83
83
  if (!obj) {
84
84
  return undefined
85
85
  }
86
- if (obj.target) {
87
- return obj.target
88
- }
89
- if (typeof obj.url === 'string') {
90
- // TODO(fix): What if url is a full url?
91
- return requestTarget({ url: obj.url, headers: obj.headers ?? {}, socket: obj.socket })
86
+
87
+ try {
88
+ if (obj.target) {
89
+ return obj.target
90
+ }
91
+ if (typeof obj.url === 'string') {
92
+ // TODO(fix): What if url is a full url?
93
+ return requestTarget({ url: obj.url, headers: obj.headers ?? {}, socket: obj.socket })
94
+ }
95
+ } catch {
96
+ return undefined
92
97
  }
93
98
 
94
99
  // TODO(fix): What if url is instanceof URL?