fastify 4.28.0 → 5.0.0-alpha.3

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 (514) hide show
  1. package/.idea/fastify.iml +12 -0
  2. package/.idea/inspectionProfiles/Project_Default.xml +6 -0
  3. package/.idea/jsLibraryMappings.xml +6 -0
  4. package/.idea/jsLinters/eslint.xml +6 -0
  5. package/.idea/modules.xml +8 -0
  6. package/.idea/vcs.xml +6 -0
  7. package/.markdownlint-cli2.yaml +1 -1
  8. package/.taprc +4 -8
  9. package/README.md +3 -6
  10. package/build/build-error-serializer.js +4 -1
  11. package/build/build-validation.js +5 -4
  12. package/docs/Guides/Database.md +1 -1
  13. package/docs/Guides/Delay-Accepting-Requests.md +3 -3
  14. package/docs/Guides/Ecosystem.md +2 -0
  15. package/docs/Guides/Migration-Guide-V5.md +20 -0
  16. package/docs/Guides/Write-Type-Provider.md +4 -2
  17. package/docs/Reference/ContentTypeParser.md +30 -1
  18. package/docs/Reference/Decorators.md +42 -16
  19. package/docs/Reference/Errors.md +10 -2
  20. package/docs/Reference/Hooks.md +48 -14
  21. package/docs/Reference/Logging.md +5 -5
  22. package/docs/Reference/Reply.md +23 -18
  23. package/docs/Reference/Request.md +5 -1
  24. package/docs/Reference/Routes.md +24 -28
  25. package/docs/Reference/Server.md +14 -53
  26. package/docs/Reference/Type-Providers.md +21 -26
  27. package/docs/Reference/TypeScript.md +46 -29
  28. package/docs/Reference/Warnings.md +0 -8
  29. package/eslint.config.js +27 -0
  30. package/examples/typescript-server.ts +14 -14
  31. package/fastify.d.ts +15 -14
  32. package/fastify.js +41 -15
  33. package/lib/configValidator.js +94 -76
  34. package/lib/contentTypeParser.js +54 -88
  35. package/lib/decorate.js +3 -7
  36. package/lib/error-serializer.js +2 -1
  37. package/lib/errors.js +31 -6
  38. package/lib/handleRequest.js +70 -39
  39. package/lib/httpMethods.js +34 -18
  40. package/lib/logger.js +24 -6
  41. package/lib/pluginUtils.js +5 -5
  42. package/lib/reply.js +7 -10
  43. package/lib/request.js +37 -19
  44. package/lib/route.js +6 -34
  45. package/lib/server.js +62 -123
  46. package/lib/warnings.js +24 -29
  47. package/lib/wrapThenable.js +46 -22
  48. package/package.json +38 -58
  49. package/test/404s.test.js +8 -12
  50. package/test/async-await.test.js +46 -2
  51. package/test/build/error-serializer.test.js +4 -2
  52. package/test/check.test.js +225 -0
  53. package/test/close-pipelining.test.js +2 -41
  54. package/test/close.test.js +1 -41
  55. package/test/content-parser.test.js +69 -117
  56. package/test/custom-parser.1.test.js +40 -1
  57. package/test/decorator-namespace.test._js_ +31 -0
  58. package/test/decorator.test.js +92 -43
  59. package/test/delete.test.js +21 -1
  60. package/test/diagnostics-channel/404.test.js +57 -0
  61. package/test/diagnostics-channel/async-delay-request.test.js +74 -0
  62. package/test/diagnostics-channel/async-request.test.js +72 -0
  63. package/test/diagnostics-channel/error-before-handler.test.js +36 -0
  64. package/test/diagnostics-channel/error-request.test.js +61 -0
  65. package/test/diagnostics-channel/error-status.test.js +39 -0
  66. package/test/{diagnostics-channel.test.js → diagnostics-channel/init.test.js} +6 -16
  67. package/test/diagnostics-channel/sync-delay-request.test.js +58 -0
  68. package/test/diagnostics-channel/sync-request-reply.test.js +58 -0
  69. package/test/diagnostics-channel/sync-request.test.js +61 -0
  70. package/test/encapsulated-error-handler.test.js +201 -14
  71. package/test/esm/index.test.js +2 -12
  72. package/test/findRoute.test.js +16 -0
  73. package/test/genReqId.test.js +9 -0
  74. package/test/get.test.js +28 -0
  75. package/test/has-route.test.js +1 -1
  76. package/test/helper.js +1 -5
  77. package/test/hooks.test.js +0 -4
  78. package/test/http2/constraint.test.js +22 -1
  79. package/test/http2/plain.test.js +21 -6
  80. package/test/http2/secure.test.js +12 -1
  81. package/test/https/https.test.js +57 -0
  82. package/test/inject.test.js +1 -2
  83. package/test/internals/decorator.test.js +0 -2
  84. package/test/internals/errors.test.js +57 -17
  85. package/test/internals/handleRequest.test.js +5 -1
  86. package/test/internals/initialConfig.test.js +5 -5
  87. package/test/internals/logger.test.js +31 -2
  88. package/test/internals/reply.test.js +6 -78
  89. package/test/internals/request.test.js +13 -11
  90. package/test/listen.1.test.js +5 -15
  91. package/test/listen.5.test.js +99 -0
  92. package/test/logger/instantiation.test.js +8 -8
  93. package/test/logger/logging.test.js +4 -4
  94. package/test/logger/options.test.js +102 -21
  95. package/test/logger/response.test.js +6 -6
  96. package/test/maxRequestsPerSocket.test.js +2 -5
  97. package/test/method-missing.test.js +24 -0
  98. package/test/plugin.1.test.js +2 -4
  99. package/test/plugin.2.test.js +0 -2
  100. package/test/plugin.3.test.js +0 -2
  101. package/test/plugin.4.test.js +92 -56
  102. package/test/register.test.js +2 -4
  103. package/test/reply-earlyHints.test.js +98 -0
  104. package/test/reply-error.test.js +0 -2
  105. package/test/route-hooks.test.js +0 -1
  106. package/test/route-shorthand.test.js +60 -0
  107. package/test/schema-special-usage.test.js +1 -1
  108. package/test/server.test.js +17 -2
  109. package/test/stream.2.test.js +1 -1
  110. package/test/stream.4.test.js +0 -42
  111. package/test/stream.5.test.js +2 -2
  112. package/test/trust-proxy.test.js +33 -27
  113. package/test/types/errors.test-d.ts +0 -2
  114. package/test/types/fastify.test-d.ts +14 -12
  115. package/test/types/hooks.test-d.ts +1 -0
  116. package/test/types/import.ts +1 -0
  117. package/test/types/instance.test-d.ts +10 -51
  118. package/test/types/logger.test-d.ts +43 -6
  119. package/test/types/plugin.test-d.ts +5 -2
  120. package/test/types/register.test-d.ts +2 -2
  121. package/test/types/reply.test-d.ts +13 -12
  122. package/test/types/request.test-d.ts +19 -8
  123. package/test/types/route.test-d.ts +30 -2
  124. package/test/types/schema.test-d.ts +2 -2
  125. package/test/types/serverFactory.test-d.ts +1 -1
  126. package/test/types/type-provider.test-d.ts +59 -12
  127. package/test/types/using.test-d.ts +4 -1
  128. package/test/url-rewriting.test.js +3 -2
  129. package/test/useSemicolonDelimiter.test.js +3 -6
  130. package/test/versioned-routes.test.js +1 -1
  131. package/test/web-api.test.js +0 -6
  132. package/types/content-type-parser.d.ts +3 -3
  133. package/types/context.d.ts +0 -1
  134. package/types/errors.d.ts +1 -0
  135. package/types/hooks.d.ts +6 -6
  136. package/types/instance.d.ts +28 -41
  137. package/types/logger.d.ts +3 -3
  138. package/types/plugin.d.ts +3 -3
  139. package/types/reply.d.ts +9 -12
  140. package/types/request.d.ts +5 -3
  141. package/types/route.d.ts +31 -31
  142. package/types/schema.d.ts +3 -3
  143. package/types/serverFactory.d.ts +2 -2
  144. package/types/type-provider.d.ts +22 -12
  145. package/types/utils.d.ts +18 -23
  146. package/.c8rc.json +0 -8
  147. package/.eslintrc +0 -4
  148. package/.tap/processinfo/029eb7a1-1942-40bc-98e2-cef3b7a14b5e.json +0 -268
  149. package/.tap/processinfo/03c196c6-01c3-4268-a9b5-298dff18a873.json +0 -269
  150. package/.tap/processinfo/04bbabba-8611-4908-9092-dfa9fcc13327.json +0 -268
  151. package/.tap/processinfo/05d8a743-3edf-4e2d-ae5a-dc99d0855ba5.json +0 -272
  152. package/.tap/processinfo/07718963-36a8-4d87-82ad-366c877a5247.json +0 -268
  153. package/.tap/processinfo/08fe3bde-5814-4308-9158-cdf1e47391b7.json +0 -268
  154. package/.tap/processinfo/0a3e3fb0-eabf-4532-ae80-20434da22678.json +0 -268
  155. package/.tap/processinfo/0caf2a75-4b3a-46c4-9b41-c7e450e5e15f.json +0 -268
  156. package/.tap/processinfo/0cf35d52-e5b2-4884-bcf0-b0ab3017b689.json +0 -268
  157. package/.tap/processinfo/0e666134-5013-4ecd-9ee6-59b22716c39c.json +0 -268
  158. package/.tap/processinfo/1087b811-4ec4-4f91-92b4-a78a51a437de.json +0 -268
  159. package/.tap/processinfo/13709ed3-b68c-42cf-8472-b0c4b8a89d2b.json +0 -268
  160. package/.tap/processinfo/13ac2f18-d0e0-439f-bc86-2ff0119af857.json +0 -268
  161. package/.tap/processinfo/13e47e0e-f6e8-4381-8a42-923b661f4a4f.json +0 -268
  162. package/.tap/processinfo/143f7d43-b8e8-4666-b482-f28fb37160ee.json +0 -268
  163. package/.tap/processinfo/14f3801d-03ab-4db3-9df5-c5d47e0a8cf0.json +0 -270
  164. package/.tap/processinfo/15a07dad-4bcd-442c-95e0-30c31f2b9818.json +0 -273
  165. package/.tap/processinfo/191ad3ad-04d8-4fb9-b119-ad2811f9b925.json +0 -243
  166. package/.tap/processinfo/1b25d54b-62d3-44cd-b581-31e705522fae.json +0 -268
  167. package/.tap/processinfo/1b7cb260-f04b-4135-a4fe-093081c4706f.json +0 -268
  168. package/.tap/processinfo/1e395d63-4815-4c77-aa47-df3709cc0ef9.json +0 -268
  169. package/.tap/processinfo/1e7f6a54-3abf-4771-863a-585cba110aec.json +0 -268
  170. package/.tap/processinfo/21a15e1d-0b41-47d8-b03d-0ba130969034.json +0 -244
  171. package/.tap/processinfo/21e02016-9ecd-4983-8417-9c74d224644f.json +0 -269
  172. package/.tap/processinfo/2327d941-d0d5-4762-b386-02a9a27ad28e.json +0 -268
  173. package/.tap/processinfo/23d39204-eac9-4f57-8db4-ffa996227fbd.json +0 -268
  174. package/.tap/processinfo/2493875a-0ac6-4d53-993c-f44471fd0678.json +0 -268
  175. package/.tap/processinfo/2698669f-f1e7-4a12-a687-8d58177be2b0.json +0 -269
  176. package/.tap/processinfo/2862b053-0a3d-46d7-9381-ffcb06287609.json +0 -268
  177. package/.tap/processinfo/2ac1b8d6-ac92-40e2-a59a-7681069f487c.json +0 -268
  178. package/.tap/processinfo/2c75e5f7-c4ef-47e4-a1c4-105eef6c0fab.json +0 -242
  179. package/.tap/processinfo/2e2c45cd-718b-4e5a-bf88-f801630f2803.json +0 -268
  180. package/.tap/processinfo/2f9ca478-3e03-4cce-a0bc-fcdc86d7c316.json +0 -268
  181. package/.tap/processinfo/30e3117f-fb74-456f-8f02-527e9eb9fcc3.json +0 -268
  182. package/.tap/processinfo/332be679-63c7-4b49-8b87-ef55995ada2d.json +0 -268
  183. package/.tap/processinfo/37c36f95-07f9-4ef0-8ab4-9e107d51b605.json +0 -269
  184. package/.tap/processinfo/3874eae2-f3db-44ef-9a9f-c8169d4b2b76.json +0 -268
  185. package/.tap/processinfo/38a7c3da-a411-41d0-8993-9deefd23500d.json +0 -268
  186. package/.tap/processinfo/3a7b6dbd-e153-4ce5-b557-21fb82009983.json +0 -269
  187. package/.tap/processinfo/3c6731ec-936d-470f-b7b0-0c87b54be051.json +0 -268
  188. package/.tap/processinfo/3c850ea9-4ef0-4044-a3fd-fbadfa9d543e.json +0 -268
  189. package/.tap/processinfo/3e4e15e0-a325-46f0-be57-5fd374560b7a.json +0 -269
  190. package/.tap/processinfo/3ed868e0-887c-402a-9f22-b1fdb74b4da0.json +0 -268
  191. package/.tap/processinfo/405498d7-5854-4ce1-a7dc-06920932f26d.json +0 -268
  192. package/.tap/processinfo/40b7eb19-ae35-4490-8a11-eb91a573c590.json +0 -268
  193. package/.tap/processinfo/40bb1260-d856-4248-8939-a0a05e322041.json +0 -268
  194. package/.tap/processinfo/41252e0b-7f69-44cc-b356-dd94bcbfdb29.json +0 -268
  195. package/.tap/processinfo/418fa710-e2fd-4508-b533-c179958da464.json +0 -269
  196. package/.tap/processinfo/433ef009-63aa-48fe-8e5d-c725228fa2fc.json +0 -268
  197. package/.tap/processinfo/44bf577c-9c01-4197-bd29-2e1ae888c4d4.json +0 -268
  198. package/.tap/processinfo/458fb7f2-20b9-48a2-8853-403c9851f605.json +0 -268
  199. package/.tap/processinfo/46b9892b-bb23-4b86-b0fa-9297f08c611a.json +0 -268
  200. package/.tap/processinfo/46bd9aaf-6cf3-4bd5-b90d-e136a7299a8e.json +0 -268
  201. package/.tap/processinfo/4779aa5f-e57a-4fcc-87e2-7d0bd4fca27f.json +0 -268
  202. package/.tap/processinfo/47b73f4b-ab31-49e1-97fd-8436dbe4bdf3.json +0 -269
  203. package/.tap/processinfo/49dba52e-e0c9-445d-8e9d-6d9ebe3ce6c4.json +0 -268
  204. package/.tap/processinfo/4b1dbc61-4e65-4c56-9784-2036f369038a.json +0 -268
  205. package/.tap/processinfo/4b6f0b40-43ef-4668-83a0-e07e28509df5.json +0 -268
  206. package/.tap/processinfo/4c236f70-f532-460b-8f7a-dd973301d493.json +0 -268
  207. package/.tap/processinfo/4d92b707-a268-48b8-885b-004d3a288c41.json +0 -269
  208. package/.tap/processinfo/4ff10bae-7c97-4c0a-b712-6c0d2f8c0e8e.json +0 -270
  209. package/.tap/processinfo/50f95bd5-ae12-4d83-99f4-ae9b0690c6a8.json +0 -268
  210. package/.tap/processinfo/557e4a49-d99c-4a63-b2f2-f33d897ab874.json +0 -268
  211. package/.tap/processinfo/589fd21a-8319-4abf-8cf7-82cb4a463a4b.json +0 -269
  212. package/.tap/processinfo/5a872f3a-949f-40be-8004-d739d034255c.json +0 -272
  213. package/.tap/processinfo/5abc301a-23da-424d-891e-3afbaff9156c.json +0 -269
  214. package/.tap/processinfo/5c31614c-a766-4837-ab59-dd6977166f72.json +0 -253
  215. package/.tap/processinfo/5d1e90c8-d819-4901-b022-f9ea4cd81978.json +0 -268
  216. package/.tap/processinfo/5d283e67-f31d-4fa8-a559-a1d8e82ee046.json +0 -269
  217. package/.tap/processinfo/5df505bc-6a4b-4c41-822f-51e2d7111de8.json +0 -268
  218. package/.tap/processinfo/5eaf64a2-fbfd-40e7-b391-c30f744b2bf1.json +0 -269
  219. package/.tap/processinfo/5ef5ede0-6436-4938-8401-d32ad4bffd5d.json +0 -268
  220. package/.tap/processinfo/606f05c0-8293-41db-bc92-eea82123697f.json +0 -269
  221. package/.tap/processinfo/6446806d-6cab-4c1d-a9ed-6bccaf3c4ea9.json +0 -268
  222. package/.tap/processinfo/64da7e08-925d-444d-98de-6568c6115d8d.json +0 -269
  223. package/.tap/processinfo/6917da6d-d2dc-466a-a893-7fb7412dde96.json +0 -268
  224. package/.tap/processinfo/69bbeee0-c398-4ccf-98b3-fb625a63bab4.json +0 -268
  225. package/.tap/processinfo/6da6ea8f-3370-4703-b230-90159531f766.json +0 -268
  226. package/.tap/processinfo/6ecffe1f-3016-4c11-9294-b488baced99f.json +0 -268
  227. package/.tap/processinfo/6f23f41f-ccbd-48cb-9ab6-311db0cfb65c.json +0 -270
  228. package/.tap/processinfo/70168912-9bb2-4334-bb89-041f1764cddf.json +0 -268
  229. package/.tap/processinfo/713a674e-40e1-46b4-866e-949d57c1a9f9.json +0 -270
  230. package/.tap/processinfo/730254d4-eacb-4cdf-80f4-8da22341cde5.json +0 -268
  231. package/.tap/processinfo/7344e559-c546-416f-8f1b-0f9fe12c6f02.json +0 -268
  232. package/.tap/processinfo/7556217a-0155-448f-b4d4-bec1bb0f6040.json +0 -269
  233. package/.tap/processinfo/7572079c-166c-4c4c-85ff-89b9430b214f.json +0 -268
  234. package/.tap/processinfo/7808180f-1974-47cd-bba2-2d6b8b711d65.json +0 -273
  235. package/.tap/processinfo/796dde83-da66-4db2-8d27-d45a3627c9c7.json +0 -268
  236. package/.tap/processinfo/7979819f-3723-48be-9f55-be700e689441.json +0 -270
  237. package/.tap/processinfo/7a664d39-d7f5-42f9-89df-15563048fab6.json +0 -268
  238. package/.tap/processinfo/7b047b72-01d9-4217-857c-93341651b4b3.json +0 -269
  239. package/.tap/processinfo/7ce41af6-7961-45ae-8c6f-b6e1c5692a48.json +0 -268
  240. package/.tap/processinfo/7e1de1c6-127e-463d-9357-081ee33ef5ce.json +0 -269
  241. package/.tap/processinfo/81ac7a7f-b0c0-4ef6-82cb-c718ea84e152.json +0 -268
  242. package/.tap/processinfo/851a058f-a497-4b10-a0b7-c9182d9c4d5a.json +0 -268
  243. package/.tap/processinfo/86502974-c245-4194-ade4-d9c6fdbb757e.json +0 -268
  244. package/.tap/processinfo/86b9786f-4a98-43b8-882a-5f936b876f08.json +0 -241
  245. package/.tap/processinfo/8a3fe726-86ab-4300-8d73-7eacbbc02a05.json +0 -268
  246. package/.tap/processinfo/8adf928b-c963-4ba0-9c35-606fcbd8a2aa.json +0 -272
  247. package/.tap/processinfo/8b31a6d8-1a33-4a27-93ca-1c5b364be068.json +0 -240
  248. package/.tap/processinfo/8ec12773-6b18-49a2-8e52-874c797df965.json +0 -833
  249. package/.tap/processinfo/8edb9502-3420-42fb-a602-e5de93be2df1.json +0 -268
  250. package/.tap/processinfo/8fc572e6-9828-4f98-a49c-9e081b2193c4.json +0 -242
  251. package/.tap/processinfo/8fee2d30-c5dd-4fae-9cf2-2ef8dd0f90de.json +0 -834
  252. package/.tap/processinfo/92cc0496-5f26-4370-8212-18136b972f99.json +0 -268
  253. package/.tap/processinfo/93a3f064-3f6e-4f49-becb-f7925f2961a9.json +0 -268
  254. package/.tap/processinfo/967e3697-8310-4a19-8dd5-927ac8bd6c79.json +0 -269
  255. package/.tap/processinfo/97225e23-9d30-4287-b3f5-72bccebec50b.json +0 -268
  256. package/.tap/processinfo/9a363bc6-4e65-47e8-94ca-26a9db428fb4.json +0 -268
  257. package/.tap/processinfo/9d2fe462-57fa-43f1-b02c-d188f15de30b.json +0 -270
  258. package/.tap/processinfo/a00b6cda-feb7-4b8a-8179-4c43bc29d670.json +0 -269
  259. package/.tap/processinfo/a017cbd5-4ac7-49e1-8c77-1bf4f6e7f2a6.json +0 -271
  260. package/.tap/processinfo/a1277309-1984-48f8-b60b-f5e8639736be.json +0 -271
  261. package/.tap/processinfo/a16bf53e-4337-48ff-88fa-67f55738e0f5.json +0 -268
  262. package/.tap/processinfo/a3a9848f-440e-41bb-9b0b-568bcfee0ddc.json +0 -268
  263. package/.tap/processinfo/a468c11f-f2f1-4e92-9ba0-6d28b6569b72.json +0 -268
  264. package/.tap/processinfo/a5880465-68f1-46b3-84a5-0da389d0bc67.json +0 -268
  265. package/.tap/processinfo/a666f394-39b4-44ad-8e74-abebf74dde3b.json +0 -270
  266. package/.tap/processinfo/af09d8ca-7053-4410-b514-b22c47f5979f.json +0 -268
  267. package/.tap/processinfo/af203309-28aa-459d-a56e-d88833695521.json +0 -268
  268. package/.tap/processinfo/afa2f7b6-dcd2-4d90-bf3c-54ba8b6800eb.json +0 -268
  269. package/.tap/processinfo/b231291d-ef14-4ff0-85f9-38a73a5408f8.json +0 -268
  270. package/.tap/processinfo/b3d3f2a1-a9fc-4d88-b122-fae90248cd59.json +0 -268
  271. package/.tap/processinfo/b834bf83-26c4-403a-8e91-eb15fe4b0b5d.json +0 -268
  272. package/.tap/processinfo/b8786fd7-47df-4ac1-8d6f-2d4c7623c681.json +0 -268
  273. package/.tap/processinfo/b9758f53-7f5a-4b03-8684-8a42ad644e5a.json +0 -268
  274. package/.tap/processinfo/bd194ea2-a21a-4604-b225-ee48abf1e607.json +0 -242
  275. package/.tap/processinfo/bd7ced53-3872-43b7-ad73-3352e50b728b.json +0 -268
  276. package/.tap/processinfo/be50295b-7e50-46cd-8bf1-637bf222699c.json +0 -268
  277. package/.tap/processinfo/bec61dd9-aa52-4e6c-8e37-5c9c10e935fd.json +0 -268
  278. package/.tap/processinfo/c015adf9-1d60-447e-87b5-b2031fe55bba.json +0 -268
  279. package/.tap/processinfo/c0666afa-7f64-45bd-97fb-145df1380157.json +0 -268
  280. package/.tap/processinfo/c2c0c012-c1c0-4457-84d6-dadba8396c94.json +0 -268
  281. package/.tap/processinfo/c3dd3ecd-737b-47ce-a917-54341c7bbed3.json +0 -268
  282. package/.tap/processinfo/c41ac06d-64b8-4bb3-bf56-0551f5a48f4b.json +0 -268
  283. package/.tap/processinfo/c4235bfb-a2aa-4271-9c6b-3ceb370219b1.json +0 -268
  284. package/.tap/processinfo/c4e6f24f-288c-493c-b6f0-02924aeb6758.json +0 -270
  285. package/.tap/processinfo/c54227bb-4a7b-40bb-bfe6-b54fe55078f3.json +0 -268
  286. package/.tap/processinfo/c699de91-3b0b-4466-9418-6910a3eb640a.json +0 -269
  287. package/.tap/processinfo/c74e2f37-451a-4577-ac18-e597fbd9a1d4.json +0 -269
  288. package/.tap/processinfo/c90cccec-5b4b-445f-a935-ac22859675d0.json +0 -252
  289. package/.tap/processinfo/c9dd6c7d-0d16-45e5-87ae-117388bf2994.json +0 -268
  290. package/.tap/processinfo/ca2e48fb-58c5-47fc-ad2e-263838aea42c.json +0 -272
  291. package/.tap/processinfo/ca87351d-c710-45c1-838a-16bccac59874.json +0 -273
  292. package/.tap/processinfo/cdb4a671-5776-4944-91b9-c456c58841ef.json +0 -268
  293. package/.tap/processinfo/cf10fdc8-6a87-447a-9e12-45f447af61f3.json +0 -244
  294. package/.tap/processinfo/cf3f1f08-643e-4f24-82ca-40f7a349c3d1.json +0 -268
  295. package/.tap/processinfo/d091172a-06a5-469b-82a9-8fefe3dd99da.json +0 -240
  296. package/.tap/processinfo/d1675431-61d6-45f8-a010-6e654112a00a.json +0 -272
  297. package/.tap/processinfo/d2d54aa2-c221-4ad4-b6b7-0c58e3c3679c.json +0 -269
  298. package/.tap/processinfo/d4f3c95a-ddbe-419d-bce0-dd6acceee21f.json +0 -268
  299. package/.tap/processinfo/d54ed8f1-43c3-478a-90d3-2c8aced723f2.json +0 -269
  300. package/.tap/processinfo/d6e5a2a6-4647-4d98-916c-aec4ace54a65.json +0 -268
  301. package/.tap/processinfo/d7280c64-45e6-4b12-affc-3ac9a5d4014a.json +0 -268
  302. package/.tap/processinfo/d82c8367-d825-4405-88df-07298f6ef840.json +0 -269
  303. package/.tap/processinfo/d8f97e53-e921-4d33-9c8d-2f7e807a9425.json +0 -268
  304. package/.tap/processinfo/da546a73-9714-4f8c-bdbb-e42730edbcfa.json +0 -268
  305. package/.tap/processinfo/da7fb7fb-1da4-49f8-a3ee-d4ea623c01a5.json +0 -268
  306. package/.tap/processinfo/daa6a016-4f0c-4050-923c-2022e0bb21d8.json +0 -268
  307. package/.tap/processinfo/db9a251d-8540-4719-b464-e7d5febd97d1.json +0 -240
  308. package/.tap/processinfo/dc10c603-8e58-4611-baa3-44da2578d07a.json +0 -268
  309. package/.tap/processinfo/dde56c1a-858c-47cc-b0bb-61279620ac17.json +0 -268
  310. package/.tap/processinfo/e0d9c4ea-f7c7-4c64-8ced-66dc6f0ac5d2.json +0 -271
  311. package/.tap/processinfo/e121454f-5dfa-4209-ba15-4c39840871f2.json +0 -831
  312. package/.tap/processinfo/e1f43e40-c3fe-4eb8-a713-d5910cc6b25a.json +0 -268
  313. package/.tap/processinfo/e4575e7a-f00e-488b-94e1-8f877b54725e.json +0 -268
  314. package/.tap/processinfo/e9ad667e-8603-4488-af64-449cc9532803.json +0 -268
  315. package/.tap/processinfo/eb26a697-e5e2-4730-aeea-bcb9c49afd4d.json +0 -268
  316. package/.tap/processinfo/eb29d1c3-feaf-4744-9d84-cf257e8269b0.json +0 -268
  317. package/.tap/processinfo/ee720c0a-ed64-4e7e-8c0a-139c7b9725d2.json +0 -268
  318. package/.tap/processinfo/ef88c13a-87b2-49e4-a683-7b812505cd6f.json +0 -268
  319. package/.tap/processinfo/f4ed6948-dac0-4128-9f86-d083b6918ea7.json +0 -268
  320. package/.tap/processinfo/f7544c01-8ac7-4e42-8ad5-c4d62e094d1f.json +0 -270
  321. package/.tap/processinfo/f7cee4b3-7bcc-4591-a628-5629b0b41c9e.json +0 -268
  322. package/.tap/processinfo/f9c0a1f7-c1a4-44d3-ae3f-8c1eb42cd746.json +0 -269
  323. package/.tap/processinfo/fc46b4da-79db-4201-af7e-34bb17f92d69.json +0 -270
  324. package/.tap/processinfo/fccc0056-03c4-40cb-9d0b-2db4bbe573c1.json +0 -268
  325. package/.tap/processinfo/fd2df572-54d7-4ce7-b7aa-a2b4b00d4127.json +0 -254
  326. package/.tap/processinfo/fea9377f-b473-484d-bee6-ac7f49e50937.json +0 -269
  327. package/.tap/processinfo/feb516dc-abda-46e6-9b42-d37adfc63366.json +0 -268
  328. package/.tap/processinfo/ff0fda4c-aa2e-4236-906e-fdfb6bd6632e.json +0 -269
  329. package/.tap/test-results/test/404s.test.js.tap +0 -623
  330. package/.tap/test-results/test/500s.test.js.tap +0 -64
  331. package/.tap/test-results/test/allowUnsafeRegex.test.js.tap +0 -36
  332. package/.tap/test-results/test/als.test.js.tap +0 -15
  333. package/.tap/test-results/test/async-await.test.js.tap +0 -184
  334. package/.tap/test-results/test/async-dispose.test.js.tap +0 -8
  335. package/.tap/test-results/test/async_hooks.test.js.tap +0 -10
  336. package/.tap/test-results/test/bodyLimit.test.js.tap +0 -48
  337. package/.tap/test-results/test/buffer.test.js.tap +0 -20
  338. package/.tap/test-results/test/build/error-serializer.test.js.tap +0 -8
  339. package/.tap/test-results/test/build/version.test.js.tap +0 -7
  340. package/.tap/test-results/test/case-insensitive.test.js.tap +0 -36
  341. package/.tap/test-results/test/chainable.test.js.tap +0 -17
  342. package/.tap/test-results/test/check.test.js.tap +0 -10
  343. package/.tap/test-results/test/childLoggerFactory.test.js.tap +0 -23
  344. package/.tap/test-results/test/client-timeout.test.js.tap +0 -7
  345. package/.tap/test-results/test/close-pipelining.test.js.tap +0 -15
  346. package/.tap/test-results/test/close.test.js.tap +0 -172
  347. package/.tap/test-results/test/connectionTimeout.test.js.tap +0 -12
  348. package/.tap/test-results/test/constrained-routes.test.js.tap +0 -173
  349. package/.tap/test-results/test/content-length.test.js.tap +0 -46
  350. package/.tap/test-results/test/content-parser.test.js.tap +0 -266
  351. package/.tap/test-results/test/content-type.test.js.tap +0 -14
  352. package/.tap/test-results/test/context-config.test.js.tap +0 -41
  353. package/.tap/test-results/test/copy.test.js.tap +0 -14
  354. package/.tap/test-results/test/custom-http-server.test.js.tap +0 -30
  355. package/.tap/test-results/test/custom-parser-async.test.js.tap +0 -21
  356. package/.tap/test-results/test/custom-parser.0.test.js.tap +0 -199
  357. package/.tap/test-results/test/custom-parser.1.test.js.tap +0 -90
  358. package/.tap/test-results/test/custom-parser.2.test.js.tap +0 -22
  359. package/.tap/test-results/test/custom-parser.3.test.js.tap +0 -53
  360. package/.tap/test-results/test/custom-parser.4.test.js.tap +0 -45
  361. package/.tap/test-results/test/custom-parser.5.test.js.tap +0 -41
  362. package/.tap/test-results/test/custom-querystring-parser.test.js.tap +0 -46
  363. package/.tap/test-results/test/decorator.test.js.tap +0 -465
  364. package/.tap/test-results/test/delete.test.js.tap +0 -110
  365. package/.tap/test-results/test/diagnostics-channel/404.test.js.tap +0 -15
  366. package/.tap/test-results/test/diagnostics-channel/async-delay-request.test.js.tap +0 -25
  367. package/.tap/test-results/test/diagnostics-channel/async-request.test.js.tap +0 -24
  368. package/.tap/test-results/test/diagnostics-channel/error-before-handler.test.js.tap +0 -9
  369. package/.tap/test-results/test/diagnostics-channel/error-request.test.js.tap +0 -20
  370. package/.tap/test-results/test/diagnostics-channel/error-status.test.js.tap +0 -10
  371. package/.tap/test-results/test/diagnostics-channel/init.test.js.tap +0 -14
  372. package/.tap/test-results/test/diagnostics-channel/sync-delay-request.test.js.tap +0 -16
  373. package/.tap/test-results/test/diagnostics-channel/sync-request-reply.test.js.tap +0 -16
  374. package/.tap/test-results/test/diagnostics-channel/sync-request.test.js.tap +0 -19
  375. package/.tap/test-results/test/encapsulated-child-logger-factory.test.js.tap +0 -18
  376. package/.tap/test-results/test/encapsulated-error-handler.test.js.tap +0 -243
  377. package/.tap/test-results/test/esm/errorCodes.test.mjs.tap +0 -9
  378. package/.tap/test-results/test/esm/esm.test.mjs.tap +0 -8
  379. package/.tap/test-results/test/esm/index.test.js.tap +0 -8
  380. package/.tap/test-results/test/fastify-instance.test.js.tap +0 -114
  381. package/.tap/test-results/test/findRoute.test.js.tap +0 -37
  382. package/.tap/test-results/test/fluent-schema.test.js.tap +0 -36
  383. package/.tap/test-results/test/genReqId.test.js.tap +0 -106
  384. package/.tap/test-results/test/get.test.js.tap +0 -151
  385. package/.tap/test-results/test/handler-context.test.js.tap +0 -19
  386. package/.tap/test-results/test/has-route.test.js.tap +0 -30
  387. package/.tap/test-results/test/head.test.js.tap +0 -130
  388. package/.tap/test-results/test/header-overflow.test.js.tap +0 -16
  389. package/.tap/test-results/test/hooks-async.test.js.tap +0 -286
  390. package/.tap/test-results/test/hooks.on-listen.test.js.tap +0 -311
  391. package/.tap/test-results/test/hooks.on-ready.test.js.tap +0 -151
  392. package/.tap/test-results/test/hooks.test.js.tap +0 -966
  393. package/.tap/test-results/test/http2/closing.test.js.tap +0 -35
  394. package/.tap/test-results/test/http2/constraint.test.js.tap +0 -32
  395. package/.tap/test-results/test/http2/head.test.js.tap +0 -9
  396. package/.tap/test-results/test/http2/missing-http2-module.test.js.tap +0 -8
  397. package/.tap/test-results/test/http2/plain.test.js.tap +0 -22
  398. package/.tap/test-results/test/http2/secure-with-fallback.test.js.tap +0 -40
  399. package/.tap/test-results/test/http2/secure.test.js.tap +0 -27
  400. package/.tap/test-results/test/http2/unknown-http-method.test.js.tap +0 -9
  401. package/.tap/test-results/test/https/custom-https-server.test.js.tap +0 -10
  402. package/.tap/test-results/test/https/https.test.js.tap +0 -45
  403. package/.tap/test-results/test/imports.test.js.tap +0 -14
  404. package/.tap/test-results/test/inject.test.js.tap +0 -165
  405. package/.tap/test-results/test/internals/all.test.js.tap +0 -42
  406. package/.tap/test-results/test/internals/contentTypeParser.test.js.tap +0 -14
  407. package/.tap/test-results/test/internals/context.test.js.tap +0 -14
  408. package/.tap/test-results/test/internals/decorator.test.js.tap +0 -51
  409. package/.tap/test-results/test/internals/errors.test.js.tap +0 -1212
  410. package/.tap/test-results/test/internals/handleRequest.test.js.tap +0 -69
  411. package/.tap/test-results/test/internals/hookRunner.test.js.tap +0 -143
  412. package/.tap/test-results/test/internals/hooks.test.js.tap +0 -45
  413. package/.tap/test-results/test/internals/initialConfig.test.js.tap +0 -125
  414. package/.tap/test-results/test/internals/logger.test.js.tap +0 -71
  415. package/.tap/test-results/test/internals/plugin.test.js.tap +0 -48
  416. package/.tap/test-results/test/internals/reply-serialize.test.js.tap +0 -166
  417. package/.tap/test-results/test/internals/reply.test.js.tap +0 -688
  418. package/.tap/test-results/test/internals/reqIdGenFactory.test.js.tap +0 -74
  419. package/.tap/test-results/test/internals/request-validate.test.js.tap +0 -384
  420. package/.tap/test-results/test/internals/request.test.js.tap +0 -163
  421. package/.tap/test-results/test/internals/server.test.js.tap +0 -30
  422. package/.tap/test-results/test/internals/validation.test.js.tap +0 -121
  423. package/.tap/test-results/test/keepAliveTimeout.test.js.tap +0 -12
  424. package/.tap/test-results/test/listen.1.test.js.tap +0 -31
  425. package/.tap/test-results/test/listen.2.test.js.tap +0 -46
  426. package/.tap/test-results/test/listen.3.test.js.tap +0 -25
  427. package/.tap/test-results/test/listen.4.test.js.tap +0 -51
  428. package/.tap/test-results/test/lock.test.js.tap +0 -29
  429. package/.tap/test-results/test/logger/instantiation.test.js.tap +0 -92
  430. package/.tap/test-results/test/logger/logging.test.js.tap +0 -117
  431. package/.tap/test-results/test/logger/options.test.js.tap +0 -165
  432. package/.tap/test-results/test/logger/request.test.js.tap +0 -82
  433. package/.tap/test-results/test/logger/response.test.js.tap +0 -38
  434. package/.tap/test-results/test/maxRequestsPerSocket.test.js.tap +0 -44
  435. package/.tap/test-results/test/method-missing.test.js.tap +0 -8
  436. package/.tap/test-results/test/middleware.test.js.tap +0 -17
  437. package/.tap/test-results/test/mkcalendar.test.js.tap +0 -43
  438. package/.tap/test-results/test/mkcol.test.js.tap +0 -14
  439. package/.tap/test-results/test/move.test.js.tap +0 -15
  440. package/.tap/test-results/test/noop-set.test.js.tap +0 -8
  441. package/.tap/test-results/test/nullable-validation.test.js.tap +0 -36
  442. package/.tap/test-results/test/options.error-handler.test.js.tap +0 -186
  443. package/.tap/test-results/test/options.test.js.tap +0 -174
  444. package/.tap/test-results/test/output-validation.test.js.tap +0 -66
  445. package/.tap/test-results/test/patch.error-handler.test.js.tap +0 -206
  446. package/.tap/test-results/test/patch.test.js.tap +0 -182
  447. package/.tap/test-results/test/plugin.1.test.js.tap +0 -78
  448. package/.tap/test-results/test/plugin.2.test.js.tap +0 -102
  449. package/.tap/test-results/test/plugin.3.test.js.tap +0 -58
  450. package/.tap/test-results/test/plugin.4.test.js.tap +0 -164
  451. package/.tap/test-results/test/post-empty-body.test.js.tap +0 -8
  452. package/.tap/test-results/test/pretty-print.test.js.tap +0 -82
  453. package/.tap/test-results/test/promises.test.js.tap +0 -46
  454. package/.tap/test-results/test/propfind.test.js.tap +0 -43
  455. package/.tap/test-results/test/proppatch.test.js.tap +0 -29
  456. package/.tap/test-results/test/proto-poisoning.test.js.tap +0 -47
  457. package/.tap/test-results/test/put.error-handler.test.js.tap +0 -206
  458. package/.tap/test-results/test/put.test.js.tap +0 -182
  459. package/.tap/test-results/test/register.test.js.tap +0 -61
  460. package/.tap/test-results/test/reply-code.test.js.tap +0 -40
  461. package/.tap/test-results/test/reply-earlyHints.test.js.tap +0 -22
  462. package/.tap/test-results/test/reply-error.test.js.tap +0 -643
  463. package/.tap/test-results/test/reply-trailers.test.js.tap +0 -176
  464. package/.tap/test-results/test/report.test.js.tap +0 -43
  465. package/.tap/test-results/test/request-error.test.js.tap +0 -98
  466. package/.tap/test-results/test/request-id.test.js.tap +0 -38
  467. package/.tap/test-results/test/request.deprecated.test.js.tap +0 -13
  468. package/.tap/test-results/test/requestTimeout.test.js.tap +0 -21
  469. package/.tap/test-results/test/route-hooks.test.js.tap +0 -498
  470. package/.tap/test-results/test/route-prefix.test.js.tap +0 -195
  471. package/.tap/test-results/test/route-shorthand.test.js.tap +0 -190
  472. package/.tap/test-results/test/route.1.test.js.tap +0 -93
  473. package/.tap/test-results/test/route.2.test.js.tap +0 -28
  474. package/.tap/test-results/test/route.3.test.js.tap +0 -39
  475. package/.tap/test-results/test/route.4.test.js.tap +0 -32
  476. package/.tap/test-results/test/route.5.test.js.tap +0 -54
  477. package/.tap/test-results/test/route.6.test.js.tap +0 -81
  478. package/.tap/test-results/test/route.7.test.js.tap +0 -93
  479. package/.tap/test-results/test/route.8.test.js.tap +0 -38
  480. package/.tap/test-results/test/router-options.test.js.tap +0 -104
  481. package/.tap/test-results/test/same-shape.test.js.tap +0 -22
  482. package/.tap/test-results/test/schema-examples.test.js.tap +0 -85
  483. package/.tap/test-results/test/schema-feature.test.js.tap +0 -445
  484. package/.tap/test-results/test/schema-serialization.test.js.tap +0 -194
  485. package/.tap/test-results/test/schema-special-usage.test.js.tap +0 -186
  486. package/.tap/test-results/test/schema-validation.test.js.tap +0 -199
  487. package/.tap/test-results/test/search.test.js.tap +0 -77
  488. package/.tap/test-results/test/serialize-response.test.js.tap +0 -26
  489. package/.tap/test-results/test/server.test.js.tap +0 -65
  490. package/.tap/test-results/test/set-error-handler.test.js.tap +0 -7
  491. package/.tap/test-results/test/skip-reply-send.test.js.tap +0 -272
  492. package/.tap/test-results/test/stream.1.test.js.tap +0 -36
  493. package/.tap/test-results/test/stream.2.test.js.tap +0 -20
  494. package/.tap/test-results/test/stream.3.test.js.tap +0 -34
  495. package/.tap/test-results/test/stream.4.test.js.tap +0 -40
  496. package/.tap/test-results/test/stream.5.test.js.tap +0 -37
  497. package/.tap/test-results/test/sync-routes.test.js.tap +0 -19
  498. package/.tap/test-results/test/throw.test.js.tap +0 -116
  499. package/.tap/test-results/test/trace.test.js.tap +0 -7
  500. package/.tap/test-results/test/trust-proxy.test.js.tap +0 -109
  501. package/.tap/test-results/test/type-provider.test.js.tap +0 -12
  502. package/.tap/test-results/test/unlock.test.js.tap +0 -14
  503. package/.tap/test-results/test/upgrade.test.js.tap +0 -8
  504. package/.tap/test-results/test/url-rewriting.test.js.tap +0 -39
  505. package/.tap/test-results/test/useSemicolonDelimiter.test.js.tap +0 -33
  506. package/.tap/test-results/test/validation-error-handling.test.js.tap +0 -180
  507. package/.tap/test-results/test/versioned-routes.test.js.tap +0 -151
  508. package/.tap/test-results/test/web-api.test.js.tap +0 -51
  509. package/.tap/test-results/test/wrapThenable.test.js.tap +0 -11
  510. package/EXPENSE_POLICY.md +0 -105
  511. package/test/default-route.test.js +0 -88
  512. package/test/listen.deprecated.test.js +0 -229
  513. package/test/unsupported-httpversion.test.js +0 -31
  514. package/types/.eslintrc.json +0 -48
