@lastshotlabs/bunshot 0.0.27 → 0.0.28
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/.oclif.manifest.json +39 -0
- package/README.md +8282 -2147
- package/dist/cli/commands/init.js +690 -0
- package/dist/cli/index.js +6 -0
- package/dist/cli.js +4 -4
- package/dist/packages/bunshot-admin/src/index.d.ts +15 -0
- package/dist/packages/bunshot-admin/src/index.js +11 -0
- package/dist/packages/bunshot-admin/src/lib/resourceTypes.d.ts +8 -0
- package/dist/packages/bunshot-admin/src/lib/resourceTypes.js +33 -0
- package/dist/packages/bunshot-admin/src/lib/typedRoute.d.ts +14 -0
- package/dist/packages/bunshot-admin/src/lib/typedRoute.js +17 -0
- package/dist/packages/bunshot-admin/src/plugin.d.ts +4 -0
- package/dist/packages/bunshot-admin/src/plugin.js +46 -0
- package/dist/packages/bunshot-admin/src/providers/auth0Access.d.ts +6 -0
- package/dist/packages/bunshot-admin/src/providers/auth0Access.js +32 -0
- package/dist/packages/bunshot-admin/src/routes/admin.d.ts +10 -0
- package/dist/packages/bunshot-admin/src/routes/admin.js +923 -0
- package/dist/packages/bunshot-admin/src/routes/mail.d.ts +6 -0
- package/dist/packages/bunshot-admin/src/routes/mail.js +114 -0
- package/dist/packages/bunshot-admin/src/routes/permissions.d.ts +8 -0
- package/dist/packages/bunshot-admin/src/routes/permissions.js +315 -0
- package/dist/packages/bunshot-admin/src/types/config.d.ts +16 -0
- package/dist/packages/bunshot-admin/src/types/config.js +37 -0
- package/dist/packages/bunshot-admin/src/types/env.d.ts +14 -0
- package/dist/packages/bunshot-admin/src/types/provider.d.ts +1 -0
- package/dist/packages/bunshot-admin/src/types/provider.js +4 -0
- package/dist/packages/bunshot-auth/src/adapters/memoryAuth.d.ts +66 -0
- package/dist/packages/bunshot-auth/src/adapters/memoryAuth.js +1063 -0
- package/dist/packages/bunshot-auth/src/adapters/mongoAuth.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/adapters/mongoAuth.js +536 -0
- package/dist/packages/bunshot-auth/src/adapters/sqliteAuth.d.ts +88 -0
- package/dist/packages/bunshot-auth/src/adapters/sqliteAuth.js +1366 -0
- package/dist/packages/bunshot-auth/src/admin/bunshotAccess.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/admin/bunshotAccess.js +23 -0
- package/dist/packages/bunshot-auth/src/admin/bunshotUsers.d.ts +5 -0
- package/dist/packages/bunshot-auth/src/admin/bunshotUsers.js +131 -0
- package/dist/packages/bunshot-auth/src/bootstrap.d.ts +38 -0
- package/dist/packages/bunshot-auth/src/bootstrap.js +384 -0
- package/dist/packages/bunshot-auth/src/config/appConfig.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/config/appConfig.js +4 -0
- package/dist/packages/bunshot-auth/src/config/authConfig.d.ts +478 -0
- package/dist/packages/bunshot-auth/src/config/authConfig.js +46 -0
- package/dist/packages/bunshot-auth/src/config/configLock.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/config/configLock.js +10 -0
- package/dist/packages/bunshot-auth/src/index.d.ts +25 -0
- package/dist/packages/bunshot-auth/src/index.js +23 -0
- package/dist/packages/bunshot-auth/src/infra/mongo.d.ts +15 -0
- package/dist/packages/bunshot-auth/src/infra/mongo.js +44 -0
- package/dist/packages/bunshot-auth/src/infra/queue.d.ts +14 -0
- package/dist/packages/bunshot-auth/src/infra/queue.js +27 -0
- package/dist/packages/bunshot-auth/src/infra/redis.d.ts +5 -0
- package/dist/packages/bunshot-auth/src/infra/redis.js +15 -0
- package/dist/packages/bunshot-auth/src/infra/signing.d.ts +7 -0
- package/dist/packages/bunshot-auth/src/infra/signing.js +8 -0
- package/dist/packages/bunshot-auth/src/lib/accountLockout.d.ts +34 -0
- package/dist/packages/bunshot-auth/src/lib/accountLockout.js +244 -0
- package/dist/packages/bunshot-auth/src/lib/adapterTiers.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/lib/adapterTiers.js +1 -0
- package/dist/packages/bunshot-auth/src/lib/authAdapter.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/lib/authAdapter.js +1 -0
- package/dist/packages/bunshot-auth/src/lib/authContext.d.ts +15 -0
- package/dist/packages/bunshot-auth/src/lib/authContext.js +1 -0
- package/dist/packages/bunshot-auth/src/lib/authEventBus.d.ts +4 -0
- package/dist/packages/bunshot-auth/src/lib/authEventBus.js +15 -0
- package/dist/packages/bunshot-auth/src/lib/authRateLimit.d.ts +28 -0
- package/dist/packages/bunshot-auth/src/lib/authRateLimit.js +205 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/breachedPassword.d.ts +8 -2
- package/dist/{lib → packages/bunshot-auth/src/lib}/breachedPassword.js +22 -9
- package/dist/packages/bunshot-auth/src/lib/cache.d.ts +12 -0
- package/dist/packages/bunshot-auth/src/lib/cache.js +120 -0
- package/dist/packages/bunshot-auth/src/lib/clientIp.d.ts +4 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/clientIp.js +14 -7
- package/dist/packages/bunshot-auth/src/lib/cookieOptions.d.ts +27 -0
- package/dist/packages/bunshot-auth/src/lib/cookieOptions.js +33 -0
- package/dist/packages/bunshot-auth/src/lib/credentialStuffing.d.ts +40 -0
- package/dist/packages/bunshot-auth/src/lib/credentialStuffing.js +221 -0
- package/dist/packages/bunshot-auth/src/lib/deletionCancelToken.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/lib/deletionCancelToken.js +148 -0
- package/dist/packages/bunshot-auth/src/lib/emailTemplates.d.ts +23 -0
- package/dist/packages/bunshot-auth/src/lib/emailTemplates.js +265 -0
- package/dist/packages/bunshot-auth/src/lib/emailVerification.d.ts +30 -0
- package/dist/packages/bunshot-auth/src/lib/emailVerification.js +200 -0
- package/dist/packages/bunshot-auth/src/lib/env.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/lib/env.js +3 -0
- package/dist/packages/bunshot-auth/src/lib/fingerprint.js +36 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/groups.d.ts +15 -16
- package/dist/{lib → packages/bunshot-auth/src/lib}/groups.js +22 -34
- package/dist/packages/bunshot-auth/src/lib/jwks.d.ts +28 -0
- package/dist/packages/bunshot-auth/src/lib/jwks.js +79 -0
- package/dist/packages/bunshot-auth/src/lib/jwt.d.ts +12 -0
- package/dist/packages/bunshot-auth/src/lib/jwt.js +86 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/logger.js +3 -3
- package/dist/{lib → packages/bunshot-auth/src/lib}/m2m.d.ts +5 -4
- package/dist/{lib → packages/bunshot-auth/src/lib}/m2m.js +6 -10
- package/dist/packages/bunshot-auth/src/lib/magicLink.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/lib/magicLink.js +145 -0
- package/dist/packages/bunshot-auth/src/lib/mfaChallenge.d.ts +60 -0
- package/dist/packages/bunshot-auth/src/lib/mfaChallenge.js +419 -0
- package/dist/packages/bunshot-auth/src/lib/oauth.d.ts +82 -0
- package/dist/packages/bunshot-auth/src/lib/oauth.js +177 -0
- package/dist/packages/bunshot-auth/src/lib/oauthCode.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/lib/oauthCode.js +182 -0
- package/dist/packages/bunshot-auth/src/lib/oauthReauth.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/lib/oauthReauth.js +255 -0
- package/dist/packages/bunshot-auth/src/lib/organization.d.ts +66 -0
- package/dist/packages/bunshot-auth/src/lib/organization.js +225 -0
- package/dist/packages/bunshot-auth/src/lib/passwordHistory.d.ts +12 -0
- package/dist/packages/bunshot-auth/src/lib/passwordHistory.js +31 -0
- package/dist/packages/bunshot-auth/src/lib/resetPassword.d.ts +20 -0
- package/dist/packages/bunshot-auth/src/lib/resetPassword.js +148 -0
- package/dist/packages/bunshot-auth/src/lib/roles.d.ts +9 -0
- package/dist/packages/bunshot-auth/src/lib/roles.js +93 -0
- package/dist/packages/bunshot-auth/src/lib/saml.d.ts +29 -0
- package/dist/packages/bunshot-auth/src/lib/saml.js +73 -0
- package/dist/packages/bunshot-auth/src/lib/samlRequestId.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/lib/samlRequestId.js +129 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/scim.d.ts +7 -7
- package/dist/{lib → packages/bunshot-auth/src/lib}/scim.js +15 -13
- package/dist/packages/bunshot-auth/src/lib/securityEventWiring.d.ts +22 -0
- package/dist/packages/bunshot-auth/src/lib/securityEventWiring.js +65 -0
- package/dist/packages/bunshot-auth/src/lib/session.d.ts +45 -0
- package/dist/packages/bunshot-auth/src/lib/session.js +1211 -0
- package/dist/packages/bunshot-auth/src/lib/storeInfra.d.ts +26 -0
- package/dist/packages/bunshot-auth/src/lib/storeInfra.js +18 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/suspension.d.ts +3 -2
- package/dist/{lib → packages/bunshot-auth/src/lib}/suspension.js +2 -5
- package/dist/packages/bunshot-auth/src/lib/validateAdapter.d.ts +16 -0
- package/dist/packages/bunshot-auth/src/lib/validateAdapter.js +161 -0
- package/dist/packages/bunshot-auth/src/middleware/bearerAuth.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/middleware/bearerAuth.js +58 -0
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/csrf.d.ts +5 -4
- package/dist/packages/bunshot-auth/src/middleware/csrf.js +138 -0
- package/dist/packages/bunshot-auth/src/middleware/identify.d.ts +4 -0
- package/dist/packages/bunshot-auth/src/middleware/identify.js +124 -0
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.js +10 -8
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.js +20 -16
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireScope.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireScope.js +6 -6
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireStepUp.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireStepUp.js +8 -7
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.js +7 -6
- package/dist/packages/bunshot-auth/src/middleware/scimAuth.d.ts +8 -0
- package/dist/packages/bunshot-auth/src/middleware/scimAuth.js +29 -0
- package/dist/packages/bunshot-auth/src/middleware/userAuth.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/middleware/userAuth.js +6 -0
- package/dist/{models → packages/bunshot-auth/src/models}/AuthUser.d.ts +12 -8
- package/dist/packages/bunshot-auth/src/models/AuthUser.js +53 -0
- package/dist/packages/bunshot-auth/src/models/Group.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/models/Group.js +22 -0
- package/dist/{models → packages/bunshot-auth/src/models}/GroupMembership.d.ts +6 -8
- package/dist/packages/bunshot-auth/src/models/GroupMembership.js +19 -0
- package/dist/{models → packages/bunshot-auth/src/models}/M2MClient.d.ts +1 -1
- package/dist/{models → packages/bunshot-auth/src/models}/M2MClient.js +5 -5
- package/dist/packages/bunshot-auth/src/models/TenantRole.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/models/TenantRole.js +17 -0
- package/dist/packages/bunshot-auth/src/plugin.d.ts +4 -0
- package/dist/packages/bunshot-auth/src/plugin.js +274 -0
- package/dist/packages/bunshot-auth/src/routes/auth.d.ts +15 -0
- package/dist/packages/bunshot-auth/src/routes/auth.js +1624 -0
- package/dist/packages/bunshot-auth/src/routes/groups.d.ts +4 -0
- package/dist/packages/bunshot-auth/src/routes/groups.js +481 -0
- package/dist/packages/bunshot-auth/src/routes/m2m.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/routes/m2m.js +145 -0
- package/dist/packages/bunshot-auth/src/routes/mfa.d.ts +6 -0
- package/dist/packages/bunshot-auth/src/routes/mfa.js +991 -0
- package/dist/packages/bunshot-auth/src/routes/oauth.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/routes/oauth.js +1727 -0
- package/dist/packages/bunshot-auth/src/routes/oidc.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/routes/oidc.js +84 -0
- package/dist/packages/bunshot-auth/src/routes/organizations.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/routes/organizations.js +741 -0
- package/dist/packages/bunshot-auth/src/routes/passkey.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/routes/passkey.js +199 -0
- package/dist/packages/bunshot-auth/src/routes/saml.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/routes/saml.js +226 -0
- package/dist/packages/bunshot-auth/src/routes/scim.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/routes/scim.js +588 -0
- package/dist/packages/bunshot-auth/src/runtime.d.ts +52 -0
- package/dist/packages/bunshot-auth/src/runtime.js +11 -0
- package/dist/{schemas → packages/bunshot-auth/src/schemas}/auth.d.ts +4 -5
- package/dist/packages/bunshot-auth/src/schemas/auth.js +24 -0
- package/dist/packages/bunshot-auth/src/schemas/error.d.ts +10 -0
- package/dist/packages/bunshot-auth/src/schemas/error.js +10 -0
- package/dist/packages/bunshot-auth/src/schemas/success.d.ts +10 -0
- package/dist/packages/bunshot-auth/src/schemas/success.js +10 -0
- package/dist/packages/bunshot-auth/src/services/auth.d.ts +39 -0
- package/dist/packages/bunshot-auth/src/services/auth.js +378 -0
- package/dist/{services → packages/bunshot-auth/src/services}/mfa.d.ts +41 -17
- package/dist/{services → packages/bunshot-auth/src/services}/mfa.js +259 -183
- package/dist/packages/bunshot-auth/src/testing.d.ts +31 -0
- package/dist/packages/bunshot-auth/src/testing.js +23 -0
- package/dist/packages/bunshot-auth/src/types/adapter.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/types/adapter.js +1 -0
- package/dist/packages/bunshot-auth/src/types/config.d.ts +152 -0
- package/dist/packages/bunshot-auth/src/types/config.js +179 -0
- package/dist/{routes → packages/bunshot-auth/src/types}/groups.d.ts +2 -3
- package/dist/packages/bunshot-auth/src/types/groups.js +1 -0
- package/dist/packages/bunshot-auth/src/types/oauthCode.d.ts +6 -0
- package/dist/packages/bunshot-auth/src/types/oauthCode.js +1 -0
- package/dist/packages/bunshot-auth/src/types/oauthReauth.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/types/oauthReauth.js +1 -0
- package/dist/packages/bunshot-auth/src/types/redis.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/types/redis.js +1 -0
- package/dist/packages/bunshot-auth/src/types/saml.d.ts +10 -0
- package/dist/packages/bunshot-auth/src/types/saml.js +1 -0
- package/dist/packages/bunshot-auth/src/types/session.d.ts +18 -0
- package/dist/packages/bunshot-auth/src/types/session.js +1 -0
- package/dist/packages/bunshot-auth/src/types/store.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/types/store.js +1 -0
- package/dist/packages/bunshot-core/src/adminProvider.d.ts +95 -0
- package/dist/packages/bunshot-core/src/adminProvider.js +1 -0
- package/dist/packages/bunshot-core/src/auditLog.d.ts +34 -0
- package/dist/packages/bunshot-core/src/auditLog.js +1 -0
- package/dist/packages/bunshot-core/src/auth-adapter.d.ts +227 -0
- package/dist/packages/bunshot-core/src/auth-adapter.js +4 -0
- package/dist/packages/bunshot-core/src/authVariables.d.ts +14 -0
- package/dist/packages/bunshot-core/src/authVariables.js +4 -0
- package/dist/packages/bunshot-core/src/cache.d.ts +12 -0
- package/dist/packages/bunshot-core/src/cache.js +21 -0
- package/dist/{lib → packages/bunshot-core/src}/captcha.d.ts +1 -10
- package/dist/packages/bunshot-core/src/captcha.js +1 -0
- package/dist/packages/bunshot-core/src/clearRegistry.d.ts +6 -0
- package/dist/packages/bunshot-core/src/clearRegistry.js +17 -0
- package/dist/packages/bunshot-core/src/clientIp.d.ts +3 -0
- package/dist/packages/bunshot-core/src/clientIp.js +45 -0
- package/dist/packages/bunshot-core/src/configLock.d.ts +4 -0
- package/dist/packages/bunshot-core/src/configLock.js +7 -0
- package/dist/packages/bunshot-core/src/configValidation.d.ts +22 -0
- package/dist/packages/bunshot-core/src/configValidation.js +39 -0
- package/dist/packages/bunshot-core/src/constants.js +10 -0
- package/dist/packages/bunshot-core/src/context/bunshotContext.d.ts +232 -0
- package/dist/packages/bunshot-core/src/context/bunshotContext.js +1 -0
- package/dist/packages/bunshot-core/src/context/contextAccess.d.ts +3 -0
- package/dist/packages/bunshot-core/src/context/contextAccess.js +16 -0
- package/dist/packages/bunshot-core/src/context/contextStore.d.ts +16 -0
- package/dist/packages/bunshot-core/src/context/contextStore.js +31 -0
- package/dist/packages/bunshot-core/src/context/frameworkConfig.d.ts +38 -0
- package/dist/packages/bunshot-core/src/context/frameworkConfig.js +1 -0
- package/dist/packages/bunshot-core/src/context/index.d.ts +4 -0
- package/dist/packages/bunshot-core/src/context/index.js +2 -0
- package/dist/packages/bunshot-core/src/context.d.ts +40 -0
- package/dist/packages/bunshot-core/src/context.js +35 -0
- package/dist/packages/bunshot-core/src/coreContracts.d.ts +47 -0
- package/dist/packages/bunshot-core/src/coreContracts.js +1 -0
- package/dist/packages/bunshot-core/src/coreRegistrar.d.ts +6 -0
- package/dist/packages/bunshot-core/src/coreRegistrar.js +42 -0
- package/dist/{lib → packages/bunshot-core/src}/createRoute.d.ts +4 -30
- package/dist/{lib → packages/bunshot-core/src}/createRoute.js +39 -88
- package/dist/packages/bunshot-core/src/cronRegistry.d.ts +11 -0
- package/dist/packages/bunshot-core/src/cronRegistry.js +1 -0
- package/dist/packages/bunshot-core/src/crypto.d.ts +43 -0
- package/dist/packages/bunshot-core/src/crypto.js +74 -0
- package/dist/packages/bunshot-core/src/csrf.d.ts +8 -0
- package/dist/packages/bunshot-core/src/csrf.js +1 -0
- package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.d.ts +7 -0
- package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.js +19 -0
- package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.d.ts +6 -0
- package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.js +40 -0
- package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.d.ts +6 -0
- package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.js +24 -0
- package/dist/packages/bunshot-core/src/emailTemplates.d.ts +5 -0
- package/dist/packages/bunshot-core/src/emailTemplates.js +10 -0
- package/dist/{lib/HttpError.d.ts → packages/bunshot-core/src/errors.d.ts} +4 -1
- package/dist/{lib/HttpError.js → packages/bunshot-core/src/errors.js} +7 -1
- package/dist/packages/bunshot-core/src/eventBus.d.ts +270 -0
- package/dist/packages/bunshot-core/src/eventBus.js +143 -0
- package/dist/packages/bunshot-core/src/idempotency.d.ts +18 -0
- package/dist/packages/bunshot-core/src/idempotency.js +1 -0
- package/dist/packages/bunshot-core/src/index.d.ts +60 -0
- package/dist/packages/bunshot-core/src/index.js +34 -0
- package/dist/packages/bunshot-core/src/mail.d.ts +14 -0
- package/dist/packages/bunshot-core/src/mail.js +8 -0
- package/dist/packages/bunshot-core/src/memoryEviction.d.ts +24 -0
- package/dist/packages/bunshot-core/src/memoryEviction.js +52 -0
- package/dist/packages/bunshot-core/src/pagination.d.ts +45 -0
- package/dist/packages/bunshot-core/src/pagination.js +61 -0
- package/dist/packages/bunshot-core/src/permissions.d.ts +64 -0
- package/dist/packages/bunshot-core/src/permissions.js +27 -0
- package/dist/packages/bunshot-core/src/plugin.d.ts +44 -0
- package/dist/packages/bunshot-core/src/plugin.js +1 -0
- package/dist/packages/bunshot-core/src/rateLimit.d.ts +5 -0
- package/dist/packages/bunshot-core/src/rateLimit.js +18 -0
- package/dist/packages/bunshot-core/src/redis.d.ts +21 -0
- package/dist/packages/bunshot-core/src/redis.js +1 -0
- package/dist/packages/bunshot-core/src/routeAuth.d.ts +5 -0
- package/dist/packages/bunshot-core/src/routeAuth.js +11 -0
- package/dist/packages/bunshot-core/src/routeOverrides.d.ts +24 -0
- package/dist/packages/bunshot-core/src/routeOverrides.js +25 -0
- package/dist/packages/bunshot-core/src/routerAdapter.d.ts +6 -0
- package/dist/packages/bunshot-core/src/routerAdapter.js +56 -0
- package/dist/packages/bunshot-core/src/secrets.d.ts +48 -0
- package/dist/packages/bunshot-core/src/secrets.js +8 -0
- package/dist/packages/bunshot-core/src/signing.d.ts +41 -0
- package/dist/packages/bunshot-core/src/signing.js +1 -0
- package/dist/packages/bunshot-core/src/sse.d.ts +36 -0
- package/dist/packages/bunshot-core/src/sse.js +1 -0
- package/dist/packages/bunshot-core/src/storageAdapter.js +1 -0
- package/dist/packages/bunshot-core/src/storeInfra.d.ts +44 -0
- package/dist/packages/bunshot-core/src/storeInfra.js +18 -0
- package/dist/packages/bunshot-core/src/storeType.d.ts +7 -0
- package/dist/packages/bunshot-core/src/storeType.js +1 -0
- package/dist/packages/bunshot-core/src/testing.d.ts +1 -0
- package/dist/packages/bunshot-core/src/testing.js +1 -0
- package/dist/packages/bunshot-core/src/uploadRegistry.d.ts +23 -0
- package/dist/packages/bunshot-core/src/uploadRegistry.js +4 -0
- package/dist/packages/bunshot-core/src/userResolver.d.ts +5 -0
- package/dist/packages/bunshot-core/src/userResolver.js +14 -0
- package/dist/packages/bunshot-core/src/wsMessages.d.ts +42 -0
- package/dist/packages/bunshot-core/src/wsMessages.js +4 -0
- package/dist/packages/bunshot-permissions/src/adapters/memory.d.ts +7 -0
- package/dist/packages/bunshot-permissions/src/adapters/memory.js +73 -0
- package/dist/packages/bunshot-permissions/src/index.d.ts +10 -0
- package/dist/packages/bunshot-permissions/src/index.js +5 -0
- package/dist/packages/bunshot-permissions/src/lib/bootstrap.d.ts +7 -0
- package/dist/packages/bunshot-permissions/src/lib/bootstrap.js +12 -0
- package/dist/packages/bunshot-permissions/src/lib/evaluator.d.ts +10 -0
- package/dist/packages/bunshot-permissions/src/lib/evaluator.js +165 -0
- package/dist/packages/bunshot-permissions/src/lib/registry.d.ts +2 -0
- package/dist/packages/bunshot-permissions/src/lib/registry.js +31 -0
- package/dist/packages/bunshot-permissions/src/lib/validation.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/lib/validation.js +1 -0
- package/dist/packages/bunshot-permissions/src/types/adapter.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/types/adapter.js +1 -0
- package/dist/packages/bunshot-permissions/src/types/evaluator.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/types/evaluator.js +1 -0
- package/dist/packages/bunshot-permissions/src/types/models.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/types/models.js +1 -0
- package/dist/packages/bunshot-permissions/src/types/registry.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/types/registry.js +1 -0
- package/dist/packages/bunshot-postgres/src/adapter.d.ts +6 -0
- package/dist/packages/bunshot-postgres/src/adapter.js +794 -0
- package/dist/packages/bunshot-postgres/src/connection.d.ts +15 -0
- package/dist/packages/bunshot-postgres/src/connection.js +16 -0
- package/dist/packages/bunshot-postgres/src/index.d.ts +4 -0
- package/dist/packages/bunshot-postgres/src/index.js +2 -0
- package/dist/packages/bunshot-postgres/src/schema.d.ts +997 -0
- package/dist/packages/bunshot-postgres/src/schema.js +105 -0
- package/dist/src/app.d.ts +230 -0
- package/dist/src/app.js +182 -0
- package/dist/src/cli/commands/init.d.ts +10 -0
- package/dist/src/cli/commands/init.js +709 -0
- package/dist/src/cli/index.d.ts +1 -0
- package/dist/src/cli/index.js +3 -0
- package/dist/src/entrypoints/mongo.d.ts +6 -0
- package/dist/src/entrypoints/mongo.js +4 -0
- package/dist/src/entrypoints/queue.d.ts +2 -0
- package/dist/src/entrypoints/queue.js +1 -0
- package/dist/src/entrypoints/redis.d.ts +1 -0
- package/dist/src/entrypoints/redis.js +1 -0
- package/dist/{adapters → src/framework/adapters}/localStorage.d.ts +1 -1
- package/dist/{adapters → src/framework/adapters}/localStorage.js +10 -10
- package/dist/src/framework/adapters/memoryStorage.d.ts +2 -0
- package/dist/src/framework/adapters/memoryStorage.js +45 -0
- package/dist/{adapters → src/framework/adapters}/s3Storage.d.ts +1 -1
- package/dist/{adapters → src/framework/adapters}/s3Storage.js +12 -12
- package/dist/src/framework/admin/bunshotAccess.d.ts +2 -0
- package/dist/src/framework/admin/bunshotAccess.js +23 -0
- package/dist/src/framework/admin/bunshotUsers.d.ts +2 -0
- package/dist/src/framework/admin/bunshotUsers.js +103 -0
- package/dist/src/framework/admin/index.d.ts +7 -0
- package/dist/src/framework/admin/index.js +21 -0
- package/dist/src/framework/boundaryAdapters/cacheFactories.d.ts +13 -0
- package/dist/src/framework/boundaryAdapters/cacheFactories.js +86 -0
- package/dist/src/framework/boundaryAdapters/index.d.ts +2 -0
- package/dist/src/framework/boundaryAdapters/index.js +1 -0
- package/dist/src/framework/boundaryAdapters.d.ts +17 -0
- package/dist/src/framework/boundaryAdapters.js +62 -0
- package/dist/src/framework/buildContext.d.ts +33 -0
- package/dist/src/framework/buildContext.js +119 -0
- package/dist/src/framework/config/schema.d.ts +447 -0
- package/dist/src/framework/config/schema.js +528 -0
- package/dist/src/framework/createInfrastructure.d.ts +76 -0
- package/dist/src/framework/createInfrastructure.js +221 -0
- package/dist/src/framework/lib/auditLog.d.ts +23 -0
- package/dist/src/framework/lib/auditLog.js +416 -0
- package/dist/src/framework/lib/captcha.d.ts +11 -0
- package/dist/{lib → src/framework/lib}/captcha.js +13 -10
- package/dist/{lib → src/framework/lib}/createDtoMapper.js +4 -4
- package/dist/src/framework/lib/createRoute.d.ts +1 -0
- package/dist/src/framework/lib/createRoute.js +2 -0
- package/dist/{lib → src/framework/lib}/idempotency.d.ts +2 -6
- package/dist/src/framework/lib/idempotency.js +74 -0
- package/dist/src/framework/lib/logger.d.ts +3 -0
- package/dist/src/framework/lib/logger.js +14 -0
- package/dist/src/framework/lib/metrics.d.ts +34 -0
- package/dist/{lib → src/framework/lib}/metrics.js +49 -57
- package/dist/src/framework/lib/pagination.d.ts +42 -0
- package/dist/src/framework/lib/pagination.js +51 -0
- package/dist/src/framework/lib/redisTransport.d.ts +38 -0
- package/dist/src/framework/lib/redisTransport.js +107 -0
- package/dist/src/framework/lib/resolveUserId.d.ts +2 -0
- package/dist/src/framework/lib/resolveUserId.js +5 -0
- package/dist/src/framework/lib/sseCollision.d.ts +6 -0
- package/dist/src/framework/lib/sseCollision.js +26 -0
- package/dist/src/framework/lib/storageAdapter.d.ts +1 -0
- package/dist/src/framework/lib/storageAdapter.js +1 -0
- package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.js +4 -4
- package/dist/src/framework/lib/tenant.d.ts +21 -0
- package/dist/src/framework/lib/tenant.js +70 -0
- package/dist/{lib → src/framework/lib}/upload.d.ts +11 -10
- package/dist/src/framework/lib/upload.js +132 -0
- package/dist/src/framework/lib/uploadRegistry.d.ts +23 -0
- package/dist/src/framework/lib/uploadRegistry.js +34 -0
- package/dist/{lib → src/framework/lib}/validate.d.ts +1 -1
- package/dist/{lib → src/framework/lib}/validate.js +2 -2
- package/dist/src/framework/lib/ws.d.ts +19 -0
- package/dist/src/framework/lib/ws.js +130 -0
- package/dist/src/framework/lib/wsHeartbeat.d.ts +12 -0
- package/dist/src/framework/lib/wsHeartbeat.js +53 -0
- package/dist/src/framework/lib/wsMessages.d.ts +25 -0
- package/dist/src/framework/lib/wsMessages.js +45 -0
- package/dist/src/framework/lib/wsNamespace.d.ts +17 -0
- package/dist/src/framework/lib/wsNamespace.js +19 -0
- package/dist/src/framework/lib/wsPresence.d.ts +17 -0
- package/dist/src/framework/lib/wsPresence.js +84 -0
- package/dist/src/framework/lib/wsTransport.d.ts +38 -0
- package/dist/src/framework/lib/wsTransport.js +9 -0
- package/dist/{lib → src/framework/lib}/zodToMongoose.d.ts +1 -1
- package/dist/{lib → src/framework/lib}/zodToMongoose.js +11 -11
- package/dist/{middleware → src/framework/middleware}/auditLog.d.ts +4 -3
- package/dist/src/framework/middleware/auditLog.js +42 -0
- package/dist/{middleware → src/framework/middleware}/botProtection.d.ts +2 -2
- package/dist/{middleware → src/framework/middleware}/botProtection.js +8 -9
- package/dist/src/framework/middleware/cacheResponse.d.ts +35 -0
- package/dist/src/framework/middleware/cacheResponse.js +126 -0
- package/dist/{middleware → src/framework/middleware}/captcha.d.ts +2 -3
- package/dist/src/framework/middleware/captcha.js +37 -0
- package/dist/{middleware → src/framework/middleware}/errorHandler.d.ts +1 -1
- package/dist/{middleware → src/framework/middleware}/errorHandler.js +2 -2
- package/dist/src/framework/middleware/index.js +1 -0
- package/dist/{middleware → src/framework/middleware}/logger.d.ts +1 -1
- package/dist/src/framework/middleware/metrics.d.ts +12 -0
- package/dist/src/framework/middleware/metrics.js +26 -0
- package/dist/{middleware → src/framework/middleware}/rateLimit.d.ts +2 -2
- package/dist/src/framework/middleware/rateLimit.js +22 -0
- package/dist/src/framework/middleware/requestId.d.ts +3 -0
- package/dist/{middleware → src/framework/middleware}/requestId.js +2 -2
- package/dist/{middleware → src/framework/middleware}/requestLogger.d.ts +3 -3
- package/dist/{middleware → src/framework/middleware}/requestLogger.js +17 -12
- package/dist/{middleware → src/framework/middleware}/requestSigning.d.ts +2 -2
- package/dist/{middleware → src/framework/middleware}/requestSigning.js +18 -20
- package/dist/src/framework/middleware/tenant.d.ts +14 -0
- package/dist/{middleware → src/framework/middleware}/tenant.js +31 -27
- package/dist/src/framework/middleware/upload.d.ts +5 -0
- package/dist/{middleware → src/framework/middleware}/upload.js +4 -4
- package/dist/{middleware → src/framework/middleware}/webhookAuth.d.ts +3 -3
- package/dist/{middleware → src/framework/middleware}/webhookAuth.js +11 -12
- package/dist/src/framework/models/AuditLog.d.ts +21 -0
- package/dist/src/framework/models/AuditLog.js +31 -0
- package/dist/src/framework/mountMiddleware.d.ts +91 -0
- package/dist/src/framework/mountMiddleware.js +128 -0
- package/dist/src/framework/mountOptionalEndpoints.d.ts +103 -0
- package/dist/src/framework/mountOptionalEndpoints.js +47 -0
- package/dist/src/framework/mountRoutes.d.ts +21 -0
- package/dist/src/framework/mountRoutes.js +144 -0
- package/dist/src/framework/persistence/cronRegistry.d.ts +28 -0
- package/dist/src/framework/persistence/cronRegistry.js +139 -0
- package/dist/src/framework/persistence/idempotency.d.ts +26 -0
- package/dist/src/framework/persistence/idempotency.js +178 -0
- package/dist/src/framework/persistence/index.d.ts +6 -0
- package/dist/src/framework/persistence/index.js +8 -0
- package/dist/src/framework/persistence/storeInfra.d.ts +9 -0
- package/dist/src/framework/persistence/storeInfra.js +1 -0
- package/dist/src/framework/persistence/uploadRegistry.d.ts +35 -0
- package/dist/src/framework/persistence/uploadRegistry.js +235 -0
- package/dist/src/framework/persistence/wsMessages.d.ts +22 -0
- package/dist/src/framework/persistence/wsMessages.js +296 -0
- package/dist/src/framework/preloadSchemas.d.ts +24 -0
- package/dist/src/framework/preloadSchemas.js +42 -0
- package/dist/src/framework/registerBoundaryAdapters.d.ts +23 -0
- package/dist/src/framework/registerBoundaryAdapters.js +46 -0
- package/dist/src/framework/routes/admin.d.ts +9 -0
- package/dist/src/framework/routes/admin.js +361 -0
- package/dist/src/framework/routes/health.d.ts +1 -0
- package/dist/src/framework/routes/health.js +21 -0
- package/dist/src/framework/routes/home.d.ts +1 -0
- package/dist/src/framework/routes/home.js +18 -0
- package/dist/src/framework/routes/jobs.d.ts +3 -0
- package/dist/{routes → src/framework/routes}/jobs.js +128 -103
- package/dist/src/framework/routes/metrics.d.ts +10 -0
- package/dist/src/framework/routes/metrics.js +57 -0
- package/dist/{routes → src/framework/routes}/uploads.d.ts +3 -3
- package/dist/src/framework/routes/uploads.js +262 -0
- package/dist/src/framework/runPluginLifecycle.d.ts +27 -0
- package/dist/src/framework/runPluginLifecycle.js +121 -0
- package/dist/src/framework/secrets/frameworkSecretSchema.d.ts +58 -0
- package/dist/src/framework/secrets/frameworkSecretSchema.js +20 -0
- package/dist/src/framework/secrets/index.d.ts +9 -0
- package/dist/src/framework/secrets/index.js +7 -0
- package/dist/src/framework/secrets/providers/envProvider.d.ts +15 -0
- package/dist/src/framework/secrets/providers/envProvider.js +18 -0
- package/dist/src/framework/secrets/providers/fileProvider.d.ts +8 -0
- package/dist/src/framework/secrets/providers/fileProvider.js +82 -0
- package/dist/src/framework/secrets/providers/ssmProvider.d.ts +20 -0
- package/dist/src/framework/secrets/providers/ssmProvider.js +127 -0
- package/dist/src/framework/secrets/resolveSecretBundle.d.ts +53 -0
- package/dist/src/framework/secrets/resolveSecretBundle.js +84 -0
- package/dist/src/framework/secrets/resolveSecrets.d.ts +18 -0
- package/dist/src/framework/secrets/resolveSecrets.js +34 -0
- package/dist/src/framework/sse/index.d.ts +21 -0
- package/dist/src/framework/sse/index.js +109 -0
- package/dist/src/framework/ws/index.d.ts +11 -0
- package/dist/src/framework/ws/index.js +8 -0
- package/dist/src/index.d.ts +87 -0
- package/dist/src/index.js +58 -0
- package/dist/src/lib/appConfig.d.ts +7 -0
- package/dist/src/lib/appConfig.js +27 -0
- package/dist/src/lib/appMeta.d.ts +7 -0
- package/dist/src/lib/appMeta.js +3 -0
- package/dist/src/lib/authConfig.d.ts +532 -0
- package/dist/{lib/appConfig.js → src/lib/authConfig.js} +75 -17
- package/dist/{lib → src/lib}/context.d.ts +6 -12
- package/dist/{lib → src/lib}/context.js +5 -5
- package/dist/src/lib/logger.d.ts +1 -0
- package/dist/src/lib/logger.js +1 -0
- package/dist/src/lib/mongo.d.ts +58 -0
- package/dist/src/lib/mongo.js +96 -0
- package/dist/src/lib/queue.d.ts +72 -0
- package/dist/src/lib/queue.js +152 -0
- package/dist/src/lib/redis.d.ts +28 -0
- package/dist/src/lib/redis.js +72 -0
- package/dist/{lib → src/lib}/signing.d.ts +2 -2
- package/dist/src/lib/signing.js +210 -0
- package/dist/src/lib/signingConfig.d.ts +40 -0
- package/dist/src/lib/signingConfig.js +28 -0
- package/dist/src/server.d.ts +146 -0
- package/dist/src/server.js +469 -0
- package/dist/src/shared/lib/HttpError.d.ts +1 -0
- package/dist/src/shared/lib/HttpError.js +2 -0
- package/dist/src/shared/lib/constants.d.ts +10 -0
- package/dist/src/shared/lib/crypto.d.ts +43 -0
- package/dist/src/shared/lib/crypto.js +74 -0
- package/dist/src/shared/lib/signing.d.ts +52 -0
- package/dist/{lib → src/shared/lib}/signing.js +35 -8
- package/dist/src/testing.d.ts +34 -0
- package/dist/src/testing.js +93 -0
- package/package.json +60 -24
- package/dist/adapters/memoryAuth.d.ts +0 -52
- package/dist/adapters/memoryAuth.js +0 -749
- package/dist/adapters/memoryStorage.d.ts +0 -3
- package/dist/adapters/memoryStorage.js +0 -44
- package/dist/adapters/mongoAuth.d.ts +0 -2
- package/dist/adapters/mongoAuth.js +0 -403
- package/dist/adapters/sqliteAuth.d.ts +0 -72
- package/dist/adapters/sqliteAuth.js +0 -858
- package/dist/app.d.ts +0 -559
- package/dist/app.js +0 -651
- package/dist/entrypoints/mongo.d.ts +0 -5
- package/dist/entrypoints/mongo.js +0 -4
- package/dist/entrypoints/queue.d.ts +0 -2
- package/dist/entrypoints/queue.js +0 -1
- package/dist/entrypoints/redis.d.ts +0 -1
- package/dist/entrypoints/redis.js +0 -1
- package/dist/index.d.ts +0 -117
- package/dist/index.js +0 -88
- package/dist/lib/appConfig.d.ts +0 -275
- package/dist/lib/auditLog.d.ts +0 -58
- package/dist/lib/auditLog.js +0 -218
- package/dist/lib/authAdapter.d.ts +0 -246
- package/dist/lib/authAdapter.js +0 -7
- package/dist/lib/authRateLimit.d.ts +0 -13
- package/dist/lib/authRateLimit.js +0 -117
- package/dist/lib/clientIp.d.ts +0 -14
- package/dist/lib/credentialStuffing.d.ts +0 -31
- package/dist/lib/credentialStuffing.js +0 -77
- package/dist/lib/crypto.d.ts +0 -11
- package/dist/lib/crypto.js +0 -22
- package/dist/lib/deletionCancelToken.d.ts +0 -12
- package/dist/lib/deletionCancelToken.js +0 -88
- package/dist/lib/emailVerification.d.ts +0 -19
- package/dist/lib/emailVerification.js +0 -129
- package/dist/lib/fingerprint.js +0 -36
- package/dist/lib/idempotency.js +0 -182
- package/dist/lib/jwks.d.ts +0 -25
- package/dist/lib/jwks.js +0 -51
- package/dist/lib/jwt.d.ts +0 -15
- package/dist/lib/jwt.js +0 -111
- package/dist/lib/metrics.d.ts +0 -14
- package/dist/lib/mfaChallenge.d.ts +0 -55
- package/dist/lib/mfaChallenge.js +0 -398
- package/dist/lib/mongo.d.ts +0 -39
- package/dist/lib/mongo.js +0 -124
- package/dist/lib/oauth.d.ts +0 -40
- package/dist/lib/oauth.js +0 -101
- package/dist/lib/oauthCode.d.ts +0 -15
- package/dist/lib/oauthCode.js +0 -95
- package/dist/lib/pagination.d.ts +0 -119
- package/dist/lib/pagination.js +0 -166
- package/dist/lib/queue.d.ts +0 -37
- package/dist/lib/queue.js +0 -117
- package/dist/lib/redis.d.ts +0 -9
- package/dist/lib/redis.js +0 -61
- package/dist/lib/resetPassword.d.ts +0 -12
- package/dist/lib/resetPassword.js +0 -93
- package/dist/lib/roles.d.ts +0 -7
- package/dist/lib/roles.js +0 -49
- package/dist/lib/saml.d.ts +0 -25
- package/dist/lib/saml.js +0 -64
- package/dist/lib/securityEvents.d.ts +0 -28
- package/dist/lib/securityEvents.js +0 -26
- package/dist/lib/session.d.ts +0 -49
- package/dist/lib/session.js +0 -597
- package/dist/lib/tenant.d.ts +0 -15
- package/dist/lib/tenant.js +0 -65
- package/dist/lib/upload.js +0 -112
- package/dist/lib/uploadRegistry.d.ts +0 -18
- package/dist/lib/uploadRegistry.js +0 -83
- package/dist/lib/ws.d.ts +0 -22
- package/dist/lib/ws.js +0 -96
- package/dist/lib/wsHeartbeat.d.ts +0 -12
- package/dist/lib/wsHeartbeat.js +0 -57
- package/dist/lib/wsMessages.d.ts +0 -40
- package/dist/lib/wsMessages.js +0 -330
- package/dist/lib/wsPresence.d.ts +0 -25
- package/dist/lib/wsPresence.js +0 -99
- package/dist/middleware/auditLog.js +0 -39
- package/dist/middleware/bearerAuth.d.ts +0 -2
- package/dist/middleware/bearerAuth.js +0 -11
- package/dist/middleware/cacheResponse.d.ts +0 -15
- package/dist/middleware/cacheResponse.js +0 -178
- package/dist/middleware/captcha.js +0 -36
- package/dist/middleware/csrf.js +0 -129
- package/dist/middleware/identify.d.ts +0 -3
- package/dist/middleware/identify.js +0 -122
- package/dist/middleware/index.js +0 -1
- package/dist/middleware/metrics.d.ts +0 -9
- package/dist/middleware/metrics.js +0 -26
- package/dist/middleware/rateLimit.js +0 -22
- package/dist/middleware/requestId.d.ts +0 -3
- package/dist/middleware/scimAuth.d.ts +0 -8
- package/dist/middleware/scimAuth.js +0 -29
- package/dist/middleware/tenant.d.ts +0 -5
- package/dist/middleware/upload.d.ts +0 -5
- package/dist/middleware/userAuth.d.ts +0 -3
- package/dist/middleware/userAuth.js +0 -6
- package/dist/models/AuditLog.d.ts +0 -30
- package/dist/models/AuditLog.js +0 -39
- package/dist/models/AuthUser.js +0 -55
- package/dist/models/Group.d.ts +0 -21
- package/dist/models/Group.js +0 -28
- package/dist/models/GroupMembership.js +0 -25
- package/dist/models/TenantRole.d.ts +0 -15
- package/dist/models/TenantRole.js +0 -23
- package/dist/routes/auth.d.ts +0 -12
- package/dist/routes/auth.js +0 -744
- package/dist/routes/groups.js +0 -346
- package/dist/routes/health.d.ts +0 -1
- package/dist/routes/health.js +0 -22
- package/dist/routes/home.d.ts +0 -1
- package/dist/routes/home.js +0 -16
- package/dist/routes/jobs.d.ts +0 -2
- package/dist/routes/m2m.d.ts +0 -2
- package/dist/routes/m2m.js +0 -72
- package/dist/routes/metrics.d.ts +0 -8
- package/dist/routes/metrics.js +0 -55
- package/dist/routes/mfa.d.ts +0 -5
- package/dist/routes/mfa.js +0 -628
- package/dist/routes/oauth.d.ts +0 -2
- package/dist/routes/oauth.js +0 -520
- package/dist/routes/oidc.d.ts +0 -2
- package/dist/routes/oidc.js +0 -29
- package/dist/routes/passkey.d.ts +0 -1
- package/dist/routes/passkey.js +0 -157
- package/dist/routes/saml.d.ts +0 -2
- package/dist/routes/saml.js +0 -86
- package/dist/routes/scim.d.ts +0 -2
- package/dist/routes/scim.js +0 -255
- package/dist/routes/uploads.js +0 -227
- package/dist/schemas/auth.js +0 -30
- package/dist/server.d.ts +0 -57
- package/dist/server.js +0 -112
- package/dist/services/auth.d.ts +0 -29
- package/dist/services/auth.js +0 -238
- package/dist/ws/index.d.ts +0 -10
- package/dist/ws/index.js +0 -39
- package/docs/sections/adding-middleware/full.md +0 -35
- package/docs/sections/adding-models/full.md +0 -125
- package/docs/sections/adding-models/overview.md +0 -13
- package/docs/sections/adding-routes/full.md +0 -182
- package/docs/sections/adding-routes/overview.md +0 -23
- package/docs/sections/auth-flow/full.md +0 -790
- package/docs/sections/auth-flow/overview.md +0 -10
- package/docs/sections/auth-security-examples/full.md +0 -388
- package/docs/sections/authentication/full.md +0 -130
- package/docs/sections/authentication/overview.md +0 -5
- package/docs/sections/cli/full.md +0 -42
- package/docs/sections/configuration/full.md +0 -172
- package/docs/sections/configuration/overview.md +0 -18
- package/docs/sections/configuration-example/full.md +0 -117
- package/docs/sections/configuration-example/overview.md +0 -30
- package/docs/sections/documentation/full.md +0 -171
- package/docs/sections/environment-variables/full.md +0 -55
- package/docs/sections/exports/full.md +0 -123
- package/docs/sections/extending-context/full.md +0 -59
- package/docs/sections/header.md +0 -3
- package/docs/sections/installation/full.md +0 -6
- package/docs/sections/jobs/full.md +0 -140
- package/docs/sections/jobs/overview.md +0 -15
- package/docs/sections/logging/full.md +0 -83
- package/docs/sections/metrics/full.md +0 -131
- package/docs/sections/mongodb-connections/full.md +0 -45
- package/docs/sections/mongodb-connections/overview.md +0 -7
- package/docs/sections/multi-tenancy/full.md +0 -66
- package/docs/sections/multi-tenancy/overview.md +0 -15
- package/docs/sections/oauth/full.md +0 -189
- package/docs/sections/oauth/overview.md +0 -16
- package/docs/sections/package-development/full.md +0 -7
- package/docs/sections/pagination/full.md +0 -93
- package/docs/sections/passkey-login/full.md +0 -90
- package/docs/sections/passkey-login/overview.md +0 -1
- package/docs/sections/peer-dependencies/full.md +0 -47
- package/docs/sections/quick-start/full.md +0 -43
- package/docs/sections/response-caching/full.md +0 -117
- package/docs/sections/response-caching/overview.md +0 -13
- package/docs/sections/roles/full.md +0 -225
- package/docs/sections/roles/overview.md +0 -14
- package/docs/sections/running-without-redis/full.md +0 -16
- package/docs/sections/running-without-redis-or-mongodb/full.md +0 -60
- package/docs/sections/signing/full.md +0 -203
- package/docs/sections/stack/full.md +0 -10
- package/docs/sections/uploads/full.md +0 -208
- package/docs/sections/versioning/full.md +0 -85
- package/docs/sections/webhook-auth/full.md +0 -100
- package/docs/sections/websocket/full.md +0 -196
- package/docs/sections/websocket/overview.md +0 -5
- package/docs/sections/websocket-rooms/full.md +0 -102
- package/docs/sections/websocket-rooms/overview.md +0 -5
- /package/dist/{lib/storageAdapter.js → packages/bunshot-admin/src/types/env.js} +0 -0
- /package/dist/{lib → packages/bunshot-auth/src/lib}/fingerprint.d.ts +0 -0
- /package/dist/{lib → packages/bunshot-auth/src/lib}/logger.d.ts +0 -0
- /package/dist/{lib → packages/bunshot-core/src}/constants.d.ts +0 -0
- /package/dist/{lib → packages/bunshot-core/src}/storageAdapter.d.ts +0 -0
- /package/dist/{lib → src/framework/lib}/createDtoMapper.d.ts +0 -0
- /package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.d.ts +0 -0
- /package/dist/{middleware → src/framework/middleware}/cors.d.ts +0 -0
- /package/dist/{middleware → src/framework/middleware}/cors.js +0 -0
- /package/dist/{middleware → src/framework/middleware}/index.d.ts +0 -0
- /package/dist/{middleware → src/framework/middleware}/logger.js +0 -0
- /package/dist/{lib → src/shared/lib}/constants.js +0 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getUploadConfig, parseUpload } from '../lib/upload';
|
|
2
2
|
export const handleUpload = (opts) => {
|
|
3
3
|
return async (c, next) => {
|
|
4
|
-
const config = getUploadConfig();
|
|
4
|
+
const config = getUploadConfig(c.get('bunshotCtx'));
|
|
5
5
|
const merged = { ...config, ...opts };
|
|
6
6
|
const maxFileSize = merged.maxFileSize ?? 10 * 1024 * 1024;
|
|
7
7
|
const maxFiles = merged.maxFiles ?? 10;
|
|
8
8
|
// Content-Length pre-check to avoid Bun killing the connection
|
|
9
|
-
const contentLength = Number(c.req.header(
|
|
9
|
+
const contentLength = Number(c.req.header('content-length') ?? 0);
|
|
10
10
|
if (contentLength > 0 && contentLength > maxFileSize * maxFiles) {
|
|
11
11
|
return c.json({ error: `Request body too large. Maximum is ${maxFileSize * maxFiles} bytes` }, 413);
|
|
12
12
|
}
|
|
@@ -21,7 +21,7 @@ export const handleUpload = (opts) => {
|
|
|
21
21
|
return c.json({ error: err.message }, 413);
|
|
22
22
|
throw err;
|
|
23
23
|
}
|
|
24
|
-
c.set(
|
|
24
|
+
c.set('uploadResults', results);
|
|
25
25
|
await next();
|
|
26
26
|
};
|
|
27
27
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { AppEnv } from
|
|
1
|
+
import type { Context, MiddlewareHandler } from 'hono';
|
|
2
|
+
import type { AppEnv } from '../../../packages/bunshot-core/src/index.js';
|
|
3
3
|
export interface WebhookTimestampOptions {
|
|
4
4
|
/** Header name containing the Unix timestamp (seconds or ms). */
|
|
5
5
|
header: string;
|
|
@@ -18,7 +18,7 @@ export interface WebhookAuthOptions {
|
|
|
18
18
|
/** Header that carries the signature. Default: `"x-webhook-signature"`. */
|
|
19
19
|
header?: string;
|
|
20
20
|
/** HMAC algorithm. Default: `"sha256"`. */
|
|
21
|
-
algorithm?:
|
|
21
|
+
algorithm?: 'sha256' | 'sha512';
|
|
22
22
|
/**
|
|
23
23
|
* Strip this prefix from the signature header value before comparing.
|
|
24
24
|
* e.g. `"sha256="` for GitHub-style `X-Hub-Signature-256: sha256=<hex>`.
|
|
@@ -1,39 +1,38 @@
|
|
|
1
|
-
import { createHmac } from
|
|
2
|
-
import { timingSafeEqual } from
|
|
3
|
-
import { HttpError } from "../lib/HttpError";
|
|
1
|
+
import { createHmac } from 'crypto';
|
|
2
|
+
import { HttpError, timingSafeEqual } from '../../../packages/bunshot-core/src/index.js';
|
|
4
3
|
export const webhookAuth = (options) => async (c, next) => {
|
|
5
|
-
const algorithm = options.algorithm ??
|
|
6
|
-
const sigHeader = options.header ??
|
|
4
|
+
const algorithm = options.algorithm ?? 'sha256';
|
|
5
|
+
const sigHeader = options.header ?? 'x-webhook-signature';
|
|
7
6
|
// --- Optional timestamp replay protection ---
|
|
8
7
|
if (options.timestamp) {
|
|
9
8
|
const { header: tsHeader, tolerance } = options.timestamp;
|
|
10
9
|
const rawTs = c.req.header(tsHeader);
|
|
11
10
|
const tsNum = rawTs !== undefined ? parseInt(rawTs, 10) : NaN;
|
|
12
11
|
if (isNaN(tsNum)) {
|
|
13
|
-
throw new HttpError(401,
|
|
12
|
+
throw new HttpError(401, 'Unauthorized', 'EXPIRED_TIMESTAMP');
|
|
14
13
|
}
|
|
15
14
|
// Auto-detect Unix seconds (< 1e10) vs milliseconds
|
|
16
15
|
const tsMs = tsNum < 1e10 ? tsNum * 1000 : tsNum;
|
|
17
16
|
if (Math.abs(Date.now() - tsMs) > tolerance) {
|
|
18
|
-
throw new HttpError(401,
|
|
17
|
+
throw new HttpError(401, 'Unauthorized', 'EXPIRED_TIMESTAMP');
|
|
19
18
|
}
|
|
20
19
|
}
|
|
21
20
|
// --- Signature header ---
|
|
22
21
|
const rawSig = c.req.header(sigHeader);
|
|
23
22
|
if (!rawSig) {
|
|
24
|
-
throw new HttpError(401,
|
|
23
|
+
throw new HttpError(401, 'Unauthorized', 'INVALID_SIGNATURE');
|
|
25
24
|
}
|
|
26
25
|
const provided = options.prefix && rawSig.startsWith(options.prefix)
|
|
27
26
|
? rawSig.slice(options.prefix.length)
|
|
28
27
|
: rawSig;
|
|
29
28
|
// --- Secret resolution ---
|
|
30
29
|
let secret;
|
|
31
|
-
if (typeof options.secret ===
|
|
30
|
+
if (typeof options.secret === 'function') {
|
|
32
31
|
try {
|
|
33
32
|
secret = await options.secret(c);
|
|
34
33
|
}
|
|
35
34
|
catch {
|
|
36
|
-
throw new HttpError(500,
|
|
35
|
+
throw new HttpError(500, 'Internal Server Error', 'WEBHOOK_SECRET_ERROR');
|
|
37
36
|
}
|
|
38
37
|
}
|
|
39
38
|
else {
|
|
@@ -42,7 +41,7 @@ export const webhookAuth = (options) => async (c, next) => {
|
|
|
42
41
|
// --- Body reading (Hono caches this — downstream c.req.json() still works) ---
|
|
43
42
|
const body = await c.req.text();
|
|
44
43
|
// --- HMAC computation & comparison ---
|
|
45
|
-
const computed = createHmac(algorithm, secret).update(body).digest(
|
|
44
|
+
const computed = createHmac(algorithm, secret).update(body).digest('hex');
|
|
46
45
|
let valid;
|
|
47
46
|
try {
|
|
48
47
|
valid = timingSafeEqual(computed, provided);
|
|
@@ -52,7 +51,7 @@ export const webhookAuth = (options) => async (c, next) => {
|
|
|
52
51
|
valid = false;
|
|
53
52
|
}
|
|
54
53
|
if (!valid) {
|
|
55
|
-
throw new HttpError(401,
|
|
54
|
+
throw new HttpError(401, 'Unauthorized', 'INVALID_SIGNATURE');
|
|
56
55
|
}
|
|
57
56
|
await next();
|
|
58
57
|
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Connection, Document, Model } from 'mongoose';
|
|
2
|
+
interface IAuditLog {
|
|
3
|
+
id: string;
|
|
4
|
+
userId: string | null;
|
|
5
|
+
sessionId: string | null;
|
|
6
|
+
tenantId: string | null;
|
|
7
|
+
method: string;
|
|
8
|
+
path: string;
|
|
9
|
+
status: number;
|
|
10
|
+
ip: string | null;
|
|
11
|
+
userAgent: string | null;
|
|
12
|
+
action?: string;
|
|
13
|
+
resource?: string;
|
|
14
|
+
resourceId?: string;
|
|
15
|
+
meta?: Record<string, unknown>;
|
|
16
|
+
createdAt: Date;
|
|
17
|
+
expiresAt?: Date;
|
|
18
|
+
}
|
|
19
|
+
type AuditLogDocument = IAuditLog & Document;
|
|
20
|
+
export declare function getAuditLogModel(conn: Connection): Model<AuditLogDocument>;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { getMongooseModule } from '../../lib/mongo';
|
|
2
|
+
export function getAuditLogModel(conn) {
|
|
3
|
+
if (conn.models['AuditLog']) {
|
|
4
|
+
return conn.models['AuditLog'];
|
|
5
|
+
}
|
|
6
|
+
const mg = getMongooseModule();
|
|
7
|
+
const { Schema } = mg;
|
|
8
|
+
const schema = new Schema({
|
|
9
|
+
id: { type: String, required: true, unique: true },
|
|
10
|
+
userId: { type: String, default: null },
|
|
11
|
+
sessionId: { type: String, default: null },
|
|
12
|
+
tenantId: { type: String, default: null },
|
|
13
|
+
method: { type: String, required: true },
|
|
14
|
+
path: { type: String, required: true },
|
|
15
|
+
status: { type: Number, required: true },
|
|
16
|
+
ip: { type: String, default: null },
|
|
17
|
+
userAgent: { type: String, default: null },
|
|
18
|
+
action: { type: String },
|
|
19
|
+
resource: { type: String },
|
|
20
|
+
resourceId: { type: String },
|
|
21
|
+
meta: { type: Schema.Types.Mixed },
|
|
22
|
+
expiresAt: { type: Date, index: { expireAfterSeconds: 0 } },
|
|
23
|
+
}, {
|
|
24
|
+
collection: 'audit_logs',
|
|
25
|
+
timestamps: { createdAt: 'createdAt', updatedAt: false },
|
|
26
|
+
});
|
|
27
|
+
schema.index({ userId: 1, createdAt: 1 });
|
|
28
|
+
schema.index({ tenantId: 1, createdAt: 1 });
|
|
29
|
+
schema.index({ path: 1 });
|
|
30
|
+
return conn.model('AuditLog', schema);
|
|
31
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Middleware mounting — extracted from createApp().
|
|
3
|
+
*
|
|
4
|
+
* Handles the framework middleware stack: request ID, validation formatter,
|
|
5
|
+
* metrics collection, request logging, secure headers, CORS, bot protection,
|
|
6
|
+
* rate limiting, and tenant resolution.
|
|
7
|
+
*/
|
|
8
|
+
import type { MetricsState } from './lib/metrics';
|
|
9
|
+
import type { LogLevel, RequestLogEntry } from './middleware/requestLogger';
|
|
10
|
+
import type { OpenAPIHono } from '@hono/zod-openapi';
|
|
11
|
+
import type { MiddlewareHandler } from 'hono';
|
|
12
|
+
import type { AppEnv, ValidationErrorFormatter } from '../../packages/bunshot-core/src/index.js';
|
|
13
|
+
export interface SecurityConfig {
|
|
14
|
+
cors?: string | string[];
|
|
15
|
+
headers?: {
|
|
16
|
+
contentSecurityPolicy?: string;
|
|
17
|
+
permissionsPolicy?: string;
|
|
18
|
+
};
|
|
19
|
+
rateLimit?: {
|
|
20
|
+
windowMs: number;
|
|
21
|
+
max: number;
|
|
22
|
+
};
|
|
23
|
+
botProtection?: {
|
|
24
|
+
blockList?: string[];
|
|
25
|
+
fingerprintRateLimit?: boolean;
|
|
26
|
+
};
|
|
27
|
+
trustProxy?: false | number;
|
|
28
|
+
signing?: unknown;
|
|
29
|
+
captcha?: unknown;
|
|
30
|
+
}
|
|
31
|
+
export interface LoggingConfig {
|
|
32
|
+
enabled?: boolean;
|
|
33
|
+
onLog?: (entry: RequestLogEntry) => void | Promise<void>;
|
|
34
|
+
level?: LogLevel;
|
|
35
|
+
excludePaths?: (string | RegExp)[];
|
|
36
|
+
excludeMethods?: string[];
|
|
37
|
+
}
|
|
38
|
+
export interface MetricsConfig {
|
|
39
|
+
enabled?: boolean;
|
|
40
|
+
auth?: 'userAuth' | 'none' | MiddlewareHandler<AppEnv>[];
|
|
41
|
+
excludePaths?: (string | RegExp)[];
|
|
42
|
+
normalizePath?: (path: string) => string;
|
|
43
|
+
queues?: string[];
|
|
44
|
+
unsafePublic?: boolean;
|
|
45
|
+
}
|
|
46
|
+
export interface TenancyConfig {
|
|
47
|
+
resolution: 'header' | 'subdomain' | 'path';
|
|
48
|
+
headerName?: string;
|
|
49
|
+
pathSegment?: number;
|
|
50
|
+
onResolve?: (tenantId: string) => Promise<Record<string, unknown> | null>;
|
|
51
|
+
cacheTtlMs?: number;
|
|
52
|
+
cacheMaxSize?: number;
|
|
53
|
+
exemptPaths?: string[];
|
|
54
|
+
rejectionStatus?: 403 | 404;
|
|
55
|
+
}
|
|
56
|
+
export interface MountMiddlewareConfig {
|
|
57
|
+
security: SecurityConfig;
|
|
58
|
+
logging?: LoggingConfig;
|
|
59
|
+
metrics?: MetricsConfig;
|
|
60
|
+
metricsState?: MetricsState;
|
|
61
|
+
tenancy?: TenancyConfig;
|
|
62
|
+
validation?: {
|
|
63
|
+
formatError?: ValidationErrorFormatter;
|
|
64
|
+
};
|
|
65
|
+
middleware?: MiddlewareHandler<AppEnv>[];
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Mount all framework middleware on the Hono app in the correct order.
|
|
69
|
+
*
|
|
70
|
+
* Order:
|
|
71
|
+
* 1. Request ID
|
|
72
|
+
* 2. Validation error formatter (context variable)
|
|
73
|
+
* 3. Metrics collection (if enabled)
|
|
74
|
+
* 4. Request logging (if enabled)
|
|
75
|
+
* 5. Secure headers
|
|
76
|
+
* 6. Custom security headers
|
|
77
|
+
* 7. CORS
|
|
78
|
+
* 8. Bot protection (if configured)
|
|
79
|
+
* 9. Rate limiting
|
|
80
|
+
*
|
|
81
|
+
* Plugin middleware and tenant resolution are mounted separately
|
|
82
|
+
* (after this function returns) to maintain correct ordering.
|
|
83
|
+
*/
|
|
84
|
+
export declare function mountFrameworkMiddleware(app: OpenAPIHono<AppEnv>, config: MountMiddlewareConfig): Promise<void>;
|
|
85
|
+
/**
|
|
86
|
+
* Mount tenant resolution middleware. Called after plugin middleware phase
|
|
87
|
+
* so tenant context is available in routes but plugins can set up auth first.
|
|
88
|
+
*/
|
|
89
|
+
export declare function mountTenantMiddleware(app: OpenAPIHono<AppEnv>, tenancy: TenancyConfig, carrier?: {
|
|
90
|
+
cache: import('./middleware/tenant').TenantResolutionCache | null;
|
|
91
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { rateLimit } from './middleware/rateLimit';
|
|
2
|
+
import { requestId } from './middleware/requestId';
|
|
3
|
+
import { requestLogger } from './middleware/requestLogger';
|
|
4
|
+
import { cors } from 'hono/cors';
|
|
5
|
+
import { secureHeaders } from 'hono/secure-headers';
|
|
6
|
+
import { HEADER_CSRF_TOKEN, HEADER_REFRESH_TOKEN, HEADER_REQUEST_ID, HEADER_USER_TOKEN, defaultValidationErrorFormatter, } from '../../packages/bunshot-core/src/index.js';
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Implementation
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
/**
|
|
11
|
+
* Mount all framework middleware on the Hono app in the correct order.
|
|
12
|
+
*
|
|
13
|
+
* Order:
|
|
14
|
+
* 1. Request ID
|
|
15
|
+
* 2. Validation error formatter (context variable)
|
|
16
|
+
* 3. Metrics collection (if enabled)
|
|
17
|
+
* 4. Request logging (if enabled)
|
|
18
|
+
* 5. Secure headers
|
|
19
|
+
* 6. Custom security headers
|
|
20
|
+
* 7. CORS
|
|
21
|
+
* 8. Bot protection (if configured)
|
|
22
|
+
* 9. Rate limiting
|
|
23
|
+
*
|
|
24
|
+
* Plugin middleware and tenant resolution are mounted separately
|
|
25
|
+
* (after this function returns) to maintain correct ordering.
|
|
26
|
+
*/
|
|
27
|
+
export async function mountFrameworkMiddleware(app, config) {
|
|
28
|
+
const { security: securityConfig = {} } = config;
|
|
29
|
+
app.use(requestId);
|
|
30
|
+
// Set the validation error formatter on context so defaultHook and onError both pick it up
|
|
31
|
+
const validationFormatter = config.validation?.formatError ?? defaultValidationErrorFormatter;
|
|
32
|
+
app.use('*', async (c, next) => {
|
|
33
|
+
c.set('validationErrorFormatter', validationFormatter);
|
|
34
|
+
await next();
|
|
35
|
+
});
|
|
36
|
+
// Metrics collection middleware (before requestLogger so it captures all requests)
|
|
37
|
+
if (config.metrics?.enabled) {
|
|
38
|
+
const metricsAuth = config.metrics.auth ?? 'none';
|
|
39
|
+
if (metricsAuth === 'none' && !config.metrics.unsafePublic) {
|
|
40
|
+
if (process.env.NODE_ENV === 'production') {
|
|
41
|
+
throw new Error('[security] metrics.auth is required in production. Set metrics.auth or explicitly set unsafePublic: true with auth: "none".');
|
|
42
|
+
}
|
|
43
|
+
console.warn('[security] /metrics is enabled without auth. Configure metrics.auth for production.');
|
|
44
|
+
}
|
|
45
|
+
const { metricsCollector } = await import('./middleware/metrics');
|
|
46
|
+
app.use(metricsCollector({
|
|
47
|
+
state: config.metricsState ??
|
|
48
|
+
(() => {
|
|
49
|
+
throw new Error('metricsState is required when metrics are enabled');
|
|
50
|
+
})(),
|
|
51
|
+
excludePaths: config.metrics.excludePaths,
|
|
52
|
+
normalizePath: config.metrics.normalizePath,
|
|
53
|
+
}));
|
|
54
|
+
}
|
|
55
|
+
// Request logging
|
|
56
|
+
const loggingConfig = config.logging ?? {};
|
|
57
|
+
if (loggingConfig.enabled !== false) {
|
|
58
|
+
app.use(requestLogger({
|
|
59
|
+
onLog: loggingConfig.onLog,
|
|
60
|
+
level: loggingConfig.level,
|
|
61
|
+
excludePaths: loggingConfig.excludePaths,
|
|
62
|
+
excludeMethods: loggingConfig.excludeMethods,
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
// Secure headers
|
|
66
|
+
const headerOpts = {};
|
|
67
|
+
if (securityConfig.headers?.contentSecurityPolicy) {
|
|
68
|
+
headerOpts['Content-Security-Policy'] = securityConfig.headers.contentSecurityPolicy;
|
|
69
|
+
}
|
|
70
|
+
if (securityConfig.headers?.permissionsPolicy) {
|
|
71
|
+
headerOpts['Permissions-Policy'] = securityConfig.headers.permissionsPolicy;
|
|
72
|
+
}
|
|
73
|
+
app.use(secureHeaders());
|
|
74
|
+
if (Object.keys(headerOpts).length > 0) {
|
|
75
|
+
app.use(async (c, next) => {
|
|
76
|
+
await next();
|
|
77
|
+
for (const [k, v] of Object.entries(headerOpts)) {
|
|
78
|
+
c.res.headers.set(k, v);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
// CORS
|
|
83
|
+
const corsOrigins = securityConfig.cors ?? '*';
|
|
84
|
+
if (corsOrigins === '*' && process.env.NODE_ENV === 'production') {
|
|
85
|
+
console.warn('[security] CORS is set to wildcard (*) in production. Configure security.cors with specific origins to restrict cross-origin access.');
|
|
86
|
+
}
|
|
87
|
+
const corsAllowHeaders = [
|
|
88
|
+
'Content-Type',
|
|
89
|
+
'Authorization',
|
|
90
|
+
HEADER_USER_TOKEN,
|
|
91
|
+
HEADER_REFRESH_TOKEN,
|
|
92
|
+
HEADER_CSRF_TOKEN,
|
|
93
|
+
];
|
|
94
|
+
app.use(cors({
|
|
95
|
+
origin: corsOrigins,
|
|
96
|
+
allowHeaders: corsAllowHeaders,
|
|
97
|
+
exposeHeaders: ['x-cache', HEADER_REQUEST_ID],
|
|
98
|
+
credentials: true,
|
|
99
|
+
}));
|
|
100
|
+
// Bot protection
|
|
101
|
+
const botCfg = securityConfig.botProtection ?? {};
|
|
102
|
+
if ((botCfg.blockList?.length ?? 0) > 0) {
|
|
103
|
+
const { botProtection } = await import('./middleware/botProtection');
|
|
104
|
+
app.use(botProtection({ blockList: botCfg.blockList }));
|
|
105
|
+
}
|
|
106
|
+
// Rate limiting
|
|
107
|
+
const rlConfig = securityConfig.rateLimit ?? { windowMs: 60_000, max: 100 };
|
|
108
|
+
app.use(rateLimit({ ...rlConfig, fingerprintLimit: botCfg.fingerprintRateLimit ?? false }));
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Mount tenant resolution middleware. Called after plugin middleware phase
|
|
112
|
+
* so tenant context is available in routes but plugins can set up auth first.
|
|
113
|
+
*/
|
|
114
|
+
export async function mountTenantMiddleware(app, tenancy, carrier) {
|
|
115
|
+
if (!tenancy.onResolve) {
|
|
116
|
+
if (process.env.NODE_ENV === 'production') {
|
|
117
|
+
throw new Error('[security] Tenancy is configured without an onResolve callback. ' +
|
|
118
|
+
'In production, onResolve is required to validate tenant IDs and prevent cross-tenant access. ' +
|
|
119
|
+
'Provide tenancy.onResolve or remove the tenancy config.');
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
console.warn('[security] Tenancy is configured without an onResolve callback — ' +
|
|
123
|
+
'tenant IDs will be trusted without validation. This is unsafe in production.');
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const { createTenantMiddleware } = await import('./middleware/tenant');
|
|
127
|
+
app.use(createTenantMiddleware(tenancy, carrier));
|
|
128
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optional endpoint mounting — extracted from createApp().
|
|
3
|
+
*
|
|
4
|
+
* Mounts the jobs status endpoint, /metrics endpoint, and upload presigned-URL
|
|
5
|
+
* endpoint when each is enabled in the app config.
|
|
6
|
+
*/
|
|
7
|
+
import type { MetricsState } from './lib/metrics';
|
|
8
|
+
import type { OpenAPIHono } from '@hono/zod-openapi';
|
|
9
|
+
import type { MiddlewareHandler } from 'hono';
|
|
10
|
+
import type { AppEnv } from '../../packages/bunshot-core/src/index.js';
|
|
11
|
+
export interface JobsConfig {
|
|
12
|
+
/** Enable the job status endpoint. Default: false. */
|
|
13
|
+
statusEndpoint?: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Auth protection for job endpoints.
|
|
16
|
+
* - `"userAuth"` — requires authenticated user session (cookie/token).
|
|
17
|
+
* - `"none"` — no auth (not recommended for production).
|
|
18
|
+
* - `MiddlewareHandler[]` — custom middleware stack (e.g., `[userAuth, requireRole("admin")]`).
|
|
19
|
+
*
|
|
20
|
+
* Default: `"none"`. You must explicitly configure auth.
|
|
21
|
+
*/
|
|
22
|
+
auth?: 'userAuth' | 'none' | MiddlewareHandler<AppEnv>[];
|
|
23
|
+
/** Required roles for accessing job endpoints. Only works when auth includes userAuth. */
|
|
24
|
+
roles?: string[];
|
|
25
|
+
/** Whitelist of queue names exposed. Default: [] (nothing exposed). */
|
|
26
|
+
allowedQueues?: string[];
|
|
27
|
+
/** When using userAuth, restrict job visibility to the user who created it. Default: false. */
|
|
28
|
+
scopeToUser?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Explicitly acknowledge that jobs endpoint is public in production.
|
|
31
|
+
* Set to true only when auth is "none" and you understand the risk.
|
|
32
|
+
* Without this, createApp throws in production when auth is "none".
|
|
33
|
+
*/
|
|
34
|
+
unsafePublic?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface MetricsConfig {
|
|
37
|
+
/** Enable the /metrics endpoint. Default: false (must be explicitly enabled). */
|
|
38
|
+
enabled?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Auth protection for the /metrics endpoint.
|
|
41
|
+
* - `"userAuth"` — requires authenticated user session.
|
|
42
|
+
* - `"none"` — no auth (default — logs a production warning).
|
|
43
|
+
* - `MiddlewareHandler[]` — custom middleware stack.
|
|
44
|
+
*/
|
|
45
|
+
auth?: 'userAuth' | 'none' | MiddlewareHandler<AppEnv>[];
|
|
46
|
+
/** Paths to exclude from metrics collection. Strings use prefix matching. */
|
|
47
|
+
excludePaths?: (string | RegExp)[];
|
|
48
|
+
/** Custom path normalizer to prevent high-cardinality labels. */
|
|
49
|
+
normalizePath?: (path: string) => string;
|
|
50
|
+
/** BullMQ queue names to report depth gauges for. */
|
|
51
|
+
queues?: string[];
|
|
52
|
+
/**
|
|
53
|
+
* Explicitly acknowledge that metrics endpoint is public in production.
|
|
54
|
+
* Set to true only when auth is "none" and you understand the risk.
|
|
55
|
+
* Without this, createApp throws in production when auth is "none".
|
|
56
|
+
*/
|
|
57
|
+
unsafePublic?: boolean;
|
|
58
|
+
}
|
|
59
|
+
export interface PresignedUrlConfig {
|
|
60
|
+
expirySeconds?: number;
|
|
61
|
+
path?: string;
|
|
62
|
+
}
|
|
63
|
+
export interface UploadConfig {
|
|
64
|
+
storage: import('./lib/storageAdapter').StorageAdapter;
|
|
65
|
+
maxFileSize?: number;
|
|
66
|
+
maxFiles?: number;
|
|
67
|
+
allowedMimeTypes?: string[];
|
|
68
|
+
keyPrefix?: string;
|
|
69
|
+
generateKey?: (file: File, ctx: {
|
|
70
|
+
userId?: string;
|
|
71
|
+
tenantId?: string;
|
|
72
|
+
}) => string;
|
|
73
|
+
tenantScopedKeys?: boolean;
|
|
74
|
+
presignedUrls?: boolean | PresignedUrlConfig;
|
|
75
|
+
/**
|
|
76
|
+
* TTL in seconds for upload registry entries across all backends.
|
|
77
|
+
* Default: 2592000 (30 days).
|
|
78
|
+
*/
|
|
79
|
+
registryTtlSeconds?: number;
|
|
80
|
+
/**
|
|
81
|
+
* Authorization callback for upload read/delete operations.
|
|
82
|
+
* Called when registry ownership check fails or key is not in registry.
|
|
83
|
+
*/
|
|
84
|
+
authorization?: {
|
|
85
|
+
authorize?: (input: {
|
|
86
|
+
action: 'read' | 'delete';
|
|
87
|
+
key: string;
|
|
88
|
+
userId?: string;
|
|
89
|
+
tenantId?: string;
|
|
90
|
+
}) => boolean | Promise<boolean>;
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Allow operations on keys not in the upload registry.
|
|
94
|
+
* When false (default), operations on unknown keys return 404.
|
|
95
|
+
* When true, requires an authorize callback — denies if absent.
|
|
96
|
+
*/
|
|
97
|
+
allowExternalKeys?: boolean;
|
|
98
|
+
}
|
|
99
|
+
export declare function mountOptionalEndpoints(app: OpenAPIHono<AppEnv>, coreRoutesDir: string, jobs: JobsConfig | undefined, metrics: MetricsConfig | undefined, upload: UploadConfig | undefined, metricsState: MetricsState, resolvedSecrets: {
|
|
100
|
+
redisHost?: string;
|
|
101
|
+
redisUser?: string;
|
|
102
|
+
redisPassword?: string;
|
|
103
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { createQueueFactory } from '../lib/queue';
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Implementation
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
export async function mountOptionalEndpoints(app, coreRoutesDir, jobs, metrics, upload, metricsState, resolvedSecrets) {
|
|
6
|
+
const needsQueueFactory = !!jobs?.statusEndpoint || !!metrics?.queues?.length;
|
|
7
|
+
const queueFactory = needsQueueFactory
|
|
8
|
+
? (() => {
|
|
9
|
+
if (!resolvedSecrets.redisHost) {
|
|
10
|
+
throw new Error('[queue] Jobs/metrics queue helpers require REDIS_HOST via the Bunshot secret bundle at startup.');
|
|
11
|
+
}
|
|
12
|
+
return createQueueFactory({
|
|
13
|
+
host: resolvedSecrets.redisHost,
|
|
14
|
+
user: resolvedSecrets.redisUser,
|
|
15
|
+
password: resolvedSecrets.redisPassword,
|
|
16
|
+
});
|
|
17
|
+
})()
|
|
18
|
+
: undefined;
|
|
19
|
+
if (jobs?.statusEndpoint) {
|
|
20
|
+
const jobsAuth = jobs.auth ?? 'none';
|
|
21
|
+
if (jobsAuth === 'none' && !jobs.unsafePublic) {
|
|
22
|
+
if (process.env.NODE_ENV === 'production') {
|
|
23
|
+
throw new Error('[security] jobs.auth is required in production. Set jobs.auth or explicitly set unsafePublic: true with auth: "none".');
|
|
24
|
+
}
|
|
25
|
+
console.warn('[security] /jobs is enabled without auth. Configure jobs.auth for production.');
|
|
26
|
+
}
|
|
27
|
+
const { createJobsRouter } = await import(`${coreRoutesDir}/jobs`);
|
|
28
|
+
app.route('/', createJobsRouter(jobs, queueFactory));
|
|
29
|
+
}
|
|
30
|
+
if (metrics?.enabled) {
|
|
31
|
+
const { createMetricsRouter } = await import(`${coreRoutesDir}/metrics`);
|
|
32
|
+
app.route('/', createMetricsRouter({
|
|
33
|
+
auth: metrics.auth,
|
|
34
|
+
queues: metrics.queues,
|
|
35
|
+
unsafePublic: metrics.unsafePublic,
|
|
36
|
+
}, metricsState, queueFactory));
|
|
37
|
+
}
|
|
38
|
+
if (upload?.presignedUrls) {
|
|
39
|
+
const { createUploadsRouter } = await import(`${coreRoutesDir}/uploads`);
|
|
40
|
+
const presignConfig = upload.presignedUrls === true ? {} : upload.presignedUrls;
|
|
41
|
+
app.route('/', createUploadsRouter({
|
|
42
|
+
...presignConfig,
|
|
43
|
+
authorization: upload.authorization,
|
|
44
|
+
allowExternalKeys: upload.allowExternalKeys,
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { OpenAPIHono } from '@hono/zod-openapi';
|
|
2
|
+
import type { AppEnv } from '../../packages/bunshot-core/src/index.js';
|
|
3
|
+
export interface VersioningConfig {
|
|
4
|
+
/**
|
|
5
|
+
* Version identifiers in ascending order, e.g. `["v1", "v2"]`.
|
|
6
|
+
* Each version needs a matching subdirectory under `routesDir` (e.g. `routes/v1/`).
|
|
7
|
+
*/
|
|
8
|
+
versions: string[];
|
|
9
|
+
/**
|
|
10
|
+
* Subdirectory name for routes shared across all versions. Shared route schemas
|
|
11
|
+
* receive unprefixed names since they are version-agnostic. Default: `"shared"`.
|
|
12
|
+
* Set `false` to disable shared route discovery.
|
|
13
|
+
*/
|
|
14
|
+
sharedDir?: string | false;
|
|
15
|
+
/**
|
|
16
|
+
* Which version `/docs` and `/openapi.json` redirect to.
|
|
17
|
+
* Defaults to the last version in the array (i.e. the latest).
|
|
18
|
+
*/
|
|
19
|
+
defaultVersion?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function mountRoutes(app: OpenAPIHono<AppEnv>, routesDir: string, versioning: VersioningConfig | string[] | undefined, appName: string, openApiVersion: string): Promise<void>;
|