zuplo 6.67.32 → 6.68.0
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/README.md +9 -0
- package/docs/_index.md +44 -0
- package/docs/ai-gateway/apps.mdx +28 -0
- package/docs/ai-gateway/custom-providers.mdx +54 -0
- package/docs/ai-gateway/getting-started.mdx +224 -0
- package/docs/ai-gateway/guardrails.mdx +65 -0
- package/docs/ai-gateway/integrations/ai-sdk.mdx +109 -0
- package/docs/ai-gateway/integrations/claude-code.mdx +49 -0
- package/docs/ai-gateway/integrations/codex.mdx +78 -0
- package/docs/ai-gateway/integrations/goose.mdx +104 -0
- package/docs/ai-gateway/integrations/langchain.mdx +66 -0
- package/docs/ai-gateway/integrations/openai.mdx +99 -0
- package/docs/ai-gateway/introduction.mdx +85 -0
- package/docs/ai-gateway/managing-apps.mdx +46 -0
- package/docs/ai-gateway/managing-providers.mdx +66 -0
- package/docs/ai-gateway/managing-teams.mdx +63 -0
- package/docs/ai-gateway/policies/akamai-ai-firewall.mdx +125 -0
- package/docs/ai-gateway/policies/comet-opik-tracing.mdx +139 -0
- package/docs/ai-gateway/policies/galileo-tracing.mdx +147 -0
- package/docs/ai-gateway/providers.mdx +32 -0
- package/docs/ai-gateway/teams.mdx +38 -0
- package/docs/ai-gateway/universal-api.mdx +43 -0
- package/docs/ai-gateway/usage-limits.mdx +89 -0
- package/docs/api-management/introduction.md +127 -0
- package/docs/articles/accounts/audit-logs.mdx +227 -0
- package/docs/articles/accounts/billing.mdx +25 -0
- package/docs/articles/accounts/default-api-key.mdx +30 -0
- package/docs/articles/accounts/delete-account.mdx +36 -0
- package/docs/articles/accounts/enterprise-sso.mdx +116 -0
- package/docs/articles/accounts/managing-account-members.mdx +45 -0
- package/docs/articles/accounts/managing-project-members.mdx +37 -0
- package/docs/articles/accounts/members-and-roles.mdx +21 -0
- package/docs/articles/accounts/roles-and-permissions.mdx +115 -0
- package/docs/articles/accounts/zuplo-api-keys.mdx +94 -0
- package/docs/articles/add-api-to-backstage.mdx +216 -0
- package/docs/articles/advanced-path-matching.mdx +139 -0
- package/docs/articles/api-key-administration.mdx +47 -0
- package/docs/articles/api-key-api.mdx +220 -0
- package/docs/articles/api-key-authentication.mdx +195 -0
- package/docs/articles/api-key-buckets.mdx +61 -0
- package/docs/articles/api-key-end-users.mdx +52 -0
- package/docs/articles/api-key-leak-detection.mdx +75 -0
- package/docs/articles/api-key-management.mdx +100 -0
- package/docs/articles/api-key-react-component.mdx +90 -0
- package/docs/articles/api-key-service-limits.mdx +14 -0
- package/docs/articles/archiving-requests-to-storage.mdx +119 -0
- package/docs/articles/branch-based-deployments.mdx +184 -0
- package/docs/articles/bypass-policy-for-testing.mdx +117 -0
- package/docs/articles/check-ip-address.mdx +17 -0
- package/docs/articles/ci-cd-azure/basic-deployment.mdx +49 -0
- package/docs/articles/ci-cd-azure/deploy-and-test.mdx +47 -0
- package/docs/articles/ci-cd-azure/local-testing.mdx +59 -0
- package/docs/articles/ci-cd-azure/multi-stage-deployment.mdx +88 -0
- package/docs/articles/ci-cd-azure/pr-preview-environments.mdx +50 -0
- package/docs/articles/ci-cd-azure/tag-based-releases.mdx +37 -0
- package/docs/articles/ci-cd-bitbucket/basic-deployment.mdx +27 -0
- package/docs/articles/ci-cd-bitbucket/deploy-and-test.mdx +41 -0
- package/docs/articles/ci-cd-bitbucket/local-testing.mdx +34 -0
- package/docs/articles/ci-cd-bitbucket/multi-stage-deployment.mdx +52 -0
- package/docs/articles/ci-cd-bitbucket/pr-preview-environments.mdx +46 -0
- package/docs/articles/ci-cd-bitbucket/tag-based-releases.mdx +27 -0
- package/docs/articles/ci-cd-circleci/basic-deployment.mdx +34 -0
- package/docs/articles/ci-cd-circleci/deploy-and-test.mdx +44 -0
- package/docs/articles/ci-cd-circleci/local-testing.mdx +50 -0
- package/docs/articles/ci-cd-circleci/multi-stage-deployment.mdx +82 -0
- package/docs/articles/ci-cd-circleci/pr-preview-environments.mdx +47 -0
- package/docs/articles/ci-cd-circleci/tag-based-releases.mdx +38 -0
- package/docs/articles/ci-cd-github/basic-deployment.mdx +48 -0
- package/docs/articles/ci-cd-github/cleanup-on-branch-delete.mdx +123 -0
- package/docs/articles/ci-cd-github/deploy-and-test.mdx +82 -0
- package/docs/articles/ci-cd-github/local-testing.mdx +102 -0
- package/docs/articles/ci-cd-github/multi-stage-deployment.mdx +136 -0
- package/docs/articles/ci-cd-github/pr-preview-environments.mdx +106 -0
- package/docs/articles/ci-cd-github/tag-based-releases.mdx +99 -0
- package/docs/articles/ci-cd-gitlab/basic-deployment.mdx +28 -0
- package/docs/articles/ci-cd-gitlab/deploy-and-test.mdx +44 -0
- package/docs/articles/ci-cd-gitlab/local-testing.mdx +39 -0
- package/docs/articles/ci-cd-gitlab/mr-preview-environments.mdx +52 -0
- package/docs/articles/ci-cd-gitlab/multi-stage-deployment.mdx +64 -0
- package/docs/articles/ci-cd-gitlab/tag-based-releases.mdx +28 -0
- package/docs/articles/composite-policy-reference.mdx +284 -0
- package/docs/articles/configuring-auth0-for-mcp-auth.mdx +186 -0
- package/docs/articles/configuring-okta-for-mcp-auth.mdx +208 -0
- package/docs/articles/convert-urls-to-openapi.mdx +62 -0
- package/docs/articles/cors.mdx +447 -0
- package/docs/articles/custom-audit-log-policy.mdx +95 -0
- package/docs/articles/custom-ci-cd-azure.mdx +81 -0
- package/docs/articles/custom-ci-cd-bitbucket.mdx +80 -0
- package/docs/articles/custom-ci-cd-circleci.mdx +78 -0
- package/docs/articles/custom-ci-cd-github.mdx +99 -0
- package/docs/articles/custom-ci-cd-gitlab.mdx +79 -0
- package/docs/articles/custom-ci-cd.mdx +82 -0
- package/docs/articles/custom-code-patterns.md +418 -0
- package/docs/articles/custom-domains.mdx +258 -0
- package/docs/articles/custom-logging-example.mdx +139 -0
- package/docs/articles/ddos-protection.mdx +138 -0
- package/docs/articles/development-options.mdx +49 -0
- package/docs/articles/environment-variables.mdx +134 -0
- package/docs/articles/environments.mdx +143 -0
- package/docs/articles/fastly-zuplo-host-setup.mdx +41 -0
- package/docs/articles/github-deployment-testing.mdx +101 -0
- package/docs/articles/gke-with-upstream-auth-policy.mdx +192 -0
- package/docs/articles/graphql-security.mdx +180 -0
- package/docs/articles/handling-form-data.mdx +61 -0
- package/docs/articles/health-checks.mdx +109 -0
- package/docs/articles/hosting-options.mdx +70 -0
- package/docs/articles/lazy-load-configuration-into-cache.mdx +92 -0
- package/docs/articles/limits.mdx +98 -0
- package/docs/articles/local-development-debugging.mdx +44 -0
- package/docs/articles/local-development-env-variables.mdx +23 -0
- package/docs/articles/local-development-installing-packages.mdx +23 -0
- package/docs/articles/local-development-routes-designer.mdx +27 -0
- package/docs/articles/local-development-services.mdx +40 -0
- package/docs/articles/local-development-troubleshooting.mdx +56 -0
- package/docs/articles/local-development.mdx +81 -0
- package/docs/articles/log-plugin-aws-cloudwatch.mdx +83 -0
- package/docs/articles/log-plugin-datadog.mdx +84 -0
- package/docs/articles/log-plugin-dynatrace.mdx +75 -0
- package/docs/articles/log-plugin-gcp.mdx +75 -0
- package/docs/articles/log-plugin-loki.mdx +136 -0
- package/docs/articles/log-plugin-new-relic.mdx +84 -0
- package/docs/articles/log-plugin-splunk.mdx +104 -0
- package/docs/articles/log-plugin-sumo.mdx +73 -0
- package/docs/articles/log-plugin-vmware-log-insight.mdx +154 -0
- package/docs/articles/log-request-response-data.mdx +398 -0
- package/docs/articles/logging.mdx +115 -0
- package/docs/articles/manual-mcp-oauth-testing.mdx +193 -0
- package/docs/articles/mcp-quickstart.mdx +135 -0
- package/docs/articles/metrics-plugins.mdx +371 -0
- package/docs/articles/migrate-from-apigee.md +408 -0
- package/docs/articles/migrate-from-aws-api-gateway.md +248 -0
- package/docs/articles/migrate-from-azure-apim.md +292 -0
- package/docs/articles/migrate-from-kong.md +300 -0
- package/docs/articles/migration-overview.md +81 -0
- package/docs/articles/monetization/api-access.mdx +69 -0
- package/docs/articles/monetization/billing-models.md +520 -0
- package/docs/articles/monetization/developer-portal.md +167 -0
- package/docs/articles/monetization/features.mdx +98 -0
- package/docs/articles/monetization/index.mdx +113 -0
- package/docs/articles/monetization/meters.mdx +135 -0
- package/docs/articles/monetization/monetization-policy.md +314 -0
- package/docs/articles/monetization/plan-examples.mdx +366 -0
- package/docs/articles/monetization/plans.mdx +266 -0
- package/docs/articles/monetization/pricing-models.mdx +225 -0
- package/docs/articles/monetization/private-plans.md +154 -0
- package/docs/articles/monetization/quickstart.md +355 -0
- package/docs/articles/monetization/rate-cards.mdx +171 -0
- package/docs/articles/monetization/stripe-integration.md +195 -0
- package/docs/articles/monetization/subscription-lifecycle.md +298 -0
- package/docs/articles/monetization/tax-collection.md +166 -0
- package/docs/articles/monetization/troubleshooting.md +272 -0
- package/docs/articles/monetization-custom.mdx +71 -0
- package/docs/articles/monetization-integrations.mdx +104 -0
- package/docs/articles/monitoring-your-gateway.mdx +53 -0
- package/docs/articles/monorepo-deployment.mdx +350 -0
- package/docs/articles/multiple-auth-policies.mdx +81 -0
- package/docs/articles/non-standard-ports.mdx +30 -0
- package/docs/articles/oauth-authentication.mdx +54 -0
- package/docs/articles/openapi-server-urls.mdx +60 -0
- package/docs/articles/openapi.mdx +130 -0
- package/docs/articles/opentelemetry.mdx +250 -0
- package/docs/articles/per-user-rate-limits-using-db.mdx +112 -0
- package/docs/articles/performance-testing.mdx +304 -0
- package/docs/articles/plugin-akamai-api-security.mdx +76 -0
- package/docs/articles/plugin-azure-blob.mdx +73 -0
- package/docs/articles/plugin-azure-event-hubs.mdx +64 -0
- package/docs/articles/plugin-hydrolix-traffic-peak.mdx +147 -0
- package/docs/articles/policies.mdx +33 -0
- package/docs/articles/rename-or-move-project.mdx +39 -0
- package/docs/articles/rick-and-morty-api-developer-portal-example.mdx +23 -0
- package/docs/articles/routing.mdx +193 -0
- package/docs/articles/s3-signed-url-uploads.mdx +521 -0
- package/docs/articles/secure-tunnel.mdx +84 -0
- package/docs/articles/securing-backend-mtls.mdx +268 -0
- package/docs/articles/securing-your-backend.mdx +148 -0
- package/docs/articles/security.mdx +105 -0
- package/docs/articles/sharing-code-across-projects.mdx +412 -0
- package/docs/articles/source-control-setup-azure.mdx +13 -0
- package/docs/articles/source-control-setup-bitbucket.mdx +43 -0
- package/docs/articles/source-control-setup-github.mdx +172 -0
- package/docs/articles/source-control-setup-gitlab.mdx +12 -0
- package/docs/articles/source-control.mdx +80 -0
- package/docs/articles/step-1-setup-basic-gateway-local.mdx +136 -0
- package/docs/articles/step-1-setup-basic-gateway.mdx +118 -0
- package/docs/articles/step-2-add-rate-limiting-local.mdx +126 -0
- package/docs/articles/step-2-add-rate-limiting.mdx +82 -0
- package/docs/articles/step-3-add-api-key-auth-local.mdx +199 -0
- package/docs/articles/step-3-add-api-key-auth.mdx +166 -0
- package/docs/articles/step-4-deploying-to-the-edge.mdx +220 -0
- package/docs/articles/step-5-dynamic-rate-limiting.mdx +167 -0
- package/docs/articles/support.mdx +144 -0
- package/docs/articles/terraform.mdx +114 -0
- package/docs/articles/testing-graphql.mdx +34 -0
- package/docs/articles/testing.mdx +522 -0
- package/docs/articles/troubleshooting-slow-responses.mdx +301 -0
- package/docs/articles/troubleshooting.md +302 -0
- package/docs/articles/tsconfig.mdx +105 -0
- package/docs/articles/tunnel-setup.mdx +195 -0
- package/docs/articles/tunnel-troubleshooting.mdx +50 -0
- package/docs/articles/update-zup-in-github-action.mdx +110 -0
- package/docs/articles/use-openapi-extension-data.mdx +79 -0
- package/docs/articles/users/multifactor-authentication.mdx +64 -0
- package/docs/articles/users/profile.mdx +13 -0
- package/docs/articles/versioning-on-zuplo.mdx +89 -0
- package/docs/articles/waf-ddos-akamai.md +133 -0
- package/docs/articles/waf-ddos-aws-waf-shield.mdx +85 -0
- package/docs/articles/waf-ddos-fastly.mdx +251 -0
- package/docs/articles/waf-ddos.mdx +140 -0
- package/docs/articles/zuplo-waf.mdx +156 -0
- package/docs/ask.mdx +3 -0
- package/docs/cli/authentication.mdx +56 -0
- package/docs/cli/connectivity.mdx +38 -0
- package/docs/cli/create-zuplo-api.mdx +80 -0
- package/docs/cli/delete.mdx +79 -0
- package/docs/cli/deploy.mdx +156 -0
- package/docs/cli/deploy.partial.mdx +46 -0
- package/docs/cli/dev.mdx +115 -0
- package/docs/cli/docs.mdx +66 -0
- package/docs/cli/editor.mdx +50 -0
- package/docs/cli/global-options.mdx +19 -0
- package/docs/cli/init.mdx +74 -0
- package/docs/cli/link.mdx +74 -0
- package/docs/cli/list.mdx +55 -0
- package/docs/cli/mtls-certificate-create.mdx +94 -0
- package/docs/cli/mtls-certificate-delete.mdx +55 -0
- package/docs/cli/mtls-certificate-describe.mdx +55 -0
- package/docs/cli/mtls-certificate-disable.mdx +55 -0
- package/docs/cli/mtls-certificate-list.mdx +47 -0
- package/docs/cli/mtls-certificate-update.mdx +72 -0
- package/docs/cli/openapi-convert.mdx +111 -0
- package/docs/cli/openapi-merge.mdx +138 -0
- package/docs/cli/openapi-merge.partial.mdx +29 -0
- package/docs/cli/openapi-overlay.mdx +123 -0
- package/docs/cli/overview.mdx +78 -0
- package/docs/cli/project-create.mdx +43 -0
- package/docs/cli/source-migrate.mdx +18 -0
- package/docs/cli/source-upgrade.mdx +41 -0
- package/docs/cli/test.mdx +70 -0
- package/docs/cli/test.partial.mdx +7 -0
- package/docs/cli/tunnel-create.mdx +53 -0
- package/docs/cli/tunnel-create.partial.mdx +9 -0
- package/docs/cli/tunnel-delete.mdx +35 -0
- package/docs/cli/tunnel-delete.partial.mdx +9 -0
- package/docs/cli/tunnel-describe.mdx +45 -0
- package/docs/cli/tunnel-describe.partial.mdx +5 -0
- package/docs/cli/tunnel-list.mdx +35 -0
- package/docs/cli/tunnel-list.partial.mdx +9 -0
- package/docs/cli/tunnel-rate-token.partial.mdx +9 -0
- package/docs/cli/tunnel-rotate-token.mdx +39 -0
- package/docs/cli/tunnel-services-describe.mdx +45 -0
- package/docs/cli/tunnel-services-describe.partial.mdx +9 -0
- package/docs/cli/tunnel-services-update.mdx +48 -0
- package/docs/cli/variable-create.mdx +91 -0
- package/docs/cli/variable-create.partial.mdx +5 -0
- package/docs/cli/variable-update.mdx +75 -0
- package/docs/cli/variable-update.partial.mdx +5 -0
- package/docs/concepts/api-keys.md +146 -0
- package/docs/concepts/authentication.mdx +109 -0
- package/docs/concepts/how-zuplo-works.mdx +120 -0
- package/docs/concepts/project-structure.mdx +174 -0
- package/docs/concepts/rate-limiting.md +246 -0
- package/docs/concepts/request-lifecycle.mdx +56 -0
- package/docs/concepts/source-control-and-deployment.mdx +229 -0
- package/docs/conferences/conference-prize-terms.mdx +80 -0
- package/docs/dedicated/akamai/ai-powered-applications.mdx +223 -0
- package/docs/dedicated/akamai/architecture.mdx +280 -0
- package/docs/dedicated/akamai/caching.mdx +212 -0
- package/docs/dedicated/akamai/cdn.mdx +156 -0
- package/docs/dedicated/architecture.mdx +208 -0
- package/docs/dedicated/custom-domains.mdx +31 -0
- package/docs/dedicated/federated-gateways.mdx +80 -0
- package/docs/dedicated/networking.mdx +69 -0
- package/docs/dedicated/overview.mdx +80 -0
- package/docs/dedicated/source-control.mdx +63 -0
- package/docs/dev-portal/dev-portal-create-consumer-on-auth.mdx +134 -0
- package/docs/dev-portal/introduction.mdx +65 -0
- package/docs/dev-portal/local-development.mdx +72 -0
- package/docs/dev-portal/migration.mdx +526 -0
- package/docs/dev-portal/node-modules.mdx +45 -0
- package/docs/dev-portal/updating.mdx +28 -0
- package/docs/dev-portal/zudoku/components/alert.mdx +130 -0
- package/docs/dev-portal/zudoku/components/badge.mdx +70 -0
- package/docs/dev-portal/zudoku/components/button.mdx +132 -0
- package/docs/dev-portal/zudoku/components/callout.mdx +112 -0
- package/docs/dev-portal/zudoku/components/card.mdx +104 -0
- package/docs/dev-portal/zudoku/components/checkbox.mdx +72 -0
- package/docs/dev-portal/zudoku/components/client-only.mdx +79 -0
- package/docs/dev-portal/zudoku/components/code-tabs.mdx +179 -0
- package/docs/dev-portal/zudoku/components/dialog.mdx +167 -0
- package/docs/dev-portal/zudoku/components/head.mdx +199 -0
- package/docs/dev-portal/zudoku/components/icons.mdx +27 -0
- package/docs/dev-portal/zudoku/components/input.mdx +96 -0
- package/docs/dev-portal/zudoku/components/label.mdx +86 -0
- package/docs/dev-portal/zudoku/components/link.mdx +242 -0
- package/docs/dev-portal/zudoku/components/markdown.mdx +151 -0
- package/docs/dev-portal/zudoku/components/mermaid.mdx +81 -0
- package/docs/dev-portal/zudoku/components/playground.mdx +87 -0
- package/docs/dev-portal/zudoku/components/secret.mdx +78 -0
- package/docs/dev-portal/zudoku/components/select.mdx +176 -0
- package/docs/dev-portal/zudoku/components/shadcn.mdx +73 -0
- package/docs/dev-portal/zudoku/components/slider.mdx +108 -0
- package/docs/dev-portal/zudoku/components/slot.mdx +119 -0
- package/docs/dev-portal/zudoku/components/stepper.mdx +138 -0
- package/docs/dev-portal/zudoku/components/switch.mdx +96 -0
- package/docs/dev-portal/zudoku/components/syntax-highlight.mdx +602 -0
- package/docs/dev-portal/zudoku/components/textarea.mdx +78 -0
- package/docs/dev-portal/zudoku/components/tooltip.mdx +195 -0
- package/docs/dev-portal/zudoku/components/typography.mdx +61 -0
- package/docs/dev-portal/zudoku/configuration/ai-assistants.md +64 -0
- package/docs/dev-portal/zudoku/configuration/api-catalog.md +108 -0
- package/docs/dev-portal/zudoku/configuration/api-reference.md +397 -0
- package/docs/dev-portal/zudoku/configuration/authentication-auth0.md +173 -0
- package/docs/dev-portal/zudoku/configuration/authentication-azure-ad.md +238 -0
- package/docs/dev-portal/zudoku/configuration/authentication-clerk.md +110 -0
- package/docs/dev-portal/zudoku/configuration/authentication-firebase.md +61 -0
- package/docs/dev-portal/zudoku/configuration/authentication-pingfederate.md +136 -0
- package/docs/dev-portal/zudoku/configuration/authentication-supabase.md +225 -0
- package/docs/dev-portal/zudoku/configuration/authentication.md +199 -0
- package/docs/dev-portal/zudoku/configuration/build-configuration.mdx +147 -0
- package/docs/dev-portal/zudoku/configuration/docs.md +282 -0
- package/docs/dev-portal/zudoku/configuration/footer.mdx +214 -0
- package/docs/dev-portal/zudoku/configuration/llms.md +89 -0
- package/docs/dev-portal/zudoku/configuration/navigation.mdx +408 -0
- package/docs/dev-portal/zudoku/configuration/overview.md +380 -0
- package/docs/dev-portal/zudoku/configuration/protected-routes.md +149 -0
- package/docs/dev-portal/zudoku/configuration/search.md +169 -0
- package/docs/dev-portal/zudoku/configuration/sentry.mdx +44 -0
- package/docs/dev-portal/zudoku/configuration/site.md +124 -0
- package/docs/dev-portal/zudoku/configuration/slots.mdx +124 -0
- package/docs/dev-portal/zudoku/configuration/vite-config.md +18 -0
- package/docs/dev-portal/zudoku/custom-plugins.md +287 -0
- package/docs/dev-portal/zudoku/customization/colors-theme.mdx +275 -0
- package/docs/dev-portal/zudoku/customization/fonts.md +110 -0
- package/docs/dev-portal/zudoku/extending/events.md +124 -0
- package/docs/dev-portal/zudoku/guides/custom-pages.md +106 -0
- package/docs/dev-portal/zudoku/guides/environment-variables.md +99 -0
- package/docs/dev-portal/zudoku/guides/mermaid.mdx +70 -0
- package/docs/dev-portal/zudoku/guides/navigation-migration.md +87 -0
- package/docs/dev-portal/zudoku/guides/navigation-rules.mdx +197 -0
- package/docs/dev-portal/zudoku/guides/processors.mdx +234 -0
- package/docs/dev-portal/zudoku/guides/static-files.md +55 -0
- package/docs/dev-portal/zudoku/guides/transforming-examples.md +156 -0
- package/docs/dev-portal/zudoku/guides/using-multiple-apis.md +87 -0
- package/docs/dev-portal/zudoku/markdown/admonitions.md +128 -0
- package/docs/dev-portal/zudoku/markdown/code-blocks.md +196 -0
- package/docs/dev-portal/zudoku/markdown/frontmatter.md +172 -0
- package/docs/dev-portal/zudoku/markdown/mdx.md +68 -0
- package/docs/dev-portal/zudoku/markdown/overview.md +275 -0
- package/docs/dev-portal/zudoku/plugins.md +5 -0
- package/docs/dev-portal/zudoku/writing.mdx +72 -0
- package/docs/errors/bad-request.mdx +39 -0
- package/docs/errors/build-error.mdx +45 -0
- package/docs/errors/fatal-project-error.mdx +39 -0
- package/docs/errors/gateway-timeout.mdx +33 -0
- package/docs/errors/get-head-body-error.mdx +41 -0
- package/docs/errors/main-mod-error.mdx +40 -0
- package/docs/errors/no-project-set.mdx +41 -0
- package/docs/errors/not-found.mdx +43 -0
- package/docs/errors/rate-limit-exceeded.mdx +31 -0
- package/docs/errors/schema-validation-failed.mdx +51 -0
- package/docs/errors/system-configuration-error.mdx +44 -0
- package/docs/errors/unauthorized.mdx +50 -0
- package/docs/errors/unknown-error.mdx +42 -0
- package/docs/errors.mdx +14 -0
- package/docs/guides/canary-routing-for-employees.mdx +385 -0
- package/docs/guides/geolocation-backend-routing.mdx +404 -0
- package/docs/guides/modify-openapi-paths.mdx +371 -0
- package/docs/guides/openapi-overlays.mdx +492 -0
- package/docs/guides/overview.mdx +12 -0
- package/docs/guides/user-based-backend-routing.mdx +437 -0
- package/docs/handlers/aws-lambda.mdx +201 -0
- package/docs/handlers/custom-handler.mdx +112 -0
- package/docs/handlers/legacy-dev-portal-handler.mdx +135 -0
- package/docs/handlers/mcp-server.mdx +730 -0
- package/docs/handlers/openapi.mdx +78 -0
- package/docs/handlers/redirect.mdx +115 -0
- package/docs/handlers/system-handlers.mdx +41 -0
- package/docs/handlers/url-forward.mdx +204 -0
- package/docs/handlers/url-rewrite.mdx +224 -0
- package/docs/handlers/websocket-handler.mdx +154 -0
- package/docs/home.mdx +6 -0
- package/docs/managed-edge/overview.md +78 -0
- package/docs/mcp-server/configuration-migration-guide.mdx +344 -0
- package/docs/mcp-server/custom-tools.mdx +487 -0
- package/docs/mcp-server/graphql.mdx +241 -0
- package/docs/mcp-server/introduction.mdx +122 -0
- package/docs/mcp-server/openai-apps-sdk.mdx +160 -0
- package/docs/mcp-server/prompts.mdx +283 -0
- package/docs/mcp-server/resources.mdx +288 -0
- package/docs/mcp-server/testing.mdx +53 -0
- package/docs/mcp-server/tools.mdx +306 -0
- package/docs/policies/_index.md +92 -0
- package/docs/policies/ab-test-inbound/intro.md +8 -0
- package/docs/policies/ab-test-inbound/policy.ts +14 -0
- package/docs/policies/ab-test-inbound/schema.json +27 -0
- package/docs/policies/ab-test-outbound/intro.md +8 -0
- package/docs/policies/ab-test-outbound/policy.ts +26 -0
- package/docs/policies/ab-test-outbound/schema.json +27 -0
- package/docs/policies/acl-policy-inbound/intro.md +5 -0
- package/docs/policies/acl-policy-inbound/policy.ts +32 -0
- package/docs/policies/acl-policy-inbound/schema.json +52 -0
- package/docs/policies/akamai-ai-firewall/schema.json +98 -0
- package/docs/policies/amberflo-metering-inbound/doc.md +183 -0
- package/docs/policies/amberflo-metering-inbound/intro.md +20 -0
- package/docs/policies/amberflo-metering-inbound/schema.json +108 -0
- package/docs/policies/api-key-inbound/doc.md +77 -0
- package/docs/policies/api-key-inbound/intro.md +30 -0
- package/docs/policies/api-key-inbound/schema.json +84 -0
- package/docs/policies/archive-request-aws-s3-inbound/intro.md +4 -0
- package/docs/policies/archive-request-aws-s3-inbound/policy.ts +58 -0
- package/docs/policies/archive-request-aws-s3-inbound/schema.json +68 -0
- package/docs/policies/archive-request-azure-storage-inbound/doc.md +31 -0
- package/docs/policies/archive-request-azure-storage-inbound/intro.md +4 -0
- package/docs/policies/archive-request-azure-storage-inbound/policy.ts +54 -0
- package/docs/policies/archive-request-azure-storage-inbound/schema.json +53 -0
- package/docs/policies/archive-request-gcp-storage-inbound/doc.md +63 -0
- package/docs/policies/archive-request-gcp-storage-inbound/intro.md +4 -0
- package/docs/policies/archive-request-gcp-storage-inbound/policy.ts +68 -0
- package/docs/policies/archive-request-gcp-storage-inbound/schema.json +47 -0
- package/docs/policies/archive-response-aws-s3-outbound/intro.md +2 -0
- package/docs/policies/archive-response-aws-s3-outbound/policy.ts +59 -0
- package/docs/policies/archive-response-aws-s3-outbound/schema.json +68 -0
- package/docs/policies/archive-response-azure-storage-outbound/doc.md +31 -0
- package/docs/policies/archive-response-azure-storage-outbound/intro.md +3 -0
- package/docs/policies/archive-response-azure-storage-outbound/policy.ts +54 -0
- package/docs/policies/archive-response-azure-storage-outbound/schema.json +53 -0
- package/docs/policies/audit-log-inbound/doc.md +78 -0
- package/docs/policies/audit-log-inbound/intro.md +10 -0
- package/docs/policies/audit-log-inbound/schema.json +81 -0
- package/docs/policies/auth0-jwt-auth-inbound/doc.md +125 -0
- package/docs/policies/auth0-jwt-auth-inbound/intro.md +17 -0
- package/docs/policies/auth0-jwt-auth-inbound/schema.json +74 -0
- package/docs/policies/authzen-inbound/doc.md +24 -0
- package/docs/policies/authzen-inbound/intro.md +31 -0
- package/docs/policies/authzen-inbound/schema.json +126 -0
- package/docs/policies/axiomatics-authz-inbound/doc.md +144 -0
- package/docs/policies/axiomatics-authz-inbound/intro.md +11 -0
- package/docs/policies/axiomatics-authz-inbound/schema.json +161 -0
- package/docs/policies/basic-auth-inbound/intro.md +9 -0
- package/docs/policies/basic-auth-inbound/schema.json +99 -0
- package/docs/policies/bot-detection-inbound/intro.md +4 -0
- package/docs/policies/bot-detection-inbound/schema.json +56 -0
- package/docs/policies/brownout-inbound/doc.md +55 -0
- package/docs/policies/brownout-inbound/intro.md +12 -0
- package/docs/policies/brownout-inbound/schema.json +115 -0
- package/docs/policies/caching-inbound/doc.md +209 -0
- package/docs/policies/caching-inbound/intro.md +23 -0
- package/docs/policies/caching-inbound/schema.json +98 -0
- package/docs/policies/change-method-inbound/schema.json +56 -0
- package/docs/policies/clear-headers-inbound/schema.json +59 -0
- package/docs/policies/clear-headers-outbound/schema.json +59 -0
- package/docs/policies/clerk-jwt-auth-inbound/doc.md +85 -0
- package/docs/policies/clerk-jwt-auth-inbound/intro.md +4 -0
- package/docs/policies/clerk-jwt-auth-inbound/schema.json +68 -0
- package/docs/policies/cognito-jwt-auth-inbound/intro.md +7 -0
- package/docs/policies/cognito-jwt-auth-inbound/schema.json +74 -0
- package/docs/policies/comet-opik-tracing-inbound/schema.json +65 -0
- package/docs/policies/complex-rate-limit-inbound/doc.md +20 -0
- package/docs/policies/complex-rate-limit-inbound/intro.md +23 -0
- package/docs/policies/complex-rate-limit-inbound/schema.json +142 -0
- package/docs/policies/composite-inbound/doc.md +69 -0
- package/docs/policies/composite-inbound/intro.md +15 -0
- package/docs/policies/composite-inbound/schema.json +59 -0
- package/docs/policies/composite-outbound/intro.md +6 -0
- package/docs/policies/composite-outbound/schema.json +59 -0
- package/docs/policies/curity-phantom-token-inbound/doc.md +109 -0
- package/docs/policies/curity-phantom-token-inbound/intro.md +3 -0
- package/docs/policies/curity-phantom-token-inbound/schema.json +68 -0
- package/docs/policies/custom-code-inbound/doc.md +267 -0
- package/docs/policies/custom-code-inbound/intro.md +2 -0
- package/docs/policies/custom-code-inbound/schema.json +48 -0
- package/docs/policies/custom-code-outbound/doc.md +235 -0
- package/docs/policies/custom-code-outbound/intro.md +2 -0
- package/docs/policies/custom-code-outbound/schema.json +43 -0
- package/docs/policies/firebase-jwt-inbound/intro.md +6 -0
- package/docs/policies/firebase-jwt-inbound/schema.json +68 -0
- package/docs/policies/formdata-to-json-inbound/schema.json +60 -0
- package/docs/policies/galileo-tracing-inbound/schema.json +65 -0
- package/docs/policies/geo-filter-inbound/doc.md +33 -0
- package/docs/policies/geo-filter-inbound/schema.json +108 -0
- package/docs/policies/graphql-complexity-limit-inbound/doc.md +48 -0
- package/docs/policies/graphql-complexity-limit-inbound/intro.md +2 -0
- package/docs/policies/graphql-complexity-limit-inbound/schema.json +90 -0
- package/docs/policies/graphql-disable-introspection-inbound/doc.md +66 -0
- package/docs/policies/graphql-disable-introspection-inbound/intro.md +15 -0
- package/docs/policies/graphql-disable-introspection-inbound/schema.json +48 -0
- package/docs/policies/graphql-introspection-filter-outbound/doc.md +148 -0
- package/docs/policies/graphql-introspection-filter-outbound/schema.json +79 -0
- package/docs/policies/hmac-auth-inbound/doc.md +30 -0
- package/docs/policies/hmac-auth-inbound/intro.md +10 -0
- package/docs/policies/hmac-auth-inbound/policy.ts +70 -0
- package/docs/policies/hmac-auth-inbound/schema.json +53 -0
- package/docs/policies/http-deprecation-outbound/doc.md +73 -0
- package/docs/policies/http-deprecation-outbound/schema.json +83 -0
- package/docs/policies/ip-restriction-inbound/intro.md +8 -0
- package/docs/policies/ip-restriction-inbound/policy.ts +40 -0
- package/docs/policies/ip-restriction-inbound/schema.json +58 -0
- package/docs/policies/jwt-scopes-inbound/schema.json +59 -0
- package/docs/policies/ldap-auth-inbound/schema.json +56 -0
- package/docs/policies/mock-api-inbound/schema.json +72 -0
- package/docs/policies/moesif-inbound/doc.md +44 -0
- package/docs/policies/moesif-inbound/intro.md +6 -0
- package/docs/policies/moesif-inbound/schema.json +68 -0
- package/docs/policies/monetization-inbound/doc.md +87 -0
- package/docs/policies/monetization-inbound/intro.md +6 -0
- package/docs/policies/monetization-inbound/schema.json +102 -0
- package/docs/policies/mtls-auth-inbound/intro.md +6 -0
- package/docs/policies/mtls-auth-inbound/schema.json +68 -0
- package/docs/policies/okta-fga-authz-inbound/doc.md +181 -0
- package/docs/policies/okta-fga-authz-inbound/intro.md +20 -0
- package/docs/policies/okta-fga-authz-inbound/schema.json +104 -0
- package/docs/policies/okta-jwt-auth-inbound/intro.md +7 -0
- package/docs/policies/okta-jwt-auth-inbound/schema.json +74 -0
- package/docs/policies/open-id-jwt-auth-inbound/doc.md +58 -0
- package/docs/policies/open-id-jwt-auth-inbound/intro.md +30 -0
- package/docs/policies/open-id-jwt-auth-inbound/schema.json +128 -0
- package/docs/policies/openfga-authz-inbound/doc.md +207 -0
- package/docs/policies/openfga-authz-inbound/intro.md +17 -0
- package/docs/policies/openfga-authz-inbound/schema.json +191 -0
- package/docs/policies/openmeter-inbound/doc.md +163 -0
- package/docs/policies/openmeter-inbound/intro.md +18 -0
- package/docs/policies/openmeter-inbound/schema.json +183 -0
- package/docs/policies/prompt-injection-outbound/doc.md +106 -0
- package/docs/policies/prompt-injection-outbound/intro.md +4 -0
- package/docs/policies/prompt-injection-outbound/schema.json +74 -0
- package/docs/policies/propel-auth-jwt-inbound/doc.md +88 -0
- package/docs/policies/propel-auth-jwt-inbound/intro.md +4 -0
- package/docs/policies/propel-auth-jwt-inbound/schema.json +74 -0
- package/docs/policies/query-param-to-header-inbound/doc.md +70 -0
- package/docs/policies/query-param-to-header-inbound/intro.md +5 -0
- package/docs/policies/query-param-to-header-inbound/schema.json +74 -0
- package/docs/policies/quota-inbound/doc.md +235 -0
- package/docs/policies/quota-inbound/intro.md +7 -0
- package/docs/policies/quota-inbound/schema.json +133 -0
- package/docs/policies/rate-limit-inbound/doc.md +78 -0
- package/docs/policies/rate-limit-inbound/intro.md +30 -0
- package/docs/policies/rate-limit-inbound/schema.json +134 -0
- package/docs/policies/rbac-policy-inbound/intro.md +3 -0
- package/docs/policies/rbac-policy-inbound/policy.ts +42 -0
- package/docs/policies/rbac-policy-inbound/schema.json +52 -0
- package/docs/policies/readme-metrics-inbound/doc.md +1 -0
- package/docs/policies/readme-metrics-inbound/intro.md +3 -0
- package/docs/policies/readme-metrics-inbound/schema.json +84 -0
- package/docs/policies/remove-headers-inbound/schema.json +59 -0
- package/docs/policies/remove-headers-outbound/schema.json +59 -0
- package/docs/policies/remove-query-params-inbound/schema.json +59 -0
- package/docs/policies/replace-string-outbound/schema.json +69 -0
- package/docs/policies/request-size-limit-inbound/schema.json +60 -0
- package/docs/policies/request-validation-inbound/doc.md +72 -0
- package/docs/policies/request-validation-inbound/intro.md +24 -0
- package/docs/policies/request-validation-inbound/schema.json +98 -0
- package/docs/policies/require-origin-inbound/intro.md +12 -0
- package/docs/policies/require-origin-inbound/schema.json +65 -0
- package/docs/policies/secret-masking-outbound/doc.md +41 -0
- package/docs/policies/secret-masking-outbound/intro.md +13 -0
- package/docs/policies/secret-masking-outbound/schema.json +65 -0
- package/docs/policies/semantic-cache-inbound/doc.md +63 -0
- package/docs/policies/semantic-cache-inbound/intro.md +4 -0
- package/docs/policies/semantic-cache-inbound/schema.json +179 -0
- package/docs/policies/set-body-inbound/intro.md +7 -0
- package/docs/policies/set-body-inbound/schema.json +56 -0
- package/docs/policies/set-headers-inbound/doc.md +41 -0
- package/docs/policies/set-headers-inbound/intro.md +2 -0
- package/docs/policies/set-headers-inbound/schema.json +83 -0
- package/docs/policies/set-headers-outbound/schema.json +83 -0
- package/docs/policies/set-query-params-inbound/schema.json +83 -0
- package/docs/policies/set-status-outbound/schema.json +62 -0
- package/docs/policies/sleep-inbound/schema.json +56 -0
- package/docs/policies/stripe-webhook-verification-inbound/intro.md +2 -0
- package/docs/policies/stripe-webhook-verification-inbound/schema.json +60 -0
- package/docs/policies/supabase-jwt-auth-inbound/doc.md +29 -0
- package/docs/policies/supabase-jwt-auth-inbound/intro.md +12 -0
- package/docs/policies/supabase-jwt-auth-inbound/schema.json +86 -0
- package/docs/policies/transform-body-inbound/intro.md +8 -0
- package/docs/policies/transform-body-inbound/policy.ts +16 -0
- package/docs/policies/transform-body-inbound/schema.json +27 -0
- package/docs/policies/transform-body-outbound/intro.md +8 -0
- package/docs/policies/transform-body-outbound/policy.ts +19 -0
- package/docs/policies/transform-body-outbound/schema.json +27 -0
- package/docs/policies/upstream-azure-ad-service-auth-inbound/doc.md +82 -0
- package/docs/policies/upstream-azure-ad-service-auth-inbound/intro.md +20 -0
- package/docs/policies/upstream-azure-ad-service-auth-inbound/schema.json +84 -0
- package/docs/policies/upstream-firebase-admin-auth-inbound/intro.md +10 -0
- package/docs/policies/upstream-firebase-admin-auth-inbound/schema.json +68 -0
- package/docs/policies/upstream-firebase-user-auth-inbound/intro.md +2 -0
- package/docs/policies/upstream-firebase-user-auth-inbound/schema.json +113 -0
- package/docs/policies/upstream-gcp-federated-auth-inbound/doc.md +139 -0
- package/docs/policies/upstream-gcp-federated-auth-inbound/intro.md +21 -0
- package/docs/policies/upstream-gcp-federated-auth-inbound/schema.json +96 -0
- package/docs/policies/upstream-gcp-jwt-inbound/intro.md +10 -0
- package/docs/policies/upstream-gcp-jwt-inbound/schema.json +62 -0
- package/docs/policies/upstream-gcp-service-auth-inbound/doc.md +132 -0
- package/docs/policies/upstream-gcp-service-auth-inbound/intro.md +25 -0
- package/docs/policies/upstream-gcp-service-auth-inbound/schema.json +95 -0
- package/docs/policies/upstream-zuplo-jwt-auth-inbound/doc.md +213 -0
- package/docs/policies/upstream-zuplo-jwt-auth-inbound/intro.md +16 -0
- package/docs/policies/upstream-zuplo-jwt-auth-inbound/schema.json +101 -0
- package/docs/policies/validate-json-schema-inbound/doc.md +129 -0
- package/docs/policies/validate-json-schema-inbound/intro.md +7 -0
- package/docs/policies/validate-json-schema-inbound/schema.json +56 -0
- package/docs/policies/web-bot-auth-inbound/doc.md +104 -0
- package/docs/policies/web-bot-auth-inbound/intro.md +16 -0
- package/docs/policies/web-bot-auth-inbound/schema.json +76 -0
- package/docs/policies/xml-to-json-outbound/doc.md +71 -0
- package/docs/policies/xml-to-json-outbound/intro.md +4 -0
- package/docs/policies/xml-to-json-outbound/schema.json +117 -0
- package/docs/programmable-api/audit-log.mdx +74 -0
- package/docs/programmable-api/background-dispatcher.mdx +124 -0
- package/docs/programmable-api/background-loader.mdx +104 -0
- package/docs/programmable-api/cache.mdx +186 -0
- package/docs/programmable-api/compatibility-dates.mdx +201 -0
- package/docs/programmable-api/console-logging.mdx +48 -0
- package/docs/programmable-api/context-data.mdx +127 -0
- package/docs/programmable-api/custom-cors-policy.mdx +64 -0
- package/docs/programmable-api/environment.mdx +328 -0
- package/docs/programmable-api/hooks.mdx +569 -0
- package/docs/programmable-api/http-problems.mdx +385 -0
- package/docs/programmable-api/jwt-service-plugin.mdx +420 -0
- package/docs/programmable-api/logger.mdx +223 -0
- package/docs/programmable-api/memory-zone-read-through-cache.mdx +96 -0
- package/docs/programmable-api/node-modules.mdx +67 -0
- package/docs/programmable-api/not-found-handler.mdx +47 -0
- package/docs/programmable-api/oauth-protected-resource-plugin.mdx +46 -0
- package/docs/programmable-api/overview.mdx +213 -0
- package/docs/programmable-api/problem-response-formatter.mdx +183 -0
- package/docs/programmable-api/request-user.mdx +289 -0
- package/docs/programmable-api/reusing-code.mdx +26 -0
- package/docs/programmable-api/route-raw.mdx +55 -0
- package/docs/programmable-api/runtime-behaviors.mdx +25 -0
- package/docs/programmable-api/runtime-errors.mdx +246 -0
- package/docs/programmable-api/runtime-extensions.mdx +340 -0
- package/docs/programmable-api/safely-clone-a-request-or-response.mdx +57 -0
- package/docs/programmable-api/streaming-zone-cache.mdx +155 -0
- package/docs/programmable-api/web-crypto-apis.mdx +219 -0
- package/docs/programmable-api/web-standard-apis.mdx +109 -0
- package/docs/programmable-api/zone-cache.mdx +131 -0
- package/docs/programmable-api/zp-body-removed.mdx +32 -0
- package/docs/programmable-api/zuplo-context.mdx +414 -0
- package/docs/programmable-api/zuplo-id-token.mdx +90 -0
- package/docs/programmable-api/zuplo-json.mdx +91 -0
- package/docs/programmable-api/zuplo-request.mdx +200 -0
- package/docs/sample-apis.mdx +78 -0
- package/docs/self-hosted/overview.md +60 -0
- package/package.json +6 -5
|
@@ -0,0 +1,569 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Request/Response Hooks
|
|
3
|
+
sidebar_label: Hooks
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Hooks allow you to run code at specific points in the request/response pipeline.
|
|
7
|
+
They're accessible through the [ZuploContext](./zuplo-context.mdx) object and
|
|
8
|
+
are commonly used for cross-cutting concerns like logging, tracing, and
|
|
9
|
+
monitoring.
|
|
10
|
+
|
|
11
|
+
:::tip
|
|
12
|
+
|
|
13
|
+
All hooks can be either synchronous or asynchronous. To make your hook
|
|
14
|
+
asynchronous, simply add the `async` keyword to the function.
|
|
15
|
+
|
|
16
|
+
:::
|
|
17
|
+
|
|
18
|
+
## Available Hooks
|
|
19
|
+
|
|
20
|
+
Zuplo provides several hooks for different stages of the request/response
|
|
21
|
+
pipeline:
|
|
22
|
+
|
|
23
|
+
### Request Pipeline Hooks
|
|
24
|
+
|
|
25
|
+
- **`addPreRoutingHook`** - Executes before route matching, can modify the
|
|
26
|
+
request URL or headers
|
|
27
|
+
- **`addRequestHook`** - Executes after route matching but before handlers, can
|
|
28
|
+
return early responses
|
|
29
|
+
|
|
30
|
+
### Response Pipeline Hooks
|
|
31
|
+
|
|
32
|
+
- **`addResponseSendingHook`** - Executes before the response is sent and can
|
|
33
|
+
modify it
|
|
34
|
+
- **`addResponseSendingFinalHook`** - Executes after all processing but can't
|
|
35
|
+
modify the response
|
|
36
|
+
|
|
37
|
+
### Hook Types
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
// Pre-routing hook (available globally via runtime.addPreRoutingHook)
|
|
41
|
+
interface PreRoutingHook {
|
|
42
|
+
(request: Request): Promise<Request> | Request;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Request hook (available globally and per-context)
|
|
46
|
+
interface OnRequestHook {
|
|
47
|
+
(
|
|
48
|
+
request: ZuploRequest,
|
|
49
|
+
context: ZuploContext,
|
|
50
|
+
): Promise<ZuploRequest | Response> | (ZuploRequest | Response);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Response hooks (available globally and per-context)
|
|
54
|
+
interface OnResponseSendingHook {
|
|
55
|
+
(
|
|
56
|
+
response: Response,
|
|
57
|
+
request: ZuploRequest,
|
|
58
|
+
context: ZuploContext,
|
|
59
|
+
): Promise<Response> | Response;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
interface OnResponseSendingFinalHook {
|
|
63
|
+
(
|
|
64
|
+
response: Response,
|
|
65
|
+
request: ZuploRequest,
|
|
66
|
+
context: ZuploContext,
|
|
67
|
+
): Promise<void> | void;
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Hook: OnResponseSending
|
|
72
|
+
|
|
73
|
+
The `addResponseSendingHook` method adds a hook that fires just before the
|
|
74
|
+
response is sent to the client. This hook can modify the response by returning a
|
|
75
|
+
new `Response` object. Multiple hooks execute in the order they were added.
|
|
76
|
+
|
|
77
|
+
### Method Signature
|
|
78
|
+
|
|
79
|
+
```ts
|
|
80
|
+
context.addResponseSendingHook(
|
|
81
|
+
(response: Response, request: Request, context: ZuploContext) =>
|
|
82
|
+
Response | Promise<Response>,
|
|
83
|
+
);
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Example: Adding Response Headers
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
export default async function handler(
|
|
90
|
+
request: ZuploRequest,
|
|
91
|
+
context: ZuploContext,
|
|
92
|
+
) {
|
|
93
|
+
context.addResponseSendingHook(async (response, request) => {
|
|
94
|
+
// Add custom headers to all responses
|
|
95
|
+
response.headers.set("X-Request-ID", context.requestId);
|
|
96
|
+
response.headers.set(
|
|
97
|
+
"X-Processing-Time",
|
|
98
|
+
`${Date.now() - context.custom.startTime}ms`,
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
// Log response details
|
|
102
|
+
context.log.info({
|
|
103
|
+
status: response.status,
|
|
104
|
+
contentType: response.headers.get("content-type"),
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
return response;
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
return fetch(request);
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Example: Tracing Policy
|
|
115
|
+
|
|
116
|
+
This example shows a tracing policy that ensures trace headers are consistent
|
|
117
|
+
between requests and responses:
|
|
118
|
+
|
|
119
|
+
```ts
|
|
120
|
+
import { ZuploContext, ZuploRequest } from "@zuplo/runtime";
|
|
121
|
+
|
|
122
|
+
export async function tracingPlugin(
|
|
123
|
+
request: ZuploRequest,
|
|
124
|
+
context: ZuploContext,
|
|
125
|
+
policyName: string,
|
|
126
|
+
) {
|
|
127
|
+
// Get the trace header
|
|
128
|
+
let traceparent = request.headers.get("traceparent");
|
|
129
|
+
|
|
130
|
+
// If not set, add the header to the request
|
|
131
|
+
if (!traceparent) {
|
|
132
|
+
traceparent = crypto.randomUUID();
|
|
133
|
+
const headers = new Headers(request.headers);
|
|
134
|
+
headers.set("traceparent", traceparent);
|
|
135
|
+
return new ZuploRequest(request, { headers });
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
context.addResponseSendingHook((response, latestRequest, context) => {
|
|
139
|
+
// If the response doesn't have the trace header that matches, set it
|
|
140
|
+
if (response.headers.get("traceparent") !== traceparent) {
|
|
141
|
+
const headers = new Headers(response.headers);
|
|
142
|
+
headers.set("traceparent", traceparent);
|
|
143
|
+
return new Response(response.body, {
|
|
144
|
+
headers,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
return response;
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
return request;
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Hook: OnResponseSendingFinal
|
|
155
|
+
|
|
156
|
+
The `addResponseSendingFinalHook` method adds a hook that fires immediately
|
|
157
|
+
before the response is sent to the client. Unlike `OnResponseSending`, this hook
|
|
158
|
+
can't modify the response - it's immutable at this point. This hook is ideal for
|
|
159
|
+
logging, analytics, and monitoring tasks.
|
|
160
|
+
|
|
161
|
+
### Method Signature
|
|
162
|
+
|
|
163
|
+
```ts
|
|
164
|
+
context.addResponseSendingFinalHook(
|
|
165
|
+
(response: Response, request: Request, context: ZuploContext) => void | Promise<void>
|
|
166
|
+
)
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Example: Request Duration Logging
|
|
170
|
+
|
|
171
|
+
This example logs the total request processing time:
|
|
172
|
+
|
|
173
|
+
```ts
|
|
174
|
+
import { ZuploContext, ZuploRequest } from "@zuplo/runtime";
|
|
175
|
+
|
|
176
|
+
export default async function handler(
|
|
177
|
+
request: ZuploRequest,
|
|
178
|
+
context: ZuploContext,
|
|
179
|
+
) {
|
|
180
|
+
const start = Date.now();
|
|
181
|
+
|
|
182
|
+
context.addResponseSendingFinalHook(async (response, latestRequest) => {
|
|
183
|
+
const end = Date.now();
|
|
184
|
+
const delta = end - start;
|
|
185
|
+
context.log.debug(`Request took ${delta}ms`);
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
return fetch(request);
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Example: Asynchronous Analytics
|
|
193
|
+
|
|
194
|
+
This hook can block the response. To run asynchronous tasks without blocking,
|
|
195
|
+
use `context.waitUntil()` to ensure your async work completes after the response
|
|
196
|
+
is sent:
|
|
197
|
+
|
|
198
|
+
```ts
|
|
199
|
+
export default async function handler(
|
|
200
|
+
request: ZuploRequest,
|
|
201
|
+
context: ZuploContext,
|
|
202
|
+
) {
|
|
203
|
+
// Clone request before it's consumed by the handler
|
|
204
|
+
const requestClone = request.clone();
|
|
205
|
+
|
|
206
|
+
context.addResponseSendingFinalHook(async (response, latestRequest) => {
|
|
207
|
+
// Clone response to read the body without consuming it
|
|
208
|
+
const responseClone = response.clone();
|
|
209
|
+
|
|
210
|
+
const asyncAnalytics = async () => {
|
|
211
|
+
const requestBody = await requestClone.text();
|
|
212
|
+
const responseBody = await responseClone.text();
|
|
213
|
+
|
|
214
|
+
await fetch("https://analytics.example.com/log", {
|
|
215
|
+
method: "POST",
|
|
216
|
+
headers: { "Content-Type": "application/json" },
|
|
217
|
+
body: JSON.stringify({
|
|
218
|
+
requestId: context.requestId,
|
|
219
|
+
requestBody,
|
|
220
|
+
responseBody,
|
|
221
|
+
status: response.status,
|
|
222
|
+
timestamp: new Date().toISOString(),
|
|
223
|
+
}),
|
|
224
|
+
});
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
// Don't block the response
|
|
228
|
+
context.waitUntil(asyncAnalytics());
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
return fetch(request);
|
|
232
|
+
}
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## Best Practices
|
|
236
|
+
|
|
237
|
+
### 1. Order Matters
|
|
238
|
+
|
|
239
|
+
Hooks execute in the order they're added. Plan your hook order carefully:
|
|
240
|
+
|
|
241
|
+
```ts
|
|
242
|
+
// First hook adds authentication info
|
|
243
|
+
context.addResponseSendingHook((response) => {
|
|
244
|
+
response.headers.set("X-User-ID", request.user?.sub || "anonymous");
|
|
245
|
+
return response;
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
// Second hook adds timing (sees the user header)
|
|
249
|
+
context.addResponseSendingHook((response) => {
|
|
250
|
+
response.headers.set("X-Processing-Time", `${Date.now() - start}ms`);
|
|
251
|
+
return response;
|
|
252
|
+
});
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### 2. Clone Before Reading
|
|
256
|
+
|
|
257
|
+
Always clone requests and responses before reading their bodies:
|
|
258
|
+
|
|
259
|
+
```ts
|
|
260
|
+
// ❌ Bad - consumes the original body
|
|
261
|
+
const body = await response.text();
|
|
262
|
+
|
|
263
|
+
// ✅ Good - preserves the original
|
|
264
|
+
const clone = response.clone();
|
|
265
|
+
const body = await clone.text();
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### 3. Use `waitUntil` for Asynchronous Work
|
|
269
|
+
|
|
270
|
+
For operations that shouldn't block the response:
|
|
271
|
+
|
|
272
|
+
```ts
|
|
273
|
+
context.addResponseSendingFinalHook((response) => {
|
|
274
|
+
const asyncWork = async () => {
|
|
275
|
+
// Long-running operation
|
|
276
|
+
await sendToAnalytics(response);
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
context.waitUntil(asyncWork());
|
|
280
|
+
});
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### 4. Handle Errors Gracefully
|
|
284
|
+
|
|
285
|
+
Always handle errors in hooks to prevent response failures:
|
|
286
|
+
|
|
287
|
+
```ts
|
|
288
|
+
context.addResponseSendingHook(async (response) => {
|
|
289
|
+
try {
|
|
290
|
+
// Hook logic
|
|
291
|
+
response.headers.set("X-Custom", "value");
|
|
292
|
+
} catch (error) {
|
|
293
|
+
context.log.error("Hook failed", error);
|
|
294
|
+
// Return original response on error
|
|
295
|
+
}
|
|
296
|
+
return response;
|
|
297
|
+
});
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
## Hook Registration
|
|
301
|
+
|
|
302
|
+
Hooks can be registered in two ways:
|
|
303
|
+
|
|
304
|
+
1. **In Handlers or Policies** - Add hooks directly in your code using
|
|
305
|
+
`context.addResponseSendingHook()` or `context.addResponseSendingFinalHook()`
|
|
306
|
+
|
|
307
|
+
2. **Globally via Runtime Extensions** - Register hooks that apply to all
|
|
308
|
+
requests using [Runtime Extensions](./runtime-extensions.mdx)
|
|
309
|
+
|
|
310
|
+
## Complete Hook Pipeline Example
|
|
311
|
+
|
|
312
|
+
This example demonstrates how all hooks work together in a request/response
|
|
313
|
+
lifecycle:
|
|
314
|
+
|
|
315
|
+
```ts
|
|
316
|
+
// In zuplo.runtime.ts - Global hooks
|
|
317
|
+
import { RuntimeExtensions } from "@zuplo/runtime";
|
|
318
|
+
|
|
319
|
+
export function runtimeInit(runtime: RuntimeExtensions) {
|
|
320
|
+
// 1. Pre-routing hook - runs before route matching
|
|
321
|
+
runtime.addPreRoutingHook((request) => {
|
|
322
|
+
console.log("Pre-routing: Processing request", request.url);
|
|
323
|
+
|
|
324
|
+
// Normalize URL to lowercase
|
|
325
|
+
const url = new URL(request.url);
|
|
326
|
+
if (url.pathname !== url.pathname.toLowerCase()) {
|
|
327
|
+
url.pathname = url.pathname.toLowerCase();
|
|
328
|
+
return new Request(url.toString(), request);
|
|
329
|
+
}
|
|
330
|
+
return request;
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
// 2. Request hook - runs after routing but before handlers
|
|
334
|
+
runtime.addRequestHook(async (request, context) => {
|
|
335
|
+
console.log("Request hook: Adding correlation ID");
|
|
336
|
+
|
|
337
|
+
const correlationId = crypto.randomUUID();
|
|
338
|
+
context.custom.startTime = Date.now();
|
|
339
|
+
context.custom.correlationId = correlationId;
|
|
340
|
+
|
|
341
|
+
const headers = new Headers(request.headers);
|
|
342
|
+
headers.set("X-Correlation-ID", correlationId);
|
|
343
|
+
|
|
344
|
+
return new ZuploRequest(request, { headers });
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
// 3. Response sending hook - can modify response
|
|
348
|
+
runtime.addResponseSendingHook((response, request, context) => {
|
|
349
|
+
console.log("Response sending: Adding security headers");
|
|
350
|
+
|
|
351
|
+
const headers = new Headers(response.headers);
|
|
352
|
+
headers.set("X-Content-Type-Options", "nosniff");
|
|
353
|
+
headers.set("X-Frame-Options", "DENY");
|
|
354
|
+
headers.set("X-Correlation-ID", context.custom.correlationId);
|
|
355
|
+
|
|
356
|
+
return new Response(response.body, {
|
|
357
|
+
status: response.status,
|
|
358
|
+
statusText: response.statusText,
|
|
359
|
+
headers,
|
|
360
|
+
});
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
// 4. Response sending final hook - for logging/analytics only
|
|
364
|
+
runtime.addResponseSendingFinalHook(async (response, request, context) => {
|
|
365
|
+
const duration = Date.now() - context.custom.startTime;
|
|
366
|
+
console.log(
|
|
367
|
+
`Request completed in ${duration}ms with status ${response.status}`,
|
|
368
|
+
);
|
|
369
|
+
|
|
370
|
+
// Non-blocking analytics
|
|
371
|
+
const sendAnalytics = async () => {
|
|
372
|
+
await fetch("https://analytics.example.com/track", {
|
|
373
|
+
method: "POST",
|
|
374
|
+
headers: { "Content-Type": "application/json" },
|
|
375
|
+
body: JSON.stringify({
|
|
376
|
+
correlationId: context.custom.correlationId,
|
|
377
|
+
method: request.method,
|
|
378
|
+
path: new URL(request.url).pathname,
|
|
379
|
+
status: response.status,
|
|
380
|
+
duration,
|
|
381
|
+
timestamp: new Date().toISOString(),
|
|
382
|
+
}),
|
|
383
|
+
});
|
|
384
|
+
};
|
|
385
|
+
|
|
386
|
+
context.waitUntil(sendAnalytics());
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
```ts
|
|
392
|
+
// In a handler - Local hooks that augment global ones
|
|
393
|
+
export default async function handler(
|
|
394
|
+
request: ZuploRequest,
|
|
395
|
+
context: ZuploContext,
|
|
396
|
+
) {
|
|
397
|
+
// Handler-specific response hook
|
|
398
|
+
context.addResponseSendingHook(async (response, request, context) => {
|
|
399
|
+
// Add handler-specific headers
|
|
400
|
+
const headers = new Headers(response.headers);
|
|
401
|
+
headers.set("X-Handler", "custom-api");
|
|
402
|
+
headers.set("X-Processing-Node", environment.REGION || "unknown");
|
|
403
|
+
|
|
404
|
+
return new Response(response.body, {
|
|
405
|
+
status: response.status,
|
|
406
|
+
statusText: response.statusText,
|
|
407
|
+
headers,
|
|
408
|
+
});
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
// Your handler logic
|
|
412
|
+
const result = await processApiRequest(request);
|
|
413
|
+
return new Response(JSON.stringify(result), {
|
|
414
|
+
headers: { "Content-Type": "application/json" },
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
### Hook Execution Order
|
|
420
|
+
|
|
421
|
+
1. **Pre-routing hooks** (global only) - before route matching
|
|
422
|
+
2. **Request hooks** (global first, then handler-specific) - after route
|
|
423
|
+
matching
|
|
424
|
+
3. Handler execution
|
|
425
|
+
4. **Response sending hooks** (global first, then handler-specific) - can modify
|
|
426
|
+
response
|
|
427
|
+
5. **Response sending final hooks** (global first, then handler-specific) -
|
|
428
|
+
read-only
|
|
429
|
+
|
|
430
|
+
## Creating Custom Plugins with Hooks
|
|
431
|
+
|
|
432
|
+
You can create reusable plugins that register hooks automatically:
|
|
433
|
+
|
|
434
|
+
```ts
|
|
435
|
+
// In modules/custom-observability-plugin.ts
|
|
436
|
+
import {
|
|
437
|
+
SystemRuntimePlugin,
|
|
438
|
+
RuntimeExtensions,
|
|
439
|
+
ZuploRequest,
|
|
440
|
+
ZuploContext,
|
|
441
|
+
} from "@zuplo/runtime";
|
|
442
|
+
|
|
443
|
+
interface ObservabilityOptions {
|
|
444
|
+
metricsEndpoint: string;
|
|
445
|
+
apiKey: string;
|
|
446
|
+
enableTracing?: boolean;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
export class CustomObservabilityPlugin extends SystemRuntimePlugin {
|
|
450
|
+
constructor(private options: ObservabilityOptions) {
|
|
451
|
+
super();
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
async initialize(runtime: RuntimeExtensions): Promise<void> {
|
|
455
|
+
// Add correlation ID to all requests
|
|
456
|
+
runtime.addRequestHook(this.addCorrelationId.bind(this));
|
|
457
|
+
|
|
458
|
+
// Add trace headers to responses
|
|
459
|
+
if (this.options.enableTracing) {
|
|
460
|
+
runtime.addResponseSendingHook(this.addTraceHeaders.bind(this));
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
// Send metrics after each request
|
|
464
|
+
runtime.addResponseSendingFinalHook(this.sendMetrics.bind(this));
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
private addCorrelationId(request: ZuploRequest, context: ZuploContext) {
|
|
468
|
+
const correlationId =
|
|
469
|
+
request.headers.get("x-correlation-id") || crypto.randomUUID();
|
|
470
|
+
|
|
471
|
+
context.custom.correlationId = correlationId;
|
|
472
|
+
context.custom.startTime = Date.now();
|
|
473
|
+
|
|
474
|
+
if (!request.headers.get("x-correlation-id")) {
|
|
475
|
+
const headers = new Headers(request.headers);
|
|
476
|
+
headers.set("x-correlation-id", correlationId);
|
|
477
|
+
return new ZuploRequest(request, { headers });
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
return request;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
private addTraceHeaders(
|
|
484
|
+
response: Response,
|
|
485
|
+
request: ZuploRequest,
|
|
486
|
+
context: ZuploContext,
|
|
487
|
+
) {
|
|
488
|
+
const headers = new Headers(response.headers);
|
|
489
|
+
headers.set("x-correlation-id", context.custom.correlationId);
|
|
490
|
+
headers.set("x-trace-id", context.requestId);
|
|
491
|
+
|
|
492
|
+
return new Response(response.body, {
|
|
493
|
+
status: response.status,
|
|
494
|
+
statusText: response.statusText,
|
|
495
|
+
headers,
|
|
496
|
+
});
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
private async sendMetrics(
|
|
500
|
+
response: Response,
|
|
501
|
+
request: ZuploRequest,
|
|
502
|
+
context: ZuploContext,
|
|
503
|
+
) {
|
|
504
|
+
const duration = Date.now() - context.custom.startTime;
|
|
505
|
+
|
|
506
|
+
const metrics = {
|
|
507
|
+
timestamp: new Date().toISOString(),
|
|
508
|
+
correlationId: context.custom.correlationId,
|
|
509
|
+
method: request.method,
|
|
510
|
+
path: new URL(request.url).pathname,
|
|
511
|
+
status: response.status,
|
|
512
|
+
duration,
|
|
513
|
+
userAgent: request.headers.get("user-agent"),
|
|
514
|
+
contentLength: response.headers.get("content-length"),
|
|
515
|
+
};
|
|
516
|
+
|
|
517
|
+
// Send asynchronously to avoid blocking response
|
|
518
|
+
const sendToMetrics = async () => {
|
|
519
|
+
try {
|
|
520
|
+
await fetch(this.options.metricsEndpoint, {
|
|
521
|
+
method: "POST",
|
|
522
|
+
headers: {
|
|
523
|
+
"Content-Type": "application/json",
|
|
524
|
+
Authorization: `Bearer ${this.options.apiKey}`,
|
|
525
|
+
},
|
|
526
|
+
body: JSON.stringify(metrics),
|
|
527
|
+
});
|
|
528
|
+
} catch (error) {
|
|
529
|
+
context.log.error("Failed to send metrics", error);
|
|
530
|
+
}
|
|
531
|
+
};
|
|
532
|
+
|
|
533
|
+
context.waitUntil(sendToMetrics());
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
```ts
|
|
539
|
+
// In zuplo.runtime.ts - Register the plugin
|
|
540
|
+
import { RuntimeExtensions, environment } from "@zuplo/runtime";
|
|
541
|
+
import { CustomObservabilityPlugin } from "./modules/custom-observability-plugin";
|
|
542
|
+
|
|
543
|
+
export function runtimeInit(runtime: RuntimeExtensions) {
|
|
544
|
+
const observabilityPlugin = new CustomObservabilityPlugin({
|
|
545
|
+
metricsEndpoint: "https://metrics.example.com/api/events",
|
|
546
|
+
apiKey: environment.METRICS_API_KEY,
|
|
547
|
+
enableTracing: true,
|
|
548
|
+
});
|
|
549
|
+
|
|
550
|
+
runtime.addPlugin(observabilityPlugin);
|
|
551
|
+
}
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
This plugin demonstrates:
|
|
555
|
+
|
|
556
|
+
- **Reusable functionality** encapsulated in a plugin class
|
|
557
|
+
- **Multiple hook types** working together (request, response sending, response
|
|
558
|
+
final)
|
|
559
|
+
- **Configurable behavior** through constructor options
|
|
560
|
+
- **Error handling** and **non-blocking operations** with `waitUntil`
|
|
561
|
+
- **Context data sharing** between hooks
|
|
562
|
+
|
|
563
|
+
## See Also
|
|
564
|
+
|
|
565
|
+
- [ZuploContext](./zuplo-context.mdx) - The context object that provides hook
|
|
566
|
+
methods
|
|
567
|
+
- [Runtime Extensions](./runtime-extensions.mdx) - Global hook registration
|
|
568
|
+
- [waitUntil](./zuplo-context.mdx#waituntil) - Extending request lifetime for
|
|
569
|
+
asynchronous operations
|