@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.
Files changed (3) hide show
  1. package/couch.js +5 -1
  2. package/http.js +44 -22
  3. 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: 128 * 1024,
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 (!isHealthcheck) {
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 responseTime = Math.ceil(performance.now() - startTime)
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
- if (fp.isPlainObject(err.headers)) {
164
- for (const [key, val] of Object.entries(err.headers)) {
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.write(JSON.stringify(err.body))
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, responseTime }, 'request failed')
197
+ logger.warn({ req, res, err, elapsedTime }, 'request failed')
178
198
  } else {
179
- logger.error({ req, res, err, responseTime }, 'request error')
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, responseTime }, 'request aborted')
203
+ logger.debug({ req, res, err, elapsedTime }, 'request aborted')
186
204
  } else if (statusCode < 500) {
187
- logger.warn({ req, res, err, responseTime }, 'request failed')
205
+ logger.warn({ req, res, err, elapsedTime }, 'request failed')
188
206
  } else {
189
- logger.error({ req, res, err, responseTime }, 'request error')
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 responseTime = Math.ceil(performance.now() - startTime)
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.write(JSON.stringify(err.body))
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, responseTime }, 'request failed')
317
+ reqLogger.warn({ res, err, elapsedTime }, 'request failed')
294
318
  } else {
295
- reqLogger.error({ res, err, responseTime }, 'request error')
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, responseTime }, 'request aborted')
323
+ reqLogger.debug({ res, err, elapsedTime }, 'request aborted')
302
324
  } else if (statusCode < 500) {
303
- reqLogger.warn({ res, err, responseTime }, 'request failed')
325
+ reqLogger.warn({ res, err, elapsedTime }, 'request failed')
304
326
  } else {
305
- reqLogger.error({ res, err, responseTime }, 'request error')
327
+ reqLogger.error({ res, err, elapsedTime }, 'request error')
306
328
  }
307
329
 
308
330
  if (!res.writableEnded) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/lib",
3
- "version": "21.2.2",
3
+ "version": "21.3.0",
4
4
  "license": "MIT",
5
5
  "author": "Robert Nagy <robert.nagy@boffins.se>",
6
6
  "type": "module",