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,340 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Runtime Extensions
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
While most configuration in your Zuplo gateway is set on a per-route or
|
|
6
|
+
per-policy basis, there are times when behaviors need to be modified globally.
|
|
7
|
+
To plug into the global initialization of your gateway, create a file called
|
|
8
|
+
`zuplo.runtime.ts` in the `modules` folder with the following code.
|
|
9
|
+
|
|
10
|
+
:::warning
|
|
11
|
+
|
|
12
|
+
Any error thrown in the `runtimeInit` method will prevent the gateway from
|
|
13
|
+
starting and yield a 500 error for all requests. Be sure to add only reliable
|
|
14
|
+
code here and use `try/catch` as appropriate to handle any recoverable
|
|
15
|
+
exceptions.
|
|
16
|
+
|
|
17
|
+
:::
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import { RuntimeExtensions } from "@zuplo/runtime";
|
|
21
|
+
|
|
22
|
+
export function runtimeInit(runtime: RuntimeExtensions) {
|
|
23
|
+
// Extensions go here
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
:::note
|
|
28
|
+
|
|
29
|
+
The name of the export must be `runtimeInit` and must conform to the above
|
|
30
|
+
function signature.
|
|
31
|
+
|
|
32
|
+
:::
|
|
33
|
+
|
|
34
|
+
## Custom Problem (Error) Response Formatter
|
|
35
|
+
|
|
36
|
+
Zuplo includes built-in error handling that returns errors in the format of the
|
|
37
|
+
[Problem Details for HTTP APIs](http://httpproblems.com/) proposed standard.
|
|
38
|
+
This means that HTTP errors (or other exceptions) will return responses that
|
|
39
|
+
look like the following.
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"type": "https://httpproblems.com/http-status/404",
|
|
44
|
+
"title": "Not Found",
|
|
45
|
+
"status": 404,
|
|
46
|
+
"detail": "Not Found",
|
|
47
|
+
"instance": "/not-a-path",
|
|
48
|
+
"trace": {
|
|
49
|
+
"timestamp": "2023-03-14T15:49:38.581Z",
|
|
50
|
+
"requestId": "05968b6d-6f82-4ae3-8e13-f92e0d0499c5",
|
|
51
|
+
"buildId": "a9b200a3-734c-413a-a1ae-ce171d53e5a7",
|
|
52
|
+
"rayId": "7a7daaf3bac2f325"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
If you want to customize this format, you can configure the
|
|
58
|
+
`problemResponseFormat` function and return a `Response` in the format of your
|
|
59
|
+
choice.
|
|
60
|
+
|
|
61
|
+
```ts
|
|
62
|
+
import { RuntimeExtensions } from "@zuplo/runtime";
|
|
63
|
+
|
|
64
|
+
export function runtimeInit(runtime: RuntimeExtensions) {
|
|
65
|
+
runtime.problemResponseFormat = (
|
|
66
|
+
{ problem, statusText, additionalHeaders },
|
|
67
|
+
request,
|
|
68
|
+
context,
|
|
69
|
+
) => {
|
|
70
|
+
// Build the response body
|
|
71
|
+
const body = JSON.stringify(problem, null, 2);
|
|
72
|
+
|
|
73
|
+
// Send the response with headers and status
|
|
74
|
+
return new Response(body, {
|
|
75
|
+
status: problem.status,
|
|
76
|
+
statusText,
|
|
77
|
+
headers: {
|
|
78
|
+
...additionalHeaders,
|
|
79
|
+
"content-type": "application/problem+json",
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Hooks
|
|
87
|
+
|
|
88
|
+
Hooks allow code to be run as part of the request/response pipeline. Hooks can
|
|
89
|
+
be created at the API level in `zuplo.runtime.ts` as shown below or can be added
|
|
90
|
+
[via a plugin](./hooks.mdx).
|
|
91
|
+
|
|
92
|
+
:::tip
|
|
93
|
+
|
|
94
|
+
All hooks can be either synchronous or asynchronous. To make your hook
|
|
95
|
+
asynchronous simply add the `async` keyword on the function.
|
|
96
|
+
|
|
97
|
+
:::
|
|
98
|
+
|
|
99
|
+
The following hooks can be set globally in the `zuplo.runtime.ts`:
|
|
100
|
+
|
|
101
|
+
### Hook: OnPreRouting
|
|
102
|
+
|
|
103
|
+
Runs before the request is matched to a route. This is useful if you want to
|
|
104
|
+
customize the routing behavior. Example use cases include:
|
|
105
|
+
|
|
106
|
+
- Routing to a different URL based on a header value
|
|
107
|
+
- Normalizing URLs to be all lowercase
|
|
108
|
+
- Request preprocessing before route matching
|
|
109
|
+
|
|
110
|
+
**Type Definition:**
|
|
111
|
+
|
|
112
|
+
```ts
|
|
113
|
+
interface PreRoutingHook {
|
|
114
|
+
(request: Request): Promise<Request> | Request;
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**Example:**
|
|
119
|
+
|
|
120
|
+
```ts
|
|
121
|
+
import { RuntimeExtensions } from "@zuplo/runtime";
|
|
122
|
+
|
|
123
|
+
export function runtimeInit(runtime: RuntimeExtensions) {
|
|
124
|
+
runtime.addPreRoutingHook(async (request) => {
|
|
125
|
+
// Normalize URL to lowercase
|
|
126
|
+
const nr = new Request(request.url.toLowerCase(), request);
|
|
127
|
+
return nr;
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
// Header-based routing
|
|
131
|
+
runtime.addPreRoutingHook((request) => {
|
|
132
|
+
const version = request.headers.get("API-Version");
|
|
133
|
+
if (version === "v2") {
|
|
134
|
+
const url = new URL(request.url);
|
|
135
|
+
url.pathname = `/v2${url.pathname}`;
|
|
136
|
+
return new Request(url.toString(), request);
|
|
137
|
+
}
|
|
138
|
+
return request;
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Hook: OnRequest
|
|
144
|
+
|
|
145
|
+
Runs when a request is received, before any plugins or handlers. This hook can
|
|
146
|
+
modify the request or return a response to short-circuit the pipeline.
|
|
147
|
+
|
|
148
|
+
**Type Definition:**
|
|
149
|
+
|
|
150
|
+
```ts
|
|
151
|
+
interface OnRequestHook {
|
|
152
|
+
(
|
|
153
|
+
request: ZuploRequest,
|
|
154
|
+
context: ZuploContext,
|
|
155
|
+
): Promise<ZuploRequest | Response> | (ZuploRequest | Response);
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
**Example:**
|
|
160
|
+
|
|
161
|
+
```ts
|
|
162
|
+
import { RuntimeExtensions, environment } from "@zuplo/runtime";
|
|
163
|
+
|
|
164
|
+
export function runtimeInit(runtime: RuntimeExtensions) {
|
|
165
|
+
runtime.addRequestHook(async (request, context) => {
|
|
166
|
+
// Add correlation ID
|
|
167
|
+
const correlationId = crypto.randomUUID();
|
|
168
|
+
context.custom.correlationId = correlationId;
|
|
169
|
+
|
|
170
|
+
const headers = new Headers(request.headers);
|
|
171
|
+
headers.set("X-Correlation-ID", correlationId);
|
|
172
|
+
|
|
173
|
+
// Can return a request or a response. If a response is returned the
|
|
174
|
+
// pipeline stops and the response is returned.
|
|
175
|
+
return new ZuploRequest(request, { headers });
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
// Example: Early response for maintenance mode
|
|
179
|
+
runtime.addRequestHook((request, context) => {
|
|
180
|
+
if (environment.MAINTENANCE_MODE === "true") {
|
|
181
|
+
return new Response("Service temporarily unavailable", {
|
|
182
|
+
status: 503,
|
|
183
|
+
headers: { "Retry-After": "3600" },
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
return request;
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### Hook: OnResponseSending
|
|
192
|
+
|
|
193
|
+
Runs before a response is sent. Response can be modified. Multiple hooks execute
|
|
194
|
+
in the order they were added.
|
|
195
|
+
[More details.](/docs/programmable-api/hooks#hook-onresponsesending)
|
|
196
|
+
|
|
197
|
+
**Type Definition:**
|
|
198
|
+
|
|
199
|
+
```ts
|
|
200
|
+
interface OnResponseSendingHook {
|
|
201
|
+
(
|
|
202
|
+
response: Response,
|
|
203
|
+
request: ZuploRequest,
|
|
204
|
+
context: ZuploContext,
|
|
205
|
+
): Promise<Response> | Response;
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**Example:**
|
|
210
|
+
|
|
211
|
+
```ts
|
|
212
|
+
import { RuntimeExtensions } from "@zuplo/runtime";
|
|
213
|
+
|
|
214
|
+
export function runtimeInit(runtime: RuntimeExtensions) {
|
|
215
|
+
runtime.addResponseSendingHook((response, request, context) => {
|
|
216
|
+
// Add security headers
|
|
217
|
+
const headers = new Headers(response.headers);
|
|
218
|
+
headers.set("X-Content-Type-Options", "nosniff");
|
|
219
|
+
headers.set("X-Frame-Options", "DENY");
|
|
220
|
+
headers.set("X-XSS-Protection", "1; mode=block");
|
|
221
|
+
|
|
222
|
+
return new Response(response.body, {
|
|
223
|
+
status: response.status,
|
|
224
|
+
statusText: response.statusText,
|
|
225
|
+
headers,
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### Hook: OnResponseSendingFinal
|
|
232
|
+
|
|
233
|
+
Runs before a response is sent. The response can't be modified. Ideal for
|
|
234
|
+
logging, analytics, and monitoring.
|
|
235
|
+
[More details.](/docs/programmable-api/hooks#hook-onresponsesendingfinal)
|
|
236
|
+
|
|
237
|
+
**Type Definition:**
|
|
238
|
+
|
|
239
|
+
```ts
|
|
240
|
+
interface OnResponseSendingFinalHook {
|
|
241
|
+
(
|
|
242
|
+
response: Response,
|
|
243
|
+
request: ZuploRequest,
|
|
244
|
+
context: ZuploContext,
|
|
245
|
+
): Promise<void> | void;
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
**Example:**
|
|
250
|
+
|
|
251
|
+
```ts
|
|
252
|
+
import { RuntimeExtensions } from "@zuplo/runtime";
|
|
253
|
+
|
|
254
|
+
export function runtimeInit(runtime: RuntimeExtensions) {
|
|
255
|
+
runtime.addResponseSendingFinalHook(async (response, request, context) => {
|
|
256
|
+
// Log response metrics
|
|
257
|
+
const processingTime = Date.now() - context.custom.startTime;
|
|
258
|
+
|
|
259
|
+
context.log.info("Request completed", {
|
|
260
|
+
method: request.method,
|
|
261
|
+
url: request.url,
|
|
262
|
+
status: response.status,
|
|
263
|
+
processingTime,
|
|
264
|
+
correlationId: context.custom.correlationId,
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
// Send metrics to external service (non-blocking)
|
|
268
|
+
const sendMetrics = async () => {
|
|
269
|
+
await fetch("https://metrics.example.com/api/log", {
|
|
270
|
+
method: "POST",
|
|
271
|
+
headers: { "Content-Type": "application/json" },
|
|
272
|
+
body: JSON.stringify({
|
|
273
|
+
timestamp: new Date().toISOString(),
|
|
274
|
+
method: request.method,
|
|
275
|
+
status: response.status,
|
|
276
|
+
processingTime,
|
|
277
|
+
}),
|
|
278
|
+
});
|
|
279
|
+
};
|
|
280
|
+
|
|
281
|
+
context.waitUntil(sendMetrics());
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
## Custom Not Found Handler
|
|
287
|
+
|
|
288
|
+
You can customize how Zuplo handles requests that don't match any route by
|
|
289
|
+
setting a custom `notFoundHandler`:
|
|
290
|
+
|
|
291
|
+
```ts
|
|
292
|
+
import { RuntimeExtensions } from "@zuplo/runtime";
|
|
293
|
+
|
|
294
|
+
export function runtimeInit(runtime: RuntimeExtensions) {
|
|
295
|
+
runtime.notFoundHandler = async (request, context, notFoundOptions) => {
|
|
296
|
+
// Custom 404 handling
|
|
297
|
+
const customResponse = {
|
|
298
|
+
error: "Route not found",
|
|
299
|
+
message: `The requested path '${new URL(request.url).pathname}' wasn't found`,
|
|
300
|
+
timestamp: new Date().toISOString(),
|
|
301
|
+
requestId: context.requestId,
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
return new Response(JSON.stringify(customResponse, null, 2), {
|
|
305
|
+
status: 404,
|
|
306
|
+
headers: {
|
|
307
|
+
"Content-Type": "application/json",
|
|
308
|
+
"X-Custom-Handler": "true",
|
|
309
|
+
},
|
|
310
|
+
});
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
## Plugin and Handler Extensions
|
|
316
|
+
|
|
317
|
+
Built-in and custom plugins and handlers can expose their own extensibility. For
|
|
318
|
+
example, [AWS Lambda handler](../handlers/aws-lambda.mdx) exposes the ability to
|
|
319
|
+
customize the event that's sent when invoking the Lambda function.
|
|
320
|
+
|
|
321
|
+
The example below shows how to use a route's custom property to set the path on
|
|
322
|
+
the outgoing event to a custom value.
|
|
323
|
+
|
|
324
|
+
```ts
|
|
325
|
+
import {
|
|
326
|
+
AwsLambdaHandlerExtensions,
|
|
327
|
+
RuntimeExtensions,
|
|
328
|
+
ContextData,
|
|
329
|
+
} from "@zuplo/runtime";
|
|
330
|
+
|
|
331
|
+
export function runtimeInit(runtime: RuntimeExtensions) {
|
|
332
|
+
AwsLambdaHandlerExtensions.addSendingAwsLambdaEventHook(
|
|
333
|
+
async (request, context, event: AwsLambdaEventV1) => {
|
|
334
|
+
const lambdaPath = ContextData.get(context, "lambdaPath");
|
|
335
|
+
event.path = lambdaPath ?? event.path;
|
|
336
|
+
return event;
|
|
337
|
+
},
|
|
338
|
+
);
|
|
339
|
+
}
|
|
340
|
+
```
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Safely clone a request or response
|
|
3
|
+
sidebar_label: Clone Request/Response
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
We often want to read the body of a request or response before forwarding it on
|
|
7
|
+
to the downwind service or back to the client respectively.
|
|
8
|
+
|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
When doing this inside the Zuplo gateway in a
|
|
12
|
+
[Request Handler](../handlers/custom-handler.mdx), be careful to clone the
|
|
13
|
+
request or response to avoid causing a `body-used` exception.
|
|
14
|
+
|
|
15
|
+
A `body-used` exception occurs when a `.body` property of a request or response,
|
|
16
|
+
which is of type `ReadableStream`, has already been read. These properties can
|
|
17
|
+
only be read once and if we pass that same object to `fetch` (for the downwind
|
|
18
|
+
call) or return it from a request handler - you’ll get that exception.
|
|
19
|
+
|
|
20
|
+
> Note - you can check to see if a body has already been used by looking at the
|
|
21
|
+
> `.bodyUsed` property of `ZuploRequest` and `Response`.
|
|
22
|
+
|
|
23
|
+
## How to clone the request and response
|
|
24
|
+
|
|
25
|
+
Let’s imagine we want to log both the request body and response body of a
|
|
26
|
+
proxied call to a downwind service
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
export default async function (req: ZuploRequest, ctx: ZuploContext) {
|
|
30
|
+
// pretend we want to log the request and response body
|
|
31
|
+
const reqClone = req.clone();
|
|
32
|
+
const reqBody = await reqClone.text();
|
|
33
|
+
ctx.log.debug(reqBody);
|
|
34
|
+
|
|
35
|
+
// we can now safely re-use this body to call the downstream
|
|
36
|
+
// service
|
|
37
|
+
const response = await fetch("https://downwind-url.com/foo/bar", {
|
|
38
|
+
method: req.method,
|
|
39
|
+
body: req.body,
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const resClone = response.clone();
|
|
43
|
+
const resBody = await resClone.text();
|
|
44
|
+
ctx.log.debug(resBody);
|
|
45
|
+
|
|
46
|
+
// we can now safely use the original response
|
|
47
|
+
return response;
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
If you don’t need to read the body - we recommend against cloning the request or
|
|
52
|
+
response as it will make your gateway more memory efficient and increase
|
|
53
|
+
performance.
|
|
54
|
+
|
|
55
|
+
> Note - in [policies](../policies/overview.mdx), if you need to read the body
|
|
56
|
+
> we always recommend using `.clone()` first, as you don’t know what the end
|
|
57
|
+
> request handler might want to do with the originals.
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: StreamingZoneCache
|
|
3
|
+
sidebar_label: StreamingZoneCache
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
The `StreamingZoneCache` class provides a distributed caching solution optimized
|
|
7
|
+
for streaming data. It allows you to cache `ReadableStream` objects across
|
|
8
|
+
Zuplo's edge network.
|
|
9
|
+
|
|
10
|
+
:::note{title="Beta Feature"}
|
|
11
|
+
|
|
12
|
+
This API is in Beta - please use with care and provide feedback to the team if
|
|
13
|
+
you encounter any issues.
|
|
14
|
+
|
|
15
|
+
:::
|
|
16
|
+
|
|
17
|
+
## Constructor
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
new StreamingZoneCache(name: string, context: ZuploContext)
|
|
21
|
+
new StreamingZoneCache(name: string, options: CacheOptions)
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Creates a new streaming cache instance.
|
|
25
|
+
|
|
26
|
+
- `name` - A unique identifier for the cache instance
|
|
27
|
+
- `context` - The [ZuploContext](./zuplo-context.mdx) object
|
|
28
|
+
- `options` - Cache configuration options (alternative to context)
|
|
29
|
+
|
|
30
|
+
## Methods
|
|
31
|
+
|
|
32
|
+
**`get`**
|
|
33
|
+
|
|
34
|
+
Retrieves a stream from the cache. Returns `undefined` if not found.
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
get(key: string): Promise<ReadableStream<Uint8Array> | undefined>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**`put`**
|
|
41
|
+
|
|
42
|
+
Stores a stream in the cache with a time-to-live (TTL) in seconds.
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
put(key: string, stream: ReadableStream<Uint8Array>, ttlSeconds: number): Promise<void>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**`delete`**
|
|
49
|
+
|
|
50
|
+
Removes a stream from the cache.
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
delete(key: string): Promise<void>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Example
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
import { StreamingZoneCache, ZuploContext, ZuploRequest } from "@zuplo/runtime";
|
|
60
|
+
|
|
61
|
+
export default async function handler(
|
|
62
|
+
request: ZuploRequest,
|
|
63
|
+
context: ZuploContext,
|
|
64
|
+
) {
|
|
65
|
+
const cache = new StreamingZoneCache("response-cache", context);
|
|
66
|
+
const cacheKey = `response:${request.url}`;
|
|
67
|
+
|
|
68
|
+
// Try to get cached response
|
|
69
|
+
const cachedStream = await cache.get(cacheKey);
|
|
70
|
+
if (cachedStream) {
|
|
71
|
+
return new Response(cachedStream, {
|
|
72
|
+
headers: { "X-Cache": "HIT" },
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Fetch from origin
|
|
77
|
+
const response = await fetch("https://api.example.com/large-file");
|
|
78
|
+
|
|
79
|
+
// Clone the response so we can cache it and return it
|
|
80
|
+
const [streamForCache, streamForResponse] = response.body!.tee();
|
|
81
|
+
|
|
82
|
+
// Cache the response for 1 hour (3600 seconds)
|
|
83
|
+
await cache.put(cacheKey, streamForCache, 3600);
|
|
84
|
+
|
|
85
|
+
return new Response(streamForResponse, {
|
|
86
|
+
headers: {
|
|
87
|
+
...response.headers,
|
|
88
|
+
"X-Cache": "MISS",
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Advanced Example: Caching Large Files
|
|
95
|
+
|
|
96
|
+
```ts
|
|
97
|
+
import { StreamingZoneCache, ZuploContext, ZuploRequest } from "@zuplo/runtime";
|
|
98
|
+
|
|
99
|
+
export default async function handler(
|
|
100
|
+
request: ZuploRequest,
|
|
101
|
+
context: ZuploContext,
|
|
102
|
+
) {
|
|
103
|
+
const cache = new StreamingZoneCache("file-cache", context);
|
|
104
|
+
const fileId = request.params.fileId;
|
|
105
|
+
const cacheKey = `file:${fileId}`;
|
|
106
|
+
|
|
107
|
+
// Check cache first
|
|
108
|
+
const cachedFile = await cache.get(cacheKey);
|
|
109
|
+
if (cachedFile) {
|
|
110
|
+
context.log.info(`Cache hit for file ${fileId}`);
|
|
111
|
+
return new Response(cachedFile, {
|
|
112
|
+
headers: {
|
|
113
|
+
"Content-Type": "application/octet-stream",
|
|
114
|
+
"Cache-Control": "public, max-age=3600",
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Stream from storage service
|
|
120
|
+
const storageResponse = await fetch(
|
|
121
|
+
`https://storage.example.com/files/${fileId}`,
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
if (!storageResponse.ok) {
|
|
125
|
+
return new Response("File not found", { status: 404 });
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Use tee() to create two identical streams
|
|
129
|
+
const [cacheStream, responseStream] = storageResponse.body!.tee();
|
|
130
|
+
|
|
131
|
+
// Cache for 24 hours
|
|
132
|
+
context.waitUntil(cache.put(cacheKey, cacheStream, 86400));
|
|
133
|
+
|
|
134
|
+
return new Response(responseStream, {
|
|
135
|
+
headers: storageResponse.headers,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Best Practices
|
|
141
|
+
|
|
142
|
+
- Use `tee()` to split streams when you need to both cache and return the same
|
|
143
|
+
stream
|
|
144
|
+
- Use `context.waitUntil()` for non-blocking cache writes
|
|
145
|
+
- Set appropriate TTL values based on your content update frequency
|
|
146
|
+
- Consider the size of streams being cached to avoid memory issues
|
|
147
|
+
- The cache is distributed across Zuplo's edge network for optimal performance
|
|
148
|
+
|
|
149
|
+
## See Also
|
|
150
|
+
|
|
151
|
+
- [ZoneCache](./zone-cache.mdx) - For caching JSON and other structured data
|
|
152
|
+
- [MemoryZoneReadThroughCache](./memory-zone-read-through-cache.mdx) - For
|
|
153
|
+
in-memory caching
|
|
154
|
+
- [Web Streams API](https://developer.mozilla.org/en-US/docs/Web/API/Streams_API) -
|
|
155
|
+
MDN documentation on streams
|