@nxtedition/lib 21.2.2 → 21.3.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.
- package/couch.js +5 -1
- package/http.js +44 -22
- package/package.json +1 -1
package/couch.js
CHANGED
|
@@ -117,6 +117,7 @@ export function makeCouch(opts) {
|
|
|
117
117
|
* @param {number} [options.heartbeat=60000] - The interval at which to send a heartbeat.
|
|
118
118
|
* @param {function} [options.retry=null] - The function to retry the request on error.
|
|
119
119
|
* @param {string} [options.since=null] - The sequence number to start from.
|
|
120
|
+
* @param {string} [options.highWaterMark=128 * 1024] - Buffering.
|
|
120
121
|
* @yields {Array<{ id: string, seq?: string, doc?: Object, deleted?: boolean, changes: Array<{ rev: string }> }>}
|
|
121
122
|
*/
|
|
122
123
|
async function* changes({ client = defaultClient, signal = null, logger, ...options } = {}) {
|
|
@@ -207,6 +208,7 @@ export function makeCouch(opts) {
|
|
|
207
208
|
}
|
|
208
209
|
}
|
|
209
210
|
|
|
211
|
+
const highWaterMark = options.highWaterMark
|
|
210
212
|
const live = options.live == null || !!options.live
|
|
211
213
|
const retry =
|
|
212
214
|
options.retry ??
|
|
@@ -220,6 +222,7 @@ export function makeCouch(opts) {
|
|
|
220
222
|
method,
|
|
221
223
|
live,
|
|
222
224
|
retry,
|
|
225
|
+
highWaterMark,
|
|
223
226
|
params,
|
|
224
227
|
body,
|
|
225
228
|
signal: ac.signal,
|
|
@@ -245,6 +248,7 @@ export function makeCouch(opts) {
|
|
|
245
248
|
body,
|
|
246
249
|
signal,
|
|
247
250
|
client,
|
|
251
|
+
highWaterMark = 128 * 1024,
|
|
248
252
|
blocking = live || !params.limit || params.limit > 256,
|
|
249
253
|
}) {
|
|
250
254
|
let retryCount = 0
|
|
@@ -270,7 +274,7 @@ export function makeCouch(opts) {
|
|
|
270
274
|
signal,
|
|
271
275
|
headersTimeout: 2 * 60e3,
|
|
272
276
|
bodyTimeout: 2 * (params.heartbeat || 60e3),
|
|
273
|
-
highWaterMark
|
|
277
|
+
highWaterMark,
|
|
274
278
|
dispatcher: client,
|
|
275
279
|
}
|
|
276
280
|
|
package/http.js
CHANGED
|
@@ -116,7 +116,9 @@ export async function request2(ctx, next) {
|
|
|
116
116
|
|
|
117
117
|
const isHealthcheck = req.url === '/healthcheck' || req.url === '/_up'
|
|
118
118
|
|
|
119
|
-
if (
|
|
119
|
+
if (isHealthcheck) {
|
|
120
|
+
// Do nothing...
|
|
121
|
+
} else {
|
|
120
122
|
logger.debug({ req }, 'request started')
|
|
121
123
|
}
|
|
122
124
|
|
|
@@ -143,12 +145,12 @@ export async function request2(ctx, next) {
|
|
|
143
145
|
ctx[kAbortController]?.abort(err)
|
|
144
146
|
|
|
145
147
|
const statusCode = err.statusCode || err.$metadata?.httpStatusCode || 500
|
|
146
|
-
const
|
|
148
|
+
const elapsedTime = Math.ceil(performance.now() - startTime)
|
|
147
149
|
|
|
148
150
|
if (!res.headersSent && !res.destroyed) {
|
|
149
151
|
res.statusCode = statusCode
|
|
150
152
|
|
|
151
|
-
let reqId = req?.id || err.id
|
|
153
|
+
let reqId = ctx.id || req?.id || err.id
|
|
152
154
|
for (const name of res.getHeaderNames()) {
|
|
153
155
|
if (!reqId && name === 'request-id') {
|
|
154
156
|
reqId = res.getHeader(name)
|
|
@@ -160,8 +162,20 @@ export async function request2(ctx, next) {
|
|
|
160
162
|
res.setHeader('request-id', reqId)
|
|
161
163
|
}
|
|
162
164
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
+
const { headers } = err
|
|
166
|
+
|
|
167
|
+
if (fp.isPlainObject(headers)) {
|
|
168
|
+
for (const [key, val] of Object.entries(headers)) {
|
|
169
|
+
if (!ERR_HEADER_EXPR.test(key)) {
|
|
170
|
+
res.setHeader(key, val)
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
} else if (Array.isArray(err.headers)) {
|
|
174
|
+
assert(headers.length % 2 === 0)
|
|
175
|
+
assert(headers.length === 0 || typeof headers[0] === 'string')
|
|
176
|
+
for (let n = 0; n < headers.length; n += 2) {
|
|
177
|
+
const key = headers[n + 0]
|
|
178
|
+
const val = headers[n + 1]
|
|
165
179
|
if (!ERR_HEADER_EXPR.test(key)) {
|
|
166
180
|
res.setHeader(key, val)
|
|
167
181
|
}
|
|
@@ -170,23 +184,27 @@ export async function request2(ctx, next) {
|
|
|
170
184
|
|
|
171
185
|
if (fp.isPlainObject(err.body)) {
|
|
172
186
|
res.setHeader('content-type', 'application/json')
|
|
173
|
-
res.
|
|
187
|
+
res.end(JSON.stringify(err.body))
|
|
188
|
+
} else if (typeof err.body === 'string') {
|
|
189
|
+
res.end(err.body)
|
|
190
|
+
} else if (Buffer.isBuffer(err.body)) {
|
|
191
|
+
res.end(err.body)
|
|
192
|
+
} else {
|
|
193
|
+
res.end()
|
|
174
194
|
}
|
|
175
195
|
|
|
176
196
|
if (statusCode < 500) {
|
|
177
|
-
logger.warn({ req, res, err,
|
|
197
|
+
logger.warn({ req, res, err, elapsedTime }, 'request failed')
|
|
178
198
|
} else {
|
|
179
|
-
logger.error({ req, res, err,
|
|
199
|
+
logger.error({ req, res, err, elapsedTime }, 'request error')
|
|
180
200
|
}
|
|
181
|
-
|
|
182
|
-
res.end()
|
|
183
201
|
} else {
|
|
184
202
|
if (req.aborted || !res.writableEnded || err.name === 'AbortError') {
|
|
185
|
-
logger.debug({ req, res, err,
|
|
203
|
+
logger.debug({ req, res, err, elapsedTime }, 'request aborted')
|
|
186
204
|
} else if (statusCode < 500) {
|
|
187
|
-
logger.warn({ req, res, err,
|
|
205
|
+
logger.warn({ req, res, err, elapsedTime }, 'request failed')
|
|
188
206
|
} else {
|
|
189
|
-
logger.error({ req, res, err,
|
|
207
|
+
logger.error({ req, res, err, elapsedTime }, 'request error')
|
|
190
208
|
}
|
|
191
209
|
|
|
192
210
|
if (!res.writableEnded) {
|
|
@@ -259,7 +277,7 @@ export async function request(ctx, next) {
|
|
|
259
277
|
ac?.abort(err)
|
|
260
278
|
|
|
261
279
|
const statusCode = err.statusCode || err.$metadata?.httpStatusCode || 500
|
|
262
|
-
const
|
|
280
|
+
const elapsedTime = Math.ceil(performance.now() - startTime)
|
|
263
281
|
|
|
264
282
|
if (!res.headersSent && !res.destroyed) {
|
|
265
283
|
res.statusCode = statusCode
|
|
@@ -286,23 +304,27 @@ export async function request(ctx, next) {
|
|
|
286
304
|
|
|
287
305
|
if (fp.isPlainObject(err.body)) {
|
|
288
306
|
res.setHeader('content-type', 'application/json')
|
|
289
|
-
res.
|
|
307
|
+
res.end(JSON.stringify(err.body))
|
|
308
|
+
} else if (typeof err.body === 'string') {
|
|
309
|
+
res.end(err.body)
|
|
310
|
+
} else if (Buffer.isBuffer(err.body)) {
|
|
311
|
+
res.end(err.body)
|
|
312
|
+
} else {
|
|
313
|
+
res.end()
|
|
290
314
|
}
|
|
291
315
|
|
|
292
316
|
if (statusCode < 500) {
|
|
293
|
-
reqLogger.warn({ res, err,
|
|
317
|
+
reqLogger.warn({ res, err, elapsedTime }, 'request failed')
|
|
294
318
|
} else {
|
|
295
|
-
reqLogger.error({ res, err,
|
|
319
|
+
reqLogger.error({ res, err, elapsedTime }, 'request error')
|
|
296
320
|
}
|
|
297
|
-
|
|
298
|
-
res.end()
|
|
299
321
|
} else {
|
|
300
322
|
if (req.aborted || !res.writableEnded || err.name === 'AbortError') {
|
|
301
|
-
reqLogger.debug({ res, err,
|
|
323
|
+
reqLogger.debug({ res, err, elapsedTime }, 'request aborted')
|
|
302
324
|
} else if (statusCode < 500) {
|
|
303
|
-
reqLogger.warn({ res, err,
|
|
325
|
+
reqLogger.warn({ res, err, elapsedTime }, 'request failed')
|
|
304
326
|
} else {
|
|
305
|
-
reqLogger.error({ res, err,
|
|
327
|
+
reqLogger.error({ res, err, elapsedTime }, 'request error')
|
|
306
328
|
}
|
|
307
329
|
|
|
308
330
|
if (!res.writableEnded) {
|