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/errors.js CHANGED
@@ -151,6 +151,10 @@ const codes = {
151
151
  'FST_ERR_DEC_AFTER_START',
152
152
  "The decorator '%s' has been added after start!"
153
153
  ),
154
+ FST_ERR_DEC_REFERENCE_TYPE: createError(
155
+ 'FST_ERR_DEC_REFERENCE_TYPE',
156
+ "The decorator '%s' of type '%s' is a reference type. Use the { getter, setter } interface instead."
157
+ ),
154
158
 
155
159
  /**
156
160
  * hooks
@@ -209,6 +213,27 @@ const codes = {
209
213
  TypeError
210
214
  ),
211
215
 
216
+ FST_ERR_LOG_INVALID_LOGGER_INSTANCE: createError(
217
+ 'FST_ERR_LOG_INVALID_LOGGER_INSTANCE',
218
+ 'loggerInstance only accepts a logger instance.',
219
+ 500,
220
+ TypeError
221
+ ),
222
+
223
+ FST_ERR_LOG_INVALID_LOGGER_CONFIG: createError(
224
+ 'FST_ERR_LOG_INVALID_LOGGER_CONFIG',
225
+ 'logger options only accepts a configuration object.',
226
+ 500,
227
+ TypeError
228
+ ),
229
+
230
+ FST_ERR_LOG_LOGGER_AND_LOGGER_INSTANCE_PROVIDED: createError(
231
+ 'FST_ERR_LOG_LOGGER_AND_LOGGER_INSTANCE_PROVIDED',
232
+ 'You cannot provide both logger and loggerInstance. Please provide only one.',
233
+ 500,
234
+ TypeError
235
+ ),
236
+
212
237
  /**
213
238
  * reply
214
239
  */
@@ -339,12 +364,6 @@ const codes = {
339
364
  'Unexpected error from async constraint',
340
365
  500
341
366
  ),
