fastify 4.27.0 → 5.0.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/.markdownlint-cli2.yaml +1 -1
  2. package/.tap/processinfo/09002e93-10ad-430c-bc86-c0576928b0ed.json +241 -0
  3. package/.tap/processinfo/ee66c5ab-635d-48b5-8be6-3dc3ceea5bfc.json +268 -0
  4. package/.tap/test-results/test/404s.test.js.tap +623 -0
  5. package/.tap/test-results/test/500s.test.js.tap +64 -0
  6. package/.tap/test-results/test/allowUnsafeRegex.test.js.tap +36 -0
  7. package/.tap/test-results/test/als.test.js.tap +15 -0
  8. package/.tap/test-results/test/async-await.test.js.tap +184 -0
  9. package/.tap/test-results/test/async-dispose.test.js.tap +8 -0
  10. package/.tap/test-results/test/async_hooks.test.js.tap +10 -0
  11. package/.tap/test-results/test/bodyLimit.test.js.tap +48 -0
  12. package/.tap/test-results/test/buffer.test.js.tap +20 -0
  13. package/.tap/test-results/test/build/error-serializer.test.js.tap +12 -0
  14. package/.tap/test-results/test/build/version.test.js.tap +7 -0
  15. package/.tap/test-results/test/case-insensitive.test.js.tap +36 -0
  16. package/.tap/test-results/test/chainable.test.js.tap +17 -0
  17. package/.tap/test-results/test/check.test.js.tap +10 -0
  18. package/.tap/test-results/test/childLoggerFactory.test.js.tap +23 -0
  19. package/.tap/test-results/test/client-timeout.test.js.tap +7 -0
  20. package/.tap/test-results/test/close-pipelining.test.js.tap +15 -0
  21. package/.tap/test-results/test/close.test.js.tap +172 -0
  22. package/.tap/test-results/test/connectionTimeout.test.js.tap +12 -0
  23. package/.tap/test-results/test/constrained-routes.test.js.tap +173 -0
  24. package/.tap/test-results/test/content-length.test.js.tap +46 -0
  25. package/.tap/test-results/test/content-parser.test.js.tap +266 -0
  26. package/.tap/test-results/test/content-type.test.js.tap +14 -0
  27. package/.tap/test-results/test/context-config.test.js.tap +41 -0
  28. package/.tap/test-results/test/copy.test.js.tap +14 -0
  29. package/.tap/test-results/test/custom-http-server.test.js.tap +30 -0
  30. package/.tap/test-results/test/custom-parser-async.test.js.tap +21 -0
  31. package/.tap/test-results/test/custom-parser.0.test.js.tap +199 -0
  32. package/.tap/test-results/test/custom-parser.1.test.js.tap +90 -0
  33. package/.tap/test-results/test/custom-parser.2.test.js.tap +22 -0
  34. package/.tap/test-results/test/custom-parser.3.test.js.tap +53 -0
  35. package/.tap/test-results/test/custom-parser.4.test.js.tap +45 -0
  36. package/.tap/test-results/test/custom-parser.5.test.js.tap +41 -0
  37. package/.tap/test-results/test/custom-querystring-parser.test.js.tap +46 -0
  38. package/.tap/test-results/test/decorator.test.js.tap +465 -0
  39. package/.tap/test-results/test/delete.test.js.tap +110 -0
  40. package/.tap/test-results/test/diagnostics-channel/404.test.js.tap +15 -0
  41. package/.tap/test-results/test/diagnostics-channel/async-delay-request.test.js.tap +25 -0
  42. package/.tap/test-results/test/diagnostics-channel/async-request.test.js.tap +24 -0
  43. package/.tap/test-results/test/diagnostics-channel/error-before-handler.test.js.tap +9 -0
  44. package/.tap/test-results/test/diagnostics-channel/error-request.test.js.tap +20 -0
  45. package/.tap/test-results/test/diagnostics-channel/error-status.test.js.tap +10 -0
  46. package/.tap/test-results/test/diagnostics-channel/init.test.js.tap +14 -0
  47. package/.tap/test-results/test/diagnostics-channel/sync-delay-request.test.js.tap +16 -0
  48. package/.tap/test-results/test/diagnostics-channel/sync-request-reply.test.js.tap +16 -0
  49. package/.tap/test-results/test/diagnostics-channel/sync-request.test.js.tap +19 -0
  50. package/.tap/test-results/test/encapsulated-child-logger-factory.test.js.tap +18 -0
  51. package/.tap/test-results/test/encapsulated-error-handler.test.js.tap +243 -0
  52. package/.tap/test-results/test/esm/errorCodes.test.mjs.tap +9 -0
  53. package/.tap/test-results/test/esm/esm.test.mjs.tap +8 -0
  54. package/.tap/test-results/test/esm/index.test.js.tap +8 -0
  55. package/.tap/test-results/test/fastify-instance.test.js.tap +114 -0
  56. package/.tap/test-results/test/findRoute.test.js.tap +37 -0
  57. package/.tap/test-results/test/fluent-schema.test.js.tap +36 -0
  58. package/.tap/test-results/test/genReqId.test.js.tap +106 -0
  59. package/.tap/test-results/test/get.test.js.tap +151 -0
  60. package/.tap/test-results/test/handler-context.test.js.tap +19 -0
  61. package/.tap/test-results/test/has-route.test.js.tap +30 -0
  62. package/.tap/test-results/test/head.test.js.tap +130 -0
  63. package/.tap/test-results/test/header-overflow.test.js.tap +16 -0
  64. package/.tap/test-results/test/hooks-async.test.js.tap +286 -0
  65. package/.tap/test-results/test/hooks.on-listen.test.js.tap +311 -0
  66. package/.tap/test-results/test/hooks.on-ready.test.js.tap +151 -0
  67. package/.tap/test-results/test/hooks.test.js.tap +966 -0
  68. package/.tap/test-results/test/http2/closing.test.js.tap +35 -0
  69. package/.tap/test-results/test/http2/constraint.test.js.tap +32 -0
  70. package/.tap/test-results/test/http2/head.test.js.tap +9 -0
  71. package/.tap/test-results/test/http2/missing-http2-module.test.js.tap +8 -0
  72. package/.tap/test-results/test/http2/plain.test.js.tap +22 -0
  73. package/.tap/test-results/test/http2/secure-with-fallback.test.js.tap +40 -0
  74. package/.tap/test-results/test/http2/secure.test.js.tap +27 -0
  75. package/.tap/test-results/test/http2/unknown-http-method.test.js.tap +9 -0
  76. package/.tap/test-results/test/https/custom-https-server.test.js.tap +10 -0
  77. package/.tap/test-results/test/https/https.test.js.tap +45 -0
  78. package/.tap/test-results/test/imports.test.js.tap +14 -0
  79. package/.tap/test-results/test/inject.test.js.tap +165 -0
  80. package/.tap/test-results/test/internals/all.test.js.tap +42 -0
  81. package/.tap/test-results/test/internals/contentTypeParser.test.js.tap +14 -0
  82. package/.tap/test-results/test/internals/context.test.js.tap +14 -0
  83. package/.tap/test-results/test/internals/decorator.test.js.tap +51 -0
  84. package/.tap/test-results/test/internals/errors.test.js.tap +1212 -0
  85. package/.tap/test-results/test/internals/handleRequest.test.js.tap +69 -0
  86. package/.tap/test-results/test/internals/hookRunner.test.js.tap +143 -0
  87. package/.tap/test-results/test/internals/hooks.test.js.tap +45 -0
  88. package/.tap/test-results/test/internals/initialConfig.test.js.tap +125 -0
  89. package/.tap/test-results/test/internals/logger.test.js.tap +71 -0
  90. package/.tap/test-results/test/internals/plugin.test.js.tap +48 -0
  91. package/.tap/test-results/test/internals/reply-serialize.test.js.tap +166 -0
  92. package/.tap/test-results/test/internals/reply.test.js.tap +688 -0
  93. package/.tap/test-results/test/internals/reqIdGenFactory.test.js.tap +74 -0
  94. package/.tap/test-results/test/internals/request-validate.test.js.tap +384 -0
  95. package/.tap/test-results/test/internals/request.test.js.tap +163 -0
  96. package/.tap/test-results/test/internals/server.test.js.tap +30 -0
  97. package/.tap/test-results/test/internals/validation.test.js.tap +121 -0
  98. package/.tap/test-results/test/keepAliveTimeout.test.js.tap +12 -0
  99. package/.tap/test-results/test/listen.1.test.js.tap +31 -0
  100. package/.tap/test-results/test/listen.2.test.js.tap +46 -0
  101. package/.tap/test-results/test/listen.3.test.js.tap +25 -0
  102. package/.tap/test-results/test/listen.4.test.js.tap +51 -0
  103. package/.tap/test-results/test/lock.test.js.tap +29 -0
  104. package/.tap/test-results/test/logger/instantiation.test.js.tap +92 -0
  105. package/.tap/test-results/test/logger/logging.test.js.tap +117 -0
  106. package/.tap/test-results/test/logger/options.test.js.tap +165 -0
  107. package/.tap/test-results/test/logger/request.test.js.tap +82 -0
  108. package/.tap/test-results/test/logger/response.test.js.tap +38 -0
  109. package/.tap/test-results/test/maxRequestsPerSocket.test.js.tap +44 -0
  110. package/.tap/test-results/test/method-missing.test.js.tap +8 -0
  111. package/.tap/test-results/test/middleware.test.js.tap +17 -0
  112. package/.tap/test-results/test/mkcalendar.test.js.tap +43 -0
  113. package/.tap/test-results/test/mkcol.test.js.tap +14 -0
  114. package/.tap/test-results/test/move.test.js.tap +15 -0
  115. package/.tap/test-results/test/noop-set.test.js.tap +8 -0
  116. package/.tap/test-results/test/nullable-validation.test.js.tap +36 -0
  117. package/.tap/test-results/test/options.error-handler.test.js.tap +186 -0
  118. package/.tap/test-results/test/options.test.js.tap +174 -0
  119. package/.tap/test-results/test/output-validation.test.js.tap +66 -0
  120. package/.tap/test-results/test/patch.error-handler.test.js.tap +206 -0
  121. package/.tap/test-results/test/patch.test.js.tap +182 -0
  122. package/.tap/test-results/test/plugin.1.test.js.tap +78 -0
  123. package/.tap/test-results/test/plugin.2.test.js.tap +102 -0
  124. package/.tap/test-results/test/plugin.3.test.js.tap +58 -0
  125. package/.tap/test-results/test/plugin.4.test.js.tap +164 -0
  126. package/.tap/test-results/test/post-empty-body.test.js.tap +8 -0
  127. package/.tap/test-results/test/pretty-print.test.js.tap +82 -0
  128. package/.tap/test-results/test/promises.test.js.tap +46 -0
  129. package/.tap/test-results/test/propfind.test.js.tap +43 -0
  130. package/.tap/test-results/test/proppatch.test.js.tap +29 -0
  131. package/.tap/test-results/test/proto-poisoning.test.js.tap +47 -0
  132. package/.tap/test-results/test/put.error-handler.test.js.tap +206 -0
  133. package/.tap/test-results/test/put.test.js.tap +182 -0
  134. package/.tap/test-results/test/register.test.js.tap +61 -0
  135. package/.tap/test-results/test/reply-code.test.js.tap +40 -0
  136. package/.tap/test-results/test/reply-earlyHints.test.js.tap +22 -0
  137. package/.tap/test-results/test/reply-error.test.js.tap +643 -0
  138. package/.tap/test-results/test/reply-trailers.test.js.tap +176 -0
  139. package/.tap/test-results/test/report.test.js.tap +43 -0
  140. package/.tap/test-results/test/request-error.test.js.tap +98 -0
  141. package/.tap/test-results/test/request-id.test.js.tap +38 -0
  142. package/.tap/test-results/test/request.deprecated.test.js.tap +13 -0
  143. package/.tap/test-results/test/requestTimeout.test.js.tap +21 -0
  144. package/.tap/test-results/test/route-hooks.test.js.tap +498 -0
  145. package/.tap/test-results/test/route-prefix.test.js.tap +195 -0
  146. package/.tap/test-results/test/route-shorthand.test.js.tap +190 -0
  147. package/.tap/test-results/test/route.1.test.js.tap +93 -0
  148. package/.tap/test-results/test/route.2.test.js.tap +28 -0
  149. package/.tap/test-results/test/route.3.test.js.tap +39 -0
  150. package/.tap/test-results/test/route.4.test.js.tap +32 -0
  151. package/.tap/test-results/test/route.5.test.js.tap +54 -0
  152. package/.tap/test-results/test/route.6.test.js.tap +81 -0
  153. package/.tap/test-results/test/route.7.test.js.tap +93 -0
  154. package/.tap/test-results/test/route.8.test.js.tap +38 -0
  155. package/.tap/test-results/test/router-options.test.js.tap +104 -0
  156. package/.tap/test-results/test/same-shape.test.js.tap +22 -0
  157. package/.tap/test-results/test/schema-examples.test.js.tap +85 -0
  158. package/.tap/test-results/test/schema-feature.test.js.tap +445 -0
  159. package/.tap/test-results/test/schema-serialization.test.js.tap +194 -0
  160. package/.tap/test-results/test/schema-special-usage.test.js.tap +186 -0
  161. package/.tap/test-results/test/schema-validation.test.js.tap +199 -0
  162. package/.tap/test-results/test/search.test.js.tap +77 -0
  163. package/.tap/test-results/test/serialize-response.test.js.tap +26 -0
  164. package/.tap/test-results/test/server.test.js.tap +65 -0
  165. package/.tap/test-results/test/set-error-handler.test.js.tap +7 -0
  166. package/.tap/test-results/test/skip-reply-send.test.js.tap +272 -0
  167. package/.tap/test-results/test/stream.1.test.js.tap +36 -0
  168. package/.tap/test-results/test/stream.2.test.js.tap +20 -0
  169. package/.tap/test-results/test/stream.3.test.js.tap +34 -0
  170. package/.tap/test-results/test/stream.4.test.js.tap +40 -0
  171. package/.tap/test-results/test/stream.5.test.js.tap +37 -0
  172. package/.tap/test-results/test/sync-routes.test.js.tap +19 -0
  173. package/.tap/test-results/test/throw.test.js.tap +116 -0
  174. package/.tap/test-results/test/trace.test.js.tap +7 -0
  175. package/.tap/test-results/test/trust-proxy.test.js.tap +109 -0
  176. package/.tap/test-results/test/type-provider.test.js.tap +12 -0
  177. package/.tap/test-results/test/unlock.test.js.tap +14 -0
  178. package/.tap/test-results/test/upgrade.test.js.tap +8 -0
  179. package/.tap/test-results/test/url-rewriting.test.js.tap +39 -0
  180. package/.tap/test-results/test/useSemicolonDelimiter.test.js.tap +33 -0
  181. package/.tap/test-results/test/validation-error-handling.test.js.tap +180 -0
  182. package/.tap/test-results/test/versioned-routes.test.js.tap +151 -0
  183. package/.tap/test-results/test/web-api.test.js.tap +51 -0
  184. package/.tap/test-results/test/wrapThenable.test.js.tap +11 -0
  185. package/.taprc +4 -8
  186. package/README.md +3 -6
  187. package/build/build-error-serializer.js +4 -1
  188. package/build/build-validation.js +5 -4
  189. package/docs/Guides/Database.md +1 -1
  190. package/docs/Guides/Delay-Accepting-Requests.md +3 -3
  191. package/docs/Guides/Ecosystem.md +2 -0
  192. package/docs/Guides/Migration-Guide-V5.md +20 -0
  193. package/docs/Guides/Write-Type-Provider.md +4 -2
  194. package/docs/Reference/ContentTypeParser.md +30 -1
  195. package/docs/Reference/Decorators.md +42 -16
  196. package/docs/Reference/Errors.md +10 -2
  197. package/docs/Reference/Hooks.md +48 -14
  198. package/docs/Reference/Logging.md +5 -5
  199. package/docs/Reference/Reply.md +29 -24
  200. package/docs/Reference/Request.md +5 -1
  201. package/docs/Reference/Routes.md +24 -28
  202. package/docs/Reference/Server.md +14 -53
  203. package/docs/Reference/Type-Providers.md +21 -26
  204. package/docs/Reference/TypeScript.md +46 -29
  205. package/docs/Reference/Warnings.md +2 -8
  206. package/eslint.config.js +27 -0
  207. package/examples/typescript-server.ts +14 -14
  208. package/fastify.d.ts +15 -14
  209. package/fastify.js +41 -15
  210. package/lib/configValidator.js +94 -76
  211. package/lib/contentTypeParser.js +54 -88
  212. package/lib/decorate.js +3 -7
  213. package/lib/error-serializer.js +77 -19
  214. package/lib/errors.js +31 -6
  215. package/lib/handleRequest.js +70 -39
  216. package/lib/httpMethods.js +34 -18
  217. package/lib/logger.js +24 -6
  218. package/lib/pluginUtils.js +5 -5
  219. package/lib/reply.js +16 -13
  220. package/lib/request.js +37 -19
  221. package/lib/route.js +7 -31
  222. package/lib/server.js +62 -123
  223. package/lib/warnings.js +28 -27
  224. package/lib/wrapThenable.js +46 -22
  225. package/package.json +38 -58
  226. package/test/404s.test.js +8 -12
  227. package/test/async-await.test.js +46 -2
  228. package/test/build/error-serializer.test.js +4 -2
  229. package/test/check.test.js +225 -0
  230. package/test/close-pipelining.test.js +2 -34
  231. package/test/close.test.js +1 -41
  232. package/test/content-parser.test.js +69 -117
  233. package/test/custom-parser.1.test.js +40 -1
  234. package/test/decorator-namespace.test._js_ +31 -0
  235. package/test/decorator.test.js +92 -43
  236. package/test/delete.test.js +21 -1
  237. package/test/diagnostics-channel/404.test.js +57 -0
  238. package/test/diagnostics-channel/async-delay-request.test.js +74 -0
  239. package/test/diagnostics-channel/async-request.test.js +72 -0
  240. package/test/diagnostics-channel/error-before-handler.test.js +36 -0
  241. package/test/diagnostics-channel/error-request.test.js +61 -0
  242. package/test/diagnostics-channel/error-status.test.js +39 -0
  243. package/test/{diagnostics-channel.test.js → diagnostics-channel/init.test.js} +6 -16
  244. package/test/diagnostics-channel/sync-delay-request.test.js +58 -0
  245. package/test/diagnostics-channel/sync-request-reply.test.js +58 -0
  246. package/test/diagnostics-channel/sync-request.test.js +61 -0
  247. package/test/encapsulated-error-handler.test.js +201 -14
  248. package/test/esm/index.test.js +2 -12
  249. package/test/findRoute.test.js +16 -0
  250. package/test/genReqId.test.js +9 -0
  251. package/test/get.test.js +28 -0
  252. package/test/has-route.test.js +18 -2
  253. package/test/helper.js +1 -5
  254. package/test/hooks.test.js +0 -4
  255. package/test/http2/constraint.test.js +22 -1
  256. package/test/http2/plain.test.js +21 -6
  257. package/test/http2/secure.test.js +12 -1
  258. package/test/https/https.test.js +57 -0
  259. package/test/inject.test.js +1 -2
  260. package/test/internals/decorator.test.js +0 -2
  261. package/test/internals/errors.test.js +57 -17
  262. package/test/internals/handleRequest.test.js +5 -1
  263. package/test/internals/initialConfig.test.js +5 -5
  264. package/test/internals/logger.test.js +31 -2
  265. package/test/internals/reply.test.js +38 -80
  266. package/test/internals/request.test.js +13 -11
  267. package/test/listen.1.test.js +5 -15
  268. package/test/listen.5.test.js +88 -0
  269. package/test/logger/instantiation.test.js +8 -8
  270. package/test/logger/logging.test.js +4 -4
  271. package/test/logger/options.test.js +102 -21
  272. package/test/logger/response.test.js +6 -6
  273. package/test/maxRequestsPerSocket.test.js +2 -5
  274. package/test/method-missing.test.js +24 -0
  275. package/test/plugin.1.test.js +2 -4
  276. package/test/plugin.2.test.js +0 -2
  277. package/test/plugin.3.test.js +0 -2
  278. package/test/plugin.4.test.js +92 -56
  279. package/test/register.test.js +2 -4
  280. package/test/reply-earlyHints.test.js +98 -0
  281. package/test/reply-error.test.js +0 -2
  282. package/test/route-hooks.test.js +0 -1
  283. package/test/route-shorthand.test.js +60 -0
  284. package/test/schema-special-usage.test.js +1 -1
  285. package/test/server.test.js +17 -2
  286. package/test/stream.2.test.js +1 -1
  287. package/test/stream.4.test.js +0 -42
  288. package/test/stream.5.test.js +2 -2
  289. package/test/trust-proxy.test.js +33 -27
  290. package/test/types/errors.test-d.ts +0 -2
  291. package/test/types/fastify.test-d.ts +14 -12
  292. package/test/types/hooks.test-d.ts +1 -0
  293. package/test/types/import.ts +1 -0
  294. package/test/types/instance.test-d.ts +10 -51
  295. package/test/types/logger.test-d.ts +43 -6
  296. package/test/types/plugin.test-d.ts +5 -2
  297. package/test/types/register.test-d.ts +2 -2
  298. package/test/types/reply.test-d.ts +13 -12
  299. package/test/types/request.test-d.ts +19 -8
  300. package/test/types/route.test-d.ts +30 -2
  301. package/test/types/schema.test-d.ts +2 -2
  302. package/test/types/serverFactory.test-d.ts +1 -1
  303. package/test/types/type-provider.test-d.ts +60 -13
  304. package/test/types/using.test-d.ts +4 -1
  305. package/test/url-rewriting.test.js +3 -2
  306. package/test/useSemicolonDelimiter.test.js +3 -6
  307. package/test/versioned-routes.test.js +1 -1
  308. package/test/web-api.test.js +0 -6
  309. package/types/content-type-parser.d.ts +3 -3
  310. package/types/context.d.ts +0 -1
  311. package/types/errors.d.ts +1 -0
  312. package/types/hooks.d.ts +6 -6
  313. package/types/instance.d.ts +28 -41
  314. package/types/logger.d.ts +3 -3
  315. package/types/plugin.d.ts +3 -3
  316. package/types/reply.d.ts +13 -14
  317. package/types/request.d.ts +5 -3
  318. package/types/route.d.ts +29 -29
  319. package/types/schema.d.ts +3 -3
  320. package/types/serverFactory.d.ts +2 -2
  321. package/types/type-provider.d.ts +22 -12
  322. package/types/utils.d.ts +18 -18
  323. package/.c8rc.json +0 -8
  324. package/.eslintrc +0 -4
  325. package/test/default-route.test.js +0 -88
  326. package/test/listen.deprecated.test.js +0 -229
  327. package/test/unsupported-httpversion.test.js +0 -31
  328. package/types/.eslintrc.json +0 -48
