fastify 4.28.0 → 5.0.0-alpha.2

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 (328) hide show
  1. package/.markdownlint-cli2.yaml +1 -1
  2. package/.tap/processinfo/{86b9786f-4a98-43b8-882a-5f936b876f08.json → 09002e93-10ad-430c-bc86-c0576928b0ed.json} +60 -60
  3. package/.tap/processinfo/{70168912-9bb2-4334-bb89-041f1764cddf.json → ee66c5ab-635d-48b5-8be6-3dc3ceea5bfc.json} +71 -71
  4. package/.tap/test-results/test/build/error-serializer.test.js.tap +6 -2
  5. package/.tap/test-results/test/build/version.test.js.tap +1 -1
  6. package/.taprc +4 -8
  7. package/README.md +3 -6
  8. package/build/build-error-serializer.js +4 -1
  9. package/build/build-validation.js +5 -4
  10. package/docs/Guides/Database.md +1 -1
  11. package/docs/Guides/Delay-Accepting-Requests.md +3 -3
  12. package/docs/Guides/Ecosystem.md +2 -0
  13. package/docs/Guides/Migration-Guide-V5.md +20 -0
  14. package/docs/Guides/Write-Type-Provider.md +4 -2
  15. package/docs/Reference/ContentTypeParser.md +30 -1
  16. package/docs/Reference/Decorators.md +42 -16
  17. package/docs/Reference/Errors.md +10 -2
  18. package/docs/Reference/Hooks.md +48 -14
  19. package/docs/Reference/Logging.md +5 -5
  20. package/docs/Reference/Reply.md +23 -18
  21. package/docs/Reference/Request.md +5 -1
  22. package/docs/Reference/Routes.md +24 -28
  23. package/docs/Reference/Server.md +14 -53
  24. package/docs/Reference/Type-Providers.md +21 -26
  25. package/docs/Reference/TypeScript.md +46 -29
  26. package/docs/Reference/Warnings.md +0 -8
  27. package/eslint.config.js +27 -0
  28. package/examples/typescript-server.ts +14 -14
  29. package/fastify.d.ts +15 -14
  30. package/fastify.js +41 -15
  31. package/lib/configValidator.js +94 -76
  32. package/lib/contentTypeParser.js +54 -88
  33. package/lib/decorate.js +3 -7
  34. package/lib/error-serializer.js +2 -1
  35. package/lib/errors.js +31 -6
  36. package/lib/handleRequest.js +70 -39
  37. package/lib/httpMethods.js +34 -18
  38. package/lib/logger.js +24 -6
  39. package/lib/pluginUtils.js +5 -5
  40. package/lib/reply.js +7 -10
  41. package/lib/request.js +37 -19
  42. package/lib/route.js +6 -34
  43. package/lib/server.js +62 -123
  44. package/lib/warnings.js +24 -29
  45. package/lib/wrapThenable.js +46 -22
  46. package/package.json +38 -58
  47. package/test/404s.test.js +8 -12
  48. package/test/async-await.test.js +46 -2
  49. package/test/build/error-serializer.test.js +4 -2
  50. package/test/check.test.js +225 -0
  51. package/test/close-pipelining.test.js +2 -41
  52. package/test/close.test.js +1 -41
  53. package/test/content-parser.test.js +69 -117
  54. package/test/custom-parser.1.test.js +40 -1
  55. package/test/decorator-namespace.test._js_ +31 -0
  56. package/test/decorator.test.js +92 -43
  57. package/test/delete.test.js +21 -1
  58. package/test/diagnostics-channel/404.test.js +57 -0
  59. package/test/diagnostics-channel/async-delay-request.test.js +74 -0
  60. package/test/diagnostics-channel/async-request.test.js +72 -0
  61. package/test/diagnostics-channel/error-before-handler.test.js +36 -0
  62. package/test/diagnostics-channel/error-request.test.js +61 -0
  63. package/test/diagnostics-channel/error-status.test.js +39 -0
  64. package/test/{diagnostics-channel.test.js → diagnostics-channel/init.test.js} +6 -16
  65. package/test/diagnostics-channel/sync-delay-request.test.js +58 -0
  66. package/test/diagnostics-channel/sync-request-reply.test.js +58 -0
  67. package/test/diagnostics-channel/sync-request.test.js +61 -0
  68. package/test/encapsulated-error-handler.test.js +201 -14
  69. package/test/esm/index.test.js +2 -12
  70. package/test/findRoute.test.js +16 -0
  71. package/test/genReqId.test.js +9 -0
  72. package/test/get.test.js +28 -0
  73. package/test/has-route.test.js +1 -1
  74. package/test/helper.js +1 -5
  75. package/test/hooks.test.js +0 -4
  76. package/test/http2/constraint.test.js +22 -1
  77. package/test/http2/plain.test.js +21 -6
  78. package/test/http2/secure.test.js +12 -1
  79. package/test/https/https.test.js +57 -0
  80. package/test/inject.test.js +1 -2
  81. package/test/internals/decorator.test.js +0 -2
  82. package/test/internals/errors.test.js +57 -17
  83. package/test/internals/handleRequest.test.js +5 -1
  84. package/test/internals/initialConfig.test.js +5 -5
  85. package/test/internals/logger.test.js +31 -2
  86. package/test/internals/reply.test.js +6 -78
  87. package/test/internals/request.test.js +13 -11
  88. package/test/listen.1.test.js +5 -15
  89. package/test/listen.5.test.js +88 -0
  90. package/test/logger/instantiation.test.js +8 -8
  91. package/test/logger/logging.test.js +4 -4
  92. package/test/logger/options.test.js +102 -21
  93. package/test/logger/response.test.js +6 -6
  94. package/test/maxRequestsPerSocket.test.js +2 -5
  95. package/test/method-missing.test.js +24 -0
  96. package/test/plugin.1.test.js +2 -4
  97. package/test/plugin.2.test.js +0 -2
  98. package/test/plugin.3.test.js +0 -2
  99. package/test/plugin.4.test.js +92 -56
  100. package/test/register.test.js +2 -4
  101. package/test/reply-earlyHints.test.js +98 -0
  102. package/test/reply-error.test.js +0 -2
  103. package/test/route-hooks.test.js +0 -1
  104. package/test/route-shorthand.test.js +60 -0
  105. package/test/schema-special-usage.test.js +1 -1
  106. package/test/server.test.js +17 -2
  107. package/test/stream.2.test.js +1 -1
  108. package/test/stream.4.test.js +0 -42
  109. package/test/stream.5.test.js +2 -2
  110. package/test/trust-proxy.test.js +33 -27
  111. package/test/types/errors.test-d.ts +0 -2
  112. package/test/types/fastify.test-d.ts +14 -12
  113. package/test/types/hooks.test-d.ts +1 -0
  114. package/test/types/import.ts +1 -0
  115. package/test/types/instance.test-d.ts +10 -51
  116. package/test/types/logger.test-d.ts +43 -6
  117. package/test/types/plugin.test-d.ts +5 -2
  118. package/test/types/register.test-d.ts +2 -2
  119. package/test/types/reply.test-d.ts +13 -12
  120. package/test/types/request.test-d.ts +19 -8
  121. package/test/types/route.test-d.ts +30 -2
  122. package/test/types/schema.test-d.ts +2 -2
  123. package/test/types/serverFactory.test-d.ts +1 -1
  124. package/test/types/type-provider.test-d.ts +59 -12
  125. package/test/types/using.test-d.ts +4 -1
  126. package/test/url-rewriting.test.js +3 -2
  127. package/test/useSemicolonDelimiter.test.js +3 -6
  128. package/test/versioned-routes.test.js +1 -1
  129. package/test/web-api.test.js +0 -6
  130. package/types/content-type-parser.d.ts +3 -3
  131. package/types/context.d.ts +0 -1
  132. package/types/errors.d.ts +1 -0
  133. package/types/hooks.d.ts +6 -6
  134. package/types/instance.d.ts +28 -41
  135. package/types/logger.d.ts +3 -3
  136. package/types/plugin.d.ts +3 -3
  137. package/types/reply.d.ts +9 -12
  138. package/types/request.d.ts +5 -3
  139. package/types/route.d.ts +31 -31
  140. package/types/schema.d.ts +3 -3
  141. package/types/serverFactory.d.ts +2 -2
  142. package/types/type-provider.d.ts +22 -12
  143. package/types/utils.d.ts +18 -23
  144. package/.c8rc.json +0 -8
  145. package/.eslintrc +0 -4
  146. package/.tap/processinfo/029eb7a1-1942-40bc-98e2-cef3b7a14b5e.json +0 -268
  147. package/.tap/processinfo/03c196c6-01c3-4268-a9b5-298dff18a873.json +0 -269
  148. package/.tap/processinfo/04bbabba-8611-4908-9092-dfa9fcc13327.json +0 -268
  149. package/.tap/processinfo/05d8a743-3edf-4e2d-ae5a-dc99d0855ba5.json +0 -272
  150. package/.tap/processinfo/07718963-36a8-4d87-82ad-366c877a5247.json +0 -268
  151. package/.tap/processinfo/08fe3bde-5814-4308-9158-cdf1e47391b7.json +0 -268
  152. package/.tap/processinfo/0a3e3fb0-eabf-4532-ae80-20434da22678.json +0 -268
  153. package/.tap/processinfo/0caf2a75-4b3a-46c4-9b41-c7e450e5e15f.json +0 -268
  154. package/.tap/processinfo/0cf35d52-e5b2-4884-bcf0-b0ab3017b689.json +0 -268
  155. package/.tap/processinfo/0e666134-5013-4ecd-9ee6-59b22716c39c.json +0 -268
  156. package/.tap/processinfo/1087b811-4ec4-4f91-92b4-a78a51a437de.json +0 -268
  157. package/.tap/processinfo/13709ed3-b68c-42cf-8472-b0c4b8a89d2b.json +0 -268
  158. package/.tap/processinfo/13ac2f18-d0e0-439f-bc86-2ff0119af857.json +0 -268
  159. package/.tap/processinfo/13e47e0e-f6e8-4381-8a42-923b661f4a4f.json +0 -268
  160. package/.tap/processinfo/143f7d43-b8e8-4666-b482-f28fb37160ee.json +0 -268
  161. package/.tap/processinfo/14f3801d-03ab-4db3-9df5-c5d47e0a8cf0.json +0 -270
  162. package/.tap/processinfo/15a07dad-4bcd-442c-95e0-30c31f2b9818.json +0 -273
  163. package/.tap/processinfo/191ad3ad-04d8-4fb9-b119-ad2811f9b925.json +0 -243
  164. package/.tap/processinfo/1b25d54b-62d3-44cd-b581-31e705522fae.json +0 -268
  165. package/.tap/processinfo/1b7cb260-f04b-4135-a4fe-093081c4706f.json +0 -268
  166. package/.tap/processinfo/1e395d63-4815-4c77-aa47-df3709cc0ef9.json +0 -268
  167. package/.tap/processinfo/1e7f6a54-3abf-4771-863a-585cba110aec.json +0 -268
  168. package/.tap/processinfo/21a15e1d-0b41-47d8-b03d-0ba130969034.json +0 -244
  169. package/.tap/processinfo/21e02016-9ecd-4983-8417-9c74d224644f.json +0 -269
  170. package/.tap/processinfo/2327d941-d0d5-4762-b386-02a9a27ad28e.json +0 -268
  171. package/.tap/processinfo/23d39204-eac9-4f57-8db4-ffa996227fbd.json +0 -268
  172. package/.tap/processinfo/2493875a-0ac6-4d53-993c-f44471fd0678.json +0 -268
  173. package/.tap/processinfo/2698669f-f1e7-4a12-a687-8d58177be2b0.json +0 -269
  174. package/.tap/processinfo/2862b053-0a3d-46d7-9381-ffcb06287609.json +0 -268
  175. package/.tap/processinfo/2ac1b8d6-ac92-40e2-a59a-7681069f487c.json +0 -268
  176. package/.tap/processinfo/2c75e5f7-c4ef-47e4-a1c4-105eef6c0fab.json +0 -242
  177. package/.tap/processinfo/2e2c45cd-718b-4e5a-bf88-f801630f2803.json +0 -268
  178. package/.tap/processinfo/2f9ca478-3e03-4cce-a0bc-fcdc86d7c316.json +0 -268
  179. package/.tap/processinfo/30e3117f-fb74-456f-8f02-527e9eb9fcc3.json +0 -268
  180. package/.tap/processinfo/332be679-63c7-4b49-8b87-ef55995ada2d.json +0 -268
  181. package/.tap/processinfo/37c36f95-07f9-4ef0-8ab4-9e107d51b605.json +0 -269
  182. package/.tap/processinfo/3874eae2-f3db-44ef-9a9f-c8169d4b2b76.json +0 -268
  183. package/.tap/processinfo/38a7c3da-a411-41d0-8993-9deefd23500d.json +0 -268
  184. package/.tap/processinfo/3a7b6dbd-e153-4ce5-b557-21fb82009983.json +0 -269
  185. package/.tap/processinfo/3c6731ec-936d-470f-b7b0-0c87b54be051.json +0 -268
  186. package/.tap/processinfo/3c850ea9-4ef0-4044-a3fd-fbadfa9d543e.json +0 -268
  187. package/.tap/processinfo/3e4e15e0-a325-46f0-be57-5fd374560b7a.json +0 -269
  188. package/.tap/processinfo/3ed868e0-887c-402a-9f22-b1fdb74b4da0.json +0 -268
  189. package/.tap/processinfo/405498d7-5854-4ce1-a7dc-06920932f26d.json +0 -268
  190. package/.tap/processinfo/40b7eb19-ae35-4490-8a11-eb91a573c590.json +0 -268
  191. package/.tap/processinfo/40bb1260-d856-4248-8939-a0a05e322041.json +0 -268
  192. package/.tap/processinfo/41252e0b-7f69-44cc-b356-dd94bcbfdb29.json +0 -268
  193. package/.tap/processinfo/418fa710-e2fd-4508-b533-c179958da464.json +0 -269
  194. package/.tap/processinfo/433ef009-63aa-48fe-8e5d-c725228fa2fc.json +0 -268
  195. package/.tap/processinfo/44bf577c-9c01-4197-bd29-2e1ae888c4d4.json +0 -268
  196. package/.tap/processinfo/458fb7f2-20b9-48a2-8853-403c9851f605.json +0 -268
  197. package/.tap/processinfo/46b9892b-bb23-4b86-b0fa-9297f08c611a.json +0 -268
  198. package/.tap/processinfo/46bd9aaf-6cf3-4bd5-b90d-e136a7299a8e.json +0 -268
  199. package/.tap/processinfo/4779aa5f-e57a-4fcc-87e2-7d0bd4fca27f.json +0 -268
  200. package/.tap/processinfo/47b73f4b-ab31-49e1-97fd-8436dbe4bdf3.json +0 -269
  201. package/.tap/processinfo/49dba52e-e0c9-445d-8e9d-6d9ebe3ce6c4.json +0 -268
  202. package/.tap/processinfo/4b1dbc61-4e65-4c56-9784-2036f369038a.json +0 -268
  203. package/.tap/processinfo/4b6f0b40-43ef-4668-83a0-e07e28509df5.json +0 -268
  204. package/.tap/processinfo/4c236f70-f532-460b-8f7a-dd973301d493.json +0 -268
  205. package/.tap/processinfo/4d92b707-a268-48b8-885b-004d3a288c41.json +0 -269
  206. package/.tap/processinfo/4ff10bae-7c97-4c0a-b712-6c0d2f8c0e8e.json +0 -270
  207. package/.tap/processinfo/50f95bd5-ae12-4d83-99f4-ae9b0690c6a8.json +0 -268
  208. package/.tap/processinfo/557e4a49-d99c-4a63-b2f2-f33d897ab874.json +0 -268
  209. package/.tap/processinfo/589fd21a-8319-4abf-8cf7-82cb4a463a4b.json +0 -269
  210. package/.tap/processinfo/5a872f3a-949f-40be-8004-d739d034255c.json +0 -272
  211. package/.tap/processinfo/5abc301a-23da-424d-891e-3afbaff9156c.json +0 -269
  212. package/.tap/processinfo/5c31614c-a766-4837-ab59-dd6977166f72.json +0 -253
  213. package/.tap/processinfo/5d1e90c8-d819-4901-b022-f9ea4cd81978.json +0 -268
  214. package/.tap/processinfo/5d283e67-f31d-4fa8-a559-a1d8e82ee046.json +0 -269
  215. package/.tap/processinfo/5df505bc-6a4b-4c41-822f-51e2d7111de8.json +0 -268
  216. package/.tap/processinfo/5eaf64a2-fbfd-40e7-b391-c30f744b2bf1.json +0 -269
  217. package/.tap/processinfo/5ef5ede0-6436-4938-8401-d32ad4bffd5d.json +0 -268
  218. package/.tap/processinfo/606f05c0-8293-41db-bc92-eea82123697f.json +0 -269
  219. package/.tap/processinfo/6446806d-6cab-4c1d-a9ed-6bccaf3c4ea9.json +0 -268
  220. package/.tap/processinfo/64da7e08-925d-444d-98de-6568c6115d8d.json +0 -269
  221. package/.tap/processinfo/6917da6d-d2dc-466a-a893-7fb7412dde96.json +0 -268
  222. package/.tap/processinfo/69bbeee0-c398-4ccf-98b3-fb625a63bab4.json +0 -268
  223. package/.tap/processinfo/6da6ea8f-3370-4703-b230-90159531f766.json +0 -268
  224. package/.tap/processinfo/6ecffe1f-3016-4c11-9294-b488baced99f.json +0 -268
  225. package/.tap/processinfo/6f23f41f-ccbd-48cb-9ab6-311db0cfb65c.json +0 -270
  226. package/.tap/processinfo/713a674e-40e1-46b4-866e-949d57c1a9f9.json +0 -270
  227. package/.tap/processinfo/730254d4-eacb-4cdf-80f4-8da22341cde5.json +0 -268
  228. package/.tap/processinfo/7344e559-c546-416f-8f1b-0f9fe12c6f02.json +0 -268
  229. package/.tap/processinfo/7556217a-0155-448f-b4d4-bec1bb0f6040.json +0 -269
  230. package/.tap/processinfo/7572079c-166c-4c4c-85ff-89b9430b214f.json +0 -268
  231. package/.tap/processinfo/7808180f-1974-47cd-bba2-2d6b8b711d65.json +0 -273
  232. package/.tap/processinfo/796dde83-da66-4db2-8d27-d45a3627c9c7.json +0 -268
  233. package/.tap/processinfo/7979819f-3723-48be-9f55-be700e689441.json +0 -270
  234. package/.tap/processinfo/7a664d39-d7f5-42f9-89df-15563048fab6.json +0 -268
  235. package/.tap/processinfo/7b047b72-01d9-4217-857c-93341651b4b3.json +0 -269
  236. package/.tap/processinfo/7ce41af6-7961-45ae-8c6f-b6e1c5692a48.json +0 -268
  237. package/.tap/processinfo/7e1de1c6-127e-463d-9357-081ee33ef5ce.json +0 -269
  238. package/.tap/processinfo/81ac7a7f-b0c0-4ef6-82cb-c718ea84e152.json +0 -268
  239. package/.tap/processinfo/851a058f-a497-4b10-a0b7-c9182d9c4d5a.json +0 -268
  240. package/.tap/processinfo/86502974-c245-4194-ade4-d9c6fdbb757e.json +0 -268
  241. package/.tap/processinfo/8a3fe726-86ab-4300-8d73-7eacbbc02a05.json +0 -268
  242. package/.tap/processinfo/8adf928b-c963-4ba0-9c35-606fcbd8a2aa.json +0 -272
  243. package/.tap/processinfo/8b31a6d8-1a33-4a27-93ca-1c5b364be068.json +0 -240
  244. package/.tap/processinfo/8ec12773-6b18-49a2-8e52-874c797df965.json +0 -833
  245. package/.tap/processinfo/8edb9502-3420-42fb-a602-e5de93be2df1.json +0 -268
  246. package/.tap/processinfo/8fc572e6-9828-4f98-a49c-9e081b2193c4.json +0 -242
  247. package/.tap/processinfo/8fee2d30-c5dd-4fae-9cf2-2ef8dd0f90de.json +0 -834
  248. package/.tap/processinfo/92cc0496-5f26-4370-8212-18136b972f99.json +0 -268
  249. package/.tap/processinfo/93a3f064-3f6e-4f49-becb-f7925f2961a9.json +0 -268
  250. package/.tap/processinfo/967e3697-8310-4a19-8dd5-927ac8bd6c79.json +0 -269
  251. package/.tap/processinfo/97225e23-9d30-4287-b3f5-72bccebec50b.json +0 -268
  252. package/.tap/processinfo/9a363bc6-4e65-47e8-94ca-26a9db428fb4.json +0 -268
  253. package/.tap/processinfo/9d2fe462-57fa-43f1-b02c-d188f15de30b.json +0 -270
  254. package/.tap/processinfo/a00b6cda-feb7-4b8a-8179-4c43bc29d670.json +0 -269
  255. package/.tap/processinfo/a017cbd5-4ac7-49e1-8c77-1bf4f6e7f2a6.json +0 -271
  256. package/.tap/processinfo/a1277309-1984-48f8-b60b-f5e8639736be.json +0 -271
  257. package/.tap/processinfo/a16bf53e-4337-48ff-88fa-67f55738e0f5.json +0 -268
  258. package/.tap/processinfo/a3a9848f-440e-41bb-9b0b-568bcfee0ddc.json +0 -268
  259. package/.tap/processinfo/a468c11f-f2f1-4e92-9ba0-6d28b6569b72.json +0 -268
  260. package/.tap/processinfo/a5880465-68f1-46b3-84a5-0da389d0bc67.json +0 -268
  261. package/.tap/processinfo/a666f394-39b4-44ad-8e74-abebf74dde3b.json +0 -270
  262. package/.tap/processinfo/af09d8ca-7053-4410-b514-b22c47f5979f.json +0 -268
  263. package/.tap/processinfo/af203309-28aa-459d-a56e-d88833695521.json +0 -268
  264. package/.tap/processinfo/afa2f7b6-dcd2-4d90-bf3c-54ba8b6800eb.json +0 -268
  265. package/.tap/processinfo/b231291d-ef14-4ff0-85f9-38a73a5408f8.json +0 -268
  266. package/.tap/processinfo/b3d3f2a1-a9fc-4d88-b122-fae90248cd59.json +0 -268
  267. package/.tap/processinfo/b834bf83-26c4-403a-8e91-eb15fe4b0b5d.json +0 -268
  268. package/.tap/processinfo/b8786fd7-47df-4ac1-8d6f-2d4c7623c681.json +0 -268
  269. package/.tap/processinfo/b9758f53-7f5a-4b03-8684-8a42ad644e5a.json +0 -268
  270. package/.tap/processinfo/bd194ea2-a21a-4604-b225-ee48abf1e607.json +0 -242
  271. package/.tap/processinfo/bd7ced53-3872-43b7-ad73-3352e50b728b.json +0 -268
  272. package/.tap/processinfo/be50295b-7e50-46cd-8bf1-637bf222699c.json +0 -268
  273. package/.tap/processinfo/bec61dd9-aa52-4e6c-8e37-5c9c10e935fd.json +0 -268
  274. package/.tap/processinfo/c015adf9-1d60-447e-87b5-b2031fe55bba.json +0 -268
  275. package/.tap/processinfo/c0666afa-7f64-45bd-97fb-145df1380157.json +0 -268
  276. package/.tap/processinfo/c2c0c012-c1c0-4457-84d6-dadba8396c94.json +0 -268
  277. package/.tap/processinfo/c3dd3ecd-737b-47ce-a917-54341c7bbed3.json +0 -268
  278. package/.tap/processinfo/c41ac06d-64b8-4bb3-bf56-0551f5a48f4b.json +0 -268
  279. package/.tap/processinfo/c4235bfb-a2aa-4271-9c6b-3ceb370219b1.json +0 -268
  280. package/.tap/processinfo/c4e6f24f-288c-493c-b6f0-02924aeb6758.json +0 -270
  281. package/.tap/processinfo/c54227bb-4a7b-40bb-bfe6-b54fe55078f3.json +0 -268
  282. package/.tap/processinfo/c699de91-3b0b-4466-9418-6910a3eb640a.json +0 -269
  283. package/.tap/processinfo/c74e2f37-451a-4577-ac18-e597fbd9a1d4.json +0 -269
  284. package/.tap/processinfo/c90cccec-5b4b-445f-a935-ac22859675d0.json +0 -252
  285. package/.tap/processinfo/c9dd6c7d-0d16-45e5-87ae-117388bf2994.json +0 -268
  286. package/.tap/processinfo/ca2e48fb-58c5-47fc-ad2e-263838aea42c.json +0 -272
  287. package/.tap/processinfo/ca87351d-c710-45c1-838a-16bccac59874.json +0 -273
  288. package/.tap/processinfo/cdb4a671-5776-4944-91b9-c456c58841ef.json +0 -268
  289. package/.tap/processinfo/cf10fdc8-6a87-447a-9e12-45f447af61f3.json +0 -244
  290. package/.tap/processinfo/cf3f1f08-643e-4f24-82ca-40f7a349c3d1.json +0 -268
  291. package/.tap/processinfo/d091172a-06a5-469b-82a9-8fefe3dd99da.json +0 -240
  292. package/.tap/processinfo/d1675431-61d6-45f8-a010-6e654112a00a.json +0 -272
  293. package/.tap/processinfo/d2d54aa2-c221-4ad4-b6b7-0c58e3c3679c.json +0 -269
  294. package/.tap/processinfo/d4f3c95a-ddbe-419d-bce0-dd6acceee21f.json +0 -268
  295. package/.tap/processinfo/d54ed8f1-43c3-478a-90d3-2c8aced723f2.json +0 -269
  296. package/.tap/processinfo/d6e5a2a6-4647-4d98-916c-aec4ace54a65.json +0 -268
  297. package/.tap/processinfo/d7280c64-45e6-4b12-affc-3ac9a5d4014a.json +0 -268
  298. package/.tap/processinfo/d82c8367-d825-4405-88df-07298f6ef840.json +0 -269
  299. package/.tap/processinfo/d8f97e53-e921-4d33-9c8d-2f7e807a9425.json +0 -268
  300. package/.tap/processinfo/da546a73-9714-4f8c-bdbb-e42730edbcfa.json +0 -268
  301. package/.tap/processinfo/da7fb7fb-1da4-49f8-a3ee-d4ea623c01a5.json +0 -268
  302. package/.tap/processinfo/daa6a016-4f0c-4050-923c-2022e0bb21d8.json +0 -268
  303. package/.tap/processinfo/db9a251d-8540-4719-b464-e7d5febd97d1.json +0 -240
  304. package/.tap/processinfo/dc10c603-8e58-4611-baa3-44da2578d07a.json +0 -268
  305. package/.tap/processinfo/dde56c1a-858c-47cc-b0bb-61279620ac17.json +0 -268
  306. package/.tap/processinfo/e0d9c4ea-f7c7-4c64-8ced-66dc6f0ac5d2.json +0 -271
  307. package/.tap/processinfo/e121454f-5dfa-4209-ba15-4c39840871f2.json +0 -831
  308. package/.tap/processinfo/e1f43e40-c3fe-4eb8-a713-d5910cc6b25a.json +0 -268
  309. package/.tap/processinfo/e4575e7a-f00e-488b-94e1-8f877b54725e.json +0 -268
  310. package/.tap/processinfo/e9ad667e-8603-4488-af64-449cc9532803.json +0 -268
  311. package/.tap/processinfo/eb26a697-e5e2-4730-aeea-bcb9c49afd4d.json +0 -268
  312. package/.tap/processinfo/eb29d1c3-feaf-4744-9d84-cf257e8269b0.json +0 -268
  313. package/.tap/processinfo/ee720c0a-ed64-4e7e-8c0a-139c7b9725d2.json +0 -268
  314. package/.tap/processinfo/ef88c13a-87b2-49e4-a683-7b812505cd6f.json +0 -268
  315. package/.tap/processinfo/f4ed6948-dac0-4128-9f86-d083b6918ea7.json +0 -268
  316. package/.tap/processinfo/f7544c01-8ac7-4e42-8ad5-c4d62e094d1f.json +0 -270
  317. package/.tap/processinfo/f7cee4b3-7bcc-4591-a628-5629b0b41c9e.json +0 -268
  318. package/.tap/processinfo/f9c0a1f7-c1a4-44d3-ae3f-8c1eb42cd746.json +0 -269
  319. package/.tap/processinfo/fc46b4da-79db-4201-af7e-34bb17f92d69.json +0 -270
  320. package/.tap/processinfo/fccc0056-03c4-40cb-9d0b-2db4bbe573c1.json +0 -268
  321. package/.tap/processinfo/fd2df572-54d7-4ce7-b7aa-a2b4b00d4127.json +0 -254
  322. package/.tap/processinfo/fea9377f-b473-484d-bee6-ac7f49e50937.json +0 -269
  323. package/.tap/processinfo/feb516dc-abda-46e6-9b42-d37adfc63366.json +0 -268
  324. package/.tap/processinfo/ff0fda4c-aa2e-4236-906e-fdfb6bd6632e.json +0 -269
  325. package/test/default-route.test.js +0 -88
  326. package/test/listen.deprecated.test.js +0 -229
  327. package/test/unsupported-httpversion.test.js +0 -31
  328. package/types/.eslintrc.json +0 -48
