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
@@ -0,0 +1,12 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="WEB_MODULE" version="4">
3
+ <component name="NewModuleRootManager">
4
+ <content url="file://$MODULE_DIR$">
5
+ <excludeFolder url="file://$MODULE_DIR$/.tmp" />
6
+ <excludeFolder url="file://$MODULE_DIR$/temp" />
7
+ <excludeFolder url="file://$MODULE_DIR$/tmp" />
8
+ </content>
9
+ <orderEntry type="inheritedJdk" />
10
+ <orderEntry type="sourceFolder" forTests="false" />
11
+ </component>
12
+ </module>
@@ -0,0 +1,6 @@
1
+ <component name="InspectionProjectProfileManager">
2
+ <profile version="1.0">
3
+ <option name="myName" value="Project Default" />
4
+ <inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
5
+ </profile>
6
+ </component>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="JavaScriptLibraryMappings">
4
+ <includedPredefinedLibrary name="Node.js Core" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="EslintConfiguration">
4
+ <option name="fix-on-save" value="true" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/fastify.iml" filepath="$PROJECT_DIR$/.idea/fastify.iml" />
6
+ </modules>
7
+ </component>
8
+ </project>
package/.idea/vcs.xml ADDED
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings">
4
+ <mapping directory="" vcs="Git" />
5
+ </component>
6
+ </project>
@@ -7,7 +7,7 @@ config:
7
7
  MD013:
8
8
  line_length: 80
9
9
  code_block_line_length: 120
10
- headers: false
10
+ headings: false
11
11
  tables: false
12
12
  strict: false
13
13
  stern: false
package/.taprc CHANGED
@@ -1,11 +1,7 @@
1
- ts: false
2
- jsx: false
3
- flow: false
4
- # the coverage is performed by c8
5
- check-coverage: false
6
- coverage: false
7
- node-arg: --allow-natives-syntax
1
+ # vim: set filetype=yaml :
2
+ node-arg:
3
+ - '--allow-natives-syntax'
8
4
 
9
- files:
5
+ include:
10
6
  - 'test/**/*.test.js'
11
7
  - 'test/**/*.test.mjs'
