@fastify/reply-from 12.0.2 → 12.2.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 (107) hide show
  1. package/.github/workflows/ci.yml +6 -0
  2. package/CLAUDE.md +66 -0
  3. package/LICENSE +4 -1
  4. package/README.md +24 -0
  5. package/index.js +12 -1
  6. package/lib/request.js +16 -6
  7. package/lib/utils.js +1 -0
  8. package/package.json +6 -8
  9. package/test/async-route-handler.test.js +29 -32
  10. package/test/balanced-pool.test.js +48 -0
  11. package/test/base-get.test.js +27 -30
  12. package/test/base-path.test.js +27 -24
  13. package/test/base-querystring.test.js +27 -30
  14. package/test/build-url.test.js +17 -15
  15. package/test/core-with-path-in-base.test.js +30 -33
  16. package/test/custom-undici-instance.test.js +28 -36
  17. package/test/disable-request-logging.test.js +38 -52
  18. package/test/fastify-multipart-incompatibility.test.js +43 -49
  19. package/test/fix-GHSA-v2v2-hph8-q5xp.test.js +3 -2
  20. package/test/full-delete-http2.test.js +12 -11
  21. package/test/full-get-test.test.js +27 -30
  22. package/test/full-https-get.test.js +30 -30
  23. package/test/full-post-extended-content-type.test.js +40 -44
  24. package/test/full-post-http2.test.js +18 -13
  25. package/test/full-post-stream-core.test.js +39 -43
  26. package/test/full-post-stream.test.js +39 -43
  27. package/test/full-post.test.js +36 -38
  28. package/test/full-querystring-rewrite-option-complex.test.js +27 -31
  29. package/test/full-querystring-rewrite-option-function-request.test.js +30 -36
  30. package/test/full-querystring-rewrite-option-function.test.js +30 -33
  31. package/test/full-querystring-rewrite-option.test.js +28 -31
  32. package/test/full-querystring-rewrite-string.test.js +27 -30
  33. package/test/full-querystring-rewrite.test.js +27 -30
  34. package/test/full-querystring.test.js +27 -30
  35. package/test/full-rewrite-body-content-type.test.js +37 -41
  36. package/test/full-rewrite-body-http.test.js +39 -43
  37. package/test/full-rewrite-body-to-empty-string.test.js +37 -41
  38. package/test/full-rewrite-body-to-null.test.js +37 -41
  39. package/test/full-rewrite-body.test.js +39 -43
  40. package/test/get-upstream-cache.test.js +12 -11
  41. package/test/get-upstream-http.test.js +35 -41
  42. package/test/get-upstream-type.test.js +24 -27
  43. package/test/get-upstream-undici.test.js +23 -26
  44. package/test/host-header.test.js +22 -18
  45. package/test/http-agents.test.js +27 -30
  46. package/test/http-global-agent.test.js +20 -33
  47. package/test/http-http2.test.js +13 -18
  48. package/test/http-invalid-target.test.js +13 -17
  49. package/test/http-retry.test.js +22 -29
  50. package/test/http-timeout.test.js +87 -27
  51. package/test/http2-canceled-streams-cleanup.test.js +117 -0
  52. package/test/http2-http2.test.js +8 -8
  53. package/test/http2-https.test.js +29 -27
  54. package/test/http2-invalid-base.test.js +2 -2
  55. package/test/http2-invalid-target.test.js +13 -17
  56. package/test/http2-target-crash.test.js +16 -20
  57. package/test/http2-target-multi-crash.test.js +22 -27
  58. package/test/http2-timeout-disabled.test.js +20 -15
  59. package/test/http2-timeout.test.js +94 -43
  60. package/test/http2-unix-socket.test.js +2 -2
  61. package/test/https-agents.test.js +31 -30
  62. package/test/https-global-agent.test.js +22 -31
  63. package/test/method.test.js +37 -42
  64. package/test/modifyCoreObjects-false.test.js +27 -30
  65. package/test/no-body-opts-with-get.test.js +25 -31
  66. package/test/no-body-opts-with-head.test.js +28 -32
  67. package/test/no-stream-body-option.test.js +34 -36
  68. package/test/on-error.test.js +21 -23
  69. package/test/on-invalid-upstream-response.test.js +30 -37
  70. package/test/onResponse.test.js +25 -32
  71. package/test/padded-body.test.js +38 -43
  72. package/test/post-formbody.test.js +35 -40
  73. package/test/post-plain-text.test.js +35 -39
  74. package/test/post-with-custom-encoded-contenttype.test.js +37 -39
  75. package/test/post-with-octet-stream.test.js +18 -88
  76. package/test/retry-on-503.test.js +27 -26
  77. package/test/retry-with-a-custom-handler.test.js +33 -40
  78. package/test/rewrite-headers-type.test.js +24 -29
  79. package/test/rewrite-headers.test.js +31 -36
  80. package/test/rewrite-request-headers-type.test.js +25 -28
  81. package/test/rewrite-request-headers.test.js +26 -30
  82. package/test/transform-body.test.js +37 -43
  83. package/test/undici-agent.test.js +27 -31
  84. package/test/undici-body.test.js +37 -42
  85. package/test/undici-chaining.test.js +35 -42
  86. package/test/undici-connect-timeout.test.js +13 -13
  87. package/test/undici-custom-dispatcher.test.js +11 -11
  88. package/test/undici-global-agent.test.js +14 -33
  89. package/test/undici-no-destroy.test.js +2 -2
  90. package/test/undici-options.test.js +21 -24
  91. package/test/undici-proxy-agent.test.js +4 -3
  92. package/test/undici-retry.test.js +24 -31
  93. package/test/undici-timeout-body-partial.test.js +14 -16
  94. package/test/undici-timeout-body.test.js +17 -19
  95. package/test/undici-timeout.test.js +86 -23
  96. package/test/undici-with-path-in-base.test.js +28 -31
  97. package/test/undici.test.js +28 -31
  98. package/test/unexpected-error.test.js +13 -18
  99. package/test/unix-http-undici-from.test.js +22 -31
  100. package/test/unix-http-undici.test.js +32 -40
  101. package/test/unix-http.test.js +31 -39
  102. package/test/unix-https-undici.test.js +30 -35
  103. package/test/unix-https.test.js +35 -40
  104. package/types/index.d.ts +13 -5
  105. package/types/index.test-d.ts +6 -6
  106. package/test/get-with-body.test.js +0 -55
  107. package/test/head-with-body.test.js +0 -57
