node-fastify 5.8.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 (354) hide show
  1. package/.borp.yaml +3 -0
  2. package/.markdownlint-cli2.yaml +22 -0
  3. package/.prettierignore +1 -0
  4. package/GOVERNANCE.md +4 -0
  5. package/LICENSE +21 -0
  6. package/PROJECT_CHARTER.md +126 -0
  7. package/README.md +423 -0
  8. package/SECURITY.md +220 -0
  9. package/SPONSORS.md +24 -0
  10. package/build/build-error-serializer.js +35 -0
  11. package/build/build-validation.js +169 -0
  12. package/build/sync-version.js +11 -0
  13. package/docs/Guides/Benchmarking.md +60 -0
  14. package/docs/Guides/Database.md +321 -0
  15. package/docs/Guides/Delay-Accepting-Requests.md +608 -0
  16. package/docs/Guides/Detecting-When-Clients-Abort.md +172 -0
  17. package/docs/Guides/Ecosystem.md +726 -0
  18. package/docs/Guides/Fluent-Schema.md +127 -0
  19. package/docs/Guides/Getting-Started.md +620 -0
  20. package/docs/Guides/Index.md +43 -0
  21. package/docs/Guides/Migration-Guide-V3.md +287 -0
  22. package/docs/Guides/Migration-Guide-V4.md +267 -0
  23. package/docs/Guides/Migration-Guide-V5.md +727 -0
  24. package/docs/Guides/Plugins-Guide.md +520 -0
  25. package/docs/Guides/Prototype-Poisoning.md +383 -0
  26. package/docs/Guides/Recommendations.md +378 -0
  27. package/docs/Guides/Serverless.md +604 -0
  28. package/docs/Guides/Style-Guide.md +246 -0
  29. package/docs/Guides/Testing.md +481 -0
  30. package/docs/Guides/Write-Plugin.md +103 -0
  31. package/docs/Guides/Write-Type-Provider.md +34 -0
  32. package/docs/Reference/ContentTypeParser.md +271 -0
  33. package/docs/Reference/Decorators.md +436 -0
  34. package/docs/Reference/Encapsulation.md +194 -0
  35. package/docs/Reference/Errors.md +377 -0
  36. package/docs/Reference/HTTP2.md +94 -0
  37. package/docs/Reference/Hooks.md +958 -0
  38. package/docs/Reference/Index.md +73 -0
  39. package/docs/Reference/LTS.md +86 -0
  40. package/docs/Reference/Lifecycle.md +99 -0
  41. package/docs/Reference/Logging.md +268 -0
  42. package/docs/Reference/Middleware.md +79 -0
  43. package/docs/Reference/Plugins.md +245 -0
  44. package/docs/Reference/Principles.md +73 -0
  45. package/docs/Reference/Reply.md +1001 -0
  46. package/docs/Reference/Request.md +295 -0
  47. package/docs/Reference/Routes.md +802 -0
  48. package/docs/Reference/Server.md +2389 -0
  49. package/docs/Reference/Type-Providers.md +256 -0
  50. package/docs/Reference/TypeScript.md +1729 -0
  51. package/docs/Reference/Validation-and-Serialization.md +1130 -0
  52. package/docs/Reference/Warnings.md +58 -0
  53. package/docs/index.md +24 -0
  54. package/docs/resources/encapsulation_context.drawio +1 -0
  55. package/docs/resources/encapsulation_context.svg +3 -0
  56. package/eslint.config.js +35 -0
  57. package/examples/asyncawait.js +38 -0
  58. package/examples/benchmark/body.json +3 -0
  59. package/examples/benchmark/hooks-benchmark-async-await.js +44 -0
  60. package/examples/benchmark/hooks-benchmark.js +52 -0
  61. package/examples/benchmark/parser.js +47 -0
  62. package/examples/benchmark/simple.js +30 -0
  63. package/examples/benchmark/webstream.js +27 -0
  64. package/examples/hooks.js +91 -0
  65. package/examples/http2.js +39 -0
  66. package/examples/https.js +38 -0
  67. package/examples/parser.js +53 -0
  68. package/examples/plugin.js +12 -0
  69. package/examples/route-prefix.js +38 -0
  70. package/examples/shared-schema.js +38 -0
  71. package/examples/simple-stream.js +20 -0
  72. package/examples/simple.js +32 -0
  73. package/examples/simple.mjs +27 -0
  74. package/examples/typescript-server.ts +79 -0
  75. package/examples/use-plugin.js +29 -0
  76. package/fastify.d.ts +253 -0
  77. package/fastify.js +985 -0
  78. package/integration/server.js +29 -0
  79. package/integration/test.sh +23 -0
  80. package/lib/config-validator.js +1266 -0
  81. package/lib/content-type-parser.js +413 -0
  82. package/lib/content-type.js +160 -0
  83. package/lib/context.js +98 -0
  84. package/lib/decorate.js +152 -0
  85. package/lib/error-handler.js +173 -0
  86. package/lib/error-serializer.js +134 -0
  87. package/lib/error-status.js +14 -0
  88. package/lib/errors.js +516 -0
  89. package/lib/four-oh-four.js +190 -0
  90. package/lib/handle-request.js +195 -0
  91. package/lib/head-route.js +45 -0
  92. package/lib/hooks.js +429 -0
  93. package/lib/initial-config-validation.js +37 -0
  94. package/lib/logger-factory.js +136 -0
  95. package/lib/logger-pino.js +68 -0
  96. package/lib/noop-set.js +10 -0
  97. package/lib/plugin-override.js +90 -0
  98. package/lib/plugin-utils.js +169 -0
  99. package/lib/promise.js +23 -0
  100. package/lib/reply.js +1030 -0
  101. package/lib/req-id-gen-factory.js +52 -0
  102. package/lib/request.js +391 -0
  103. package/lib/route.js +686 -0
  104. package/lib/schema-controller.js +164 -0
  105. package/lib/schemas.js +207 -0
  106. package/lib/server.js +441 -0
  107. package/lib/symbols.js +71 -0
  108. package/lib/validation.js +280 -0
  109. package/lib/warnings.js +57 -0
  110. package/lib/wrap-thenable.js +84 -0
  111. package/package.json +225 -0
  112. package/scripts/validate-ecosystem-links.js +179 -0
  113. package/test/404s.test.js +2035 -0
  114. package/test/500s.test.js +422 -0
  115. package/test/allow-unsafe-regex.test.js +92 -0
  116. package/test/als.test.js +65 -0
  117. package/test/async-await.test.js +705 -0
  118. package/test/async-dispose.test.js +20 -0
  119. package/test/async_hooks.test.js +52 -0
  120. package/test/body-limit.test.js +224 -0
  121. package/test/buffer.test.js +74 -0
  122. package/test/build/error-serializer.test.js +36 -0
  123. package/test/build/version.test.js +14 -0
  124. package/test/build-certificate.js +109 -0
  125. package/test/bundler/README.md +29 -0
  126. package/test/bundler/esbuild/bundler-test.js +32 -0
  127. package/test/bundler/esbuild/package.json +10 -0
  128. package/test/bundler/esbuild/src/fail-plugin-version.js +14 -0
  129. package/test/bundler/esbuild/src/index.js +9 -0
  130. package/test/bundler/webpack/bundler-test.js +32 -0
  131. package/test/bundler/webpack/package.json +11 -0
  132. package/test/bundler/webpack/src/fail-plugin-version.js +14 -0
  133. package/test/bundler/webpack/src/index.js +9 -0
  134. package/test/bundler/webpack/webpack.config.js +15 -0
  135. package/test/case-insensitive.test.js +102 -0
  136. package/test/chainable.test.js +40 -0
  137. package/test/child-logger-factory.test.js +128 -0
  138. package/test/client-timeout.test.js +38 -0
  139. package/test/close-pipelining.test.js +78 -0
  140. package/test/close.test.js +706 -0
  141. package/test/conditional-pino.test.js +47 -0
  142. package/test/connection-timeout.test.js +42 -0
  143. package/test/constrained-routes.test.js +1138 -0
  144. package/test/content-length.test.js +174 -0
  145. package/test/content-parser.test.js +739 -0
  146. package/test/content-type.test.js +181 -0
  147. package/test/context-config.test.js +164 -0
  148. package/test/custom-http-server.test.js +118 -0
  149. package/test/custom-parser-async.test.js +59 -0
  150. package/test/custom-parser.0.test.js +701 -0
  151. package/test/custom-parser.1.test.js +266 -0
  152. package/test/custom-parser.2.test.js +91 -0
  153. package/test/custom-parser.3.test.js +208 -0
  154. package/test/custom-parser.4.test.js +218 -0
  155. package/test/custom-parser.5.test.js +130 -0
  156. package/test/custom-querystring-parser.test.js +129 -0
  157. package/test/decorator.test.js +1330 -0
  158. package/test/delete.test.js +344 -0
  159. package/test/diagnostics-channel/404.test.js +49 -0
  160. package/test/diagnostics-channel/async-delay-request.test.js +65 -0
  161. package/test/diagnostics-channel/async-request.test.js +64 -0
  162. package/test/diagnostics-channel/error-before-handler.test.js +35 -0
  163. package/test/diagnostics-channel/error-request.test.js +53 -0
  164. package/test/diagnostics-channel/error-status.test.js +123 -0
  165. package/test/diagnostics-channel/init.test.js +50 -0
  166. package/test/diagnostics-channel/sync-delay-request.test.js +49 -0
  167. package/test/diagnostics-channel/sync-request-reply.test.js +51 -0
  168. package/test/diagnostics-channel/sync-request.test.js +54 -0
  169. package/test/encapsulated-child-logger-factory.test.js +69 -0
  170. package/test/encapsulated-error-handler.test.js +237 -0
  171. package/test/esm/errorCodes.test.mjs +10 -0
  172. package/test/esm/esm.test.mjs +13 -0
  173. package/test/esm/index.test.js +8 -0
  174. package/test/esm/named-exports.mjs +14 -0
  175. package/test/esm/other.mjs +8 -0
  176. package/test/esm/plugin.mjs +8 -0
  177. package/test/fastify-instance.test.js +300 -0
  178. package/test/find-route.test.js +152 -0
  179. package/test/fluent-schema.test.js +209 -0
  180. package/test/genReqId.test.js +426 -0
  181. package/test/handler-context.test.js +45 -0
  182. package/test/handler-timeout.test.js +367 -0
  183. package/test/has-route.test.js +88 -0
  184. package/test/header-overflow.test.js +55 -0
  185. package/test/helper.js +496 -0
  186. package/test/hooks-async.test.js +1099 -0
  187. package/test/hooks.on-listen.test.js +1162 -0
  188. package/test/hooks.on-ready.test.js +421 -0
  189. package/test/hooks.test.js +3578 -0
  190. package/test/http-methods/copy.test.js +35 -0
  191. package/test/http-methods/custom-http-methods.test.js +114 -0
  192. package/test/http-methods/get.test.js +412 -0
  193. package/test/http-methods/head.test.js +263 -0
  194. package/test/http-methods/lock.test.js +108 -0
  195. package/test/http-methods/mkcalendar.test.js +143 -0
  196. package/test/http-methods/mkcol.test.js +35 -0
  197. package/test/http-methods/move.test.js +42 -0
  198. package/test/http-methods/propfind.test.js +136 -0
  199. package/test/http-methods/proppatch.test.js +105 -0
  200. package/test/http-methods/report.test.js +142 -0
  201. package/test/http-methods/search.test.js +233 -0
  202. package/test/http-methods/trace.test.js +21 -0
  203. package/test/http-methods/unlock.test.js +38 -0
  204. package/test/http2/closing.test.js +270 -0
  205. package/test/http2/constraint.test.js +109 -0
  206. package/test/http2/head.test.js +34 -0
  207. package/test/http2/plain.test.js +68 -0
  208. package/test/http2/secure-with-fallback.test.js +113 -0
  209. package/test/http2/secure.test.js +67 -0
  210. package/test/http2/unknown-http-method.test.js +34 -0
  211. package/test/https/custom-https-server.test.js +58 -0
  212. package/test/https/https.test.js +136 -0
  213. package/test/imports.test.js +17 -0
  214. package/test/inject.test.js +502 -0
  215. package/test/input-validation.js +335 -0
  216. package/test/internals/all.test.js +38 -0
  217. package/test/internals/content-type-parser.test.js +111 -0
  218. package/test/internals/context.test.js +31 -0
  219. package/test/internals/decorator.test.js +156 -0
  220. package/test/internals/errors.test.js +982 -0
  221. package/test/internals/handle-request.test.js +270 -0
  222. package/test/internals/hook-runner.test.js +449 -0
  223. package/test/internals/hooks.test.js +96 -0
  224. package/test/internals/initial-config.test.js +383 -0
  225. package/test/internals/logger.test.js +163 -0
  226. package/test/internals/plugin.test.js +170 -0
  227. package/test/internals/promise.test.js +63 -0
  228. package/test/internals/reply-serialize.test.js +714 -0
  229. package/test/internals/reply.test.js +1920 -0
  230. package/test/internals/req-id-gen-factory.test.js +133 -0
  231. package/test/internals/request-validate.test.js +1402 -0
  232. package/test/internals/request.test.js +506 -0
  233. package/test/internals/schema-controller-perf.test.js +40 -0
  234. package/test/internals/server.test.js +91 -0
  235. package/test/internals/validation.test.js +352 -0
  236. package/test/issue-4959.test.js +118 -0
  237. package/test/keep-alive-timeout.test.js +42 -0
  238. package/test/listen.1.test.js +154 -0
  239. package/test/listen.2.test.js +113 -0
  240. package/test/listen.3.test.js +83 -0
  241. package/test/listen.4.test.js +168 -0
  242. package/test/listen.5.test.js +122 -0
  243. package/test/logger/instantiation.test.js +341 -0
  244. package/test/logger/logger-test-utils.js +47 -0
  245. package/test/logger/logging.test.js +460 -0
  246. package/test/logger/options.test.js +579 -0
  247. package/test/logger/request.test.js +292 -0
  248. package/test/logger/response.test.js +183 -0
  249. package/test/logger/tap-parallel-not-ok +0 -0
  250. package/test/max-requests-per-socket.test.js +113 -0
  251. package/test/middleware.test.js +37 -0
  252. package/test/noop-set.test.js +19 -0
  253. package/test/nullable-validation.test.js +187 -0
  254. package/test/options.error-handler.test.js +5 -0
  255. package/test/options.test.js +5 -0
  256. package/test/output-validation.test.js +140 -0
  257. package/test/patch.error-handler.test.js +5 -0
  258. package/test/patch.test.js +5 -0
  259. package/test/plugin.1.test.js +230 -0
  260. package/test/plugin.2.test.js +314 -0
  261. package/test/plugin.3.test.js +287 -0
  262. package/test/plugin.4.test.js +504 -0
  263. package/test/plugin.helper.js +8 -0
  264. package/test/plugin.name.display.js +10 -0
  265. package/test/post-empty-body.test.js +38 -0
  266. package/test/pretty-print.test.js +366 -0
  267. package/test/promises.test.js +125 -0
  268. package/test/proto-poisoning.test.js +145 -0
  269. package/test/put.error-handler.test.js +5 -0
  270. package/test/put.test.js +5 -0
  271. package/test/register.test.js +184 -0
  272. package/test/reply-code.test.js +148 -0
  273. package/test/reply-early-hints.test.js +100 -0
  274. package/test/reply-error.test.js +815 -0
  275. package/test/reply-trailers.test.js +445 -0
  276. package/test/reply-web-stream-locked.test.js +37 -0
  277. package/test/request-error.test.js +624 -0
  278. package/test/request-header-host.test.js +339 -0
  279. package/test/request-id.test.js +118 -0
  280. package/test/request-timeout.test.js +53 -0
  281. package/test/route-hooks.test.js +635 -0
  282. package/test/route-prefix.test.js +904 -0
  283. package/test/route-shorthand.test.js +48 -0
  284. package/test/route.1.test.js +259 -0
  285. package/test/route.2.test.js +100 -0
  286. package/test/route.3.test.js +213 -0
  287. package/test/route.4.test.js +127 -0
  288. package/test/route.5.test.js +211 -0
  289. package/test/route.6.test.js +306 -0
  290. package/test/route.7.test.js +406 -0
  291. package/test/route.8.test.js +225 -0
  292. package/test/router-options.test.js +1108 -0
  293. package/test/same-shape.test.js +124 -0
  294. package/test/schema-examples.test.js +661 -0
  295. package/test/schema-feature.test.js +2198 -0
  296. package/test/schema-serialization.test.js +1171 -0
  297. package/test/schema-special-usage.test.js +1348 -0
  298. package/test/schema-validation.test.js +1572 -0
  299. package/test/scripts/validate-ecosystem-links.test.js +339 -0
  300. package/test/serialize-response.test.js +186 -0
  301. package/test/server.test.js +347 -0
  302. package/test/set-error-handler.test.js +69 -0
  303. package/test/skip-reply-send.test.js +317 -0
  304. package/test/stream-serializers.test.js +40 -0
  305. package/test/stream.1.test.js +94 -0
  306. package/test/stream.2.test.js +129 -0
  307. package/test/stream.3.test.js +198 -0
  308. package/test/stream.4.test.js +176 -0
  309. package/test/stream.5.test.js +188 -0
  310. package/test/sync-routes.test.js +32 -0
  311. package/test/throw.test.js +359 -0
  312. package/test/toolkit.js +63 -0
  313. package/test/trust-proxy.test.js +162 -0
  314. package/test/type-provider.test.js +22 -0
  315. package/test/types/content-type-parser.test-d.ts +72 -0
  316. package/test/types/decorate-request-reply.test-d.ts +18 -0
  317. package/test/types/dummy-plugin.ts +9 -0
  318. package/test/types/errors.test-d.ts +90 -0
  319. package/test/types/fastify.test-d.ts +352 -0
  320. package/test/types/hooks.test-d.ts +550 -0
  321. package/test/types/import.ts +2 -0
  322. package/test/types/instance.test-d.ts +588 -0
  323. package/test/types/logger.test-d.ts +277 -0
  324. package/test/types/plugin.test-d.ts +97 -0
  325. package/test/types/register.test-d.ts +237 -0
  326. package/test/types/reply.test-d.ts +254 -0
  327. package/test/types/request.test-d.ts +188 -0
  328. package/test/types/route.test-d.ts +553 -0
  329. package/test/types/schema.test-d.ts +135 -0
  330. package/test/types/serverFactory.test-d.ts +37 -0
  331. package/test/types/type-provider.test-d.ts +1213 -0
  332. package/test/types/using.test-d.ts +17 -0
  333. package/test/upgrade.test.js +52 -0
  334. package/test/url-rewriting.test.js +122 -0
  335. package/test/use-semicolon-delimiter.test.js +168 -0
  336. package/test/validation-error-handling.test.js +900 -0
  337. package/test/versioned-routes.test.js +603 -0
  338. package/test/web-api.test.js +616 -0
  339. package/test/wrap-thenable.test.js +30 -0
  340. package/types/content-type-parser.d.ts +75 -0
  341. package/types/context.d.ts +22 -0
  342. package/types/errors.d.ts +92 -0
  343. package/types/hooks.d.ts +875 -0
  344. package/types/instance.d.ts +609 -0
  345. package/types/logger.d.ts +107 -0
  346. package/types/plugin.d.ts +44 -0
  347. package/types/register.d.ts +42 -0
  348. package/types/reply.d.ts +81 -0
  349. package/types/request.d.ts +95 -0
  350. package/types/route.d.ts +199 -0
  351. package/types/schema.d.ts +61 -0
  352. package/types/server-factory.d.ts +19 -0
  353. package/types/type-provider.d.ts +130 -0
  354. package/types/utils.d.ts +98 -0
