@antasphere/chassis-server 1.0.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/LICENSE +82 -0
- package/dist/accounts/deletion.d.ts +163 -0
- package/dist/accounts/deletion.d.ts.map +1 -0
- package/dist/accounts/deletion.js +360 -0
- package/dist/accounts/deletion.js.map +1 -0
- package/dist/accounts/erasure-log.d.ts +66 -0
- package/dist/accounts/erasure-log.d.ts.map +1 -0
- package/dist/accounts/erasure-log.js +117 -0
- package/dist/accounts/erasure-log.js.map +1 -0
- package/dist/accounts/index.d.ts +6 -0
- package/dist/accounts/index.d.ts.map +1 -0
- package/dist/accounts/index.js +6 -0
- package/dist/accounts/index.js.map +1 -0
- package/dist/accounts/mint-refusal.d.ts +47 -0
- package/dist/accounts/mint-refusal.d.ts.map +1 -0
- package/dist/accounts/mint-refusal.js +59 -0
- package/dist/accounts/mint-refusal.js.map +1 -0
- package/dist/accounts/signup-duplicate.d.ts +14 -0
- package/dist/accounts/signup-duplicate.d.ts.map +1 -0
- package/dist/accounts/signup-duplicate.js +25 -0
- package/dist/accounts/signup-duplicate.js.map +1 -0
- package/dist/accounts/superadmin.d.ts +27 -0
- package/dist/accounts/superadmin.d.ts.map +1 -0
- package/dist/accounts/superadmin.js +46 -0
- package/dist/accounts/superadmin.js.map +1 -0
- package/dist/api/apikeys.d.ts +14 -0
- package/dist/api/apikeys.d.ts.map +1 -0
- package/dist/api/apikeys.js +124 -0
- package/dist/api/apikeys.js.map +1 -0
- package/dist/api/audit.d.ts +4 -0
- package/dist/api/audit.d.ts.map +1 -0
- package/dist/api/audit.js +75 -0
- package/dist/api/audit.js.map +1 -0
- package/dist/api/break-glass.d.ts +48 -0
- package/dist/api/break-glass.d.ts.map +1 -0
- package/dist/api/break-glass.js +217 -0
- package/dist/api/break-glass.js.map +1 -0
- package/dist/api/cli-auth.d.ts +84 -0
- package/dist/api/cli-auth.d.ts.map +1 -0
- package/dist/api/cli-auth.js +177 -0
- package/dist/api/cli-auth.js.map +1 -0
- package/dist/api/create-api.d.ts +123 -0
- package/dist/api/create-api.d.ts.map +1 -0
- package/dist/api/create-api.js +1165 -0
- package/dist/api/create-api.js.map +1 -0
- package/dist/api/demo-passes.d.ts +45 -0
- package/dist/api/demo-passes.d.ts.map +1 -0
- package/dist/api/demo-passes.js +143 -0
- package/dist/api/demo-passes.js.map +1 -0
- package/dist/api/errors.d.ts +5 -0
- package/dist/api/errors.d.ts.map +1 -0
- package/dist/api/errors.js +5 -0
- package/dist/api/errors.js.map +1 -0
- package/dist/api/export.d.ts +63 -0
- package/dist/api/export.d.ts.map +1 -0
- package/dist/api/export.js +393 -0
- package/dist/api/export.js.map +1 -0
- package/dist/api/files.d.ts +40 -0
- package/dist/api/files.d.ts.map +1 -0
- package/dist/api/files.js +150 -0
- package/dist/api/files.js.map +1 -0
- package/dist/api/index.d.ts +17 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +17 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/invitations.d.ts +50 -0
- package/dist/api/invitations.d.ts.map +1 -0
- package/dist/api/invitations.js +313 -0
- package/dist/api/invitations.js.map +1 -0
- package/dist/api/members.d.ts +25 -0
- package/dist/api/members.d.ts.map +1 -0
- package/dist/api/members.js +522 -0
- package/dist/api/members.js.map +1 -0
- package/dist/api/onboarding.d.ts +26 -0
- package/dist/api/onboarding.d.ts.map +1 -0
- package/dist/api/onboarding.js +23 -0
- package/dist/api/onboarding.js.map +1 -0
- package/dist/api/openapi-doc.d.ts +21 -0
- package/dist/api/openapi-doc.d.ts.map +1 -0
- package/dist/api/openapi-doc.js +25 -0
- package/dist/api/openapi-doc.js.map +1 -0
- package/dist/api/projects.d.ts +24 -0
- package/dist/api/projects.d.ts.map +1 -0
- package/dist/api/projects.js +624 -0
- package/dist/api/projects.js.map +1 -0
- package/dist/api/scope-routes.d.ts +12 -0
- package/dist/api/scope-routes.d.ts.map +1 -0
- package/dist/api/scope-routes.js +2 -0
- package/dist/api/scope-routes.js.map +1 -0
- package/dist/api/sso-connect.d.ts +70 -0
- package/dist/api/sso-connect.d.ts.map +1 -0
- package/dist/api/sso-connect.js +164 -0
- package/dist/api/sso-connect.js.map +1 -0
- package/dist/api/sso-logout.d.ts +41 -0
- package/dist/api/sso-logout.d.ts.map +1 -0
- package/dist/api/sso-logout.js +34 -0
- package/dist/api/sso-logout.js.map +1 -0
- package/dist/api/teams.d.ts +43 -0
- package/dist/api/teams.d.ts.map +1 -0
- package/dist/api/teams.js +447 -0
- package/dist/api/teams.js.map +1 -0
- package/dist/api/workspaces.d.ts +114 -0
- package/dist/api/workspaces.d.ts.map +1 -0
- package/dist/api/workspaces.js +462 -0
- package/dist/api/workspaces.js.map +1 -0
- package/dist/apikeys/index.d.ts +3 -0
- package/dist/apikeys/index.d.ts.map +1 -0
- package/dist/apikeys/index.js +3 -0
- package/dist/apikeys/index.js.map +1 -0
- package/dist/apikeys/peppers.d.ts +53 -0
- package/dist/apikeys/peppers.d.ts.map +1 -0
- package/dist/apikeys/peppers.js +97 -0
- package/dist/apikeys/peppers.js.map +1 -0
- package/dist/apikeys/service.d.ts +56 -0
- package/dist/apikeys/service.d.ts.map +1 -0
- package/dist/apikeys/service.js +196 -0
- package/dist/apikeys/service.js.map +1 -0
- package/dist/app.d.ts +65 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +142 -0
- package/dist/app.js.map +1 -0
- package/dist/audit/filters.d.ts +38 -0
- package/dist/audit/filters.d.ts.map +1 -0
- package/dist/audit/filters.js +97 -0
- package/dist/audit/filters.js.map +1 -0
- package/dist/audit/index.d.ts +3 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +3 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/audit/service.d.ts +65 -0
- package/dist/audit/service.d.ts.map +1 -0
- package/dist/audit/service.js +103 -0
- package/dist/audit/service.js.map +1 -0
- package/dist/boot.d.ts +8 -0
- package/dist/boot.d.ts.map +1 -0
- package/dist/boot.js +822 -0
- package/dist/boot.js.map +1 -0
- package/dist/constant-time.d.ts +3 -0
- package/dist/constant-time.d.ts.map +1 -0
- package/dist/constant-time.js +10 -0
- package/dist/constant-time.js.map +1 -0
- package/dist/email/driver.d.ts +16 -0
- package/dist/email/driver.d.ts.map +1 -0
- package/dist/email/driver.js +136 -0
- package/dist/email/driver.js.map +1 -0
- package/dist/email/index.d.ts +4 -0
- package/dist/email/index.d.ts.map +1 -0
- package/dist/email/index.js +4 -0
- package/dist/email/index.js.map +1 -0
- package/dist/email/shell.d.ts +72 -0
- package/dist/email/shell.d.ts.map +1 -0
- package/dist/email/shell.js +146 -0
- package/dist/email/shell.js.map +1 -0
- package/dist/email/templates.d.ts +83 -0
- package/dist/email/templates.d.ts.map +1 -0
- package/dist/email/templates.js +96 -0
- package/dist/email/templates.js.map +1 -0
- package/dist/entitlements/check.d.ts +140 -0
- package/dist/entitlements/check.d.ts.map +1 -0
- package/dist/entitlements/check.js +276 -0
- package/dist/entitlements/check.js.map +1 -0
- package/dist/entitlements/clock-skew.d.ts +27 -0
- package/dist/entitlements/clock-skew.d.ts.map +1 -0
- package/dist/entitlements/clock-skew.js +58 -0
- package/dist/entitlements/clock-skew.js.map +1 -0
- package/dist/entitlements/gate.d.ts +113 -0
- package/dist/entitlements/gate.d.ts.map +1 -0
- package/dist/entitlements/gate.js +430 -0
- package/dist/entitlements/gate.js.map +1 -0
- package/dist/entitlements/hub-machine-token.d.ts +83 -0
- package/dist/entitlements/hub-machine-token.d.ts.map +1 -0
- package/dist/entitlements/hub-machine-token.js +175 -0
- package/dist/entitlements/hub-machine-token.js.map +1 -0
- package/dist/entitlements/hub-subject.d.ts +32 -0
- package/dist/entitlements/hub-subject.d.ts.map +1 -0
- package/dist/entitlements/hub-subject.js +68 -0
- package/dist/entitlements/hub-subject.js.map +1 -0
- package/dist/entitlements/index.d.ts +9 -0
- package/dist/entitlements/index.d.ts.map +1 -0
- package/dist/entitlements/index.js +9 -0
- package/dist/entitlements/index.js.map +1 -0
- package/dist/entitlements/poster.d.ts +81 -0
- package/dist/entitlements/poster.d.ts.map +1 -0
- package/dist/entitlements/poster.js +169 -0
- package/dist/entitlements/poster.js.map +1 -0
- package/dist/entitlements/profiles.d.ts +121 -0
- package/dist/entitlements/profiles.d.ts.map +1 -0
- package/dist/entitlements/profiles.js +212 -0
- package/dist/entitlements/profiles.js.map +1 -0
- package/dist/entitlements/slot.d.ts +33 -0
- package/dist/entitlements/slot.d.ts.map +1 -0
- package/dist/entitlements/slot.js +75 -0
- package/dist/entitlements/slot.js.map +1 -0
- package/dist/env.d.ts +293 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +383 -0
- package/dist/env.js.map +1 -0
- package/dist/files/http.d.ts +23 -0
- package/dist/files/http.d.ts.map +1 -0
- package/dist/files/http.js +66 -0
- package/dist/files/http.js.map +1 -0
- package/dist/files/index.d.ts +5 -0
- package/dist/files/index.d.ts.map +1 -0
- package/dist/files/index.js +5 -0
- package/dist/files/index.js.map +1 -0
- package/dist/files/serve.d.ts +43 -0
- package/dist/files/serve.d.ts.map +1 -0
- package/dist/files/serve.js +71 -0
- package/dist/files/serve.js.map +1 -0
- package/dist/files/service.d.ts +69 -0
- package/dist/files/service.d.ts.map +1 -0
- package/dist/files/service.js +188 -0
- package/dist/files/service.js.map +1 -0
- package/dist/files/spool.d.ts +21 -0
- package/dist/files/spool.d.ts.map +1 -0
- package/dist/files/spool.js +47 -0
- package/dist/files/spool.js.map +1 -0
- package/dist/identity/better-auth.d.ts +3927 -0
- package/dist/identity/better-auth.d.ts.map +1 -0
- package/dist/identity/better-auth.js +896 -0
- package/dist/identity/better-auth.js.map +1 -0
- package/dist/identity/demo-pass-plugin.d.ts +29 -0
- package/dist/identity/demo-pass-plugin.d.ts.map +1 -0
- package/dist/identity/demo-pass-plugin.js +88 -0
- package/dist/identity/demo-pass-plugin.js.map +1 -0
- package/dist/identity/demo-pass-rules.d.ts +84 -0
- package/dist/identity/demo-pass-rules.d.ts.map +1 -0
- package/dist/identity/demo-pass-rules.js +223 -0
- package/dist/identity/demo-pass-rules.js.map +1 -0
- package/dist/identity/demo-pass.d.ts +159 -0
- package/dist/identity/demo-pass.d.ts.map +1 -0
- package/dist/identity/demo-pass.js +319 -0
- package/dist/identity/demo-pass.js.map +1 -0
- package/dist/identity/hub-grant.d.ts +182 -0
- package/dist/identity/hub-grant.d.ts.map +1 -0
- package/dist/identity/hub-grant.js +594 -0
- package/dist/identity/hub-grant.js.map +1 -0
- package/dist/identity/hub-jwt.d.ts +22 -0
- package/dist/identity/hub-jwt.d.ts.map +1 -0
- package/dist/identity/hub-jwt.js +77 -0
- package/dist/identity/hub-jwt.js.map +1 -0
- package/dist/identity/hub-live-gate.d.ts +17 -0
- package/dist/identity/hub-live-gate.d.ts.map +1 -0
- package/dist/identity/hub-live-gate.js +146 -0
- package/dist/identity/hub-live-gate.js.map +1 -0
- package/dist/identity/hub-logout.d.ts +88 -0
- package/dist/identity/hub-logout.d.ts.map +1 -0
- package/dist/identity/hub-logout.js +158 -0
- package/dist/identity/hub-logout.js.map +1 -0
- package/dist/identity/hub-projection.d.ts +103 -0
- package/dist/identity/hub-projection.d.ts.map +1 -0
- package/dist/identity/hub-projection.js +130 -0
- package/dist/identity/hub-projection.js.map +1 -0
- package/dist/identity/hub-reconcile.d.ts +151 -0
- package/dist/identity/hub-reconcile.d.ts.map +1 -0
- package/dist/identity/hub-reconcile.js +400 -0
- package/dist/identity/hub-reconcile.js.map +1 -0
- package/dist/identity/hub-sso.d.ts +363 -0
- package/dist/identity/hub-sso.d.ts.map +1 -0
- package/dist/identity/hub-sso.js +536 -0
- package/dist/identity/hub-sso.js.map +1 -0
- package/dist/identity/hub-user-client.d.ts +222 -0
- package/dist/identity/hub-user-client.d.ts.map +1 -0
- package/dist/identity/hub-user-client.js +406 -0
- package/dist/identity/hub-user-client.js.map +1 -0
- package/dist/identity/index.d.ts +13 -0
- package/dist/identity/index.d.ts.map +1 -0
- package/dist/identity/index.js +13 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/identity/oauth-jwt.d.ts +32 -0
- package/dist/identity/oauth-jwt.d.ts.map +1 -0
- package/dist/identity/oauth-jwt.js +122 -0
- package/dist/identity/oauth-jwt.js.map +1 -0
- package/dist/identity/resolve-membership.d.ts +28 -0
- package/dist/identity/resolve-membership.d.ts.map +1 -0
- package/dist/identity/resolve-membership.js +69 -0
- package/dist/identity/resolve-membership.js.map +1 -0
- package/dist/identity/signing-key.d.ts +49 -0
- package/dist/identity/signing-key.d.ts.map +1 -0
- package/dist/identity/signing-key.js +144 -0
- package/dist/identity/signing-key.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/invitations/index.d.ts +2 -0
- package/dist/invitations/index.d.ts.map +1 -0
- package/dist/invitations/index.js +2 -0
- package/dist/invitations/index.js.map +1 -0
- package/dist/invitations/service.d.ts +36 -0
- package/dist/invitations/service.d.ts.map +1 -0
- package/dist/invitations/service.js +122 -0
- package/dist/invitations/service.js.map +1 -0
- package/dist/jobs/index.d.ts +3 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +3 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/jobs/pgboss.d.ts +119 -0
- package/dist/jobs/pgboss.d.ts.map +1 -0
- package/dist/jobs/pgboss.js +521 -0
- package/dist/jobs/pgboss.js.map +1 -0
- package/dist/jobs/timers.d.ts +127 -0
- package/dist/jobs/timers.d.ts.map +1 -0
- package/dist/jobs/timers.js +228 -0
- package/dist/jobs/timers.js.map +1 -0
- package/dist/logger.d.ts +17 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +64 -0
- package/dist/logger.js.map +1 -0
- package/dist/mcp/errors.d.ts +37 -0
- package/dist/mcp/errors.d.ts.map +1 -0
- package/dist/mcp/errors.js +77 -0
- package/dist/mcp/errors.js.map +1 -0
- package/dist/mcp/http.d.ts +35 -0
- package/dist/mcp/http.d.ts.map +1 -0
- package/dist/mcp/http.js +80 -0
- package/dist/mcp/http.js.map +1 -0
- package/dist/mcp/index.d.ts +8 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +8 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/inputs.d.ts +19 -0
- package/dist/mcp/inputs.d.ts.map +1 -0
- package/dist/mcp/inputs.js +28 -0
- package/dist/mcp/inputs.js.map +1 -0
- package/dist/mcp/projects.d.ts +31 -0
- package/dist/mcp/projects.d.ts.map +1 -0
- package/dist/mcp/projects.js +315 -0
- package/dist/mcp/projects.js.map +1 -0
- package/dist/mcp/server.d.ts +52 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +93 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/teams.d.ts +7 -0
- package/dist/mcp/teams.d.ts.map +1 -0
- package/dist/mcp/teams.js +62 -0
- package/dist/mcp/teams.js.map +1 -0
- package/dist/mcp/tool-kit.d.ts +67 -0
- package/dist/mcp/tool-kit.d.ts.map +1 -0
- package/dist/mcp/tool-kit.js +74 -0
- package/dist/mcp/tool-kit.js.map +1 -0
- package/dist/members/removal.d.ts +95 -0
- package/dist/members/removal.d.ts.map +1 -0
- package/dist/members/removal.js +143 -0
- package/dist/members/removal.js.map +1 -0
- package/dist/middleware/auth-body.d.ts +25 -0
- package/dist/middleware/auth-body.d.ts.map +1 -0
- package/dist/middleware/auth-body.js +55 -0
- package/dist/middleware/auth-body.js.map +1 -0
- package/dist/middleware/auth-context.d.ts +170 -0
- package/dist/middleware/auth-context.d.ts.map +1 -0
- package/dist/middleware/auth-context.js +251 -0
- package/dist/middleware/auth-context.js.map +1 -0
- package/dist/middleware/body-cap.d.ts +17 -0
- package/dist/middleware/body-cap.d.ts.map +1 -0
- package/dist/middleware/body-cap.js +31 -0
- package/dist/middleware/body-cap.js.map +1 -0
- package/dist/middleware/body-refusal.d.ts +20 -0
- package/dist/middleware/body-refusal.d.ts.map +1 -0
- package/dist/middleware/body-refusal.js +5 -0
- package/dist/middleware/body-refusal.js.map +1 -0
- package/dist/middleware/cross-site.d.ts +61 -0
- package/dist/middleware/cross-site.d.ts.map +1 -0
- package/dist/middleware/cross-site.js +59 -0
- package/dist/middleware/cross-site.js.map +1 -0
- package/dist/middleware/hub-managed.d.ts +45 -0
- package/dist/middleware/hub-managed.d.ts.map +1 -0
- package/dist/middleware/hub-managed.js +56 -0
- package/dist/middleware/hub-managed.js.map +1 -0
- package/dist/middleware/idempotency.d.ts +14 -0
- package/dist/middleware/idempotency.d.ts.map +1 -0
- package/dist/middleware/idempotency.js +222 -0
- package/dist/middleware/idempotency.js.map +1 -0
- package/dist/middleware/index.d.ts +12 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +12 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/json-depth.d.ts +32 -0
- package/dist/middleware/json-depth.d.ts.map +1 -0
- package/dist/middleware/json-depth.js +80 -0
- package/dist/middleware/json-depth.js.map +1 -0
- package/dist/middleware/no-store.d.ts +21 -0
- package/dist/middleware/no-store.d.ts.map +1 -0
- package/dist/middleware/no-store.js +32 -0
- package/dist/middleware/no-store.js.map +1 -0
- package/dist/middleware/oauth-public.d.ts +16 -0
- package/dist/middleware/oauth-public.d.ts.map +1 -0
- package/dist/middleware/oauth-public.js +50 -0
- package/dist/middleware/oauth-public.js.map +1 -0
- package/dist/middleware/rate-limit.d.ts +182 -0
- package/dist/middleware/rate-limit.d.ts.map +1 -0
- package/dist/middleware/rate-limit.js +277 -0
- package/dist/middleware/rate-limit.js.map +1 -0
- package/dist/middleware/request-id.d.ts +10 -0
- package/dist/middleware/request-id.d.ts.map +1 -0
- package/dist/middleware/request-id.js +42 -0
- package/dist/middleware/request-id.js.map +1 -0
- package/dist/middleware/scopes.d.ts +33 -0
- package/dist/middleware/scopes.d.ts.map +1 -0
- package/dist/middleware/scopes.js +139 -0
- package/dist/middleware/scopes.js.map +1 -0
- package/dist/middleware/security-headers.d.ts +53 -0
- package/dist/middleware/security-headers.d.ts.map +1 -0
- package/dist/middleware/security-headers.js +96 -0
- package/dist/middleware/security-headers.js.map +1 -0
- package/dist/observability/index.d.ts +3 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +3 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/metrics.d.ts +17 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +82 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/observability/otel.d.ts +20 -0
- package/dist/observability/otel.d.ts.map +1 -0
- package/dist/observability/otel.js +54 -0
- package/dist/observability/otel.js.map +1 -0
- package/dist/pagination.d.ts +57 -0
- package/dist/pagination.d.ts.map +1 -0
- package/dist/pagination.js +90 -0
- package/dist/pagination.js.map +1 -0
- package/dist/platform/edition.d.ts +57 -0
- package/dist/platform/edition.d.ts.map +1 -0
- package/dist/platform/edition.js +90 -0
- package/dist/platform/edition.js.map +1 -0
- package/dist/platform/entitlements.d.ts +26 -0
- package/dist/platform/entitlements.d.ts.map +1 -0
- package/dist/platform/entitlements.js +28 -0
- package/dist/platform/entitlements.js.map +1 -0
- package/dist/platform/events.d.ts +87 -0
- package/dist/platform/events.d.ts.map +1 -0
- package/dist/platform/events.js +32 -0
- package/dist/platform/events.js.map +1 -0
- package/dist/platform/index.d.ts +8 -0
- package/dist/platform/index.d.ts.map +1 -0
- package/dist/platform/index.js +8 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/local-identity.d.ts +39 -0
- package/dist/platform/local-identity.d.ts.map +1 -0
- package/dist/platform/local-identity.js +87 -0
- package/dist/platform/local-identity.js.map +1 -0
- package/dist/platform/registry.d.ts +23 -0
- package/dist/platform/registry.d.ts.map +1 -0
- package/dist/platform/registry.js +5 -0
- package/dist/platform/registry.js.map +1 -0
- package/dist/platform/usage.d.ts +11 -0
- package/dist/platform/usage.d.ts.map +1 -0
- package/dist/platform/usage.js +12 -0
- package/dist/platform/usage.js.map +1 -0
- package/dist/platform/workspaces.d.ts +25 -0
- package/dist/platform/workspaces.d.ts.map +1 -0
- package/dist/platform/workspaces.js +44 -0
- package/dist/platform/workspaces.js.map +1 -0
- package/dist/projects/access.d.ts +40 -0
- package/dist/projects/access.d.ts.map +1 -0
- package/dist/projects/access.js +133 -0
- package/dist/projects/access.js.map +1 -0
- package/dist/projects/index.d.ts +2 -0
- package/dist/projects/index.d.ts.map +1 -0
- package/dist/projects/index.js +2 -0
- package/dist/projects/index.js.map +1 -0
- package/dist/route-label.d.ts +23 -0
- package/dist/route-label.d.ts.map +1 -0
- package/dist/route-label.js +29 -0
- package/dist/route-label.js.map +1 -0
- package/dist/routes/health.d.ts +30 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +54 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/index.d.ts +3 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +3 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/wellknown.d.ts +11 -0
- package/dist/routes/wellknown.d.ts.map +1 -0
- package/dist/routes/wellknown.js +45 -0
- package/dist/routes/wellknown.js.map +1 -0
- package/dist/secret.d.ts +30 -0
- package/dist/secret.d.ts.map +1 -0
- package/dist/secret.js +97 -0
- package/dist/secret.js.map +1 -0
- package/dist/setup-transport.d.ts +23 -0
- package/dist/setup-transport.d.ts.map +1 -0
- package/dist/setup-transport.js +52 -0
- package/dist/setup-transport.js.map +1 -0
- package/dist/state.d.ts +21 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +4 -0
- package/dist/state.js.map +1 -0
- package/dist/storage/driver.d.ts +38 -0
- package/dist/storage/driver.d.ts.map +1 -0
- package/dist/storage/driver.js +14 -0
- package/dist/storage/driver.js.map +1 -0
- package/dist/storage/factory.d.ts +4 -0
- package/dist/storage/factory.d.ts.map +1 -0
- package/dist/storage/factory.js +20 -0
- package/dist/storage/factory.js.map +1 -0
- package/dist/storage/index.d.ts +4 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +4 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/local.d.ts +21 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +88 -0
- package/dist/storage/local.js.map +1 -0
- package/dist/storage/s3.d.ts +29 -0
- package/dist/storage/s3.d.ts.map +1 -0
- package/dist/storage/s3.js +82 -0
- package/dist/storage/s3.js.map +1 -0
- package/dist/testing/fake-hub.d.ts +425 -0
- package/dist/testing/fake-hub.d.ts.map +1 -0
- package/dist/testing/fake-hub.js +1074 -0
- package/dist/testing/fake-hub.js.map +1 -0
- package/dist/testing/helpers.d.ts +124 -0
- package/dist/testing/helpers.d.ts.map +1 -0
- package/dist/testing/helpers.js +174 -0
- package/dist/testing/helpers.js.map +1 -0
- package/dist/testing/index.d.ts +12 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +12 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/setup-origins.d.ts +21 -0
- package/dist/testing/setup-origins.d.ts.map +1 -0
- package/dist/testing/setup-origins.js +57 -0
- package/dist/testing/setup-origins.js.map +1 -0
- package/dist/testing/sso-helpers.d.ts +43 -0
- package/dist/testing/sso-helpers.d.ts.map +1 -0
- package/dist/testing/sso-helpers.js +159 -0
- package/dist/testing/sso-helpers.js.map +1 -0
- package/dist/tool-definition.d.ts +382 -0
- package/dist/tool-definition.d.ts.map +1 -0
- package/dist/tool-definition.js +46 -0
- package/dist/tool-definition.js.map +1 -0
- package/dist/util/index.d.ts +8 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/index.js +8 -0
- package/dist/util/index.js.map +1 -0
- package/package.json +161 -0
- package/src/accounts/deletion.ts +389 -0
- package/src/accounts/erasure-log.ts +140 -0
- package/src/accounts/index.ts +5 -0
- package/src/accounts/mint-refusal.ts +67 -0
- package/src/accounts/signup-duplicate.ts +21 -0
- package/src/accounts/superadmin.ts +46 -0
- package/src/api/apikeys.ts +147 -0
- package/src/api/audit.ts +83 -0
- package/src/api/break-glass.ts +294 -0
- package/src/api/cli-auth.ts +308 -0
- package/src/api/create-api.ts +1403 -0
- package/src/api/demo-passes.ts +207 -0
- package/src/api/errors.ts +13 -0
- package/src/api/export.ts +482 -0
- package/src/api/files.ts +200 -0
- package/src/api/index.ts +29 -0
- package/src/api/invitations.ts +396 -0
- package/src/api/members.ts +617 -0
- package/src/api/onboarding.ts +50 -0
- package/src/api/openapi-doc.ts +34 -0
- package/src/api/projects.ts +788 -0
- package/src/api/scope-routes.ts +12 -0
- package/src/api/sso-connect.ts +246 -0
- package/src/api/sso-logout.ts +76 -0
- package/src/api/teams.ts +575 -0
- package/src/api/workspaces.ts +649 -0
- package/src/apikeys/index.ts +2 -0
- package/src/apikeys/peppers.ts +118 -0
- package/src/apikeys/service.ts +223 -0
- package/src/app.ts +228 -0
- package/src/audit/filters.ts +101 -0
- package/src/audit/index.ts +9 -0
- package/src/audit/service.ts +154 -0
- package/src/boot.ts +953 -0
- package/src/constant-time.ts +9 -0
- package/src/email/driver.ts +139 -0
- package/src/email/index.ts +26 -0
- package/src/email/shell.ts +201 -0
- package/src/email/templates.ts +184 -0
- package/src/entitlements/check.ts +435 -0
- package/src/entitlements/clock-skew.ts +58 -0
- package/src/entitlements/gate.ts +636 -0
- package/src/entitlements/hub-machine-token.ts +205 -0
- package/src/entitlements/hub-subject.ts +77 -0
- package/src/entitlements/index.ts +37 -0
- package/src/entitlements/poster.ts +265 -0
- package/src/entitlements/profiles.ts +303 -0
- package/src/entitlements/slot.ts +105 -0
- package/src/env.ts +456 -0
- package/src/files/http.ts +77 -0
- package/src/files/index.ts +4 -0
- package/src/files/serve.ts +115 -0
- package/src/files/service.ts +209 -0
- package/src/files/spool.ts +58 -0
- package/src/identity/better-auth.ts +1103 -0
- package/src/identity/demo-pass-plugin.ts +121 -0
- package/src/identity/demo-pass-rules.ts +229 -0
- package/src/identity/demo-pass.ts +390 -0
- package/src/identity/hub-grant.ts +704 -0
- package/src/identity/hub-jwt.ts +78 -0
- package/src/identity/hub-live-gate.ts +167 -0
- package/src/identity/hub-logout.ts +174 -0
- package/src/identity/hub-projection.ts +251 -0
- package/src/identity/hub-reconcile.ts +572 -0
- package/src/identity/hub-sso.ts +696 -0
- package/src/identity/hub-user-client.ts +554 -0
- package/src/identity/index.ts +56 -0
- package/src/identity/oauth-jwt.ts +128 -0
- package/src/identity/resolve-membership.ts +104 -0
- package/src/identity/signing-key.ts +164 -0
- package/src/index.ts +65 -0
- package/src/invitations/index.ts +1 -0
- package/src/invitations/service.ts +171 -0
- package/src/jobs/index.ts +25 -0
- package/src/jobs/pgboss.ts +594 -0
- package/src/jobs/timers.ts +287 -0
- package/src/logger.ts +67 -0
- package/src/mcp/errors.ts +111 -0
- package/src/mcp/http.ts +129 -0
- package/src/mcp/index.ts +28 -0
- package/src/mcp/inputs.ts +33 -0
- package/src/mcp/projects.ts +480 -0
- package/src/mcp/server.ts +174 -0
- package/src/mcp/teams.ts +97 -0
- package/src/mcp/tool-kit.ts +148 -0
- package/src/members/removal.ts +216 -0
- package/src/middleware/auth-body.ts +58 -0
- package/src/middleware/auth-context.ts +384 -0
- package/src/middleware/body-cap.ts +33 -0
- package/src/middleware/body-refusal.ts +23 -0
- package/src/middleware/cross-site.ts +122 -0
- package/src/middleware/hub-managed.ts +61 -0
- package/src/middleware/idempotency.ts +264 -0
- package/src/middleware/index.ts +33 -0
- package/src/middleware/json-depth.ts +74 -0
- package/src/middleware/no-store.ts +30 -0
- package/src/middleware/oauth-public.ts +54 -0
- package/src/middleware/rate-limit.ts +432 -0
- package/src/middleware/request-id.ts +54 -0
- package/src/middleware/scopes.ts +150 -0
- package/src/middleware/security-headers.ts +129 -0
- package/src/observability/index.ts +2 -0
- package/src/observability/metrics.ts +102 -0
- package/src/observability/otel.ts +79 -0
- package/src/pagination.ts +118 -0
- package/src/platform/edition.ts +140 -0
- package/src/platform/entitlements.ts +47 -0
- package/src/platform/events.ts +71 -0
- package/src/platform/index.ts +7 -0
- package/src/platform/local-identity.ts +90 -0
- package/src/platform/registry.ts +28 -0
- package/src/platform/usage.ts +13 -0
- package/src/platform/workspaces.ts +41 -0
- package/src/projects/access.ts +160 -0
- package/src/projects/index.ts +7 -0
- package/src/route-label.ts +29 -0
- package/src/routes/health.ts +79 -0
- package/src/routes/index.ts +2 -0
- package/src/routes/wellknown.ts +67 -0
- package/src/secret.ts +115 -0
- package/src/setup-transport.ts +46 -0
- package/src/state.ts +23 -0
- package/src/storage/driver.ts +48 -0
- package/src/storage/factory.ts +34 -0
- package/src/storage/index.ts +3 -0
- package/src/storage/local.ts +93 -0
- package/src/storage/s3.ts +109 -0
- package/src/testing/fake-hub.ts +1316 -0
- package/src/testing/helpers.ts +254 -0
- package/src/testing/index.ts +11 -0
- package/src/testing/setup-origins.ts +58 -0
- package/src/testing/sso-helpers.ts +178 -0
- package/src/tool-definition.ts +463 -0
- package/src/util/index.ts +17 -0
- package/test/fixtures/onboarding-backfill.sql +13 -0
- package/test/fixtures/operator-user-id-backfill.sql +18 -0
- package/test/host/dr-lib.sh +253 -0
- package/test/host/drizzle/0000_chassis_baseline.sql +438 -0
- package/test/host/drizzle/0001_last_owner_guard.sql +42 -0
- package/test/host/drizzle/meta/0000_snapshot.json +3566 -0
- package/test/host/drizzle/meta/_journal.json +20 -0
- package/test/host/drizzle.config.ts +17 -0
- package/test/host/identity.ts +41 -0
- package/test/host/minimal-host.ts +35 -0
- package/test/host/minimal-tool.ts +123 -0
- package/test/integration/account-oracle-uniformity.test.ts +284 -0
- package/test/integration/account-recovery.test.ts +236 -0
- package/test/integration/account.test.ts +120 -0
- package/test/integration/api-quota.test.ts +208 -0
- package/test/integration/apikey-expiry.test.ts +178 -0
- package/test/integration/apikey-pepper-rotation.test.ts +190 -0
- package/test/integration/boot-posture.test.ts +169 -0
- package/test/integration/break-glass.test.ts +484 -0
- package/test/integration/cloud-lifecycle.test.ts +233 -0
- package/test/integration/credential-boundaries.test.ts +195 -0
- package/test/integration/default-workspace.test.ts +414 -0
- package/test/integration/demo-pass-rules.test.ts +332 -0
- package/test/integration/demo-pass.test.ts +1222 -0
- package/test/integration/dr-verify-real-dump.test.ts +154 -0
- package/test/integration/edition.test.ts +868 -0
- package/test/integration/email-change.test.ts +394 -0
- package/test/integration/empty-tool.test.ts +267 -0
- package/test/integration/entitlements-null-hook.test.ts +187 -0
- package/test/integration/entitlements.test.ts +693 -0
- package/test/integration/export-entries.test.ts +321 -0
- package/test/integration/files.test.ts +320 -0
- package/test/integration/first-boot-claim.test.ts +131 -0
- package/test/integration/gdpr.test.ts +532 -0
- package/test/integration/helpers.ts +29 -0
- package/test/integration/hub-grant.test.ts +505 -0
- package/test/integration/hub-live-gate.test.ts +612 -0
- package/test/integration/hub-managed-membership.test.ts +559 -0
- package/test/integration/hub-org-selector.test.ts +281 -0
- package/test/integration/hub-reconcile.test.ts +646 -0
- package/test/integration/hub-sso.test.ts +704 -0
- package/test/integration/hub-teams.test.ts +771 -0
- package/test/integration/idempotency.test.ts +261 -0
- package/test/integration/invite-verification.test.ts +210 -0
- package/test/integration/last-owner-race.test.ts +263 -0
- package/test/integration/m9-fixes.test.ts +290 -0
- package/test/integration/mcp-projects.test.ts +463 -0
- package/test/integration/member-removal-race.test.ts +466 -0
- package/test/integration/member-removal.test.ts +794 -0
- package/test/integration/oauth-mcp.test.ts +477 -0
- package/test/integration/oauth-workspace.test.ts +371 -0
- package/test/integration/observability.test.ts +183 -0
- package/test/integration/onboarding.test.ts +268 -0
- package/test/integration/orphan-purge.test.ts +451 -0
- package/test/integration/pagination.test.ts +344 -0
- package/test/integration/platform-core.test.ts +305 -0
- package/test/integration/platform.test.ts +246 -0
- package/test/integration/pool-survives-restart.test.ts +80 -0
- package/test/integration/projects-cloud.test.ts +193 -0
- package/test/integration/projects.test.ts +1310 -0
- package/test/integration/security-fixes.test.ts +190 -0
- package/test/integration/setup-transport.test.ts +118 -0
- package/test/integration/signin-wall.test.ts +103 -0
- package/test/integration/signing-key-rotation.test.ts +349 -0
- package/test/integration/sso-helpers.ts +15 -0
- package/test/integration/sso-logout.test.ts +283 -0
- package/test/integration/teams-cloud.test.ts +194 -0
- package/test/integration/teams.test.ts +551 -0
- package/test/integration/timers.test.ts +377 -0
- package/test/integration/two-factor.test.ts +301 -0
- package/test/integration/usage-window.test.ts +161 -0
- package/test/integration/workspace-create-cloud.test.ts +523 -0
- package/test/integration/workspace-create.test.ts +510 -0
- package/test/integration/workspace-scoping.test.ts +530 -0
- package/test/integration/zz-adv-replay-owner.test.ts +205 -0
- package/test/unit/apikey-peppers.test.ts +110 -0
- package/test/unit/apikey-prefix.test.ts +34 -0
- package/test/unit/audit-filters.test.ts +135 -0
- package/test/unit/auth-origins.test.ts +92 -0
- package/test/unit/body-cap.test.ts +84 -0
- package/test/unit/clock-skew.test.ts +68 -0
- package/test/unit/cross-site.test.ts +166 -0
- package/test/unit/declared-credits.test.ts +13 -0
- package/test/unit/demo-pass-rules.test.ts +192 -0
- package/test/unit/email-driver.test.ts +127 -0
- package/test/unit/end-pool.test.ts +181 -0
- package/test/unit/entitlement-check.test.ts +492 -0
- package/test/unit/entitlement-gate.test.ts +1333 -0
- package/test/unit/entitlement-profiles.test.ts +289 -0
- package/test/unit/erasure-log.test.ts +72 -0
- package/test/unit/error-mapping.test.ts +89 -0
- package/test/unit/export-entries.test.ts +85 -0
- package/test/unit/export-sanitize.test.ts +27 -0
- package/test/unit/files-head-route.test.ts +155 -0
- package/test/unit/files-http.test.ts +97 -0
- package/test/unit/head-rewrite.test.ts +72 -0
- package/test/unit/hub-create-org.test.ts +181 -0
- package/test/unit/hub-jwt.test.ts +93 -0
- package/test/unit/hub-sso-params.test.ts +39 -0
- package/test/unit/hub-subject.test.ts +83 -0
- package/test/unit/idempotency-crypto.test.ts +45 -0
- package/test/unit/json-depth.test.ts +88 -0
- package/test/unit/logger-redaction.test.ts +66 -0
- package/test/unit/mcp-errors.test.ts +110 -0
- package/test/unit/mcp-inputs.test.ts +106 -0
- package/test/unit/mcp-project-hints.test.ts +26 -0
- package/test/unit/no-store.test.ts +49 -0
- package/test/unit/no-tool-migration-filename.test.ts +70 -0
- package/test/unit/observability.test.ts +64 -0
- package/test/unit/openapi-doc.test.ts +93 -0
- package/test/unit/rate-limit-consume-on.test.ts +76 -0
- package/test/unit/rate-limit.test.ts +39 -0
- package/test/unit/readyz-storage.test.ts +157 -0
- package/test/unit/request-quota.test.ts +146 -0
- package/test/unit/scopes.test.ts +66 -0
- package/test/unit/security-headers.test.ts +131 -0
- package/test/unit/serve-content-type.test.ts +74 -0
- package/test/unit/setup-transport.test.ts +29 -0
- package/test/unit/storage-local.test.ts +53 -0
- package/test/unit/superadmin.test.ts +32 -0
- package/test/unit/timers.test.ts +287 -0
- package/test/unit/tool-definition-guards.test.ts +166 -0
- package/test/unit/tool-entitlements-guard.test.ts +168 -0
- package/test/unit/usage-poster.test.ts +542 -0
- package/test/unit/usage-window.test.ts +48 -0
- package/test/unit/workspace-create-audit.test.ts +48 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { apiError } from '../api/errors.js';
|
|
2
|
+
/**
|
|
3
|
+
* Nesting cap for request JSON. Deliberately far above anything a contract in
|
|
4
|
+
* `@antasphere/contract` describes (the deepest is three or four levels) and far
|
|
5
|
+
* below the depth at which V8 recursion breaks.
|
|
6
|
+
*
|
|
7
|
+
* Why a cap at all: `JSON.parse` is iterative and swallows any depth, but
|
|
8
|
+
* `JSON.stringify` is RECURSIVE and blows the stack with a `RangeError` past a
|
|
9
|
+
* few thousand levels — and the exact depth depends on the V8 build, so it
|
|
10
|
+
* reproduces inside the shipped `node:22-alpine` image and not on a newer host
|
|
11
|
+
* Node. Every path that echoes, audits, logs, or persists a validated body
|
|
12
|
+
* stringifies it, so an anonymous client could turn one small request body
|
|
13
|
+
* into a 500 plus an error-level stack trace. Rejecting at the edge — before
|
|
14
|
+
* anything parses, let alone stringifies — is the only place the fix is
|
|
15
|
+
* complete.
|
|
16
|
+
*/
|
|
17
|
+
export const MAX_JSON_DEPTH = 100;
|
|
18
|
+
/** Matches better-call's / Hono's JSON content-type test (same regex family). */
|
|
19
|
+
const JSON_CONTENT_TYPE = /^application\/([a-z0-9.+-]*\+)?json/i;
|
|
20
|
+
/**
|
|
21
|
+
* True when `text` nests `{`/`[` deeper than `max`. A single string-aware
|
|
22
|
+
* scan, no parsing and no allocation: brackets inside JSON string literals
|
|
23
|
+
* (and escaped quotes inside them) do not count. Returns as soon as the limit
|
|
24
|
+
* is passed, so a hostile body costs O(prefix), not O(body).
|
|
25
|
+
*/
|
|
26
|
+
export function exceedsJsonDepth(text, max) {
|
|
27
|
+
let depth = 0;
|
|
28
|
+
let inString = false;
|
|
29
|
+
let escaped = false;
|
|
30
|
+
for (let i = 0; i < text.length; i++) {
|
|
31
|
+
const ch = text[i];
|
|
32
|
+
if (inString) {
|
|
33
|
+
if (escaped)
|
|
34
|
+
escaped = false;
|
|
35
|
+
else if (ch === '\\')
|
|
36
|
+
escaped = true;
|
|
37
|
+
else if (ch === '"')
|
|
38
|
+
inString = false;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (ch === '"')
|
|
42
|
+
inString = true;
|
|
43
|
+
else if (ch === '{' || ch === '[') {
|
|
44
|
+
depth++;
|
|
45
|
+
if (depth > max)
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
else if (ch === '}' || ch === ']')
|
|
49
|
+
depth--;
|
|
50
|
+
}
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Rejects over-deep JSON bodies with a 400 before any handler, parser or
|
|
55
|
+
* serializer sees them. Non-JSON and bodyless requests pass untouched, so
|
|
56
|
+
* streamed uploads and form-encoded token calls are unaffected. Mount it
|
|
57
|
+
* AFTER the body-size limit so the scan is bounded by that cap.
|
|
58
|
+
*/
|
|
59
|
+
export function jsonDepthLimit(maxDepth = MAX_JSON_DEPTH) {
|
|
60
|
+
return async (c, next) => {
|
|
61
|
+
const raw = c.req.raw;
|
|
62
|
+
if (!raw.body)
|
|
63
|
+
return next();
|
|
64
|
+
if (!JSON_CONTENT_TYPE.test(raw.headers.get('content-type') ?? ''))
|
|
65
|
+
return next();
|
|
66
|
+
let text;
|
|
67
|
+
try {
|
|
68
|
+
text = await raw.clone().text();
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// Unreadable body — let the normal parser produce the normal error.
|
|
72
|
+
return next();
|
|
73
|
+
}
|
|
74
|
+
if (exceedsJsonDepth(text, maxDepth)) {
|
|
75
|
+
return apiError(c, 400, 'payload_too_deep', `Request JSON nests deeper than ${maxDepth} levels`);
|
|
76
|
+
}
|
|
77
|
+
return next();
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=json-depth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-depth.js","sourceRoot":"","sources":["../../src/middleware/json-depth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAElC,iFAAiF;AACjF,MAAM,iBAAiB,GAAG,sCAAsC,CAAC;AAEjE;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,GAAW;IACxD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,OAAO;gBAAE,OAAO,GAAG,KAAK,CAAC;iBACxB,IAAI,EAAE,KAAK,IAAI;gBAAE,OAAO,GAAG,IAAI,CAAC;iBAChC,IAAI,EAAE,KAAK,GAAG;gBAAE,QAAQ,GAAG,KAAK,CAAC;YACtC,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG;YAAE,QAAQ,GAAG,IAAI,CAAC;aAC3B,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAClC,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,GAAG,GAAG;gBAAE,OAAO,IAAI,CAAC;QAC/B,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;IAC/C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,WAAmB,cAAc;IAC9D,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,IAAI;YAAE,OAAO,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YAAE,OAAO,IAAI,EAAE,CAAC;QAClF,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,oEAAoE;YACpE,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QACD,IAAI,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;YACrC,OAAO,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,kBAAkB,EAAE,kCAAkC,QAAQ,SAAS,CAAC,CAAC;QACnG,CAAC;QACD,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { MiddlewareHandler } from 'hono';
|
|
2
|
+
/**
|
|
3
|
+
* `Cache-Control: no-store` on authenticated JSON.
|
|
4
|
+
*
|
|
5
|
+
* `/me`, the member roster, the audit page, every product resource — all of
|
|
6
|
+
* them answer per-principal JSON with no cache directive at all, which leaves
|
|
7
|
+
* the decision to heuristic caching in whatever sits in front of the app (a
|
|
8
|
+
* shared corporate proxy, a CDN a self-hoster puts in the path, the browser's
|
|
9
|
+
* own bfcache/back-button restore). One user's roster served to the next is
|
|
10
|
+
* exactly the failure mode `no-store` exists to prevent.
|
|
11
|
+
*
|
|
12
|
+
* Scoped deliberately:
|
|
13
|
+
*
|
|
14
|
+
* - only when a principal resolved — anonymous discovery (`/instance`) and
|
|
15
|
+
* the OpenAPI document stay cacheable;
|
|
16
|
+
* - only JSON — file downloads and exports are streamed, sometimes ranged,
|
|
17
|
+
* and set their own headers (api/export.ts already sends `no-store`);
|
|
18
|
+
* - never clobbering a Cache-Control a route set for itself.
|
|
19
|
+
*/
|
|
20
|
+
export declare function noStoreAuthenticated(): MiddlewareHandler;
|
|
21
|
+
//# sourceMappingURL=no-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-store.d.ts","sourceRoot":"","sources":["../../src/middleware/no-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAE9C;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,oBAAoB,IAAI,iBAAiB,CASxD"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Cache-Control: no-store` on authenticated JSON.
|
|
3
|
+
*
|
|
4
|
+
* `/me`, the member roster, the audit page, every product resource — all of
|
|
5
|
+
* them answer per-principal JSON with no cache directive at all, which leaves
|
|
6
|
+
* the decision to heuristic caching in whatever sits in front of the app (a
|
|
7
|
+
* shared corporate proxy, a CDN a self-hoster puts in the path, the browser's
|
|
8
|
+
* own bfcache/back-button restore). One user's roster served to the next is
|
|
9
|
+
* exactly the failure mode `no-store` exists to prevent.
|
|
10
|
+
*
|
|
11
|
+
* Scoped deliberately:
|
|
12
|
+
*
|
|
13
|
+
* - only when a principal resolved — anonymous discovery (`/instance`) and
|
|
14
|
+
* the OpenAPI document stay cacheable;
|
|
15
|
+
* - only JSON — file downloads and exports are streamed, sometimes ranged,
|
|
16
|
+
* and set their own headers (api/export.ts already sends `no-store`);
|
|
17
|
+
* - never clobbering a Cache-Control a route set for itself.
|
|
18
|
+
*/
|
|
19
|
+
export function noStoreAuthenticated() {
|
|
20
|
+
return async (c, next) => {
|
|
21
|
+
await next();
|
|
22
|
+
if (!c.get('principal'))
|
|
23
|
+
return;
|
|
24
|
+
if (c.res.headers.has('cache-control'))
|
|
25
|
+
return;
|
|
26
|
+
const contentType = c.res.headers.get('content-type') ?? '';
|
|
27
|
+
if (!contentType.includes('json'))
|
|
28
|
+
return;
|
|
29
|
+
c.res.headers.set('Cache-Control', 'no-store');
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=no-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-store.js","sourceRoot":"","sources":["../../src/middleware/no-store.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,IAAI,EAAE,CAAC;QACb,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC;YAAE,OAAO;QAChC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;YAAE,OAAO;QAC/C,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC5D,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO;QAC1C,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IACjD,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { MiddlewareHandler } from 'hono';
|
|
2
|
+
export declare const OAUTH_CORS_HEADERS: {
|
|
3
|
+
readonly 'Access-Control-Allow-Origin': "*";
|
|
4
|
+
readonly 'Access-Control-Allow-Methods': "GET, POST, OPTIONS";
|
|
5
|
+
readonly 'Access-Control-Allow-Headers': "Content-Type, Authorization, mcp-protocol-version";
|
|
6
|
+
readonly 'Access-Control-Max-Age': "86400";
|
|
7
|
+
};
|
|
8
|
+
export declare function isPublicOauthPath(path: string): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Wide-open CORS + preflight handling for the public OAuth endpoints, and
|
|
11
|
+
* RFC 6749 §5.1 cache suppression on the token endpoint (its responses carry
|
|
12
|
+
* credentials). Registered before the auth-surface rate limits so OPTIONS
|
|
13
|
+
* preflights never consume a bucket.
|
|
14
|
+
*/
|
|
15
|
+
export declare function oauthPublicEndpoints(): MiddlewareHandler;
|
|
16
|
+
//# sourceMappingURL=oauth-public.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-public.d.ts","sourceRoot":"","sources":["../../src/middleware/oauth-public.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAmB9C,eAAO,MAAM,kBAAkB;;;;;CAKrB,CAAC;AAEX,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,iBAAiB,CAiBxD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public (cookie-less) OAuth endpoints that MCP clients call cross-origin.
|
|
3
|
+
* These authenticate via body credentials (code + PKCE, refresh token), never
|
|
4
|
+
* cookies, so a wildcard CORS origin is safe — and required for browser-based
|
|
5
|
+
* clients to read the responses. Cookie-bearing auth endpoints (sign-in,
|
|
6
|
+
* consent, authorize) are deliberately NOT in this list. Ported from the Neon
|
|
7
|
+
* template's hooks.server.ts PUBLIC_OAUTH_PATHS treatment, adapted to the
|
|
8
|
+
* /api/v1/auth base path.
|
|
9
|
+
*/
|
|
10
|
+
const PUBLIC_OAUTH_PATHS = new Set([
|
|
11
|
+
'/api/v1/auth/oauth2/token',
|
|
12
|
+
'/api/v1/auth/oauth2/register',
|
|
13
|
+
'/api/v1/auth/oauth2/introspect',
|
|
14
|
+
'/api/v1/auth/oauth2/revoke',
|
|
15
|
+
'/api/v1/auth/jwks'
|
|
16
|
+
]);
|
|
17
|
+
export const OAUTH_CORS_HEADERS = {
|
|
18
|
+
'Access-Control-Allow-Origin': '*',
|
|
19
|
+
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
|
|
20
|
+
'Access-Control-Allow-Headers': 'Content-Type, Authorization, mcp-protocol-version',
|
|
21
|
+
'Access-Control-Max-Age': '86400'
|
|
22
|
+
};
|
|
23
|
+
export function isPublicOauthPath(path) {
|
|
24
|
+
return PUBLIC_OAUTH_PATHS.has(path) || path.startsWith('/api/v1/auth/.well-known/');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Wide-open CORS + preflight handling for the public OAuth endpoints, and
|
|
28
|
+
* RFC 6749 §5.1 cache suppression on the token endpoint (its responses carry
|
|
29
|
+
* credentials). Registered before the auth-surface rate limits so OPTIONS
|
|
30
|
+
* preflights never consume a bucket.
|
|
31
|
+
*/
|
|
32
|
+
export function oauthPublicEndpoints() {
|
|
33
|
+
return async (c, next) => {
|
|
34
|
+
if (!isPublicOauthPath(c.req.path)) {
|
|
35
|
+
return next();
|
|
36
|
+
}
|
|
37
|
+
if (c.req.method === 'OPTIONS') {
|
|
38
|
+
return c.body(null, 204, { ...OAUTH_CORS_HEADERS });
|
|
39
|
+
}
|
|
40
|
+
await next();
|
|
41
|
+
for (const [key, value] of Object.entries(OAUTH_CORS_HEADERS)) {
|
|
42
|
+
c.res.headers.set(key, value);
|
|
43
|
+
}
|
|
44
|
+
if (c.req.path === '/api/v1/auth/oauth2/token') {
|
|
45
|
+
c.res.headers.set('Cache-Control', 'no-store');
|
|
46
|
+
c.res.headers.set('Pragma', 'no-cache');
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=oauth-public.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-public.js","sourceRoot":"","sources":["../../src/middleware/oauth-public.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACjC,2BAA2B;IAC3B,8BAA8B;IAC9B,gCAAgC;IAChC,4BAA4B;IAC5B,mBAAmB;CACpB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,6BAA6B,EAAE,GAAG;IAClC,8BAA8B,EAAE,oBAAoB;IACpD,8BAA8B,EAAE,mDAAmD;IACnF,wBAAwB,EAAE,OAAO;CACzB,CAAC;AAEX,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,2BAA2B,CAAC,CAAC;AACtF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QACD,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,kBAAkB,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,IAAI,EAAE,CAAC;QACb,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC9D,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,2BAA2B,EAAE,CAAC;YAC/C,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YAC/C,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { type RateLimiterAbstract } from 'rate-limiter-flexible';
|
|
2
|
+
import type { Context, MiddlewareHandler } from 'hono';
|
|
3
|
+
import type { EntitlementService, Principal } from '@antasphere/chassis-contract';
|
|
4
|
+
import type { Env } from '../env.js';
|
|
5
|
+
import type { Logger } from '../logger.js';
|
|
6
|
+
/**
|
|
7
|
+
* Auth-surface rate limits (ours, not Better Auth's built-in): login, OTP
|
|
8
|
+
* sends, invitation acceptance, setup attempts, API-key verification
|
|
9
|
+
* failures. Memory backend per replica by default; Redis when REDIS_URL is
|
|
10
|
+
* set so limits hold across replicas (Profile B).
|
|
11
|
+
*/
|
|
12
|
+
/** Workspace-creation attempts one person gets per hour; an address gets ten times that. */
|
|
13
|
+
export declare const WORKSPACE_CREATE_PER_PERSON = 60;
|
|
14
|
+
export interface RateLimiters {
|
|
15
|
+
login: RateLimiterAbstract;
|
|
16
|
+
otp: RateLimiterAbstract;
|
|
17
|
+
invitationAccept: RateLimiterAbstract;
|
|
18
|
+
setup: RateLimiterAbstract;
|
|
19
|
+
apiKeyFailures: RateLimiterAbstract;
|
|
20
|
+
/**
|
|
21
|
+
* CLI connect (`POST /sso/cli-connect`, cloud): per client address, sized by
|
|
22
|
+
* CLI_CONNECT_IP_LIMIT_PER_15_MIN for a room behind one address (PRDCT-2958,
|
|
23
|
+
* the lane E verifier's F1: on the login wall, 10 per 15 minutes, the 11th
|
|
24
|
+
* `<tool> login` of a venue was refused). The exchange token it presents is
|
|
25
|
+
* one-time and minted by the hub for one person, behind the hub's own walls.
|
|
26
|
+
*/
|
|
27
|
+
cliConnect: RateLimiterAbstract;
|
|
28
|
+
/** RFC 7591 dynamic client registration — unauthenticated by design, so tight. */
|
|
29
|
+
oauthRegister: RateLimiterAbstract;
|
|
30
|
+
/** OAuth token endpoint — a full connector dance is ~8 requests, so generous. */
|
|
31
|
+
oauthToken: RateLimiterAbstract;
|
|
32
|
+
/** The bundled /mcp endpoint — MCP clients are chatty, so generous per IP. */
|
|
33
|
+
mcp: RateLimiterAbstract;
|
|
34
|
+
/** Password reset requests — per IP AND per email, tight (abuse + enumeration). */
|
|
35
|
+
passwordReset: RateLimiterAbstract;
|
|
36
|
+
/** Full-workspace export — expensive streams, keyed per IP AND per user. */
|
|
37
|
+
workspaceExport: RateLimiterAbstract;
|
|
38
|
+
/** Break-glass superadmin recovery — a rare operator action, tight per IP. */
|
|
39
|
+
breakGlass: RateLimiterAbstract;
|
|
40
|
+
/**
|
|
41
|
+
* Workspace creation, the PER-PERSON bucket (key `u:<userId>`) — a rare
|
|
42
|
+
* human act; on cloud every attempt is a call to the hub, and the cloud
|
|
43
|
+
* zero-membership session resolves no principal, so the general quota
|
|
44
|
+
* never sees it. Spent by the handler (api/workspaces.ts) once the caller
|
|
45
|
+
* is IDENTIFIED — never by an unauthenticated request, never by a method
|
|
46
|
+
* that is not the POST.
|
|
47
|
+
*/
|
|
48
|
+
workspaceCreate: RateLimiterAbstract;
|
|
49
|
+
/**
|
|
50
|
+
* Workspace creation, the PER-ADDRESS bucket — ten people's worth of the
|
|
51
|
+
* per-person one, spent only by identified callers the per-person bucket
|
|
52
|
+
* let through. One colleague can therefore take at most a tenth of it:
|
|
53
|
+
* an office behind one NAT address is never locked out by one person,
|
|
54
|
+
* while a farm of accounts behind one address is still bounded.
|
|
55
|
+
*/
|
|
56
|
+
workspaceCreateAddress: RateLimiterAbstract;
|
|
57
|
+
/** The unauthenticated OpenAPI document — cheap now that it is a boot-time buffer, but still anonymous. */
|
|
58
|
+
openapiDoc: RateLimiterAbstract;
|
|
59
|
+
/**
|
|
60
|
+
* The demo pass redeem (demo sign-in, self-hosted only): an anonymous
|
|
61
|
+
* presentation of a sign-in-equivalent secret, so a guessing wall PER
|
|
62
|
+
* ADDRESS and nothing else — never keyed on the pass, whose legitimate
|
|
63
|
+
* audience it would cap. Mounted only while DEMO_SIGN_IN is on.
|
|
64
|
+
*/
|
|
65
|
+
demoRedeem: RateLimiterAbstract;
|
|
66
|
+
/**
|
|
67
|
+
* Shared factory riding the same backend (Redis when REDIS_URL is set,
|
|
68
|
+
* memory otherwise) for buckets sized at runtime — the per-principal
|
|
69
|
+
* request quota creates one limiter per distinct quota tier through this.
|
|
70
|
+
*/
|
|
71
|
+
make: (prefix: string, points: number, durationSec: number) => RateLimiterAbstract;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* A tool's own bucket: the three arguments the shared `make` factory is
|
|
75
|
+
* called with. The store prefix is observable (`rl:<prefix>` in Redis), so a
|
|
76
|
+
* declaration is the bucket's identity, not only its size.
|
|
77
|
+
*/
|
|
78
|
+
export interface BucketDeclaration {
|
|
79
|
+
prefix: string;
|
|
80
|
+
points: number;
|
|
81
|
+
durationSec: number;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* The chassis buckets plus the TOOL's own (`toolBuckets`, name → declaration),
|
|
85
|
+
* all built by the same `make`: one store (Redis when REDIS_URL is set, memory
|
|
86
|
+
* otherwise), one key-prefix scheme. A tool bucket can never take a chassis
|
|
87
|
+
* bucket's name — the type refuses it.
|
|
88
|
+
*/
|
|
89
|
+
export declare function createRateLimiters<TBucket extends string = never>(env: Pick<Env, 'REDIS_URL'> & Partial<Pick<Env, 'CLI_CONNECT_IP_LIMIT_PER_15_MIN'>>, logger: Logger, toolBuckets?: {
|
|
90
|
+
[K in TBucket]: K extends keyof RateLimiters ? never : BucketDeclaration;
|
|
91
|
+
}): Promise<RateLimiters & Record<TBucket, RateLimiterAbstract>>;
|
|
92
|
+
/** The client-identity function: what keys a per-IP bucket and the audit rows. */
|
|
93
|
+
export type ClientIpFn = (c: Context) => string;
|
|
94
|
+
/**
|
|
95
|
+
* Client identity for buckets and audit. x-forwarded-for is only believed
|
|
96
|
+
* when TRUST_PROXY says a proxy we control sets it; otherwise the socket
|
|
97
|
+
* address wins and spoofed headers are ignored. We read the RIGHTMOST hop —
|
|
98
|
+
* the one appended (or set) by the trusted proxy itself; the leftmost is
|
|
99
|
+
* client-claimed and spoofable whenever the proxy appends rather than
|
|
100
|
+
* overwrites. Note the compose caveat: without a proxy, Docker NAT can
|
|
101
|
+
* collapse external clients onto one address — per-IP limits are only as
|
|
102
|
+
* granular as what the socket sees.
|
|
103
|
+
*/
|
|
104
|
+
export declare function makeClientIp(trustProxy: boolean): ClientIpFn;
|
|
105
|
+
/** 429 with the standard wire shape when the bucket is empty. */
|
|
106
|
+
/**
|
|
107
|
+
* WHEN a request costs a point.
|
|
108
|
+
*
|
|
109
|
+
* - `arrival` (default): consume before the handler runs. Correct for
|
|
110
|
+
* everything whose cost IS the arrival — sending mail, accepting an
|
|
111
|
+
* invitation, registering an OAuth client, running setup.
|
|
112
|
+
* - `failure`: check the bucket before the handler (an exhausted bucket
|
|
113
|
+
* still 429s immediately) but consume only when the handler answered a
|
|
114
|
+
* client error. Correct for CREDENTIAL-VERIFICATION walls: on arrival, the
|
|
115
|
+
* limiter cannot yet know whether the caller is the account owner, so an
|
|
116
|
+
* email-keyed bucket consumed up front lets anyone who knows an address
|
|
117
|
+
* spend that account's whole budget and lock its owner out — including on
|
|
118
|
+
* the requests the owner themselves gets right. Consuming on failure keeps
|
|
119
|
+
* the brute-force wall exactly as tight (a guess is a failure) while a
|
|
120
|
+
* legitimate sign-in costs nothing.
|
|
121
|
+
*/
|
|
122
|
+
export interface RateLimitOptions {
|
|
123
|
+
consumeOn?: 'arrival' | 'failure';
|
|
124
|
+
}
|
|
125
|
+
export declare function rateLimit(limiter: RateLimiterAbstract, clientIp: ClientIpFn, extraKeys?: (c: Context) => Promise<string[]>, options?: RateLimitOptions): MiddlewareHandler;
|
|
126
|
+
/**
|
|
127
|
+
* Per-email key for OTP sends and password login (per IP AND per email): the
|
|
128
|
+
* email key keeps per-account protection intact when NAT or a rotating
|
|
129
|
+
* attacker collapses/expands the IP dimension.
|
|
130
|
+
*/
|
|
131
|
+
export declare function emailKeyOf(c: Context): Promise<string[]>;
|
|
132
|
+
/** Outcome of one quota consume — everything the HTTP layer needs for headers. */
|
|
133
|
+
export interface QuotaDecision {
|
|
134
|
+
ok: boolean;
|
|
135
|
+
/** The sustained per-minute limit (what RateLimit-Limit reports). */
|
|
136
|
+
limit: number;
|
|
137
|
+
remaining: number;
|
|
138
|
+
/** Seconds until the sustained window resets. */
|
|
139
|
+
resetSeconds: number;
|
|
140
|
+
/** Present when ok=false: seconds the client should wait before retrying. */
|
|
141
|
+
retryAfterSeconds?: number;
|
|
142
|
+
}
|
|
143
|
+
export interface RequestQuotaService {
|
|
144
|
+
/** Consume one request for this principal; null = quota disabled (no headers). */
|
|
145
|
+
consume(principal: Principal): Promise<QuotaDecision | null>;
|
|
146
|
+
}
|
|
147
|
+
/** RateLimit draft headers + the X- legacy mirror; reset values are delta seconds. */
|
|
148
|
+
export declare function quotaHeaderEntries(d: QuotaDecision): Array<[string, string]>;
|
|
149
|
+
/**
|
|
150
|
+
* Bucket key for the general API quota, derived ONLY from the authenticated
|
|
151
|
+
* principal — never from a client-supplied header, so a caller can neither
|
|
152
|
+
* rotate its own bucket nor fill another principal's. Two API keys of the
|
|
153
|
+
* same user are separate buckets (a leaked key can be throttled/revoked
|
|
154
|
+
* without starving the owner's other integrations); the same user's session
|
|
155
|
+
* is a third.
|
|
156
|
+
*/
|
|
157
|
+
export declare function principalBucketKey(p: Principal): string;
|
|
158
|
+
export interface RequestQuotaDeps {
|
|
159
|
+
entitlements: EntitlementService;
|
|
160
|
+
/** The shared limiter factory from createRateLimiters — Redis-backed when configured. */
|
|
161
|
+
make: RateLimiters['make'];
|
|
162
|
+
logger: Logger;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Per-principal request quota over the shared rate-limit backend. Two buckets
|
|
166
|
+
* per principal: a sustained per-minute window (the quota agents budget
|
|
167
|
+
* against — headers describe this one) and a 1-second spike cap that smooths
|
|
168
|
+
* thundering herds without burning sustained points on rejected spikes.
|
|
169
|
+
*
|
|
170
|
+
* Limits come from EntitlementService.getRequestQuota so a plan-aware edition
|
|
171
|
+
* varies them per principal; limiter instances are created lazily per
|
|
172
|
+
* distinct quota size (a product has a handful of plans, not thousands) and
|
|
173
|
+
* the size is part of the store prefix, so a plan change moves the principal
|
|
174
|
+
* to a fresh bucket instead of misreading the old counter.
|
|
175
|
+
*
|
|
176
|
+
* Failure posture matches the auth-surface limiters: Redis outages fall back
|
|
177
|
+
* to the per-replica insurance limiter inside `make`; any other backend or
|
|
178
|
+
* entitlement failure logs and FAILS OPEN (availability over throttling — the
|
|
179
|
+
* quota is a cost control, not an authz boundary; authz stays fail-closed).
|
|
180
|
+
*/
|
|
181
|
+
export declare function createRequestQuota({ entitlements, make, logger }: RequestQuotaDeps): RequestQuotaService;
|
|
182
|
+
//# sourceMappingURL=rate-limit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"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"}
|