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
@@ -3,25 +3,66 @@
3
3
  const { test } = require('tap')
4
4
  const Fastify = require('..')
5
5
 
6
- test('encapsulates an error handler', async t => {
6
+ // Because of how error handlers wrap things, following the control flow can be tricky
7
+ // In this test file numbered comments indicate the order statements are expected to execute
8
+
9
+ test('encapsulates an asynchronous error handler', async t => {
7
10
  t.plan(3)
8
11
 
9
12
  const fastify = Fastify()
10
13
  fastify.register(async function (fastify) {
11
14
  fastify.setErrorHandler(async function a (err) {
12
- t.equal(err.message, 'kaboom')
13
- throw new Error('caught')
15
+ // 3. the inner error handler catches the error, and throws a new error
16
+ t.equal(err.message, 'from_endpoint')
17
+ throw new Error('from_inner')
18
+ })
19
+ fastify.get('/encapsulated', async () => {
20
+ // 2. the endpoint throws an error
21
+ throw new Error('from_endpoint')
14
22
  })
15
- fastify.get('/encapsulated', async () => { throw new Error('kaboom') })
16
23
  })
17
24
 
18
25
  fastify.setErrorHandler(async function b (err) {
19
- t.equal(err.message, 'caught')
20
- throw new Error('wrapped')
26
+ // 4. the outer error handler catches the error thrown by the inner error handler
27
+ t.equal(err.message, 'from_inner')
28
+ // 5. the outer error handler throws a new error
29
+ throw new Error('from_outer')
21
30
  })
22
31
 
32
+ // 1. the endpoint is called
23
33
  const res = await fastify.inject('/encapsulated')
24
- t.equal(res.json().message, 'wrapped')
34
+ // 6. the default error handler returns the error from the outer error handler
35
+ t.equal(res.json().message, 'from_outer')
36
+ })
37
+
38
+ // See discussion in https://github.com/fastify/fastify/pull/5222#discussion_r1432573655
39
+ test('encapsulates a synchronous error handler', async t => {
40
+ t.plan(3)
41
+
42
+ const fastify = Fastify()
43
+ fastify.register(async function (fastify) {
44
+ fastify.setErrorHandler(function a (err) {
45
+ // 3. the inner error handler catches the error, and throws a new error
46
+ t.equal(err.message, 'from_endpoint')
47
+ throw new Error('from_inner')
48
+ })
49
+ fastify.get('/encapsulated', async () => {
50
+ // 2. the endpoint throws an error
51
+ throw new Error('from_endpoint')
52
+ })
53
+ })
54
+
55
+ fastify.setErrorHandler(async function b (err) {
56
+ // 4. the outer error handler catches the error thrown by the inner error handler
57
+ t.equal(err.message, 'from_inner')
58
+ // 5. the outer error handler throws a new error
59
+ throw new Error('from_outer')
60
+ })
61
+
62
+ // 1. the endpoint is called
63
+ const res = await fastify.inject('/encapsulated')
64
+ // 6. the default error handler returns the error from the outer error handler
65
+ t.equal(res.json().message, 'from_outer')
25
66
  })
26
67
 
27
68
  test('onError hook nested', async t => {
@@ -30,21 +71,167 @@ test('onError hook nested', async t => {
30
71
  const fastify = Fastify()
31
72
  fastify.register(async function (fastify) {
32
73
  fastify.setErrorHandler(async function a (err) {
33
- t.equal(err.message, 'kaboom')
34
- throw new Error('caught')
74
+ // 4. the inner error handler catches the error, and throws a new error
75
+ t.equal(err.message, 'from_endpoint')
76
+ throw new Error('from_inner')
77
+ })
78
+ fastify.get('/encapsulated', async () => {
79
+ // 2. the endpoint throws an error
80
+ throw new Error('from_endpoint')
35
81
  })
36
- fastify.get('/encapsulated', async () => { throw new Error('kaboom') })
37
82
  })
38
83
 
39
84
  fastify.setErrorHandler(async function b (err) {
40
- t.equal(err.message, 'caught')
41
- throw new Error('wrapped')
85
+ // 5. the outer error handler catches the error thrown by the inner error handler
86
+ t.equal(err.message, 'from_inner')
87
+ // 6. the outer error handler throws a new error
88
+ throw new Error('from_outer')
42
89
  })
43
90
 
44
91
  fastify.addHook('onError', async function (request, reply, err) {
45
- t.equal(err.message, 'kaboom')
92
+ // 3. the hook receives the error
93
+ t.equal(err.message, 'from_endpoint')
94
+ })
95
+
96
+ // 1. the endpoint is called
97
+ const res = await fastify.inject('/encapsulated')
98
+ // 7. the default error handler returns the error from the outer error handler
99
+ t.equal(res.json().message, 'from_outer')
100
+ })
101
+
102
+ // See https://github.com/fastify/fastify/issues/5220
103
+ test('encapuslates an error handler, for errors thrown in hooks', async t => {
104
+ t.plan(3)
105
+
106
+ const fastify = Fastify()
107
+ fastify.register(async function (fastify) {
108
+ fastify.setErrorHandler(function a (err) {
109
+ // 3. the inner error handler catches the error, and throws a new error
110
+ t.equal(err.message, 'from_hook')
111
+ throw new Error('from_inner')
112
+ })
113
+ fastify.addHook('onRequest', async () => {
114
+ // 2. the hook throws an error
115
+ throw new Error('from_hook')
116
+ })
117
+ fastify.get('/encapsulated', async () => {})
118
+ })
119
+
120
+ fastify.setErrorHandler(function b (err) {
121
+ // 4. the outer error handler catches the error thrown by the inner error handler
122
+ t.equal(err.message, 'from_inner')
123
+ // 5. the outer error handler throws a new error
124
+ throw new Error('from_outer')
46
125
  })
47
126
 
127
+ // 1. the endpoint is called
128
+ const res = await fastify.inject('/encapsulated')
129
+ // 6. the default error handler returns the error from the outer error handler
130
+ t.equal(res.json().message, 'from_outer')
131
+ })
132
+
133
+ // See https://github.com/fastify/fastify/issues/5220
134
+ test('encapuslates many synchronous error handlers that rethrow errors', async t => {
135
+ const DEPTH = 100
136
+ t.plan(DEPTH + 2)
137
+
138
+ /**
139
+ * This creates a very nested set of error handlers, that looks like:
140
+ * plugin
141
+ * - error handler
142
+ * - plugin
143
+ * - error handler
144
+ * - plugin
145
+ * ... {to DEPTH levels}
146
+ * - plugin
147
+ * - error handler
148
+ * - GET /encapsulated
149
+ */
150
+ const createNestedRoutes = (fastify, depth) => {
151
+ if (depth < 0) {
152
+ throw new Error('Expected depth >= 0')
153
+ } else if (depth === 0) {
154
+ fastify.setErrorHandler(function a (err) {
155
+ // 3. innermost error handler catches the error, and throws a new error
156
+ t.equal(err.message, 'from_route')
157
+ throw new Error(`from_handler_${depth}`)
158
+ })
159
+ fastify.get('/encapsulated', async () => {
160
+ // 2. the endpoint throws an error
161
+ throw new Error('from_route')
162
+ })
163
+ } else {
164
+ fastify.setErrorHandler(function d (err) {
165
+ // 4 to {DEPTH+4}. error handlers each catch errors, and then throws a new error
166
+ t.equal(err.message, `from_handler_${depth - 1}`)
167
+ throw new Error(`from_handler_${depth}`)
168
+ })
169
+
170
+ fastify.register(async function (fastify) {
171
+ createNestedRoutes(fastify, depth - 1)
172
+ })
173
+ }
174
+ }
175
+
176
+ const fastify = Fastify()
177
+ createNestedRoutes(fastify, DEPTH)
178
+
179
+ // 1. the endpoint is called
180
+ const res = await fastify.inject('/encapsulated')
181
+ // {DEPTH+5}. the default error handler returns the error from the outermost error handler
182
+ t.equal(res.json().message, `from_handler_${DEPTH}`)
183
+ })
184
+
185
+ // See https://github.com/fastify/fastify/issues/5220
186
+ // This was not failing previously, but we want to make sure the behavior continues to work in the same way across async and sync handlers
187
+ // Plus, the current setup is somewhat fragile to tweaks to wrapThenable as that's what retries (by calling res.send(err) again)
188
+ test('encapuslates many asynchronous error handlers that rethrow errors', async t => {
189
+ const DEPTH = 100
190
+ t.plan(DEPTH + 2)
191
+
192
+ /**
193
+ * This creates a very nested set of error handlers, that looks like:
194
+ * plugin
195
+ * - error handler
196
+ * - plugin
197
+ * - error handler
198
+ * - plugin
199
+ * ... {to DEPTH levels}
200
+ * - plugin
201
+ * - error handler
202
+ * - GET /encapsulated
203
+ */
204
+ const createNestedRoutes = (fastify, depth) => {
205
+ if (depth < 0) {
206
+ throw new Error('Expected depth >= 0')
207
+ } else if (depth === 0) {
208
+ fastify.setErrorHandler(async function a (err) {
209
+ // 3. innermost error handler catches the error, and throws a new error
210
+ t.equal(err.message, 'from_route')
211
+ throw new Error(`from_handler_${depth}`)
212
+ })
213
+ fastify.get('/encapsulated', async () => {
214
+ // 2. the endpoint throws an error
215
+ throw new Error('from_route')
216
+ })
217
+ } else {
218
+ fastify.setErrorHandler(async function m (err) {
219
+ // 4 to {DEPTH+4}. error handlers each catch errors, and then throws a new error
220
+ t.equal(err.message, `from_handler_${depth - 1}`)
221
+ throw new Error(`from_handler_${depth}`)
222
+ })
223
+
224
+ fastify.register(async function (fastify) {
225
+ createNestedRoutes(fastify, depth - 1)
226
+ })
227
+ }
228
+ }
229
+
230
+ const fastify = Fastify()
231
+ createNestedRoutes(fastify, DEPTH)
232
+
233
+ // 1. the endpoint is called
48
234
  const res = await fastify.inject('/encapsulated')
49
- t.equal(res.json().message, 'wrapped')
235
+ // {DEPTH+5}. the default error handler returns the error from the outermost error handler
236
+ t.equal(res.json().message, `from_handler_${DEPTH}`)
50
237
  })
@@ -1,18 +1,8 @@
1
1
  'use strict'
2
2
 
3
- const t = require('tap')
4
- const semver = require('semver')
5
-
6
- if (semver.lt(process.versions.node, '14.13.0')) {
7
- t.skip('Skip named exports because Node version < 14.13.0')
8
- } else {
9
- // Node v8 throw a `SyntaxError: Unexpected token import`
10
- // even if this branch is never touch in the code,
11
- // by using `eval` we can avoid this issue.
12
- // eslint-disable-next-line
13
- new Function('module', 'return import(module)')('./named-exports.mjs').catch((err) => {
3
+ import('./named-exports.mjs')
4
+ .catch(err => {
14
5
  process.nextTick(() => {
15
6
  throw err
16
7
  })
17
8
  })
18
- }
@@ -49,6 +49,22 @@ test('findRoute should return an immutable route to avoid leaking and runtime ro
49
49
  t.same(route.params, { artistId: ':artistId' })
50
50
  })
51
51
 
52
+ test('findRoute should return null when when url is not passed', t => {
53
+ t.plan(1)
54
+ const fastify = Fastify()
55
+
56
+ fastify.get('/artists/:artistId', {
57
+ schema: {
58
+ params: { artistId: { type: 'integer' } }
59
+ },
60
+ handler: (req, reply) => reply.send(typeof req.params.artistId)
61
+ })
62
+
63
+ t.equal(fastify.findRoute({
64
+ method: 'POST'
65
+ }), null)
66
+ })
67
+
52
68
  test('findRoute should return null when route cannot be found due to a different path', t => {
53
69
  t.plan(1)
54
70
  const fastify = Fastify()
@@ -74,6 +74,15 @@ test('Custom genReqId function gets raw request as argument', t => {
74
74
  })
75
75
  })
76
76
 
77
+ test('Should handle properly requestIdHeader option', t => {
78
+ t.plan(4)
79
+
80
+ t.equal(Fastify({ requestIdHeader: '' }).initialConfig.requestIdHeader, false)
81
+ t.equal(Fastify({ requestIdHeader: false }).initialConfig.requestIdHeader, false)
82
+ t.equal(Fastify({ requestIdHeader: true }).initialConfig.requestIdHeader, 'request-id')
83
+ t.equal(Fastify({ requestIdHeader: 'x-request-id' }).initialConfig.requestIdHeader, 'x-request-id')
84
+ })
85
+
77
86
  test('Should accept option to set genReqId with setGenReqId option', t => {
78
87
  t.plan(9)
79
88
 
package/test/get.test.js CHANGED
@@ -203,6 +203,18 @@ test('send a falsy boolean', t => {
203
203
  }
204
204
  })
205
205
 
206
+ test('shorthand - get, set port', t => {
207
+ t.plan(1)
208
+ try {
209
+ fastify.get('/port', headersSchema, function (req, reply) {
210
+ reply.code(200).send({ port: req.port })
211
+ })
212
+ t.pass()
213
+ } catch (e) {
214
+ t.fail()
215
+ }
216
+ })
217
+
206
218
  fastify.listen({ port: 0 }, err => {
207
219
  t.error(err)
208
220
  t.teardown(() => { fastify.close() })
@@ -380,4 +392,20 @@ fastify.listen({ port: 0 }, err => {
380
392
  t.same(body.toString(), 'null')
381
393
  })
382
394
  })
395
+
396
+ test('shorthand - request get headers - test fall back port', t => {
397
+ t.plan(3)
398
+ sget({
399
+ method: 'GET',
400
+ headers: {
401
+ host: 'example.com'
402
+ },
403
+ json: true,
404
+ url: 'http://localhost:' + fastify.server.address().port + '/port'
405
+ }, (err, response, body) => {
406
+ t.error(err)
407
+ t.equal(response.statusCode, 200)
408
+ t.equal(body.port, null)
409
+ })
410
+ })
383
411
  })
@@ -71,7 +71,7 @@ test('hasRoute', t => {
71
71
 
72
72
  t.equal(fastify.hasRoute({
73
73
  method: 'GET',
74
- url: '/example/12345.png'
74
+ url: '/example/:file(^\\d+).png'
75
75
  }), true)
76
76
  })
77
77
 
package/test/helper.js CHANGED
@@ -216,11 +216,7 @@ module.exports.payloadMethod = function (method, t, isSetErrorHandler = false) {
216
216
 
217
217
  }, (err, response, body) => {
218
218
  t.error(err)
219
- if (upMethod === 'OPTIONS') {
220
- t.equal(response.statusCode, 200)
221
- } else {
222
- t.equal(response.statusCode, 415)
223
- }
219
+ t.equal(response.statusCode, 415)
224
220
  })
225
221
  })
226
222
 
@@ -3216,8 +3216,6 @@ test('reply.send should throw if undefined error is thrown', t => {
3216
3216
  })
3217
3217
 
3218
3218
  test('reply.send should throw if undefined error is thrown at preParsing hook', t => {
3219
- /* eslint prefer-promise-reject-errors: ["error", {"allowEmptyReject": true}] */
3220
-
3221
3219
  t.plan(3)
3222
3220
  const fastify = Fastify()
3223
3221
 
@@ -3245,8 +3243,6 @@ test('reply.send should throw if undefined error is thrown at preParsing hook',
3245
3243
  })
3246
3244
 
3247
3245
  test('reply.send should throw if undefined error is thrown at onSend hook', t => {
3248
- /* eslint prefer-promise-reject-errors: ["error", {"allowEmptyReject": true}] */
3249
-
3250
3246
  t.plan(3)
3251
3247
  const fastify = Fastify()
3252
3248
 
@@ -12,7 +12,7 @@ const { buildCertificate } = require('../build-certificate')
12
12
  t.before(buildCertificate)
13
13
 
14
14
  test('A route supports host constraints under http2 protocol and secure connection', (t) => {
15
- t.plan(5)
15
+ t.plan(6)
16
16
 
17
17
  let fastify
18
18
  try {
@@ -45,6 +45,14 @@ test('A route supports host constraints under http2 protocol and secure connecti
45
45
  reply.code(200).send(beta)
46
46
  }
47
47
  })
48
+ fastify.route({
49
+ method: 'GET',
50
+ url: '/hostname_port',
51
+ constraints: { host: constrain },
52
+ handler: function (req, reply) {
53
+ reply.code(200).send({ ...beta, hostname: req.hostname })
54
+ }
55
+ })
48
56
 
49
57
  fastify.listen({ port: 0 }, err => {
50
58
  t.error(err)
@@ -87,5 +95,18 @@ test('A route supports host constraints under http2 protocol and secure connecti
87
95
 
88
96
  t.equal(res.headers[':status'], 404)
89
97
  })
98
+ t.test('https get request - constrain - verify hostname and port from request', async (t) => {
99
+ t.plan(1)
100
+
101
+ const url = `https://localhost:${fastify.server.address().port}/hostname_port`
102
+ const res = await h2url.concat({
103
+ url,
104
+ headers: {
105
+ ':authority': constrain
106
+ }
107
+ })
108
+ const body = JSON.parse(res.body)
109
+ t.equal(body.hostname, constrain)
110
+ })
90
111
  })
91
112
  })
@@ -20,8 +20,12 @@ fastify.get('/', function (req, reply) {
20
20
  reply.code(200).send(msg)
21
21
  })
22
22
 
23
- fastify.get('/hostname', function (req, reply) {
24
- reply.code(200).send(req.hostname)
23
+ fastify.get('/host', function (req, reply) {
24
+ reply.code(200).send(req.host)
25
+ })
26
+
27
+ fastify.get('/hostname_port', function (req, reply) {
28
+ reply.code(200).send({ hostname: req.hostname, port: req.port })
25
29
  })
26
30
 
27
31
  fastify.listen({ port: 0 }, err => {
@@ -40,14 +44,25 @@ fastify.listen({ port: 0 }, err => {
40
44
  t.same(JSON.parse(res.body), msg)
41
45
  })
42
46
 
43
- test('http hostname', async (t) => {
47
+ test('http host', async (t) => {
44
48
  t.plan(1)
45
49
 
46
- const hostname = `localhost:${fastify.server.address().port}`
50
+ const host = `localhost:${fastify.server.address().port}`
51
+
52
+ const url = `http://${host}/host`
53
+ const res = await h2url.concat({ url })
54
+
55
+ t.equal(res.body, host)
56
+ })
57
+ test('http hostname and port', async (t) => {
58
+ t.plan(2)
59
+
60
+ const host = `localhost:${fastify.server.address().port}`
47
61
 
48
- const url = `http://${hostname}/hostname`
62
+ const url = `http://${host}/hostname_port`
49
63
  const res = await h2url.concat({ url })
50
64
 
51
- t.equal(res.body, hostname)
65
+ t.equal(JSON.parse(res.body).hostname, host.split(':')[0])
66
+ t.equal(JSON.parse(res.body).port, parseInt(host.split(':')[1]))
52
67
  })
53
68
  })
@@ -10,7 +10,7 @@ const { buildCertificate } = require('../build-certificate')
10
10
  t.before(buildCertificate)
11
11
 
12
12
  test('secure', (t) => {
13
- t.plan(4)
13
+ t.plan(5)
14
14
 
15
15
  let fastify
16
16
  try {
@@ -32,6 +32,9 @@ test('secure', (t) => {
32
32
  fastify.get('/proto', function (req, reply) {
33
33
  reply.code(200).send({ proto: req.protocol })
34
34
  })
35
+ fastify.get('/hostname_port', function (req, reply) {
36
+ reply.code(200).send({ hostname: req.hostname, port: req.port })
37
+ })
35
38
 
36
39
  fastify.listen({ port: 0 }, err => {
37
40
  t.error(err)
@@ -55,5 +58,13 @@ test('secure', (t) => {
55
58
  t.same(JSON.parse((await h2url.concat({ url })).body), { proto: 'https' })
56
59
  t.same(JSON.parse((await h2url.concat({ url, headers: { 'X-Forwarded-Proto': 'lorem' } })).body), { proto: 'https' })
57
60
  })
61
+ t.test('https get request - test hostname and port', async (t) => {
62
+ t.plan(2)
63
+
64
+ const url = `https://localhost:${fastify.server.address().port}/hostname_port`
65
+ const parsedbody = JSON.parse((await h2url.concat({ url })).body)
66
+ t.equal(parsedbody.hostname, 'localhost')
67
+ t.equal(parsedbody.port, fastify.server.address().port)
68
+ })
58
69
  })
59
70
  })
@@ -74,3 +74,60 @@ test('https', (t) => {
74
74
  })
75
75
  })
76
76
  })
77
+
78
+ test('https - headers', (t) => {
79
+ t.plan(4)
80
+ let fastify
81
+ try {
82
+ fastify = Fastify({
83
+ https: {
84
+ key: global.context.key,
85
+ cert: global.context.cert
86
+ }
87
+ })
88
+ t.pass('Key/cert successfully loaded')
89
+ } catch (e) {
90
+ t.fail('Key/cert loading failed', e)
91
+ }
92
+
93
+ fastify.get('/', function (req, reply) {
94
+ reply.code(200).send({ hello: 'world', hostname: req.hostname, port: req.port })
95
+ })
96
+
97
+ t.teardown(async () => { await fastify.close() })
98
+
99
+ fastify.listen({ port: 0 }, err => {
100
+ t.error(err)
101
+
102
+ t.test('https get request', t => {
103
+ t.plan(4)
104
+ sget({
105
+ method: 'GET',
106
+ url: 'https://localhost:' + fastify.server.address().port,
107
+ rejectUnauthorized: false
108
+ }, (err, response, body) => {
109
+ t.error(err)
110
+ t.equal(response.statusCode, 200)
111
+ const parsedBody = JSON.parse(body)
112
+ t.equal(parsedBody.hostname, 'localhost')
113
+ t.equal(parsedBody.port, fastify.server.address().port)
114
+ })
115
+ })
116
+ t.test('https get request - test port fall back', t => {
117
+ t.plan(3)
118
+ sget({
119
+ method: 'GET',
120
+ headers: {
121
+ host: 'example.com'
122
+ },
123
+ url: 'https://localhost:' + fastify.server.address().port,
124
+ rejectUnauthorized: false
125
+ }, (err, response, body) => {
126
+ t.error(err)
127
+ t.equal(response.statusCode, 200)
128
+ const parsedBody = JSON.parse(body)
129
+ t.equal(parsedBody.port, null)
130
+ })
131
+ })
132
+ })
133
+ })
@@ -5,7 +5,6 @@ const test = t.test
5
5
  const Stream = require('node:stream')
6
6
  const util = require('node:util')
7
7
  const Fastify = require('..')
8
- const FormData = require('form-data')
9
8
  const { Readable } = require('node:stream')
10
9
 
11
10
  test('inject should exist', t => {
@@ -343,7 +342,7 @@ test('inject a multipart request using form-body', t => {
343
342
  })
344
343
 
345
344
  const form = new FormData()
346
- form.append('my_field', 'my value')
345
+ form.set('my_field', 'my value')
347
346
 
348
347
  fastify.inject({
349
348
  method: 'POST',
@@ -1,7 +1,5 @@
1
1
  'use strict'
2
2
 
3
- /* eslint no-prototype-builtins: 0 */
4
-
5
3
  const t = require('tap')
6
4
  const test = t.test
7
5
  const decorator = require('../../lib/decorate')