jishushell 0.6.18 → 0.7.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/apps/anythingllm-container.yaml +1 -0
- package/apps/browserless-chromium-container.yaml +1 -0
- package/apps/filebrowser-container.yaml +1 -0
- package/apps/hermes-container.yaml +1 -7
- package/apps/immich-container-lite.yaml +337 -0
- package/apps/immich-container.yaml +371 -0
- package/apps/jishu-kb-container.yaml +26 -21
- package/apps/ollama-binary.yaml +1 -0
- package/apps/ollama-cpu-container.yaml +1 -0
- package/apps/ollama-with-hollama-binary.yaml +2 -0
- package/apps/openclaw-binary.yaml +4 -8
- package/apps/openclaw-container.yaml +1 -7
- package/apps/openclaw-with-ollama-container.yaml +1 -0
- package/apps/openclaw-with-searxng-container.yaml +20 -0
- package/apps/searxng-container.yaml +20 -0
- package/apps/weknora-container.yaml +5 -0
- package/dependencies/jishushell-panel-0.7.3.tgz +0 -0
- package/dist/cli/core.js +1 -1
- package/dist/cli/core.js.map +1 -1
- package/dist/cli/doctor.js +96 -0
- package/dist/cli/doctor.js.map +1 -1
- package/dist/config.d.ts +9 -1
- package/dist/config.js +72 -2
- package/dist/config.js.map +1 -1
- package/dist/install.js +60 -19
- package/dist/install.js.map +1 -1
- package/dist/routes/admin.d.ts +2 -0
- package/dist/routes/admin.js +72 -0
- package/dist/routes/admin.js.map +1 -0
- package/dist/routes/docker.d.ts +2 -0
- package/dist/routes/docker.js +58 -0
- package/dist/routes/docker.js.map +1 -0
- package/dist/routes/file-mounts.js +5 -8
- package/dist/routes/file-mounts.js.map +1 -1
- package/dist/routes/instances.d.ts +0 -14
- package/dist/routes/instances.js +44 -1184
- package/dist/routes/instances.js.map +1 -1
- package/dist/server.d.ts +6 -0
- package/dist/server.js +53 -20
- package/dist/server.js.map +1 -1
- package/dist/services/app-common/catalog-service.js +15 -5
- package/dist/services/app-common/catalog-service.js.map +1 -1
- package/dist/services/app-common/delete-service.js +5 -0
- package/dist/services/app-common/delete-service.js.map +1 -1
- package/dist/services/app-common/instance-store.js +3 -0
- package/dist/services/app-common/instance-store.js.map +1 -1
- package/dist/services/app-common/lifecycle-service.js +12 -4
- package/dist/services/app-common/lifecycle-service.js.map +1 -1
- package/dist/services/app-common/ownership.d.ts +3 -0
- package/dist/services/app-common/ownership.js +11 -0
- package/dist/services/app-common/ownership.js.map +1 -0
- package/dist/services/app-common/runtime-facts.js +2 -0
- package/dist/services/app-common/runtime-facts.js.map +1 -1
- package/dist/services/app-common/spec-materializer.d.ts +0 -1
- package/dist/services/app-common/spec-materializer.js +21 -87
- package/dist/services/app-common/spec-materializer.js.map +1 -1
- package/dist/services/app-common/status-refresh.js +25 -13
- package/dist/services/app-common/status-refresh.js.map +1 -1
- package/dist/services/app-modules/browserless/routes.js +5 -3
- package/dist/services/app-modules/browserless/routes.js.map +1 -1
- package/dist/services/capabilities/contract.d.ts +1 -2
- package/dist/services/capabilities/contract.js +0 -10
- package/dist/services/capabilities/contract.js.map +1 -1
- package/dist/services/capabilities/endpoint-validator.js +0 -1
- package/dist/services/capabilities/endpoint-validator.js.map +1 -1
- package/dist/services/capabilities/health.js +1 -1
- package/dist/services/capabilities/health.js.map +1 -1
- package/dist/services/capability-proxy/http.d.ts +7 -0
- package/dist/services/capability-proxy/http.js +555 -0
- package/dist/services/capability-proxy/http.js.map +1 -0
- package/dist/services/capability-proxy/terminal.d.ts +4 -0
- package/dist/services/capability-proxy/terminal.js +179 -0
- package/dist/services/capability-proxy/terminal.js.map +1 -0
- package/dist/services/connections/admin.js +19 -9
- package/dist/services/connections/admin.js.map +1 -1
- package/dist/services/connections/apply.d.ts +3 -9
- package/dist/services/connections/apply.js +0 -29
- package/dist/services/connections/apply.js.map +1 -1
- package/dist/services/connections/transactor.js +2 -2
- package/dist/services/connections/transactor.js.map +1 -1
- package/dist/services/files/bootstrap.d.ts +7 -0
- package/dist/services/files/bootstrap.js +16 -0
- package/dist/services/files/bootstrap.js.map +1 -0
- package/dist/services/files/photos/upload-page.d.ts +2 -0
- package/dist/services/files/photos/upload-page.js +248 -0
- package/dist/services/files/photos/upload-page.js.map +1 -0
- package/dist/services/files/photos/upload-store.d.ts +74 -0
- package/dist/services/files/photos/upload-store.js +432 -0
- package/dist/services/files/photos/upload-store.js.map +1 -0
- package/dist/services/http/proxy-utils.d.ts +7 -0
- package/dist/services/http/proxy-utils.js +29 -0
- package/dist/services/http/proxy-utils.js.map +1 -0
- package/dist/services/http/request-utils.d.ts +3 -0
- package/dist/services/http/request-utils.js +23 -0
- package/dist/services/http/request-utils.js.map +1 -0
- package/dist/services/instances/manager.d.ts +6 -5
- package/dist/services/instances/manager.js +45 -51
- package/dist/services/instances/manager.js.map +1 -1
- package/dist/services/instances/pairing.d.ts +17 -0
- package/dist/services/instances/pairing.js +53 -0
- package/dist/services/instances/pairing.js.map +1 -0
- package/dist/services/instances/status.d.ts +2 -0
- package/dist/services/instances/status.js +11 -0
- package/dist/services/instances/status.js.map +1 -0
- package/dist/services/integrations/hermes/integration.d.ts +1 -1
- package/dist/services/integrations/hermes/integration.js +7 -8
- package/dist/services/integrations/hermes/integration.js.map +1 -1
- package/dist/services/integrations/immich/client.d.ts +93 -0
- package/dist/services/integrations/immich/client.js +458 -0
- package/dist/services/integrations/immich/client.js.map +1 -0
- package/dist/services/integrations/immich/config.d.ts +15 -0
- package/dist/services/integrations/immich/config.js +178 -0
- package/dist/services/integrations/immich/config.js.map +1 -0
- package/dist/services/integrations/immich/discovery.d.ts +9 -0
- package/dist/services/integrations/immich/discovery.js +101 -0
- package/dist/services/integrations/immich/discovery.js.map +1 -0
- package/dist/services/integrations/immich/gallery-renderer.d.ts +5 -0
- package/dist/services/integrations/immich/gallery-renderer.js +150 -0
- package/dist/services/integrations/immich/gallery-renderer.js.map +1 -0
- package/dist/services/integrations/immich/immich-shim.d.ts +11 -0
- package/dist/services/integrations/immich/immich-shim.js +439 -0
- package/dist/services/integrations/immich/immich-shim.js.map +1 -0
- package/dist/services/integrations/immich/integration.d.ts +18 -0
- package/dist/services/integrations/immich/integration.js +64 -0
- package/dist/services/integrations/immich/integration.js.map +1 -0
- package/dist/services/integrations/immich/photo-library.d.ts +4 -0
- package/dist/services/integrations/immich/photo-library.js +63 -0
- package/dist/services/integrations/immich/photo-library.js.map +1 -0
- package/dist/services/integrations/immich/review-executor.d.ts +3 -0
- package/dist/services/integrations/immich/review-executor.js +41 -0
- package/dist/services/integrations/immich/review-executor.js.map +1 -0
- package/dist/services/integrations/immich/review-session-service.d.ts +27 -0
- package/dist/services/integrations/immich/review-session-service.js +206 -0
- package/dist/services/integrations/immich/review-session-service.js.map +1 -0
- package/dist/services/integrations/immich/review-store.d.ts +47 -0
- package/dist/services/integrations/immich/review-store.js +347 -0
- package/dist/services/integrations/immich/review-store.js.map +1 -0
- package/dist/services/integrations/immich/routes.d.ts +7 -0
- package/dist/services/integrations/immich/routes.js +363 -0
- package/dist/services/integrations/immich/routes.js.map +1 -0
- package/dist/services/integrations/immich/types.d.ts +186 -0
- package/dist/services/integrations/immich/types.js +2 -0
- package/dist/services/integrations/immich/types.js.map +1 -0
- package/dist/services/integrations/index.d.ts +1 -0
- package/dist/services/integrations/index.js +1 -0
- package/dist/services/integrations/index.js.map +1 -1
- package/dist/services/integrations/installable/installers/integration.js +113 -7
- package/dist/services/integrations/installable/installers/integration.js.map +1 -1
- package/dist/services/integrations/jishukb/integration.d.ts +3 -1
- package/dist/services/integrations/jishukb/integration.js +121 -10
- package/dist/services/integrations/jishukb/integration.js.map +1 -1
- package/dist/services/integrations/openclaw/integration.d.ts +21 -7
- package/dist/services/integrations/openclaw/integration.js +385 -158
- package/dist/services/integrations/openclaw/integration.js.map +1 -1
- package/dist/services/integrations/openclaw/jishukb-native-mcp.d.ts +58 -0
- package/dist/services/integrations/openclaw/jishukb-native-mcp.js +373 -0
- package/dist/services/integrations/openclaw/jishukb-native-mcp.js.map +1 -0
- package/dist/services/integrations/openclaw/jishukb-shim.d.ts +8 -4
- package/dist/services/integrations/openclaw/jishukb-shim.js +624 -17
- package/dist/services/integrations/openclaw/jishukb-shim.js.map +1 -1
- package/dist/services/integrations/openclaw/mcporter.d.ts +13 -0
- package/dist/services/integrations/openclaw/mcporter.js +31 -0
- package/dist/services/integrations/openclaw/mcporter.js.map +1 -1
- package/dist/services/integrations/openclaw/native-mcp.d.ts +48 -0
- package/dist/services/integrations/openclaw/native-mcp.js +125 -0
- package/dist/services/integrations/openclaw/native-mcp.js.map +1 -0
- package/dist/services/integrations/openclaw/routes.js +4 -1
- package/dist/services/integrations/openclaw/routes.js.map +1 -1
- package/dist/services/integrations/types.d.ts +5 -17
- package/dist/services/repair/runtime-repair.js +68 -1
- package/dist/services/repair/runtime-repair.js.map +1 -1
- package/dist/services/runtime/docker-network.d.ts +8 -0
- package/dist/services/runtime/docker-network.js +123 -0
- package/dist/services/runtime/docker-network.js.map +1 -0
- package/dist/services/runtime/driver-registry.d.ts +4 -0
- package/dist/services/runtime/driver-registry.js.map +1 -1
- package/dist/services/runtime/drivers/nomad.d.ts +1 -0
- package/dist/services/runtime/drivers/nomad.js +35 -5
- package/dist/services/runtime/drivers/nomad.js.map +1 -1
- package/dist/services/runtime/service-manager.d.ts +2 -0
- package/dist/services/runtime/service-manager.js +18 -0
- package/dist/services/runtime/service-manager.js.map +1 -0
- package/dist/services/runtime/types.d.ts +1 -0
- package/dist/services/runtime/workload-compiler.js +29 -4
- package/dist/services/runtime/workload-compiler.js.map +1 -1
- package/dist/services/setup/setup-manager.js +29 -73
- package/dist/services/setup/setup-manager.js.map +1 -1
- package/dist/services/system/runtime-ownership.d.ts +36 -0
- package/dist/services/system/runtime-ownership.js +250 -0
- package/dist/services/system/runtime-ownership.js.map +1 -0
- package/dist/services/system/system-reconciler.js +53 -0
- package/dist/services/system/system-reconciler.js.map +1 -1
- package/dist/types.d.ts +19 -3
- package/dist/utils/path-safety.js +1 -1
- package/dist/utils/service-user.d.ts +13 -0
- package/dist/utils/service-user.js +129 -0
- package/dist/utils/service-user.js.map +1 -0
- package/install/jishu-install.sh +0 -1
- package/node_modules/brace-expansion/dist/commonjs/index.js +24 -14
- package/node_modules/brace-expansion/dist/commonjs/index.js.map +1 -1
- package/node_modules/brace-expansion/dist/esm/index.js +24 -14
- package/node_modules/brace-expansion/dist/esm/index.js.map +1 -1
- package/node_modules/brace-expansion/package.json +2 -2
- package/node_modules/fast-uri/index.js +1 -1
- package/node_modules/fast-uri/package.json +1 -1
- package/node_modules/fast-uri/test/security.test.js +28 -0
- package/node_modules/fastify/SECURITY.md +1 -1
- package/node_modules/fastify/SPONSORS.md +6 -4
- package/node_modules/fastify/docs/Guides/Database.md +0 -28
- package/node_modules/fastify/docs/Guides/Ecosystem.md +13 -2
- package/node_modules/fastify/docs/Guides/Serverless.md +2 -2
- package/node_modules/fastify/docs/Guides/Write-Plugin.md +1 -1
- package/node_modules/fastify/docs/Reference/Encapsulation.md +27 -26
- package/node_modules/fastify/docs/Reference/Errors.md +10 -4
- package/node_modules/fastify/docs/Reference/HTTP2.md +10 -10
- package/node_modules/fastify/docs/Reference/Hooks.md +4 -4
- package/node_modules/fastify/docs/Reference/Index.md +14 -16
- package/node_modules/fastify/docs/Reference/LTS.md +12 -13
- package/node_modules/fastify/docs/Reference/Lifecycle.md +9 -8
- package/node_modules/fastify/docs/Reference/Logging.md +44 -39
- package/node_modules/fastify/docs/Reference/Middleware.md +21 -25
- package/node_modules/fastify/docs/Reference/Principles.md +2 -2
- package/node_modules/fastify/docs/Reference/Reply.md +6 -1
- package/node_modules/fastify/docs/Reference/Request.md +27 -16
- package/node_modules/fastify/docs/Reference/Routes.md +5 -2
- package/node_modules/fastify/docs/Reference/Server.md +31 -3
- package/node_modules/fastify/docs/Reference/Type-Providers.md +29 -5
- package/node_modules/fastify/docs/Reference/Validation-and-Serialization.md +15 -2
- package/node_modules/fastify/docs/Reference/Warnings.md +7 -6
- package/node_modules/fastify/eslint.config.js +7 -2
- package/node_modules/fastify/fastify.d.ts +8 -3
- package/node_modules/fastify/fastify.js +43 -14
- package/node_modules/fastify/lib/content-type-parser.js +13 -1
- package/node_modules/fastify/lib/decorate.js +11 -3
- package/node_modules/fastify/lib/error-handler.js +4 -3
- package/node_modules/fastify/lib/error-serializer.js +59 -59
- package/node_modules/fastify/lib/errors.js +16 -1
- package/node_modules/fastify/lib/four-oh-four.js +14 -9
- package/node_modules/fastify/lib/handle-request.js +11 -5
- package/node_modules/fastify/lib/plugin-override.js +2 -1
- package/node_modules/fastify/lib/plugin-utils.js +5 -5
- package/node_modules/fastify/lib/reply.js +63 -8
- package/node_modules/fastify/lib/request.js +14 -4
- package/node_modules/fastify/lib/route.js +20 -6
- package/node_modules/fastify/lib/schema-controller.js +1 -1
- package/node_modules/fastify/lib/schemas.js +37 -30
- package/node_modules/fastify/lib/symbols.js +3 -1
- package/node_modules/fastify/lib/validation.js +1 -13
- package/node_modules/fastify/lib/warnings.js +3 -3
- package/node_modules/fastify/package.json +13 -15
- package/node_modules/fastify/scripts/validate-ecosystem-links.js +1 -0
- package/node_modules/fastify/test/bundler/esbuild/package.json +1 -1
- package/node_modules/fastify/test/close-pipelining.test.js +1 -2
- package/node_modules/fastify/test/custom-http-server.test.js +38 -0
- package/node_modules/fastify/test/decorator-instance-properties.test.js +63 -0
- package/node_modules/fastify/test/diagnostics-channel/async-error-handler.test.js +74 -0
- package/node_modules/fastify/test/hooks.test.js +23 -0
- package/node_modules/fastify/test/http-methods/get.test.js +1 -1
- package/node_modules/fastify/test/http2/plain.test.js +135 -0
- package/node_modules/fastify/test/http2/secure-with-fallback.test.js +1 -1
- package/node_modules/fastify/test/https/https.test.js +1 -2
- package/node_modules/fastify/test/internals/errors.test.js +31 -1
- package/node_modules/fastify/test/internals/plugin.test.js +3 -1
- package/node_modules/fastify/test/internals/request.test.js +27 -3
- package/node_modules/fastify/test/internals/schema-controller-perf.test.js +33 -0
- package/node_modules/fastify/test/logger/logging.test.js +18 -1
- package/node_modules/fastify/test/logger/options.test.js +38 -1
- package/node_modules/fastify/test/reply-error.test.js +1 -1
- package/node_modules/fastify/test/reply-trailers.test.js +70 -0
- package/node_modules/fastify/test/request-media-type.test.js +105 -0
- package/node_modules/fastify/test/route-prefix.test.js +34 -0
- package/node_modules/fastify/test/router-options.test.js +222 -11
- package/node_modules/fastify/test/schema-serialization.test.js +108 -0
- package/node_modules/fastify/test/schema-validation.test.js +24 -0
- package/node_modules/fastify/test/scripts/validate-ecosystem-links.test.js +40 -57
- package/node_modules/fastify/test/throw.test.js +14 -0
- package/node_modules/fastify/test/trust-proxy.test.js +21 -0
- package/node_modules/fastify/test/types/content-type-parser.tst.ts +70 -0
- package/node_modules/fastify/test/types/{decorate-request-reply.test-d.ts → decorate-request-reply.tst.ts} +4 -4
- package/node_modules/fastify/test/types/{dummy-plugin.ts → dummy-plugin.mts} +1 -1
- package/node_modules/fastify/test/types/errors.tst.ts +91 -0
- package/node_modules/fastify/test/types/fastify.tst.ts +351 -0
- package/node_modules/fastify/test/types/hooks.tst.ts +578 -0
- package/node_modules/fastify/test/types/instance.tst.ts +597 -0
- package/node_modules/fastify/test/types/{logger.test-d.ts → logger.tst.ts} +61 -62
- package/node_modules/fastify/test/types/plugin.tst.ts +96 -0
- package/node_modules/fastify/test/types/register.tst.ts +245 -0
- package/node_modules/fastify/test/types/reply.tst.ts +297 -0
- package/node_modules/fastify/test/types/request.tst.ts +199 -0
- package/node_modules/fastify/test/types/route.tst.ts +576 -0
- package/node_modules/fastify/test/types/{schema.test-d.ts → schema.tst.ts} +22 -22
- package/node_modules/fastify/test/types/{serverFactory.test-d.ts → serverFactory.tst.ts} +4 -4
- package/node_modules/fastify/test/types/tsconfig.json +9 -0
- package/node_modules/fastify/test/types/{type-provider.test-d.ts → type-provider.tst.ts} +256 -250
- package/node_modules/fastify/test/types/using.tst.ts +14 -0
- package/node_modules/fastify/types/errors.d.ts +3 -0
- package/node_modules/fastify/types/request.d.ts +23 -2
- package/node_modules/jishushell-panel/output/public/assets/{ApiKeyField-NKcbHjNz.js → ApiKeyField-Ce5d1xna.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/{Dashboard-Da1fL38t.js → Dashboard-BXame3yg.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/{HermesChatPanel-DZvmYsoh.js → HermesChatPanel-BHZtPCJd.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/{HermesConfigForm-BLUWlKwm.js → HermesConfigForm-CB3GbNX9.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/{InitPassword-BAKsshzk.js → InitPassword-Boab9F6g.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/InstanceDetail-DrIWCqo-.js +14 -0
- package/node_modules/jishushell-panel/output/public/assets/{Login-DHeOmwI8.js → Login-CzpOkNau.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/NewInstance-CANXyCcL.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/{ProviderRecommendations-H0ByEYF0.js → ProviderRecommendations-BABo9VOC.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/Settings-CKp5XxFh.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/Setup-C7xVDPow.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/{WeixinLoginPanel-D-T6BxkQ.js → WeixinLoginPanel-B765Xz4C.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/{index-ERt6_ngA.js → index-Bs6DSbiR.js} +6 -6
- package/node_modules/jishushell-panel/output/public/assets/{registry-DF93EzIb.js → registry-sWIZsIEF.js} +2 -2
- package/node_modules/jishushell-panel/output/public/assets/{usePolling-DeoThIQn.js → usePolling-D4IDOQd_.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/vendor-i18n-Df8aUdv8.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/{vendor-react-Cc84NArf.js → vendor-react-0L0rjmYG.js} +3 -3
- package/node_modules/jishushell-panel/output/public/index.html +3 -3
- package/node_modules/jishushell-panel/package.json +1 -1
- package/node_modules/semver/classes/range.js +6 -2
- package/node_modules/semver/package.json +1 -1
- package/package.json +4 -4
- package/scripts/check-app-spec.mjs +4 -12
- package/scripts/check-architecture-boundaries.mjs +178 -0
- package/scripts/pack-gui-and-send-pi.sh +5 -3
- package/dependencies/jishushell-panel-0.6.18.tgz +0 -0
- package/dist/services/connections/suggestions.d.ts +0 -27
- package/dist/services/connections/suggestions.js +0 -124
- package/dist/services/connections/suggestions.js.map +0 -1
- package/node_modules/fastify/test/types/content-type-parser.test-d.ts +0 -72
- package/node_modules/fastify/test/types/errors.test-d.ts +0 -90
- package/node_modules/fastify/test/types/fastify.test-d.ts +0 -352
- package/node_modules/fastify/test/types/hooks.test-d.ts +0 -550
- package/node_modules/fastify/test/types/import.ts +0 -2
- package/node_modules/fastify/test/types/instance.test-d.ts +0 -588
- package/node_modules/fastify/test/types/plugin.test-d.ts +0 -97
- package/node_modules/fastify/test/types/register.test-d.ts +0 -237
- package/node_modules/fastify/test/types/reply.test-d.ts +0 -254
- package/node_modules/fastify/test/types/request.test-d.ts +0 -188
- package/node_modules/fastify/test/types/route.test-d.ts +0 -553
- package/node_modules/fastify/test/types/using.test-d.ts +0 -17
- package/node_modules/jishushell-panel/output/public/assets/InstanceDetail-Dgyc_TX5.js +0 -14
- package/node_modules/jishushell-panel/output/public/assets/NewInstance-CIy0cYtp.js +0 -1
- package/node_modules/jishushell-panel/output/public/assets/Settings-DAT-UMfP.js +0 -1
- package/node_modules/jishushell-panel/output/public/assets/Setup-g3uckFYR.js +0 -1
- package/node_modules/jishushell-panel/output/public/assets/vendor-i18n-CS8DFbkQ.js +0 -1
|
@@ -16,28 +16,39 @@ Request is a core Fastify object containing the following fields:
|
|
|
16
16
|
[encapsulation context](./Encapsulation.md).
|
|
17
17
|
- `id` - The request ID.
|
|
18
18
|
- `log` - The logger instance of the incoming request.
|
|
19
|
-
- `ip` - The IP address of the incoming request.
|
|
20
|
-
|
|
21
|
-
`
|
|
22
|
-
|
|
19
|
+
- `ip` - The IP address of the incoming request. This value is taken from
|
|
20
|
+
`socket.remoteAddress` (or from `X-Forwarded-For` when
|
|
21
|
+
[`trustProxy`](./Server.md#factory-trust-proxy) is enabled).
|
|
22
|
+
- `ips` - An array of IP addresses, ordered from closest to furthest, from
|
|
23
|
+
`X-Forwarded-For` (only when
|
|
24
|
+
[`trustProxy`](./Server.md#factory-trust-proxy) is enabled).
|
|
23
25
|
- `host` - The host of the incoming request (derived from `X-Forwarded-Host`
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
No additional validation is performed beyond RFC parsing (see
|
|
31
|
-
[RFC 9110, section 7.2](https://www.rfc-editor.org/rfc/rfc9110#section-7.2) and
|
|
32
|
-
[RFC 3986, section 3.2.2](https://www.rfc-editor.org/rfc/rfc3986#section-3.2.2)).
|
|
33
|
-
- `hostname` - The hostname derived from the `host` property of the incoming request.
|
|
34
|
-
- `port` - The port from the `host` property, which may refer to the port the
|
|
26
|
+
when [`trustProxy`](./Server.md#factory-trust-proxy) is enabled). For HTTP/2
|
|
27
|
+
compatibility, it returns `:authority` if no host header exists. The host
|
|
28
|
+
header may return an empty string if `requireHostHeader` is `false`, not
|
|
29
|
+
provided with HTTP/1.0, or removed by schema validation.
|
|
30
|
+
- `hostname` - The hostname parsed from `request.host`.
|
|
31
|
+
- `port` - The port parsed from `request.host`, which may refer to the port the
|
|
35
32
|
server is listening on.
|
|
36
|
-
- `protocol` - The protocol of the incoming request (`https` or `http`).
|
|
33
|
+
- `protocol` - The protocol of the incoming request (`https` or `http`). This
|
|
34
|
+
value comes from `socket.encrypted` (or `X-Forwarded-Proto` when
|
|
35
|
+
[`trustProxy`](./Server.md#factory-trust-proxy) is enabled).
|
|
36
|
+
|
|
37
|
+
> ⚠️ Security:
|
|
38
|
+
> `request.ip`, `request.ips`, `request.host`, `request.hostname`,
|
|
39
|
+
> `request.port`, and `request.protocol` come from request metadata
|
|
40
|
+
> (socket and/or forwarding headers) and should be treated as untrusted input.
|
|
41
|
+
> Fastify does not perform security validation for business logic.
|
|
42
|
+
> If these values are used in security-sensitive decisions, they must
|
|
43
|
+
> be validated explicitly (for example: trusted proxy configuration,
|
|
44
|
+
> allow-lists, strict parsing, and normalization).
|
|
45
|
+
|
|
37
46
|
- `method` - The method of the incoming request.
|
|
38
47
|
- `url` - The URL of the incoming request.
|
|
39
48
|
- `originalUrl` - Similar to `url`, allows access to the original `url` in
|
|
40
49
|
case of internal re-routing.
|
|
50
|
+
- `mediaType` - The media type extracted from `Content-Type` header. When `Content-Type`
|
|
51
|
+
header is missing, it will return `undefined`.
|
|
41
52
|
- `is404` - `true` if request is being handled by 404 handler, `false` otherwise.
|
|
42
53
|
- `socket` - The underlying connection of the incoming request.
|
|
43
54
|
- `signal` - An `AbortSignal` that aborts when the handler timeout
|
|
@@ -102,7 +102,7 @@ fastify.route(options)
|
|
|
102
102
|
schemas for request validations. See the [Validation and
|
|
103
103
|
Serialization](./Validation-and-Serialization.md#schema-validator)
|
|
104
104
|
documentation.
|
|
105
|
-
* `serializerCompiler({
|
|
105
|
+
* `serializerCompiler({ schema, method, url, httpStatus, contentType })`:
|
|
106
106
|
function that builds schemas for response serialization. See the [Validation and
|
|
107
107
|
Serialization](./Validation-and-Serialization.md#schema-serializer)
|
|
108
108
|
documentation.
|
|
@@ -513,6 +513,9 @@ See the `prefixTrailingSlash` route option above to change this behavior.
|
|
|
513
513
|
Different log levels can be set for routes in Fastify by passing the `logLevel`
|
|
514
514
|
option to the plugin or route with the desired
|
|
515
515
|
[value](https://github.com/pinojs/pino/blob/main/docs/api.md#level-string).
|
|
516
|
+
If a route `logLevel` is invalid, Fastify throws
|
|
517
|
+
[`FST_ERR_ROUTE_LOG_LEVEL_INVALID`](./Errors.md#fst_err_route_log_level_invalid)
|
|
518
|
+
during route registration.
|
|
516
519
|
|
|
517
520
|
Be aware that setting `logLevel` at the plugin level also affects
|
|
518
521
|
[`setNotFoundHandler`](./Server.md#setnotfoundhandler) and
|
|
@@ -670,7 +673,7 @@ fastify.inject({
|
|
|
670
673
|
|
|
671
674
|
> ⚠ Warning:
|
|
672
675
|
> Set a
|
|
673
|
-
> [`Vary`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Vary)
|
|
676
|
+
> [`Vary`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Vary)
|
|
674
677
|
> header in responses with the value used for versioning
|
|
675
678
|
> (e.g., `'Accept-Version'`) to prevent cache poisoning attacks.
|
|
676
679
|
> This can also be configured in a Proxy/CDN.
|
|
@@ -48,6 +48,7 @@ describes the properties available in that options object.
|
|
|
48
48
|
- [`ignoreTrailingSlash`](#ignoretrailingslash)
|
|
49
49
|
- [`maxParamLength`](#maxparamlength)
|
|
50
50
|
- [`onBadUrl`](#onbadurl)
|
|
51
|
+
- [`onMaxParamLength`](#onmaxparamlength)
|
|
51
52
|
- [`querystringParser`](#querystringparser)
|
|
52
53
|
- [`useSemicolonDelimiter`](#usesemicolondelimiter)
|
|
53
54
|
- [Instance](#instance)
|
|
@@ -560,6 +561,12 @@ For more examples, refer to the
|
|
|
560
561
|
You may access the `ip`, `ips`, `host` and `protocol` values on the
|
|
561
562
|
[`request`](./Request.md) object.
|
|
562
563
|
|
|
564
|
+
> ⚠️ Security:
|
|
565
|
+
> These values are derived from socket/forwarding metadata and must be treated
|
|
566
|
+
> as untrusted input unless your proxy chain is explicitly trusted and
|
|
567
|
+
> validated. Do not use them directly for authorization or other
|
|
568
|
+
> security-sensitive decisions without explicit validation.
|
|
569
|
+
|
|
563
570
|
```js
|
|
564
571
|
fastify.get('/', (request, reply) => {
|
|
565
572
|
console.log(request.ip)
|
|
@@ -720,7 +727,7 @@ const fastify = require('fastify')({
|
|
|
720
727
|
res.code(400)
|
|
721
728
|
return res.send("Provided header is not valid")
|
|
722
729
|
} else {
|
|
723
|
-
res.send(
|
|
730
|
+
res.send(error)
|
|
724
731
|
}
|
|
725
732
|
}
|
|
726
733
|
})
|
|
@@ -921,7 +928,7 @@ const fastify = require('fastify')({
|
|
|
921
928
|
```
|
|
922
929
|
|
|
923
930
|
### `defaultRoute`
|
|
924
|
-
<a id="
|
|
931
|
+
<a id="default-route"></a>
|
|
925
932
|
|
|
926
933
|
Fastify uses [find-my-way](https://github.com/delvedor/find-my-way) which supports,
|
|
927
934
|
can pass a default route with the option defaultRoute.
|
|
@@ -1037,6 +1044,27 @@ const fastify = require('fastify')({
|
|
|
1037
1044
|
As with `defaultRoute`, `req` and `res` are the raw Node.js request/response
|
|
1038
1045
|
objects and do not provide Fastify's decorated helpers.
|
|
1039
1046
|
|
|
1047
|
+
### `onMaxParamLength`
|
|
1048
|
+
<a id="on-max-param-length"></a>
|
|
1049
|
+
|
|
1050
|
+
Fastify uses [find-my-way](https://github.com/delvedor/find-my-way) which supports,
|
|
1051
|
+
the use case of a provide custom handler when `maxParamLength ` is exceed.
|
|
1052
|
+
|
|
1053
|
+
```js
|
|
1054
|
+
const fastify = require('fastify')({
|
|
1055
|
+
routerOptions: {
|
|
1056
|
+
maxParamLength: 10,
|
|
1057
|
+
onMaxParamLength: (path, req, res) => {
|
|
1058
|
+
res.statusCode = 414
|
|
1059
|
+
res.end(`Bad path: ${path}`)
|
|
1060
|
+
}
|
|
1061
|
+
}
|
|
1062
|
+
})
|
|
1063
|
+
```
|
|
1064
|
+
|
|
1065
|
+
As with `defaultRoute`, `req` and `res` are the raw Node.js request/response
|
|
1066
|
+
objects and do not provide Fastify's decorated helpers.
|
|
1067
|
+
|
|
1040
1068
|
### `querystringParser`
|
|
1041
1069
|
<a id="querystringparser"></a>
|
|
1042
1070
|
|
|
@@ -2249,7 +2277,7 @@ fastify.get('/', {
|
|
|
2249
2277
|
return
|
|
2250
2278
|
}
|
|
2251
2279
|
|
|
2252
|
-
fastify.errorHandler(error, request,
|
|
2280
|
+
fastify.errorHandler(error, request, reply)
|
|
2253
2281
|
}
|
|
2254
2282
|
}, handler)
|
|
2255
2283
|
```
|
|
@@ -23,8 +23,7 @@ See also the Type Provider wrapper packages for each of the packages respectivel
|
|
|
23
23
|
|
|
24
24
|
- [`@fastify/type-provider-json-schema-to-ts`](https://github.com/fastify/fastify-type-provider-json-schema-to-ts)
|
|
25
25
|
- [`@fastify/type-provider-typebox`](https://github.com/fastify/fastify-type-provider-typebox)
|
|
26
|
-
- [
|
|
27
|
-
(3rd party)
|
|
26
|
+
- [`@fastify/type-provider-zod`](https://github.com/fastify/fastify-type-provider-zod)
|
|
28
27
|
|
|
29
28
|
### Json Schema to Ts
|
|
30
29
|
|
|
@@ -88,14 +87,39 @@ server.get('/route', {
|
|
|
88
87
|
```
|
|
89
88
|
|
|
90
89
|
See the [TypeBox
|
|
91
|
-
documentation](https://sinclairzx81.github.io/typebox
|
|
90
|
+
documentation](https://sinclairzx81.github.io/typebox/)
|
|
92
91
|
for setting-up AJV to work with TypeBox.
|
|
93
92
|
|
|
94
93
|
### Zod
|
|
95
94
|
|
|
96
|
-
|
|
97
|
-
for Zod Type Provider instructions.
|
|
95
|
+
The following sets up a Zod Type Provider:
|
|
98
96
|
|
|
97
|
+
```bash
|
|
98
|
+
$ npm i zod @fastify/type-provider-zod
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
import fastify from 'fastify'
|
|
103
|
+
import { ZodTypeProvider, serializerCompiler, validatorCompiler } from '@fastify/type-provider-zod'
|
|
104
|
+
import { z } from 'zod/v4'
|
|
105
|
+
|
|
106
|
+
const server = fastify()
|
|
107
|
+
server.setValidatorCompiler(validatorCompiler)
|
|
108
|
+
server.setSerializerCompiler(serializerCompiler)
|
|
109
|
+
|
|
110
|
+
server.withTypeProvider<ZodTypeProvider>().get('/route', {
|
|
111
|
+
schema: {
|
|
112
|
+
querystring: z.object({
|
|
113
|
+
foo: z.number(),
|
|
114
|
+
bar: z.string()
|
|
115
|
+
})
|
|
116
|
+
}
|
|
117
|
+
}, (request, reply) => {
|
|
118
|
+
|
|
119
|
+
// type Query = { foo: number, bar: string }
|
|
120
|
+
const { foo, bar } = request.query // type safe!
|
|
121
|
+
})
|
|
122
|
+
```
|
|
99
123
|
|
|
100
124
|
### Scoped Type-Provider
|
|
101
125
|
|
|
@@ -300,6 +300,12 @@ Note that Ajv will try to [coerce](https://ajv.js.org/coercion.html) values to
|
|
|
300
300
|
the types specified in the schema `type` keywords, both to pass validation and
|
|
301
301
|
to use the correctly typed data afterwards.
|
|
302
302
|
|
|
303
|
+
> ⚠ Important:
|
|
304
|
+
> Fastify uses a custom [AJV configuration][1] such as `coerceTypes: 'array'`.
|
|
305
|
+
> Evaluate its behavior and verify if it meets the project requirements.
|
|
306
|
+
|
|
307
|
+
[1]: https://github.com/fastify/ajv-compiler?tab=readme-ov-file#ajv-configuration
|
|
308
|
+
|
|
303
309
|
The Ajv default configuration in Fastify supports coercing array parameters in
|
|
304
310
|
`querystring`. Example:
|
|
305
311
|
|
|
@@ -583,6 +589,11 @@ fastify.post('/the/url', {
|
|
|
583
589
|
}, handler)
|
|
584
590
|
```
|
|
585
591
|
|
|
592
|
+
Fastify supports different JSON Schema validators via
|
|
593
|
+
`setValidatorCompiler`. Community plugins that integrate alternative JSON
|
|
594
|
+
Schema validators are listed on the
|
|
595
|
+
[Ecosystem](https://fastify.dev/docs/latest/Guides/Ecosystem/) page.
|
|
596
|
+
|
|
586
597
|
##### Custom Validator Best Practices
|
|
587
598
|
|
|
588
599
|
When implementing custom validators, follow these patterns to ensure compatibility
|
|
@@ -920,8 +931,10 @@ For custom error responses in the schema, see
|
|
|
920
931
|
[example](https://github.com/fastify/example/blob/HEAD/validation-messages/custom-errors-messages.js)
|
|
921
932
|
usage.
|
|
922
933
|
|
|
923
|
-
>
|
|
924
|
-
>
|
|
934
|
+
> Fastify v5 uses AJV v8 and requires a compatible `ajv-errors` version.
|
|
935
|
+
> Fastify v3 requires `ajv-errors@1.0.1`, which supports AJV v6.
|
|
936
|
+
> See the [AJV compiler versions table](https://github.com/fastify/ajv-compiler/#versions)
|
|
937
|
+
> for the AJV version used by each Fastify release.
|
|
925
938
|
|
|
926
939
|
Below is an example showing how to add **custom error messages for each
|
|
927
940
|
property** of a schema by supplying custom AJV options. Inline comments in the
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
- [Warnings In Fastify](#warnings-in-fastify)
|
|
7
7
|
- [Fastify Warning Codes](#fastify-warning-codes)
|
|
8
8
|
- [FSTWRN001](#FSTWRN001)
|
|
9
|
-
- [
|
|
9
|
+
- [FSTWRN003](#FSTWRN003)
|
|
10
|
+
- [FSTWRN004](#FSTWRN004)
|
|
10
11
|
- [Fastify Deprecation Codes](#fastify-deprecation-codes)
|
|
11
12
|
- [FSTDEP022](#FSTDEP022)
|
|
12
13
|
|
|
@@ -14,7 +15,7 @@
|
|
|
14
15
|
|
|
15
16
|
### Warnings In Fastify
|
|
16
17
|
|
|
17
|
-
Fastify uses Node.js
|
|
18
|
+
Fastify uses the Node.js [warning event](https://nodejs.org/api/process.html#event-warning)
|
|
18
19
|
API to notify users of deprecated features and coding mistakes. Fastify's
|
|
19
20
|
warnings are recognizable by the `FSTWRN` and `FSTDEP` prefixes. When
|
|
20
21
|
encountering such a warning, it is highly recommended to determine the cause
|
|
@@ -22,7 +23,7 @@ using the [`--trace-warnings`](https://nodejs.org/api/cli.html#trace-warnings)
|
|
|
22
23
|
and [`--trace-deprecation`](https://nodejs.org/api/cli.html#trace-deprecation)
|
|
23
24
|
flags. These produce stack traces pointing to where the issue occurs in the
|
|
24
25
|
application's code. Issues opened about warnings without this information will
|
|
25
|
-
be closed
|
|
26
|
+
be closed.
|
|
26
27
|
|
|
27
28
|
Warnings can also be disabled, though it is not recommended. If necessary, use
|
|
28
29
|
one of the following methods:
|
|
@@ -33,15 +34,15 @@ one of the following methods:
|
|
|
33
34
|
|
|
34
35
|
For more information on disabling warnings, see [Node's documentation](https://nodejs.org/api/cli.html).
|
|
35
36
|
|
|
36
|
-
Disabling warnings
|
|
37
|
-
experienced users should consider disabling warnings.
|
|
37
|
+
Disabling warnings is not recommended and may cause unexpected behavior.
|
|
38
38
|
|
|
39
39
|
### Fastify Warning Codes
|
|
40
40
|
|
|
41
41
|
| Code | Description | How to solve | Discussion |
|
|
42
42
|
| ---- | ----------- | ------------ | ---------- |
|
|
43
43
|
| <a id="FSTWRN001">FSTWRN001</a> | The specified schema for a route is missing. This may indicate the schema is not well specified. | Check the schema for the route. | [#4647](https://github.com/fastify/fastify/pull/4647) |
|
|
44
|
-
| <a id="
|
|
44
|
+
| <a id="FSTWRN003">FSTWRN003</a> | The `%s` plugin mixes async and callback styles, which may lead to unhandled rejections. | Do not mix async and callback style. | [#6011](https://github.com/fastify/fastify/pull/6011) |
|
|
45
|
+
| <a id="FSTWRN004">FSTWRN004</a> | An `errorHandler` is being overridden in the same scope, which can lead to subtle bugs. | Avoid calling `setErrorHandler` more than once in the same scope. For more information, see [Server documentation](https://fastify.dev/docs/latest/Reference/Server/#allowerrorhandleroverride). | [#6104](https://github.com/fastify/fastify/pull/6104) |
|
|
45
46
|
|
|
46
47
|
|
|
47
48
|
### Fastify Deprecation Codes
|
|
@@ -6,8 +6,7 @@ module.exports = [
|
|
|
6
6
|
ignores: [
|
|
7
7
|
'lib/config-validator.js',
|
|
8
8
|
'lib/error-serializer.js',
|
|
9
|
-
'test/same-shape.test.js'
|
|
10
|
-
'test/types/import.js'
|
|
9
|
+
'test/same-shape.test.js'
|
|
11
10
|
],
|
|
12
11
|
ts: true
|
|
13
12
|
}),
|
|
@@ -31,5 +30,11 @@ module.exports = [
|
|
|
31
30
|
rules: {
|
|
32
31
|
'max-len': 'off'
|
|
33
32
|
}
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
files: ['test/types/**/*'],
|
|
36
|
+
rules: {
|
|
37
|
+
'@typescript-eslint/no-unused-vars': 'off'
|
|
38
|
+
}
|
|
34
39
|
}
|
|
35
40
|
]
|
|
@@ -6,7 +6,7 @@ import { Socket } from 'node:net'
|
|
|
6
6
|
import { BuildCompilerFromPool, ValidatorFactory } from '@fastify/ajv-compiler'
|
|
7
7
|
import { FastifyError } from '@fastify/error'
|
|
8
8
|
import { Options as FJSOptions, SerializerFactory } from '@fastify/fast-json-stringify-compiler'
|
|
9
|
-
import { Config as FindMyWayConfig,
|
|
9
|
+
import { ConstraintStrategy, Config as FindMyWayConfig, HTTPVersion } from 'find-my-way'
|
|
10
10
|
import { InjectOptions, CallbackFunc as LightMyRequestCallback, Chain as LightMyRequestChain, Response as LightMyRequestResponse } from 'light-my-request'
|
|
11
11
|
|
|
12
12
|
import { AddContentTypeParser, ConstructorAction, FastifyBodyParser, FastifyContentTypeParser, getDefaultJsonParser, hasContentTypeParser, ProtoAction } from './types/content-type-parser'
|
|
@@ -28,7 +28,7 @@ import { FastifyRegister, FastifyRegisterOptions, RegisterOptions } from './type
|
|
|
28
28
|
import { FastifyReply } from './types/reply'
|
|
29
29
|
import { FastifyRequest, RequestGenericInterface } from './types/request'
|
|
30
30
|
import { RouteGenericInterface, RouteHandler, RouteHandlerMethod, RouteOptions, RouteShorthandMethod, RouteShorthandOptions, RouteShorthandOptionsWithHandler } from './types/route'
|
|
31
|
-
import { FastifySchema,
|
|
31
|
+
import { FastifySchema, FastifySchemaCompiler, FastifySchemaValidationError, FastifySerializerCompiler, SchemaErrorDataVar, SchemaErrorFormatter } from './types/schema'
|
|
32
32
|
import { FastifyServerFactory, FastifyServerFactoryHandler } from './types/server-factory'
|
|
33
33
|
import { FastifyTypeProvider, FastifyTypeProviderDefault, SafePromiseLike } from './types/type-provider'
|
|
34
34
|
import { ContextConfigDefault, HTTPMethods, RawReplyDefaultExpression, RawRequestDefaultExpression, RawServerBase, RawServerDefault, RequestBodyDefault, RequestHeadersDefault, RequestParamsDefault, RequestQuerystringDefault } from './types/utils'
|
|
@@ -90,7 +90,7 @@ declare namespace fastify {
|
|
|
90
90
|
|
|
91
91
|
type TrustProxyFunction = (address: string, hop: number) => boolean
|
|
92
92
|
|
|
93
|
-
export type FastifyRouterOptions<RawServer extends RawServerBase> = Omit<FindMyWayConfigForServer<RawServer>, 'defaultRoute' | 'onBadUrl' | 'querystringParser'> & {
|
|
93
|
+
export type FastifyRouterOptions<RawServer extends RawServerBase> = Omit<FindMyWayConfigForServer<RawServer>, 'defaultRoute' | 'onBadUrl' | 'onMaxParamLength' | 'querystringParser'> & {
|
|
94
94
|
defaultRoute?: (
|
|
95
95
|
req: RawRequestDefaultExpression<RawServer>,
|
|
96
96
|
res: RawReplyDefaultExpression<RawServer>
|
|
@@ -100,6 +100,11 @@ declare namespace fastify {
|
|
|
100
100
|
req: RawRequestDefaultExpression<RawServer>,
|
|
101
101
|
res: RawReplyDefaultExpression<RawServer>
|
|
102
102
|
) => void,
|
|
103
|
+
onMaxParamLength?: (
|
|
104
|
+
path: string,
|
|
105
|
+
req: RawRequestDefaultExpression<RawServer>,
|
|
106
|
+
res: RawReplyDefaultExpression<RawServer>
|
|
107
|
+
) => void,
|
|
103
108
|
querystringParser?: (str: string) => { [key: string]: unknown }
|
|
104
109
|
}
|
|
105
110
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const VERSION = '5.
|
|
3
|
+
const VERSION = '5.9.0'
|
|
4
4
|
|
|
5
5
|
const Avvio = require('avvio')
|
|
6
6
|
const http = require('node:http')
|
|
@@ -63,6 +63,7 @@ const { defaultInitOptions } = getSecuredInitialConfig
|
|
|
63
63
|
const {
|
|
64
64
|
FST_ERR_ASYNC_CONSTRAINT,
|
|
65
65
|
FST_ERR_BAD_URL,
|
|
66
|
+
FST_ERR_MAX_PARAM_LENGTH,
|
|
66
67
|
FST_ERR_OPTIONS_NOT_OBJ,
|
|
67
68
|
FST_ERR_QSP_NOT_FN,
|
|
68
69
|
FST_ERR_SCHEMA_CONTROLLER_BUCKET_OPT_NOT_FN,
|
|
@@ -92,7 +93,7 @@ function fastify (serverOptions) {
|
|
|
92
93
|
disableRequestLogging,
|
|
93
94
|
hasLogger,
|
|
94
95
|
initialConfig
|
|
95
|
-
} = processOptions(serverOptions, defaultRoute, onBadUrl)
|
|
96
|
+
} = processOptions(serverOptions, defaultRoute, onBadUrl, onMaxParamLength)
|
|
96
97
|
|
|
97
98
|
// Default router
|
|
98
99
|
const router = buildRouting(options.routerOptions)
|
|
@@ -381,8 +382,7 @@ function fastify (serverOptions) {
|
|
|
381
382
|
hookRunnerApplication('preClose', fastify[kAvvioBoot], fastify, function () {
|
|
382
383
|
if (fastify[kState].listening) {
|
|
383
384
|
/* istanbul ignore next: Cannot test this without Node.js core support */
|
|
384
|
-
if (forceCloseConnections === 'idle') {
|
|
385
|
-
// Not needed in Node 19
|
|
385
|
+
if (forceCloseConnections === 'idle' && options.serverFactory) {
|
|
386
386
|
instance.server.closeIdleConnections()
|
|
387
387
|
/* istanbul ignore next: Cannot test this without Node.js core support */
|
|
388
388
|
} else if (serverHasCloseAllConnections && forceCloseConnections) {
|
|
@@ -423,8 +423,8 @@ function fastify (serverOptions) {
|
|
|
423
423
|
})
|
|
424
424
|
})
|
|
425
425
|
|
|
426
|
-
// Create bad URL context
|
|
427
|
-
const
|
|
426
|
+
// Create route event (bad URL, max param length, etc) context
|
|
427
|
+
const routeEventContext = new Context({
|
|
428
428
|
server: fastify,
|
|
429
429
|
config: {}
|
|
430
430
|
})
|
|
@@ -637,10 +637,10 @@ function fastify (serverOptions) {
|
|
|
637
637
|
|
|
638
638
|
function onBadUrl (path, req, res) {
|
|
639
639
|
if (options.frameworkErrors) {
|
|
640
|
-
const id = getGenReqId(
|
|
641
|
-
const childLogger = createChildLogger(
|
|
640
|
+
const id = getGenReqId(routeEventContext.server, req)
|
|
641
|
+
const childLogger = createChildLogger(routeEventContext, options.logger, req, id)
|
|
642
642
|
|
|
643
|
-
const request = new Request(id, null, req, null, childLogger,
|
|
643
|
+
const request = new Request(id, null, req, null, childLogger, routeEventContext)
|
|
644
644
|
const reply = new Reply(res, request, childLogger)
|
|
645
645
|
|
|
646
646
|
const resolvedDisableRequestLogging = typeof disableRequestLogging === 'function' ? disableRequestLogging(req) : disableRequestLogging
|
|
@@ -663,15 +663,43 @@ function fastify (serverOptions) {
|
|
|
663
663
|
res.end(body)
|
|
664
664
|
}
|
|
665
665
|
|
|
666
|
+
function onMaxParamLength (path, req, res) {
|
|
667
|
+
if (options.frameworkErrors) {
|
|
668
|
+
const id = getGenReqId(routeEventContext.server, req)
|
|
669
|
+
const childLogger = createChildLogger(routeEventContext, options.logger, req, id)
|
|
670
|
+
|
|
671
|
+
const request = new Request(id, null, req, null, childLogger, routeEventContext)
|
|
672
|
+
const reply = new Reply(res, request, childLogger)
|
|
673
|
+
|
|
674
|
+
const resolvedDisableRequestLogging = typeof disableRequestLogging === 'function' ? disableRequestLogging(req) : disableRequestLogging
|
|
675
|
+
if (resolvedDisableRequestLogging === false) {
|
|
676
|
+
childLogger.info({ req: request }, 'incoming request')
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
return options.frameworkErrors(new FST_ERR_MAX_PARAM_LENGTH(path), request, reply)
|
|
680
|
+
}
|
|
681
|
+
const body = JSON.stringify({
|
|
682
|
+
error: 'Bad Request',
|
|
683
|
+
code: 'FST_ERR_MAX_PARAM_LENGTH',
|
|
684
|
+
message: `'${path}' is exceeding the max param length`,
|
|
685
|
+
statusCode: 414
|
|
686
|
+
})
|
|
687
|
+
res.writeHead(414, {
|
|
688
|
+
'Content-Type': 'application/json',
|
|
689
|
+
'Content-Length': Buffer.byteLength(body)
|
|
690
|
+
})
|
|
691
|
+
res.end(body)
|
|
692
|
+
}
|
|
693
|
+
|
|
666
694
|
function buildAsyncConstraintCallback (isAsync, req, res) {
|
|
667
695
|
if (isAsync === false) return undefined
|
|
668
696
|
return function onAsyncConstraintError (err) {
|
|
669
697
|
if (err) {
|
|
670
698
|
if (options.frameworkErrors) {
|
|
671
|
-
const id = getGenReqId(
|
|
672
|
-
const childLogger = createChildLogger(
|
|
699
|
+
const id = getGenReqId(routeEventContext.server, req)
|
|
700
|
+
const childLogger = createChildLogger(routeEventContext, options.logger, req, id)
|
|
673
701
|
|
|
674
|
-
const request = new Request(id, null, req, null, childLogger,
|
|
702
|
+
const request = new Request(id, null, req, null, childLogger, routeEventContext)
|
|
675
703
|
const reply = new Reply(res, request, childLogger)
|
|
676
704
|
|
|
677
705
|
const resolvedDisableRequestLogging = typeof disableRequestLogging === 'function' ? disableRequestLogging(req) : disableRequestLogging
|
|
@@ -748,7 +776,7 @@ function fastify (serverOptions) {
|
|
|
748
776
|
if (!options.allowErrorHandlerOverride && this[kErrorHandlerAlreadySet]) {
|
|
749
777
|
throw new FST_ERR_ERROR_HANDLER_ALREADY_SET()
|
|
750
778
|
} else if (this[kErrorHandlerAlreadySet]) {
|
|
751
|
-
FSTWRN004(
|
|
779
|
+
FSTWRN004()
|
|
752
780
|
}
|
|
753
781
|
|
|
754
782
|
this[kErrorHandlerAlreadySet] = true
|
|
@@ -821,7 +849,7 @@ function fastify (serverOptions) {
|
|
|
821
849
|
}
|
|
822
850
|
}
|
|
823
851
|
|
|
824
|
-
function processOptions (options, defaultRoute, onBadUrl) {
|
|
852
|
+
function processOptions (options, defaultRoute, onBadUrl, onMaxParamLength) {
|
|
825
853
|
// Options validations
|
|
826
854
|
if (options && typeof options !== 'object') {
|
|
827
855
|
throw new FST_ERR_OPTIONS_NOT_OBJ()
|
|
@@ -890,6 +918,7 @@ function processOptions (options, defaultRoute, onBadUrl) {
|
|
|
890
918
|
options.routerOptions = buildRouterOptions(options, {
|
|
891
919
|
defaultRoute,
|
|
892
920
|
onBadUrl,
|
|
921
|
+
onMaxParamLength,
|
|
893
922
|
ignoreTrailingSlash: defaultInitOptions.ignoreTrailingSlash,
|
|
894
923
|
ignoreDuplicateSlashes: defaultInitOptions.ignoreDuplicateSlashes,
|
|
895
924
|
maxParamLength: defaultInitOptions.maxParamLength,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
const { AsyncResource } = require('node:async_hooks')
|
|
4
|
-
const { FifoMap: Fifo } = require('toad-cache')
|
|
4
|
+
const { FifoMap: Fifo, LruMap: Lru } = require('toad-cache')
|
|
5
5
|
const { parse: secureJsonParse } = require('secure-json-parse')
|
|
6
6
|
const ContentType = require('./content-type')
|
|
7
7
|
const {
|
|
@@ -39,6 +39,15 @@ function ContentTypeParser (bodyLimit, onProtoPoisoning, onConstructorPoisoning)
|
|
|
39
39
|
this.parserList = ['application/json', 'text/plain']
|
|
40
40
|
this.parserRegExpList = []
|
|
41
41
|
this.cache = new Fifo(100)
|
|
42
|
+
this.ctCache = new Lru(100)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
ContentTypeParser.prototype.getContentType = function (raw) {
|
|
46
|
+
let ct = this.ctCache.get(raw)
|
|
47
|
+
if (ct !== undefined) return ct
|
|
48
|
+
ct = new ContentType(raw)
|
|
49
|
+
this.ctCache.set(raw, ct)
|
|
50
|
+
return ct
|
|
42
51
|
}
|
|
43
52
|
|
|
44
53
|
ContentTypeParser.prototype.add = function (contentType, opts, parserFn) {
|
|
@@ -118,6 +127,8 @@ ContentTypeParser.prototype.existingParser = function (contentType) {
|
|
|
118
127
|
|
|
119
128
|
ContentTypeParser.prototype.getParser = function (contentType) {
|
|
120
129
|
if (typeof contentType === 'string') {
|
|
130
|
+
const cached = this.cache.get(contentType)
|
|
131
|
+
if (cached !== undefined) return cached
|
|
121
132
|
contentType = new ContentType(contentType)
|
|
122
133
|
}
|
|
123
134
|
const ct = contentType.toString()
|
|
@@ -158,6 +169,7 @@ ContentTypeParser.prototype.removeAll = function () {
|
|
|
158
169
|
this.parserRegExpList = []
|
|
159
170
|
this.parserList = []
|
|
160
171
|
this.cache = new Fifo(100)
|
|
172
|
+
this.ctCache = new Lru(100)
|
|
161
173
|
}
|
|
162
174
|
|
|
163
175
|
ContentTypeParser.prototype.remove = function (contentType) {
|
|
@@ -47,7 +47,7 @@ function getInstanceDecorator (name) {
|
|
|
47
47
|
|
|
48
48
|
function decorateConstructor (konstructor, name, fn, dependencies) {
|
|
49
49
|
const instance = konstructor.prototype
|
|
50
|
-
if (Object.hasOwn(instance, name) || hasKey(konstructor, name)) {
|
|
50
|
+
if (Object.hasOwn(instance, name) || hasKey(konstructor, name) || hasInstanceProperty(konstructor, name)) {
|
|
51
51
|
throw new FST_ERR_DEC_ALREADY_PRESENT(name)
|
|
52
52
|
}
|
|
53
53
|
|
|
@@ -87,19 +87,27 @@ function checkExistence (instance, name) {
|
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
function hasKey (fn, name) {
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
return fn.props ? fn.props.some(p => p.key === name) : false
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function hasInstanceProperty (konstructor, name) {
|
|
94
|
+
let k = konstructor
|
|
95
|
+
while (k) {
|
|
96
|
+
if (k.instanceProperties && k.instanceProperties.has(name)) return true
|
|
97
|
+
k = k.parent
|
|
92
98
|
}
|
|
93
99
|
return false
|
|
94
100
|
}
|
|
95
101
|
|
|
96
102
|
function checkRequestExistence (name) {
|
|
97
103
|
if (name && hasKey(this[kRequest], name)) return true
|
|
104
|
+
if (name && hasInstanceProperty(this[kRequest], name)) return true
|
|
98
105
|
return checkExistence(this[kRequest].prototype, name)
|
|
99
106
|
}
|
|
100
107
|
|
|
101
108
|
function checkReplyExistence (name) {
|
|
102
109
|
if (name && hasKey(this[kReply], name)) return true
|
|
110
|
+
if (name && hasInstanceProperty(this[kReply], name)) return true
|
|
103
111
|
return checkExistence(this[kReply].prototype, name)
|
|
104
112
|
}
|
|
105
113
|
|
|
@@ -8,7 +8,8 @@ const {
|
|
|
8
8
|
kReplyNextErrorHandler,
|
|
9
9
|
kReplyIsRunningOnErrorHook,
|
|
10
10
|
kRouteContext,
|
|
11
|
-
kDisableRequestLogging
|
|
11
|
+
kDisableRequestLogging,
|
|
12
|
+
kDiagnosticsStore
|
|
12
13
|
} = require('./symbols.js')
|
|
13
14
|
|
|
14
15
|
const {
|
|
@@ -19,7 +20,6 @@ const {
|
|
|
19
20
|
const { getSchemaSerializer } = require('./schemas')
|
|
20
21
|
|
|
21
22
|
const serializeError = require('./error-serializer')
|
|
22
|
-
|
|
23
23
|
const rootErrorHandler = {
|
|
24
24
|
func: defaultErrorHandler,
|
|
25
25
|
toJSON () {
|
|
@@ -69,7 +69,8 @@ function handleError (reply, error, cb) {
|
|
|
69
69
|
const result = func(error, reply.request, reply)
|
|
70
70
|
if (result !== undefined) {
|
|
71
71
|
if (result !== null && typeof result.then === 'function') {
|
|
72
|
-
|
|
72
|
+
const store = reply[kDiagnosticsStore] || null
|
|
73
|
+
wrapThenable(result, reply, store)
|
|
73
74
|
} else {
|
|
74
75
|
reply.send(result)
|
|
75
76
|
}
|