@nxtedition/lib 22.0.0 → 22.0.1
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 +21 -15
- package/package.json +1 -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
|
-
|
|
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
|
|
160
|
-
logger.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 =
|
|
176
|
+
const elapsedTime = performance.now() - startTime
|
|
171
177
|
|
|
172
|
-
|
|
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 (
|
|
184
|
-
res.setHeader('request-id',
|
|
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 =
|
|
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 =
|
|
317
|
+
const elapsedTime = performance.now() - startTime
|
|
312
318
|
|
|
313
319
|
if (!res.headersSent && !res.destroyed) {
|
|
314
320
|
res.statusCode = statusCode
|