@@ -0,0 +1,88 @@
1
+ 'use strict'
2
+
3
+ const { test } = require('tap')
4
+ const net = require('node:net')
5
+ const Fastify = require('../fastify')
6
+ const { once } = require('node:events')
7
+
8
+ test('same port conflict and success should not fire callback multiple times - callback', async (t) => {
9
+ t.plan(7)
10
+ const server = net.createServer()
11
+ server.listen({ port: 0, host: '127.0.0.1' })
12
+ await once(server, 'listening')
13
+ const option = { port: server.address().port, host: server.address().address }
14
+ let count = 0
15
+ const fastify = Fastify()
16
+ function callback (err) {
17
+ switch (count) {
18
+ case 6: {
19
+ // success in here
20
+ t.error(err)
21
+ fastify.close((err) => {
22
+ t.error(err)
23
+ })
24
+ break
25
+ }
26
+ case 5: {
27
+ server.close()
28
+ setTimeout(() => {
29
+ fastify.listen(option, callback)
30
+ }, 100)
31
+ break
32
+ }
33
+ default: {
34
+ // expect error
35
+ t.equal(err.code, 'EADDRINUSE')
36
+ setTimeout(() => {
37
+ fastify.listen(option, callback)
38
+ }, 100)
39
+ }
40
+ }
41
+ count++
42
+ }
43
+ fastify.listen(option, callback)
44
+ })
45
+
46
+ test('same port conflict and success should not fire callback multiple times - promise', async (t) => {
47
+ t.plan(5)
48
+ const server = net.createServer()
49
+ server.listen({ port: 0, host: '127.0.0.1' })
50
+ await once(server, 'listening')
51
+ const option = { port: server.address().port, host: server.address().address }
52
+ const fastify = Fastify()
53
+
54
+ try {
55
+ await fastify.listen(option)
56
+ } catch (err) {
57
+ t.equal(err.code, 'EADDRINUSE')
58
+ }
59
+ try {
60
+ await fastify.listen(option)
61
+ } catch (err) {
62
+ t.equal(err.code, 'EADDRINUSE')
63
+ }
64
+ try {
65
+ await fastify.listen(option)
66
+ } catch (err) {
67
+ t.equal(err.code, 'EADDRINUSE')
68
+ }
69
+ try {
70
+ await fastify.listen(option)
71
+ } catch (err) {
72
+ t.equal(err.code, 'EADDRINUSE')
73
+ }
74
+ try {
75
+ await fastify.listen(option)
76
+ } catch (err) {
77
+ t.equal(err.code, 'EADDRINUSE')
78
+ }
79
+
80
+ server.close()
81
+
82
+ await once(server, 'close')
83
+
84
+ // when ever we can listen, and close properly
85
+ // which means there is no problem on the callback
86
+ await fastify.listen()
87
+ await fastify.close()
88
+ })
@@ -32,9 +32,9 @@ t.test('logger instantiation', (t) => {
32
32
 
33
33
  const stream = split(JSON.parse)
34
34
 
35
- const logger = require('pino')(stream)
35
+ const loggerInstance = require('pino')(stream)
36
36
 
37
- const fastify = Fastify({ logger })
37
+ const fastify = Fastify({ loggerInstance })
38
38
  t.teardown(fastify.close.bind(fastify))
39
39
 
40
40
  fastify.get('/foo', function (req, reply) {
@@ -203,17 +203,17 @@ t.test('logger instantiation', (t) => {
203
203
  t.test('should be able to use a custom logger', (t) => {
204
204
  t.plan(7)
205
205
 
206
- const logger = {
206
+ const loggerInstance = {
207
207
  fatal: (msg) => { t.equal(msg, 'fatal') },
208
208
  error: (msg) => { t.equal(msg, 'error') },
209
209
  warn: (msg) => { t.equal(msg, 'warn') },
210
210
  info: (msg) => { t.equal(msg, 'info') },
211
211
  debug: (msg) => { t.equal(msg, 'debug') },
212
212
  trace: (msg) => { t.equal(msg, 'trace') },
213
- child: () => logger
213
+ child: () => loggerInstance
214
214
  }
215
215
 
216
- const fastify = Fastify({ logger })
216
+ const fastify = Fastify({ loggerInstance })
217
217
  t.teardown(fastify.close.bind(fastify))
218
218
 
219
219
  fastify.log.fatal('fatal')
@@ -223,7 +223,7 @@ t.test('logger instantiation', (t) => {
223
223
  fastify.log.debug('debug')
224
224
  fastify.log.trace('trace')
225
225
  const child = fastify.log.child()
226
- t.equal(child, logger)
226
+ t.equal(child, loggerInstance)
227
227
  })
228
228
 
229
229
  t.test('should throw in case a partially matching logger is provided', async (t) => {
@@ -246,7 +246,7 @@ t.test('logger instantiation', (t) => {
246
246
  t.plan(lines.length + 1)
247
247
 
248
248
  const stream = split(JSON.parse)
249
- const logger = require('pino')({
249
+ const loggerInstance = require('pino')({
250
250
  level: 'info',
251
251
  serializers: {
252
252
  req: function (req) {
@@ -258,7 +258,7 @@ t.test('logger instantiation', (t) => {
258
258
  }, stream)
259
259
 
260
260
  const fastify = Fastify({
261
- logger
261
+ loggerInstance
262
262
  })
263
263
  t.teardown(fastify.close.bind(fastify))
264
264
 
@@ -29,10 +29,10 @@ t.test('logging', (t) => {
29
29
 
30
30
  const stream = split(JSON.parse)
31
31
 
32
- const logger = pino({ level: 'trace' }, stream)
32
+ const loggerInstance = pino({ level: 'trace' }, stream)
33
33
 
34
34
  const fastify = Fastify({
35
- logger
35
+ loggerInstance
36
36
  })
37
37
  t.teardown(fastify.close.bind(fastify))
38
38
 
@@ -229,10 +229,10 @@ t.test('logging', (t) => {
229
229
  t.plan(lines.length + 1)
230
230
 
231
231
  const stream = split(JSON.parse)
232
- const logger = pino(stream)
232
+ const loggerInstance = pino(stream)
233
233
 
234
234
  const fastify = Fastify({
235
- logger
235
+ loggerInstance
236
236
  })
237
237
  t.teardown(fastify.close.bind(fastify))
238
238
 
@@ -12,7 +12,7 @@ const { on } = stream
12
12
  t.test('logger options', (t) => {
13
13
  t.setTimeout(60000)
14
14
 
15
- t.plan(12)
15
+ t.plan(16)
16
16
 
17
17
  t.test('logger can be silenced', (t) => {
18
18
  t.plan(17)
@@ -48,10 +48,10 @@ t.test('logger options', (t) => {
48
48
 
49
49
  const stream = split(JSON.parse)
50
50
 
51
- const logger = pino({ level: 'error' }, stream)
51
+ const loggerInstance = pino({ level: 'error' }, stream)
52
52
 
53
53
  const fastify = Fastify({
54
- logger
54
+ loggerInstance
55
55
  })
56
56
  t.teardown(fastify.close.bind(fastify))
57
57
 
@@ -94,10 +94,10 @@ t.test('logger options', (t) => {
94
94
 
95
95
  const stream = split(JSON.parse)
96
96
 
97
- const logger = pino({ level: 'error' }, stream)
97
+ const loggerInstance = pino({ level: 'error' }, stream)
98
98
 
99
99
  const fastify = Fastify({
100
- logger
100
+ loggerInstance
101
101
  })
102
102
  t.teardown(fastify.close.bind(fastify))
103
103
 
@@ -130,10 +130,10 @@ t.test('logger options', (t) => {
130
130
 
131
131
  const stream = split(JSON.parse)
132
132
 
133
- const logger = pino({ level: 'error' }, stream)
133
+ const loggerInstance = pino({ level: 'error' }, stream)
134
134
 
135
135
  const fastify = Fastify({
136
- logger
136
+ loggerInstance
137
137
  })
138
138
  t.teardown(fastify.close.bind(fastify))
139
139
 
@@ -193,9 +193,9 @@ t.test('logger options', (t) => {
193
193
 
194
194
  const stream = split(JSON.parse)
195
195
 
196
- const logger = pino({ level: 'info' }, stream)
196
+ const loggerInstance = pino({ level: 'info' }, stream)
197
197
  const fastify = Fastify({
198
- logger
198
+ loggerInstance
199
199
  })
200
200
  t.teardown(fastify.close.bind(fastify))
201
201
 
@@ -252,9 +252,9 @@ t.test('logger options', (t) => {
252
252
 
253
253
  const stream = split(JSON.parse)
254
254
 
255
- const logger = pino({ level: 'info' }, stream)
255
+ const loggerInstance = pino({ level: 'info' }, stream)
256
256
  const fastify = Fastify({
257
- logger
257
+ loggerInstance
258
258
  })
259
259
  t.teardown(fastify.close.bind(fastify))
260
260
 
@@ -290,9 +290,9 @@ t.test('logger options', (t) => {
290
290
 
291
291
  const stream = split(JSON.parse)
292
292
 
293
- const logger = pino({ level: 'info' }, stream)
293
+ const loggerInstance = pino({ level: 'info' }, stream)
294
294
  const fastify = Fastify({
295
- logger
295
+ loggerInstance
296
296
  })
297
297
  t.teardown(fastify.close.bind(fastify))
298
298
 
@@ -333,10 +333,10 @@ t.test('logger options', (t) => {
333
333
 
334
334
  const stream = split(JSON.parse)
335
335
 
336
- const logger = pino({ level: 'info' }, stream)
336
+ const loggerInstance = pino({ level: 'info' }, stream)
337
337
 
338
338
  const fastify = Fastify({
339
- logger
339
+ loggerInstance
340
340
  })
341
341
  t.teardown(fastify.close.bind(fastify))
342
342
 
@@ -369,10 +369,10 @@ t.test('logger options', (t) => {
369
369
 
370
370
  const stream = split(JSON.parse)
371
371
 
372
- const logger = pino({ level: 'warn' }, stream)
372
+ const loggerInstance = pino({ level: 'warn' }, stream)
373
373
 
374
374
  const fastify = Fastify({
375
- logger
375
+ loggerInstance
376
376
  })
377
377
  t.teardown(fastify.close.bind(fastify))
378
378
 
@@ -404,10 +404,10 @@ t.test('logger options', (t) => {
404
404
 
405
405
  const stream = split(JSON.parse)
406
406
 
407
- const logger = pino({ level: 'warn' }, stream)
407
+ const loggerInstance = pino({ level: 'warn' }, stream)
408
408
 
409
409
  const fastify = Fastify({
410
- logger
410
+ loggerInstance
411
411
  })
412
412
  t.teardown(fastify.close.bind(fastify))
413
413
 
@@ -444,10 +444,10 @@ t.test('logger options', (t) => {
444
444
 
445
445
  const stream = split(JSON.parse)
446
446
 
447
- const logger = pino({ level: 'error' }, stream)
447
+ const loggerInstance = pino({ level: 'error' }, stream)
448
448
 
449
449
  const fastify = Fastify({
450
- logger
450
+ loggerInstance
451
451
  })
452
452
  t.teardown(fastify.close.bind(fastify))
453
453
 
@@ -497,4 +497,85 @@ t.test('logger options', (t) => {
497
497
  t.equal(typeof fastify.log.trace, 'function')
498
498
  t.equal(typeof fastify.log.child, 'function')
499
499
  })
500
+
501
+ t.test('Should throw an error if logger instance is passed to `logger`', async (t) => {
502
+ t.plan(2)
503
+ const stream = split(JSON.parse)
504
+
505
+ const logger = require('pino')(stream)
506
+
507
+ try {
508
+ Fastify({ logger })
509
+ } catch (err) {
510
+ t.ok(err)
511
+ t.equal(err.code, 'FST_ERR_LOG_INVALID_LOGGER_CONFIG')
512
+ }
513
+ })
514
+
515
+ t.test('Should throw an error if options are passed to `loggerInstance`', async (t) => {
516
+ t.plan(2)
517
+ try {
518
+ Fastify({ loggerInstance: { level: 'log' } })
519
+ } catch (err) {
520
+ t.ok(err)
521
+ t.equal(err.code, 'FST_ERR_LOG_INVALID_LOGGER_INSTANCE')
522
+ }
523
+ })
524
+
525
+ t.test('If both `loggerInstance` and `logger` are provided, an error should be thrown', async (t) => {
526
+ t.plan(2)
527
+ const loggerInstanceStream = split(JSON.parse)
528
+ const loggerInstance = pino({ level: 'error' }, loggerInstanceStream)
529
+ const loggerStream = split(JSON.parse)
530
+ try {
531
+ Fastify({
532
+ logger: {
533
+ stream: loggerStream,
534
+ level: 'info'
535
+ },
536
+ loggerInstance
537
+ })
538
+ } catch (err) {
539
+ t.ok(err)
540
+ t.equal(err.code, 'FST_ERR_LOG_LOGGER_AND_LOGGER_INSTANCE_PROVIDED')
541
+ }
542
+ })
543
+
544
+ t.test('`logger` should take pino configuration and create a pino logger', async (t) => {
545
+ const lines = ['hello', 'world']
546
+ t.plan(2 * lines.length + 2)
547
+ const loggerStream = split(JSON.parse)
548
+ const fastify = Fastify({
549
+ logger: {
550
+ stream: loggerStream,
551
+ level: 'error'
552
+ }
553
+ })
554
+ t.teardown(fastify.close.bind(fastify))
555
+ fastify.get('/hello', (req, reply) => {
556
+ req.log.error('hello')
557
+ reply.code(404).send()
558
+ })
559
+
560
+ fastify.get('/world', (req, reply) => {
561
+ req.log.error('world')
562
+ reply.code(201).send()
563
+ })
564
+
565
+ await fastify.ready()
566
+ {
567
+ const response = await fastify.inject({ method: 'GET', url: '/hello' })
568
+ t.equal(response.statusCode, 404)
569
+ }
570
+ {
571
+ const response = await fastify.inject({ method: 'GET', url: '/world' })
572
+ t.equal(response.statusCode, 201)
573
+ }
574
+
575
+ for await (const [line] of on(loggerStream, 'data')) {
576
+ t.equal(line.level, 50)
577
+ t.equal(line.msg, lines.shift())
578
+ if (lines.length === 0) break
579
+ }
580
+ })
500
581
  })
@@ -24,9 +24,9 @@ t.test('response serialization', (t) => {
24
24
 
25
25
  const stream = split(JSON.parse)
26
26
 
27
- const logger = pino({ level: 'info' }, stream)
27
+ const loggerInstance = pino({ level: 'info' }, stream)
28
28
  const fastify = Fastify({
29
- logger
29
+ loggerInstance
30
30
  })
31
31
  t.teardown(fastify.close.bind(fastify))
32
32
 
@@ -70,7 +70,7 @@ t.test('response serialization', (t) => {
70
70
 
71
71
  const stream = split(JSON.parse)
72
72
 
73
- const logger = pino({
73
+ const loggerInstance = pino({
74
74
  level: 'info',
75
75
  serializers: {
76
76
  test: value => 'X' + value,
@@ -78,7 +78,7 @@ t.test('response serialization', (t) => {
78
78
  }
79
79
  }, stream)
80
80
  const fastify = Fastify({
81
- logger
81
+ loggerInstance
82
82
  })
83
83
  t.teardown(fastify.close.bind(fastify))
84
84
 
@@ -115,14 +115,14 @@ t.test('response serialization', (t) => {
115
115
 
116
116
  const stream = split(JSON.parse)
117
117
 
118
- const logger = pino({
118
+ const loggerInstance = pino({
119
119
  level: 'info',
120
120
  serializers: {
121
121
  test: value => 'X' + value
122
122
  }
123
123
  }, stream)
124
124
 
125
- const fastify = Fastify({ logger })
125
+ const fastify = Fastify({ loggerInstance })
126
126
  t.teardown(fastify.close.bind(fastify))
127
127
 
128
128
  fastify.register(context1, { logSerializers: { test2: value => 'Y' + value } })
@@ -2,12 +2,9 @@
2
2
 
3
3
  const net = require('node:net')
4
4
  const { test } = require('tap')
5
- const semver = require('semver')
6
5
  const Fastify = require('../fastify')
7
6
 
8
- const skip = semver.lt(process.versions.node, '16.10.0')
9
-
10
- test('maxRequestsPerSocket on node version >= 16.10.0', { skip }, t => {
7
+ test('maxRequestsPerSocket', t => {
11
8
  t.plan(8)
12
9
 
13
10
  const fastify = Fastify({ maxRequestsPerSocket: 2 })
@@ -48,7 +45,7 @@ test('maxRequestsPerSocket on node version >= 16.10.0', { skip }, t => {
48
45
  })
49
46
  })
50
47
 
51
- test('maxRequestsPerSocket zero should behave same as null', { skip }, t => {
48
+ test('maxRequestsPerSocket zero should behave same as null', t => {
52
49
  t.plan(10)
53
50
 
54
51
  const fastify = Fastify({ maxRequestsPerSocket: 0 })
@@ -0,0 +1,24 @@
1
+ const http = require('http')
2
+ const { test } = require('tap')
3
+ const Fastify = require('../fastify')
4
+
5
+ test('missing method from http client', t => {
6
+ t.plan(2)
7
+ const fastify = Fastify()
8
+
9
+ fastify.listen({ port: 3000 }, (err) => {
10
+ t.error(err)
11
+
12
+ const port = fastify.server.address().port
13
+ const req = http.request({
14
+ port,
15
+ method: 'REBIND',
16
+ path: '/'
17
+ }, (res) => {
18
+ t.equal(res.statusCode, 404)
19
+ fastify.close()
20
+ })
21
+
22
+ req.end()
23
+ })
24
+ })
@@ -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 Fastify = require('../fastify')
@@ -117,8 +115,8 @@ test('fastify.register with fastify-plugin should provide access to external fas
117
115
 
118
116
  instance.register((i, o, n) => n(), p => {
119
117
  t.notOk(p === instance || p === fastify)
120
- t.ok(instance.isPrototypeOf(p))
121
- t.ok(fastify.isPrototypeOf(p))
118
+ t.ok(Object.prototype.isPrototypeOf.call(instance, p))
119
+ t.ok(Object.prototype.isPrototypeOf.call(fastify, p))
122
120
  t.ok(p.global)
123
121
  })
124
122
 
@@ -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 Fastify = require('../fastify')
@@ -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 Fastify = require('../fastify')