package/README.md CHANGED
@@ -14,7 +14,7 @@
14
14
  CI](https://github.com/fastify/fastify/workflows/package-manager-ci/badge.svg?branch=main)](https://github.com/fastify/fastify/actions/workflows/package-manager-ci.yml)
15
15
  [![Web
16
16
  SIte](https://github.com/fastify/fastify/workflows/website/badge.svg?branch=main)](https://github.com/fastify/fastify/actions/workflows/website.yml)
17
- [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://standardjs.com/)
17
+ [![neostandard javascript style](https://img.shields.io/badge/code_style-neostandard-brightgreen?style=flat)](https://github.com/neostandard/neostandard)
18
18
  [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/7585/badge)](https://bestpractices.coreinfrastructure.org/projects/7585)
19
19
 
20
20
  </div>
@@ -46,17 +46,14 @@ developer experience with the least overhead and a powerful plugin architecture.
46
46
  It is inspired by Hapi and Express and as far as we know, it is one of the
47
47
  fastest web frameworks in town.
48
48
 
49
- The `main` branch refers to the Fastify `v4` release. Check out the
50
- [`v3.x` branch](https://github.com/fastify/fastify/tree/3.x) for `v3`.
51
-
52
-
49
+ The `main` branch refers to the Fastify `v5` release, which is not released/LTS yet.
50
+ Check out the [`4.x` branch](https://github.com/fastify/fastify/tree/4.x) for `v4`.
53
51
 
54
52
  ### Table of Contents
55
53
 
56
54
  - [Quick start](#quick-start)
57
55
  - [Install](#install)
58
56
  - [Example](#example)
59
- - [Fastify v1.x and v2.x](#fastify-v1x-and-v2x)
60
57
  - [Core features](#core-features)
61
58
  - [Benchmarks](#benchmarks)
62
59
  - [Documentation](#documentation)
@@ -18,10 +18,12 @@ const code = FJS({
18
18
  const file = path.join(__dirname, '..', 'lib', 'error-serializer.js')
19
19
 
20
20
  const moduleCode = `// This file is autogenerated by build/build-error-serializer.js, do not edit
21
- /* istanbul ignore file */
21
+ /* c8 ignore start */
22
22
  ${code}
23
+ /* c8 ignore stop */
23
24
  `
24
25
 
26
+ /* c8 ignore start */
25
27
  if (require.main === module) {
26
28
  fs.writeFileSync(file, moduleCode)
27
29
  console.log(`Saved ${file} file successfully`)
@@ -30,3 +32,4 @@ if (require.main === module) {
30
32
  code: moduleCode
31
33
  }
32
34
  }
35
+ /* c8 ignore stop */
@@ -9,10 +9,11 @@ const factory = AjvStandaloneCompiler({
9
9
  readMode: false,
10
10
  storeFunction (routeOpts, schemaValidationCode) {
11
11
  const moduleCode = `// This file is autogenerated by ${__filename.replace(__dirname, 'build')}, do not edit
12
- /* istanbul ignore file */
12
+ /* c8 ignore start */
13
13
  ${schemaValidationCode}
14
14
 
15
15
  module.exports.defaultInitOptions = ${JSON.stringify(defaultInitOptions)}
16
+ /* c8 ignore stop */
16
17
  `
17
18
 
18
19
  const file = path.join(__dirname, '..', 'lib', 'configValidator.js')
@@ -38,11 +39,11 @@ const defaultInitOptions = {
38
39
  onProtoPoisoning: 'error',
39
40
  onConstructorPoisoning: 'error',
40
41
  pluginTimeout: 10000,
41
- requestIdHeader: 'request-id',
42
+ requestIdHeader: false,
42
43
  requestIdLogLabel: 'reqId',
43
44
  http2SessionTimeout: 72000, // 72 seconds
44
45
  exposeHeadRoutes: true,
45
- useSemicolonDelimiter: true
46
+ useSemicolonDelimiter: false
46
47
  }
47
48
 
48
49
  const schema = {
@@ -98,7 +99,7 @@ const schema = {
98
99
  onProtoPoisoning: { type: 'string', default: defaultInitOptions.onProtoPoisoning },
99
100
  onConstructorPoisoning: { type: 'string', default: defaultInitOptions.onConstructorPoisoning },
100
101
  pluginTimeout: { type: 'integer', default: defaultInitOptions.pluginTimeout },
101
- requestIdHeader: { anyOf: [{ enum: [false] }, { type: 'string' }], default: defaultInitOptions.requestIdHeader },
102
+ requestIdHeader: { anyOf: [{ type: 'boolean' }, { type: 'string' }], default: defaultInitOptions.requestIdHeader },
102
103
  requestIdLogLabel: { type: 'string', default: defaultInitOptions.requestIdLogLabel },
103
104
  http2SessionTimeout: { type: 'integer', default: defaultInitOptions.http2SessionTimeout },
104
105
  exposeHeadRoutes: { type: 'boolean', default: defaultInitOptions.exposeHeadRoutes },
@@ -245,7 +245,7 @@ for Postgres, MySQL, SQL Server and SQLite. For MongoDB migrations, please check
245
245
  #### [Postgrator](https://www.npmjs.com/package/postgrator)
246
246
 
247
247
  Postgrator is Node.js SQL migration tool that uses a directory of SQL scripts to
248
- alter the database schema. Each file an migrations folder need to follow the
248
+ alter the database schema. Each file in a migrations folder need to follow the
249
249
  pattern: ` [version].[action].[optional-description].sql`.
250
250
 
251
251
  **version:** must be an incrementing number (e.g. `001` or a timestamp).
@@ -103,7 +103,7 @@ server.get('/v1*', async function (request, reply) {
103
103
  }
104
104
  })
105
105
 
106
- server.decorate('magicKey', null)
106
+ server.decorate('magicKey')
107
107
 
108
108
  server.listen({ port: '1234' }, () => {
109
109
  provider.thirdPartyMagicKeyGenerator(USUAL_WAIT_TIME_MS)
@@ -303,7 +303,7 @@ async function setup(fastify) {
303
303
  fastify.server.on('listening', doMagic)
304
304
 
305
305
  // Set up the placeholder for the magicKey
306
- fastify.decorate('magicKey', null)
306
+ fastify.decorate('magicKey')
307
307
 
308
308
  // Our magic -- important to make sure errors are handled. Beware of async
309
309
  // functions outside `try/catch` blocks
@@ -406,7 +406,7 @@ https://nodejs.org/api/net.html#event-listening). We use that to reach out to
406
406
  our provider as soon as possible, with the `doMagic` function.
407
407
 
408
408
  ```js
409
- fastify.decorate('magicKey', null)
409
+ fastify.decorate('magicKey')
410
410
  ```
411
411
 
412
412
  The `magicKey` decoration is also part of the plugin now. We initialize it with
@@ -447,6 +447,8 @@ section.
447
447
  middlewares into Fastify plugins
448
448
  - [`fastify-kubernetes`](https://github.com/greguz/fastify-kubernetes) Fastify
449
449
  Kubernetes client plugin.
450
+ - [`fastify-kysely`](https://github.com/alenap93/fastify-kysely) Fastify
451
+ plugin for supporting Kysely type-safe query builder.
450
452
  - [`fastify-language-parser`](https://github.com/lependu/fastify-language-parser)
451
453
  Fastify plugin to parse request language.
452
454
  - [`fastify-lcache`](https://github.com/denbon05/fastify-lcache)
@@ -0,0 +1,20 @@
1
+ # V5 Migration Guide
2
+
3
+ This guide is intended to help with migration from Fastify v4 to v5.
4
+
5
+ Before migrating to v5, please ensure that you have fixed all deprecation
6
+ warnings from v4. All v4 deprecations have been removed and they will no longer
7
+ work after upgrading.
8
+
9
+ ## Breaking Changes
10
+
11
+ ### `useSemicolonDelimiter` false by default
12
+
13
+ Starting with v5, Fastify instances will no longer default to supporting the use
14
+ of semicolon delimiters in the query string as they did in v4.
15
+ This is due to it being non-standard
16
+ behavior and not adhering to [RFC 3986](https://www.rfc-editor.org/rfc/rfc3986#section-3.4).
17
+
18
+ If you still wish to use semicolons as delimiters, you can do so by
19
+ setting `useSemicolonDelimiter: true` in the server configuration.
20
+
@@ -19,7 +19,8 @@ For example, `FastifyTypeProviderDefault` will not be assignable to the followin
19
19
  ```ts
20
20
  export interface NotSubstitutableTypeProvider extends FastifyTypeProvider {
21
21
  // bad, nothing is assignable to `never` (except for itself)
22
- output: this['input'] extends /** custom check here**/ ? /** narrowed type here **/ : never;
22
+ validator: this['schema'] extends /** custom check here**/ ? /** narrowed type here **/ : never;
23
+ serializer: this['schema'] extends /** custom check here**/ ? /** narrowed type here **/ : never;
23
24
  }
24
25
  ```
25
26
 
@@ -27,6 +28,7 @@ Unless changed to:
27
28
  ```ts
28
29
  export interface SubstitutableTypeProvider extends FastifyTypeProvider {
29
30
  // good, anything can be assigned to `unknown`
30
- output: this['input'] extends /** custom check here**/ ? /** narrowed type here **/ : unknown;
31
+ validator: this['schema'] extends /** custom check here**/ ? /** narrowed type here **/ : unknown;
32
+ serializer: this['schema'] extends /** custom check here**/ ? /** narrowed type here **/ : unknown;
31
33
  }
32
34
  ```
@@ -29,6 +29,13 @@ is given in the content-type header. If it is not given, the
29
29
  [catch-all](#catch-all) parser is not executed as with `POST`, `PUT` and
30
30
  `PATCH`, but the payload is simply not parsed.
31
31
 
32
+ > ## ⚠ Security Notice
33
+ > When using with RegExp to detect `Content-Type`, you should beware of
34
+ > how to properly detect the `Content-Type`. For example, if you need
35
+ > `application/*`, you should use `/^application\/([\w-]+);?/` to match the
36
+ > [essence MIME type](https://mimesniff.spec.whatwg.org/#mime-type-miscellaneous)
37
+ > only.
38
+
32
39
  ### Usage
33
40
  ```js
34
41
  fastify.addContentTypeParser('application/jsoff', function (request, payload, done) {
@@ -52,7 +59,7 @@ fastify.addContentTypeParser('application/jsoff', async function (request, paylo
52
59
  })
53
60
 
54
61
  // Handle all content types that matches RegExp
55
- fastify.addContentTypeParser(/^image\/.*/, function (request, payload, done) {
62
+ fastify.addContentTypeParser(/^image\/([\w-]+);?/, function (request, payload, done) {
56
63
  imageParser(payload, function (err, body) {
57
64
  done(err, body)
58
65
  })
@@ -80,6 +87,28 @@ fastify.addContentTypeParser('application/vnd.custom', (request, body, done) =>
80
87
  fastify.addContentTypeParser('application/vnd.custom+xml', (request, body, done) => {} )
81
88
  ```
82
89
 
90
+ ### Using addContentTypeParser with fastify.register
91
+ When using `addContentTypeParser` in combination with `fastify.register`,
92
+ `await` should not be used when registering routes. Using `await` causes
93
+ the route registration to be asynchronous and can lead to routes being registered
94
+ before the addContentTypeParser has been set.
95
+
96
+ #### Correct Usage
97
+ ```js
98
+ const fastify = require('fastify')();
99
+
100
+
101
+ fastify.register((fastify, opts) => {
102
+ fastify.addContentTypeParser('application/json', function (request, payload, done) {
103
+ jsonParser(payload, function (err, body) {
104
+ done(err, body)
105
+ })
106
+ })
107
+
108
+ fastify.get('/hello', async (req, res) => {});
109
+ });
110
+ ```
111
+
83
112
  Besides the `addContentTypeParser` API there are further APIs that can be used.
84
113
  These are `hasContentTypeParser`, `removeContentTypeParser` and
85
114
  `removeAllContentTypeParsers`.
@@ -59,8 +59,8 @@ close as possible to the value intended to be set dynamically in the future.
59
59
  Initialize a decorator as a `''` if the intended value is a string, and as
60
60
  `null` if it will be an object or a function.
61
61
 
62
- Remember this example works only with value types as reference types will be
63
- shared amongst all requests. See [decorateRequest](#decorate-request).
62
+ Remember this example works only with value types as reference types will
63
+ thrown and error during the fastify startup. See [decorateRequest](#decorate-request).
64
64
 
65
65
  See [JavaScript engine fundamentals: Shapes and Inline
66
66
  Caches](https://mathiasbynens.be/notes/shapes-ics) for more information on this
@@ -83,7 +83,7 @@ fastify.decorate('utility', function () {
83
83
  })
84
84
  ```
85
85
 
86
- As mentioned above, non-function values can be attached:
86
+ As mentioned above, non-function values can be attached to the server instance as:
87
87
 
88
88
  ```js
89
89
  fastify.decorate('conf', {
@@ -177,23 +177,24 @@ fastify.decorateReply('utility', function () {
177
177
  Note: using an arrow function will break the binding of `this` to the Fastify
178
178
  `Reply` instance.
179
179
 
180
- Note: using `decorateReply` will emit a warning if used with a reference type:
180
+ Note: using `decorateReply` will throw and error if used with a reference type:
181
181
 
182
182
  ```js
183
183
  // Don't do this
184
184
  fastify.decorateReply('foo', { bar: 'fizz'})
185
185
  ```
186
- In this example, the reference of the object is shared with all the requests:
187
- **any mutation will impact all requests, potentially creating security
188
- vulnerabilities or memory leaks**. To achieve proper encapsulation across
189
- requests configure a new value for each incoming request in the [`'onRequest'`
190
- hook](./Hooks.md#onrequest). Example:
186
+ In this example, the reference of the object would be shared with all the requests
187
+ and **any mutation will impact all requests, potentially creating security
188
+ vulnerabilities or memory leaks**, so Fastify blocks it.
189
+
190
+ To achieve proper encapsulation across requests configure a new value for each
191
+ incoming request in the [`'onRequest'` hook](./Hooks.md#onrequest). Example:
191
192
 
192
193
  ```js
193
194
  const fp = require('fastify-plugin')
194
195
 
195
196
  async function myPlugin (app) {
196
- app.decorateRequest('foo', null)
197
+ app.decorateRequest('foo')
197
198
  app.addHook('onRequest', async (req, reply) => {
198
199
  req.foo = { bar: 42 }
199
200
  })
@@ -219,24 +220,26 @@ fastify.decorateRequest('utility', function () {
219
220
  Note: using an arrow function will break the binding of `this` to the Fastify
220
221
  `Request` instance.
221
222
 
222
- Note: using `decorateRequest` will emit a warning if used with a reference type:
223
+ Note: using `decorateRequest` will emit an error if used with a reference type:
223
224
 
224
225
  ```js
225
226
  // Don't do this
226
227
  fastify.decorateRequest('foo', { bar: 'fizz'})
227
228
  ```
228
- In this example, the reference of the object is shared with all the requests:
229
- **any mutation will impact all requests, potentially creating security
230
- vulnerabilities or memory leaks**.
229
+ In this example, the reference of the object would be shared with all the requests
230
+ and **any mutation will impact all requests, potentially creating security
231
+ vulnerabilities or memory leaks**, so Fastify blocks it.
231
232
 
232
233
  To achieve proper encapsulation across requests configure a new value for each
233
- incoming request in the [`'onRequest'` hook](./Hooks.md#onrequest). Example:
234
+ incoming request in the [`'onRequest'` hook](./Hooks.md#onrequest).
235
+
236
+ Example:
234
237
 
235
238
  ```js
236
239
  const fp = require('fastify-plugin')
237
240
 
238
241
  async function myPlugin (app) {
239
- app.decorateRequest('foo', null)
242
+ app.decorateRequest('foo')
240
243
  app.addHook('onRequest', async (req, reply) => {
241
244
  req.foo = { bar: 42 }
242
245
  })
@@ -245,6 +248,29 @@ async function myPlugin (app) {
245
248
  module.exports = fp(myPlugin)
246
249
  ```
247
250
 
251
+ The hook solution is more flexible and allows for more complex initialization
252
+ because you can add more logic to the `onRequest` hook.
253
+
254
+ Another approach is to use the getter/setter pattern, but it requires 2 decorators:
255
+
256
+ ```js
257
+ fastify.decorateRequest('my_decorator_holder') // define the holder
258
+ fastify.decorateRequest('user', {
259
+ getter () {
260
+ this.my_decorator_holder ??= {} // initialize the holder
261
+ return this.my_decorator_holder
262
+ }
263
+ })
264
+
265
+ fastify.get('/', async function (req, reply) {
266
+ req.user.access = 'granted'
267
+ // other code
268
+ })
269
+ ```
270
+
271
+ This ensures that the `user` property is always unique for each
272
+ request.
273
+
248
274
  See [`decorate`](#decorate) for information about the `dependencies` parameter.
249
275
 
250
276
  #### `hasDecorator(name)`
@@ -36,6 +36,7 @@
36
36
  - [FST_ERR_DEC_DEPENDENCY_INVALID_TYPE](#fst_err_dec_dependency_invalid_type)
37
37
  - [FST_ERR_DEC_MISSING_DEPENDENCY](#fst_err_dec_missing_dependency)
38
38
  - [FST_ERR_DEC_AFTER_START](#fst_err_dec_after_start)
39
+ - [FST_ERR_DEC_REFERENCE_TYPE](#fst_err_dec_reference_type)
39
40
  - [FST_ERR_HOOK_INVALID_TYPE](#fst_err_hook_invalid_type)
40
41
  - [FST_ERR_HOOK_INVALID_HANDLER](#fst_err_hook_invalid_handler)
41
42
  - [FST_ERR_HOOK_INVALID_ASYNC_HANDLER](#fst_err_hook_invalid_async_handler)
@@ -44,6 +45,9 @@
44
45
  - [FST_ERR_HOOK_TIMEOUT](#fst_err_hook_timeout)
45
46
  - [FST_ERR_LOG_INVALID_DESTINATION](#fst_err_log_invalid_destination)
46
47
  - [FST_ERR_LOG_INVALID_LOGGER](#fst_err_log_invalid_logger)
48
+ - [FST_ERR_LOG_INVALID_LOGGER_INSTANCE](#fst_err_log_invalid_logger_instance)
49
+ - [FST_ERR_LOG_INVALID_LOGGER_CONFIG](#fst_err_log_invalid_logger_config)
50
+ - [FST_ERR_LOG_LOGGER_AND_LOGGER_INSTANCE_PROVIDED](#fst_err_log_logger_and_logger_instance_provided)
47
51
  - [FST_ERR_REP_INVALID_PAYLOAD_TYPE](#fst_err_rep_invalid_payload_type)
48
52
  - [FST_ERR_REP_RESPONSE_BODY_CONSUMED](#fst_err_rep_response_body_consumed)
49
53
  - [FST_ERR_REP_ALREADY_SENT](#fst_err_rep_already_sent)
@@ -70,7 +74,6 @@
70
74
  - [FST_ERR_DUPLICATED_ROUTE](#fst_err_duplicated_route)
71
75
  - [FST_ERR_BAD_URL](#fst_err_bad_url)
72
76
  - [FST_ERR_ASYNC_CONSTRAINT](#fst_err_async_constraint)
73
- - [FST_ERR_DEFAULT_ROUTE_INVALID_TYPE](#fst_err_default_route_invalid_type)
74
77
  - [FST_ERR_INVALID_URL](#fst_err_invalid_url)
75
78
  - [FST_ERR_ROUTE_OPTIONS_NOT_OBJ](#fst_err_route_options_not_obj)
76
79
  - [FST_ERR_ROUTE_DUPLICATED_HANDLER](#fst_err_route_duplicated_handler)
@@ -90,6 +93,7 @@
90
93
  - [FST_ERR_PARENT_PLUGIN_BOOTED](#fst_err_parent_plugin_booted)
91
94
  - [FST_ERR_PLUGIN_TIMEOUT](#fst_err_plugin_timeout)
92
95
  - [FST_ERR_PLUGIN_NOT_PRESENT_IN_INSTANCE](#fst_err_plugin_not_present_in_instance)
96
+ - [FST_ERR_PLUGIN_INVALID_ASYNC_HANDLER](#fst_err_plugin_invalid_async_handler)
93
97
  - [FST_ERR_VALIDATION](#fst_err_validation)
94
98
  - [FST_ERR_LISTEN_OPTIONS_INVALID](#fst_err_listen_options_invalid)
95
99
  - [FST_ERR_ERROR_HANDLER_NOT_FN](#fst_err_error_handler_not_fn)
@@ -305,6 +309,7 @@ Below is a table with all the error codes that Fastify uses.
305
309
  | <a id="fst_err_dec_dependency_invalid_type">FST_ERR_DEC_DEPENDENCY_INVALID_TYPE</a> | The dependencies of decorator must be of type `Array`. | Use an array for the dependencies. | [#3090](https://github.com/fastify/fastify/pull/3090) |
306
310
  | <a id="fst_err_dec_missing_dependency">FST_ERR_DEC_MISSING_DEPENDENCY</a> | The decorator cannot be registered due to a missing dependency. | Register the missing dependency. | [#1168](https://github.com/fastify/fastify/pull/1168) |
307
311
  | <a id="fst_err_dec_after_start">FST_ERR_DEC_AFTER_START</a> | The decorator cannot be added after start. | Add the decorator before starting the server. | [#2128](https://github.com/fastify/fastify/pull/2128) |
312
+ | <a id="fst_err_dec_reference_type">FST_ERR_DEC_REFERENCE_TYPE</a> | The decorator cannot be a reference type. | Define the decorator with a getter/setter interface or an empty decorator with a hook. | [#5462](https://github.com/fastify/fastify/pull/5462) |
308
313
  | <a id="fst_err_hook_invalid_type">FST_ERR_HOOK_INVALID_TYPE</a> | The hook name must be a string. | Use a string for the hook name. | [#1168](https://github.com/fastify/fastify/pull/1168) |
309
314
  | <a id="fst_err_hook_invalid_handler">FST_ERR_HOOK_INVALID_HANDLER</a> | The hook callback must be a function. | Use a function for the hook callback. | [#1168](https://github.com/fastify/fastify/pull/1168) |
310
315
  | <a id="fst_err_hook_invalid_async_handler">FST_ERR_HOOK_INVALID_ASYNC_HANDLER</a> | Async function has too many arguments. Async hooks should not use the `done` argument. | Remove the `done` argument from the async hook. | [#4367](https://github.com/fastify/fastify/pull/4367) |
@@ -313,6 +318,9 @@ Below is a table with all the error codes that Fastify uses.
313
318
  | <a id="fst_err_hook_timeout">FST_ERR_HOOK_TIMEOUT</a> | A callback for a hook timed out. | Increase the timeout for the hook. | [#3106](https://github.com/fastify/fastify/pull/3106) |
314
319
  | <a id="fst_err_log_invalid_destination">FST_ERR_LOG_INVALID_DESTINATION</a> | The logger does not accept the specified destination. | Use a `'stream'` or a `'file'` as the destination. | [#1168](https://github.com/fastify/fastify/pull/1168) |
315
320
  | <a id="fst_err_log_invalid_logger">FST_ERR_LOG_INVALID_LOGGER</a> | The logger should have all these methods: `'info'`, `'error'`, `'debug'`, `'fatal'`, `'warn'`, `'trace'`, `'child'`. | Use a logger with all the required methods. | [#4520](https://github.com/fastify/fastify/pull/4520) |
321
+ | <a id="fst_err_log_invalid_logger_instance">FST_ERR_LOG_INVALID_LOGGER_INSTANCE</a> | The `loggerInstance` only accepts a logger instance, not a configuration object. | To pass a configuration object, use `'logger'` instead. | [#5020](https://github.com/fastify/fastify/pull/5020) |
322
+ | <a id="fst_err_log_invalid_logger_config">FST_ERR_LOG_INVALID_LOGGER_CONFIG</a> | The logger option only accepts a configuration object, not a logger instance. | To pass an instance, use `'loggerInstance'` instead. | [#5020](https://github.com/fastify/fastify/pull/5020) |
323
+ | <a id="fst_err_log_logger_and_logger_instance_provided">FST_ERR_LOG_LOGGER_AND_LOGGER_INSTANCE_PROVIDED</a> | You cannot provide both `'logger'` and `'loggerInstance'`. | Please provide only one option. | [#5020](https://github.com/fastify/fastify/pull/5020) |
316
324
  | <a id="fst_err_rep_invalid_payload_type">FST_ERR_REP_INVALID_PAYLOAD_TYPE</a> | Reply payload can be either a `string` or a `Buffer`. | Use a `string` or a `Buffer` for the payload. | [#1168](https://github.com/fastify/fastify/pull/1168) |
317
325
  | <a id="fst_err_rep_response_body_consumed">FST_ERR_REP_RESPONSE_BODY_CONSUMED</a> | Using `Response` as reply payload, but the body is being consumed. | Make sure you don't consume the `Response.body` | [#5286](https://github.com/fastify/fastify/pull/5286) |
318
326
  | <a id="fst_err_rep_already_sent">FST_ERR_REP_ALREADY_SENT</a> | A response was already sent. | - | [#1336](https://github.com/fastify/fastify/pull/1336) |
@@ -339,7 +347,6 @@ Below is a table with all the error codes that Fastify uses.
339
347
  | <a id="fst_err_duplicated_route">FST_ERR_DUPLICATED_ROUTE</a> | The HTTP method already has a registered controller for that URL. | Use a different URL or register the controller for another HTTP method. | [#2954](https://github.com/fastify/fastify/pull/2954) |
340
348
  | <a id="fst_err_bad_url">FST_ERR_BAD_URL</a> | The router received an invalid URL. | Use a valid URL. | [#2106](https://github.com/fastify/fastify/pull/2106) |
341
349
  | <a id="fst_err_async_constraint">FST_ERR_ASYNC_CONSTRAINT</a> | The router received an error when using asynchronous constraints. | - | [#4323](https://github.com/fastify/fastify/pull/4323) |
342
- | <a id="fst_err_default_route_invalid_type">FST_ERR_DEFAULT_ROUTE_INVALID_TYPE</a> | The `defaultRoute` type should be a function. | Use a function for the `defaultRoute`. | [#2733](https://github.com/fastify/fastify/pull/2733) |
343
350
  | <a id="fst_err_invalid_url">FST_ERR_INVALID_URL</a> | URL must be a string. | Use a string for the URL. | [#3653](https://github.com/fastify/fastify/pull/3653) |
344
351
  | <a id="fst_err_route_options_not_obj">FST_ERR_ROUTE_OPTIONS_NOT_OBJ</a> | Options for the route must be an object. | Use an object for the route options. | [#4554](https://github.com/fastify/fastify/pull/4554) |
345
352
  | <a id="fst_err_route_duplicated_handler">FST_ERR_ROUTE_DUPLICATED_HANDLER</a> | Duplicate handler for the route is not allowed. | Use a different handler. | [#4554](https://github.com/fastify/fastify/pull/4554) |
@@ -359,6 +366,7 @@ Below is a table with all the error codes that Fastify uses.
359
366
  | <a id="fst_err_parent_plugin_booted">FST_ERR_PARENT_PLUGIN_BOOTED</a> | Impossible to load plugin because the parent (mapped directly from `avvio`) | - | [#3106](https://github.com/fastify/fastify/pull/3106) |
360
367
  | <a id="fst_err_plugin_timeout">FST_ERR_PLUGIN_TIMEOUT</a> | Plugin did not start in time. | Increase the timeout for the plugin. | [#3106](https://github.com/fastify/fastify/pull/3106) |
361
368
  | <a id="fst_err_plugin_not_present_in_instance">FST_ERR_PLUGIN_NOT_PRESENT_IN_INSTANCE</a> | The decorator is not present in the instance. | - | [#4554](https://github.com/fastify/fastify/pull/4554) |
369
+ | <a id="fst_err_plugin_invalid_async_handler">FST_ERR_PLUGIN_INVALID_ASYNC_HANDLER</a> | The plugin being registered mixes async and callback styles. | - | [#5141](https://github.com/fastify/fastify/pull/5141) |
362
370
  | <a id="fst_err_validation">FST_ERR_VALIDATION</a> | The Request failed the payload validation. | Check the request payload. | [#4824](https://github.com/fastify/fastify/pull/4824) |
363
371
  | <a id="fst_err_listen_options_invalid">FST_ERR_LISTEN_OPTIONS_INVALID</a> | Invalid listen options. | Check the listen options. | [#4886](https://github.com/fastify/fastify/pull/4886) |
364
372
  | <a id="fst_err_error_handler_not_fn">FST_ERR_ERROR_HANDLER_NOT_FN</a> | Error Handler must be a function | Provide a function to `setErrorHandler`. | [#5317](https://github.com/fastify/fastify/pull/5317) |
@@ -829,18 +829,17 @@ consider creating a custom [Plugin](./Plugins.md) instead.
829
829
  ## Diagnostics Channel Hooks
830
830
 
831
831
  > **Note:** The `diagnostics_channel` is currently experimental on Node.js, so
832
- > its API is subject to change even in semver-patch releases of Node.js. For
833
- > versions of Node.js supported by Fastify where `diagnostics_channel` is
834
- > unavailable, the hook will use the
835
- > [polyfill](https://www.npmjs.com/package/diagnostics_channel) if it is
836
- > available. Otherwise, this feature will not be present.
837
-
838
- Currently, one
839
- [`diagnostics_channel`](https://nodejs.org/api/diagnostics_channel.html) publish
840
- event, `'fastify.initialization'`, happens at initialization time. The Fastify
841
- instance is passed into the hook as a property of the object passed in. At this
842
- point, the instance can be interacted with to add hooks, plugins, routes, or any
843
- other sort of modification.
832
+ > its API is subject to change even in semver-patch releases of Node.js. As some
833
+ > versions of Node.js are supported by Fastify where `diagnostics_channel` is
834
+ > unavailable, or with an incomplete feature set, the hook uses the
835
+ > [dc-polyfill](https://www.npmjs.com/package/dc-polyfill) package to provide a
836
+ > polyfill.
837
+
838
+ One [`diagnostics_channel`](https://nodejs.org/api/diagnostics_channel.html)
839
+ publish event, `'fastify.initialization'`, happens at initialization time. The
840
+ Fastify instance is passed into the hook as a property of the object passed in.
841
+ At this point, the instance can be interacted with to add hooks, plugins,
842
+ routes, or any other sort of modification.
844
843
 
845
844
  For example, a tracing package might do something like the following (which is,
846
845
  of course, a simplification). This would be in a file loaded in the
@@ -849,13 +848,13 @@ tools first" fashion.
849
848
 
850
849
  ```js
851
850
  const tracer = /* retrieved from elsewhere in the package */
852
- const dc = require('node:diagnostics_channel')
851
+ const dc = require('node:diagnostics_channel') // or require('dc-polyfill')
853
852
  const channel = dc.channel('fastify.initialization')
854
853
  const spans = new WeakMap()
855
854
 
856
855
  channel.subscribe(function ({ fastify }) {
857
856
  fastify.addHook('onRequest', (request, reply, done) => {
858
- const span = tracer.startSpan('fastify.request')
857
+ const span = tracer.startSpan('fastify.request.handler')
859
858
  spans.set(request, span)
860
859
  done()
861
860
  })
@@ -867,3 +866,38 @@ channel.subscribe(function ({ fastify }) {
867
866
  })
868
867
  })
869
868
  ```
869
+
870
+ Five other events are published on a per-request basis following the
871
+ [Tracing Channel](https://nodejs.org/api/diagnostics_channel.html#class-tracingchannel)
872
+ nomenclature. The list of the channel names and the event they receive is:
873
+
874
+ - `tracing:fastify.request.handler:start`: Always fires
875
+ - `{ request: Request, reply: Reply, route: { url, method } }`
876
+ - `tracing:fastify.request.handler:end`: Always fires
877
+ - `{ request: Request, reply: Reply, route: { url, method }, async: Bool }`
878
+ - `tracing:fastify.request.handler:asyncStart`: Fires for promise/async handlers
879
+ - `{ request: Request, reply: Reply, route: { url, method } }`
880
+ - `tracing:fastify.request.handler:asyncEnd`: Fires for promise/async handlers
881
+ - `{ request: Request, reply: Reply, route: { url, method } }`
882
+ - `tracing:fastify.request.handler:error`: Fires when an error occurs
883
+ - `{ request: Request, reply: Reply, route: { url, method }, error: Error }`
884
+
885
+ The object instance remains the same for all events associated with a given
886
+ request. All payloads include a `request` and `reply` property which are an
887
+ instance of Fastify's `Request` and `Reply` instances. They also include a
888
+ `route` property which is an object with the matched `url` pattern (e.g.
889
+ `/collection/:id`) and the `method` HTTP method (e.g. `GET`). The `:start` and
890
+ `:end` events always fire for requests. If a request handler is an `async`
891
+ function or one that returns a `Promise` then the `:asyncStart` and `:asyncEnd`
892
+ events also fire. Finally, the `:error` event contains an `error` property
893
+ associated with the request's failure.
894
+
895
+ These events can be received like so:
896
+
897
+ ```js
898
+ const dc = require('node:diagnostics_channel') // or require('dc-polyfill')
899
+ const channel = dc.channel('tracing:fastify.request.handler:start')
900
+ channel.subscribe((msg) => {
901
+ console.log(msg.request, msg.reply)
902
+ })
903
+ ```
@@ -98,10 +98,10 @@ const fastify = require('fastify')({
98
98
  <a id="logging-request-id"></a>
99
99
 
100
100
  By default, Fastify adds an ID to every request for easier tracking. If the
101
- "request-id" header is present its value is used, otherwise a new incremental ID
102
- is generated. See Fastify Factory
103
- [`requestIdHeader`](./Server.md#factory-request-id-header) and Fastify Factory
104
- [`genReqId`](./Server.md#genreqid) for customization options.
101
+ requestIdHeader-option is set and the corresponding header is present than
102
+ its value is used, otherwise a new incremental ID is generated. See Fastify
103
+ Factory [`requestIdHeader`](./Server.md#factory-request-id-header) and Fastify
104
+ Factory [`genReqId`](./Server.md#genreqid) for customization options.
105
105
 
106
106
  The default logger is configured with a set of standard serializers that
107
107
  serialize objects with `req`, `res`, and `err` properties. The object received
@@ -243,7 +243,7 @@ const fastify = Fastify({
243
243
  method: request.method,
244
244
  url: request.url,
245
245
  headers: request.headers,
246
- hostname: request.hostname,
246
+ host: request.host,
247
247
  remoteAddress: request.ip,
248
248
  remotePort: request.socket.remotePort
249
249
  }