@nxtedition/nxt-undici 6.0.9 → 6.0.11

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.
@@ -8,19 +8,29 @@ const MAX_TTL = 10e3
8
8
 
9
9
  class Handler extends DecoratorHandler {
10
10
  #callback
11
+ #statusCode
11
12
 
12
13
  constructor(handler, callback) {
13
14
  super(handler)
14
15
  this.#callback = callback
15
16
  }
16
17
 
18
+ onHeaders(statusCode, headers, resume) {
19
+ this.#statusCode = statusCode
20
+ return super.onHeaders(statusCode, headers, resume)
21
+ }
22
+
17
23
  onComplete(trailers) {
18
- this.#callback(null)
24
+ this.#callback(null, this.#statusCode)
19
25
  super.onComplete(trailers)
20
26
  }
21
27
 
22
28
  onError(err) {
23
- this.#callback(err)
29
+ if (err?.statusCode == null) {
30
+ this.#callback(err)
31
+ } else if (err.statusCode) {
32
+ this.#callback(null, err.statusCode)
33
+ }
24
34
  super.onError(err)
25
35
  }
26
36
  }
@@ -35,14 +45,14 @@ export default () => (dispatch) => {
35
45
  promise = resolve4(hostname, { ttl: true })
36
46
  .then((records) => {
37
47
  const now = getFastNow()
38
- const prev = cache.get(hostname)
39
- const next = records.map(({ address, ttl }) => ({
48
+ const ret = records.map(({ address, ttl }) => ({
40
49
  address,
41
50
  expires: now + Math.min(MAX_TTL, 1e3 * ttl),
42
- stats: prev?.find((x) => x.address === address)?.stats || { pending: 0, errored: 0 },
51
+ pending: 0,
52
+ errored: 0,
43
53
  }))
44
- cache.set(hostname, next)
45
- return next
54
+ cache.set(hostname, ret)
55
+ return ret
46
56
  })
47
57
  .finally(() => {
48
58
  promises.delete(hostname)
@@ -69,19 +79,19 @@ export default () => (dispatch) => {
69
79
 
70
80
  let records = cache.get(hostname)
71
81
 
72
- if (records == null || records.every((x) => x.stats.errored || x.expires < now)) {
82
+ if (records == null || records.every((x) => x.expires < now)) {
73
83
  records = await resolve(hostname)
74
- } else if (records.some((x) => x.errored || x.expires < now + 1e3)) {
84
+ } else if (records.some((x) => x.expires < now + 1e3)) {
75
85
  resolve(hostname).catch(noop)
76
86
  }
77
87
 
78
88
  records.sort((a, b) => {
79
- if (a.stats.errored !== b.stats.errored) {
80
- return a.stats.errored - b.stats.errored
89
+ if (a.errored !== b.errored) {
90
+ return a.errored - b.errored
81
91
  }
82
92
 
83
- if (a.stats.pending !== b.stats.pending) {
84
- return a.stats.pending - b.stats.pending
93
+ if (a.pending !== b.pending) {
94
+ return a.pending - b.pending
85
95
  }
86
96
 
87
97
  return 0
@@ -97,25 +107,26 @@ export default () => (dispatch) => {
97
107
 
98
108
  origin.hostname = record.address
99
109
 
100
- record.stats.pending++
110
+ record.pending++
101
111
  try {
102
112
  return dispatch(
103
113
  { ...opts, origin, headers: { ...opts.headers, host } },
104
- new Handler(handler, (err) => {
114
+ new Handler(handler, (err, statusCode) => {
105
115
  record.pending--
116
+
106
117
  if (err == null) {
107
- record.stats.errored = 0
108
- } else if (err.name === 'AbortError') {
109
- // Do nothing...
110
- } else if (err.statusCode == null || err.statusCode >= 500) {
111
- record.stats.errored++
112
- } else {
113
- record.stats.errored = 0
118
+ if (statusCode != null && statusCode >= 500) {
119
+ record.errored++
120
+ } else {
121
+ record.errored = 0
122
+ }
123
+ } else if (err.name !== 'AbortError') {
124
+ record.expires = 0
114
125
  }
115
126
  }),
116
127
  )
117
128
  } catch (err) {
118
- record.stats.pending--
129
+ record.pending--
119
130
  throw err
120
131
  }
121
132
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/nxt-undici",
3
- "version": "6.0.9",
3
+ "version": "6.0.11",
4
4
  "license": "MIT",
5
5
  "author": "Robert Nagy <robert.nagy@boffins.se>",
6
6
  "main": "lib/index.js",