@@ -5,44 +5,68 @@ const {
5
5
  kReplyHijacked
6
6
  } = require('./symbols')
7
7
 
8
- function wrapThenable (thenable, reply) {
8
+ const diagnostics = require('dc-polyfill')
9
+ const channels = diagnostics.tracingChannel('fastify.request.handler')
10
+
11
+ function wrapThenable (thenable, reply, store) {
12
+ if (store) store.async = true
9
13
  thenable.then(function (payload) {
10
14
  if (reply[kReplyHijacked] === true) {
11
15
  return
12
16
  }
13
17
 
14
- // this is for async functions that are using reply.send directly
15
- //
16
- // since wrap-thenable will be called when using reply.send directly
17
- // without actual return. the response can be sent already or
18
- // the request may be terminated during the reply. in this situation,
19
- // it require an extra checking of request.aborted to see whether
20
- // the request is killed by client.
21
- if (payload !== undefined || (reply.sent === false && reply.raw.headersSent === false && reply.request.raw.aborted === false)) {
22
- // we use a try-catch internally to avoid adding a catch to another
23
- // promise, increase promise perf by 10%
24
- try {
25
- reply.send(payload)
26
- } catch (err) {
27
- reply[kReplyIsError] = true
28
- reply.send(err)
18
+ if (store) {
19
+ channels.asyncStart.publish(store)
20
+ }
21
+
22
+ try {
23
+ // this is for async functions that are using reply.send directly
24
+ //
25
+ // since wrap-thenable will be called when using reply.send directly
26
+ // without actual return. the response can be sent already or
27
+ // the request may be terminated during the reply. in this situation,
28
+ // it require an extra checking of request.aborted to see whether
29
+ // the request is killed by client.
30
+ if (payload !== undefined || (reply.sent === false && reply.raw.headersSent === false && reply.request.raw.aborted === false)) {
31
+ // we use a try-catch internally to avoid adding a catch to another
32
+ // promise, increase promise perf by 10%
33
+ try {
34
+ reply.send(payload)
35
+ } catch (err) {
36
+ reply[kReplyIsError] = true
37
+ reply.send(err)
38
+ }
39
+ }
40
+ } finally {
41
+ if (store) {
42
+ channels.asyncEnd.publish(store)
29
43
  }
30
44
  }
31
45
  }, function (err) {
32
- if (reply.sent === true) {
33
- reply.log.error({ err }, 'Promise errored, but reply.sent = true was set')
34
- return
46
+ if (store) {
47
+ store.error = err
48
+ channels.error.publish(store) // note that error happens before asyncStart
49
+ channels.asyncStart.publish(store)
35
50
  }
36
51
 
37
- reply[kReplyIsError] = true
38
-
39
- // try-catch allow to re-throw error in error handler for async handler
40
52
  try {
53
+ if (reply.sent === true) {
54
+ reply.log.error({ err }, 'Promise errored, but reply.sent = true was set')
55
+ return
56
+ }
57
+
58
+ reply[kReplyIsError] = true
59
+
41
60
  reply.send(err)
42
61
  // The following should not happen
43
62
  /* c8 ignore next 3 */
44
63
  } catch (err) {
64
+ // try-catch allow to re-throw error in error handler for async handler
45
65
  reply.send(err)
66
+ } finally {
67
+ if (store) {
68
+ channels.asyncEnd.publish(store)
69
+ }
46
70
  }
47
71
  })
48
72
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fastify",
3
- "version": "4.28.0",
3
+ "version": "5.0.0-alpha.2",
4
4
  "description": "Fast and low overhead web framework, for Node.js",
5
5
  "main": "fastify.js",
6
6
  "type": "commonjs",
@@ -11,24 +11,22 @@
11
11
  "benchmark:parser": "concurrently -k -s first \"node ./examples/benchmark/parser.js\" \"autocannon -c 100 -d 30 -p 10 -i ./examples/benchmark/body.json -H \"content-type:application/jsoff\" -m POST localhost:3000/\"",
12
12
  "build:validation": "node build/build-error-serializer.js && node build/build-validation.js",
13
13
  "coverage": "npm run unit -- --coverage-report=html",
14
- "coverage:ci": "c8 --reporter=lcov tap --coverage-report=html --no-browser --no-check-coverage",
15
- "coverage:ci-check-coverage": "c8 check-coverage --branches 100 --functions 100 --lines 100 --statements 100",
16
- "lint": "npm run lint:standard && npm run lint:typescript && npm run lint:markdown",
17
- "lint:fix": "standard --fix && npm run lint:typescript:fix",
14
+ "coverage:ci": "tap --coverage-report=html --coverage-report=lcov --allow-incomplete-coverage",
15
+ "coverage:ci-check-coverage": "tap replay",
16
+ "lint": "npm run lint:eslint",
17
+ "lint:fix": "eslint --fix",
18
18
  "lint:markdown": "markdownlint-cli2",
19
- "lint:standard": "standard | snazzy",
20
- "lint:typescript": "eslint -c types/.eslintrc.json types/**/*.d.ts test/types/**/*.test-d.ts",
21
- "lint:typescript:fix": "npm run lint:typescript -- --fix",
22
- "prepublishOnly": "cross-env PREPUBLISH=true tap --no-check-coverage test/build/**.test.js && npm run test:validator:integrity",
19
+ "lint:eslint": "eslint",
20
+ "prepublishOnly": "cross-env PREPUBLISH=true tap --allow-incomplete-coverage test/build/**.test.js && npm run test:validator:integrity",
23
21
  "test": "npm run lint && npm run unit && npm run test:typescript",
24
- "test:ci": "npm run unit -- --cov --coverage-report=lcovonly && npm run test:typescript",
22
+ "test:ci": "npm run unit -- --coverage-report=lcovonly && npm run test:typescript",
25
23
  "test:report": "npm run lint && npm run unit:report && npm run test:typescript",
26
24
  "test:validator:integrity": "npm run build:validation && git diff --quiet --ignore-all-space --ignore-blank-lines --ignore-cr-at-eol lib/error-serializer.js && git diff --quiet --ignore-all-space --ignore-blank-lines --ignore-cr-at-eol lib/configValidator.js",
27
25
  "test:typescript": "tsc test/types/import.ts && tsd",
28
- "test:watch": "npm run unit -- --watch --cov --no-coverage-report --reporter=terse",
29
- "unit": "c8 tap",
26
+ "test:watch": "npm run unit -- --watch --coverage-report=none --reporter=terse",
27
+ "unit": "tap",
30
28
  "unit:junit": "tap-mocha-reporter xunit < out.tap > test/junit-testresults.xml",
31
- "unit:report": "tap --cov --coverage-report=html --coverage-report=cobertura | tee out.tap",
29
+ "unit:report": "tap --coverage-report=html --coverage-report=cobertura | tee out.tap",
32
30
  "citgm": "tap --jobs=1 --timeout=120"
33
31
  },
34
32
  "repository": {
@@ -153,79 +151,61 @@
153
151
  }
154
152
  ],
155
153
  "devDependencies": {
156
- "@fastify/pre-commit": "^2.0.2",
157
- "@sinclair/typebox": "^0.31.17",
158
- "@sinonjs/fake-timers": "^11.1.0",
159
- "@types/node": "^20.8.4",
160
- "@typescript-eslint/eslint-plugin": "^6.7.5",
161
- "@typescript-eslint/parser": "^6.7.5",
154
+ "@fastify/pre-commit": "^2.1.0",
155
+ "@sinclair/typebox": "^0.32.22",
156
+ "@sinonjs/fake-timers": "^11.2.2",
157
+ "@stylistic/eslint-plugin": "^2.1.0",
158
+ "@stylistic/eslint-plugin-js": "^2.1.0",
159
+ "@types/node": "^20.12.7",
162
160
  "ajv": "^8.12.0",
163
161
  "ajv-errors": "^3.0.0",
164
- "ajv-formats": "^2.1.1",
162
+ "ajv-formats": "^3.0.1",
165
163
  "ajv-i18n": "^4.2.0",
166
164
  "ajv-merge-patch": "^5.0.1",
167
- "autocannon": "^7.14.0",
165
+ "autocannon": "^7.15.0",
168
166
  "branch-comparer": "^1.1.0",
169
- "c8": "^8.0.1",
170
167
  "concurrently": "^8.2.2",
171
168
  "cross-env": "^7.0.3",
172
- "eslint": "^8.51.0",
173
- "eslint-config-standard": "^17.1.0",
174
- "eslint-import-resolver-node": "^0.3.9",
175
- "eslint-plugin-import": "^2.28.1",
176
- "eslint-plugin-n": "^16.2.0",
177
- "eslint-plugin-promise": "^6.1.1",
169
+ "eslint": "^9.0.0",
178
170
  "fast-json-body": "^1.1.0",
179
171
  "fastify-plugin": "^4.5.1",
180
- "fluent-json-schema": "^4.1.2",
181
- "form-data": "^4.0.0",
172
+ "fluent-json-schema": "^4.2.1",
182
173
  "h2url": "^0.2.0",
183
174
  "http-errors": "^2.0.0",
184
- "joi": "^17.11.0",
185
- "json-schema-to-ts": "^2.9.2",
175
+ "joi": "^17.12.3",
176
+ "json-schema-to-ts": "^3.0.1",
186
177
  "JSONStream": "^1.3.5",
187
- "markdownlint-cli2": "^0.10.0",
178
+ "markdownlint-cli2": "^0.13.0",
179
+ "neostandard": "^0.7.0",
188
180
  "node-forge": "^1.3.1",
189
181
  "proxyquire": "^2.1.3",
190
182
  "send": "^0.18.0",
191
183
  "simple-get": "^4.0.1",
192
- "snazzy": "^9.0.0",
193
184
  "split2": "^4.2.0",
194
- "standard": "^17.1.0",
195
- "tap": "^16.3.9",
196
- "tsd": "^0.29.0",
197
- "typescript": "^5.2.2",
198
- "undici": "^5.26.0",
185
+ "tap": "^19.0.0",
186
+ "tsd": "^0.31.0",
187
+ "typescript": "^5.4.5",
188
+ "undici": "^6.13.0",
199
189
  "vary": "^1.1.2",
200
- "yup": "^1.3.2"
190
+ "yup": "^1.4.0"
201
191
  },
202
192
  "dependencies": {
203
193
  "@fastify/ajv-compiler": "^3.5.0",
204
- "@fastify/error": "^3.4.0",
194
+ "@fastify/error": "^3.4.1",
205
195
  "@fastify/fast-json-stringify-compiler": "^4.3.0",
206
196
  "abstract-logging": "^2.0.1",
207
197
  "avvio": "^8.3.0",
208
- "fast-content-type-parse": "^1.1.0",
209
- "fast-json-stringify": "^5.8.0",
210
- "find-my-way": "^8.0.0",
211
- "light-my-request": "^5.11.0",
198
+ "dc-polyfill": "^0.1.6",
199
+ "fast-json-stringify": "^5.14.1",
200
+ "find-my-way": "^8.1.0",
201
+ "light-my-request": "^5.13.0",
212
202
  "pino": "^9.0.0",
213
203
  "process-warning": "^3.0.0",
214
204
  "proxy-addr": "^2.0.7",
215
- "rfdc": "^1.3.0",
205
+ "rfdc": "^1.3.1",
216
206
  "secure-json-parse": "^2.7.0",
217
- "semver": "^7.5.4",
218
- "toad-cache": "^3.3.0"
219
- },
220
- "standard": {
221
- "ignore": [
222
- "lib/configValidator.js",
223
- "lib/error-serializer.js",
224
- "fastify.d.ts",
225
- "types/*",
226
- "test/types/*",
227
- "test/same-shape.test.js"
228
- ]
207
+ "semver": "^7.6.0",
208
+ "toad-cache": "^3.7.0"
229
209
  },
230
210
  "tsd": {
231
211
  "directory": "test/types"
package/test/404s.test.js CHANGED
@@ -6,7 +6,6 @@ const fp = require('fastify-plugin')
6
6
  const sget = require('simple-get').concat
7
7
  const errors = require('http-errors')
8
8
  const split = require('split2')
9
- const FormData = require('form-data')
10
9
  const Fastify = require('..')
11
10
  const { getServerUrl } = require('./helper')
12
11
 
@@ -68,21 +67,18 @@ test('default 404', t => {
68
67
  })
69
68
  })
70
69
 
71
- test('using post method and multipart/formdata', t => {
70
+ test('using post method and multipart/formdata', async t => {
72
71
  t.plan(3)
73
- const form = FormData()
74
- form.append('test-field', 'just some field')
72
+ const form = new FormData()
73
+ form.set('test-field', 'just some field')
75
74
 
76
- sget({
75
+ const response = await fetch(getServerUrl(fastify) + '/notSupported', {
77
76
  method: 'POST',
78
- url: getServerUrl(fastify) + '/notSupported',
79
- body: form,
80
- json: false
81
- }, (err, response, body) => {
82
- t.error(err)
83
- t.equal(response.statusCode, 404)
84
- t.equal(response.headers['content-type'], 'application/json; charset=utf-8')
77
+ body: form
85
78
  })
79
+ t.equal(response.status, 404)
80
+ t.equal(response.statusText, 'Not Found')
81
+ t.equal(response.headers.get('content-type'), 'application/json; charset=utf-8')
86
82
  })
87
83
  })
88
84
  })
@@ -24,8 +24,28 @@ const opts = {
24
24
  }
25
25
  }
26
26
 
27
+ const optsWithHostnameAndPort = {
28
+ schema: {
29
+ response: {
30
+ '2xx': {
31
+ type: 'object',
32
+ properties: {
33
+ hello: {
34
+ type: 'string'
35
+ },
36
+ hostname: {
37
+ type: 'string'
38
+ },
39
+ port: {
40
+ type: 'string'
41
+ }
42
+ }
43
+ }
44
+ }
45
+ }
46
+ }
27
47
  test('async await', t => {
28
- t.plan(11)
48
+ t.plan(13)
29
49
  const fastify = Fastify()
30
50
  try {
31
51
  fastify.get('/', opts, async function awaitMyFunc (req, reply) {
@@ -46,6 +66,16 @@ test('async await', t => {
46
66
  t.fail()
47
67
  }
48
68
 
69
+ try {
70
+ fastify.get('/await/hostname_port', optsWithHostnameAndPort, async function awaitMyFunc (req, reply) {
71
+ await sleep(200)
72
+ return { hello: 'world', hostname: req.hostname, port: req.port }
73
+ })
74
+ t.pass()
75
+ } catch (e) {
76
+ t.fail()
77
+ }
78
+
49
79
  fastify.listen({ port: 0 }, err => {
50
80
  t.error(err)
51
81
  t.teardown(() => { fastify.close() })
@@ -69,6 +99,20 @@ test('async await', t => {
69
99
  t.equal(response.headers['content-length'], '' + body.length)
70
100
  t.same(JSON.parse(body), { hello: 'world' })
71
101
  })
102
+
103
+ t.test('test for hostname and port in request', t => {
104
+ t.plan(4)
105
+ sget({
106
+ method: 'GET',
107
+ url: 'http://localhost:' + fastify.server.address().port + '/await/hostname_port'
108
+ }, (err, response, body) => {
109
+ t.error(err)
110
+ t.equal(response.statusCode, 200)
111
+ const parsedBody = JSON.parse(body)
112
+ t.equal(parsedBody.hostname, 'localhost')
113
+ t.equal(parseInt(parsedBody.port), fastify.server.address().port)
114
+ })
115
+ })
72
116
  })
73
117
  })
74
118
 
@@ -135,7 +179,7 @@ test('server logs an error if reply.send is called and a value is returned via a
135
179
  const logger = pino(splitStream)
136
180
 
137
181
  const fastify = Fastify({
138
- logger
182
+ loggerInstance: logger
139
183
  })
140
184
 
141
185
  fastify.get('/', async (req, reply) => {
@@ -4,6 +4,7 @@ const t = require('tap')
4
4
  const test = t.test
5
5
  const fs = require('node:fs')
6
6
  const path = require('node:path')
7
+ const { loadESLint } = require('eslint')
7
8
 
8
9
  const { code } = require('../../build/build-error-serializer')
9
10
 
@@ -15,8 +16,9 @@ test('check generated code syntax', async (t) => {
15
16
  t.plan(1)
16
17
 
17
18
  // standard is a esm, we import it like this
18
- const { default: standard } = await import('standard')
19
- const result = await standard.lintText(code)
19
+ const Eslint = await loadESLint({ useFlatConfig: true })
20
+ const eslint = new Eslint()
21
+ const result = await eslint.lintText(code)
20
22
 
21
23
  // if there are any invalid syntax
22
24
  // fatal count will be greater than 0
@@ -0,0 +1,225 @@
1
+ 'use strict'
2
+
3
+ const t = require('tap')
4
+ const test = t.test
5
+ const { S } = require('fluent-json-schema')
6
+ const Fastify = require('..')
7
+ const sget = require('simple-get').concat
8
+
9
+ const BadRequestSchema = S.object()
10
+ .prop('statusCode', S.number())
11
+ .prop('error', S.string())
12
+ .prop('message', S.string())
13
+
14
+ const InternalServerErrorSchema = S.object()
15
+ .prop('statusCode', S.number())
16
+ .prop('error', S.string())
17
+ .prop('message', S.string())
18
+
19
+ const NotFoundSchema = S.object()
20
+ .prop('statusCode', S.number())
21
+ .prop('error', S.string())
22
+ .prop('message', S.string())
23
+
24
+ const options = {
25
+ schema: {
26
+ body: {
27
+ type: 'object',
28
+ properties: {
29
+ id: { type: 'string' }
30
+ }
31
+ },
32
+ response: {
33
+ 200: {
34
+ type: 'object',
35
+ properties: {
36
+ id: { type: 'string' }
37
+ }
38
+ },
39
+ 400: {
40
+ description: 'Bad Request',
41
+ content: {
42
+ 'application/json': {
43
+ schema: BadRequestSchema.valueOf()
44
+ }
45
+ }
46
+ },
47
+ 404: {
48
+ description: 'Resource not found',
49
+ content: {
50
+ 'application/json': {
51
+ schema: NotFoundSchema.valueOf(),
52
+ example: {
53
+ statusCode: 404,
54
+ error: 'Not Found',
55
+ message: 'Not Found'
56
+ }
57
+ }
58
+ }
59
+ },
60
+ 500: {
61
+ description: 'Internal Server Error',
62
+ content: {
63
+ 'application/json': {
64
+ schema: InternalServerErrorSchema.valueOf(),
65
+ example: {
66
+ message: 'Internal Server Error'
67
+ }
68
+ }
69
+ }
70
+ }
71
+ }
72
+ }
73
+ }
74
+
75
+ const handler = (request, reply) => {
76
+ console.log('in handler')
77
+ if (request.body.id === '400') {
78
+ return reply.status(400).send({
79
+ statusCode: 400,
80
+ error: 'Bad Request',
81
+ message: 'Custom message',
82
+ extra: 'This should not be in the response'
83
+ })
84
+ }
85
+
86
+ if (request.body.id === '404') {
87
+ return reply.status(404).send({
88
+ statusCode: 404,
89
+ error: 'Not Found',
90
+ message: 'Custom Not Found',
91
+ extra: 'This should not be in the response'
92
+ })
93
+ }
94
+
95
+ if (request.body.id === '500') {
96
+ reply.status(500).send({
97
+ statusCode: 500,
98
+ error: 'Internal Server Error',
99
+ message: 'Custom Internal Server Error',
100
+ extra: 'This should not be in the response'
101
+ })
102
+ }
103
+
104
+ reply.send({
105
+ id: request.body.id,
106
+ extra: 'This should not be in the response'
107
+ })
108
+ }
109
+
110
+ test('serialize the response for a Bad Request error, as defined on the schema', t => {
111
+ const fastify = Fastify({})
112
+
113
+ t.teardown(fastify.close.bind(fastify))
114
+
115
+ fastify.post('/', options, handler)
116
+
117
+ fastify.listen({ port: 0 }, err => {
118
+ t.error(err)
119
+
120
+ const url = `http://localhost:${fastify.server.address().port}/`
121
+
122
+ sget({
123
+ method: 'POST',
124
+ url,
125
+ json: true
126
+ }, (err, response, body) => {
127
+ t.error(err)
128
+ t.equal(response.statusCode, 400)
129
+ t.same(body, {
130
+ statusCode: 400,
131
+ error: 'Bad Request',
132
+ message: 'body must be object'
133
+ })
134
+ t.end()
135
+ })
136
+ })
137
+ })
138
+
139
+ // test('serialize the response for a Not Found error, as defined on the schema', t => {
140
+ // const fastify = Fastify({})
141
+
142
+ // t.teardown(fastify.close.bind(fastify))
143
+
144
+ // fastify.post('/', options, handler)
145
+
146
+ // fastify.listen({ port: 0 }, err => {
147
+ // t.error(err)
148
+
149
+ // const url = `http://localhost:${fastify.server.address().port}/`
150
+
151
+ // sget({
152
+ // method: 'POST',
153
+ // url,
154
+ // json: true,
155
+ // body: { id: '404' }
156
+ // }, (err, response, body) => {
157
+ // t.error(err)
158
+ // t.equal(response.statusCode, 404)
159
+ // t.same(body, {
160
+ // statusCode: 404,
161
+ // error: 'Not Found',
162
+ // message: 'Custom Not Found'
163
+ // })
164
+ // t.end()
165
+ // })
166
+ // })
167
+ // })
168
+
169
+ // test('serialize the response for a Internal Server Error error, as defined on the schema', t => {
170
+ // const fastify = Fastify({})
171
+
172
+ // t.teardown(fastify.close.bind(fastify))
173
+
174
+ // fastify.post('/', options, handler)
175
+
176
+ // fastify.listen({ port: 0 }, err => {
177
+ // t.error(err)
178
+
179
+ // const url = `http://localhost:${fastify.server.address().port}/`
180
+
181
+ // sget({
182
+ // method: 'POST',
183
+ // url,
184
+ // json: true,
185
+ // body: { id: '500' }
186
+ // }, (err, response, body) => {
187
+ // t.error(err)
188
+ // t.equal(response.statusCode, 500)
189
+ // t.same(body, {
190
+ // statusCode: 500,
191
+ // error: 'Internal Server Error',
192
+ // message: 'Custom Internal Server Error'
193
+ // })
194
+ // t.end()
195
+ // })
196
+ // })
197
+ // })
198
+
199
+ // test('serialize the success response, as defined on the schema', t => {
200
+ // const fastify = Fastify({})
201
+
202
+ // t.teardown(fastify.close.bind(fastify))
203
+
204
+ // fastify.post('/', options, handler)
205
+
206
+ // fastify.listen({ port: 0 }, err => {
207
+ // t.error(err)
208
+
209
+ // const url = `http://localhost:${fastify.server.address().port}/`
210
+
211
+ // sget({
212
+ // method: 'POST',
213
+ // url,
214
+ // json: true,
215
+ // body: { id: 'test' }
216
+ // }, (err, response, body) => {
217
+ // t.error(err)
218
+ // t.equal(response.statusCode, 200)
219
+ // t.same(body, {
220
+ // id: 'test'
221
+ // })
222
+ // t.end()
223
+ // })
224
+ // })
225
+ // })
@@ -4,7 +4,6 @@ const t = require('tap')
4
4
  const test = t.test
5
5
  const Fastify = require('..')
6
6
  const { Client } = require('undici')
7
- const semver = require('semver')
8
7
 
9
8
  test('Should return 503 while closing - pipelining', async t => {
10
9
  const fastify = Fastify({
@@ -36,46 +35,8 @@ test('Should return 503 while closing - pipelining', async t => {
36
35
  await instance.close()
37
36
  })
38
37
 
39
- // default enable of idle closing idle connection is accidentally backported to 18.19.0 and fixed in 18.20.3
40
- // Refs: https://github.com/nodejs/node/releases/tag/v18.20.3
41
- const isNodeDefaultClosingIdleConnection =
42
- (
43
- semver.gte(process.version, '18.19.0') &&
44
- semver.lt(process.version, '18.20.3')
45
- ) ||
46
- semver.gte(process.version, '19.0.0')
47
- test('Should not return 503 while closing - pipelining - return503OnClosing: false, skip when Node default closing idle connection', { skip: isNodeDefaultClosingIdleConnection }, async t => {
48
- const fastify = Fastify({
49
- return503OnClosing: false,
50
- forceCloseConnections: false
51
- })
52
-
53
- fastify.get('/', (req, reply) => {
54
- fastify.close()
55
- reply.send({ hello: 'world' })
56
- })
57
-
58
- await fastify.listen({ port: 0 })
59
-
60
- const instance = new Client('http://localhost:' + fastify.server.address().port, {
61
- pipelining: 2
62
- })
63
-
64
- const codes = [200, 200, 200]
65
- const responses = await Promise.all([
66
- instance.request({ path: '/', method: 'GET' }),
67
- instance.request({ path: '/', method: 'GET' }),
68
- instance.request({ path: '/', method: 'GET' })
69
- ])
70
- const actual = responses.map(r => r.statusCode)
71
-
72
- t.same(actual, codes)
73
-
74
- await instance.close()
75
- })
76
-
77
- test('Should close the socket abruptly - pipelining - return503OnClosing: false, skip when Node not default closing idle connection', { skip: !isNodeDefaultClosingIdleConnection }, async t => {
78
- // Since Node v19, we will always invoke server.closeIdleConnections()
38
+ test('Should close the socket abruptly - pipelining - return503OnClosing: false', async t => {
39
+ // Since Node v20, we will always invoke server.closeIdleConnections()
79
40
  // therefore our socket will be closed
80
41
  const fastify = Fastify({
81
42
  return503OnClosing: false,