@@ -1,46 +1,46 @@
1
1
  'use strict'
2
2
 
3
- const t = require('tap')
3
+ const t = require('node:test')
4
4
  const Fastify = require('fastify')
5
+ const { request } = require('undici')
5
6
  const From = require('..')
6
7
  const http = require('node:http')
7
- const get = require('simple-get').concat
8
8
 
9
9
  const instance = Fastify()
10
10
 
11
- t.plan(9)
12
- t.teardown(instance.close.bind(instance))
11
+ t.test('undici body', async (t) => {
12
+ t.plan(6)
13
+ t.after(() => instance.close())
13
14
 
14
- const bodyString = JSON.stringify({ hello: 'world' })
15
+ const bodyString = JSON.stringify({ hello: 'world' })
15
16
 
16
- const parsedLength = Buffer.byteLength(bodyString)
17
+ const parsedLength = Buffer.byteLength(bodyString)
17
18
 
18
- const target = http.createServer((req, res) => {
19
- t.pass('request proxied')
20
- t.equal(req.method, 'POST')
21
- t.equal(req.headers['content-type'], 'application/json')
22
- t.same(req.headers['content-length'], parsedLength)
23
- let data = ''
24
- req.setEncoding('utf8')
25
- req.on('data', (d) => {
26
- data += d
27
- })
28
- req.on('end', () => {
29
- t.same(JSON.parse(data), { hello: 'world' })
30
- res.statusCode = 200
31
- res.setHeader('content-type', 'application/json')
32
- res.end(JSON.stringify({ something: 'else' }))
19
+ const target = http.createServer((req, res) => {
20
+ t.assert.ok('request proxied')
21
+ t.assert.strictEqual(req.method, 'POST')
22
+ t.assert.strictEqual(req.headers['content-type'], 'application/json')
23
+ t.assert.deepStrictEqual(req.headers['content-length'], `${parsedLength}`)
24
+ let data = ''
25
+ req.setEncoding('utf8')
26
+ req.on('data', (d) => {
27
+ data += d
28
+ })
29
+ req.on('end', () => {
30
+ t.assert.deepStrictEqual(JSON.parse(data), { hello: 'world' })
31
+ res.statusCode = 200
32
+ res.setHeader('content-type', 'application/json')
33
+ res.end(JSON.stringify({ something: 'else' }))
34
+ })
33
35
  })
34
- })
35
36
 
36
- instance.post('/', (_request, reply) => {
37
- reply.from(`http://localhost:${target.address().port}`)
38
- })
37
+ instance.post('/', (_request, reply) => {
38
+ reply.from(`http://localhost:${target.address().port}`)
39
+ })
39
40
 
40
- t.teardown(target.close.bind(target))
41
+ t.after(() => target.close())
41
42
 
42
- target.listen({ port: 0 }, (err) => {
43
- t.error(err)
43
+ await new Promise((resolve) => target.listen({ port: 0 }, resolve))
44
44
 
45
45
  instance.addContentTypeParser('application/json', function (_req, payload, done) {
46
46
  done(null, payload)
@@ -51,20 +51,15 @@ target.listen({ port: 0 }, (err) => {
51
51
  undici: true
52
52
  })
53
53
 
54
- instance.listen({ port: 0 }, (err) => {
55
- t.error(err)
54
+ await new Promise((resolve) => instance.listen({ port: 0 }, resolve))
56
55
 
57
- get({
58
- url: `http://localhost:${instance.server.address().port}`,
59
- method: 'POST',
60
- headers: {
61
- 'content-type': 'application/json'
62
- },
63
- body: bodyString
64
- }, (err, _res, data) => {
65
- t.error(err)
66
- const parsed = JSON.parse(data)
67
- t.same(parsed, { something: 'else' })
68
- })
56
+ const result = await request(`http://localhost:${instance.server.address().port}`, {
57
+ method: 'POST',
58
+ headers: {
59
+ 'content-type': 'application/json'
60
+ },
61
+ body: bodyString
69
62
  })
63
+
64
+ t.assert.deepStrictEqual(await result.body.json(), { something: 'else' })
70
65
  })
@@ -1,57 +1,50 @@
1
1
  'use strict'
2
2
 
3
- const t = require('tap')
3
+ const t = require('node:test')
4
4
  const Fastify = require('fastify')
5
- const get = require('simple-get').concat
5
+ const { request } = require('undici')
6
6
  const From = require('..')
7
7
 
8
8
  const header = 'attachment; filename="år.pdf"'
9
9
 
10
- t.plan(6)
10
+ t.test('undici chaining', async (t) => {
11
+ t.plan(2)
11
12
 
12
- const instance = Fastify()
13
- t.teardown(instance.close.bind(instance))
14
- const proxy1 = Fastify()
15
- t.teardown(proxy1.close.bind(proxy1))
16
- const proxy2 = Fastify()
17
- t.teardown(proxy2.close.bind(proxy2))
13
+ const instance = Fastify()
14
+ t.after(() => instance.close())
15
+ const proxy1 = Fastify()
16
+ t.after(() => proxy1.close())
17
+ const proxy2 = Fastify()
18
+ t.after(() => proxy2.close())
18
19
 
19
- instance.get('/', (_request, reply) => {
20
- reply.header('content-disposition', header).send('OK')
21
- })
22
-
23
- proxy1.register(From, {
24
- undici: {
25
- keepAliveMaxTimeout: 10
26
- }
27
- })
28
- proxy1.get('/', (_request, reply) => {
29
- return reply.from(`http://localhost:${instance.server.address().port}`)
30
- })
20
+ instance.get('/', (_request, reply) => {
21
+ reply.header('content-disposition', header).send('OK')
22
+ })
31
23
 
32
- proxy2.register(From, {
33
- undici: {
34
- keepAliveMaxTimeout: 10
35
- }
36
- })
37
- proxy2.get('/', (_request, reply) => {
38
- return reply.from(`http://localhost:${proxy1.server.address().port}`)
39
- })
24
+ proxy1.register(From, {
25
+ undici: {
26
+ keepAliveMaxTimeout: 10
27
+ }
28
+ })
29
+ proxy1.get('/', (_request, reply) => {
30
+ return reply.from(`http://localhost:${instance.server.address().port}`)
31
+ })
40
32
 
41
- instance.listen({ port: 0 }, err => {
42
- t.error(err)
33
+ proxy2.register(From, {
34
+ undici: {
35
+ keepAliveMaxTimeout: 10
36
+ }
37
+ })
38
+ proxy2.get('/', (_request, reply) => {
39
+ return reply.from(`http://localhost:${proxy1.server.address().port}`)
40
+ })
43
41
 
44
- proxy1.listen({ port: 0 }, err => {
45
- t.error(err)
42
+ await new Promise((resolve) => instance.listen({ port: 0 }, resolve))
43
+ await new Promise((resolve) => proxy1.listen({ port: 0 }, resolve))
44
+ await new Promise((resolve) => proxy2.listen({ port: 0 }, resolve))
46
45
 
47
- proxy2.listen({ port: 0 }, err => {
48
- t.error(err)
46
+ const result = await request(`http://localhost:${proxy2.server.address().port}`)
49
47
 
50
- get(`http://localhost:${proxy2.server.address().port}`, (err, res, data) => {
51
- t.error(err)
52
- t.equal(res.statusCode, 200)
53
- t.equal(data.toString(), 'OK')
54
- })
55
- })
56
- })
48
+ t.assert.strictEqual(result.statusCode, 200)
49
+ t.assert.strictEqual(await result.body.text(), 'OK')
57
50
  })
@@ -1,11 +1,11 @@
1
1
  'use strict'
2
2
 
3
- const t = require('tap')
3
+ const t = require('node:test')
4
4
  const http = require('node:http')
5
5
  const net = require('node:net')
6
6
  const Fastify = require('fastify')
7
7
  const From = require('..')
8
- const got = require('got')
8
+ const { request, Agent } = require('undici')
9
9
 
10
10
  t.test('undici connect timeout', async (t) => {
11
11
  // never connect
@@ -18,11 +18,11 @@ t.test('undici connect timeout', async (t) => {
18
18
  })
19
19
 
20
20
  t.plan(2)
21
- await target.listen({ port: 0 })
21
+ await new Promise(resolve => target.listen({ port: 0 }, resolve))
22
22
 
23
23
  const instance = Fastify()
24
- t.teardown(instance.close.bind(instance))
25
- t.teardown(target.close.bind(target))
24
+ t.after(() => instance.close())
25
+ t.after(() => target.close())
26
26
 
27
27
  instance.register(From, {
28
28
  base: `http://localhost:${target.address().port}`,
@@ -38,15 +38,15 @@ t.test('undici connect timeout', async (t) => {
38
38
  await instance.listen({ port: 0 })
39
39
 
40
40
  try {
41
- await got.get(`http://localhost:${instance.server.address().port}/`, { retry: 0 })
42
- } catch (err) {
43
- t.equal(err.response.statusCode, 500)
44
- t.same(JSON.parse(err.response.body), {
45
- statusCode: 500,
46
- code: 'UND_ERR_CONNECT_TIMEOUT',
47
- error: 'Internal Server Error',
48
- message: 'Connect Timeout Error'
41
+ await request(`http://localhost:${instance.server.address().port}/`, {
42
+ dispatcher: new Agent({
43
+ pipelining: 0,
44
+ connectTimeout: 10
45
+ })
49
46
  })
47
+ } catch (err) {
48
+ t.assert.strictEqual(err.code, 'UND_ERR_CONNECT_TIMEOUT')
49
+ t.assert.strictEqual(err.name, 'ConnectTimeoutError')
50
50
  return
51
51
  }
52
52
 
@@ -1,13 +1,13 @@
1
1
  'use strict'
2
2
 
3
- const { test } = require('tap')
4
- const undici = require('undici')
3
+ const { test } = require('node:test')
5
4
  const Fastify = require('fastify')
5
+ const { request, Pool } = require('undici')
6
6
  const From = require('..')
7
7
 
8
8
  class CustomDispatcher {
9
9
  constructor (...args) {
10
- this._dispatcher = new undici.Pool(...args)
10
+ this._dispatcher = new Pool(...args)
11
11
  }
12
12
 
13
13
  request (...args) {
@@ -29,7 +29,7 @@ test('use a custom instance of \'undici\'', async t => {
29
29
  })
30
30
 
31
31
  target.get('/', (_req, reply) => {
32
- t.pass('request proxied')
32
+ t.assert.ok('request proxied')
33
33
 
34
34
  reply.headers({
35
35
  'Content-Type': 'text/plain',
@@ -41,7 +41,7 @@ test('use a custom instance of \'undici\'', async t => {
41
41
  })
42
42
 
43
43
  await target.listen({ port: 3001 })
44
- t.teardown(async () => {
44
+ t.after(async () => {
45
45
  await target.close()
46
46
  })
47
47
 
@@ -58,16 +58,16 @@ test('use a custom instance of \'undici\'', async t => {
58
58
  })
59
59
 
60
60
  await instance.listen({ port: 0 })
61
- t.teardown(async () => {
61
+ t.after(async () => {
62
62
  await instance.close()
63
63
  })
64
64
 
65
- const res = await undici.request(`http://localhost:${instance.server.address().port}`)
65
+ const res = await request(`http://localhost:${instance.server.address().port}`)
66
66
 
67
- t.equal(res.headers['content-type'], 'text/plain')
68
- t.equal(res.headers['x-my-header'], 'hello!')
69
- t.equal(res.statusCode, 205)
67
+ t.assert.strictEqual(res.headers['content-type'], 'text/plain')
68
+ t.assert.strictEqual(res.headers['x-my-header'], 'hello!')
69
+ t.assert.strictEqual(res.statusCode, 205)
70
70
 
71
71
  const data = await res.body.text()
72
- t.equal(data, 'hello world')
72
+ t.assert.strictEqual(data, 'hello world')
73
73
  })
@@ -1,9 +1,9 @@
1
1
  'use strict'
2
2
 
3
- const { test } = require('tap')
3
+ const { test } = require('node:test')
4
4
  const Fastify = require('fastify')
5
+ const { request } = require('undici')
5
6
  const http = require('node:http')
6
- const get = require('simple-get').concat
7
7
  const undici = require('undici')
8
8
  const From = require('..')
9
9
 
@@ -15,7 +15,7 @@ test('undici global agent is used, but not destroyed', async (t) => {
15
15
  undici.setGlobalDispatcher(mockAgent)
16
16
  const instance = Fastify()
17
17
 
18
- t.teardown(instance.close.bind(instance))
18
+ t.after(() => instance.close())
19
19
 
20
20
  const target = http.createServer((_req, res) => {
21
21
  res.statusCode = 200
@@ -26,41 +26,22 @@ test('undici global agent is used, but not destroyed', async (t) => {
26
26
  reply.from()
27
27
  })
28
28
 
29
- t.teardown(target.close.bind(target))
29
+ t.after(() => target.close())
30
30
 
31
- const executionFlow = () => new Promise((resolve) => {
32
- target.listen({ port: 0 }, (err) => {
33
- t.error(err)
31
+ await new Promise(resolve => target.listen({ port: 0 }, resolve))
34
32
 
35
- instance.register(From, {
36
- base: `http://localhost:${target.address().port}`,
37
- globalAgent: true
38
- })
39
-
40
- instance.listen({ port: 0 }, (err) => {
41
- t.error(err)
33
+ instance.register(From, {
34
+ base: `http://localhost:${target.address().port}`,
35
+ globalAgent: true
36
+ })
42
37
 
43
- get(
44
- `http://localhost:${instance.server.address().port}`,
45
- (err, res) => {
46
- t.error(err)
47
- t.equal(res.statusCode, 200)
38
+ await new Promise(resolve => instance.listen({ port: 0 }, resolve))
48
39
 
49
- get(
50
- `http://localhost:${instance.server.address().port}`,
51
- (err, res) => {
52
- t.error(err)
53
- t.equal(res.statusCode, 200)
54
- resolve()
55
- }
56
- )
57
- }
58
- )
59
- })
60
- })
61
- })
40
+ const result = await request(`http://localhost:${instance.server.address().port}`)
41
+ t.assert.strictEqual(result.statusCode, 200)
62
42
 
63
- await executionFlow()
43
+ const result1 = await request(`http://localhost:${instance.server.address().port}`)
44
+ t.assert.strictEqual(result1.statusCode, 200)
64
45
 
65
46
  target.close()
66
47
  })
@@ -1,6 +1,6 @@
1
1
  'use strict'
2
2
 
3
- const { test } = require('tap')
3
+ const { test } = require('node:test')
4
4
  const Fastify = require('fastify')
5
5
  const undici = require('undici')
6
6
  const From = require('..')
@@ -12,7 +12,7 @@ test('destroyAgent false', async (t) => {
12
12
  }
13
13
  const instance = Fastify()
14
14
 
15
- t.teardown(instance.close.bind(instance))
15
+ t.after(() => instance.close())
16
16
 
17
17
  instance.get('/', (_request, reply) => {
18
18
  reply.from()
@@ -1,31 +1,32 @@
1
1
  'use strict'
2
2
 
3
- const t = require('tap')
3
+ const t = require('node:test')
4
+ const assert = require('node:assert')
4
5
  const Fastify = require('fastify')
6
+ const { request } = require('undici')
5
7
  const proxyquire = require('proxyquire')
6
8
  const http = require('node:http')
7
- const get = require('simple-get').concat
8
9
  const undici = require('undici')
9
10
  const { getUndiciOptions } = require('../lib/request')
10
11
 
11
12
  const instance = Fastify()
12
13
 
13
- t.plan(6)
14
- t.teardown(instance.close.bind(instance))
14
+ t.test('undici options', async (t) => {
15
+ t.plan(2)
16
+ t.after(() => instance.close())
15
17
 
16
- const target = http.createServer((_req, res) => {
17
- res.statusCode = 200
18
- res.end('hello world')
19
- })
18
+ const target = http.createServer((_req, res) => {
19
+ res.statusCode = 200
20
+ res.end('hello world')
21
+ })
20
22
 
21
- instance.get('/', (_request, reply) => {
22
- reply.from()
23
- })
23
+ instance.get('/', (_request, reply) => {
24
+ reply.from()
25
+ })
24
26
 
25
- t.teardown(target.close.bind(target))
27
+ t.after(() => target.close())
26
28
 
27
- target.listen({ port: 0 }, err => {
28
- t.error(err)
29
+ await new Promise(resolve => target.listen({ port: 0 }, resolve))
29
30
 
30
31
  const From = proxyquire('..', {
31
32
  './lib/request.js': proxyquire('../lib/request.js', {
@@ -38,28 +39,24 @@ target.listen({ port: 0 }, err => {
38
39
  undici: buildUndiciOptions()
39
40
  })
40
41
 
41
- instance.listen({ port: 0 }, err => {
42
- t.error(err)
42
+ await new Promise(resolve => instance.listen({ port: 0 }, resolve))
43
43
 
44
- get(`http://localhost:${instance.server.address().port}`, (err, res, data) => {
45
- t.error(err)
46
- t.equal(res.statusCode, 200)
47
- t.equal(data.toString(), 'hello world')
48
- })
49
- })
44
+ const result = await request(`http://localhost:${instance.server.address().port}`)
45
+ t.assert.strictEqual(result.statusCode, 200)
46
+ t.assert.strictEqual(await result.body.text(), 'hello world')
50
47
  })
51
48
 
52
49
  function undiciProxy () {}
53
50
  undiciProxy.Agent = class Agent extends undici.Agent {
54
51
  constructor (opts) {
55
52
  super(opts)
56
- t.strictSame(opts, buildUndiciOptions())
53
+ assert.deepStrictEqual(opts, buildUndiciOptions())
57
54
  }
58
55
  }
59
56
  undiciProxy.Pool = class Pool extends undici.Pool {
60
57
  constructor (url, options) {
61
58
  super(url, options)
62
- t.hasStrict(options, buildUndiciOptions())
59
+ assert.deepStrictEqual(options, buildUndiciOptions())
63
60
  }
64
61
  }
65
62
 
@@ -3,6 +3,7 @@
3
3
  const { test, after } = require('node:test')
4
4
  const { createServer } = require('node:http')
5
5
  const Fastify = require('fastify')
6
+ const { request } = require('undici')
6
7
  const { createProxy } = require('proxy')
7
8
  const fastifyProxyFrom = require('..')
8
9
  const { isIPv6 } = require('node:net')
@@ -78,10 +79,10 @@ for (const [description, format] of Object.entries(configFormat)) {
78
79
  }
79
80
  }
80
81
 
81
- const response = await fetch(`http://localhost:${instance.server.address().port}`)
82
+ const response = await request(`http://localhost:${instance.server.address().port}`)
82
83
 
83
- t.assert.strictEqual(response.status, 200)
84
- t.assert.deepStrictEqual(await response.json(), { hello: 'world' })
84
+ t.assert.strictEqual(response.statusCode, 200)
85
+ t.assert.deepStrictEqual(await response.body.json(), { hello: 'world' })
85
86
  })
86
87
  }
87
88
 
@@ -1,9 +1,9 @@
1
1
  'use strict'
2
2
 
3
3
  const Fastify = require('fastify')
4
+ const { request, Agent } = require('undici')
4
5
  const From = require('..')
5
- const got = require('got')
6
- const { test } = require('tap')
6
+ const { test } = require('node:test')
7
7
 
8
8
  let retryNum = 1
9
9
 
@@ -20,10 +20,10 @@ const target = require('node:http').createServer(function (req, res) {
20
20
  })
21
21
 
22
22
  test('Will retry', async function (t) {
23
- t.teardown(() => { retryNum = 1 })
23
+ t.after(() => { retryNum = 1 })
24
24
 
25
- await target.listen({ port: 0 })
26
- t.teardown(target.close.bind(target))
25
+ await new Promise(resolve => target.listen({ port: 0 }, resolve))
26
+ t.after(() => target.close())
27
27
 
28
28
  const instance = Fastify()
29
29
 
@@ -33,24 +33,24 @@ test('Will retry', async function (t) {
33
33
  reply.from(`http://localhost:${target.address().port}/`, {
34
34
  retriesCount: 1,
35
35
  onError: (reply, { error }) => {
36
- t.equal(error.code, 'UND_ERR_SOCKET')
36
+ t.assert.strictEqual(error.code, 'UND_ERR_SOCKET')
37
37
  reply.send(error)
38
38
  }
39
39
  })
40
40
  })
41
41
 
42
42
  await instance.listen({ port: 0 })
43
- t.teardown(instance.close.bind(instance))
43
+ t.after(() => instance.close())
44
44
 
45
- const { statusCode } = await got.get(`http://localhost:${instance.server.address().port}/`, { retry: 0 })
46
- t.equal(statusCode, 200)
45
+ const { statusCode } = await request(`http://localhost:${instance.server.address().port}/`, { dispatcher: new Agent({ pipelining: 0 }) })
46
+ t.assert.strictEqual(statusCode, 200)
47
47
  })
48
48
 
49
49
  test('will not retry', async function (t) {
50
- t.teardown(() => { retryNum = 1 })
50
+ t.after(() => { retryNum = 1 })
51
51
 
52
- await target.listen({ port: 0 })
53
- t.teardown(target.close.bind(target))
52
+ await new Promise(resolve => target.listen({ port: 0 }, resolve))
53
+ t.after(() => target.close())
54
54
 
55
55
  const instance = Fastify()
56
56
 
@@ -60,28 +60,25 @@ test('will not retry', async function (t) {
60
60
  reply.from(`http://localhost:${target.address().port}/`, {
61
61
  retriesCount: 0,
62
62
  onError: (reply, { error }) => {
63
- t.equal(error.code, 'UND_ERR_SOCKET')
63
+ t.assert.strictEqual(error.code, 'UND_ERR_SOCKET')
64
64
  reply.send(error)
65
65
  }
66
66
  })
67
67
  })
68
68
 
69
69
  await instance.listen({ port: 0 })
70
- t.teardown(instance.close.bind(instance))
70
+ t.after(() => instance.close())
71
71
 
72
- try {
73
- await got.get(`http://localhost:${instance.server.address().port}/`, { retry: 0 })
74
- t.fail()
75
- } catch (err) {
76
- t.equal(err.response.statusCode, 500)
77
- }
72
+ const result = await request(`http://localhost:${instance.server.address().port}/`, { dispatcher: new Agent({ pipelining: 0 }) })
73
+
74
+ t.assert.strictEqual(result.statusCode, 500)
78
75
  })
79
76
 
80
77
  test('will not retry unsupported method', async function (t) {
81
- t.teardown(() => { retryNum = 1 })
78
+ t.after(() => { retryNum = 1 })
82
79
 
83
- await target.listen({ port: 0 })
84
- t.teardown(target.close.bind(target))
80
+ await new Promise(resolve => target.listen({ port: 0 }, resolve))
81
+ t.after(() => target.close())
85
82
 
86
83
  const instance = Fastify()
87
84
 
@@ -91,19 +88,15 @@ test('will not retry unsupported method', async function (t) {
91
88
  reply.from(`http://localhost:${target.address().port}/`, {
92
89
  retriesCount: 1,
93
90
  onError: (reply, { error }) => {
94
- t.equal(error.code, 'UND_ERR_SOCKET')
91
+ t.assert.strictEqual(error.code, 'UND_ERR_SOCKET')
95
92
  reply.send(error)
96
93
  }
97
94
  })
98
95
  })
99
96
 
100
97
  await instance.listen({ port: 0 })
101
- t.teardown(instance.close.bind(instance))
98
+ t.after(() => instance.close())
102
99
 
103
- try {
104
- await got.get(`http://localhost:${instance.server.address().port}/`, { retry: 0 })
105
- t.fail()
106
- } catch (err) {
107
- t.equal(err.response.statusCode, 500)
108
- }
100
+ const result = await request(`http://localhost:${instance.server.address().port}/`, { dispatcher: new Agent({ pipelining: 0 }) })
101
+ t.assert.strictEqual(result.statusCode, 500)
109
102
  })