package/lib/server.js CHANGED
@@ -3,8 +3,8 @@
3
3
  const http = require('node:http')
4
4
  const https = require('node:https')
5
5
  const dns = require('node:dns')
6
+ const os = require('node:os')
6
7
 
7
- const { FSTDEP011 } = require('./warnings')
8
8
  const { kState, kOptions, kServerBindings } = require('./symbols')
9
9
  const { onListenHookRunner } = require('./hooks')
10
10
  const {
@@ -15,7 +15,6 @@ const {
15
15
  } = require('./errors')
16
16
 
17
17
  module.exports.createServer = createServer
18
- module.exports.compileValidateHTTPVersion = compileValidateHTTPVersion
19
18
 
20
19
  function defaultResolveServerListeningText (address) {
21
20
  return `Server listening at ${address}`
@@ -25,27 +24,11 @@ function createServer (options, httpHandler) {
25
24
  const server = getServerInstance(options, httpHandler)
26
25
 
27
26
  // `this` is the Fastify object
28
- function listen (listenOptions, ...args) {
29
- let cb = args.slice(-1).pop()
30
- // When the variadic signature deprecation is complete, the function
31
- // declaration should become:
32
- // function listen (listenOptions = { port: 0, host: 'localhost' }, cb = undefined)
33
- // Upon doing so, the `normalizeListenArgs` function is no longer needed,
34
- // and all of this preamble to feed it correctly also no longer needed.
35
- const firstArgType = Object.prototype.toString.call(arguments[0])
36
- if (arguments.length === 0) {
37
- listenOptions = normalizeListenArgs([])
38
- } else if (arguments.length > 0 && (firstArgType !== '[object Object]' && firstArgType !== '[object Function]')) {
39
- FSTDEP011()
40
- listenOptions = normalizeListenArgs(Array.from(arguments))
41
- cb = listenOptions.cb
42
- } else if (args.length > 1) {
43
- // `.listen(obj, a, ..., n, callback )`
44
- FSTDEP011()
45
- // Deal with `.listen(port, host, backlog, [cb])`
46
- const hostPath = listenOptions.path ? [listenOptions.path] : [listenOptions.port ?? 0, listenOptions.host ?? 'localhost']
47
- Object.assign(listenOptions, normalizeListenArgs([...hostPath, ...args]))
48
- } else {
27
+ function listen (
28
+ listenOptions = { port: 0, host: 'localhost' },
29
+ cb = undefined
30
+ ) {
31
+ if (typeof cb === 'function') {
49
32
  listenOptions.cb = cb
50
33
  }
51
34
  if (listenOptions.signal) {
@@ -220,6 +203,7 @@ function multipleBindings (mainServer, httpHandler, serverOpts, listenOptions, o
220
203
  function listenCallback (server, listenOptions) {
221
204
  const wrap = (err) => {
222
205
  server.removeListener('error', wrap)
206
+ server.removeListener('listening', wrap)
223
207
  if (!err) {
224
208
  const address = logServerAddress.call(this, server, listenOptions.listenTextResolver || defaultResolveServerListeningText)
225
209
  listenOptions.cb(null, address)
@@ -240,7 +224,8 @@ function listenCallback (server, listenOptions) {
240
224
 
241
225
  server.once('error', wrap)
242
226
  if (!this[kState].closing) {
243
- server.listen(listenOptions, wrap)
227
+ server.once('listening', wrap)
228
+ server.listen(listenOptions)
244
229
  this[kState].listening = true
245
230
  }
246
231
  }
@@ -255,79 +240,37 @@ function listenPromise (server, listenOptions) {
255
240
 
256
241
  return this.ready().then(() => {
257
242
  let errEventHandler
243
+ let listeningEventHandler
244
+ function cleanup () {
245
+ server.removeListener('error', errEventHandler)
246
+ server.removeListener('listening', listeningEventHandler)
247
+ }
258
248
  const errEvent = new Promise((resolve, reject) => {
259
249
  errEventHandler = (err) => {
250
+ cleanup()
260
251
  this[kState].listening = false
261
252
  reject(err)
262
253
  }
263
254
  server.once('error', errEventHandler)
264
255
  })
265
- const listen = new Promise((resolve, reject) => {
266
- server.listen(listenOptions, () => {
267
- server.removeListener('error', errEventHandler)
256
+ const listeningEvent = new Promise((resolve, reject) => {
257
+ listeningEventHandler = () => {
258
+ cleanup()
259
+ this[kState].listening = true
268
260
  resolve(logServerAddress.call(this, server, listenOptions.listenTextResolver || defaultResolveServerListeningText))
269
- })
270
- // we set it afterwards because listen can throw
271
- this[kState].listening = true
261
+ }
262
+ server.once('listening', listeningEventHandler)
272
263
  })
273
264
 
265
+ server.listen(listenOptions)
266
+
274
267
  return Promise.race([
275
268
  errEvent, // e.g invalid port range error is always emitted before the server listening
276
- listen
269
+ listeningEvent
277
270
  ])
278
271
  })
279
272
  }
280
273
 
281
- /**
282
- * Creates a function that, based upon initial configuration, will
283
- * verify that every incoming request conforms to allowed
284
- * HTTP versions for the Fastify instance, e.g. a Fastify HTTP/1.1
285
- * server will not serve HTTP/2 requests upon the result of the
286
- * verification function.
287
- *
288
- * @param {object} options fastify option
289
- * @param {function} [options.serverFactory] If present, the
290
- * validator function will skip all checks.
291
- * @param {boolean} [options.http2 = false] If true, the validator
292
- * function will allow HTTP/2 requests.
293
- * @param {object} [options.https = null] https server options
294
- * @param {boolean} [options.https.allowHTTP1] If true and use
295
- * with options.http2 the validator function will allow HTTP/1
296
- * request to http2 server.
297
- *
298
- * @returns {function} HTTP version validator function.
299
- */
300
- function compileValidateHTTPVersion (options) {
301
- let bypass = false
302
- // key-value map to store valid http version
303
- const map = new Map()
304
- if (options.serverFactory) {
305
- // When serverFactory is passed, we cannot identify how to check http version reliably
306
- // So, we should skip the http version check
307
- bypass = true
308
- }
309
- if (options.http2) {
310
- // HTTP2 must serve HTTP/2.0
311
- map.set('2.0', true)
312
- if (options.https && options.https.allowHTTP1 === true) {
313
- // HTTP2 with HTTPS.allowHTTP1 allow fallback to HTTP/1.1 and HTTP/1.0
314
- map.set('1.1', true)
315
- map.set('1.0', true)
316
- }
317
- } else {
318
- // HTTP must server HTTP/1.1 and HTTP/1.0
319
- map.set('1.1', true)
320
- map.set('1.0', true)
321
- }
322
- // The compiled function here placed in one of the hottest path inside fastify
323
- // the implementation here must be as performant as possible
324
- return function validateHTTPVersion (httpVersion) {
325
- // `bypass` skip the check when custom server factory provided
326
- // `httpVersion in obj` check for the valid http version we should support
327
- return bypass || map.has(httpVersion)
328
- }
329
- }
330
-
331
274
  function getServerInstance (options, httpHandler) {
332
275
  let server = null
333
276
  // node@20 do not accepts options as boolean
@@ -364,57 +307,53 @@ function getServerInstance (options, httpHandler) {
364
307
  }
365
308
  return server
366
309
  }
367
-
368
- function normalizeListenArgs (args) {
369
- if (args.length === 0) {
370
- return { port: 0, host: 'localhost' }
371
- }
372
-
373
- const cb = typeof args[args.length - 1] === 'function' ? args.pop() : undefined
374
- const options = { cb }
375
-
376
- const firstArg = args[0]
377
- const argsLength = args.length
378
- const lastArg = args[argsLength - 1]
379
- if (typeof firstArg === 'string' && isNaN(firstArg)) {
380
- /* Deal with listen (pipe[, backlog]) */
381
- options.path = firstArg
382
- options.backlog = argsLength > 1 ? lastArg : undefined
383
- } else {
384
- /* Deal with listen ([port[, host[, backlog]]]) */
385
- options.port = argsLength >= 1 && Number.isInteger(firstArg) ? firstArg : normalizePort(firstArg)
386
- // This will listen to what localhost is.
387
- // It can be 127.0.0.1 or ::1, depending on the operating system.
388
- // Fixes https://github.com/fastify/fastify/issues/1022.
389
- options.host = argsLength >= 2 && args[1] ? args[1] : 'localhost'
390
- options.backlog = argsLength >= 3 ? args[2] : undefined
310
+ /**
311
+ * Inspects the provided `server.address` object and returns a
312
+ * normalized list of IP address strings. Normalization in this
313
+ * case refers to mapping wildcard `0.0.0.0` to the list of IP
314
+ * addresses the wildcard refers to.
315
+ *
316
+ * @see https://nodejs.org/docs/latest/api/net.html#serveraddress
317
+ *
318
+ * @param {object} A server address object as described in the
319
+ * linked docs.
320
+ *
321
+ * @returns {string[]}
322
+ */
323
+ function getAddresses (address) {
324
+ if (address.address === '0.0.0.0') {
325
+ return Object.values(os.networkInterfaces()).flatMap((iface) => {
326
+ return iface.filter((iface) => iface.family === 'IPv4')
327
+ }).sort((iface) => {
328
+ /* c8 ignore next 2 */
329
+ // Order the interfaces so that internal ones come first
330
+ return iface.internal ? -1 : 1
331
+ }).map((iface) => { return iface.address })
391
332
  }
392
-
393
- return options
394
- }
395
-
396
- function normalizePort (firstArg) {
397
- const port = Number(firstArg)
398
- return port >= 0 && !Number.isNaN(port) && Number.isInteger(port) ? port : 0
333
+ return [address.address]
399
334
  }
400
335
 
401
336
  function logServerAddress (server, listenTextResolver) {
402
- let address = server.address()
403
- const isUnixSocket = typeof address === 'string'
404
- /* istanbul ignore next */
337
+ let addresses
338
+ const isUnixSocket = typeof server.address() === 'string'
405
339
  if (!isUnixSocket) {
406
- if (address.address.indexOf(':') === -1) {
407
- address = address.address + ':' + address.port
340
+ if (server.address().address.indexOf(':') === -1) {
341
+ // IPv4
342
+ addresses = getAddresses(server.address()).map((address) => address + ':' + server.address().port)
408
343
  } else {
409
- address = '[' + address.address + ']:' + address.port
344
+ // IPv6
345
+ addresses = ['[' + server.address().address + ']:' + server.address().port]
410
346
  }
347
+
348
+ addresses = addresses.map((address) => ('http' + (this[kOptions].https ? 's' : '') + '://') + address)
349
+ } else {
350
+ addresses = [server.address()]
411
351
  }
412
- /* istanbul ignore next */
413
- address = (isUnixSocket ? '' : ('http' + (this[kOptions].https ? 's' : '') + '://')) + address
414
352
 
415
- const serverListeningText = listenTextResolver(address)
416
- this.log.info(serverListeningText)
417
- return address
353
+ for (const address of addresses) {
354
+ this.log.info(listenTextResolver(address))
355
+ }
356
+ return addresses[0]
418
357
  }
419
358
 
420
359
  function http2 () {
package/lib/warnings.js CHANGED
@@ -2,16 +2,30 @@
2
2
 
3
3
  const { createDeprecation, createWarning } = require('process-warning')
4
4
 
5
+ /**
6
+ * Deprecation codes:
7
+ * - FSTDEP005
8
+ * - FSTDEP007
9
+ * - FSTDEP008
10
+ * - FSTDEP009
11
+ * - FSTDEP010
12
+ * - FSTDEP012
13
+ * - FSTDEP013
14
+ * - FSTDEP015
15
+ * - FSTDEP016
16
+ * - FSTDEP017
17
+ * - FSTDEP018
18
+ * - FSTDEP019
19
+ * - FSTDEP021
20
+ * - FSTWRN001
21
+ * - FSTSEC001
22
+ */
23
+
5
24
  const FSTDEP005 = createDeprecation({
6
25
  code: 'FSTDEP005',
7
26
  message: 'You are accessing the deprecated "request.connection" property. Use "request.socket" instead.'
8
27
  })
9
28
 
10
- const FSTDEP006 = createDeprecation({
11
- code: 'FSTDEP006',
12
- message: 'You are decorating Request/Reply with a reference type. This reference is shared amongst all requests. Use onRequest hook instead. Property: %s'
13
- })
14
-
15
29
  const FSTDEP007 = createDeprecation({
16
30
  code: 'FSTDEP007',
17
31
  message: 'You are trying to set a HEAD route using "exposeHeadRoute" route flag when a sibling route is already set. See documentation for more info.'
@@ -32,11 +46,6 @@ const FSTDEP010 = createDeprecation({
32
46
  message: 'Modifying the "reply.sent" property is deprecated. Use the "reply.hijack()" method instead.'
33
47
  })
34
48
 
35
- const FSTDEP011 = createDeprecation({
36
- code: 'FSTDEP011',
37
- message: 'Variadic listen method is deprecated. Please use ".listen(optionsObject)" instead. The variadic signature will be removed in `fastify@5`.'
38
- })
39
-
40
49
  const FSTDEP012 = createDeprecation({
41
50
  code: 'FSTDEP012',
42
51
  message: 'request.context property access is deprecated. Please use "request.routeOptions.config" or "request.routeOptions.schema" instead for accessing Route settings. The "request.context" will be removed in `fastify@5`.'
@@ -47,11 +56,6 @@ const FSTDEP013 = createDeprecation({
47
56
  message: 'Direct return of "trailers" function is deprecated. Please use "callback" or "async-await" for return value. The support of direct return will removed in `fastify@5`.'
48
57
  })
49
58
 
50
- const FSTDEP014 = createDeprecation({
51
- code: 'FSTDEP014',
52
- message: 'You are trying to set/access the default route. This property is deprecated. Please, use setNotFoundHandler if you want to custom a 404 handler or the wildcard (*) to match all routes.'
53
- })
54
-
55
59
  const FSTDEP015 = createDeprecation({
56
60
  code: 'FSTDEP015',
57
61
  message: 'You are accessing the deprecated "request.routeSchema" property. Use "request.routeOptions.schema" instead. Property "req.routeSchema" will be removed in `fastify@5`.'
@@ -77,11 +81,6 @@ const FSTDEP019 = createDeprecation({
77
81
  message: 'reply.context property access is deprecated. Please use "request.routeOptions.config" or "request.routeOptions.schema" instead for accessing Route settings. The "reply.context" will be removed in `fastify@5`.'
78
82
  })
79
83
 
80
- const FSTDEP020 = createDeprecation({
81
- code: 'FSTDEP020',
82
- message: 'You are using the deprecated "reply.getResponseTime()" method. Use the "reply.elapsedTime" property instead. Method "reply.getResponseTime()" will be removed in `fastify@5`.'
83
- })
84
-
85
84
  const FSTDEP021 = createDeprecation({
86
85
  code: 'FSTDEP021',
87
86
  message: 'The `reply.redirect()` method has a new signature: `reply.redirect(url: string, code?: number)`. It will be enforced in `fastify@v5`'
@@ -94,31 +93,27 @@ const FSTWRN001 = createWarning({
94
93
  unlimited: true
95
94
  })
96
95
 
97
- const FSTWRN002 = createWarning({
98
- name: 'FastifyWarning',
99
- code: 'FSTWRN002',
100
- message: 'The %s plugin being registered mixes async and callback styles, which will result in an error in `fastify@5`',
96
+ const FSTSEC001 = createWarning({
97
+ name: 'FastifySecurity',
98
+ code: 'FSTSEC001',
99
+ message: 'You are using /%s/ Content-Type which may be vulnerable to CORS attack. Please make sure your RegExp start with "^" or include ";?" to proper detection of the essence MIME type.',
101
100
  unlimited: true
102
101
  })
103
102
 
104
103
  module.exports = {
105
104
  FSTDEP005,
106
- FSTDEP006,
107
105
  FSTDEP007,
108
106
  FSTDEP008,
109
107
  FSTDEP009,
110
108
  FSTDEP010,
111
- FSTDEP011,
112
109
  FSTDEP012,
113
110
  FSTDEP013,
114
- FSTDEP014,
115
111
  FSTDEP015,
116
112
  FSTDEP016,
117
113
  FSTDEP017,
118
114
  FSTDEP018,
119
115
  FSTDEP019,
120
- FSTDEP020,
121
116
  FSTDEP021,
122
117
  FSTWRN001,
123
- FSTWRN002
118
+ FSTSEC001
124
119
  }
@@ -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.3",
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.8.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": "^4.0.0",
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": "^6.0.0",
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
  })