@nxtedition/lib 21.2.2 → 21.3.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.
Files changed (3) hide show
  1. package/couch.js +5 -1
  2. package/http.js +46 -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
 
@@ -132,6 +134,7 @@ export async function request2(ctx, next) {
132
134
  // Do nothing...
133
135
  } else if (!res.writableEnded) {
134
136
  logger.debug({ res, elapsedTime }, 'request aborted')
137
+ res.destroy()
135
138
  } else if (res.statusCode >= 500) {
136
139
  logger.error({ res, elapsedTime }, 'request error')
137
140
  } else if (res.statusCode >= 400) {
@@ -143,12 +146,12 @@ export async function request2(ctx, next) {
143
146
  ctx[kAbortController]?.abort(err)
144
147
 
145
148
  const statusCode = err.statusCode || err.$metadata?.httpStatusCode || 500
146
- const responseTime = Math.ceil(performance.now() - startTime)
149
+ const elapsedTime = Math.ceil(performance.now() - startTime)
147
150
 
148
151
  if (!res.headersSent && !res.destroyed) {
149
152
  res.statusCode = statusCode
150
153
 
151
- let reqId = req?.id || err.id
154
+ let reqId = ctx.id || req?.id || err.id
152
155
  for (const name of res.getHeaderNames()) {
153
156
  if (!reqId && name === 'request-id') {
154
157
  reqId = res.getHeader(name)
@@ -160,8 +163,20 @@ export async function request2(ctx, next) {
160
163
  res.setHeader('request-id', reqId)
161
164
  }
162
165
 
163
- if (fp.isPlainObject(err.headers)) {
164
- for (const [key, val] of Object.entries(err.headers)) {
166
+ const { headers } = err
167
+
168
+ if (fp.isPlainObject(headers)) {
169
+ for (const [key, val] of Object.entries(headers)) {
170
+ if (!ERR_HEADER_EXPR.test(key)) {
171
+ res.setHeader(key, val)
172
+ }
173
+ }
174
+ } else if (Array.isArray(err.headers)) {
175
+ assert(headers.length % 2 === 0)
176
+ assert(headers.length === 0 || typeof headers[0] === 'string')
177
+ for (let n = 0; n < headers.length; n += 2) {
178
+ const key = headers[n + 0]
179
+ const val = headers[n + 1]
165
180
  if (!ERR_HEADER_EXPR.test(key)) {
166
181
  res.setHeader(key, val)
167
182
  }
@@ -170,23 +185,27 @@ export async function request2(ctx, next) {
170
185
 
171
186
  if (fp.isPlainObject(err.body)) {
172
187
  res.setHeader('content-type', 'application/json')
173
- res.write(JSON.stringify(err.body))
188
+ res.end(JSON.stringify(err.body))
189
+ } else if (typeof err.body === 'string') {
190
+ res.end(err.body)
191
+ } else if (Buffer.isBuffer(err.body)) {
192
+ res.end(err.body)
193
+ } else {
194
+ res.end()
174
195
  }
175
196
 
176
197
  if (statusCode < 500) {
177
- logger.warn({ req, res, err, responseTime }, 'request failed')
198
+ logger.warn({ req, res, err, elapsedTime }, 'request failed')
178
199
  } else {
179
- logger.error({ req, res, err, responseTime }, 'request error')
200
+ logger.error({ req, res, err, elapsedTime }, 'request error')
180
201
  }
181
-
182
- res.end()
183
202
  } else {
184
203
  if (req.aborted || !res.writableEnded || err.name === 'AbortError') {
185
- logger.debug({ req, res, err, responseTime }, 'request aborted')
204
+ logger.debug({ req, res, err, elapsedTime }, 'request aborted')
186
205
  } else if (statusCode < 500) {
187
- logger.warn({ req, res, err, responseTime }, 'request failed')
206
+ logger.warn({ req, res, err, elapsedTime }, 'request failed')
188
207
  } else {
189
- logger.error({ req, res, err, responseTime }, 'request error')
208
+ logger.error({ req, res, err, elapsedTime }, 'request error')
190
209
  }
191
210
 
192
211
  if (!res.writableEnded) {
@@ -248,6 +267,7 @@ export async function request(ctx, next) {
248
267
  // Do nothing...
249
268
  } else if (!res.writableEnded) {
250
269
  reqLogger.debug({ res, elapsedTime }, 'request aborted')
270
+ res.destroy()
251
271
  } else if (res.statusCode >= 500) {
252
272
  reqLogger.error({ res, elapsedTime }, 'request error')
253
273
  } else if (res.statusCode >= 400) {
@@ -259,7 +279,7 @@ export async function request(ctx, next) {
259
279
  ac?.abort(err)
260
280
 
261
281
  const statusCode = err.statusCode || err.$metadata?.httpStatusCode || 500
262
- const responseTime = Math.ceil(performance.now() - startTime)
282
+ const elapsedTime = Math.ceil(performance.now() - startTime)
263
283
 
264
284
  if (!res.headersSent && !res.destroyed) {
265
285
  res.statusCode = statusCode
@@ -286,23 +306,27 @@ export async function request(ctx, next) {
286
306
 
287
307
  if (fp.isPlainObject(err.body)) {
288
308
  res.setHeader('content-type', 'application/json')
289
- res.write(JSON.stringify(err.body))
309
+ res.end(JSON.stringify(err.body))
310
+ } else if (typeof err.body === 'string') {
311
+ res.end(err.body)
312
+ } else if (Buffer.isBuffer(err.body)) {
313
+ res.end(err.body)
314
+ } else {
315
+ res.end()
290
316
  }
291
317
 
292
318
  if (statusCode < 500) {
293
- reqLogger.warn({ res, err, responseTime }, 'request failed')
319
+ reqLogger.warn({ res, err, elapsedTime }, 'request failed')
294
320
  } else {
295
- reqLogger.error({ res, err, responseTime }, 'request error')
321
+ reqLogger.error({ res, err, elapsedTime }, 'request error')
296
322
  }
297
-
298
- res.end()
299
323
  } else {
300
324
  if (req.aborted || !res.writableEnded || err.name === 'AbortError') {
301
- reqLogger.debug({ res, err, responseTime }, 'request aborted')
325
+ reqLogger.debug({ res, err, elapsedTime }, 'request aborted')
302
326
  } else if (statusCode < 500) {
303
- reqLogger.warn({ res, err, responseTime }, 'request failed')
327
+ reqLogger.warn({ res, err, elapsedTime }, 'request failed')
304
328
  } else {
305
- reqLogger.error({ res, err, responseTime }, 'request error')
329
+ reqLogger.error({ res, err, elapsedTime }, 'request error')
306
330
  }
307
331
 
308
332
  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.1",
4
4
  "license": "MIT",
5
5
  "author": "Robert Nagy <robert.nagy@boffins.se>",
6
6
  "type": "module",