@@ -0,0 +1,1162 @@
1
+ 'use strict'
2
+
3
+ const { test, before } = require('node:test')
4
+ const Fastify = require('../fastify')
5
+ const fp = require('fastify-plugin')
6
+ const split = require('split2')
7
+ const helper = require('./helper')
8
+ const { kState } = require('../lib/symbols')
9
+ const { networkInterfaces } = require('node:os')
10
+
11
+ const isIPv6Missing = !Object.values(networkInterfaces()).flat().some(({ family }) => family === 'IPv6')
12
+
13
+ let localhost
14
+ before(async function () {
15
+ [localhost] = await helper.getLoopbackHost()
16
+ })
17
+
18
+ test('onListen should not be processed when .ready() is called', (t, testDone) => {
19
+ t.plan(1)
20
+ const fastify = Fastify()
21
+ t.after(() => fastify.close())
22
+
23
+ fastify.addHook('onListen', function (done) {
24
+ t.assert.fail()
25
+ done()
26
+ })
27
+
28
+ fastify.ready(err => {
29
+ t.assert.ifError(err)
30
+ testDone()
31
+ })
32
+ })
33
+
34
+ test('localhost onListen should be called in order', (t, testDone) => {
35
+ t.plan(2)
36
+ const fastify = Fastify()
37
+ t.after(() => fastify.close())
38
+ let order = 0
39
+
40
+ fastify.addHook('onListen', function (done) {
41
+ t.assert.strictEqual(++order, 1, '1st called in root')
42
+ done()
43
+ })
44
+
45
+ fastify.addHook('onListen', function (done) {
46
+ t.assert.strictEqual(++order, 2, '2nd called in root')
47
+ done()
48
+ })
49
+
50
+ fastify.listen({
51
+ host: 'localhost',
52
+ port: 0
53
+ }, testDone)
54
+ })
55
+
56
+ test('localhost async onListen should be called in order', async t => {
57
+ t.plan(3)
58
+ const fastify = Fastify()
59
+ t.after(() => fastify.close())
60
+ let order = 0
61
+
62
+ fastify.addHook('onListen', async function () {
63
+ t.assert.strictEqual(++order, 1, '1st async called in root')
64
+ })
65
+
66
+ fastify.addHook('onListen', async function () {
67
+ t.assert.strictEqual(++order, 2, '2nd async called in root')
68
+ })
69
+
70
+ await fastify.listen({
71
+ host: 'localhost',
72
+ port: 0
73
+ })
74
+ t.assert.strictEqual(order, 2, 'the onListen hooks are awaited')
75
+ })
76
+
77
+ test('localhost onListen sync should log errors as warnings and continue /1', async t => {
78
+ t.plan(8)
79
+ let order = 0
80
+ const stream = split(JSON.parse)
81
+ const fastify = Fastify({
82
+ forceCloseConnections: false,
83
+ logger: {
84
+ stream,
85
+ level: 'info'
86
+ }
87
+ })
88
+ t.after(() => fastify.close())
89
+
90
+ stream.on('data', message => {
91
+ if (message.msg.includes('FAIL ON LISTEN')) {
92
+ t.assert.strictEqual(order, 2)
93
+ t.assert.ok('Logged Error Message')
94
+ }
95
+ })
96
+
97
+ fastify.addHook('onListen', function (done) {
98
+ t.assert.strictEqual(++order, 1, '1st call')
99
+ t.assert.ok('called in root')
100
+ done()
101
+ })
102
+
103
+ fastify.addHook('onListen', function (done) {
104
+ t.assert.strictEqual(++order, 2, '2nd call')
105
+ t.assert.ok('called onListen error')
106
+ throw new Error('FAIL ON LISTEN')
107
+ })
108
+
109
+ fastify.addHook('onListen', function (done) {
110
+ t.assert.strictEqual(++order, 3, '3rd call')
111
+ t.assert.ok('onListen hooks continue after error')
112
+ done()
113
+ })
114
+
115
+ await fastify.listen({
116
+ host: 'localhost',
117
+ port: 0
118
+ })
119
+ })
120
+
121
+ test('localhost onListen sync should log errors as warnings and continue /2', (t, testDone) => {
122
+ t.plan(7)
123
+ const stream = split(JSON.parse)
124
+ const fastify = Fastify({
125
+ forceCloseConnections: false,
126
+ logger: {
127
+ stream,
128
+ level: 'info'
129
+ }
130
+ })
131
+ t.after(() => fastify.close())
132
+
133
+ let order = 0
134
+
135
+ stream.on('data', message => {
136
+ if (message.msg.includes('FAIL ON LISTEN')) {
137
+ t.assert.ok('Logged Error Message')
138
+ }
139
+ })
140
+
141
+ fastify.addHook('onListen', function (done) {
142
+ t.assert.strictEqual(++order, 1, '1st call')
143
+ t.assert.ok('called in root')
144
+ done()
145
+ })
146
+
147
+ fastify.addHook('onListen', function (done) {
148
+ t.assert.strictEqual(++order, 2, '2nd call')
149
+ t.assert.ok('called onListen error')
150
+ done(new Error('FAIL ON LISTEN'))
151
+ })
152
+
153
+ fastify.addHook('onListen', function (done) {
154
+ t.assert.strictEqual(++order, 3, '3rd call')
155
+ t.assert.ok('onListen hooks continue after error')
156
+ done()
157
+ })
158
+
159
+ fastify.listen({
160
+ host: 'localhost',
161
+ port: 0
162
+ }, testDone)
163
+ })
164
+
165
+ test('localhost onListen async should log errors as warnings and continue', async t => {
166
+ t.plan(4)
167
+ const stream = split(JSON.parse)
168
+ const fastify = Fastify({
169
+ forceCloseConnections: false,
170
+ logger: {
171
+ stream,
172
+ level: 'info'
173
+ }
174
+ })
175
+ t.after(() => fastify.close())
176
+
177
+ stream.on('data', message => {
178
+ if (message.msg.includes('FAIL ON LISTEN')) {
179
+ t.assert.ok('Logged Error Message')
180
+ }
181
+ })
182
+
183
+ fastify.addHook('onListen', async function () {
184
+ t.assert.ok('called in root')
185
+ })
186
+
187
+ fastify.addHook('onListen', async function () {
188
+ t.assert.ok('called onListen error')
189
+ throw new Error('FAIL ON LISTEN')
190
+ })
191
+
192
+ fastify.addHook('onListen', async function () {
193
+ t.assert.ok('onListen hooks continue after error')
194
+ })
195
+
196
+ await fastify.listen({
197
+ host: 'localhost',
198
+ port: 0
199
+ })
200
+ })
201
+
202
+ test('localhost Register onListen hook after a plugin inside a plugin', (t, testDone) => {
203
+ t.plan(3)
204
+ const fastify = Fastify()
205
+ t.after(() => fastify.close())
206
+
207
+ fastify.register(fp(function (instance, opts, done) {
208
+ instance.addHook('onListen', function (done) {
209
+ t.assert.ok('called')
210
+ done()
211
+ })
212
+ done()
213
+ }))
214
+
215
+ fastify.register(fp(function (instance, opts, done) {
216
+ instance.addHook('onListen', function (done) {
217
+ t.assert.ok('called')
218
+ done()
219
+ })
220
+
221
+ instance.addHook('onListen', function (done) {
222
+ t.assert.ok('called')
223
+ done()
224
+ })
225
+
226
+ done()
227
+ }))
228
+
229
+ fastify.listen({
230
+ host: 'localhost',
231
+ port: 0
232
+ }, testDone)
233
+ })
234
+
235
+ test('localhost Register onListen hook after a plugin inside a plugin should log errors as warnings and continue', (t, testDone) => {
236
+ t.plan(6)
237
+ const stream = split(JSON.parse)
238
+ const fastify = Fastify({
239
+ forceCloseConnections: false,
240
+ logger: {
241
+ stream,
242
+ level: 'info'
243
+ }
244
+ })
245
+ t.after(() => fastify.close())
246
+
247
+ stream.on('data', message => {
248
+ if (message.msg.includes('Plugin Error')) {
249
+ t.assert.ok('Logged Error Message')
250
+ }
251
+ })
252
+
253
+ fastify.register(fp(function (instance, opts, done) {
254
+ instance.addHook('onListen', function () {
255
+ t.assert.ok('called')
256
+ throw new Error('Plugin Error')
257
+ })
258
+ done()
259
+ }))
260
+
261
+ fastify.register(fp(function (instance, opts, done) {
262
+ instance.addHook('onListen', function () {
263
+ t.assert.ok('called')
264
+ throw new Error('Plugin Error')
265
+ })
266
+
267
+ instance.addHook('onListen', function () {
268
+ t.assert.ok('called')
269
+ throw new Error('Plugin Error')
270
+ })
271
+
272
+ done()
273
+ }))
274
+
275
+ fastify.listen({
276
+ host: 'localhost',
277
+ port: 0
278
+ }, testDone)
279
+ })
280
+
281
+ test('localhost onListen encapsulation should be called in order', async t => {
282
+ t.plan(8)
283
+ const fastify = Fastify()
284
+ t.after(() => fastify.close())
285
+
286
+ let order = 0
287
+
288
+ fastify.addHook('onListen', function (done) {
289
+ t.assert.strictEqual(++order, 1, 'called in root')
290
+ t.assert.strictEqual(this.pluginName, fastify.pluginName, 'the this binding is the right instance')
291
+ done()
292
+ })
293
+
294
+ await fastify.register(async (childOne, o) => {
295
+ childOne.addHook('onListen', function (done) {
296
+ t.assert.strictEqual(++order, 2, 'called in childOne')
297
+ t.assert.strictEqual(this.pluginName, childOne.pluginName, 'the this binding is the right instance')
298
+ done()
299
+ })
300
+
301
+ await childOne.register(async (childTwo, o) => {
302
+ childTwo.addHook('onListen', async function () {
303
+ t.assert.strictEqual(++order, 3, 'called in childTwo')
304
+ t.assert.strictEqual(this.pluginName, childTwo.pluginName, 'the this binding is the right instance')
305
+ })
306
+ })
307
+
308
+ await childOne.register(async (childTwoPeer, o) => {
309
+ childTwoPeer.addHook('onListen', async function () {
310
+ t.assert.strictEqual(++order, 4, 'called second in childTwo')
311
+ t.assert.strictEqual(this.pluginName, childTwoPeer.pluginName, 'the this binding is the right instance')
312
+ })
313
+ })
314
+ })
315
+ await fastify.listen({
316
+ host: 'localhost',
317
+ port: 0
318
+ })
319
+ })
320
+
321
+ test('localhost onListen encapsulation with only nested hook', async t => {
322
+ t.plan(1)
323
+ const fastify = Fastify()
324
+ t.after(() => fastify.close())
325
+
326
+ await fastify.register(async (child) => {
327
+ await child.register(async (child2) => {
328
+ child2.addHook('onListen', function (done) {
329
+ t.assert.ok()
330
+ done()
331
+ })
332
+ })
333
+ })
334
+
335
+ await fastify.listen({
336
+ host: 'localhost',
337
+ port: 0
338
+ })
339
+ })
340
+
341
+ test('localhost onListen peer encapsulations with only nested hooks', async t => {
342
+ t.plan(2)
343
+ const fastify = Fastify()
344
+ t.after(() => fastify.close())
345
+
346
+ await fastify.register(async (child) => {
347
+ await child.register(async (child2) => {
348
+ child2.addHook('onListen', function (done) {
349
+ t.assert.ok()
350
+ done()
351
+ })
352
+ })
353
+
354
+ await child.register(async (child2) => {
355
+ child2.addHook('onListen', function (done) {
356
+ t.assert.ok()
357
+ done()
358
+ })
359
+ })
360
+ })
361
+
362
+ await fastify.listen({
363
+ host: 'localhost',
364
+ port: 0
365
+ })
366
+ })
367
+
368
+ test('localhost onListen encapsulation should be called in order and should log errors as warnings and continue', (t, testDone) => {
369
+ t.plan(7)
370
+ const stream = split(JSON.parse)
371
+ const fastify = Fastify({
372
+ forceCloseConnections: false,
373
+ logger: {
374
+ stream,
375
+ level: 'info'
376
+ }
377
+ })
378
+ t.after(() => fastify.close())
379
+
380
+ stream.on('data', message => {
381
+ if (message.msg.includes('Error in onListen hook of childTwo')) {
382
+ t.assert.ok('Logged Error Message')
383
+ }
384
+ })
385
+
386
+ let order = 0
387
+
388
+ fastify.addHook('onListen', function (done) {
389
+ t.assert.strictEqual(++order, 1, 'called in root')
390
+ t.assert.strictEqual(this.pluginName, fastify.pluginName, 'the this binding is the right instance')
391
+ done()
392
+ })
393
+
394
+ fastify.register(async (childOne, o) => {
395
+ childOne.addHook('onListen', function (done) {
396
+ t.assert.strictEqual(++order, 2, 'called in childOne')
397
+ t.assert.strictEqual(this.pluginName, childOne.pluginName, 'the this binding is the right instance')
398
+ done()
399
+ })
400
+ childOne.register(async (childTwo, o) => {
401
+ childTwo.addHook('onListen', async function () {
402
+ t.assert.strictEqual(++order, 3, 'called in childTwo')
403
+ t.assert.strictEqual(this.pluginName, childTwo.pluginName, 'the this binding is the right instance')
404
+ throw new Error('Error in onListen hook of childTwo')
405
+ })
406
+ })
407
+ })
408
+ fastify.listen({
409
+ host: 'localhost',
410
+ port: 0
411
+ }, testDone)
412
+ })
413
+
414
+ test('non-localhost onListen should be called in order', { skip: isIPv6Missing }, (t, testDone) => {
415
+ t.plan(2)
416
+
417
+ const fastify = Fastify()
418
+ t.after(() => fastify.close())
419
+
420
+ let order = 0
421
+
422
+ fastify.addHook('onListen', function (done) {
423
+ t.assert.strictEqual(++order, 1, '1st called in root')
424
+ done()
425
+ })
426
+
427
+ fastify.addHook('onListen', function (done) {
428
+ t.assert.strictEqual(++order, 2, '2nd called in root')
429
+ done()
430
+ })
431
+ fastify.listen({
432
+ host: '::1',
433
+ port: 0
434
+ }, testDone)
435
+ })
436
+
437
+ test('non-localhost async onListen should be called in order', { skip: isIPv6Missing }, async t => {
438
+ t.plan(2)
439
+ const fastify = Fastify()
440
+ t.after(() => fastify.close())
441
+ let order = 0
442
+
443
+ fastify.addHook('onListen', async function () {
444
+ t.assert.strictEqual(++order, 1, '1st async called in root')
445
+ })
446
+
447
+ fastify.addHook('onListen', async function () {
448
+ t.assert.strictEqual(++order, 2, '2nd async called in root')
449
+ })
450
+
451
+ await fastify.listen({
452
+ host: '::1',
453
+ port: 0
454
+ })
455
+ })
456
+
457
+ test('non-localhost sync onListen should log errors as warnings and continue', { skip: isIPv6Missing }, (t, testDone) => {
458
+ t.plan(4)
459
+ const stream = split(JSON.parse)
460
+ const fastify = Fastify({
461
+ forceCloseConnections: false,
462
+ logger: {
463
+ stream,
464
+ level: 'info'
465
+ }
466
+ })
467
+ t.after(() => fastify.close())
468
+
469
+ stream.on('data', message => {
470
+ if (message.msg.includes('FAIL ON LISTEN')) {
471
+ t.assert.ok('Logged Error Message')
472
+ }
473
+ })
474
+ let order = 0
475
+
476
+ fastify.addHook('onListen', function (done) {
477
+ t.assert.strictEqual(++order, 1)
478
+ done()
479
+ })
480
+
481
+ fastify.addHook('onListen', function () {
482
+ t.assert.strictEqual(++order, 2)
483
+ throw new Error('FAIL ON LISTEN')
484
+ })
485
+
486
+ fastify.addHook('onListen', function (done) {
487
+ t.assert.strictEqual(++order, 3, 'should still run')
488
+ done()
489
+ })
490
+
491
+ fastify.listen({
492
+ host: '::1',
493
+ port: 0
494
+ }, testDone)
495
+ })
496
+
497
+ test('non-localhost async onListen should log errors as warnings and continue', { skip: isIPv6Missing }, async t => {
498
+ t.plan(6)
499
+ const stream = split(JSON.parse)
500
+ const fastify = Fastify({
501
+ forceCloseConnections: false,
502
+ logger: {
503
+ stream,
504
+ level: 'info'
505
+ }
506
+ })
507
+ t.after(() => fastify.close())
508
+
509
+ stream.on('data', message => {
510
+ if (message.msg.includes('FAIL ON LISTEN')) {
511
+ t.assert.ok('Logged Error Message')
512
+ }
513
+ })
514
+
515
+ let order = 0
516
+
517
+ fastify.addHook('onListen', async function () {
518
+ t.assert.strictEqual(++order, 1)
519
+ t.assert.ok('called in root')
520
+ })
521
+
522
+ fastify.addHook('onListen', async function () {
523
+ t.assert.strictEqual(++order, 2, '2nd async failed in root')
524
+ throw new Error('FAIL ON LISTEN')
525
+ })
526
+
527
+ fastify.addHook('onListen', async function () {
528
+ t.assert.strictEqual(++order, 3)
529
+ t.assert.ok('should still run')
530
+ })
531
+
532
+ await fastify.listen({
533
+ host: '::1',
534
+ port: 0
535
+ })
536
+ })
537
+
538
+ test('non-localhost Register onListen hook after a plugin inside a plugin', { skip: isIPv6Missing }, (t, testDone) => {
539
+ t.plan(3)
540
+ const fastify = Fastify()
541
+ t.after(() => fastify.close())
542
+
543
+ fastify.register(fp(function (instance, opts, done) {
544
+ instance.addHook('onListen', function (done) {
545
+ t.assert.ok('called')
546
+ done()
547
+ })
548
+ done()
549
+ }))
550
+
551
+ fastify.register(fp(function (instance, opts, done) {
552
+ instance.addHook('onListen', function (done) {
553
+ t.assert.ok('called')
554
+ done()
555
+ })
556
+
557
+ instance.addHook('onListen', function (done) {
558
+ t.assert.ok('called')
559
+ done()
560
+ })
561
+
562
+ done()
563
+ }))
564
+
565
+ fastify.listen({
566
+ host: '::1',
567
+ port: 0
568
+ }, testDone)
569
+ })
570
+
571
+ test('non-localhost Register onListen hook after a plugin inside a plugin should log errors as warnings and continue', { skip: isIPv6Missing }, (t, testDone) => {
572
+ t.plan(6)
573
+ const stream = split(JSON.parse)
574
+ const fastify = Fastify({
575
+ forceCloseConnections: false,
576
+ logger: {
577
+ stream,
578
+ level: 'info'
579
+ }
580
+ })
581
+ t.after(() => fastify.close())
582
+
583
+ stream.on('data', message => {
584
+ if (message.msg.includes('Plugin Error')) {
585
+ t.assert.ok('Logged Error Message')
586
+ }
587
+ })
588
+
589
+ fastify.register(fp(function (instance, opts, done) {
590
+ instance.addHook('onListen', function () {
591
+ t.assert.ok('called')
592
+ throw new Error('Plugin Error')
593
+ })
594
+ done()
595
+ }))
596
+
597
+ fastify.register(fp(function (instance, opts, done) {
598
+ instance.addHook('onListen', function () {
599
+ t.assert.ok('called')
600
+ throw new Error('Plugin Error')
601
+ })
602
+
603
+ instance.addHook('onListen', function () {
604
+ t.assert.ok('called')
605
+ throw new Error('Plugin Error')
606
+ })
607
+
608
+ done()
609
+ }))
610
+
611
+ fastify.listen({
612
+ host: '::1',
613
+ port: 0
614
+ }, testDone)
615
+ })
616
+
617
+ test('non-localhost onListen encapsulation should be called in order', { skip: isIPv6Missing }, (t, testDone) => {
618
+ t.plan(6)
619
+ const fastify = Fastify()
620
+ t.after(() => fastify.close())
621
+
622
+ let order = 0
623
+
624
+ fastify.addHook('onListen', function (done) {
625
+ t.assert.strictEqual(++order, 1, 'called in root')
626
+ t.assert.strictEqual(this.pluginName, fastify.pluginName, 'the this binding is the right instance')
627
+ done()
628
+ })
629
+
630
+ fastify.register(async (childOne, o) => {
631
+ childOne.addHook('onListen', function (done) {
632
+ t.assert.strictEqual(++order, 2, 'called in childOne')
633
+ t.assert.strictEqual(this.pluginName, childOne.pluginName, 'the this binding is the right instance')
634
+ done()
635
+ })
636
+ childOne.register(async (childTwo, o) => {
637
+ childTwo.addHook('onListen', async function () {
638
+ t.assert.strictEqual(++order, 3, 'called in childTwo')
639
+ t.assert.strictEqual(this.pluginName, childTwo.pluginName, 'the this binding is the right instance')
640
+ })
641
+ })
642
+ })
643
+ fastify.listen({
644
+ host: '::1',
645
+ port: 0
646
+ }, testDone)
647
+ })
648
+
649
+ test('non-localhost onListen encapsulation should be called in order and should log errors as warnings and continue', { skip: isIPv6Missing }, (t, testDone) => {
650
+ t.plan(7)
651
+ const stream = split(JSON.parse)
652
+ const fastify = Fastify({
653
+ forceCloseConnections: false,
654
+ logger: {
655
+ stream,
656
+ level: 'info'
657
+ }
658
+ })
659
+ t.after(() => fastify.close())
660
+
661
+ stream.on('data', message => {
662
+ if (message.msg.includes('Error in onListen hook of childTwo')) {
663
+ t.assert.ok('Logged Error Message')
664
+ }
665
+ })
666
+
667
+ let order = 0
668
+
669
+ fastify.addHook('onListen', function (done) {
670
+ t.assert.strictEqual(++order, 1, 'called in root')
671
+
672
+ t.assert.strictEqual(this.pluginName, fastify.pluginName, 'the this binding is the right instance')
673
+ done()
674
+ })
675
+
676
+ fastify.register(async (childOne, o) => {
677
+ childOne.addHook('onListen', function (done) {
678
+ t.assert.strictEqual(++order, 2, 'called in childOne')
679
+ t.assert.strictEqual(this.pluginName, childOne.pluginName, 'the this binding is the right instance')
680
+ done()
681
+ })
682
+ childOne.register(async (childTwo, o) => {
683
+ childTwo.addHook('onListen', async function () {
684
+ t.assert.strictEqual(++order, 3, 'called in childTwo')
685
+ t.assert.strictEqual(this.pluginName, childTwo.pluginName, 'the this binding is the right instance')
686
+ throw new Error('Error in onListen hook of childTwo')
687
+ })
688
+ })
689
+ })
690
+ fastify.listen({
691
+ host: '::1',
692
+ port: 0
693
+ }, testDone)
694
+ })
695
+
696
+ test('onListen localhost should work in order with callback', (t, testDone) => {
697
+ t.plan(4)
698
+ const fastify = Fastify()
699
+ t.after(() => fastify.close())
700
+ let order = 0
701
+
702
+ fastify.addHook('onListen', function (done) {
703
+ t.assert.strictEqual(++order, 1, '1st called in root')
704
+ done()
705
+ })
706
+
707
+ fastify.addHook('onListen', function (done) {
708
+ t.assert.strictEqual(++order, 2, '2nd called in root')
709
+ done()
710
+ })
711
+
712
+ fastify.listen({ port: 0 }, (err) => {
713
+ t.assert.strictEqual(fastify.server.address().address, localhost)
714
+ t.assert.ifError(err)
715
+ testDone()
716
+ })
717
+ })
718
+
719
+ test('onListen localhost should work in order with callback in async', (t, testDone) => {
720
+ t.plan(4)
721
+ const fastify = Fastify()
722
+ t.after(() => fastify.close())
723
+ let order = 0
724
+
725
+ fastify.addHook('onListen', async function () {
726
+ t.assert.strictEqual(++order, 1, '1st called in root')
727
+ })
728
+
729
+ fastify.addHook('onListen', async function () {
730
+ t.assert.strictEqual(++order, 2, '2nd called in root')
731
+ })
732
+
733
+ fastify.listen({ host: 'localhost', port: 0 }, (err) => {
734
+ t.assert.strictEqual(fastify.server.address().address, localhost)
735
+ t.assert.ifError(err)
736
+ testDone()
737
+ })
738
+ })
739
+
740
+ test('onListen localhost sync with callback should log errors as warnings and continue', (t, testDone) => {
741
+ t.plan(6)
742
+ const stream = split(JSON.parse)
743
+ const fastify = Fastify({
744
+ forceCloseConnections: false,
745
+ logger: {
746
+ stream,
747
+ level: 'info'
748
+ }
749
+ })
750
+ t.after(() => fastify.close())
751
+
752
+ stream.on('data', message => {
753
+ if (message.msg.includes('FAIL ON LISTEN')) {
754
+ t.assert.ok('Logged Error Message')
755
+ }
756
+ })
757
+
758
+ let order = 0
759
+
760
+ fastify.addHook('onListen', function (done) {
761
+ t.assert.strictEqual(++order, 1, '1st called in root')
762
+ done()
763
+ })
764
+
765
+ fastify.addHook('onListen', function () {
766
+ t.assert.strictEqual(++order, 2, 'error sync called in root')
767
+ throw new Error('FAIL ON LISTEN')
768
+ })
769
+
770
+ fastify.addHook('onListen', function (done) {
771
+ t.assert.strictEqual(++order, 3, '1st called in root')
772
+ done()
773
+ })
774
+
775
+ fastify.listen({ port: 0 }, (err) => {
776
+ t.assert.ifError(err)
777
+ t.assert.strictEqual(fastify.server.address().address, localhost)
778
+ testDone()
779
+ })
780
+ })
781
+
782
+ test('onListen localhost async with callback should log errors as warnings and continue', (t, testDone) => {
783
+ t.plan(6)
784
+ const stream = split(JSON.parse)
785
+ const fastify = Fastify({
786
+ forceCloseConnections: false,
787
+ logger: {
788
+ stream,
789
+ level: 'info'
790
+ }
791
+ })
792
+ t.after(() => fastify.close())
793
+
794
+ stream.on('data', message => {
795
+ if (message.msg.includes('FAIL ON LISTEN')) {
796
+ t.assert.ok('Logged Error Message')
797
+ }
798
+ })
799
+
800
+ let order = 0
801
+
802
+ fastify.addHook('onListen', async function () {
803
+ t.assert.ok('1st called in root')
804
+ })
805
+
806
+ fastify.addHook('onListen', async function () {
807
+ t.assert.strictEqual(++order, 1, 'error sync called in root')
808
+ throw new Error('FAIL ON LISTEN')
809
+ })
810
+
811
+ fastify.addHook('onListen', async function () {
812
+ t.assert.ok('3rd called in root')
813
+ })
814
+
815
+ fastify.listen({ port: 0 }, (err) => {
816
+ t.assert.ifError(err)
817
+ t.assert.strictEqual(fastify.server.address().address, localhost)
818
+ testDone()
819
+ })
820
+ })
821
+
822
+ test('Register onListen hook localhost with callback after a plugin inside a plugin', (t, testDone) => {
823
+ t.plan(5)
824
+ const fastify = Fastify()
825
+ t.after(() => fastify.close())
826
+
827
+ fastify.register(fp(function (instance, opts, done) {
828
+ instance.addHook('onListen', function (done) {
829
+ t.assert.ok('called')
830
+ done()
831
+ })
832
+ done()
833
+ }))
834
+
835
+ fastify.register(fp(function (instance, opts, done) {
836
+ instance.addHook('onListen', function (done) {
837
+ t.assert.ok('called')
838
+ done()
839
+ })
840
+
841
+ instance.addHook('onListen', function (done) {
842
+ t.assert.ok('called')
843
+ done()
844
+ })
845
+
846
+ done()
847
+ }))
848
+
849
+ fastify.listen({ port: 0 }, (err) => {
850
+ t.assert.strictEqual(fastify.server.address().address, localhost)
851
+ t.assert.ifError(err)
852
+ testDone()
853
+ })
854
+ })
855
+
856
+ test('onListen localhost with callback encapsulation should be called in order', (t, testDone) => {
857
+ t.plan(8)
858
+ const fastify = Fastify()
859
+ t.after(() => fastify.close())
860
+
861
+ let order = 0
862
+
863
+ fastify.addHook('onListen', function (done) {
864
+ t.assert.strictEqual(++order, 1, 'called in root')
865
+ t.assert.strictEqual(this.pluginName, fastify.pluginName, 'the this binding is the right instance')
866
+ done()
867
+ })
868
+
869
+ fastify.register(async (childOne, o) => {
870
+ childOne.addHook('onListen', function (done) {
871
+ t.assert.strictEqual(++order, 2, 'called in childOne')
872
+ t.assert.strictEqual(this.pluginName, childOne.pluginName, 'the this binding is the right instance')
873
+ done()
874
+ })
875
+ childOne.register(async (childTwo, o) => {
876
+ childTwo.addHook('onListen', async function () {
877
+ t.assert.strictEqual(++order, 3, 'called in childTwo')
878
+ t.assert.strictEqual(this.pluginName, childTwo.pluginName, 'the this binding is the right instance')
879
+ })
880
+ })
881
+ })
882
+ fastify.listen({ port: 0 }, (err) => {
883
+ t.assert.strictEqual(fastify.server.address().address, localhost)
884
+ t.assert.ifError(err)
885
+ testDone()
886
+ })
887
+ })
888
+
889
+ test('onListen non-localhost should work in order with callback in sync', { skip: isIPv6Missing }, (t, testDone) => {
890
+ t.plan(4)
891
+ const fastify = Fastify()
892
+ t.after(() => fastify.close())
893
+ let order = 0
894
+
895
+ fastify.addHook('onListen', function (done) {
896
+ t.assert.strictEqual(++order, 1, '1st called in root')
897
+ done()
898
+ })
899
+
900
+ fastify.addHook('onListen', function (done) {
901
+ t.assert.strictEqual(++order, 2, '2nd called in root')
902
+ done()
903
+ })
904
+
905
+ fastify.listen({ host: '::1', port: 0 }, (err) => {
906
+ t.assert.strictEqual(fastify.server.address().address, '::1')
907
+ t.assert.ifError(err)
908
+ testDone()
909
+ })
910
+ })
911
+
912
+ test('onListen non-localhost should work in order with callback in async', { skip: isIPv6Missing }, (t, testDone) => {
913
+ t.plan(4)
914
+ const fastify = Fastify()
915
+ t.after(() => fastify.close())
916
+ let order = 0
917
+
918
+ fastify.addHook('onListen', async function () {
919
+ t.assert.strictEqual(++order, 1, '1st called in root')
920
+ })
921
+
922
+ fastify.addHook('onListen', async function () {
923
+ t.assert.strictEqual(++order, 2, '2nd called in root')
924
+ })
925
+
926
+ fastify.listen({ host: '::1', port: 0 }, (err) => {
927
+ t.assert.strictEqual(fastify.server.address().address, '::1')
928
+ t.assert.ifError(err)
929
+ testDone()
930
+ })
931
+ })
932
+
933
+ test('onListen non-localhost sync with callback should log errors as warnings and continue', { skip: isIPv6Missing }, (t, testDone) => {
934
+ t.plan(8)
935
+
936
+ const stream = split(JSON.parse)
937
+ const fastify = Fastify({
938
+ forceCloseConnections: false,
939
+ logger: {
940
+ stream,
941
+ level: 'info'
942
+ }
943
+ })
944
+ t.after(() => fastify.close())
945
+
946
+ stream.on('data', message => {
947
+ if (message.msg.includes('FAIL ON LISTEN')) {
948
+ t.assert.ok('Logged Error Message')
949
+ }
950
+ })
951
+
952
+ let order = 0
953
+
954
+ fastify.addHook('onListen', function (done) {
955
+ t.assert.strictEqual(++order, 1)
956
+ t.assert.ok('1st called in root')
957
+ done()
958
+ })
959
+
960
+ fastify.addHook('onListen', function () {
961
+ t.assert.strictEqual(++order, 2)
962
+ throw new Error('FAIL ON LISTEN')
963
+ })
964
+
965
+ fastify.addHook('onListen', function (done) {
966
+ t.assert.strictEqual(++order, 3)
967
+ t.assert.ok('3rd called in root')
968
+ done()
969
+ })
970
+
971
+ fastify.listen({ host: '::1', port: 0 }, (err) => {
972
+ t.assert.ifError(err)
973
+ t.assert.strictEqual(fastify.server.address().address, '::1')
974
+ testDone()
975
+ })
976
+ })
977
+
978
+ test('onListen non-localhost async with callback should log errors as warnings and continue', { skip: isIPv6Missing }, (t, testDone) => {
979
+ t.plan(8)
980
+
981
+ const stream = split(JSON.parse)
982
+ const fastify = Fastify({
983
+ forceCloseConnections: false,
984
+ logger: {
985
+ stream,
986
+ level: 'info'
987
+ }
988
+ })
989
+ t.after(() => fastify.close())
990
+
991
+ stream.on('data', message => {
992
+ if (message.msg.includes('FAIL ON LISTEN')) {
993
+ t.assert.ok('Logged Error Message')
994
+ }
995
+ })
996
+
997
+ let order = 0
998
+
999
+ fastify.addHook('onListen', async function () {
1000
+ t.assert.strictEqual(++order, 1)
1001
+ t.assert.ok('1st called in root')
1002
+ })
1003
+
1004
+ fastify.addHook('onListen', async function () {
1005
+ t.assert.strictEqual(++order, 2, 'error sync called in root')
1006
+ throw new Error('FAIL ON LISTEN')
1007
+ })
1008
+
1009
+ fastify.addHook('onListen', async function () {
1010
+ t.assert.strictEqual(++order, 3)
1011
+ t.assert.ok('3rd called in root')
1012
+ })
1013
+
1014
+ fastify.listen({ host: '::1', port: 0 }, (err) => {
1015
+ t.assert.ifError(err)
1016
+ t.assert.strictEqual(fastify.server.address().address, '::1')
1017
+ testDone()
1018
+ })
1019
+ })
1020
+
1021
+ test('Register onListen hook non-localhost with callback after a plugin inside a plugin', { skip: isIPv6Missing }, (t, testDone) => {
1022
+ t.plan(5)
1023
+ const fastify = Fastify()
1024
+ t.after(() => fastify.close())
1025
+
1026
+ fastify.register(fp(function (instance, opts, done) {
1027
+ instance.addHook('onListen', function (done) {
1028
+ t.assert.ok('called')
1029
+ done()
1030
+ })
1031
+ done()
1032
+ }))
1033
+
1034
+ fastify.register(fp(function (instance, opts, done) {
1035
+ instance.addHook('onListen', function (done) {
1036
+ t.assert.ok('called')
1037
+ done()
1038
+ })
1039
+
1040
+ instance.addHook('onListen', function (done) {
1041
+ t.assert.ok('called')
1042
+ done()
1043
+ })
1044
+
1045
+ done()
1046
+ }))
1047
+
1048
+ fastify.listen({ host: '::1', port: 0 }, (err) => {
1049
+ t.assert.strictEqual(fastify.server.address().address, '::1')
1050
+ t.assert.ifError(err)
1051
+ testDone()
1052
+ })
1053
+ })
1054
+
1055
+ test('onListen non-localhost with callback encapsulation should be called in order', { skip: isIPv6Missing }, (t, testDone) => {
1056
+ t.plan(8)
1057
+ const fastify = Fastify()
1058
+ t.after(() => fastify.close())
1059
+
1060
+ let order = 0
1061
+
1062
+ fastify.addHook('onListen', function (done) {
1063
+ t.assert.strictEqual(++order, 1, 'called in root')
1064
+ t.assert.strictEqual(this.pluginName, fastify.pluginName, 'the this binding is the right instance')
1065
+ done()
1066
+ })
1067
+
1068
+ fastify.register(async (childOne, o) => {
1069
+ childOne.addHook('onListen', function (done) {
1070
+ t.assert.strictEqual(++order, 2, 'called in childOne')
1071
+ t.assert.strictEqual(this.pluginName, childOne.pluginName, 'the this binding is the right instance')
1072
+ done()
1073
+ })
1074
+ childOne.register(async (childTwo, o) => {
1075
+ childTwo.addHook('onListen', async function () {
1076
+ t.assert.strictEqual(++order, 3, 'called in childTwo')
1077
+ t.assert.strictEqual(this.pluginName, childTwo.pluginName, 'the this binding is the right instance')
1078
+ })
1079
+ })
1080
+ })
1081
+ fastify.listen({ host: '::1', port: 0 }, (err) => {
1082
+ t.assert.strictEqual(fastify.server.address().address, '::1')
1083
+ t.assert.ifError(err)
1084
+ testDone()
1085
+ })
1086
+ })
1087
+
1088
+ test('onListen sync should work if user does not pass done', (t, testDone) => {
1089
+ t.plan(2)
1090
+ const fastify = Fastify()
1091
+ t.after(() => fastify.close())
1092
+ let order = 0
1093
+
1094
+ fastify.addHook('onListen', function () {
1095
+ t.assert.strictEqual(++order, 1, '1st called in root')
1096
+ })
1097
+
1098
+ fastify.addHook('onListen', function () {
1099
+ t.assert.strictEqual(++order, 2, '2nd called in root')
1100
+ })
1101
+
1102
+ fastify.listen({
1103
+ host: 'localhost',
1104
+ port: 0
1105
+ }, testDone)
1106
+ })
1107
+
1108
+ test('async onListen does not need to be awaited', (t, testDone) => {
1109
+ const fastify = Fastify()
1110
+ t.after(() => fastify.close())
1111
+ let order = 0
1112
+
1113
+ fastify.addHook('onListen', async function () {
1114
+ t.assert.strictEqual(++order, 1, '1st async called in root')
1115
+ })
1116
+
1117
+ fastify.addHook('onListen', async function () {
1118
+ t.assert.strictEqual(++order, 2, '2nd async called in root')
1119
+ t.end()
1120
+ })
1121
+
1122
+ fastify.listen({
1123
+ host: 'localhost',
1124
+ port: 0
1125
+ }, testDone)
1126
+ })
1127
+
1128
+ test('onListen hooks do not block /1', (t, testDone) => {
1129
+ t.plan(2)
1130
+
1131
+ const fastify = Fastify()
1132
+ t.after(() => fastify.close())
1133
+
1134
+ fastify.addHook('onListen', function (done) {
1135
+ t.assert.strictEqual(fastify[kState].listening, true)
1136
+ done()
1137
+ })
1138
+
1139
+ fastify.listen({
1140
+ host: 'localhost',
1141
+ port: 0
1142
+ }, err => {
1143
+ t.assert.ifError(err)
1144
+ testDone()
1145
+ })
1146
+ })
1147
+
1148
+ test('onListen hooks do not block /2', async t => {
1149
+ t.plan(1)
1150
+
1151
+ const fastify = Fastify()
1152
+ t.after(() => fastify.close())
1153
+
1154
+ fastify.addHook('onListen', async function () {
1155
+ t.assert.strictEqual(fastify[kState].listening, true)
1156
+ })
1157
+
1158
+ await fastify.listen({
1159
+ host: 'localhost',
1160
+ port: 0
1161
+ })
1162
+ })