342
- FST_ERR_DEFAULT_ROUTE_INVALID_TYPE: createError(
343
- 'FST_ERR_DEFAULT_ROUTE_INVALID_TYPE',
344
- 'The defaultRoute type should be a function',
345
- 500,
346
- TypeError
347
- ),
348
367
  FST_ERR_INVALID_URL: createError(
349
368
  'FST_ERR_INVALID_URL',
350
369
  "URL must be a string. Received '%s'",
@@ -429,6 +448,12 @@ const codes = {
429
448
  'FST_ERR_PLUGIN_NOT_PRESENT_IN_INSTANCE',
430
449
  "The decorator '%s'%s is not present in %s"
431
450
  ),
451
+ FST_ERR_PLUGIN_INVALID_ASYNC_HANDLER: createError(
452
+ 'FST_ERR_PLUGIN_INVALID_ASYNC_HANDLER',
453
+ 'The %s plugin being registered mixes async and callback styles. Async plugin should not mix async and callback style.',
454
+ 500,
455
+ TypeError
456
+ ),
432
457
 
433
458
  /**
434
459
  * Avvio Errors
@@ -1,13 +1,18 @@
1
1
  'use strict'
2
2
 
3
+ const { bodylessMethods, bodyMethods } = require('./httpMethods')
4
+ const diagnostics = require('dc-polyfill')
3
5
  const { validate: validateSchema } = require('./validation')
4
6
  const { preValidationHookRunner, preHandlerHookRunner } = require('./hooks')
5
7
  const wrapThenable = require('./wrapThenable')
6
8
  const {
7
9
  kReplyIsError,
8
- kRouteContext
10
+ kRouteContext,
11
+ kFourOhFourContext
9
12
  } = require('./symbols')
10
13
 
14
+ const channels = diagnostics.tracingChannel('fastify.request.handler')
15
+
11
16
  function handleRequest (err, request, reply) {
12
17
  if (reply.sent === true) return
13
18
  if (err != null) {
@@ -20,45 +25,37 @@ function handleRequest (err, request, reply) {
20
25
  const headers = request.headers
21
26
  const context = request[kRouteContext]
22
27
 
23
- if (method === 'GET' || method === 'HEAD') {
28
+ if (bodylessMethods.has(method)) {
24
29
  handler(request, reply)
25
30
  return
26
31
  }
27
32
 
28
- const contentType = headers['content-type']
33
+ if (bodyMethods.has(method)) {
34
+ const contentType = headers['content-type']
35
+ const contentLength = headers['content-length']
36
+ const transferEncoding = headers['transfer-encoding']
29
37
 
30
- if (method === 'POST' || method === 'PUT' || method === 'PATCH' || method === 'TRACE' || method === 'SEARCH' ||
31
- method === 'PROPFIND' || method === 'PROPPATCH' || method === 'LOCK' || method === 'REPORT' || method === 'MKCALENDAR') {
32
38
  if (contentType === undefined) {
33
39
  if (
34
- headers['transfer-encoding'] === undefined &&
35
- (headers['content-length'] === '0' || headers['content-length'] === undefined)
36
- ) { // Request has no body to parse
40
+ (contentLength === undefined || contentLength === '0') &&
41
+ transferEncoding === undefined
42
+ ) {
43
+ // Request has no body to parse
37
44
  handler(request, reply)
38
45
  } else {
39
46
  context.contentTypeParser.run('', handler, request, reply)
40
47
  }
41
48
  } else {
49
+ if (contentLength === undefined && transferEncoding === undefined && method === 'OPTIONS') {
50
+ // OPTIONS can have a Content-Type header without a body
51
+ handler(request, reply)
52
+ return
53
+ }
42
54
  context.contentTypeParser.run(contentType, handler, request, reply)
43
55
  }
44
56
  return
45
57
  }
46
58
 
47
- if (method === 'OPTIONS' || method === 'DELETE') {
48
- if (
49
- contentType !== undefined &&
50
- (
51
- headers['transfer-encoding'] !== undefined ||
52
- headers['content-length'] !== undefined
53
- )
54
- ) {
55
- context.contentTypeParser.run(contentType, handler, request, reply)
56
- } else {
57
- handler(request, reply)
58
- }
59
- return
60
- }
61
-
62
59
  // Return 404 instead of 405 see https://github.com/fastify/fastify/pull/862 for discussion
63
60
  handler(request, reply)
64
61
  }
@@ -126,28 +123,62 @@ function validationCompleted (request, reply, validationErr) {
126
123
  function preHandlerCallback (err, request, reply) {
127
124
  if (reply.sent) return
128
125
 
129
- if (err != null) {
130
- reply[kReplyIsError] = true
131
- reply.send(err)
132
- return
126
+ const context = request[kRouteContext]
127
+
128
+ if (!channels.hasSubscribers || context[kFourOhFourContext] === null) {
129
+ preHandlerCallbackInner(err, request, reply)
130
+ } else {
131
+ const store = {
132
+ request,
133
+ reply,
134
+ async: false,
135
+ route: {
136
+ url: context.config.url,
137
+ method: context.config.method
138
+ }
139
+ }
140
+ channels.start.runStores(store, preHandlerCallbackInner, undefined, err, request, reply, store)
133
141
  }
142
+ }
134
143
 
135
- let result
144
+ function preHandlerCallbackInner (err, request, reply, store) {
145
+ const context = request[kRouteContext]
136
146
 
137
147
  try {
138
- result = request[kRouteContext].handler(request, reply)
139
- } catch (err) {
140
- reply[kReplyIsError] = true
141
- reply.send(err)
142
- return
143
- }
148
+ if (err != null) {
149
+ reply[kReplyIsError] = true
150
+ reply.send(err)
151
+ if (store) {
152
+ store.error = err
153
+ channels.error.publish(store)
154
+ }
155
+ return
156
+ }
144
157
 
145
- if (result !== undefined) {
146
- if (result !== null && typeof result.then === 'function') {
147
- wrapThenable(result, reply)
148
- } else {
149
- reply.send(result)
158
+ let result
159
+
160
+ try {
161
+ result = context.handler(request, reply)
162
+ } catch (err) {
163
+ if (store) {
164
+ store.error = err
165
+ channels.error.publish(store)
166
+ }
167
+
168
+ reply[kReplyIsError] = true
169
+ reply.send(err)
170
+ return
171
+ }
172
+
173
+ if (result !== undefined) {
174
+ if (result !== null && typeof result.then === 'function') {
175
+ wrapThenable(result, reply, store)
176
+ } else {
177
+ reply.send(result)
178
+ }
150
179
  }
180
+ } finally {
181
+ if (store) channels.end.publish(store)
151
182
  }
152
183
  }
153
184
 
@@ -1,24 +1,40 @@
1
1
  'use strict'
2
2
 
3
+ const bodylessMethods = new Set([
4
+ // Standard
5
+ 'GET',
6
+ 'HEAD',
7
+ 'TRACE',
8
+
9
+ // WebDAV
10
+ 'UNLOCK'
11
+ ])
12
+
13
+ const bodyMethods = new Set([
14
+ // Standard
15
+ 'DELETE',
16
+ 'OPTIONS',
17
+ 'PATCH',
18
+ 'PUT',
19
+ 'POST',
20
+
21
+ // WebDAV
22
+ 'COPY',
23
+ 'LOCK',
24
+ 'MOVE',
25
+ 'MKCOL',
26
+ 'PROPFIND',
27
+ 'PROPPATCH',
28
+ 'REPORT',
29
+ 'SEARCH',
30
+ 'MKCALENDAR'
31
+ ])
32
+
3
33
  module.exports = {
34
+ bodylessMethods,
35
+ bodyMethods,
4
36
  supportedMethods: [
5
- 'DELETE',
6
- 'GET',
7
- 'HEAD',
8
- 'PATCH',
9
- 'POST',
10
- 'PUT',
11
- 'OPTIONS',
12
- 'PROPFIND',
13
- 'PROPPATCH',
14
- 'MKCOL',
15
- 'COPY',
16
- 'MOVE',
17
- 'LOCK',
18
- 'UNLOCK',
19
- 'TRACE',
20
- 'SEARCH',
21
- 'REPORT',
22
- 'MKCALENDAR'
37
+ ...bodylessMethods,
38
+ ...bodyMethods
23
39
  ]
24
40
  }
package/lib/logger.js CHANGED
@@ -11,7 +11,10 @@ const pino = require('pino')
11
11
  const { serializersSym } = pino.symbols
12
12
  const {
13
13
  FST_ERR_LOG_INVALID_DESTINATION,
14
- FST_ERR_LOG_INVALID_LOGGER
14
+ FST_ERR_LOG_INVALID_LOGGER,
15
+ FST_ERR_LOG_INVALID_LOGGER_INSTANCE,
16
+ FST_ERR_LOG_INVALID_LOGGER_CONFIG,
17
+ FST_ERR_LOG_LOGGER_AND_LOGGER_INSTANCE_PROVIDED
15
18
  } = require('./errors')
16
19
 
17
20
  function createPinoLogger (opts) {
@@ -51,7 +54,7 @@ const serializers = {
51
54
  method: req.method,
52
55
  url: req.url,
53
56
  version: req.headers && req.headers['accept-version'],
54
- hostname: req.hostname,
57
+ host: req.host,
55
58
  remoteAddress: req.ip,
56
59
  remotePort: req.socket ? req.socket.remotePort : undefined
57
60
  }
@@ -70,20 +73,35 @@ function now () {
70
73
  }
71
74
 
72
75
  function createLogger (options) {
73
- if (!options.logger) {
76
+ // if no logger is provided, then create a default logger
77
+ if (!options.loggerInstance && !options.logger) {
74
78
  const logger = nullLogger
75
79
  logger.child = () => logger
76
80
  return { logger, hasLogger: false }
77
81
  }
78
82
 
79
- if (validateLogger(options.logger)) {
83
+ if (options.logger && options.loggerInstance) {
84
+ throw new FST_ERR_LOG_LOGGER_AND_LOGGER_INSTANCE_PROVIDED()
85
+ }
86
+
87
+ // check if the logger instance has all required properties
88
+ if (validateLogger(options.loggerInstance)) {
80
89
  const logger = createPinoLogger({
81
- logger: options.logger,
82
- serializers: Object.assign({}, serializers, options.logger.serializers)
90
+ logger: options.loggerInstance,
91
+ serializers: Object.assign({}, serializers, options.loggerInstance.serializers)
83
92
  })
84
93
  return { logger, hasLogger: true }
85
94
  }
86
95
 
96
+ // if a logger instance is passed to logger, throw an exception
97
+ if (validateLogger(options.logger)) {
98
+ throw FST_ERR_LOG_INVALID_LOGGER_CONFIG()
99
+ }
100
+
101
+ if (options.loggerInstance) {
102
+ throw FST_ERR_LOG_INVALID_LOGGER_INSTANCE()
103
+ }
104
+
87
105
  const localLoggerOptions = {}
88
106
  if (Object.prototype.toString.call(options.logger) === '[object Object]') {
89
107
  Reflect.ownKeys(options.logger).forEach(prop => {
@@ -9,9 +9,9 @@ const {
9
9
  const { exist, existReply, existRequest } = require('./decorate')
10
10
  const {
11
11
  FST_ERR_PLUGIN_VERSION_MISMATCH,
12
- FST_ERR_PLUGIN_NOT_PRESENT_IN_INSTANCE
12
+ FST_ERR_PLUGIN_NOT_PRESENT_IN_INSTANCE,
13
+ FST_ERR_PLUGIN_INVALID_ASYNC_HANDLER
13
14
  } = require('./errors')
14
- const { FSTWRN002 } = require('./warnings.js')
15
15
 
16
16
  function getMeta (fn) {
17
17
  return fn[Symbol.for('plugin-meta')]
@@ -106,11 +106,11 @@ function _checkDecorators (that, instance, decorators, name) {
106
106
 
107
107
  function checkVersion (fn) {
108
108
  const meta = getMeta(fn)
109
- if (!meta) return
109
+ if (meta == null || meta?.fastify == null) return
110
110
 
111
111
  const requiredVersion = meta.fastify
112
112
 
113
- const fastifyRc = /-rc.+$/.test(this.version)
113
+ const fastifyRc = /-(rc|pre|alpha).+$/.test(this.version)
114
114
  if (fastifyRc === true && semver.gt(this.version, semver.coerce(requiredVersion)) === true) {
115
115
  // A Fastify release candidate phase is taking place. In order to reduce
116
116
  // the effort needed to test plugins with the RC, we allow plugins targeting
@@ -138,7 +138,7 @@ function registerPluginName (fn) {
138
138
 
139
139
  function checkPluginHealthiness (fn, pluginName) {
140
140
  if (fn.constructor.name === 'AsyncFunction' && fn.length === 3) {
141
- FSTWRN002(pluginName || 'anonymous')
141
+ throw new FST_ERR_PLUGIN_INVALID_ASYNC_HANDLER(pluginName)
142
142
  }
143
143
  }
144
144
 
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) {