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
package/lib/reply.js CHANGED
@@ -55,7 +55,7 @@ const {
55
55
  FST_ERR_MISSING_SERIALIZATION_FN,
56
56
  FST_ERR_MISSING_CONTENTTYPE_SERIALIZATION_FN
57
57
  } = require('./errors')
58
- const { FSTDEP010, FSTDEP013, FSTDEP019, FSTDEP020, FSTDEP021 } = require('./warnings')
58
+ const { FSTDEP010, FSTDEP013, FSTDEP019, FSTDEP021 } = require('./warnings')
59
59
 
60
60
  const toString = Object.prototype.toString
61
61
 
@@ -137,6 +137,11 @@ Object.defineProperties(Reply.prototype, {
137
137
  }
138
138
  })
139
139
 
140
+ Reply.prototype.writeEarlyHints = function (hints, callback) {
141
+ this.raw.writeEarlyHints(hints, callback)
142
+ return this
143
+ }
144
+
140
145
  Reply.prototype.hijack = function () {
141
146
  this[kReplyHijacked] = true
142
147
  return this
@@ -477,13 +482,6 @@ Reply.prototype.callNotFound = function () {
477
482
  return this
478
483
  }
479
484
 
480
- // TODO: should be removed in fastify@5
481
- Reply.prototype.getResponseTime = function () {
482
- FSTDEP020()
483
-
484
- return this.elapsedTime
485
- }
486
-
487
485
  // Make reply a thenable, so it could be used with async/await.
488
486
  // See
489
487
  // - https://github.com/fastify/fastify/issues/1864 for the discussions
@@ -910,9 +908,8 @@ function buildReply (R) {
910
908
  this[kReplyEndTime] = undefined
911
909
  this.log = log
912
910
 
913
- // eslint-disable-next-line no-var
914
911
  var prop
915
- // eslint-disable-next-line no-var
912
+
916
913
  for (var i = 0; i < props.length; i++) {
917
914
  prop = props[i]
918
915
  this[prop.key] = prop.value
package/lib/request.js CHANGED
@@ -1,7 +1,6 @@
1
1
  'use strict'
2
2
 
3
3
  const proxyAddr = require('proxy-addr')
4
- const semver = require('semver')
5
4
  const {
6
5
  FSTDEP005,
7
6
  FSTDEP012,
@@ -49,8 +48,8 @@ function getTrustProxyFn (tp) {
49
48
  return tp
50
49
  }
51
50
  if (tp === true) {
52
- // Support plain true/false
53
- return function () { return true }
51
+ // Support trusting everything
52
+ return null
54
53
  }
55
54
  if (typeof tp === 'number') {
56
55
  // Support trusting hop count
@@ -115,7 +114,8 @@ function buildRequestWithTrustProxy (R, trustProxy) {
115
114
  Object.defineProperties(_Request.prototype, {
116
115
  ip: {
117
116
  get () {
118
- return proxyAddr(this.raw, proxyFn)
117
+ const addrs = proxyAddr.all(this.raw, proxyFn)
118
+ return addrs[addrs.length - 1]
119
119
  }
120
120
  },
121
121
  ips: {
@@ -123,7 +123,7 @@ function buildRequestWithTrustProxy (R, trustProxy) {
123
123
  return proxyAddr.all(this.raw, proxyFn)
124
124
  }
125
125
  },
126
- hostname: {
126
+ host: {
127
127
  get () {
128
128
  if (this.ip !== undefined && this.headers['x-forwarded-host']) {
129
129
  return getLastEntryInMultiHeaderValue(this.headers['x-forwarded-host'])
@@ -238,10 +238,7 @@ Object.defineProperties(Request.prototype, {
238
238
  },
239
239
  connection: {
240
240
  get () {
241
- /* istanbul ignore next */
242
- if (semver.gte(process.versions.node, '13.0.0')) {
243
- FSTDEP005()
244
- }
241
+ FSTDEP005()
245
242
  return this.raw.connection
246
243
  }
247
244
  },
@@ -257,11 +254,32 @@ Object.defineProperties(Request.prototype, {
257
254
  }
258
255
  }
259
256
  },
260
- hostname: {
257
+ host: {
261
258
  get () {
262
259
  return this.raw.headers.host || this.raw.headers[':authority']
263
260
  }
264
261
  },
262
+ hostname: {
263
+ get () {
264
+ return (this.host).split(':')[0]
265
+ }
266
+ },
267
+ port: {
268
+ get () {
269
+ // first try taking port from host
270
+ const portFromHost = parseInt((this.host).split(':').slice(-1)[0])
271
+ if (!isNaN(portFromHost)) {
272
+ return portFromHost
273
+ }
274
+ // now fall back to port from host/:authority header
275
+ const portFromHeader = parseInt((this.headers.host || this.headers[':authority']).split(':').slice(-1)[0])
276
+ if (!isNaN(portFromHeader)) {
277
+ return portFromHeader
278
+ }
279
+ // fall back to null
280
+ return null
281
+ }
282
+ },
265
283
  protocol: {
266
284
  get () {
267
285
  if (this.socket) {
@@ -299,13 +317,13 @@ Object.defineProperties(Request.prototype, {
299
317
  }
300
318
 
301
319
  const validatorCompiler = this[kRouteContext].validatorCompiler ||
302
- this.server[kSchemaController].validatorCompiler ||
303
- (
304
- // We compile the schemas if no custom validatorCompiler is provided
305
- // nor set
306
- this.server[kSchemaController].setupValidator(this.server[kOptions]) ||
307
- this.server[kSchemaController].validatorCompiler
308
- )
320
+ this.server[kSchemaController].validatorCompiler ||
321
+ (
322
+ // We compile the schemas if no custom validatorCompiler is provided
323
+ // nor set
324
+ this.server[kSchemaController].setupValidator(this.server[kOptions]) ||
325
+ this.server[kSchemaController].validatorCompiler
326
+ )
309
327
 
310
328
  const validateFn = validatorCompiler({
311
329
  schema,
@@ -342,8 +360,8 @@ Object.defineProperties(Request.prototype, {
342
360
 
343
361
  // We cannot compile if the schema is missed
344
362
  if (validate == null && (schema == null ||
345
- typeof schema !== 'object' ||
346
- Array.isArray(schema))
363
+ typeof schema !== 'object' ||
364
+ Array.isArray(schema))
347
365
  ) {
348
366
  throw new FST_ERR_REQ_INVALID_VALIDATION_INVOCATION(httpPart)
349
367
  }
package/lib/route.js CHANGED
@@ -9,8 +9,7 @@ const { normalizeSchema } = require('./schemas')
9
9
  const { parseHeadOnSendHandlers } = require('./headRoute')
10
10
  const {
11
11
  FSTDEP007,
12
- FSTDEP008,
13
- FSTDEP014
12
+ FSTDEP008
14
13
  } = require('./warnings')
15
14
 
16
15
  const {
@@ -21,7 +20,6 @@ const {
21
20
  const {
22
21
  FST_ERR_SCH_VALIDATION_BUILD,
23
22
  FST_ERR_SCH_SERIALIZATION_BUILD,
24
- FST_ERR_DEFAULT_ROUTE_INVALID_TYPE,
25
23
  FST_ERR_DUPLICATED_ROUTE,
26
24
  FST_ERR_INVALID_URL,
27
25
  FST_ERR_HOOK_INVALID_HANDLER,
@@ -72,7 +70,6 @@ function buildRouting (options) {
72
70
  let ignoreDuplicateSlashes
73
71
  let return503OnClosing
74
72
  let globalExposeHeadRoutes
75
- let validateHTTPVersion
76
73
  let keepAliveConnections
77
74
 
78
75
  let closing = false
@@ -89,7 +86,6 @@ function buildRouting (options) {
89
86
  hasLogger = fastifyArgs.hasLogger
90
87
  setupResponseListeners = fastifyArgs.setupResponseListeners
91
88
  throwIfAlreadyStarted = fastifyArgs.throwIfAlreadyStarted
92
- validateHTTPVersion = fastifyArgs.validateHTTPVersion
93
89
 
94
90
  globalExposeHeadRoutes = options.exposeHeadRoutes
95
91
  disableRequestLogging = options.disableRequestLogging
@@ -102,18 +98,6 @@ function buildRouting (options) {
102
98
  route, // configure a route in the fastify instance
103
99
  hasRoute,
104
100
  prepareRoute,
105
- getDefaultRoute: function () {
106
- FSTDEP014()
107
- return router.defaultRoute
108
- },
109
- setDefaultRoute: function (defaultRoute) {
110
- FSTDEP014()
111
- if (typeof defaultRoute !== 'function') {
112
- throw new FST_ERR_DEFAULT_ROUTE_INVALID_TYPE()
113
- }
114
-
115
- router.defaultRoute = defaultRoute
116
- },
117
101
  routeHandler,
118
102
  closeRoutes: () => { closing = true },
119
103
  printRoutes: router.prettyPrint.bind(router),
@@ -169,10 +153,11 @@ function buildRouting (options) {
169
153
 
170
154
  function hasRoute ({ options }) {
171
155
  const normalizedMethod = options.method?.toUpperCase() ?? ''
172
- return findRoute({
173
- ...options,
174
- method: normalizedMethod
175
- }) !== null
156
+ return router.hasRoute(
157
+ normalizedMethod,
158
+ options.url || '',
159
+ options.constraints
160
+ )
176
161
  }
177
162
 
178
163
  function findRoute (options) {
@@ -460,19 +445,6 @@ function buildRouting (options) {
460
445
  const childLogger = createChildLogger(context, logger, req, id, loggerOpts)
461
446
  childLogger[kDisableRequestLogging] = disableRequestLogging
462
447
 
463
- // TODO: The check here should be removed once https://github.com/nodejs/node/issues/43115 resolve in core.
464
- if (!validateHTTPVersion(req.httpVersion)) {
465
- childLogger.info({ res: { statusCode: 505 } }, 'request aborted - invalid HTTP version')
466
- const message = '{"error":"HTTP Version Not Supported","message":"HTTP Version Not Supported","statusCode":505}'
467
- const headers = {
468
- 'Content-Type': 'application/json',
469
- 'Content-Length': message.length
470
- }
471
- res.writeHead(505, headers)
472
- res.end(message)
473
- return
474
- }
475
-
476
448
  if (closing === true) {
477
449
  /* istanbul ignore next mac, windows */
478
450
  if (req.httpVersionMajor !== 2) {
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
  }