@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.
- package/http.js +32 -39
- package/package.json +1 -1
- 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
|
-
|
|
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
|
-
|
|
169
|
+
reqLogger?.error({ err: socket.errored, req, socket, elapsedTime }, 'stream error')
|
|
176
170
|
} else if (!socket.writableEnded) {
|
|
177
|
-
|
|
171
|
+
reqLogger?.debug({ socket, elapsedTime }, 'stream aborted')
|
|
178
172
|
} else if (socket.statusCode >= 500) {
|
|
179
|
-
|
|
173
|
+
reqLogger?.error({ socket, elapsedTime }, 'stream error')
|
|
180
174
|
} else if (socket.statusCode >= 400) {
|
|
181
|
-
|
|
175
|
+
reqLogger?.warn({ socket, elapsedTime }, 'stream failed')
|
|
182
176
|
} else {
|
|
183
|
-
|
|
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
|
-
|
|
186
|
+
reqLogger?.debug({ err, req, socket, elapsedTime }, 'stream aborted')
|
|
193
187
|
} else if (statusCode < 500) {
|
|
194
|
-
|
|
188
|
+
reqLogger?.warn({ err, req, socket, elapsedTime }, 'stream failed')
|
|
195
189
|
} else {
|
|
196
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
259
|
+
reqLogger?.error({ err: res.errored, res, elapsedTime }, 'request error')
|
|
261
260
|
} else if (!res.writableEnded) {
|
|
262
|
-
|
|
261
|
+
reqLogger?.debug({ res, elapsedTime }, 'request aborted')
|
|
263
262
|
} else if (res.statusCode >= 500) {
|
|
264
|
-
|
|
263
|
+
reqLogger?.error({ res, elapsedTime }, 'request error')
|
|
265
264
|
} else if (res.statusCode >= 400) {
|
|
266
|
-
|
|
265
|
+
reqLogger?.warn({ res, elapsedTime }, 'request failed')
|
|
267
266
|
} else {
|
|
268
|
-
|
|
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
|
-
|
|
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
|
-
|
|
322
|
+
reqLogger?.warn({ req, res, err, elapsedTime }, 'request failed')
|
|
324
323
|
} else {
|
|
325
|
-
|
|
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
|
-
|
|
328
|
+
reqLogger?.debug({ req, res, err, elapsedTime }, 'request aborted')
|
|
330
329
|
} else if (statusCode < 500) {
|
|
331
|
-
|
|
330
|
+
reqLogger?.warn({ req, res, err, elapsedTime }, 'request failed')
|
|
332
331
|
} else {
|
|
333
|
-
|
|
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
package/serializers.js
CHANGED
|
@@ -83,12 +83,17 @@ function getTarget(obj) {
|
|
|
83
83
|
if (!obj) {
|
|
84
84
|
return undefined
|
|
85
85
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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?
|