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.
- package/.idea/fastify.iml +12 -0
- package/.idea/inspectionProfiles/Project_Default.xml +6 -0
- package/.idea/jsLibraryMappings.xml +6 -0
- package/.idea/jsLinters/eslint.xml +6 -0
- package/.idea/modules.xml +8 -0
- package/.idea/vcs.xml +6 -0
- package/.markdownlint-cli2.yaml +1 -1
- package/.taprc +4 -8
- package/README.md +3 -6
- package/build/build-error-serializer.js +4 -1
- package/build/build-validation.js +5 -4
- package/docs/Guides/Database.md +1 -1
- package/docs/Guides/Delay-Accepting-Requests.md +3 -3
- package/docs/Guides/Ecosystem.md +2 -0
- package/docs/Guides/Migration-Guide-V5.md +20 -0
- package/docs/Guides/Write-Type-Provider.md +4 -2
- package/docs/Reference/ContentTypeParser.md +30 -1
- package/docs/Reference/Decorators.md +42 -16
- package/docs/Reference/Errors.md +10 -2
- package/docs/Reference/Hooks.md +48 -14
- package/docs/Reference/Logging.md +5 -5
- package/docs/Reference/Reply.md +23 -18
- package/docs/Reference/Request.md +5 -1
- package/docs/Reference/Routes.md +24 -28
- package/docs/Reference/Server.md +14 -53
- package/docs/Reference/Type-Providers.md +21 -26
- package/docs/Reference/TypeScript.md +46 -29
- package/docs/Reference/Warnings.md +0 -8
- package/eslint.config.js +27 -0
- package/examples/typescript-server.ts +14 -14
- package/fastify.d.ts +15 -14
- package/fastify.js +41 -15
- package/lib/configValidator.js +94 -76
- package/lib/contentTypeParser.js +54 -88
- package/lib/decorate.js +3 -7
- package/lib/error-serializer.js +2 -1
- package/lib/errors.js +31 -6
- package/lib/handleRequest.js +70 -39
- package/lib/httpMethods.js +34 -18
- package/lib/logger.js +24 -6
- package/lib/pluginUtils.js +5 -5
- package/lib/reply.js +7 -10
- package/lib/request.js +37 -19
- package/lib/route.js +6 -34
- package/lib/server.js +62 -123
- package/lib/warnings.js +24 -29
- package/lib/wrapThenable.js +46 -22
- package/package.json +38 -58
- package/test/404s.test.js +8 -12
- package/test/async-await.test.js +46 -2
- package/test/build/error-serializer.test.js +4 -2
- package/test/check.test.js +225 -0
- package/test/close-pipelining.test.js +2 -41
- package/test/close.test.js +1 -41
- package/test/content-parser.test.js +69 -117
- package/test/custom-parser.1.test.js +40 -1
- package/test/decorator-namespace.test._js_ +31 -0
- package/test/decorator.test.js +92 -43
- package/test/delete.test.js +21 -1
- package/test/diagnostics-channel/404.test.js +57 -0
- package/test/diagnostics-channel/async-delay-request.test.js +74 -0
- package/test/diagnostics-channel/async-request.test.js +72 -0
- package/test/diagnostics-channel/error-before-handler.test.js +36 -0
- package/test/diagnostics-channel/error-request.test.js +61 -0
- package/test/diagnostics-channel/error-status.test.js +39 -0
- package/test/{diagnostics-channel.test.js → diagnostics-channel/init.test.js} +6 -16
- package/test/diagnostics-channel/sync-delay-request.test.js +58 -0
- package/test/diagnostics-channel/sync-request-reply.test.js +58 -0
- package/test/diagnostics-channel/sync-request.test.js +61 -0
- package/test/encapsulated-error-handler.test.js +201 -14
- package/test/esm/index.test.js +2 -12
- package/test/findRoute.test.js +16 -0
- package/test/genReqId.test.js +9 -0
- package/test/get.test.js +28 -0
- package/test/has-route.test.js +1 -1
- package/test/helper.js +1 -5
- package/test/hooks.test.js +0 -4
- package/test/http2/constraint.test.js +22 -1
- package/test/http2/plain.test.js +21 -6
- package/test/http2/secure.test.js +12 -1
- package/test/https/https.test.js +57 -0
- package/test/inject.test.js +1 -2
- package/test/internals/decorator.test.js +0 -2
- package/test/internals/errors.test.js +57 -17
- package/test/internals/handleRequest.test.js +5 -1
- package/test/internals/initialConfig.test.js +5 -5
- package/test/internals/logger.test.js +31 -2
- package/test/internals/reply.test.js +6 -78
- package/test/internals/request.test.js +13 -11
- package/test/listen.1.test.js +5 -15
- package/test/listen.5.test.js +99 -0
- package/test/logger/instantiation.test.js +8 -8
- package/test/logger/logging.test.js +4 -4
- package/test/logger/options.test.js +102 -21
- package/test/logger/response.test.js +6 -6
- package/test/maxRequestsPerSocket.test.js +2 -5
- package/test/method-missing.test.js +24 -0
- package/test/plugin.1.test.js +2 -4
- package/test/plugin.2.test.js +0 -2
- package/test/plugin.3.test.js +0 -2
- package/test/plugin.4.test.js +92 -56
- package/test/register.test.js +2 -4
- package/test/reply-earlyHints.test.js +98 -0
- package/test/reply-error.test.js +0 -2
- package/test/route-hooks.test.js +0 -1
- package/test/route-shorthand.test.js +60 -0
- package/test/schema-special-usage.test.js +1 -1
- package/test/server.test.js +17 -2
- package/test/stream.2.test.js +1 -1
- package/test/stream.4.test.js +0 -42
- package/test/stream.5.test.js +2 -2
- package/test/trust-proxy.test.js +33 -27
- package/test/types/errors.test-d.ts +0 -2
- package/test/types/fastify.test-d.ts +14 -12
- package/test/types/hooks.test-d.ts +1 -0
- package/test/types/import.ts +1 -0
- package/test/types/instance.test-d.ts +10 -51
- package/test/types/logger.test-d.ts +43 -6
- package/test/types/plugin.test-d.ts +5 -2
- package/test/types/register.test-d.ts +2 -2
- package/test/types/reply.test-d.ts +13 -12
- package/test/types/request.test-d.ts +19 -8
- package/test/types/route.test-d.ts +30 -2
- package/test/types/schema.test-d.ts +2 -2
- package/test/types/serverFactory.test-d.ts +1 -1
- package/test/types/type-provider.test-d.ts +59 -12
- package/test/types/using.test-d.ts +4 -1
- package/test/url-rewriting.test.js +3 -2
- package/test/useSemicolonDelimiter.test.js +3 -6
- package/test/versioned-routes.test.js +1 -1
- package/test/web-api.test.js +0 -6
- package/types/content-type-parser.d.ts +3 -3
- package/types/context.d.ts +0 -1
- package/types/errors.d.ts +1 -0
- package/types/hooks.d.ts +6 -6
- package/types/instance.d.ts +28 -41
- package/types/logger.d.ts +3 -3
- package/types/plugin.d.ts +3 -3
- package/types/reply.d.ts +9 -12
- package/types/request.d.ts +5 -3
- package/types/route.d.ts +31 -31
- package/types/schema.d.ts +3 -3
- package/types/serverFactory.d.ts +2 -2
- package/types/type-provider.d.ts +22 -12
- package/types/utils.d.ts +18 -23
- package/.c8rc.json +0 -8
- package/.eslintrc +0 -4
- package/.tap/processinfo/029eb7a1-1942-40bc-98e2-cef3b7a14b5e.json +0 -268
- package/.tap/processinfo/03c196c6-01c3-4268-a9b5-298dff18a873.json +0 -269
- package/.tap/processinfo/04bbabba-8611-4908-9092-dfa9fcc13327.json +0 -268
- package/.tap/processinfo/05d8a743-3edf-4e2d-ae5a-dc99d0855ba5.json +0 -272
- package/.tap/processinfo/07718963-36a8-4d87-82ad-366c877a5247.json +0 -268
- package/.tap/processinfo/08fe3bde-5814-4308-9158-cdf1e47391b7.json +0 -268
- package/.tap/processinfo/0a3e3fb0-eabf-4532-ae80-20434da22678.json +0 -268
- package/.tap/processinfo/0caf2a75-4b3a-46c4-9b41-c7e450e5e15f.json +0 -268
- package/.tap/processinfo/0cf35d52-e5b2-4884-bcf0-b0ab3017b689.json +0 -268
- package/.tap/processinfo/0e666134-5013-4ecd-9ee6-59b22716c39c.json +0 -268
- package/.tap/processinfo/1087b811-4ec4-4f91-92b4-a78a51a437de.json +0 -268
- package/.tap/processinfo/13709ed3-b68c-42cf-8472-b0c4b8a89d2b.json +0 -268
- package/.tap/processinfo/13ac2f18-d0e0-439f-bc86-2ff0119af857.json +0 -268
- package/.tap/processinfo/13e47e0e-f6e8-4381-8a42-923b661f4a4f.json +0 -268
- package/.tap/processinfo/143f7d43-b8e8-4666-b482-f28fb37160ee.json +0 -268
- package/.tap/processinfo/14f3801d-03ab-4db3-9df5-c5d47e0a8cf0.json +0 -270
- package/.tap/processinfo/15a07dad-4bcd-442c-95e0-30c31f2b9818.json +0 -273
- package/.tap/processinfo/191ad3ad-04d8-4fb9-b119-ad2811f9b925.json +0 -243
- package/.tap/processinfo/1b25d54b-62d3-44cd-b581-31e705522fae.json +0 -268
- package/.tap/processinfo/1b7cb260-f04b-4135-a4fe-093081c4706f.json +0 -268
- package/.tap/processinfo/1e395d63-4815-4c77-aa47-df3709cc0ef9.json +0 -268
- package/.tap/processinfo/1e7f6a54-3abf-4771-863a-585cba110aec.json +0 -268
- package/.tap/processinfo/21a15e1d-0b41-47d8-b03d-0ba130969034.json +0 -244
- package/.tap/processinfo/21e02016-9ecd-4983-8417-9c74d224644f.json +0 -269
- package/.tap/processinfo/2327d941-d0d5-4762-b386-02a9a27ad28e.json +0 -268
- package/.tap/processinfo/23d39204-eac9-4f57-8db4-ffa996227fbd.json +0 -268
- package/.tap/processinfo/2493875a-0ac6-4d53-993c-f44471fd0678.json +0 -268
- package/.tap/processinfo/2698669f-f1e7-4a12-a687-8d58177be2b0.json +0 -269
- package/.tap/processinfo/2862b053-0a3d-46d7-9381-ffcb06287609.json +0 -268
- package/.tap/processinfo/2ac1b8d6-ac92-40e2-a59a-7681069f487c.json +0 -268
- package/.tap/processinfo/2c75e5f7-c4ef-47e4-a1c4-105eef6c0fab.json +0 -242
- package/.tap/processinfo/2e2c45cd-718b-4e5a-bf88-f801630f2803.json +0 -268
- package/.tap/processinfo/2f9ca478-3e03-4cce-a0bc-fcdc86d7c316.json +0 -268
- package/.tap/processinfo/30e3117f-fb74-456f-8f02-527e9eb9fcc3.json +0 -268
- package/.tap/processinfo/332be679-63c7-4b49-8b87-ef55995ada2d.json +0 -268
- package/.tap/processinfo/37c36f95-07f9-4ef0-8ab4-9e107d51b605.json +0 -269
- package/.tap/processinfo/3874eae2-f3db-44ef-9a9f-c8169d4b2b76.json +0 -268
- package/.tap/processinfo/38a7c3da-a411-41d0-8993-9deefd23500d.json +0 -268
- package/.tap/processinfo/3a7b6dbd-e153-4ce5-b557-21fb82009983.json +0 -269
- package/.tap/processinfo/3c6731ec-936d-470f-b7b0-0c87b54be051.json +0 -268
- package/.tap/processinfo/3c850ea9-4ef0-4044-a3fd-fbadfa9d543e.json +0 -268
- package/.tap/processinfo/3e4e15e0-a325-46f0-be57-5fd374560b7a.json +0 -269
- package/.tap/processinfo/3ed868e0-887c-402a-9f22-b1fdb74b4da0.json +0 -268
- package/.tap/processinfo/405498d7-5854-4ce1-a7dc-06920932f26d.json +0 -268
- package/.tap/processinfo/40b7eb19-ae35-4490-8a11-eb91a573c590.json +0 -268
- package/.tap/processinfo/40bb1260-d856-4248-8939-a0a05e322041.json +0 -268
- package/.tap/processinfo/41252e0b-7f69-44cc-b356-dd94bcbfdb29.json +0 -268
- package/.tap/processinfo/418fa710-e2fd-4508-b533-c179958da464.json +0 -269
- package/.tap/processinfo/433ef009-63aa-48fe-8e5d-c725228fa2fc.json +0 -268
- package/.tap/processinfo/44bf577c-9c01-4197-bd29-2e1ae888c4d4.json +0 -268
- package/.tap/processinfo/458fb7f2-20b9-48a2-8853-403c9851f605.json +0 -268
- package/.tap/processinfo/46b9892b-bb23-4b86-b0fa-9297f08c611a.json +0 -268
- package/.tap/processinfo/46bd9aaf-6cf3-4bd5-b90d-e136a7299a8e.json +0 -268
- package/.tap/processinfo/4779aa5f-e57a-4fcc-87e2-7d0bd4fca27f.json +0 -268
- package/.tap/processinfo/47b73f4b-ab31-49e1-97fd-8436dbe4bdf3.json +0 -269
- package/.tap/processinfo/49dba52e-e0c9-445d-8e9d-6d9ebe3ce6c4.json +0 -268
- package/.tap/processinfo/4b1dbc61-4e65-4c56-9784-2036f369038a.json +0 -268
- package/.tap/processinfo/4b6f0b40-43ef-4668-83a0-e07e28509df5.json +0 -268
- package/.tap/processinfo/4c236f70-f532-460b-8f7a-dd973301d493.json +0 -268
- package/.tap/processinfo/4d92b707-a268-48b8-885b-004d3a288c41.json +0 -269
- package/.tap/processinfo/4ff10bae-7c97-4c0a-b712-6c0d2f8c0e8e.json +0 -270
- package/.tap/processinfo/50f95bd5-ae12-4d83-99f4-ae9b0690c6a8.json +0 -268
- package/.tap/processinfo/557e4a49-d99c-4a63-b2f2-f33d897ab874.json +0 -268
- package/.tap/processinfo/589fd21a-8319-4abf-8cf7-82cb4a463a4b.json +0 -269
- package/.tap/processinfo/5a872f3a-949f-40be-8004-d739d034255c.json +0 -272
- package/.tap/processinfo/5abc301a-23da-424d-891e-3afbaff9156c.json +0 -269
- package/.tap/processinfo/5c31614c-a766-4837-ab59-dd6977166f72.json +0 -253
- package/.tap/processinfo/5d1e90c8-d819-4901-b022-f9ea4cd81978.json +0 -268
- package/.tap/processinfo/5d283e67-f31d-4fa8-a559-a1d8e82ee046.json +0 -269
- package/.tap/processinfo/5df505bc-6a4b-4c41-822f-51e2d7111de8.json +0 -268
- package/.tap/processinfo/5eaf64a2-fbfd-40e7-b391-c30f744b2bf1.json +0 -269
- package/.tap/processinfo/5ef5ede0-6436-4938-8401-d32ad4bffd5d.json +0 -268
- package/.tap/processinfo/606f05c0-8293-41db-bc92-eea82123697f.json +0 -269
- package/.tap/processinfo/6446806d-6cab-4c1d-a9ed-6bccaf3c4ea9.json +0 -268
- package/.tap/processinfo/64da7e08-925d-444d-98de-6568c6115d8d.json +0 -269
- package/.tap/processinfo/6917da6d-d2dc-466a-a893-7fb7412dde96.json +0 -268
- package/.tap/processinfo/69bbeee0-c398-4ccf-98b3-fb625a63bab4.json +0 -268
- package/.tap/processinfo/6da6ea8f-3370-4703-b230-90159531f766.json +0 -268
- package/.tap/processinfo/6ecffe1f-3016-4c11-9294-b488baced99f.json +0 -268
- package/.tap/processinfo/6f23f41f-ccbd-48cb-9ab6-311db0cfb65c.json +0 -270
- package/.tap/processinfo/70168912-9bb2-4334-bb89-041f1764cddf.json +0 -268
- package/.tap/processinfo/713a674e-40e1-46b4-866e-949d57c1a9f9.json +0 -270
- package/.tap/processinfo/730254d4-eacb-4cdf-80f4-8da22341cde5.json +0 -268
- package/.tap/processinfo/7344e559-c546-416f-8f1b-0f9fe12c6f02.json +0 -268
- package/.tap/processinfo/7556217a-0155-448f-b4d4-bec1bb0f6040.json +0 -269
- package/.tap/processinfo/7572079c-166c-4c4c-85ff-89b9430b214f.json +0 -268
- package/.tap/processinfo/7808180f-1974-47cd-bba2-2d6b8b711d65.json +0 -273
- package/.tap/processinfo/796dde83-da66-4db2-8d27-d45a3627c9c7.json +0 -268
- package/.tap/processinfo/7979819f-3723-48be-9f55-be700e689441.json +0 -270
- package/.tap/processinfo/7a664d39-d7f5-42f9-89df-15563048fab6.json +0 -268
- package/.tap/processinfo/7b047b72-01d9-4217-857c-93341651b4b3.json +0 -269
- package/.tap/processinfo/7ce41af6-7961-45ae-8c6f-b6e1c5692a48.json +0 -268
- package/.tap/processinfo/7e1de1c6-127e-463d-9357-081ee33ef5ce.json +0 -269
- package/.tap/processinfo/81ac7a7f-b0c0-4ef6-82cb-c718ea84e152.json +0 -268
- package/.tap/processinfo/851a058f-a497-4b10-a0b7-c9182d9c4d5a.json +0 -268
- package/.tap/processinfo/86502974-c245-4194-ade4-d9c6fdbb757e.json +0 -268
- package/.tap/processinfo/86b9786f-4a98-43b8-882a-5f936b876f08.json +0 -241
- package/.tap/processinfo/8a3fe726-86ab-4300-8d73-7eacbbc02a05.json +0 -268
- package/.tap/processinfo/8adf928b-c963-4ba0-9c35-606fcbd8a2aa.json +0 -272
- package/.tap/processinfo/8b31a6d8-1a33-4a27-93ca-1c5b364be068.json +0 -240
- package/.tap/processinfo/8ec12773-6b18-49a2-8e52-874c797df965.json +0 -833
- package/.tap/processinfo/8edb9502-3420-42fb-a602-e5de93be2df1.json +0 -268
- package/.tap/processinfo/8fc572e6-9828-4f98-a49c-9e081b2193c4.json +0 -242
- package/.tap/processinfo/8fee2d30-c5dd-4fae-9cf2-2ef8dd0f90de.json +0 -834
- package/.tap/processinfo/92cc0496-5f26-4370-8212-18136b972f99.json +0 -268
- package/.tap/processinfo/93a3f064-3f6e-4f49-becb-f7925f2961a9.json +0 -268
- package/.tap/processinfo/967e3697-8310-4a19-8dd5-927ac8bd6c79.json +0 -269
- package/.tap/processinfo/97225e23-9d30-4287-b3f5-72bccebec50b.json +0 -268
- package/.tap/processinfo/9a363bc6-4e65-47e8-94ca-26a9db428fb4.json +0 -268
- package/.tap/processinfo/9d2fe462-57fa-43f1-b02c-d188f15de30b.json +0 -270
- package/.tap/processinfo/a00b6cda-feb7-4b8a-8179-4c43bc29d670.json +0 -269
- package/.tap/processinfo/a017cbd5-4ac7-49e1-8c77-1bf4f6e7f2a6.json +0 -271
- package/.tap/processinfo/a1277309-1984-48f8-b60b-f5e8639736be.json +0 -271
- package/.tap/processinfo/a16bf53e-4337-48ff-88fa-67f55738e0f5.json +0 -268
- package/.tap/processinfo/a3a9848f-440e-41bb-9b0b-568bcfee0ddc.json +0 -268
- package/.tap/processinfo/a468c11f-f2f1-4e92-9ba0-6d28b6569b72.json +0 -268
- package/.tap/processinfo/a5880465-68f1-46b3-84a5-0da389d0bc67.json +0 -268
- package/.tap/processinfo/a666f394-39b4-44ad-8e74-abebf74dde3b.json +0 -270
- package/.tap/processinfo/af09d8ca-7053-4410-b514-b22c47f5979f.json +0 -268
- package/.tap/processinfo/af203309-28aa-459d-a56e-d88833695521.json +0 -268
- package/.tap/processinfo/afa2f7b6-dcd2-4d90-bf3c-54ba8b6800eb.json +0 -268
- package/.tap/processinfo/b231291d-ef14-4ff0-85f9-38a73a5408f8.json +0 -268
- package/.tap/processinfo/b3d3f2a1-a9fc-4d88-b122-fae90248cd59.json +0 -268
- package/.tap/processinfo/b834bf83-26c4-403a-8e91-eb15fe4b0b5d.json +0 -268
- package/.tap/processinfo/b8786fd7-47df-4ac1-8d6f-2d4c7623c681.json +0 -268
- package/.tap/processinfo/b9758f53-7f5a-4b03-8684-8a42ad644e5a.json +0 -268
- package/.tap/processinfo/bd194ea2-a21a-4604-b225-ee48abf1e607.json +0 -242
- package/.tap/processinfo/bd7ced53-3872-43b7-ad73-3352e50b728b.json +0 -268
- package/.tap/processinfo/be50295b-7e50-46cd-8bf1-637bf222699c.json +0 -268
- package/.tap/processinfo/bec61dd9-aa52-4e6c-8e37-5c9c10e935fd.json +0 -268
- package/.tap/processinfo/c015adf9-1d60-447e-87b5-b2031fe55bba.json +0 -268
- package/.tap/processinfo/c0666afa-7f64-45bd-97fb-145df1380157.json +0 -268
- package/.tap/processinfo/c2c0c012-c1c0-4457-84d6-dadba8396c94.json +0 -268
- package/.tap/processinfo/c3dd3ecd-737b-47ce-a917-54341c7bbed3.json +0 -268
- package/.tap/processinfo/c41ac06d-64b8-4bb3-bf56-0551f5a48f4b.json +0 -268
- package/.tap/processinfo/c4235bfb-a2aa-4271-9c6b-3ceb370219b1.json +0 -268
- package/.tap/processinfo/c4e6f24f-288c-493c-b6f0-02924aeb6758.json +0 -270
- package/.tap/processinfo/c54227bb-4a7b-40bb-bfe6-b54fe55078f3.json +0 -268
- package/.tap/processinfo/c699de91-3b0b-4466-9418-6910a3eb640a.json +0 -269
- package/.tap/processinfo/c74e2f37-451a-4577-ac18-e597fbd9a1d4.json +0 -269
- package/.tap/processinfo/c90cccec-5b4b-445f-a935-ac22859675d0.json +0 -252
- package/.tap/processinfo/c9dd6c7d-0d16-45e5-87ae-117388bf2994.json +0 -268
- package/.tap/processinfo/ca2e48fb-58c5-47fc-ad2e-263838aea42c.json +0 -272
- package/.tap/processinfo/ca87351d-c710-45c1-838a-16bccac59874.json +0 -273
- package/.tap/processinfo/cdb4a671-5776-4944-91b9-c456c58841ef.json +0 -268
- package/.tap/processinfo/cf10fdc8-6a87-447a-9e12-45f447af61f3.json +0 -244
- package/.tap/processinfo/cf3f1f08-643e-4f24-82ca-40f7a349c3d1.json +0 -268
- package/.tap/processinfo/d091172a-06a5-469b-82a9-8fefe3dd99da.json +0 -240
- package/.tap/processinfo/d1675431-61d6-45f8-a010-6e654112a00a.json +0 -272
- package/.tap/processinfo/d2d54aa2-c221-4ad4-b6b7-0c58e3c3679c.json +0 -269
- package/.tap/processinfo/d4f3c95a-ddbe-419d-bce0-dd6acceee21f.json +0 -268
- package/.tap/processinfo/d54ed8f1-43c3-478a-90d3-2c8aced723f2.json +0 -269
- package/.tap/processinfo/d6e5a2a6-4647-4d98-916c-aec4ace54a65.json +0 -268
- package/.tap/processinfo/d7280c64-45e6-4b12-affc-3ac9a5d4014a.json +0 -268
- package/.tap/processinfo/d82c8367-d825-4405-88df-07298f6ef840.json +0 -269
- package/.tap/processinfo/d8f97e53-e921-4d33-9c8d-2f7e807a9425.json +0 -268
- package/.tap/processinfo/da546a73-9714-4f8c-bdbb-e42730edbcfa.json +0 -268
- package/.tap/processinfo/da7fb7fb-1da4-49f8-a3ee-d4ea623c01a5.json +0 -268
- package/.tap/processinfo/daa6a016-4f0c-4050-923c-2022e0bb21d8.json +0 -268
- package/.tap/processinfo/db9a251d-8540-4719-b464-e7d5febd97d1.json +0 -240
- package/.tap/processinfo/dc10c603-8e58-4611-baa3-44da2578d07a.json +0 -268
- package/.tap/processinfo/dde56c1a-858c-47cc-b0bb-61279620ac17.json +0 -268
- package/.tap/processinfo/e0d9c4ea-f7c7-4c64-8ced-66dc6f0ac5d2.json +0 -271
- package/.tap/processinfo/e121454f-5dfa-4209-ba15-4c39840871f2.json +0 -831
- package/.tap/processinfo/e1f43e40-c3fe-4eb8-a713-d5910cc6b25a.json +0 -268
- package/.tap/processinfo/e4575e7a-f00e-488b-94e1-8f877b54725e.json +0 -268
- package/.tap/processinfo/e9ad667e-8603-4488-af64-449cc9532803.json +0 -268
- package/.tap/processinfo/eb26a697-e5e2-4730-aeea-bcb9c49afd4d.json +0 -268
- package/.tap/processinfo/eb29d1c3-feaf-4744-9d84-cf257e8269b0.json +0 -268
- package/.tap/processinfo/ee720c0a-ed64-4e7e-8c0a-139c7b9725d2.json +0 -268
- package/.tap/processinfo/ef88c13a-87b2-49e4-a683-7b812505cd6f.json +0 -268
- package/.tap/processinfo/f4ed6948-dac0-4128-9f86-d083b6918ea7.json +0 -268
- package/.tap/processinfo/f7544c01-8ac7-4e42-8ad5-c4d62e094d1f.json +0 -270
- package/.tap/processinfo/f7cee4b3-7bcc-4591-a628-5629b0b41c9e.json +0 -268
- package/.tap/processinfo/f9c0a1f7-c1a4-44d3-ae3f-8c1eb42cd746.json +0 -269
- package/.tap/processinfo/fc46b4da-79db-4201-af7e-34bb17f92d69.json +0 -270
- package/.tap/processinfo/fccc0056-03c4-40cb-9d0b-2db4bbe573c1.json +0 -268
- package/.tap/processinfo/fd2df572-54d7-4ce7-b7aa-a2b4b00d4127.json +0 -254
- package/.tap/processinfo/fea9377f-b473-484d-bee6-ac7f49e50937.json +0 -269
- package/.tap/processinfo/feb516dc-abda-46e6-9b42-d37adfc63366.json +0 -268
- package/.tap/processinfo/ff0fda4c-aa2e-4236-906e-fdfb6bd6632e.json +0 -269
- package/.tap/test-results/test/404s.test.js.tap +0 -623
- package/.tap/test-results/test/500s.test.js.tap +0 -64
- package/.tap/test-results/test/allowUnsafeRegex.test.js.tap +0 -36
- package/.tap/test-results/test/als.test.js.tap +0 -15
- package/.tap/test-results/test/async-await.test.js.tap +0 -184
- package/.tap/test-results/test/async-dispose.test.js.tap +0 -8
- package/.tap/test-results/test/async_hooks.test.js.tap +0 -10
- package/.tap/test-results/test/bodyLimit.test.js.tap +0 -48
- package/.tap/test-results/test/buffer.test.js.tap +0 -20
- package/.tap/test-results/test/build/error-serializer.test.js.tap +0 -8
- package/.tap/test-results/test/build/version.test.js.tap +0 -7
- package/.tap/test-results/test/case-insensitive.test.js.tap +0 -36
- package/.tap/test-results/test/chainable.test.js.tap +0 -17
- package/.tap/test-results/test/check.test.js.tap +0 -10
- package/.tap/test-results/test/childLoggerFactory.test.js.tap +0 -23
- package/.tap/test-results/test/client-timeout.test.js.tap +0 -7
- package/.tap/test-results/test/close-pipelining.test.js.tap +0 -15
- package/.tap/test-results/test/close.test.js.tap +0 -172
- package/.tap/test-results/test/connectionTimeout.test.js.tap +0 -12
- package/.tap/test-results/test/constrained-routes.test.js.tap +0 -173
- package/.tap/test-results/test/content-length.test.js.tap +0 -46
- package/.tap/test-results/test/content-parser.test.js.tap +0 -266
- package/.tap/test-results/test/content-type.test.js.tap +0 -14
- package/.tap/test-results/test/context-config.test.js.tap +0 -41
- package/.tap/test-results/test/copy.test.js.tap +0 -14
- package/.tap/test-results/test/custom-http-server.test.js.tap +0 -30
- package/.tap/test-results/test/custom-parser-async.test.js.tap +0 -21
- package/.tap/test-results/test/custom-parser.0.test.js.tap +0 -199
- package/.tap/test-results/test/custom-parser.1.test.js.tap +0 -90
- package/.tap/test-results/test/custom-parser.2.test.js.tap +0 -22
- package/.tap/test-results/test/custom-parser.3.test.js.tap +0 -53
- package/.tap/test-results/test/custom-parser.4.test.js.tap +0 -45
- package/.tap/test-results/test/custom-parser.5.test.js.tap +0 -41
- package/.tap/test-results/test/custom-querystring-parser.test.js.tap +0 -46
- package/.tap/test-results/test/decorator.test.js.tap +0 -465
- package/.tap/test-results/test/delete.test.js.tap +0 -110
- package/.tap/test-results/test/diagnostics-channel/404.test.js.tap +0 -15
- package/.tap/test-results/test/diagnostics-channel/async-delay-request.test.js.tap +0 -25
- package/.tap/test-results/test/diagnostics-channel/async-request.test.js.tap +0 -24
- package/.tap/test-results/test/diagnostics-channel/error-before-handler.test.js.tap +0 -9
- package/.tap/test-results/test/diagnostics-channel/error-request.test.js.tap +0 -20
- package/.tap/test-results/test/diagnostics-channel/error-status.test.js.tap +0 -10
- package/.tap/test-results/test/diagnostics-channel/init.test.js.tap +0 -14
- package/.tap/test-results/test/diagnostics-channel/sync-delay-request.test.js.tap +0 -16
- package/.tap/test-results/test/diagnostics-channel/sync-request-reply.test.js.tap +0 -16
- package/.tap/test-results/test/diagnostics-channel/sync-request.test.js.tap +0 -19
- package/.tap/test-results/test/encapsulated-child-logger-factory.test.js.tap +0 -18
- package/.tap/test-results/test/encapsulated-error-handler.test.js.tap +0 -243
- package/.tap/test-results/test/esm/errorCodes.test.mjs.tap +0 -9
- package/.tap/test-results/test/esm/esm.test.mjs.tap +0 -8
- package/.tap/test-results/test/esm/index.test.js.tap +0 -8
- package/.tap/test-results/test/fastify-instance.test.js.tap +0 -114
- package/.tap/test-results/test/findRoute.test.js.tap +0 -37
- package/.tap/test-results/test/fluent-schema.test.js.tap +0 -36
- package/.tap/test-results/test/genReqId.test.js.tap +0 -106
- package/.tap/test-results/test/get.test.js.tap +0 -151
- package/.tap/test-results/test/handler-context.test.js.tap +0 -19
- package/.tap/test-results/test/has-route.test.js.tap +0 -30
- package/.tap/test-results/test/head.test.js.tap +0 -130
- package/.tap/test-results/test/header-overflow.test.js.tap +0 -16
- package/.tap/test-results/test/hooks-async.test.js.tap +0 -286
- package/.tap/test-results/test/hooks.on-listen.test.js.tap +0 -311
- package/.tap/test-results/test/hooks.on-ready.test.js.tap +0 -151
- package/.tap/test-results/test/hooks.test.js.tap +0 -966
- package/.tap/test-results/test/http2/closing.test.js.tap +0 -35
- package/.tap/test-results/test/http2/constraint.test.js.tap +0 -32
- package/.tap/test-results/test/http2/head.test.js.tap +0 -9
- package/.tap/test-results/test/http2/missing-http2-module.test.js.tap +0 -8
- package/.tap/test-results/test/http2/plain.test.js.tap +0 -22
- package/.tap/test-results/test/http2/secure-with-fallback.test.js.tap +0 -40
- package/.tap/test-results/test/http2/secure.test.js.tap +0 -27
- package/.tap/test-results/test/http2/unknown-http-method.test.js.tap +0 -9
- package/.tap/test-results/test/https/custom-https-server.test.js.tap +0 -10
- package/.tap/test-results/test/https/https.test.js.tap +0 -45
- package/.tap/test-results/test/imports.test.js.tap +0 -14
- package/.tap/test-results/test/inject.test.js.tap +0 -165
- package/.tap/test-results/test/internals/all.test.js.tap +0 -42
- package/.tap/test-results/test/internals/contentTypeParser.test.js.tap +0 -14
- package/.tap/test-results/test/internals/context.test.js.tap +0 -14
- package/.tap/test-results/test/internals/decorator.test.js.tap +0 -51
- package/.tap/test-results/test/internals/errors.test.js.tap +0 -1212
- package/.tap/test-results/test/internals/handleRequest.test.js.tap +0 -69
- package/.tap/test-results/test/internals/hookRunner.test.js.tap +0 -143
- package/.tap/test-results/test/internals/hooks.test.js.tap +0 -45
- package/.tap/test-results/test/internals/initialConfig.test.js.tap +0 -125
- package/.tap/test-results/test/internals/logger.test.js.tap +0 -71
- package/.tap/test-results/test/internals/plugin.test.js.tap +0 -48
- package/.tap/test-results/test/internals/reply-serialize.test.js.tap +0 -166
- package/.tap/test-results/test/internals/reply.test.js.tap +0 -688
- package/.tap/test-results/test/internals/reqIdGenFactory.test.js.tap +0 -74
- package/.tap/test-results/test/internals/request-validate.test.js.tap +0 -384
- package/.tap/test-results/test/internals/request.test.js.tap +0 -163
- package/.tap/test-results/test/internals/server.test.js.tap +0 -30
- package/.tap/test-results/test/internals/validation.test.js.tap +0 -121
- package/.tap/test-results/test/keepAliveTimeout.test.js.tap +0 -12
- package/.tap/test-results/test/listen.1.test.js.tap +0 -31
- package/.tap/test-results/test/listen.2.test.js.tap +0 -46
- package/.tap/test-results/test/listen.3.test.js.tap +0 -25
- package/.tap/test-results/test/listen.4.test.js.tap +0 -51
- package/.tap/test-results/test/lock.test.js.tap +0 -29
- package/.tap/test-results/test/logger/instantiation.test.js.tap +0 -92
- package/.tap/test-results/test/logger/logging.test.js.tap +0 -117
- package/.tap/test-results/test/logger/options.test.js.tap +0 -165
- package/.tap/test-results/test/logger/request.test.js.tap +0 -82
- package/.tap/test-results/test/logger/response.test.js.tap +0 -38
- package/.tap/test-results/test/maxRequestsPerSocket.test.js.tap +0 -44
- package/.tap/test-results/test/method-missing.test.js.tap +0 -8
- package/.tap/test-results/test/middleware.test.js.tap +0 -17
- package/.tap/test-results/test/mkcalendar.test.js.tap +0 -43
- package/.tap/test-results/test/mkcol.test.js.tap +0 -14
- package/.tap/test-results/test/move.test.js.tap +0 -15
- package/.tap/test-results/test/noop-set.test.js.tap +0 -8
- package/.tap/test-results/test/nullable-validation.test.js.tap +0 -36
- package/.tap/test-results/test/options.error-handler.test.js.tap +0 -186
- package/.tap/test-results/test/options.test.js.tap +0 -174
- package/.tap/test-results/test/output-validation.test.js.tap +0 -66
- package/.tap/test-results/test/patch.error-handler.test.js.tap +0 -206
- package/.tap/test-results/test/patch.test.js.tap +0 -182
- package/.tap/test-results/test/plugin.1.test.js.tap +0 -78
- package/.tap/test-results/test/plugin.2.test.js.tap +0 -102
- package/.tap/test-results/test/plugin.3.test.js.tap +0 -58
- package/.tap/test-results/test/plugin.4.test.js.tap +0 -164
- package/.tap/test-results/test/post-empty-body.test.js.tap +0 -8
- package/.tap/test-results/test/pretty-print.test.js.tap +0 -82
- package/.tap/test-results/test/promises.test.js.tap +0 -46
- package/.tap/test-results/test/propfind.test.js.tap +0 -43
- package/.tap/test-results/test/proppatch.test.js.tap +0 -29
- package/.tap/test-results/test/proto-poisoning.test.js.tap +0 -47
- package/.tap/test-results/test/put.error-handler.test.js.tap +0 -206
- package/.tap/test-results/test/put.test.js.tap +0 -182
- package/.tap/test-results/test/register.test.js.tap +0 -61
- package/.tap/test-results/test/reply-code.test.js.tap +0 -40
- package/.tap/test-results/test/reply-earlyHints.test.js.tap +0 -22
- package/.tap/test-results/test/reply-error.test.js.tap +0 -643
- package/.tap/test-results/test/reply-trailers.test.js.tap +0 -176
- package/.tap/test-results/test/report.test.js.tap +0 -43
- package/.tap/test-results/test/request-error.test.js.tap +0 -98
- package/.tap/test-results/test/request-id.test.js.tap +0 -38
- package/.tap/test-results/test/request.deprecated.test.js.tap +0 -13
- package/.tap/test-results/test/requestTimeout.test.js.tap +0 -21
- package/.tap/test-results/test/route-hooks.test.js.tap +0 -498
- package/.tap/test-results/test/route-prefix.test.js.tap +0 -195
- package/.tap/test-results/test/route-shorthand.test.js.tap +0 -190
- package/.tap/test-results/test/route.1.test.js.tap +0 -93
- package/.tap/test-results/test/route.2.test.js.tap +0 -28
- package/.tap/test-results/test/route.3.test.js.tap +0 -39
- package/.tap/test-results/test/route.4.test.js.tap +0 -32
- package/.tap/test-results/test/route.5.test.js.tap +0 -54
- package/.tap/test-results/test/route.6.test.js.tap +0 -81
- package/.tap/test-results/test/route.7.test.js.tap +0 -93
- package/.tap/test-results/test/route.8.test.js.tap +0 -38
- package/.tap/test-results/test/router-options.test.js.tap +0 -104
- package/.tap/test-results/test/same-shape.test.js.tap +0 -22
- package/.tap/test-results/test/schema-examples.test.js.tap +0 -85
- package/.tap/test-results/test/schema-feature.test.js.tap +0 -445
- package/.tap/test-results/test/schema-serialization.test.js.tap +0 -194
- package/.tap/test-results/test/schema-special-usage.test.js.tap +0 -186
- package/.tap/test-results/test/schema-validation.test.js.tap +0 -199
- package/.tap/test-results/test/search.test.js.tap +0 -77
- package/.tap/test-results/test/serialize-response.test.js.tap +0 -26
- package/.tap/test-results/test/server.test.js.tap +0 -65
- package/.tap/test-results/test/set-error-handler.test.js.tap +0 -7
- package/.tap/test-results/test/skip-reply-send.test.js.tap +0 -272
- package/.tap/test-results/test/stream.1.test.js.tap +0 -36
- package/.tap/test-results/test/stream.2.test.js.tap +0 -20
- package/.tap/test-results/test/stream.3.test.js.tap +0 -34
- package/.tap/test-results/test/stream.4.test.js.tap +0 -40
- package/.tap/test-results/test/stream.5.test.js.tap +0 -37
- package/.tap/test-results/test/sync-routes.test.js.tap +0 -19
- package/.tap/test-results/test/throw.test.js.tap +0 -116
- package/.tap/test-results/test/trace.test.js.tap +0 -7
- package/.tap/test-results/test/trust-proxy.test.js.tap +0 -109
- package/.tap/test-results/test/type-provider.test.js.tap +0 -12
- package/.tap/test-results/test/unlock.test.js.tap +0 -14
- package/.tap/test-results/test/upgrade.test.js.tap +0 -8
- package/.tap/test-results/test/url-rewriting.test.js.tap +0 -39
- package/.tap/test-results/test/useSemicolonDelimiter.test.js.tap +0 -33
- package/.tap/test-results/test/validation-error-handling.test.js.tap +0 -180
- package/.tap/test-results/test/versioned-routes.test.js.tap +0 -151
- package/.tap/test-results/test/web-api.test.js.tap +0 -51
- package/.tap/test-results/test/wrapThenable.test.js.tap +0 -11
- package/EXPENSE_POLICY.md +0 -105
- package/test/default-route.test.js +0 -88
- package/test/listen.deprecated.test.js +0 -229
- package/test/unsupported-httpversion.test.js +0 -31
- package/types/.eslintrc.json +0 -48
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<module type="WEB_MODULE" version="4">
|
|
3
|
+
<component name="NewModuleRootManager">
|
|
4
|
+
<content url="file://$MODULE_DIR$">
|
|
5
|
+
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
|
|
6
|
+
<excludeFolder url="file://$MODULE_DIR$/temp" />
|
|
7
|
+
<excludeFolder url="file://$MODULE_DIR$/tmp" />
|
|
8
|
+
</content>
|
|
9
|
+
<orderEntry type="inheritedJdk" />
|
|
10
|
+
<orderEntry type="sourceFolder" forTests="false" />
|
|
11
|
+
</component>
|
|
12
|
+
</module>
|
package/.idea/vcs.xml
ADDED
package/.markdownlint-cli2.yaml
CHANGED
package/.taprc
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
# the coverage is performed by c8
|
|
5
|
-
check-coverage: false
|
|
6
|
-
coverage: false
|
|
7
|
-
node-arg: --allow-natives-syntax
|
|
1
|
+
# vim: set filetype=yaml :
|
|
2
|
+
node-arg:
|
|
3
|
+
- '--allow-natives-syntax'
|
|
8
4
|
|
|
9
|
-
|
|
5
|
+
include:
|
|
10
6
|
- 'test/**/*.test.js'
|
|
11
7
|
- 'test/**/*.test.mjs'
|
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
CI](https://github.com/fastify/fastify/workflows/package-manager-ci/badge.svg?branch=main)](https://github.com/fastify/fastify/actions/workflows/package-manager-ci.yml)
|
|
15
15
|
[](https://github.com/fastify/fastify/actions/workflows/website.yml)
|
|
17
|
-
[](https://github.com/neostandard/neostandard)
|
|
18
18
|
[](https://bestpractices.coreinfrastructure.org/projects/7585)
|
|
19
19
|
|
|
20
20
|
</div>
|
|
@@ -46,17 +46,14 @@ developer experience with the least overhead and a powerful plugin architecture.
|
|
|
46
46
|
It is inspired by Hapi and Express and as far as we know, it is one of the
|
|
47
47
|
fastest web frameworks in town.
|
|
48
48
|
|
|
49
|
-
The `main` branch refers to the Fastify `
|
|
50
|
-
[`
|
|
51
|
-
|
|
52
|
-
|
|
49
|
+
The `main` branch refers to the Fastify `v5` release, which is not released/LTS yet.
|
|
50
|
+
Check out the [`4.x` branch](https://github.com/fastify/fastify/tree/4.x) for `v4`.
|
|
53
51
|
|
|
54
52
|
### Table of Contents
|
|
55
53
|
|
|
56
54
|
- [Quick start](#quick-start)
|
|
57
55
|
- [Install](#install)
|
|
58
56
|
- [Example](#example)
|
|
59
|
-
- [Fastify v1.x and v2.x](#fastify-v1x-and-v2x)
|
|
60
57
|
- [Core features](#core-features)
|
|
61
58
|
- [Benchmarks](#benchmarks)
|
|
62
59
|
- [Documentation](#documentation)
|
|
@@ -18,10 +18,12 @@ const code = FJS({
|
|
|
18
18
|
const file = path.join(__dirname, '..', 'lib', 'error-serializer.js')
|
|
19
19
|
|
|
20
20
|
const moduleCode = `// This file is autogenerated by build/build-error-serializer.js, do not edit
|
|
21
|
-
/*
|
|
21
|
+
/* c8 ignore start */
|
|
22
22
|
${code}
|
|
23
|
+
/* c8 ignore stop */
|
|
23
24
|
`
|
|
24
25
|
|
|
26
|
+
/* c8 ignore start */
|
|
25
27
|
if (require.main === module) {
|
|
26
28
|
fs.writeFileSync(file, moduleCode)
|
|
27
29
|
console.log(`Saved ${file} file successfully`)
|
|
@@ -30,3 +32,4 @@ if (require.main === module) {
|
|
|
30
32
|
code: moduleCode
|
|
31
33
|
}
|
|
32
34
|
}
|
|
35
|
+
/* c8 ignore stop */
|
|
@@ -9,10 +9,11 @@ const factory = AjvStandaloneCompiler({
|
|
|
9
9
|
readMode: false,
|
|
10
10
|
storeFunction (routeOpts, schemaValidationCode) {
|
|
11
11
|
const moduleCode = `// This file is autogenerated by ${__filename.replace(__dirname, 'build')}, do not edit
|
|
12
|
-
/*
|
|
12
|
+
/* c8 ignore start */
|
|
13
13
|
${schemaValidationCode}
|
|
14
14
|
|
|
15
15
|
module.exports.defaultInitOptions = ${JSON.stringify(defaultInitOptions)}
|
|
16
|
+
/* c8 ignore stop */
|
|
16
17
|
`
|
|
17
18
|
|
|
18
19
|
const file = path.join(__dirname, '..', 'lib', 'configValidator.js')
|
|
@@ -38,11 +39,11 @@ const defaultInitOptions = {
|
|
|
38
39
|
onProtoPoisoning: 'error',
|
|
39
40
|
onConstructorPoisoning: 'error',
|
|
40
41
|
pluginTimeout: 10000,
|
|
41
|
-
requestIdHeader:
|
|
42
|
+
requestIdHeader: false,
|
|
42
43
|
requestIdLogLabel: 'reqId',
|
|
43
44
|
http2SessionTimeout: 72000, // 72 seconds
|
|
44
45
|
exposeHeadRoutes: true,
|
|
45
|
-
useSemicolonDelimiter:
|
|
46
|
+
useSemicolonDelimiter: false
|
|
46
47
|
}
|
|
47
48
|
|
|
48
49
|
const schema = {
|
|
@@ -98,7 +99,7 @@ const schema = {
|
|
|
98
99
|
onProtoPoisoning: { type: 'string', default: defaultInitOptions.onProtoPoisoning },
|
|
99
100
|
onConstructorPoisoning: { type: 'string', default: defaultInitOptions.onConstructorPoisoning },
|
|
100
101
|
pluginTimeout: { type: 'integer', default: defaultInitOptions.pluginTimeout },
|
|
101
|
-
requestIdHeader: { anyOf: [{
|
|
102
|
+
requestIdHeader: { anyOf: [{ type: 'boolean' }, { type: 'string' }], default: defaultInitOptions.requestIdHeader },
|
|
102
103
|
requestIdLogLabel: { type: 'string', default: defaultInitOptions.requestIdLogLabel },
|
|
103
104
|
http2SessionTimeout: { type: 'integer', default: defaultInitOptions.http2SessionTimeout },
|
|
104
105
|
exposeHeadRoutes: { type: 'boolean', default: defaultInitOptions.exposeHeadRoutes },
|
package/docs/Guides/Database.md
CHANGED
|
@@ -245,7 +245,7 @@ for Postgres, MySQL, SQL Server and SQLite. For MongoDB migrations, please check
|
|
|
245
245
|
#### [Postgrator](https://www.npmjs.com/package/postgrator)
|
|
246
246
|
|
|
247
247
|
Postgrator is Node.js SQL migration tool that uses a directory of SQL scripts to
|
|
248
|
-
alter the database schema. Each file
|
|
248
|
+
alter the database schema. Each file in a migrations folder need to follow the
|
|
249
249
|
pattern: ` [version].[action].[optional-description].sql`.
|
|
250
250
|
|
|
251
251
|
**version:** must be an incrementing number (e.g. `001` or a timestamp).
|
|
@@ -103,7 +103,7 @@ server.get('/v1*', async function (request, reply) {
|
|
|
103
103
|
}
|
|
104
104
|
})
|
|
105
105
|
|
|
106
|
-
server.decorate('magicKey'
|
|
106
|
+
server.decorate('magicKey')
|
|
107
107
|
|
|
108
108
|
server.listen({ port: '1234' }, () => {
|
|
109
109
|
provider.thirdPartyMagicKeyGenerator(USUAL_WAIT_TIME_MS)
|
|
@@ -303,7 +303,7 @@ async function setup(fastify) {
|
|
|
303
303
|
fastify.server.on('listening', doMagic)
|
|
304
304
|
|
|
305
305
|
// Set up the placeholder for the magicKey
|
|
306
|
-
fastify.decorate('magicKey'
|
|
306
|
+
fastify.decorate('magicKey')
|
|
307
307
|
|
|
308
308
|
// Our magic -- important to make sure errors are handled. Beware of async
|
|
309
309
|
// functions outside `try/catch` blocks
|
|
@@ -406,7 +406,7 @@ https://nodejs.org/api/net.html#event-listening). We use that to reach out to
|
|
|
406
406
|
our provider as soon as possible, with the `doMagic` function.
|
|
407
407
|
|
|
408
408
|
```js
|
|
409
|
-
fastify.decorate('magicKey'
|
|
409
|
+
fastify.decorate('magicKey')
|
|
410
410
|
```
|
|
411
411
|
|
|
412
412
|
The `magicKey` decoration is also part of the plugin now. We initialize it with
|
package/docs/Guides/Ecosystem.md
CHANGED
|
@@ -447,6 +447,8 @@ section.
|
|
|
447
447
|
middlewares into Fastify plugins
|
|
448
448
|
- [`fastify-kubernetes`](https://github.com/greguz/fastify-kubernetes) Fastify
|
|
449
449
|
Kubernetes client plugin.
|
|
450
|
+
- [`fastify-kysely`](https://github.com/alenap93/fastify-kysely) Fastify
|
|
451
|
+
plugin for supporting Kysely type-safe query builder.
|
|
450
452
|
- [`fastify-language-parser`](https://github.com/lependu/fastify-language-parser)
|
|
451
453
|
Fastify plugin to parse request language.
|
|
452
454
|
- [`fastify-lcache`](https://github.com/denbon05/fastify-lcache)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# V5 Migration Guide
|
|
2
|
+
|
|
3
|
+
This guide is intended to help with migration from Fastify v4 to v5.
|
|
4
|
+
|
|
5
|
+
Before migrating to v5, please ensure that you have fixed all deprecation
|
|
6
|
+
warnings from v4. All v4 deprecations have been removed and they will no longer
|
|
7
|
+
work after upgrading.
|
|
8
|
+
|
|
9
|
+
## Breaking Changes
|
|
10
|
+
|
|
11
|
+
### `useSemicolonDelimiter` false by default
|
|
12
|
+
|
|
13
|
+
Starting with v5, Fastify instances will no longer default to supporting the use
|
|
14
|
+
of semicolon delimiters in the query string as they did in v4.
|
|
15
|
+
This is due to it being non-standard
|
|
16
|
+
behavior and not adhering to [RFC 3986](https://www.rfc-editor.org/rfc/rfc3986#section-3.4).
|
|
17
|
+
|
|
18
|
+
If you still wish to use semicolons as delimiters, you can do so by
|
|
19
|
+
setting `useSemicolonDelimiter: true` in the server configuration.
|
|
20
|
+
|
|
@@ -19,7 +19,8 @@ For example, `FastifyTypeProviderDefault` will not be assignable to the followin
|
|
|
19
19
|
```ts
|
|
20
20
|
export interface NotSubstitutableTypeProvider extends FastifyTypeProvider {
|
|
21
21
|
// bad, nothing is assignable to `never` (except for itself)
|
|
22
|
-
|
|
22
|
+
validator: this['schema'] extends /** custom check here**/ ? /** narrowed type here **/ : never;
|
|
23
|
+
serializer: this['schema'] extends /** custom check here**/ ? /** narrowed type here **/ : never;
|
|
23
24
|
}
|
|
24
25
|
```
|
|
25
26
|
|
|
@@ -27,6 +28,7 @@ Unless changed to:
|
|
|
27
28
|
```ts
|
|
28
29
|
export interface SubstitutableTypeProvider extends FastifyTypeProvider {
|
|
29
30
|
// good, anything can be assigned to `unknown`
|
|
30
|
-
|
|
31
|
+
validator: this['schema'] extends /** custom check here**/ ? /** narrowed type here **/ : unknown;
|
|
32
|
+
serializer: this['schema'] extends /** custom check here**/ ? /** narrowed type here **/ : unknown;
|
|
31
33
|
}
|
|
32
34
|
```
|
|
@@ -29,6 +29,13 @@ is given in the content-type header. If it is not given, the
|
|
|
29
29
|
[catch-all](#catch-all) parser is not executed as with `POST`, `PUT` and
|
|
30
30
|
`PATCH`, but the payload is simply not parsed.
|
|
31
31
|
|
|
32
|
+
> ## ⚠ Security Notice
|
|
33
|
+
> When using with RegExp to detect `Content-Type`, you should beware of
|
|
34
|
+
> how to properly detect the `Content-Type`. For example, if you need
|
|
35
|
+
> `application/*`, you should use `/^application\/([\w-]+);?/` to match the
|
|
36
|
+
> [essence MIME type](https://mimesniff.spec.whatwg.org/#mime-type-miscellaneous)
|
|
37
|
+
> only.
|
|
38
|
+
|
|
32
39
|
### Usage
|
|
33
40
|
```js
|
|
34
41
|
fastify.addContentTypeParser('application/jsoff', function (request, payload, done) {
|
|
@@ -52,7 +59,7 @@ fastify.addContentTypeParser('application/jsoff', async function (request, paylo
|
|
|
52
59
|
})
|
|
53
60
|
|
|
54
61
|
// Handle all content types that matches RegExp
|
|
55
|
-
fastify.addContentTypeParser(/^image
|
|
62
|
+
fastify.addContentTypeParser(/^image\/([\w-]+);?/, function (request, payload, done) {
|
|
56
63
|
imageParser(payload, function (err, body) {
|
|
57
64
|
done(err, body)
|
|
58
65
|
})
|
|
@@ -80,6 +87,28 @@ fastify.addContentTypeParser('application/vnd.custom', (request, body, done) =>
|
|
|
80
87
|
fastify.addContentTypeParser('application/vnd.custom+xml', (request, body, done) => {} )
|
|
81
88
|
```
|
|
82
89
|
|
|
90
|
+
### Using addContentTypeParser with fastify.register
|
|
91
|
+
When using `addContentTypeParser` in combination with `fastify.register`,
|
|
92
|
+
`await` should not be used when registering routes. Using `await` causes
|
|
93
|
+
the route registration to be asynchronous and can lead to routes being registered
|
|
94
|
+
before the addContentTypeParser has been set.
|
|
95
|
+
|
|
96
|
+
#### Correct Usage
|
|
97
|
+
```js
|
|
98
|
+
const fastify = require('fastify')();
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
fastify.register((fastify, opts) => {
|
|
102
|
+
fastify.addContentTypeParser('application/json', function (request, payload, done) {
|
|
103
|
+
jsonParser(payload, function (err, body) {
|
|
104
|
+
done(err, body)
|
|
105
|
+
})
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
fastify.get('/hello', async (req, res) => {});
|
|
109
|
+
});
|
|
110
|
+
```
|
|
111
|
+
|
|
83
112
|
Besides the `addContentTypeParser` API there are further APIs that can be used.
|
|
84
113
|
These are `hasContentTypeParser`, `removeContentTypeParser` and
|
|
85
114
|
`removeAllContentTypeParsers`.
|
|
@@ -59,8 +59,8 @@ close as possible to the value intended to be set dynamically in the future.
|
|
|
59
59
|
Initialize a decorator as a `''` if the intended value is a string, and as
|
|
60
60
|
`null` if it will be an object or a function.
|
|
61
61
|
|
|
62
|
-
Remember this example works only with value types as reference types will
|
|
63
|
-
|
|
62
|
+
Remember this example works only with value types as reference types will
|
|
63
|
+
thrown and error during the fastify startup. See [decorateRequest](#decorate-request).
|
|
64
64
|
|
|
65
65
|
See [JavaScript engine fundamentals: Shapes and Inline
|
|
66
66
|
Caches](https://mathiasbynens.be/notes/shapes-ics) for more information on this
|
|
@@ -83,7 +83,7 @@ fastify.decorate('utility', function () {
|
|
|
83
83
|
})
|
|
84
84
|
```
|
|
85
85
|
|
|
86
|
-
As mentioned above, non-function values can be attached:
|
|
86
|
+
As mentioned above, non-function values can be attached to the server instance as:
|
|
87
87
|
|
|
88
88
|
```js
|
|
89
89
|
fastify.decorate('conf', {
|
|
@@ -177,23 +177,24 @@ fastify.decorateReply('utility', function () {
|
|
|
177
177
|
Note: using an arrow function will break the binding of `this` to the Fastify
|
|
178
178
|
`Reply` instance.
|
|
179
179
|
|
|
180
|
-
Note: using `decorateReply` will
|
|
180
|
+
Note: using `decorateReply` will throw and error if used with a reference type:
|
|
181
181
|
|
|
182
182
|
```js
|
|
183
183
|
// Don't do this
|
|
184
184
|
fastify.decorateReply('foo', { bar: 'fizz'})
|
|
185
185
|
```
|
|
186
|
-
In this example, the reference of the object
|
|
187
|
-
**any mutation will impact all requests, potentially creating security
|
|
188
|
-
vulnerabilities or memory leaks
|
|
189
|
-
|
|
190
|
-
|
|
186
|
+
In this example, the reference of the object would be shared with all the requests
|
|
187
|
+
and **any mutation will impact all requests, potentially creating security
|
|
188
|
+
vulnerabilities or memory leaks**, so Fastify blocks it.
|
|
189
|
+
|
|
190
|
+
To achieve proper encapsulation across requests configure a new value for each
|
|
191
|
+
incoming request in the [`'onRequest'` hook](./Hooks.md#onrequest). Example:
|
|
191
192
|
|
|
192
193
|
```js
|
|
193
194
|
const fp = require('fastify-plugin')
|
|
194
195
|
|
|
195
196
|
async function myPlugin (app) {
|
|
196
|
-
app.decorateRequest('foo'
|
|
197
|
+
app.decorateRequest('foo')
|
|
197
198
|
app.addHook('onRequest', async (req, reply) => {
|
|
198
199
|
req.foo = { bar: 42 }
|
|
199
200
|
})
|
|
@@ -219,24 +220,26 @@ fastify.decorateRequest('utility', function () {
|
|
|
219
220
|
Note: using an arrow function will break the binding of `this` to the Fastify
|
|
220
221
|
`Request` instance.
|
|
221
222
|
|
|
222
|
-
Note: using `decorateRequest` will emit
|
|
223
|
+
Note: using `decorateRequest` will emit an error if used with a reference type:
|
|
223
224
|
|
|
224
225
|
```js
|
|
225
226
|
// Don't do this
|
|
226
227
|
fastify.decorateRequest('foo', { bar: 'fizz'})
|
|
227
228
|
```
|
|
228
|
-
In this example, the reference of the object
|
|
229
|
-
**any mutation will impact all requests, potentially creating security
|
|
230
|
-
vulnerabilities or memory leaks
|
|
229
|
+
In this example, the reference of the object would be shared with all the requests
|
|
230
|
+
and **any mutation will impact all requests, potentially creating security
|
|
231
|
+
vulnerabilities or memory leaks**, so Fastify blocks it.
|
|
231
232
|
|
|
232
233
|
To achieve proper encapsulation across requests configure a new value for each
|
|
233
|
-
incoming request in the [`'onRequest'` hook](./Hooks.md#onrequest).
|
|
234
|
+
incoming request in the [`'onRequest'` hook](./Hooks.md#onrequest).
|
|
235
|
+
|
|
236
|
+
Example:
|
|
234
237
|
|
|
235
238
|
```js
|
|
236
239
|
const fp = require('fastify-plugin')
|
|
237
240
|
|
|
238
241
|
async function myPlugin (app) {
|
|
239
|
-
app.decorateRequest('foo'
|
|
242
|
+
app.decorateRequest('foo')
|
|
240
243
|
app.addHook('onRequest', async (req, reply) => {
|
|
241
244
|
req.foo = { bar: 42 }
|
|
242
245
|
})
|
|
@@ -245,6 +248,29 @@ async function myPlugin (app) {
|
|
|
245
248
|
module.exports = fp(myPlugin)
|
|
246
249
|
```
|
|
247
250
|
|
|
251
|
+
The hook solution is more flexible and allows for more complex initialization
|
|
252
|
+
because you can add more logic to the `onRequest` hook.
|
|
253
|
+
|
|
254
|
+
Another approach is to use the getter/setter pattern, but it requires 2 decorators:
|
|
255
|
+
|
|
256
|
+
```js
|
|
257
|
+
fastify.decorateRequest('my_decorator_holder') // define the holder
|
|
258
|
+
fastify.decorateRequest('user', {
|
|
259
|
+
getter () {
|
|
260
|
+
this.my_decorator_holder ??= {} // initialize the holder
|
|
261
|
+
return this.my_decorator_holder
|
|
262
|
+
}
|
|
263
|
+
})
|
|
264
|
+
|
|
265
|
+
fastify.get('/', async function (req, reply) {
|
|
266
|
+
req.user.access = 'granted'
|
|
267
|
+
// other code
|
|
268
|
+
})
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
This ensures that the `user` property is always unique for each
|
|
272
|
+
request.
|
|
273
|
+
|
|
248
274
|
See [`decorate`](#decorate) for information about the `dependencies` parameter.
|
|
249
275
|
|
|
250
276
|
#### `hasDecorator(name)`
|
package/docs/Reference/Errors.md
CHANGED
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
- [FST_ERR_DEC_DEPENDENCY_INVALID_TYPE](#fst_err_dec_dependency_invalid_type)
|
|
37
37
|
- [FST_ERR_DEC_MISSING_DEPENDENCY](#fst_err_dec_missing_dependency)
|
|
38
38
|
- [FST_ERR_DEC_AFTER_START](#fst_err_dec_after_start)
|
|
39
|
+
- [FST_ERR_DEC_REFERENCE_TYPE](#fst_err_dec_reference_type)
|
|
39
40
|
- [FST_ERR_HOOK_INVALID_TYPE](#fst_err_hook_invalid_type)
|
|
40
41
|
- [FST_ERR_HOOK_INVALID_HANDLER](#fst_err_hook_invalid_handler)
|
|
41
42
|
- [FST_ERR_HOOK_INVALID_ASYNC_HANDLER](#fst_err_hook_invalid_async_handler)
|
|
@@ -44,6 +45,9 @@
|
|
|
44
45
|
- [FST_ERR_HOOK_TIMEOUT](#fst_err_hook_timeout)
|
|
45
46
|
- [FST_ERR_LOG_INVALID_DESTINATION](#fst_err_log_invalid_destination)
|
|
46
47
|
- [FST_ERR_LOG_INVALID_LOGGER](#fst_err_log_invalid_logger)
|
|
48
|
+
- [FST_ERR_LOG_INVALID_LOGGER_INSTANCE](#fst_err_log_invalid_logger_instance)
|
|
49
|
+
- [FST_ERR_LOG_INVALID_LOGGER_CONFIG](#fst_err_log_invalid_logger_config)
|
|
50
|
+
- [FST_ERR_LOG_LOGGER_AND_LOGGER_INSTANCE_PROVIDED](#fst_err_log_logger_and_logger_instance_provided)
|
|
47
51
|
- [FST_ERR_REP_INVALID_PAYLOAD_TYPE](#fst_err_rep_invalid_payload_type)
|
|
48
52
|
- [FST_ERR_REP_RESPONSE_BODY_CONSUMED](#fst_err_rep_response_body_consumed)
|
|
49
53
|
- [FST_ERR_REP_ALREADY_SENT](#fst_err_rep_already_sent)
|
|
@@ -70,7 +74,6 @@
|
|
|
70
74
|
- [FST_ERR_DUPLICATED_ROUTE](#fst_err_duplicated_route)
|
|
71
75
|
- [FST_ERR_BAD_URL](#fst_err_bad_url)
|
|
72
76
|
- [FST_ERR_ASYNC_CONSTRAINT](#fst_err_async_constraint)
|
|
73
|
-
- [FST_ERR_DEFAULT_ROUTE_INVALID_TYPE](#fst_err_default_route_invalid_type)
|
|
74
77
|
- [FST_ERR_INVALID_URL](#fst_err_invalid_url)
|
|
75
78
|
- [FST_ERR_ROUTE_OPTIONS_NOT_OBJ](#fst_err_route_options_not_obj)
|
|
76
79
|
- [FST_ERR_ROUTE_DUPLICATED_HANDLER](#fst_err_route_duplicated_handler)
|
|
@@ -90,6 +93,7 @@
|
|
|
90
93
|
- [FST_ERR_PARENT_PLUGIN_BOOTED](#fst_err_parent_plugin_booted)
|
|
91
94
|
- [FST_ERR_PLUGIN_TIMEOUT](#fst_err_plugin_timeout)
|
|
92
95
|
- [FST_ERR_PLUGIN_NOT_PRESENT_IN_INSTANCE](#fst_err_plugin_not_present_in_instance)
|
|
96
|
+
- [FST_ERR_PLUGIN_INVALID_ASYNC_HANDLER](#fst_err_plugin_invalid_async_handler)
|
|
93
97
|
- [FST_ERR_VALIDATION](#fst_err_validation)
|
|
94
98
|
- [FST_ERR_LISTEN_OPTIONS_INVALID](#fst_err_listen_options_invalid)
|
|
95
99
|
- [FST_ERR_ERROR_HANDLER_NOT_FN](#fst_err_error_handler_not_fn)
|
|
@@ -305,6 +309,7 @@ Below is a table with all the error codes that Fastify uses.
|
|
|
305
309
|
| <a id="fst_err_dec_dependency_invalid_type">FST_ERR_DEC_DEPENDENCY_INVALID_TYPE</a> | The dependencies of decorator must be of type `Array`. | Use an array for the dependencies. | [#3090](https://github.com/fastify/fastify/pull/3090) |
|
|
306
310
|
| <a id="fst_err_dec_missing_dependency">FST_ERR_DEC_MISSING_DEPENDENCY</a> | The decorator cannot be registered due to a missing dependency. | Register the missing dependency. | [#1168](https://github.com/fastify/fastify/pull/1168) |
|
|
307
311
|
| <a id="fst_err_dec_after_start">FST_ERR_DEC_AFTER_START</a> | The decorator cannot be added after start. | Add the decorator before starting the server. | [#2128](https://github.com/fastify/fastify/pull/2128) |
|
|
312
|
+
| <a id="fst_err_dec_reference_type">FST_ERR_DEC_REFERENCE_TYPE</a> | The decorator cannot be a reference type. | Define the decorator with a getter/setter interface or an empty decorator with a hook. | [#5462](https://github.com/fastify/fastify/pull/5462) |
|
|
308
313
|
| <a id="fst_err_hook_invalid_type">FST_ERR_HOOK_INVALID_TYPE</a> | The hook name must be a string. | Use a string for the hook name. | [#1168](https://github.com/fastify/fastify/pull/1168) |
|
|
309
314
|
| <a id="fst_err_hook_invalid_handler">FST_ERR_HOOK_INVALID_HANDLER</a> | The hook callback must be a function. | Use a function for the hook callback. | [#1168](https://github.com/fastify/fastify/pull/1168) |
|
|
310
315
|
| <a id="fst_err_hook_invalid_async_handler">FST_ERR_HOOK_INVALID_ASYNC_HANDLER</a> | Async function has too many arguments. Async hooks should not use the `done` argument. | Remove the `done` argument from the async hook. | [#4367](https://github.com/fastify/fastify/pull/4367) |
|
|
@@ -313,6 +318,9 @@ Below is a table with all the error codes that Fastify uses.
|
|
|
313
318
|
| <a id="fst_err_hook_timeout">FST_ERR_HOOK_TIMEOUT</a> | A callback for a hook timed out. | Increase the timeout for the hook. | [#3106](https://github.com/fastify/fastify/pull/3106) |
|
|
314
319
|
| <a id="fst_err_log_invalid_destination">FST_ERR_LOG_INVALID_DESTINATION</a> | The logger does not accept the specified destination. | Use a `'stream'` or a `'file'` as the destination. | [#1168](https://github.com/fastify/fastify/pull/1168) |
|
|
315
320
|
| <a id="fst_err_log_invalid_logger">FST_ERR_LOG_INVALID_LOGGER</a> | The logger should have all these methods: `'info'`, `'error'`, `'debug'`, `'fatal'`, `'warn'`, `'trace'`, `'child'`. | Use a logger with all the required methods. | [#4520](https://github.com/fastify/fastify/pull/4520) |
|
|
321
|
+
| <a id="fst_err_log_invalid_logger_instance">FST_ERR_LOG_INVALID_LOGGER_INSTANCE</a> | The `loggerInstance` only accepts a logger instance, not a configuration object. | To pass a configuration object, use `'logger'` instead. | [#5020](https://github.com/fastify/fastify/pull/5020) |
|
|
322
|
+
| <a id="fst_err_log_invalid_logger_config">FST_ERR_LOG_INVALID_LOGGER_CONFIG</a> | The logger option only accepts a configuration object, not a logger instance. | To pass an instance, use `'loggerInstance'` instead. | [#5020](https://github.com/fastify/fastify/pull/5020) |
|
|
323
|
+
| <a id="fst_err_log_logger_and_logger_instance_provided">FST_ERR_LOG_LOGGER_AND_LOGGER_INSTANCE_PROVIDED</a> | You cannot provide both `'logger'` and `'loggerInstance'`. | Please provide only one option. | [#5020](https://github.com/fastify/fastify/pull/5020) |
|
|
316
324
|
| <a id="fst_err_rep_invalid_payload_type">FST_ERR_REP_INVALID_PAYLOAD_TYPE</a> | Reply payload can be either a `string` or a `Buffer`. | Use a `string` or a `Buffer` for the payload. | [#1168](https://github.com/fastify/fastify/pull/1168) |
|
|
317
325
|
| <a id="fst_err_rep_response_body_consumed">FST_ERR_REP_RESPONSE_BODY_CONSUMED</a> | Using `Response` as reply payload, but the body is being consumed. | Make sure you don't consume the `Response.body` | [#5286](https://github.com/fastify/fastify/pull/5286) |
|
|
318
326
|
| <a id="fst_err_rep_already_sent">FST_ERR_REP_ALREADY_SENT</a> | A response was already sent. | - | [#1336](https://github.com/fastify/fastify/pull/1336) |
|
|
@@ -339,7 +347,6 @@ Below is a table with all the error codes that Fastify uses.
|
|
|
339
347
|
| <a id="fst_err_duplicated_route">FST_ERR_DUPLICATED_ROUTE</a> | The HTTP method already has a registered controller for that URL. | Use a different URL or register the controller for another HTTP method. | [#2954](https://github.com/fastify/fastify/pull/2954) |
|
|
340
348
|
| <a id="fst_err_bad_url">FST_ERR_BAD_URL</a> | The router received an invalid URL. | Use a valid URL. | [#2106](https://github.com/fastify/fastify/pull/2106) |
|
|
341
349
|
| <a id="fst_err_async_constraint">FST_ERR_ASYNC_CONSTRAINT</a> | The router received an error when using asynchronous constraints. | - | [#4323](https://github.com/fastify/fastify/pull/4323) |
|
|
342
|
-
| <a id="fst_err_default_route_invalid_type">FST_ERR_DEFAULT_ROUTE_INVALID_TYPE</a> | The `defaultRoute` type should be a function. | Use a function for the `defaultRoute`. | [#2733](https://github.com/fastify/fastify/pull/2733) |
|
|
343
350
|
| <a id="fst_err_invalid_url">FST_ERR_INVALID_URL</a> | URL must be a string. | Use a string for the URL. | [#3653](https://github.com/fastify/fastify/pull/3653) |
|
|
344
351
|
| <a id="fst_err_route_options_not_obj">FST_ERR_ROUTE_OPTIONS_NOT_OBJ</a> | Options for the route must be an object. | Use an object for the route options. | [#4554](https://github.com/fastify/fastify/pull/4554) |
|
|
345
352
|
| <a id="fst_err_route_duplicated_handler">FST_ERR_ROUTE_DUPLICATED_HANDLER</a> | Duplicate handler for the route is not allowed. | Use a different handler. | [#4554](https://github.com/fastify/fastify/pull/4554) |
|
|
@@ -359,6 +366,7 @@ Below is a table with all the error codes that Fastify uses.
|
|
|
359
366
|
| <a id="fst_err_parent_plugin_booted">FST_ERR_PARENT_PLUGIN_BOOTED</a> | Impossible to load plugin because the parent (mapped directly from `avvio`) | - | [#3106](https://github.com/fastify/fastify/pull/3106) |
|
|
360
367
|
| <a id="fst_err_plugin_timeout">FST_ERR_PLUGIN_TIMEOUT</a> | Plugin did not start in time. | Increase the timeout for the plugin. | [#3106](https://github.com/fastify/fastify/pull/3106) |
|
|
361
368
|
| <a id="fst_err_plugin_not_present_in_instance">FST_ERR_PLUGIN_NOT_PRESENT_IN_INSTANCE</a> | The decorator is not present in the instance. | - | [#4554](https://github.com/fastify/fastify/pull/4554) |
|
|
369
|
+
| <a id="fst_err_plugin_invalid_async_handler">FST_ERR_PLUGIN_INVALID_ASYNC_HANDLER</a> | The plugin being registered mixes async and callback styles. | - | [#5141](https://github.com/fastify/fastify/pull/5141) |
|
|
362
370
|
| <a id="fst_err_validation">FST_ERR_VALIDATION</a> | The Request failed the payload validation. | Check the request payload. | [#4824](https://github.com/fastify/fastify/pull/4824) |
|
|
363
371
|
| <a id="fst_err_listen_options_invalid">FST_ERR_LISTEN_OPTIONS_INVALID</a> | Invalid listen options. | Check the listen options. | [#4886](https://github.com/fastify/fastify/pull/4886) |
|
|
364
372
|
| <a id="fst_err_error_handler_not_fn">FST_ERR_ERROR_HANDLER_NOT_FN</a> | Error Handler must be a function | Provide a function to `setErrorHandler`. | [#5317](https://github.com/fastify/fastify/pull/5317) |
|
package/docs/Reference/Hooks.md
CHANGED
|
@@ -829,18 +829,17 @@ consider creating a custom [Plugin](./Plugins.md) instead.
|
|
|
829
829
|
## Diagnostics Channel Hooks
|
|
830
830
|
|
|
831
831
|
> **Note:** The `diagnostics_channel` is currently experimental on Node.js, so
|
|
832
|
-
> its API is subject to change even in semver-patch releases of Node.js.
|
|
833
|
-
> versions of Node.js supported by Fastify where `diagnostics_channel` is
|
|
834
|
-
> unavailable, the hook
|
|
835
|
-
> [polyfill](https://www.npmjs.com/package/
|
|
836
|
-
>
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
other sort of modification.
|
|
832
|
+
> its API is subject to change even in semver-patch releases of Node.js. As some
|
|
833
|
+
> versions of Node.js are supported by Fastify where `diagnostics_channel` is
|
|
834
|
+
> unavailable, or with an incomplete feature set, the hook uses the
|
|
835
|
+
> [dc-polyfill](https://www.npmjs.com/package/dc-polyfill) package to provide a
|
|
836
|
+
> polyfill.
|
|
837
|
+
|
|
838
|
+
One [`diagnostics_channel`](https://nodejs.org/api/diagnostics_channel.html)
|
|
839
|
+
publish event, `'fastify.initialization'`, happens at initialization time. The
|
|
840
|
+
Fastify instance is passed into the hook as a property of the object passed in.
|
|
841
|
+
At this point, the instance can be interacted with to add hooks, plugins,
|
|
842
|
+
routes, or any other sort of modification.
|
|
844
843
|
|
|
845
844
|
For example, a tracing package might do something like the following (which is,
|
|
846
845
|
of course, a simplification). This would be in a file loaded in the
|
|
@@ -849,13 +848,13 @@ tools first" fashion.
|
|
|
849
848
|
|
|
850
849
|
```js
|
|
851
850
|
const tracer = /* retrieved from elsewhere in the package */
|
|
852
|
-
const dc = require('node:diagnostics_channel')
|
|
851
|
+
const dc = require('node:diagnostics_channel') // or require('dc-polyfill')
|
|
853
852
|
const channel = dc.channel('fastify.initialization')
|
|
854
853
|
const spans = new WeakMap()
|
|
855
854
|
|
|
856
855
|
channel.subscribe(function ({ fastify }) {
|
|
857
856
|
fastify.addHook('onRequest', (request, reply, done) => {
|
|
858
|
-
const span = tracer.startSpan('fastify.request')
|
|
857
|
+
const span = tracer.startSpan('fastify.request.handler')
|
|
859
858
|
spans.set(request, span)
|
|
860
859
|
done()
|
|
861
860
|
})
|
|
@@ -867,3 +866,38 @@ channel.subscribe(function ({ fastify }) {
|
|
|
867
866
|
})
|
|
868
867
|
})
|
|
869
868
|
```
|
|
869
|
+
|
|
870
|
+
Five other events are published on a per-request basis following the
|
|
871
|
+
[Tracing Channel](https://nodejs.org/api/diagnostics_channel.html#class-tracingchannel)
|
|
872
|
+
nomenclature. The list of the channel names and the event they receive is:
|
|
873
|
+
|
|
874
|
+
- `tracing:fastify.request.handler:start`: Always fires
|
|
875
|
+
- `{ request: Request, reply: Reply, route: { url, method } }`
|
|
876
|
+
- `tracing:fastify.request.handler:end`: Always fires
|
|
877
|
+
- `{ request: Request, reply: Reply, route: { url, method }, async: Bool }`
|
|
878
|
+
- `tracing:fastify.request.handler:asyncStart`: Fires for promise/async handlers
|
|
879
|
+
- `{ request: Request, reply: Reply, route: { url, method } }`
|
|
880
|
+
- `tracing:fastify.request.handler:asyncEnd`: Fires for promise/async handlers
|
|
881
|
+
- `{ request: Request, reply: Reply, route: { url, method } }`
|
|
882
|
+
- `tracing:fastify.request.handler:error`: Fires when an error occurs
|
|
883
|
+
- `{ request: Request, reply: Reply, route: { url, method }, error: Error }`
|
|
884
|
+
|
|
885
|
+
The object instance remains the same for all events associated with a given
|
|
886
|
+
request. All payloads include a `request` and `reply` property which are an
|
|
887
|
+
instance of Fastify's `Request` and `Reply` instances. They also include a
|
|
888
|
+
`route` property which is an object with the matched `url` pattern (e.g.
|
|
889
|
+
`/collection/:id`) and the `method` HTTP method (e.g. `GET`). The `:start` and
|
|
890
|
+
`:end` events always fire for requests. If a request handler is an `async`
|
|
891
|
+
function or one that returns a `Promise` then the `:asyncStart` and `:asyncEnd`
|
|
892
|
+
events also fire. Finally, the `:error` event contains an `error` property
|
|
893
|
+
associated with the request's failure.
|
|
894
|
+
|
|
895
|
+
These events can be received like so:
|
|
896
|
+
|
|
897
|
+
```js
|
|
898
|
+
const dc = require('node:diagnostics_channel') // or require('dc-polyfill')
|
|
899
|
+
const channel = dc.channel('tracing:fastify.request.handler:start')
|
|
900
|
+
channel.subscribe((msg) => {
|
|
901
|
+
console.log(msg.request, msg.reply)
|
|
902
|
+
})
|
|
903
|
+
```
|
|
@@ -98,10 +98,10 @@ const fastify = require('fastify')({
|
|
|
98
98
|
<a id="logging-request-id"></a>
|
|
99
99
|
|
|
100
100
|
By default, Fastify adds an ID to every request for easier tracking. If the
|
|
101
|
-
|
|
102
|
-
is generated. See Fastify
|
|
103
|
-
[`requestIdHeader`](./Server.md#factory-request-id-header) and Fastify
|
|
104
|
-
[`genReqId`](./Server.md#genreqid) for customization options.
|
|
101
|
+
requestIdHeader-option is set and the corresponding header is present than
|
|
102
|
+
its value is used, otherwise a new incremental ID is generated. See Fastify
|
|
103
|
+
Factory [`requestIdHeader`](./Server.md#factory-request-id-header) and Fastify
|
|
104
|
+
Factory [`genReqId`](./Server.md#genreqid) for customization options.
|
|
105
105
|
|
|
106
106
|
The default logger is configured with a set of standard serializers that
|
|
107
107
|
serialize objects with `req`, `res`, and `err` properties. The object received
|
|
@@ -243,7 +243,7 @@ const fastify = Fastify({
|
|
|
243
243
|
method: request.method,
|
|
244
244
|
url: request.url,
|
|
245
245
|
headers: request.headers,
|
|
246
|
-
|
|
246
|
+
host: request.host,
|
|
247
247
|
remoteAddress: request.ip,
|
|
248
248
|
remotePort: request.socket.remotePort
|
|
249
249
|
}
|