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,289 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: RequestUser
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
The `RequestUser` interface represents authenticated user information attached
|
|
6
|
+
to a [ZuploRequest](./zuplo-request.mdx). This interface is used when
|
|
7
|
+
authentication policies validate and identify users.
|
|
8
|
+
|
|
9
|
+
## Interface
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
interface RequestUser<TUserData> {
|
|
13
|
+
sub: string;
|
|
14
|
+
data: TUserData;
|
|
15
|
+
}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Properties
|
|
19
|
+
|
|
20
|
+
**`sub`**
|
|
21
|
+
|
|
22
|
+
The subject identifier (unique user ID) from the authentication token.
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
sub: string;
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**`data`**
|
|
29
|
+
|
|
30
|
+
Additional user data of generic type `TUserData`.
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
data: TUserData;
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Usage
|
|
37
|
+
|
|
38
|
+
The `user` property is available on `ZuploRequest` after successful
|
|
39
|
+
authentication:
|
|
40
|
+
|
|
41
|
+
```ts
|
|
42
|
+
import { ZuploContext, ZuploRequest } from "@zuplo/runtime";
|
|
43
|
+
|
|
44
|
+
export default async function handler(
|
|
45
|
+
request: ZuploRequest,
|
|
46
|
+
context: ZuploContext,
|
|
47
|
+
) {
|
|
48
|
+
// Check if user is authenticated
|
|
49
|
+
if (!request.user) {
|
|
50
|
+
return new Response("Unauthorized", { status: 401 });
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Access user information
|
|
54
|
+
const userId = request.user.sub;
|
|
55
|
+
const userData = request.user.data;
|
|
56
|
+
|
|
57
|
+
context.log.info("Request from user", { userId });
|
|
58
|
+
|
|
59
|
+
return new Response(`Hello, user ${userId}!`);
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Type-Safe User Data
|
|
64
|
+
|
|
65
|
+
You can define custom types for user data:
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
import { ZuploContext, ZuploRequest, RequestUser } from "@zuplo/runtime";
|
|
69
|
+
|
|
70
|
+
// Define your user data structure
|
|
71
|
+
interface MyUserData {
|
|
72
|
+
email: string;
|
|
73
|
+
roles: string[];
|
|
74
|
+
organizationId: string;
|
|
75
|
+
permissions?: string[];
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Use typed request
|
|
79
|
+
type MyRequest = ZuploRequest<{
|
|
80
|
+
UserData: MyUserData;
|
|
81
|
+
}>;
|
|
82
|
+
|
|
83
|
+
export default async function handler(
|
|
84
|
+
request: MyRequest,
|
|
85
|
+
context: ZuploContext,
|
|
86
|
+
) {
|
|
87
|
+
if (!request.user) {
|
|
88
|
+
return new Response("Unauthorized", { status: 401 });
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// TypeScript knows the shape of user.data
|
|
92
|
+
const { email, roles, organizationId } = request.user.data;
|
|
93
|
+
|
|
94
|
+
if (!roles.includes("admin")) {
|
|
95
|
+
return new Response("Forbidden: Admin role required", { status: 403 });
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return new Response(`Welcome admin ${email} from org ${organizationId}`);
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Common Authentication Patterns
|
|
103
|
+
|
|
104
|
+
### JWT Authentication
|
|
105
|
+
|
|
106
|
+
When using JWT authentication policies, the user data typically includes claims
|
|
107
|
+
from the token:
|
|
108
|
+
|
|
109
|
+
```ts
|
|
110
|
+
// After JWT validation
|
|
111
|
+
request.user = {
|
|
112
|
+
sub: "auth0|123456789",
|
|
113
|
+
data: {
|
|
114
|
+
email: "user@example.com",
|
|
115
|
+
name: "John Doe",
|
|
116
|
+
picture: "https://example.com/avatar.jpg",
|
|
117
|
+
// Custom claims
|
|
118
|
+
organization: "acme-corp",
|
|
119
|
+
roles: ["user", "admin"],
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### API Key Authentication
|
|
125
|
+
|
|
126
|
+
For API key authentication, user data might include consumer information:
|
|
127
|
+
|
|
128
|
+
```ts
|
|
129
|
+
// After API key validation
|
|
130
|
+
request.user = {
|
|
131
|
+
// The subject of the consumer
|
|
132
|
+
sub: "consumer-id-123",
|
|
133
|
+
data: {
|
|
134
|
+
// The metadata you set when creating the consumer
|
|
135
|
+
customerId: "123",
|
|
136
|
+
plan: "premium",
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Working with User Data
|
|
142
|
+
|
|
143
|
+
### Role-Based Access Control
|
|
144
|
+
|
|
145
|
+
```ts
|
|
146
|
+
import { ZuploContext, ZuploRequest } from "@zuplo/runtime";
|
|
147
|
+
|
|
148
|
+
interface UserWithRoles {
|
|
149
|
+
roles: string[];
|
|
150
|
+
permissions?: string[];
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export function requireRole(role: string) {
|
|
154
|
+
return async function handler(
|
|
155
|
+
request: ZuploRequest<{ UserData: UserWithRoles }>,
|
|
156
|
+
context: ZuploContext,
|
|
157
|
+
) {
|
|
158
|
+
if (!request.user) {
|
|
159
|
+
return new Response("Unauthorized", { status: 401 });
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const { roles } = request.user.data;
|
|
163
|
+
|
|
164
|
+
if (!roles.includes(role)) {
|
|
165
|
+
context.log.warn("Access denied", {
|
|
166
|
+
userId: request.user.sub,
|
|
167
|
+
requiredRole: role,
|
|
168
|
+
userRoles: roles,
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
return new Response(`Forbidden: ${role} role required`, {
|
|
172
|
+
status: 403,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// User has required role, continue processing
|
|
177
|
+
return null; // Continue to next handler
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Usage in a route
|
|
182
|
+
export const adminOnly = requireRole("admin");
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### User Context in Logging
|
|
186
|
+
|
|
187
|
+
```ts
|
|
188
|
+
export default async function handler(
|
|
189
|
+
request: ZuploRequest,
|
|
190
|
+
context: ZuploContext,
|
|
191
|
+
) {
|
|
192
|
+
const userContext = request.user
|
|
193
|
+
? {
|
|
194
|
+
userId: request.user.sub,
|
|
195
|
+
userEmail: request.user.data?.email,
|
|
196
|
+
organization: request.user.data?.organizationId,
|
|
197
|
+
}
|
|
198
|
+
: { userId: "anonymous" };
|
|
199
|
+
|
|
200
|
+
context.log.info("Processing request", {
|
|
201
|
+
...userContext,
|
|
202
|
+
path: request.url,
|
|
203
|
+
method: request.method,
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
try {
|
|
207
|
+
const result = await processBusinessLogic(request, request.user);
|
|
208
|
+
|
|
209
|
+
context.log.info("Request completed", {
|
|
210
|
+
...userContext,
|
|
211
|
+
success: true,
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
return new Response(JSON.stringify(result));
|
|
215
|
+
} catch (error) {
|
|
216
|
+
context.log.error("Request failed", {
|
|
217
|
+
...userContext,
|
|
218
|
+
error: error.message,
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
throw error;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Passing User to Upstream Services
|
|
227
|
+
|
|
228
|
+
```ts
|
|
229
|
+
export default async function handler(
|
|
230
|
+
request: ZuploRequest,
|
|
231
|
+
context: ZuploContext,
|
|
232
|
+
) {
|
|
233
|
+
if (!request.user) {
|
|
234
|
+
return new Response("Unauthorized", { status: 401 });
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Forward user information to upstream service
|
|
238
|
+
const upstreamRequest = new Request(request, {
|
|
239
|
+
headers: {
|
|
240
|
+
...Object.fromEntries(request.headers),
|
|
241
|
+
"X-User-Id": request.user.sub,
|
|
242
|
+
"X-User-Email": request.user.data.email || "",
|
|
243
|
+
"X-User-Roles": JSON.stringify(request.user.data.roles || []),
|
|
244
|
+
},
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
return fetch("https://api.internal.example.com", upstreamRequest);
|
|
248
|
+
}
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
## Authentication Policy Integration
|
|
252
|
+
|
|
253
|
+
Authentication policies automatically populate the `user` property:
|
|
254
|
+
|
|
255
|
+
```ts
|
|
256
|
+
// In your routes configuration
|
|
257
|
+
{
|
|
258
|
+
"path": "/api/protected",
|
|
259
|
+
"methods": ["GET"],
|
|
260
|
+
"handler": {
|
|
261
|
+
"export": "default",
|
|
262
|
+
"module": "$import(./modules/protected-handler)"
|
|
263
|
+
},
|
|
264
|
+
"policies": {
|
|
265
|
+
"inbound": ["jwt-auth-policy", "rate-limit-policy"]
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
After the JWT authentication policy validates the token, it sets:
|
|
271
|
+
|
|
272
|
+
```ts
|
|
273
|
+
request.user = {
|
|
274
|
+
sub: tokenClaims.sub,
|
|
275
|
+
data: {
|
|
276
|
+
...tokenClaims,
|
|
277
|
+
// Additional data from policy configuration
|
|
278
|
+
},
|
|
279
|
+
};
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
## See Also
|
|
283
|
+
|
|
284
|
+
- [ZuploRequest](./zuplo-request.mdx) - The request object that contains user
|
|
285
|
+
information
|
|
286
|
+
- [API Key Authentication](../policies/api-key-inbound.mdx) - Built-in API key
|
|
287
|
+
authentication
|
|
288
|
+
- [JWT Authentication](../policies/open-id-jwt-auth-inbound.mdx) - JWT/OpenID
|
|
289
|
+
authentication
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Share code across request handlers and policies with modules
|
|
3
|
+
sidebar_label: Code Reuse
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Sharing code across your request handlers and policies is easy with modules.
|
|
7
|
+
Simply create a new module with exports and import them to your other files.
|
|
8
|
+
Here's a module called `util.ts`:
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
//util.ts
|
|
12
|
+
export function increment(n: number) {
|
|
13
|
+
return n + 1;
|
|
14
|
+
}
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Now in our request handler, we can import this and reuse this code
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import { ZuploRequest, ZuploContext } from "@zuplo/runtime";
|
|
21
|
+
import { increment } from "./util";
|
|
22
|
+
|
|
23
|
+
export default async function (request: ZuploRequest, context: ZuploContext) {
|
|
24
|
+
return increment(1);
|
|
25
|
+
}
|
|
26
|
+
```
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Route Custom Data
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Each route in your OpenAPI file allows for specifying custom properties on your
|
|
6
|
+
route that can be referenced in code. Because the OpenAPI document allows
|
|
7
|
+
extensibility by adding `x-` properties, you can add custom data as needed to
|
|
8
|
+
your operations and then read that data in code.
|
|
9
|
+
|
|
10
|
+
## Custom Data in OpenAPI File
|
|
11
|
+
|
|
12
|
+
The example below shows how to add custom data and operation with a property
|
|
13
|
+
`x-custom`.
|
|
14
|
+
|
|
15
|
+
```json title="/config/routes.oas.json"
|
|
16
|
+
{
|
|
17
|
+
"/my-route": {
|
|
18
|
+
"get": {
|
|
19
|
+
// highlight-start
|
|
20
|
+
"x-custom": {
|
|
21
|
+
"hello": "world"
|
|
22
|
+
},
|
|
23
|
+
// highlight-end
|
|
24
|
+
"operationId": "c18da63b-bd4d-433f-a634-1da9913958c0",
|
|
25
|
+
"x-zuplo-route": {
|
|
26
|
+
"handler": {
|
|
27
|
+
"module": "$import(@zuplo/runtime)",
|
|
28
|
+
"export": "urlForwardHandler",
|
|
29
|
+
"options": {
|
|
30
|
+
"baseUrl": "https://echo.zuplo.io",
|
|
31
|
+
"forwardSearch": true
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Custom Data in Code
|
|
41
|
+
|
|
42
|
+
Custom data can be accessed through the `context.route.raw()` function. This
|
|
43
|
+
gives you full access to the underlying data of the OpenAPI operation. By
|
|
44
|
+
default this function returns `unknown`, but you can pass it a custom object or
|
|
45
|
+
for the full OpenAPI operation, use `OpenAPIV3_1.OperationObject` exported from
|
|
46
|
+
`openapi-types`
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
import { ZuploContext, ZuploRequest } from "@zuplo/runtime";
|
|
50
|
+
|
|
51
|
+
export async function echo(request: ZuploRequest, context: ZuploContext) {
|
|
52
|
+
const data = context.route.raw<{ "x-custom": { hello: string } }>();
|
|
53
|
+
context.log.info(`My custom data: ${data["x-custom"].hello}`);
|
|
54
|
+
}
|
|
55
|
+
```
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Runtime Behaviors
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Zuplo's core gateway runtime is built on
|
|
6
|
+
[open web-standards](./web-standard-apis.mdx). However, there are some cases
|
|
7
|
+
where Zuplo either differentiates from the standard or where the standard
|
|
8
|
+
doesn't apply due to Zuplo running server-side rather than in the browser. There
|
|
9
|
+
are also some behaviors that are enforced in Zuplo that may be unfamiliar to
|
|
10
|
+
developers coming from other systems. This document aims to outline behaviors
|
|
11
|
+
that developers may encounter and suggested ways to handle these behaviors.
|
|
12
|
+
|
|
13
|
+
Because some legacy APIs may require non-standard behavior, most of these
|
|
14
|
+
behaviors can be modified for your particular deployment. Contact
|
|
15
|
+
support@zuplo.com to discuss options.
|
|
16
|
+
|
|
17
|
+
## Request.body
|
|
18
|
+
|
|
19
|
+
The [standard](https://developer.mozilla.org/en-US/docs/Web/API/Request/body)
|
|
20
|
+
for `Request.body` specifies that on `GET` and `HEAD` requests the value must be
|
|
21
|
+
`null`. Different APIs, networks, and gateways follow this spec to varying
|
|
22
|
+
degrees. In some cases they allow in others they don't.
|
|
23
|
+
|
|
24
|
+
By default, Zuplo will return a 500 error in the event that a `GET` or `HEAD`
|
|
25
|
+
request has a body.
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Runtime Errors
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Zuplo provides specialized error classes for handling runtime and configuration
|
|
6
|
+
errors in your API gateway.
|
|
7
|
+
|
|
8
|
+
## RuntimeError
|
|
9
|
+
|
|
10
|
+
The `RuntimeError` class extends the standard JavaScript `Error` class and
|
|
11
|
+
provides additional functionality for including extension members in error
|
|
12
|
+
responses.
|
|
13
|
+
|
|
14
|
+
### Constructor
|
|
15
|
+
|
|
16
|
+
```ts
|
|
17
|
+
new RuntimeError(message: string, options?: ErrorOptions)
|
|
18
|
+
new RuntimeError(
|
|
19
|
+
info: {
|
|
20
|
+
message: string;
|
|
21
|
+
extensionMembers?: Record<string, unknown>
|
|
22
|
+
},
|
|
23
|
+
options?: ErrorOptions
|
|
24
|
+
)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Creates a new runtime error with optional extension data.
|
|
28
|
+
|
|
29
|
+
- `message` - The error message
|
|
30
|
+
- `info` - Object containing message and optional extension members
|
|
31
|
+
- `options` - Standard error options (for example `cause`)
|
|
32
|
+
|
|
33
|
+
### Properties
|
|
34
|
+
|
|
35
|
+
**`extensionMembers`**
|
|
36
|
+
|
|
37
|
+
Additional data included with the error for context and debugging.
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
extensionMembers?: Record<string, unknown>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Example
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
import { RuntimeError, ZuploContext, ZuploRequest } from "@zuplo/runtime";
|
|
47
|
+
|
|
48
|
+
export default async function handler(
|
|
49
|
+
request: ZuploRequest,
|
|
50
|
+
context: ZuploContext,
|
|
51
|
+
) {
|
|
52
|
+
try {
|
|
53
|
+
// Some operation that might fail
|
|
54
|
+
const result = await riskyOperation();
|
|
55
|
+
return new Response(JSON.stringify(result));
|
|
56
|
+
} catch (error) {
|
|
57
|
+
// Throw a RuntimeError with additional context
|
|
58
|
+
throw new RuntimeError(
|
|
59
|
+
{
|
|
60
|
+
message: "Failed to process request",
|
|
61
|
+
extensionMembers: {
|
|
62
|
+
requestId: context.requestId,
|
|
63
|
+
operation: "riskyOperation",
|
|
64
|
+
timestamp: new Date().toISOString(),
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
{ cause: error },
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## ConfigurationError
|
|
74
|
+
|
|
75
|
+
The `ConfigurationError` class extends `RuntimeError` and is specifically
|
|
76
|
+
designed for configuration-related errors.
|
|
77
|
+
|
|
78
|
+
### Constructor
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
new ConfigurationError(message: string, options?: ErrorOptions)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Creates a new configuration error.
|
|
85
|
+
|
|
86
|
+
- `message` - The error message describing the configuration issue
|
|
87
|
+
- `options` - Standard error options
|
|
88
|
+
|
|
89
|
+
### Example
|
|
90
|
+
|
|
91
|
+
```ts
|
|
92
|
+
import {
|
|
93
|
+
ConfigurationError,
|
|
94
|
+
ZuploContext,
|
|
95
|
+
ZuploRequest,
|
|
96
|
+
environment,
|
|
97
|
+
} from "@zuplo/runtime";
|
|
98
|
+
|
|
99
|
+
export default async function handler(
|
|
100
|
+
request: ZuploRequest,
|
|
101
|
+
context: ZuploContext,
|
|
102
|
+
) {
|
|
103
|
+
const apiKey = environment.EXTERNAL_API_KEY;
|
|
104
|
+
|
|
105
|
+
if (!apiKey) {
|
|
106
|
+
throw new ConfigurationError(
|
|
107
|
+
"EXTERNAL_API_KEY environment variable isn't configured",
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const maxRetries = parseInt(environment.MAX_RETRIES || "3");
|
|
112
|
+
|
|
113
|
+
if (isNaN(maxRetries) || maxRetries < 1) {
|
|
114
|
+
throw new ConfigurationError("MAX_RETRIES must be a positive integer");
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Continue with properly configured values
|
|
118
|
+
return fetch("https://api.example.com", {
|
|
119
|
+
headers: { "X-API-Key": apiKey },
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Error Handling Best Practices
|
|
125
|
+
|
|
126
|
+
### 1. Use Specific Error Types
|
|
127
|
+
|
|
128
|
+
```ts
|
|
129
|
+
import { ConfigurationError, RuntimeError } from "@zuplo/runtime";
|
|
130
|
+
|
|
131
|
+
// For configuration issues
|
|
132
|
+
if (!config.isValid()) {
|
|
133
|
+
throw new ConfigurationError(
|
|
134
|
+
"Invalid configuration: missing required fields",
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// for runtime issues
|
|
139
|
+
if (response.status === 503) {
|
|
140
|
+
throw new RuntimeError({
|
|
141
|
+
message: "Service temporarily unavailable",
|
|
142
|
+
extensionMembers: {
|
|
143
|
+
retryAfter: response.headers.get("Retry-After"),
|
|
144
|
+
service: "external-api",
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### 2. Include Helpful Context
|
|
151
|
+
|
|
152
|
+
```ts
|
|
153
|
+
throw new RuntimeError(
|
|
154
|
+
{
|
|
155
|
+
message: "Database query failed",
|
|
156
|
+
extensionMembers: {
|
|
157
|
+
query: "SELECT * FROM users WHERE id = ?",
|
|
158
|
+
parameters: [userId],
|
|
159
|
+
errorCode: "DB_CONNECTION_TIMEOUT",
|
|
160
|
+
suggestion: "Check database connection settings",
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
{ cause: originalError },
|
|
164
|
+
);
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### 3. Use Error Boundaries in Policies
|
|
168
|
+
|
|
169
|
+
```ts
|
|
170
|
+
import { RuntimeError, ZuploContext, ZuploRequest } from "@zuplo/runtime";
|
|
171
|
+
|
|
172
|
+
export default async function customPolicy(
|
|
173
|
+
request: ZuploRequest,
|
|
174
|
+
context: ZuploContext,
|
|
175
|
+
options: any,
|
|
176
|
+
policyName: string,
|
|
177
|
+
) {
|
|
178
|
+
try {
|
|
179
|
+
// Policy logic here
|
|
180
|
+
return request;
|
|
181
|
+
} catch (error) {
|
|
182
|
+
// Log the error
|
|
183
|
+
context.log.error("Policy execution failed", {
|
|
184
|
+
policyName,
|
|
185
|
+
error: error instanceof Error ? error.message : String(error),
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
// Re-throw as RuntimeError with context
|
|
189
|
+
throw new RuntimeError(
|
|
190
|
+
{
|
|
191
|
+
message: `Policy '${policyName}' failed to execute`,
|
|
192
|
+
extensionMembers: {
|
|
193
|
+
policyName,
|
|
194
|
+
originalError: error instanceof Error ? error.message : String(error),
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
{ cause: error },
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
## Integration with Problem Details
|
|
204
|
+
|
|
205
|
+
When using [HttpProblems](./http-problems.mdx), errors can be automatically
|
|
206
|
+
converted to RFC 7807 Problem Details responses:
|
|
207
|
+
|
|
208
|
+
```ts
|
|
209
|
+
import {
|
|
210
|
+
RuntimeError,
|
|
211
|
+
HttpProblems,
|
|
212
|
+
ZuploContext,
|
|
213
|
+
ZuploRequest,
|
|
214
|
+
} from "@zuplo/runtime";
|
|
215
|
+
|
|
216
|
+
export default async function handler(
|
|
217
|
+
request: ZuploRequest,
|
|
218
|
+
context: ZuploContext,
|
|
219
|
+
) {
|
|
220
|
+
try {
|
|
221
|
+
// Your logic here
|
|
222
|
+
} catch (error) {
|
|
223
|
+
if (error instanceof ConfigurationError) {
|
|
224
|
+
return HttpProblems.internalServerError(request, context, {
|
|
225
|
+
detail: error.message,
|
|
226
|
+
instance: `/errors/${context.requestId}`,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (error instanceof RuntimeError && error.extensionMembers) {
|
|
231
|
+
return HttpProblems.internalServerError(request, context, {
|
|
232
|
+
detail: error.message,
|
|
233
|
+
...error.extensionMembers,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Default error response
|
|
238
|
+
return HttpProblems.internalServerError(request, context);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
## See Also
|
|
244
|
+
|
|
245
|
+
- [HttpProblems](./http-problems.mdx) - Creating standardized error responses
|
|
246
|
+
- [ZuploContext](./zuplo-context.mdx) - Context object with logging capabilities
|