@nxtedition/nxt-undici 5.2.1 → 6.0.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/lib/interceptor/cache.js +11 -11
- package/lib/interceptor/log.js +4 -4
- package/lib/interceptor/proxy.js +5 -6
- package/lib/interceptor/redirect.js +4 -4
- package/lib/interceptor/response-error.js +5 -5
- package/lib/interceptor/response-retry.js +9 -15
- package/lib/interceptor/response-verify.js +3 -3
- package/lib/request.js +2 -2
- package/package.json +2 -2
package/lib/interceptor/cache.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SqliteCacheStore } from '../cache/sqlite-cache-store.js'
|
|
2
|
-
import { DecoratorHandler,
|
|
2
|
+
import { DecoratorHandler, parseCacheControl } from '../utils.js'
|
|
3
3
|
|
|
4
4
|
const DEFAULT_STORE = new SqliteCacheStore({ location: ':memory:' })
|
|
5
5
|
|
|
@@ -21,15 +21,15 @@ class CacheHandler extends DecoratorHandler {
|
|
|
21
21
|
super.onConnect(abort)
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
onHeaders(statusCode,
|
|
24
|
+
onHeaders(statusCode, headers, resume) {
|
|
25
25
|
if (statusCode !== 307) {
|
|
26
26
|
// Only cache redirects...
|
|
27
|
-
return super.onHeaders(statusCode,
|
|
27
|
+
return super.onHeaders(statusCode, headers, resume)
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
if (headers.vary === '*') {
|
|
31
31
|
// Not cacheble...
|
|
32
|
-
return super.onHeaders(statusCode,
|
|
32
|
+
return super.onHeaders(statusCode, headers, resume)
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
const cacheControl = parseCacheControl(headers['cache-control'])
|
|
@@ -37,7 +37,7 @@ class CacheHandler extends DecoratorHandler {
|
|
|
37
37
|
|
|
38
38
|
if (contentLength) {
|
|
39
39
|
// We don't support caching responses with body...
|
|
40
|
-
return super.onHeaders(statusCode,
|
|
40
|
+
return super.onHeaders(statusCode, headers, resume)
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
if (
|
|
@@ -53,7 +53,7 @@ class CacheHandler extends DecoratorHandler {
|
|
|
53
53
|
cacheControl['proxy-revalidate']
|
|
54
54
|
) {
|
|
55
55
|
// Not cacheble...
|
|
56
|
-
return super.onHeaders(statusCode,
|
|
56
|
+
return super.onHeaders(statusCode, headers, resume)
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
const vary = {}
|
|
@@ -64,20 +64,20 @@ class CacheHandler extends DecoratorHandler {
|
|
|
64
64
|
const val = this.#opts.headers?.[key]
|
|
65
65
|
if (!val) {
|
|
66
66
|
// Expect vary headers to be present...
|
|
67
|
-
return super.onHeaders(statusCode,
|
|
67
|
+
return super.onHeaders(statusCode, headers, resume)
|
|
68
68
|
}
|
|
69
69
|
vary[key] = val
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
// Unexpected vary header type...
|
|
73
|
-
return super.onHeaders(statusCode,
|
|
73
|
+
return super.onHeaders(statusCode, headers, resume)
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
const ttl = cacheControl.immutable
|
|
77
77
|
? 31556952
|
|
78
78
|
: Number(cacheControl['s-max-age'] ?? cacheControl['max-age'])
|
|
79
79
|
if (!ttl || !Number.isFinite(ttl) || ttl <= 0) {
|
|
80
|
-
return super.onHeaders(statusCode,
|
|
80
|
+
return super.onHeaders(statusCode, headers, resume)
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
const cachedAt = Date.now()
|
|
@@ -95,7 +95,7 @@ class CacheHandler extends DecoratorHandler {
|
|
|
95
95
|
staleAt: 0,
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
-
return super.onHeaders(statusCode,
|
|
98
|
+
return super.onHeaders(statusCode, headers, resume)
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
onData(chunk) {
|
|
@@ -164,7 +164,7 @@ export default () => (dispatch) => (opts, handler) => {
|
|
|
164
164
|
return true
|
|
165
165
|
}
|
|
166
166
|
|
|
167
|
-
if (handler.onHeaders(statusCode,
|
|
167
|
+
if (handler.onHeaders(statusCode, headers, resume) === false) {
|
|
168
168
|
paused = true
|
|
169
169
|
}
|
|
170
170
|
|
package/lib/interceptor/log.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DecoratorHandler
|
|
1
|
+
import { DecoratorHandler } from '../utils.js'
|
|
2
2
|
|
|
3
3
|
class Handler extends DecoratorHandler {
|
|
4
4
|
#opts
|
|
@@ -45,7 +45,7 @@ class Handler extends DecoratorHandler {
|
|
|
45
45
|
})
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
onUpgrade(statusCode,
|
|
48
|
+
onUpgrade(statusCode, headers, socket) {
|
|
49
49
|
this.#timing.headers = performance.now() - this.#created
|
|
50
50
|
|
|
51
51
|
this.#logger.debug(
|
|
@@ -63,13 +63,13 @@ class Handler extends DecoratorHandler {
|
|
|
63
63
|
super.onUpgrade(statusCode, null, socket, headers)
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
onHeaders(statusCode,
|
|
66
|
+
onHeaders(statusCode, headers, resume) {
|
|
67
67
|
this.#timing.headers = performance.now() - this.#created
|
|
68
68
|
|
|
69
69
|
this.#statusCode = statusCode
|
|
70
70
|
this.#headers = headers
|
|
71
71
|
|
|
72
|
-
return super.onHeaders(statusCode,
|
|
72
|
+
return super.onHeaders(statusCode, headers, resume)
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
onData(chunk) {
|
package/lib/interceptor/proxy.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import net from 'node:net'
|
|
2
2
|
import createError from 'http-errors'
|
|
3
|
-
import { DecoratorHandler
|
|
3
|
+
import { DecoratorHandler } from '../utils.js'
|
|
4
4
|
|
|
5
5
|
class Handler extends DecoratorHandler {
|
|
6
6
|
#opts
|
|
@@ -11,7 +11,7 @@ class Handler extends DecoratorHandler {
|
|
|
11
11
|
this.#opts = proxyOpts
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
onUpgrade(statusCode,
|
|
14
|
+
onUpgrade(statusCode, headers, socket) {
|
|
15
15
|
super.onUpgrade(
|
|
16
16
|
statusCode,
|
|
17
17
|
reduceHeaders(
|
|
@@ -22,16 +22,16 @@ class Handler extends DecoratorHandler {
|
|
|
22
22
|
proxyName: this.#opts.name,
|
|
23
23
|
},
|
|
24
24
|
(acc, key, val) => {
|
|
25
|
-
acc
|
|
25
|
+
acc[key] = val
|
|
26
26
|
return acc
|
|
27
27
|
},
|
|
28
|
-
|
|
28
|
+
{},
|
|
29
29
|
),
|
|
30
30
|
socket,
|
|
31
31
|
)
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
onHeaders(statusCode,
|
|
34
|
+
onHeaders(statusCode, headers, resume) {
|
|
35
35
|
return super.onHeaders(
|
|
36
36
|
statusCode,
|
|
37
37
|
reduceHeaders(
|
|
@@ -48,7 +48,6 @@ class Handler extends DecoratorHandler {
|
|
|
48
48
|
[],
|
|
49
49
|
),
|
|
50
50
|
resume,
|
|
51
|
-
null,
|
|
52
51
|
)
|
|
53
52
|
}
|
|
54
53
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import assert from 'node:assert'
|
|
2
|
-
import { DecoratorHandler, isDisturbed,
|
|
2
|
+
import { DecoratorHandler, isDisturbed, parseURL } from '../utils.js'
|
|
3
3
|
|
|
4
4
|
const redirectableStatusCodes = [300, 301, 302, 303, 307, 308]
|
|
5
5
|
|
|
@@ -45,11 +45,11 @@ class Handler extends DecoratorHandler {
|
|
|
45
45
|
super.onUpgrade(statusCode, rawHeaders, socket, headers)
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
onHeaders(statusCode,
|
|
48
|
+
onHeaders(statusCode, headers, resume) {
|
|
49
49
|
if (redirectableStatusCodes.indexOf(statusCode) === -1) {
|
|
50
50
|
assert(!this.#headersSent)
|
|
51
51
|
this.#headersSent = true
|
|
52
|
-
return super.onHeaders(statusCode,
|
|
52
|
+
return super.onHeaders(statusCode, headers, resume)
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
if (isDisturbed(this.#opts.body)) {
|
|
@@ -69,7 +69,7 @@ class Handler extends DecoratorHandler {
|
|
|
69
69
|
if (!this.#opts.follow(this.#location, this.#count, this.#opts)) {
|
|
70
70
|
assert(!this.#headersSent)
|
|
71
71
|
this.#headersSent = true
|
|
72
|
-
return super.onHeaders(statusCode,
|
|
72
|
+
return super.onHeaders(statusCode, headers, resume)
|
|
73
73
|
}
|
|
74
74
|
} else {
|
|
75
75
|
if (this.#count >= this.#maxCount) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import createHttpError from 'http-errors'
|
|
2
|
-
import { DecoratorHandler
|
|
2
|
+
import { DecoratorHandler } from '../utils.js'
|
|
3
3
|
|
|
4
4
|
class Handler extends DecoratorHandler {
|
|
5
5
|
#statusCode = 0
|
|
@@ -29,13 +29,13 @@ class Handler extends DecoratorHandler {
|
|
|
29
29
|
super.onConnect(abort)
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
onHeaders(statusCode,
|
|
32
|
+
onHeaders(statusCode, headers, resume) {
|
|
33
33
|
this.#statusCode = statusCode
|
|
34
34
|
this.#headers = headers
|
|
35
35
|
this.#contentType = headers['content-type']
|
|
36
36
|
|
|
37
37
|
if (this.#statusCode < 400) {
|
|
38
|
-
return super.onHeaders(statusCode,
|
|
38
|
+
return super.onHeaders(statusCode, headers, resume)
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
if (this.#checkContentType('application/json') || this.#checkContentType('text/plain')) {
|
|
@@ -51,7 +51,7 @@ class Handler extends DecoratorHandler {
|
|
|
51
51
|
this.#body += this.#decoder?.decode(chunk, { stream: true }) ?? ''
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
onComplete(
|
|
54
|
+
onComplete(trailers) {
|
|
55
55
|
if (this.#statusCode >= 400) {
|
|
56
56
|
this.#body += this.#decoder?.decode(undefined, { stream: false }) ?? ''
|
|
57
57
|
|
|
@@ -74,7 +74,7 @@ class Handler extends DecoratorHandler {
|
|
|
74
74
|
|
|
75
75
|
super.onError(this.#decorateError(err))
|
|
76
76
|
} else {
|
|
77
|
-
super.onComplete(
|
|
77
|
+
super.onComplete(trailers)
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
80
|
|
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
import assert from 'node:assert'
|
|
2
|
-
import {
|
|
3
|
-
DecoratorHandler,
|
|
4
|
-
isDisturbed,
|
|
5
|
-
parseHeaders,
|
|
6
|
-
parseRangeHeader,
|
|
7
|
-
retry as retryFn,
|
|
8
|
-
} from '../utils.js'
|
|
2
|
+
import { DecoratorHandler, isDisturbed, parseRangeHeader, retry as retryFn } from '../utils.js'
|
|
9
3
|
|
|
10
4
|
// TODO (fix): What about onUpgrade?
|
|
11
5
|
class Handler extends DecoratorHandler {
|
|
@@ -67,7 +61,7 @@ class Handler extends DecoratorHandler {
|
|
|
67
61
|
}
|
|
68
62
|
}
|
|
69
63
|
|
|
70
|
-
onHeaders(statusCode,
|
|
64
|
+
onHeaders(statusCode, headers, resume) {
|
|
71
65
|
if (this.#error == null) {
|
|
72
66
|
assert(this.#etag == null)
|
|
73
67
|
assert(this.#pos == null)
|
|
@@ -75,18 +69,18 @@ class Handler extends DecoratorHandler {
|
|
|
75
69
|
assert(this.#headersSent === false)
|
|
76
70
|
|
|
77
71
|
if (headers.trailer) {
|
|
78
|
-
return this.#onHeaders(statusCode,
|
|
72
|
+
return this.#onHeaders(statusCode, headers, resume)
|
|
79
73
|
}
|
|
80
74
|
|
|
81
75
|
const contentLength = headers['content-length'] ? Number(headers['content-length']) : null
|
|
82
76
|
if (contentLength != null && !Number.isFinite(contentLength)) {
|
|
83
|
-
return this.#onHeaders(statusCode,
|
|
77
|
+
return this.#onHeaders(statusCode, headers, resume)
|
|
84
78
|
}
|
|
85
79
|
|
|
86
80
|
if (statusCode === 206) {
|
|
87
81
|
const range = parseRangeHeader(headers['content-range'])
|
|
88
82
|
if (!range) {
|
|
89
|
-
return this.#onHeaders(statusCode,
|
|
83
|
+
return this.#onHeaders(statusCode, headers, resume)
|
|
90
84
|
}
|
|
91
85
|
|
|
92
86
|
const { start, size, end = size } = range
|
|
@@ -106,7 +100,7 @@ class Handler extends DecoratorHandler {
|
|
|
106
100
|
this.#end = contentLength
|
|
107
101
|
this.#etag = headers.etag
|
|
108
102
|
} else {
|
|
109
|
-
return this.#onHeaders(statusCode,
|
|
103
|
+
return this.#onHeaders(statusCode, headers, resume)
|
|
110
104
|
}
|
|
111
105
|
|
|
112
106
|
// Weak etags are not useful for comparison nor cache
|
|
@@ -119,7 +113,7 @@ class Handler extends DecoratorHandler {
|
|
|
119
113
|
assert(Number.isFinite(this.#pos))
|
|
120
114
|
assert(this.#end == null || Number.isFinite(this.#end))
|
|
121
115
|
|
|
122
|
-
return this.#onHeaders(statusCode,
|
|
116
|
+
return this.#onHeaders(statusCode, headers, resume)
|
|
123
117
|
} else if (statusCode === 206 || (this.#pos === 0 && statusCode === 200)) {
|
|
124
118
|
assert(this.#etag != null || !this.#pos)
|
|
125
119
|
|
|
@@ -213,10 +207,10 @@ class Handler extends DecoratorHandler {
|
|
|
213
207
|
super.onError(err)
|
|
214
208
|
}
|
|
215
209
|
|
|
216
|
-
#onHeaders(
|
|
210
|
+
#onHeaders(statusCode, headers, resume) {
|
|
217
211
|
assert(!this.#headersSent)
|
|
218
212
|
this.#headersSent = true
|
|
219
|
-
return super.onHeaders(
|
|
213
|
+
return super.onHeaders(statusCode, headers, resume)
|
|
220
214
|
}
|
|
221
215
|
}
|
|
222
216
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import crypto from 'node:crypto'
|
|
2
2
|
import assert from 'node:assert'
|
|
3
|
-
import { DecoratorHandler
|
|
3
|
+
import { DecoratorHandler } from '../utils.js'
|
|
4
4
|
|
|
5
5
|
class Handler extends DecoratorHandler {
|
|
6
6
|
#verifyOpts
|
|
@@ -26,12 +26,12 @@ class Handler extends DecoratorHandler {
|
|
|
26
26
|
super.onConnect(abort)
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
onHeaders(statusCode,
|
|
29
|
+
onHeaders(statusCode, headers, resume) {
|
|
30
30
|
this.#contentMD5 = this.#verifyOpts.hash ? headers['content-md5'] : null
|
|
31
31
|
this.#contentLength = this.#verifyOpts.size ? headers['content-length'] : null
|
|
32
32
|
this.#hasher = this.#contentMD5 != null ? crypto.createHash('md5') : null
|
|
33
33
|
|
|
34
|
-
return super.onHeaders(statusCode,
|
|
34
|
+
return super.onHeaders(statusCode, headers, resume)
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
onData(chunk) {
|
package/lib/request.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import assert from 'node:assert'
|
|
2
2
|
import { InvalidArgumentError, RequestAbortedError } from './errors.js'
|
|
3
|
-
import { isStream
|
|
3
|
+
import { isStream } from './utils.js'
|
|
4
4
|
import { Readable } from '@nxtedition/undici'
|
|
5
5
|
|
|
6
6
|
function noop() {}
|
|
@@ -70,7 +70,7 @@ export class RequestHandler {
|
|
|
70
70
|
this.abort = abort
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
-
onHeaders(statusCode,
|
|
73
|
+
onHeaders(statusCode, headers, resume) {
|
|
74
74
|
const { resolve, abort, highWaterMark } = this
|
|
75
75
|
|
|
76
76
|
if (statusCode < 200) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nxtedition/nxt-undici",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.0.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"author": "Robert Nagy <robert.nagy@boffins.se>",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"lib/*"
|
|
10
10
|
],
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@nxtedition/undici": "^
|
|
12
|
+
"@nxtedition/undici": "^10.0.2",
|
|
13
13
|
"cache-control-parser": "^2.0.6",
|
|
14
14
|
"http-errors": "^2.0.0"
|
|
15
15
|
},
|