@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,117 +0,0 @@
|
|
|
1
|
-
## Response Caching
|
|
2
|
-
|
|
3
|
-
Cache GET responses and bust them from mutation endpoints. Supports Redis, MongoDB, SQLite, and memory stores. The cache key is automatically namespaced by `appName` (`cache:{appName}:{key}`), so shared instances across tenant apps never collide.
|
|
4
|
-
|
|
5
|
-
### Basic usage
|
|
6
|
-
|
|
7
|
-
```ts
|
|
8
|
-
import { cacheResponse, bustCache } from "@lastshotlabs/bunshot";
|
|
9
|
-
|
|
10
|
-
// GET — cache the response for 60 seconds in Redis (default)
|
|
11
|
-
router.use("/products", cacheResponse({ ttl: 60, key: "products" }));
|
|
12
|
-
|
|
13
|
-
// indefinite — cached until busted
|
|
14
|
-
router.use("/config", cacheResponse({ key: "config" }));
|
|
15
|
-
|
|
16
|
-
router.get("/products", async (c) => {
|
|
17
|
-
const items = await Product.find();
|
|
18
|
-
return c.json({ items });
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
// POST — write data, then bust the shared key (hits all connected stores)
|
|
22
|
-
router.post("/products", userAuth, async (c) => {
|
|
23
|
-
const body = await c.req.json();
|
|
24
|
-
await Product.create(body);
|
|
25
|
-
await bustCache("products");
|
|
26
|
-
return c.json({ ok: true }, 201);
|
|
27
|
-
});
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
The `key` string is the shared contract — `cacheResponse` stores under it, `bustCache` deletes it. Responses include an `x-cache: HIT` or `x-cache: MISS` header.
|
|
31
|
-
|
|
32
|
-
### Choosing a cache store
|
|
33
|
-
|
|
34
|
-
Pass `store` to select where the response is cached. Defaults to `"redis"`.
|
|
35
|
-
|
|
36
|
-
```ts
|
|
37
|
-
// Redis (default)
|
|
38
|
-
cacheResponse({ key: "products", ttl: 60 })
|
|
39
|
-
|
|
40
|
-
// MongoDB — uses appConnection, stores in the `cache_entries` collection
|
|
41
|
-
// TTL is handled natively via a MongoDB expiry index on the expiresAt field
|
|
42
|
-
cacheResponse({ key: "products", ttl: 300, store: "mongo" })
|
|
43
|
-
|
|
44
|
-
// SQLite — uses the same .db file as sqliteAuthAdapter; requires setSqliteDb or sqliteDb config
|
|
45
|
-
cacheResponse({ key: "products", ttl: 60, store: "sqlite" })
|
|
46
|
-
|
|
47
|
-
// Memory — in-process Map, ephemeral (cleared on restart), no external dependencies
|
|
48
|
-
cacheResponse({ key: "products", ttl: 60, store: "memory" })
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
Use SQLite when running without Redis or MongoDB. Use MongoDB when you want cache entries co-located with your app data. Use Redis for lower-latency hot caches. Use Memory for tests or single-process apps where persistence isn't needed.
|
|
52
|
-
|
|
53
|
-
**Connection requirements:** The chosen store must be initialized when the route is first hit. If `store: "sqlite"` is used but `setSqliteDb` has not been called (e.g. `sqliteDb` was not passed to `createServer`), the middleware throws a clear error on the first request. The same applies to the other stores.
|
|
54
|
-
|
|
55
|
-
### Busting cached entries
|
|
56
|
-
|
|
57
|
-
`bustCache` always attempts all four stores (Redis, Mongo, SQLite, Memory), skipping any that aren't connected. This means it works correctly regardless of which `store` option your routes use, and is safe to call in apps that don't use all stores:
|
|
58
|
-
|
|
59
|
-
```ts
|
|
60
|
-
await bustCache("products"); // hits whichever stores are connected
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
### Per-user caching
|
|
64
|
-
|
|
65
|
-
The `key` function receives the full Hono context, so you can scope cache entries to the authenticated user:
|
|
66
|
-
|
|
67
|
-
```ts
|
|
68
|
-
router.use("/feed", userAuth, cacheResponse({
|
|
69
|
-
ttl: 60,
|
|
70
|
-
key: (c) => `feed:${c.get("authUserId")}`,
|
|
71
|
-
}));
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
`authUserId` is populated by `identify`, which always runs before route middleware, so it's safe to use here.
|
|
75
|
-
|
|
76
|
-
### Per-resource caching
|
|
77
|
-
|
|
78
|
-
For routes with dynamic segments, use the function form of `key`. Produce the same string in `bustCache`:
|
|
79
|
-
|
|
80
|
-
```ts
|
|
81
|
-
// GET /products/:id
|
|
82
|
-
router.use("/products/:id", cacheResponse({
|
|
83
|
-
ttl: 60,
|
|
84
|
-
key: (c) => `product:${c.req.param("id")}`,
|
|
85
|
-
}));
|
|
86
|
-
|
|
87
|
-
router.get("/products/:id", async (c) => {
|
|
88
|
-
const item = await Product.findById(c.req.param("id"));
|
|
89
|
-
return c.json(item);
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
// PUT /products/:id
|
|
93
|
-
router.put("/products/:id", userAuth, async (c) => {
|
|
94
|
-
const id = c.req.param("id");
|
|
95
|
-
await Product.findByIdAndUpdate(id, await c.req.json());
|
|
96
|
-
await bustCache(`product:${id}`);
|
|
97
|
-
return c.json({ ok: true });
|
|
98
|
-
});
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
Only 2xx responses are cached. Non-2xx responses pass through uncached. Omit `ttl` to cache indefinitely — the entry will persist until explicitly busted with `bustCache`.
|
|
102
|
-
|
|
103
|
-
**Header sanitization:** Security-sensitive response headers (`set-cookie`, `www-authenticate`, `authorization`, `x-csrf-token`, `proxy-authenticate`) are automatically stripped before caching to prevent session fixation or auth bypass via cached responses.
|
|
104
|
-
|
|
105
|
-
### Busting by pattern
|
|
106
|
-
|
|
107
|
-
When cache keys include variable parts (e.g. query params), use `bustCachePattern` to invalidate an entire logical group at once. It runs against all four stores — Redis (via SCAN), Mongo (via regex), SQLite (via LIKE), and Memory (via regex) — in parallel:
|
|
108
|
-
|
|
109
|
-
```ts
|
|
110
|
-
import { bustCachePattern } from "@lastshotlabs/bunshot";
|
|
111
|
-
|
|
112
|
-
// key includes query params: `balance:${userId}:${from}:${to}:${groupBy}`
|
|
113
|
-
// bust all balance entries for this user regardless of params
|
|
114
|
-
await bustCachePattern(`balance:${userId}:*`);
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
The `*` wildcard is translated to a Redis glob, a Mongo/Memory regex, and a SQLite LIKE pattern automatically. Like `bustCache`, it silently skips any store that isn't connected, so it's safe to call in apps that only use one store.
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
## Response Caching
|
|
2
|
-
|
|
3
|
-
Cache GET responses with `cacheResponse({ ttl, key })` and bust them with `bustCache(key)`. Supports Redis, MongoDB, SQLite, and memory stores. Cache keys are auto-namespaced by app name and tenant (when multi-tenancy is active).
|
|
4
|
-
|
|
5
|
-
```ts
|
|
6
|
-
import { cacheResponse, bustCache } from "@lastshotlabs/bunshot";
|
|
7
|
-
|
|
8
|
-
router.use("/products", cacheResponse({ ttl: 60, key: "products" }));
|
|
9
|
-
// ...
|
|
10
|
-
await bustCache("products"); // hits all connected stores
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
Supports per-user caching via `key: (c) => ...`, per-resource caching, and wildcard invalidation via `bustCachePattern("products:*")`.
|
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
### Roles
|
|
2
|
-
|
|
3
|
-
#### Setup
|
|
4
|
-
|
|
5
|
-
Declare the valid roles for your app in `createServer` / `createApp`:
|
|
6
|
-
|
|
7
|
-
```ts
|
|
8
|
-
await createServer({
|
|
9
|
-
auth: {
|
|
10
|
-
roles: ["admin", "editor", "user"],
|
|
11
|
-
defaultRole: "user", // automatically assigned on /auth/register
|
|
12
|
-
},
|
|
13
|
-
// ...
|
|
14
|
-
});
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
`roles` makes the list available anywhere via `getAppRoles()`. `defaultRole` is assigned to every new user that registers via `POST /auth/register` — no extra code needed.
|
|
18
|
-
|
|
19
|
-
#### Assigning roles to a user
|
|
20
|
-
|
|
21
|
-
Three helpers are available depending on what you need:
|
|
22
|
-
|
|
23
|
-
| Helper | Behaviour |
|
|
24
|
-
|---|---|
|
|
25
|
-
| `setUserRoles(userId, roles)` | Replace all roles — pass the full desired set |
|
|
26
|
-
| `addUserRole(userId, role)` | Add a single role, leaving others unchanged |
|
|
27
|
-
| `removeUserRole(userId, role)` | Remove a single role, leaving others unchanged |
|
|
28
|
-
|
|
29
|
-
```ts
|
|
30
|
-
import { setUserRoles, addUserRole, removeUserRole, userAuth, requireRole } from "@lastshotlabs/bunshot";
|
|
31
|
-
|
|
32
|
-
// promote a user to admin
|
|
33
|
-
router.post("/admin/users/:id/promote", userAuth, requireRole("admin"), async (c) => {
|
|
34
|
-
await addUserRole(c.req.param("id"), "admin");
|
|
35
|
-
return c.json({ ok: true });
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
// revoke a role
|
|
39
|
-
router.post("/admin/users/:id/demote", userAuth, requireRole("admin"), async (c) => {
|
|
40
|
-
await removeUserRole(c.req.param("id"), "admin");
|
|
41
|
-
return c.json({ ok: true });
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
// replace all roles at once
|
|
45
|
-
router.put("/admin/users/:id/roles", userAuth, requireRole("admin"), async (c) => {
|
|
46
|
-
const { roles } = await c.req.json();
|
|
47
|
-
await setUserRoles(c.req.param("id"), roles);
|
|
48
|
-
return c.json({ ok: true });
|
|
49
|
-
});
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
#### Protecting routes by role
|
|
53
|
-
|
|
54
|
-
`requireRole` is a middleware factory. It lazy-fetches roles on the first role-checked request and caches them on the Hono context, so multiple `requireRole` calls in a middleware chain only hit the DB once.
|
|
55
|
-
|
|
56
|
-
```ts
|
|
57
|
-
import { userAuth, requireRole } from "@lastshotlabs/bunshot";
|
|
58
|
-
|
|
59
|
-
router.use("/admin", userAuth, requireRole("admin"));
|
|
60
|
-
router.use("/content", userAuth, requireRole("admin", "editor")); // allow either role
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
| Scenario | Response |
|
|
64
|
-
|---|---|
|
|
65
|
-
| No session | `401 Unauthorized` |
|
|
66
|
-
| Authenticated, wrong role | `403 Forbidden` |
|
|
67
|
-
| Authenticated, correct role | passes through |
|
|
68
|
-
|
|
69
|
-
#### Custom adapter with roles
|
|
70
|
-
|
|
71
|
-
If you're using a custom `authAdapter`, implement the role methods to back role operations with your own store:
|
|
72
|
-
|
|
73
|
-
| Method | Required for |
|
|
74
|
-
|---|---|
|
|
75
|
-
| `getRoles(userId)` | `requireRole` middleware |
|
|
76
|
-
| `setRoles(userId, roles)` | `defaultRole` assignment on registration, full replace |
|
|
77
|
-
| `addRole(userId, role)` | Granular role addition |
|
|
78
|
-
| `removeRole(userId, role)` | Granular role removal |
|
|
79
|
-
|
|
80
|
-
All are optional — only implement what your app uses. `setRoles` is **required** if you configure `defaultRole` (the app will throw at startup if this combination is misconfigured). The exported helpers `setUserRoles`, `addUserRole`, and `removeUserRole` route through your adapter, so they work regardless of which store you use.
|
|
81
|
-
|
|
82
|
-
```ts
|
|
83
|
-
const myAdapter: AuthAdapter = {
|
|
84
|
-
findByEmail: ...,
|
|
85
|
-
create: ...,
|
|
86
|
-
async getRoles(userId) {
|
|
87
|
-
const user = await db.query.users.findFirst({ where: eq(users.id, userId) });
|
|
88
|
-
return user?.roles ?? [];
|
|
89
|
-
},
|
|
90
|
-
async setRoles(userId, roles) {
|
|
91
|
-
await db.update(users).set({ roles }).where(eq(users.id, userId));
|
|
92
|
-
},
|
|
93
|
-
async addRole(userId, role) {
|
|
94
|
-
const user = await db.query.users.findFirst({ where: eq(users.id, userId) });
|
|
95
|
-
if (user && !user.roles.includes(role)) {
|
|
96
|
-
await db.update(users).set({ roles: [...user.roles, role] }).where(eq(users.id, userId));
|
|
97
|
-
}
|
|
98
|
-
},
|
|
99
|
-
async removeRole(userId, role) {
|
|
100
|
-
const user = await db.query.users.findFirst({ where: eq(users.id, userId) });
|
|
101
|
-
if (user) {
|
|
102
|
-
await db.update(users).set({ roles: user.roles.filter((r: string) => r !== role) }).where(eq(users.id, userId));
|
|
103
|
-
}
|
|
104
|
-
},
|
|
105
|
-
};
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
#### Tenant-scoped roles
|
|
109
|
-
|
|
110
|
-
When multi-tenancy is enabled (see below), `requireRole` automatically checks **tenant-scoped roles** instead of app-wide roles when a `tenantId` is present in the request context.
|
|
111
|
-
|
|
112
|
-
```ts
|
|
113
|
-
// Assign a tenant-scoped role
|
|
114
|
-
import { addTenantRole, setTenantRoles, removeTenantRole, getTenantRoles } from "@lastshotlabs/bunshot";
|
|
115
|
-
|
|
116
|
-
await addTenantRole(userId, "acme", "admin");
|
|
117
|
-
await setTenantRoles(userId, "acme", ["admin", "editor"]);
|
|
118
|
-
await removeTenantRole(userId, "acme", "editor");
|
|
119
|
-
const roles = await getTenantRoles(userId, "acme"); // ["admin"]
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
`requireRole("admin")` checks tenant-scoped roles when `tenantId` is in context, and falls back to app-wide roles when there is no tenant context. Use `requireRole.global("superadmin")` to always check app-wide roles regardless of tenant.
|
|
123
|
-
|
|
124
|
-
```ts
|
|
125
|
-
router.use("/tenant-admin", userAuth, requireRole("admin")); // checks tenant roles when in tenant context
|
|
126
|
-
router.use("/super-admin", userAuth, requireRole.global("superadmin")); // always checks app-wide roles
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
If you're using a custom `authAdapter`, implement the tenant role methods:
|
|
130
|
-
|
|
131
|
-
| Method | Purpose |
|
|
132
|
-
|---|---|
|
|
133
|
-
| `getTenantRoles(userId, tenantId)` | Required for tenant-scoped `requireRole` |
|
|
134
|
-
| `setTenantRoles(userId, tenantId, roles)` | Full replace |
|
|
135
|
-
| `addTenantRole(userId, tenantId, role)` | Granular addition |
|
|
136
|
-
| `removeTenantRole(userId, tenantId, role)` | Granular removal |
|
|
137
|
-
|
|
138
|
-
#### Groups
|
|
139
|
-
|
|
140
|
-
Groups are named collections of users that grant roles additively. They sit on top of direct role assignments — effective roles are always `directRoles ∪ groupBaselineRoles ∪ membershipRoles` (deduplicated).
|
|
141
|
-
|
|
142
|
-
**Role model:** Each group carries a `roles[]` array that all members inherit. Each `GroupMembership` also carries its own `roles[]` for per-member extras on top of the group baseline.
|
|
143
|
-
|
|
144
|
-
```ts
|
|
145
|
-
import {
|
|
146
|
-
createGroup, deleteGroup, getGroup, listGroups, updateGroup,
|
|
147
|
-
addGroupMember, updateGroupMembership, removeGroupMember,
|
|
148
|
-
getGroupMembers, getUserGroups, getEffectiveRoles,
|
|
149
|
-
} from "@lastshotlabs/bunshot";
|
|
150
|
-
|
|
151
|
-
// Create a group (app-wide; tenantId: null)
|
|
152
|
-
const { id } = await createGroup({ name: "editors", roles: ["editor"], tenantId: null });
|
|
153
|
-
|
|
154
|
-
// Add a member with optional per-membership extras
|
|
155
|
-
await addGroupMember(id, userId, ["editor-lead"]); // throws 409 if already a member
|
|
156
|
-
|
|
157
|
-
// Effective roles = direct + group baseline + per-membership (deduplicated)
|
|
158
|
-
const roles = await getEffectiveRoles(userId, null); // ["editor", "editor-lead"]
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
**Scope:** Groups are either app-wide (`tenantId: null`) or tenant-scoped (`tenantId: string`). Tenant-scoped group roles only count when `requireRole` runs in that tenant's context — they never satisfy `requireRole.global`.
|
|
162
|
-
|
|
163
|
-
```ts
|
|
164
|
-
// tenant-scoped group: roles only visible within that tenant's context
|
|
165
|
-
await createGroup({ name: "tenant-admins", roles: ["admin"], tenantId: "acme" });
|
|
166
|
-
await addGroupMember(groupId, userId);
|
|
167
|
-
|
|
168
|
-
// Within acme's request context → requireRole("admin") passes
|
|
169
|
-
// requireRole.global("admin") → NEVER satisfied by a tenant-scoped group
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
**`tenantId` is immutable** after creation. To move a group to a different scope, delete it and recreate it.
|
|
173
|
-
|
|
174
|
-
##### Management routes
|
|
175
|
-
|
|
176
|
-
Enable built-in REST endpoints for managing groups:
|
|
177
|
-
|
|
178
|
-
```ts
|
|
179
|
-
await createServer({
|
|
180
|
-
groups: {
|
|
181
|
-
managementRoutes: true, // default guard: requireRole.global("admin")
|
|
182
|
-
},
|
|
183
|
-
});
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
| Option | Type | Description |
|
|
187
|
-
|---|---|---|
|
|
188
|
-
| `managementRoutes` | `true \| { adminRole?, middleware? }` | Enable management routes |
|
|
189
|
-
| `adminRole` | `string` | Role required (default: `"admin"`); uses `requireRole.global` |
|
|
190
|
-
| `middleware` | `MiddlewareHandler[]` | Fully replaces the default `[userAuth, requireRole.global(adminRole)]` stack |
|
|
191
|
-
|
|
192
|
-
Routes mounted at the root:
|
|
193
|
-
|
|
194
|
-
| Method | Path | Description |
|
|
195
|
-
|---|---|---|
|
|
196
|
-
| `GET` | `/groups` | List groups (tenant-scoped if `tenantId` in context, else app-wide) |
|
|
197
|
-
| `POST` | `/groups` | Create group (`name` must match `/^[a-z0-9_-]+$/`) |
|
|
198
|
-
| `GET` | `/groups/:groupId` | Get group |
|
|
199
|
-
| `PATCH` | `/groups/:groupId` | Update name / displayName / description / roles |
|
|
200
|
-
| `DELETE` | `/groups/:groupId` | Delete group (cascades memberships) |
|
|
201
|
-
| `GET` | `/groups/:groupId/members` | List members with per-membership roles |
|
|
202
|
-
| `POST` | `/groups/:groupId/members` | Add member `{ userId, roles? }` |
|
|
203
|
-
| `PATCH` | `/groups/:groupId/members/:userId` | Update member's per-membership roles |
|
|
204
|
-
| `DELETE` | `/groups/:groupId/members/:userId` | Remove member |
|
|
205
|
-
| `GET` | `/users/:userId/groups` | List user's groups with `membershipRoles` |
|
|
206
|
-
|
|
207
|
-
All list endpoints are paginated (`?limit=&offset=`).
|
|
208
|
-
|
|
209
|
-
##### Custom adapter
|
|
210
|
-
|
|
211
|
-
Implement these methods on your `AuthAdapter` to back groups with your own store:
|
|
212
|
-
|
|
213
|
-
| Method | Purpose |
|
|
214
|
-
|---|---|
|
|
215
|
-
| `createGroup(group)` | Create group; throw `HttpError(409, ...)` on duplicate name in scope |
|
|
216
|
-
| `deleteGroup(groupId)` | Delete group + cascade memberships |
|
|
217
|
-
| `getGroup(groupId)` | Fetch by ID |
|
|
218
|
-
| `listGroups(tenantId, opts?)` | Paginated list scoped to `tenantId` |
|
|
219
|
-
| `updateGroup(groupId, updates)` | Update name/displayName/description/roles |
|
|
220
|
-
| `addGroupMember(groupId, userId, roles?)` | Add member; **must throw 409** if already a member |
|
|
221
|
-
| `updateGroupMembership(groupId, userId, roles)` | Update per-membership roles in-place |
|
|
222
|
-
| `removeGroupMember(groupId, userId)` | Remove member |
|
|
223
|
-
| `getGroupMembers(groupId, opts?)` | Paginated member list |
|
|
224
|
-
| `getUserGroups(userId, tenantId)` | All groups for a user in a scope |
|
|
225
|
-
| `getEffectiveRoles(userId, tenantId)` | Compute effective roles (required — no fallback) |
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
### Roles
|
|
2
|
-
|
|
3
|
-
Declare roles in `createServer({ auth: { roles: ["admin", "editor", "user"], defaultRole: "user" } })`. The default role is auto-assigned on registration.
|
|
4
|
-
|
|
5
|
-
```ts
|
|
6
|
-
import { userAuth, requireRole, addUserRole } from "@lastshotlabs/bunshot";
|
|
7
|
-
|
|
8
|
-
router.use("/admin", userAuth, requireRole("admin"));
|
|
9
|
-
await addUserRole(userId, "admin"); // also: setUserRoles, removeUserRole
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
Tenant-scoped roles are supported when multi-tenancy is enabled — `requireRole` checks tenant roles when `tenantId` is in context, falls back to app-wide roles otherwise. Use `requireRole.global("superadmin")` to always check app-wide roles.
|
|
13
|
-
|
|
14
|
-
**Groups** are named user collections that grant roles additively. Effective roles = `directRoles ∪ groupBaselineRoles ∪ membershipRoles`. Groups are either app-wide (`tenantId: null`) or tenant-scoped — tenant group roles never satisfy `requireRole.global`. Enable managed REST endpoints via `groups: { managementRoutes: true }` in config.
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
## Running without Redis
|
|
2
|
-
|
|
3
|
-
Set `db.redis: false` and `db.sessions: "mongo"` to run the entire auth flow on MongoDB only. Sessions, OAuth state, and response caching (when `store: "mongo"`) all work without Redis. The only feature that still requires Redis is BullMQ queues.
|
|
4
|
-
|
|
5
|
-
```ts
|
|
6
|
-
await createServer({
|
|
7
|
-
db: {
|
|
8
|
-
mongo: "single",
|
|
9
|
-
redis: false,
|
|
10
|
-
sessions: "mongo", // sessions + OAuth state → MongoDB
|
|
11
|
-
cache: "mongo", // or omit cacheResponse entirely if not using it
|
|
12
|
-
},
|
|
13
|
-
});
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
Redis key namespacing: when Redis is used, all keys are prefixed with `appName` (`session:{appName}:{sessionId}`, `usersessions:{appName}:{userId}`, `oauth:{appName}:state:{state}`, `cache:{appName}:{key}`) so multiple apps sharing one Redis instance never collide.
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
## Running without Redis or MongoDB
|
|
2
|
-
|
|
3
|
-
Two lightweight options for local dev, tests, or small projects with no external services:
|
|
4
|
-
|
|
5
|
-
### SQLite — persisted to disk
|
|
6
|
-
|
|
7
|
-
Uses `bun:sqlite` (built into Bun, zero npm deps). A single `.db` file holds all users, sessions, OAuth state, and cache.
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
await createServer({
|
|
11
|
-
routesDir: import.meta.dir + "/routes",
|
|
12
|
-
app: { name: "My App", version: "1.0.0" },
|
|
13
|
-
db: {
|
|
14
|
-
auth: "sqlite",
|
|
15
|
-
sqlite: import.meta.dir + "/../data.db", // created automatically on first run
|
|
16
|
-
mongo: false,
|
|
17
|
-
redis: false,
|
|
18
|
-
sessions: "sqlite",
|
|
19
|
-
cache: "sqlite",
|
|
20
|
-
},
|
|
21
|
-
});
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
#### Optional: periodic cleanup of expired rows
|
|
25
|
-
|
|
26
|
-
Expired rows are filtered out lazily on read. For long-running servers, sweep them periodically:
|
|
27
|
-
|
|
28
|
-
```ts
|
|
29
|
-
import { startSqliteCleanup } from "@lastshotlabs/bunshot";
|
|
30
|
-
|
|
31
|
-
startSqliteCleanup(); // default: every hour
|
|
32
|
-
startSqliteCleanup(5 * 60_000); // custom interval (ms)
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
### Memory — ephemeral, great for tests
|
|
36
|
-
|
|
37
|
-
Pure in-memory Maps. No files, no external services. All state is lost on process restart.
|
|
38
|
-
|
|
39
|
-
```ts
|
|
40
|
-
import { createServer, clearMemoryStore } from "@lastshotlabs/bunshot";
|
|
41
|
-
|
|
42
|
-
await createServer({
|
|
43
|
-
routesDir: import.meta.dir + "/routes",
|
|
44
|
-
app: { name: "My App", version: "1.0.0" },
|
|
45
|
-
db: {
|
|
46
|
-
auth: "memory",
|
|
47
|
-
mongo: false,
|
|
48
|
-
redis: false,
|
|
49
|
-
sessions: "memory",
|
|
50
|
-
cache: "memory",
|
|
51
|
-
},
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
// In tests — reset all state between test cases:
|
|
55
|
-
clearMemoryStore();
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### Limitations (both sqlite and memory)
|
|
59
|
-
|
|
60
|
-
- BullMQ queues still require Redis
|
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
## Unified HMAC Signing (`security.signing`)
|
|
2
|
-
|
|
3
|
-
A single `security.signing` config block enables six HMAC-based security features. All features are opt-in — disable the whole block or any individual feature to keep existing behavior.
|
|
4
|
-
|
|
5
|
-
### Configuration
|
|
6
|
-
|
|
7
|
-
```ts
|
|
8
|
-
createApp({
|
|
9
|
-
security: {
|
|
10
|
-
signing: {
|
|
11
|
-
// HMAC secret. Defaults to JWT_SECRET_DEV/PROD env var if omitted.
|
|
12
|
-
// Pass string[] for key rotation — first element signs, all elements verify.
|
|
13
|
-
secret: process.env.HMAC_SECRET,
|
|
14
|
-
|
|
15
|
-
cookies: true, // Sign/verify cookies set via signCookieValue()
|
|
16
|
-
cursors: true, // HMAC-sign pagination cursors
|
|
17
|
-
presignedUrls: { // Stateless HMAC presigned download URLs
|
|
18
|
-
defaultExpiry: 3600, // seconds, default 3600
|
|
19
|
-
},
|
|
20
|
-
requestSigning: { // Require clients to HMAC-sign requests
|
|
21
|
-
tolerance: 300_000, // ms, default 5 min
|
|
22
|
-
header: "x-signature",
|
|
23
|
-
timestampHeader: "x-timestamp",
|
|
24
|
-
},
|
|
25
|
-
idempotencyKeys: true, // HMAC-hash idempotency keys before storage
|
|
26
|
-
sessionBinding: { // Bind sessions to client fingerprint
|
|
27
|
-
fields: ["ip", "ua"], // default: ["ip", "ua"]
|
|
28
|
-
onMismatch: "reject", // "unauthenticate" | "reject" | "log-only"
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
},
|
|
32
|
-
});
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
### Secret & Key Rotation
|
|
36
|
-
|
|
37
|
-
Secret resolution order: `signing.secret` → `JWT_SECRET_DEV/PROD` env var (same as CSRF and JWT).
|
|
38
|
-
|
|
39
|
-
To rotate keys without breaking in-flight tokens, pass an array — **newest key first**:
|
|
40
|
-
|
|
41
|
-
```ts
|
|
42
|
-
secret: [process.env.HMAC_SECRET_NEW!, process.env.HMAC_SECRET_OLD!]
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
All verification attempts try each key in order; signing always uses the first.
|
|
46
|
-
|
|
47
|
-
---
|
|
48
|
-
|
|
49
|
-
### Feature 1: Signed Cookie Values
|
|
50
|
-
|
|
51
|
-
```ts
|
|
52
|
-
import { signCookieValue, verifyCookieValue } from "@lastshotlabs/bunshot";
|
|
53
|
-
|
|
54
|
-
// Sign before setting a cookie
|
|
55
|
-
const signed = signCookieValue(userId, secret); // "b64value.hmac"
|
|
56
|
-
setCookie(c, "session_hint", signed);
|
|
57
|
-
|
|
58
|
-
// Verify when reading
|
|
59
|
-
const raw = verifyCookieValue(getCookie(c, "session_hint") ?? "", secret);
|
|
60
|
-
// null if tampered or missing
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
When `signing.cookies: false`, the helpers are still exported — they pass through values without signing (with a console warning).
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
### Feature 2: Request Signing (`requireSignedRequest`)
|
|
68
|
-
|
|
69
|
-
Requires clients to HMAC-sign a canonical string of the request:
|
|
70
|
-
|
|
71
|
-
```
|
|
72
|
-
METHOD\nPATH\nCANONICAL_QUERY\nTIMESTAMP\nBODY
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
Query params are sorted and percent-encoding normalized (`%20` and `+` both become `%20`) before signing.
|
|
76
|
-
|
|
77
|
-
```ts
|
|
78
|
-
import { requireSignedRequest } from "@lastshotlabs/bunshot";
|
|
79
|
-
|
|
80
|
-
// Mount on specific routes that need signing
|
|
81
|
-
router.use("/webhooks/internal", requireSignedRequest());
|
|
82
|
-
|
|
83
|
-
// Or override defaults per-route
|
|
84
|
-
router.use("/admin/*", requireSignedRequest({ tolerance: 60_000 }));
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
Returns `401 { code: "INVALID_SIGNATURE" | "EXPIRED_TIMESTAMP" }` on failure.
|
|
88
|
-
|
|
89
|
-
When `signing.requestSigning: false`, the middleware is a no-op.
|
|
90
|
-
|
|
91
|
-
---
|
|
92
|
-
|
|
93
|
-
### Feature 3: Idempotency (`idempotent`)
|
|
94
|
-
|
|
95
|
-
Deduplicates requests using the `Idempotency-Key` header. The second identical request returns the cached first response without re-executing the handler.
|
|
96
|
-
|
|
97
|
-
```ts
|
|
98
|
-
import { idempotent } from "@lastshotlabs/bunshot";
|
|
99
|
-
|
|
100
|
-
router.use("/payments", idempotent({ ttl: 86400 }));
|
|
101
|
-
router.post("/payments", async (c) => {
|
|
102
|
-
// Safe to retry — second call returns cached 201
|
|
103
|
-
const result = await processPayment(c.req.valid("json"));
|
|
104
|
-
return c.json(result, 201);
|
|
105
|
-
});
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
Store key: `userId:key` (authenticated) or `anon:key` (unauthenticated). When `signing.idempotencyKeys: true`, keys are HMAC'd before storage to prevent enumeration.
|
|
109
|
-
|
|
110
|
-
**Race condition handling**: Two concurrent identical requests both miss the cache. The second writer detects the collision (Redis `SET NX`, Mongo duplicate key, SQLite `INSERT OR IGNORE`) and falls back to the first-stored result — never a 500.
|
|
111
|
-
|
|
112
|
-
Configure the store via `setIdempotencyStore("redis" | "mongo" | "sqlite" | "memory")`. Default: `"redis"`.
|
|
113
|
-
|
|
114
|
-
---
|
|
115
|
-
|
|
116
|
-
### Feature 4: Signed Cursors
|
|
117
|
-
|
|
118
|
-
When `signing.cursors: true`, `parseCursorParams()` verifies cursor signatures and `maybeSignCursor()` signs outgoing cursors. Tampered cursors are rejected with an invalid cursor flag.
|
|
119
|
-
|
|
120
|
-
```ts
|
|
121
|
-
import { parseCursorParams, maybeSignCursor } from "@lastshotlabs/bunshot";
|
|
122
|
-
|
|
123
|
-
const { limit, cursor, invalidCursor } = parseCursorParams(c.req.query());
|
|
124
|
-
if (invalidCursor) return c.json({ error: "Invalid cursor" }, 400);
|
|
125
|
-
|
|
126
|
-
const items = await fetchPage({ limit, cursor });
|
|
127
|
-
const nextCursor = maybeSignCursor(items.length === limit ? items.at(-1)!.id : null);
|
|
128
|
-
return c.json({ items, nextCursor, hasMore: items.length === limit });
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
When off, cursors pass through unsigned (current behavior).
|
|
132
|
-
|
|
133
|
-
---
|
|
134
|
-
|
|
135
|
-
### Feature 5: Presigned URLs
|
|
136
|
-
|
|
137
|
-
Stateless HMAC-signed download URLs — no database lookup required.
|
|
138
|
-
|
|
139
|
-
```ts
|
|
140
|
-
import { createPresignedUrl, verifyPresignedUrl } from "@lastshotlabs/bunshot";
|
|
141
|
-
|
|
142
|
-
// Generate (e.g. in a GET /uploads/presign/:key route)
|
|
143
|
-
const url = createPresignedUrl(
|
|
144
|
-
"https://api.example.com/uploads/download/",
|
|
145
|
-
"avatars/user123.jpg",
|
|
146
|
-
{ method: "GET", expiry: 3600 },
|
|
147
|
-
secret
|
|
148
|
-
);
|
|
149
|
-
// → "https://api.example.com/uploads/download/?key=avatars%2F...&exp=...&method=GET&sig=..."
|
|
150
|
-
|
|
151
|
-
// Verify (e.g. in the download handler)
|
|
152
|
-
const result = verifyPresignedUrl(url, "GET", secret);
|
|
153
|
-
// null if expired, tampered, or wrong method
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
The built-in upload router (`presignedUrls: true`) automatically serves HMAC presigned URLs at `GET /uploads/presign/:key` when `signing.presignedUrls` is enabled. Falls back to `adapter.presignGet()` (S3) otherwise.
|
|
157
|
-
|
|
158
|
-
---
|
|
159
|
-
|
|
160
|
-
### Feature 6: Session Binding
|
|
161
|
-
|
|
162
|
-
Binds sessions to the client's HTTP fingerprint (IP + User-Agent by default). Mismatches indicate session hijacking or IP change.
|
|
163
|
-
|
|
164
|
-
```ts
|
|
165
|
-
sessionBinding: {
|
|
166
|
-
fields: ["ip", "ua"], // fingerprint components
|
|
167
|
-
onMismatch: "reject", // strict — 401 on mismatch
|
|
168
|
-
}
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
| `onMismatch` | Behavior |
|
|
172
|
-
|---|---|
|
|
173
|
-
| `"unauthenticate"` (default) | Treat as logged-out; continue request unauthenticated |
|
|
174
|
-
| `"reject"` | Return `401 { code: "FINGERPRINT_MISMATCH" }` |
|
|
175
|
-
| `"log-only"` | Allow through but log the mismatch (useful during rollout) |
|
|
176
|
-
|
|
177
|
-
The fingerprint is stored lazily on the first authenticated request after login. Subsequent requests compare the current fingerprint to the stored one.
|
|
178
|
-
|
|
179
|
-
---
|
|
180
|
-
|
|
181
|
-
### "HMAC off" behavior per feature
|
|
182
|
-
|
|
183
|
-
| Feature | HMAC on | HMAC off |
|
|
184
|
-
|---|---|---|
|
|
185
|
-
| Signed cookies | `signCookieValue` / `verifyCookieValue` sign/verify | Pass-through (identity functions with warning) |
|
|
186
|
-
| Request signing | `requireSignedRequest` validates HMAC | Middleware is a no-op |
|
|
187
|
-
| Idempotency keys | Key is HMAC'd before storage | Raw key stored (slight enumeration risk) |
|
|
188
|
-
| Signed cursors | `parseCursorParams` rejects invalid sigs | Cursors pass through unsigned |
|
|
189
|
-
| Presigned URLs | Stateless HMAC-signed URL | Falls back to `adapter.presignGet()` or 501 |
|
|
190
|
-
| Session binding | Fingerprint verified on each request | No fingerprint check |
|
|
191
|
-
|
|
192
|
-
---
|
|
193
|
-
|
|
194
|
-
### Low-level primitives
|
|
195
|
-
|
|
196
|
-
```ts
|
|
197
|
-
import { hmacSign, hmacVerify } from "@lastshotlabs/bunshot";
|
|
198
|
-
|
|
199
|
-
const sig = hmacSign("data", secret);
|
|
200
|
-
const ok = hmacVerify("data", sig, secret); // uses timingSafeEqual internally
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
`hmacVerify` always uses `timingSafeEqual` — never `===` — to prevent timing side-channel attacks.
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
## Stack
|
|
2
|
-
|
|
3
|
-
- **Runtime**: [Bun](https://bun.sh)
|
|
4
|
-
- **Framework**: [Hono](https://hono.dev) + [@hono/zod-openapi](https://github.com/honojs/middleware/tree/main/packages/zod-openapi)
|
|
5
|
-
- **Docs UI**: [Scalar](https://scalar.com)
|
|
6
|
-
- **Data / Auth**: MongoDB, SQLite, or in-memory — configurable via `db.auth` (default: MongoDB via [Mongoose](https://mongoosejs.com))
|
|
7
|
-
- **Cache / Sessions**: Redis, MongoDB, SQLite, or in-memory — configurable via `db.sessions` / `db.cache` (default: Redis via [ioredis](https://github.com/redis/ioredis))
|
|
8
|
-
- **Auth**: JWT via [jose](https://github.com/panva/jose), HttpOnly cookies + `x-user-token` header
|
|
9
|
-
- **Queues**: [BullMQ](https://docs.bullmq.io) (requires Redis with `noeviction` policy)
|
|
10
|
-
- **Validation**: [Zod v4](https://zod.dev)
|