@lastshotlabs/bunshot 0.0.25 → 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/packages/bunshot-auth/src/lib/breachedPassword.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/lib/breachedPassword.js +61 -0
- 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/packages/bunshot-auth/src/lib/logger.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/lib/logger.js +13 -0
- package/dist/packages/bunshot-auth/src/lib/m2m.d.ts +30 -0
- package/dist/packages/bunshot-auth/src/lib/m2m.js +44 -0
- 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/packages/bunshot-auth/src/lib/scim.d.ts +44 -0
- package/dist/packages/bunshot-auth/src/lib/scim.js +56 -0
- 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/packages/bunshot-auth/src/lib/suspension.d.ts +14 -0
- package/dist/packages/bunshot-auth/src/lib/suspension.js +20 -0
- 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 -7
- 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/packages/bunshot-auth/src/middleware/requireScope.d.ts +10 -0
- package/dist/packages/bunshot-auth/src/middleware/requireScope.js +25 -0
- package/dist/packages/bunshot-auth/src/middleware/requireStepUp.d.ts +18 -0
- package/dist/packages/bunshot-auth/src/middleware/requireStepUp.js +30 -0
- 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 +19 -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/packages/bunshot-auth/src/models/M2MClient.d.ts +18 -0
- package/dist/packages/bunshot-auth/src/models/M2MClient.js +18 -0
- 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/packages/bunshot-core/src/captcha.d.ts +16 -0
- 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/packages/bunshot-core/src/errors.d.ts +13 -0
- package/dist/packages/bunshot-core/src/errors.js +22 -0
- 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 +23 -8
- 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/src/framework/lib/captcha.js +40 -0
- 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 +14 -9
- 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/src/framework/middleware/captcha.d.ts +9 -0
- package/dist/src/framework/middleware/captcha.js +37 -0
- package/dist/{middleware → src/framework/middleware}/errorHandler.d.ts +1 -1
- package/dist/src/framework/middleware/errorHandler.js +16 -0
- 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 -19
- 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 -11
- 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/src/framework/routes/jobs.js +315 -0
- package/dist/src/framework/routes/metrics.d.ts +10 -0
- package/dist/src/framework/routes/metrics.js +57 -0
- package/dist/src/framework/routes/uploads.d.ts +14 -0
- 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/src/lib/authConfig.js +179 -0
- package/dist/{lib → src/lib}/context.d.ts +6 -7
- 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 +40 -10
- package/dist/src/testing.d.ts +34 -0
- package/dist/src/testing.js +93 -0
- package/package.json +62 -25
- package/dist/adapters/memoryAuth.d.ts +0 -46
- package/dist/adapters/memoryAuth.js +0 -634
- 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 -307
- package/dist/adapters/sqliteAuth.d.ts +0 -49
- package/dist/adapters/sqliteAuth.js +0 -707
- package/dist/app.d.ts +0 -456
- package/dist/app.js +0 -548
- 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 -98
- package/dist/index.js +0 -77
- package/dist/lib/HttpError.d.ts +0 -9
- package/dist/lib/HttpError.js +0 -14
- package/dist/lib/appConfig.d.ts +0 -162
- package/dist/lib/appConfig.js +0 -83
- package/dist/lib/auditLog.d.ts +0 -52
- package/dist/lib/auditLog.js +0 -201
- package/dist/lib/authAdapter.d.ts +0 -176
- package/dist/lib/authAdapter.js +0 -7
- package/dist/lib/authRateLimit.d.ts +0 -13
- package/dist/lib/authRateLimit.js +0 -81
- package/dist/lib/clientIp.d.ts +0 -14
- 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 -13
- package/dist/lib/emailVerification.js +0 -86
- package/dist/lib/fingerprint.js +0 -36
- package/dist/lib/idempotency.js +0 -182
- package/dist/lib/jwt.d.ts +0 -2
- package/dist/lib/jwt.js +0 -24
- package/dist/lib/logger.d.ts +0 -1
- package/dist/lib/logger.js +0 -7
- package/dist/lib/metrics.d.ts +0 -14
- package/dist/lib/mfaChallenge.d.ts +0 -42
- package/dist/lib/mfaChallenge.js +0 -293
- 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 -90
- 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 -91
- package/dist/lib/roles.d.ts +0 -7
- package/dist/lib/roles.js +0 -49
- package/dist/lib/session.d.ts +0 -39
- package/dist/lib/session.js +0 -535
- package/dist/lib/tenant.d.ts +0 -15
- package/dist/lib/tenant.js +0 -65
- package/dist/lib/upload.js +0 -87
- package/dist/lib/ws.d.ts +0 -22
- package/dist/lib/ws.js +0 -89
- 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/csrf.js +0 -125
- package/dist/middleware/errorHandler.js +0 -13
- package/dist/middleware/identify.d.ts +0 -3
- package/dist/middleware/identify.js +0 -95
- 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/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 -48
- 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 -11
- package/dist/routes/auth.js +0 -605
- 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/jobs.js +0 -272
- package/dist/routes/metrics.d.ts +0 -7
- package/dist/routes/metrics.js +0 -52
- package/dist/routes/mfa.d.ts +0 -5
- package/dist/routes/mfa.js +0 -620
- package/dist/routes/oauth.d.ts +0 -2
- package/dist/routes/oauth.js +0 -514
- package/dist/routes/uploads.d.ts +0 -2
- package/dist/routes/uploads.js +0 -135
- 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 -27
- package/dist/services/auth.js +0 -159
- package/dist/ws/index.d.ts +0 -10
- package/dist/ws/index.js +0 -38
- 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 -779
- package/docs/sections/auth-flow/overview.md +0 -10
- package/docs/sections/auth-security-examples/full.md +0 -365
- 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 -127
- 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/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 -199
- package/docs/sections/versioning/full.md +0 -85
- package/docs/sections/webhook-auth/full.md +0 -100
- package/docs/sections/websocket/full.md +0 -184
- 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-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
package/dist/lib/wsPresence.js
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
// ---------------------------------------------------------------------------
|
|
2
|
-
// State (in-memory only)
|
|
3
|
-
// ---------------------------------------------------------------------------
|
|
4
|
-
/** socketId → userId (authenticated sockets only) */
|
|
5
|
-
const _socketUsers = new Map();
|
|
6
|
-
/** room → userId → Set<socketId> (multi-tab aware) */
|
|
7
|
-
const _roomPresence = new Map();
|
|
8
|
-
// ---------------------------------------------------------------------------
|
|
9
|
-
// Public API
|
|
10
|
-
// ---------------------------------------------------------------------------
|
|
11
|
-
/** Track an authenticated socket. Skips if userId is null/undefined. */
|
|
12
|
-
export const trackSocket = (socketId, userId) => {
|
|
13
|
-
if (!userId)
|
|
14
|
-
return;
|
|
15
|
-
_socketUsers.set(socketId, userId);
|
|
16
|
-
};
|
|
17
|
-
/** Untrack a socket on disconnect. */
|
|
18
|
-
export const untrackSocket = (socketId) => {
|
|
19
|
-
_socketUsers.delete(socketId);
|
|
20
|
-
};
|
|
21
|
-
/** Called when a socket subscribes to a room. Returns join info or null if unauthenticated. */
|
|
22
|
-
export const addPresence = (socketId, room) => {
|
|
23
|
-
const userId = _socketUsers.get(socketId);
|
|
24
|
-
if (!userId)
|
|
25
|
-
return null;
|
|
26
|
-
if (!_roomPresence.has(room))
|
|
27
|
-
_roomPresence.set(room, new Map());
|
|
28
|
-
const roomMap = _roomPresence.get(room);
|
|
29
|
-
const isNewUser = !roomMap.has(userId) || roomMap.get(userId).size === 0;
|
|
30
|
-
if (!roomMap.has(userId))
|
|
31
|
-
roomMap.set(userId, new Set());
|
|
32
|
-
roomMap.get(userId).add(socketId);
|
|
33
|
-
return { userId, isNewUser };
|
|
34
|
-
};
|
|
35
|
-
/** Called when a socket unsubscribes from a room. Returns leave info or null if unauthenticated. */
|
|
36
|
-
export const removePresence = (socketId, room) => {
|
|
37
|
-
const userId = _socketUsers.get(socketId);
|
|
38
|
-
if (!userId)
|
|
39
|
-
return null;
|
|
40
|
-
const roomMap = _roomPresence.get(room);
|
|
41
|
-
if (!roomMap)
|
|
42
|
-
return null;
|
|
43
|
-
const sockets = roomMap.get(userId);
|
|
44
|
-
if (!sockets)
|
|
45
|
-
return null;
|
|
46
|
-
sockets.delete(socketId);
|
|
47
|
-
const isLastSocket = sockets.size === 0;
|
|
48
|
-
if (isLastSocket) {
|
|
49
|
-
roomMap.delete(userId);
|
|
50
|
-
if (roomMap.size === 0)
|
|
51
|
-
_roomPresence.delete(room);
|
|
52
|
-
}
|
|
53
|
-
return { userId, isLastSocket };
|
|
54
|
-
};
|
|
55
|
-
/** Called on disconnect — cleans up all rooms for a socket. Returns rooms where user fully departed. */
|
|
56
|
-
export const cleanupPresence = (socketId, rooms) => {
|
|
57
|
-
const userId = _socketUsers.get(socketId);
|
|
58
|
-
if (!userId)
|
|
59
|
-
return [];
|
|
60
|
-
const departed = [];
|
|
61
|
-
for (const room of rooms) {
|
|
62
|
-
const roomMap = _roomPresence.get(room);
|
|
63
|
-
if (!roomMap)
|
|
64
|
-
continue;
|
|
65
|
-
const sockets = roomMap.get(userId);
|
|
66
|
-
if (!sockets)
|
|
67
|
-
continue;
|
|
68
|
-
sockets.delete(socketId);
|
|
69
|
-
if (sockets.size === 0) {
|
|
70
|
-
roomMap.delete(userId);
|
|
71
|
-
if (roomMap.size === 0)
|
|
72
|
-
_roomPresence.delete(room);
|
|
73
|
-
departed.push({ room, userId });
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return departed;
|
|
77
|
-
};
|
|
78
|
-
/** Deduplicated userIds present in a room. */
|
|
79
|
-
export const getRoomPresence = (room) => {
|
|
80
|
-
const roomMap = _roomPresence.get(room);
|
|
81
|
-
if (!roomMap)
|
|
82
|
-
return [];
|
|
83
|
-
return [...roomMap.keys()];
|
|
84
|
-
};
|
|
85
|
-
/** Rooms where a user is present. */
|
|
86
|
-
export const getUserPresence = (userId) => {
|
|
87
|
-
const rooms = [];
|
|
88
|
-
for (const [room, roomMap] of _roomPresence) {
|
|
89
|
-
const sockets = roomMap.get(userId);
|
|
90
|
-
if (sockets && sockets.size > 0)
|
|
91
|
-
rooms.push(room);
|
|
92
|
-
}
|
|
93
|
-
return rooms;
|
|
94
|
-
};
|
|
95
|
-
/** Reset all presence state. Useful for test isolation. */
|
|
96
|
-
export const clearPresenceStore = () => {
|
|
97
|
-
_socketUsers.clear();
|
|
98
|
-
_roomPresence.clear();
|
|
99
|
-
};
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { getClientIp } from "../lib/clientIp";
|
|
2
|
-
import { logAuditEntry } from "../lib/auditLog";
|
|
3
|
-
export const auditLog = (options) => async (c, next) => {
|
|
4
|
-
await next();
|
|
5
|
-
// Exclusion checks run after next() intentionally — c.res.status is only available
|
|
6
|
-
// after the route handler runs. The route still executes; we're only skipping the log write.
|
|
7
|
-
if (options.exclude?.methods?.includes(c.req.method))
|
|
8
|
-
return;
|
|
9
|
-
// Note: if exclude.paths grows large, regex evaluation on every request adds up.
|
|
10
|
-
// For high-traffic exclusions, prefer string matching over regex.
|
|
11
|
-
const path = c.req.path;
|
|
12
|
-
if (options.exclude?.paths?.some(p => typeof p === "string" ? p === path : p.test(path)))
|
|
13
|
-
return;
|
|
14
|
-
let entry = {
|
|
15
|
-
id: crypto.randomUUID(),
|
|
16
|
-
requestId: c.get("requestId") ?? undefined,
|
|
17
|
-
userId: c.get("authUserId") ?? null,
|
|
18
|
-
sessionId: c.get("sessionId") ?? null,
|
|
19
|
-
tenantId: c.get("tenantId") ?? null,
|
|
20
|
-
method: c.req.method,
|
|
21
|
-
path,
|
|
22
|
-
status: c.res.status,
|
|
23
|
-
ip: getClientIp(c),
|
|
24
|
-
userAgent: c.req.header("user-agent") ?? null,
|
|
25
|
-
createdAt: new Date().toISOString(),
|
|
26
|
-
};
|
|
27
|
-
if (options.onEntry) {
|
|
28
|
-
try {
|
|
29
|
-
entry = await options.onEntry(entry, c);
|
|
30
|
-
}
|
|
31
|
-
catch (err) {
|
|
32
|
-
console.error("[auditLog] onEntry hook threw:", err);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
// Fire-and-forget — never block the response; logAuditEntry also swallows errors internally
|
|
36
|
-
logAuditEntry(entry, options).catch(err => {
|
|
37
|
-
console.error("[auditLog] write failed:", err);
|
|
38
|
-
});
|
|
39
|
-
};
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { timingSafeEqual } from "../lib/crypto";
|
|
2
|
-
export const bearerAuth = async (c, next) => {
|
|
3
|
-
const isProd = process.env.NODE_ENV === "production";
|
|
4
|
-
const validToken = isProd ? process.env.BEARER_TOKEN_PROD : process.env.BEARER_TOKEN_DEV;
|
|
5
|
-
const header = c.req.header("Authorization");
|
|
6
|
-
const token = header?.startsWith("Bearer ") ? header.slice(7) : null;
|
|
7
|
-
if (!token || !validToken || !timingSafeEqual(token, validToken)) {
|
|
8
|
-
return c.json({ error: "Unauthorized" }, 401);
|
|
9
|
-
}
|
|
10
|
-
await next();
|
|
11
|
-
};
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { MiddlewareHandler } from "hono";
|
|
2
|
-
import type { AppEnv } from "../lib/context";
|
|
3
|
-
export declare function getCacheModel(): import("mongoose").Model<any, {}, {}, {}, any, any, any>;
|
|
4
|
-
type CacheStore = "redis" | "mongo" | "sqlite" | "memory";
|
|
5
|
-
export declare const setCacheStore: (store: CacheStore) => void;
|
|
6
|
-
export declare const bustCache: (key: string) => Promise<void>;
|
|
7
|
-
export declare const bustCachePattern: (pattern: string) => Promise<void>;
|
|
8
|
-
type KeyFn = (c: Parameters<MiddlewareHandler<any>>[0]) => string;
|
|
9
|
-
interface CacheOptions {
|
|
10
|
-
ttl?: number;
|
|
11
|
-
key: string | KeyFn;
|
|
12
|
-
store?: CacheStore;
|
|
13
|
-
}
|
|
14
|
-
export declare const cacheResponse: ({ ttl, key, store }: CacheOptions) => MiddlewareHandler<AppEnv>;
|
|
15
|
-
export {};
|
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
import { getRedis } from "../lib/redis";
|
|
2
|
-
import { getAppName } from "../lib/appConfig";
|
|
3
|
-
import { appConnection, mongoose } from "../lib/mongo";
|
|
4
|
-
import { isSqliteReady, sqliteGetCache, sqliteSetCache, sqliteDelCache, sqliteDelCachePattern } from "../adapters/sqliteAuth";
|
|
5
|
-
import { memoryGetCache, memorySetCache, memoryDelCache, memoryDelCachePattern } from "../adapters/memoryAuth";
|
|
6
|
-
export function getCacheModel() {
|
|
7
|
-
if (appConnection.models["CacheEntry"])
|
|
8
|
-
return appConnection.models["CacheEntry"];
|
|
9
|
-
const { Schema } = mongoose;
|
|
10
|
-
const cacheSchema = new Schema({
|
|
11
|
-
key: { type: String, required: true, unique: true },
|
|
12
|
-
value: { type: String, required: true },
|
|
13
|
-
expiresAt: { type: Date, index: { expireAfterSeconds: 0 } },
|
|
14
|
-
}, { collection: "cache_entries" });
|
|
15
|
-
return appConnection.model("CacheEntry", cacheSchema);
|
|
16
|
-
}
|
|
17
|
-
function isMongoReady() {
|
|
18
|
-
return appConnection.readyState === 1;
|
|
19
|
-
}
|
|
20
|
-
function isRedisReady() {
|
|
21
|
-
try {
|
|
22
|
-
getRedis();
|
|
23
|
-
return true;
|
|
24
|
-
}
|
|
25
|
-
catch {
|
|
26
|
-
return false;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
let _defaultCacheStore = "redis";
|
|
30
|
-
export const setCacheStore = (store) => { _defaultCacheStore = store; };
|
|
31
|
-
async function storeGet(store, cacheKey) {
|
|
32
|
-
if (store === "memory")
|
|
33
|
-
return memoryGetCache(cacheKey);
|
|
34
|
-
if (store === "sqlite") {
|
|
35
|
-
if (!isSqliteReady())
|
|
36
|
-
throw new Error(`cacheResponse: store is "sqlite" but SQLite is not initialized. Call setSqliteDb(path) or pass sqliteDb to createServer.`);
|
|
37
|
-
return sqliteGetCache(cacheKey);
|
|
38
|
-
}
|
|
39
|
-
if (store === "mongo") {
|
|
40
|
-
if (!isMongoReady())
|
|
41
|
-
throw new Error(`cacheResponse: store is "mongo" but appConnection is not connected. Ensure connectMongo() or connectAppMongo() is called before handling requests.`);
|
|
42
|
-
const doc = await getCacheModel().findOne({ key: cacheKey }, "value").lean();
|
|
43
|
-
return doc ? doc.value : null;
|
|
44
|
-
}
|
|
45
|
-
return getRedis().get(cacheKey);
|
|
46
|
-
}
|
|
47
|
-
async function storeSet(store, cacheKey, value, ttl) {
|
|
48
|
-
if (store === "memory") {
|
|
49
|
-
memorySetCache(cacheKey, value, ttl);
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
if (store === "sqlite") {
|
|
53
|
-
if (!isSqliteReady())
|
|
54
|
-
throw new Error(`cacheResponse: store is "sqlite" but SQLite is not initialized. Call setSqliteDb(path) or pass sqliteDb to createServer.`);
|
|
55
|
-
sqliteSetCache(cacheKey, value, ttl);
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
if (store === "mongo") {
|
|
59
|
-
if (!isMongoReady())
|
|
60
|
-
throw new Error(`cacheResponse: store is "mongo" but appConnection is not connected. Ensure connectMongo() or connectAppMongo() is called before handling requests.`);
|
|
61
|
-
const expiresAt = ttl ? new Date(Date.now() + ttl * 1000) : undefined;
|
|
62
|
-
await getCacheModel().updateOne({ key: cacheKey }, { $set: { value, ...(expiresAt ? { expiresAt } : {}) } }, { upsert: true });
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
if (ttl) {
|
|
66
|
-
await getRedis().setex(cacheKey, ttl, value);
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
await getRedis().set(cacheKey, value);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
async function storeDel(store, cacheKey) {
|
|
73
|
-
if (store === "memory") {
|
|
74
|
-
memoryDelCache(cacheKey);
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
if (store === "sqlite") {
|
|
78
|
-
if (!isSqliteReady())
|
|
79
|
-
return;
|
|
80
|
-
sqliteDelCache(cacheKey);
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
if (store === "mongo") {
|
|
84
|
-
if (!isMongoReady())
|
|
85
|
-
return;
|
|
86
|
-
await getCacheModel().deleteOne({ key: cacheKey });
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
if (!isRedisReady())
|
|
90
|
-
return;
|
|
91
|
-
await getRedis().del(cacheKey);
|
|
92
|
-
}
|
|
93
|
-
async function storeDelPattern(store, fullPattern) {
|
|
94
|
-
if (store === "memory") {
|
|
95
|
-
memoryDelCachePattern(fullPattern);
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
if (store === "sqlite") {
|
|
99
|
-
if (!isSqliteReady())
|
|
100
|
-
return;
|
|
101
|
-
sqliteDelCachePattern(fullPattern);
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
if (store === "mongo") {
|
|
105
|
-
if (!isMongoReady())
|
|
106
|
-
return;
|
|
107
|
-
// Escape all regex metacharacters in the full pattern (including the cache:{appName}: prefix,
|
|
108
|
-
// which may itself contain dots or other metacharacters). Then restore * as a glob wildcard.
|
|
109
|
-
// Order matters: escape first, then replace the now-escaped \* with .* for glob semantics.
|
|
110
|
-
const escaped = fullPattern.replace(/[.+?^${}()|[\]\\]/g, "\\$&");
|
|
111
|
-
const regex = new RegExp("^" + escaped.replace(/\*/g, ".*") + "$");
|
|
112
|
-
await getCacheModel().deleteMany({ key: regex });
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
if (!isRedisReady())
|
|
116
|
-
return;
|
|
117
|
-
const redis = getRedis();
|
|
118
|
-
let cursor = "0";
|
|
119
|
-
do {
|
|
120
|
-
const [next, keys] = await redis.scan(cursor, "MATCH", fullPattern, "COUNT", 100);
|
|
121
|
-
cursor = next;
|
|
122
|
-
if (keys.length > 0)
|
|
123
|
-
await redis.del(...keys);
|
|
124
|
-
} while (cursor !== "0");
|
|
125
|
-
}
|
|
126
|
-
// ---------------------------------------------------------------------------
|
|
127
|
-
// Public API
|
|
128
|
-
// ---------------------------------------------------------------------------
|
|
129
|
-
export const bustCache = async (key) => {
|
|
130
|
-
const cacheKey = `cache:${getAppName()}:${key}`;
|
|
131
|
-
await Promise.all([storeDel("redis", cacheKey), storeDel("mongo", cacheKey), storeDel("sqlite", cacheKey), storeDel("memory", cacheKey)]);
|
|
132
|
-
};
|
|
133
|
-
export const bustCachePattern = async (pattern) => {
|
|
134
|
-
const fullPattern = `cache:${getAppName()}:${pattern}`;
|
|
135
|
-
await Promise.all([storeDelPattern("redis", fullPattern), storeDelPattern("mongo", fullPattern), storeDelPattern("sqlite", fullPattern), storeDelPattern("memory", fullPattern)]);
|
|
136
|
-
};
|
|
137
|
-
/** Headers that must never be cached — storing these can cause session fixation or auth bypass. */
|
|
138
|
-
const UNCACHEABLE_HEADERS = new Set([
|
|
139
|
-
"set-cookie",
|
|
140
|
-
"www-authenticate",
|
|
141
|
-
"authorization",
|
|
142
|
-
"x-csrf-token",
|
|
143
|
-
"proxy-authenticate",
|
|
144
|
-
]);
|
|
145
|
-
export const cacheResponse = ({ ttl, key, store = _defaultCacheStore }) => {
|
|
146
|
-
return async (c, next) => {
|
|
147
|
-
const appName = getAppName();
|
|
148
|
-
const rawKey = typeof key === "function" ? key(c) : key;
|
|
149
|
-
// Per-tenant namespacing: prevents two tenants caching the same key from colliding
|
|
150
|
-
const tenantId = c.get("tenantId");
|
|
151
|
-
const tenantSegment = tenantId ? `${tenantId}:` : "";
|
|
152
|
-
const cacheKey = `cache:${appName}:${tenantSegment}${rawKey}`;
|
|
153
|
-
const cached = await storeGet(store, cacheKey);
|
|
154
|
-
if (cached) {
|
|
155
|
-
const { status, headers, body } = JSON.parse(cached);
|
|
156
|
-
return new Response(body, {
|
|
157
|
-
status,
|
|
158
|
-
headers: { ...headers, "x-cache": "HIT" },
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
await next();
|
|
162
|
-
const res = c.res;
|
|
163
|
-
if (res.status >= 200 && res.status < 300) {
|
|
164
|
-
const body = await res.text();
|
|
165
|
-
const headers = {};
|
|
166
|
-
res.headers.forEach((value, name) => {
|
|
167
|
-
if (!UNCACHEABLE_HEADERS.has(name.toLowerCase())) {
|
|
168
|
-
headers[name] = value;
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
|
-
await storeSet(store, cacheKey, JSON.stringify({ status: res.status, headers, body }), ttl);
|
|
172
|
-
c.res = new Response(body, {
|
|
173
|
-
status: res.status,
|
|
174
|
-
headers: { ...headers, "x-cache": "MISS" },
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
};
|
|
178
|
-
};
|
package/dist/middleware/csrf.js
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import { getCookie, setCookie, deleteCookie } from "hono/cookie";
|
|
2
|
-
import { timingSafeEqual } from "../lib/crypto";
|
|
3
|
-
import { COOKIE_TOKEN, COOKIE_CSRF_TOKEN, HEADER_CSRF_TOKEN } from "../lib/constants";
|
|
4
|
-
import { createHmac, randomBytes } from "crypto";
|
|
5
|
-
const isProd = process.env.NODE_ENV === "production";
|
|
6
|
-
const STATE_CHANGING_METHODS = new Set(["POST", "PUT", "PATCH", "DELETE"]);
|
|
7
|
-
function getJwtSecret() {
|
|
8
|
-
const secret = isProd ? process.env.JWT_SECRET_PROD : process.env.JWT_SECRET_DEV;
|
|
9
|
-
if (!secret)
|
|
10
|
-
throw new Error("CSRF middleware requires JWT_SECRET_DEV/JWT_SECRET_PROD to be set");
|
|
11
|
-
return secret;
|
|
12
|
-
}
|
|
13
|
-
function generateCsrfToken(secret) {
|
|
14
|
-
const token = randomBytes(32).toString("hex");
|
|
15
|
-
const sig = createHmac("sha256", secret).update(token).digest("hex");
|
|
16
|
-
return `${token}.${sig}`;
|
|
17
|
-
}
|
|
18
|
-
function verifyCsrfSignature(cookieValue, secret) {
|
|
19
|
-
const dotIdx = cookieValue.indexOf(".");
|
|
20
|
-
if (dotIdx === -1)
|
|
21
|
-
return false;
|
|
22
|
-
const token = cookieValue.substring(0, dotIdx);
|
|
23
|
-
const sig = cookieValue.substring(dotIdx + 1);
|
|
24
|
-
const expected = createHmac("sha256", secret).update(token).digest("hex");
|
|
25
|
-
return timingSafeEqual(sig, expected);
|
|
26
|
-
}
|
|
27
|
-
const csrfCookieOptions = {
|
|
28
|
-
httpOnly: false,
|
|
29
|
-
secure: isProd,
|
|
30
|
-
sameSite: "Lax",
|
|
31
|
-
path: "/",
|
|
32
|
-
maxAge: 60 * 60 * 24 * 365, // 1 year — tied to browser, not session
|
|
33
|
-
};
|
|
34
|
-
/**
|
|
35
|
-
* Refreshes the CSRF token cookie — call on login/register to prevent
|
|
36
|
-
* session fixation-adjacent attacks.
|
|
37
|
-
*/
|
|
38
|
-
export function refreshCsrfToken(c) {
|
|
39
|
-
const secret = getJwtSecret();
|
|
40
|
-
const token = generateCsrfToken(secret);
|
|
41
|
-
setCookie(c, COOKIE_CSRF_TOKEN, token, csrfCookieOptions);
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Clears the CSRF token cookie — call on logout.
|
|
45
|
-
*/
|
|
46
|
-
export function clearCsrfToken(c) {
|
|
47
|
-
deleteCookie(c, COOKIE_CSRF_TOKEN, { path: "/" });
|
|
48
|
-
}
|
|
49
|
-
export const csrfProtection = (options = {}) => {
|
|
50
|
-
const { exemptPaths = [], checkOrigin = true, allowedOrigins } = options;
|
|
51
|
-
// Normalize allowed origins for origin validation
|
|
52
|
-
const originSet = new Set();
|
|
53
|
-
if (allowedOrigins) {
|
|
54
|
-
const origins = Array.isArray(allowedOrigins) ? allowedOrigins : [allowedOrigins];
|
|
55
|
-
for (const o of origins) {
|
|
56
|
-
// "*" is intentionally excluded: validating against a wildcard would accept any origin,
|
|
57
|
-
// defeating the check. When CORS is open, origin validation is meaningless.
|
|
58
|
-
if (o !== "*")
|
|
59
|
-
originSet.add(o.replace(/\/$/, ""));
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
if (checkOrigin && originSet.size === 0) {
|
|
63
|
-
// Warn in all environments — this is a one-time startup message, not per-request noise,
|
|
64
|
-
// and a misconfigured production deployment should surface it.
|
|
65
|
-
console.warn("[bunshot] csrfProtection: checkOrigin is enabled but no specific allowed origins are " +
|
|
66
|
-
"configured (CORS is \"*\" or allowedOrigins is unset). Origin validation is disabled — " +
|
|
67
|
-
"only the HMAC double-submit cookie check is active. Set security.cors to specific " +
|
|
68
|
-
"origins to enable origin validation.");
|
|
69
|
-
}
|
|
70
|
-
return async (c, next) => {
|
|
71
|
-
const secret = getJwtSecret();
|
|
72
|
-
// Set CSRF cookie on every response if not already present
|
|
73
|
-
const existingCsrf = getCookie(c, COOKIE_CSRF_TOKEN);
|
|
74
|
-
if (!existingCsrf) {
|
|
75
|
-
const token = generateCsrfToken(secret);
|
|
76
|
-
setCookie(c, COOKIE_CSRF_TOKEN, token, csrfCookieOptions);
|
|
77
|
-
}
|
|
78
|
-
// Only validate state-changing methods
|
|
79
|
-
if (!STATE_CHANGING_METHODS.has(c.req.method)) {
|
|
80
|
-
return next();
|
|
81
|
-
}
|
|
82
|
-
// Skip if no auth cookie present — not vulnerable to CSRF
|
|
83
|
-
const authCookie = getCookie(c, COOKIE_TOKEN);
|
|
84
|
-
if (!authCookie) {
|
|
85
|
-
return next();
|
|
86
|
-
}
|
|
87
|
-
// Skip exempt paths
|
|
88
|
-
const path = c.req.path;
|
|
89
|
-
for (const exempt of exemptPaths) {
|
|
90
|
-
if (exempt.endsWith("*")) {
|
|
91
|
-
if (path.startsWith(exempt.slice(0, -1)))
|
|
92
|
-
return next();
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
if (path === exempt)
|
|
96
|
-
return next();
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
// Origin validation (secondary layer)
|
|
100
|
-
if (checkOrigin && originSet.size > 0) {
|
|
101
|
-
const origin = c.req.header("origin");
|
|
102
|
-
if (origin) {
|
|
103
|
-
const normalized = origin.replace(/\/$/, "");
|
|
104
|
-
if (!originSet.has(normalized)) {
|
|
105
|
-
return c.json({ error: "CSRF origin mismatch" }, 403);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
// Double submit cookie validation
|
|
110
|
-
const csrfCookie = getCookie(c, COOKIE_CSRF_TOKEN);
|
|
111
|
-
const csrfHeader = c.req.header(HEADER_CSRF_TOKEN);
|
|
112
|
-
if (!csrfCookie || !csrfHeader) {
|
|
113
|
-
return c.json({ error: "CSRF token missing" }, 403);
|
|
114
|
-
}
|
|
115
|
-
// Verify the cookie's HMAC signature (prevents cookie injection)
|
|
116
|
-
if (!verifyCsrfSignature(csrfCookie, secret)) {
|
|
117
|
-
return c.json({ error: "CSRF token invalid" }, 403);
|
|
118
|
-
}
|
|
119
|
-
// Compare header value to cookie value
|
|
120
|
-
if (!timingSafeEqual(csrfHeader, csrfCookie)) {
|
|
121
|
-
return c.json({ error: "CSRF token mismatch" }, 403);
|
|
122
|
-
}
|
|
123
|
-
return next();
|
|
124
|
-
};
|
|
125
|
-
};
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { HttpError } from "../lib/HttpError";
|
|
2
|
-
export const errorHandler = async (req, next) => {
|
|
3
|
-
try {
|
|
4
|
-
return await next(req);
|
|
5
|
-
}
|
|
6
|
-
catch (err) {
|
|
7
|
-
console.error(err);
|
|
8
|
-
if (err instanceof HttpError) {
|
|
9
|
-
return Response.json({ error: err.message }, { status: err.status });
|
|
10
|
-
}
|
|
11
|
-
return Response.json({ error: "Internal Server Error" }, { status: 500 });
|
|
12
|
-
}
|
|
13
|
-
};
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { getCookie } from "hono/cookie";
|
|
2
|
-
import { verifyToken } from "../lib/jwt";
|
|
3
|
-
import { getSession, updateSessionLastActive, getSessionFingerprint, setSessionFingerprint } from "../lib/session";
|
|
4
|
-
import { COOKIE_TOKEN, HEADER_USER_TOKEN } from "../lib/constants";
|
|
5
|
-
import { log } from "../lib/logger";
|
|
6
|
-
import { getTrackLastActive, getSigningConfig } from "../lib/appConfig";
|
|
7
|
-
import { getClientIp } from "../lib/clientIp";
|
|
8
|
-
import { sha256 } from "../lib/crypto";
|
|
9
|
-
function computeFingerprint(c, fields) {
|
|
10
|
-
const parts = fields.map((f) => {
|
|
11
|
-
if (f === "ip")
|
|
12
|
-
return getClientIp(c) ?? "";
|
|
13
|
-
if (f === "ua")
|
|
14
|
-
return c.req.header("user-agent") ?? "";
|
|
15
|
-
return c.req.header("accept-language") ?? "";
|
|
16
|
-
});
|
|
17
|
-
return sha256(parts.join(":"));
|
|
18
|
-
}
|
|
19
|
-
export const identify = async (c, next) => {
|
|
20
|
-
c.set("authUserId", null);
|
|
21
|
-
c.set("roles", null);
|
|
22
|
-
c.set("sessionId", null);
|
|
23
|
-
// cookie for browsers, x-user-token header for non-browser clients
|
|
24
|
-
const token = getCookie(c, COOKIE_TOKEN) ?? c.req.header(HEADER_USER_TOKEN) ?? null;
|
|
25
|
-
log(`[identify] token=${token ? "present" : "absent"}`);
|
|
26
|
-
if (token) {
|
|
27
|
-
try {
|
|
28
|
-
const payload = await verifyToken(token);
|
|
29
|
-
const sessionId = payload.sid;
|
|
30
|
-
if (!sessionId) {
|
|
31
|
-
log("[identify] token missing sid claim — unauthenticated");
|
|
32
|
-
}
|
|
33
|
-
else {
|
|
34
|
-
const stored = await getSession(sessionId);
|
|
35
|
-
log(`[identify] token for authUserId=${payload.sub} verified, checking session...`);
|
|
36
|
-
if (stored === token) {
|
|
37
|
-
const signingCfg = getSigningConfig();
|
|
38
|
-
const bindingCfg = signingCfg?.sessionBinding;
|
|
39
|
-
if (bindingCfg) {
|
|
40
|
-
const bindingOpts = typeof bindingCfg === "object" ? bindingCfg : {};
|
|
41
|
-
const fields = bindingOpts.fields ?? ["ip", "ua"];
|
|
42
|
-
const onMismatch = bindingOpts.onMismatch ?? "unauthenticate";
|
|
43
|
-
const current = computeFingerprint(c, fields);
|
|
44
|
-
const storedFp = await getSessionFingerprint(sessionId);
|
|
45
|
-
if (storedFp === null) {
|
|
46
|
-
// First authenticated request — store the fingerprint
|
|
47
|
-
setSessionFingerprint(sessionId, current).catch(() => {
|
|
48
|
-
log(`[identify] failed to store fingerprint for sessionId=${sessionId}`);
|
|
49
|
-
});
|
|
50
|
-
c.set("authUserId", payload.sub);
|
|
51
|
-
c.set("sessionId", sessionId);
|
|
52
|
-
}
|
|
53
|
-
else if (storedFp === current) {
|
|
54
|
-
c.set("authUserId", payload.sub);
|
|
55
|
-
c.set("sessionId", sessionId);
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
log(`[identify] fingerprint mismatch for sessionId=${sessionId} onMismatch=${onMismatch}`);
|
|
59
|
-
if (onMismatch === "reject") {
|
|
60
|
-
return c.json({ error: "Unauthorized", code: "FINGERPRINT_MISMATCH" }, 401);
|
|
61
|
-
}
|
|
62
|
-
else if (onMismatch === "log-only") {
|
|
63
|
-
c.set("authUserId", payload.sub);
|
|
64
|
-
c.set("sessionId", sessionId);
|
|
65
|
-
}
|
|
66
|
-
// onMismatch === "unauthenticate" — leave authUserId null (already null)
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
c.set("authUserId", payload.sub);
|
|
71
|
-
c.set("sessionId", sessionId);
|
|
72
|
-
}
|
|
73
|
-
if (c.get("authUserId")) {
|
|
74
|
-
log(`[identify] authUserId=${payload.sub} sessionId=${sessionId}`);
|
|
75
|
-
if (getTrackLastActive()) {
|
|
76
|
-
updateSessionLastActive(sessionId).catch(() => {
|
|
77
|
-
log(`[identify] failed to update lastActiveAt for sessionId=${sessionId}`);
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
log("[identify] token/session mismatch — unauthenticated");
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
catch {
|
|
88
|
-
log("[identify] invalid token — unauthenticated");
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
log("[identify] no token — unauthenticated");
|
|
93
|
-
}
|
|
94
|
-
await next();
|
|
95
|
-
};
|
package/dist/middleware/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export const applyMiddleware = (handler, ...middleware) => middleware.reduceRight((next, mw) => (req) => mw(req, next), handler);
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { MiddlewareHandler } from "hono";
|
|
2
|
-
import type { AppEnv } from "../lib/context";
|
|
3
|
-
export interface MetricsMiddlewareOptions {
|
|
4
|
-
/** Paths to exclude from metrics collection. Strings use prefix matching. */
|
|
5
|
-
excludePaths?: (string | RegExp)[];
|
|
6
|
-
/** Custom path normalizer to prevent cardinality explosion. */
|
|
7
|
-
normalizePath?: (path: string) => string;
|
|
8
|
-
}
|
|
9
|
-
export declare const metricsCollector: (options?: MetricsMiddlewareOptions) => MiddlewareHandler<AppEnv>;
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { incrementCounter, observeHistogram, defaultNormalizePath } from "../lib/metrics";
|
|
2
|
-
const DEFAULT_EXCLUDE = ["/metrics", "/health", "/docs", "/openapi.json"];
|
|
3
|
-
export const metricsCollector = (options = {}) => {
|
|
4
|
-
const { excludePaths = DEFAULT_EXCLUDE, normalizePath = defaultNormalizePath, } = options;
|
|
5
|
-
return async (c, next) => {
|
|
6
|
-
const rawPath = c.req.path;
|
|
7
|
-
const excluded = excludePaths.some(p => typeof p === "string" ? rawPath.startsWith(p) : p.test(rawPath));
|
|
8
|
-
if (excluded)
|
|
9
|
-
return next();
|
|
10
|
-
const start = performance.now();
|
|
11
|
-
await next();
|
|
12
|
-
const duration = (performance.now() - start) / 1000; // seconds
|
|
13
|
-
const method = c.req.method;
|
|
14
|
-
const path = normalizePath(rawPath);
|
|
15
|
-
const status = String(c.res.status);
|
|
16
|
-
const tenantId = c.get("tenantId") ?? undefined;
|
|
17
|
-
const labels = { method, path, status };
|
|
18
|
-
const durationLabels = { method, path };
|
|
19
|
-
if (tenantId) {
|
|
20
|
-
labels.tenant = tenantId;
|
|
21
|
-
durationLabels.tenant = tenantId;
|
|
22
|
-
}
|
|
23
|
-
incrementCounter("http_requests_total", labels);
|
|
24
|
-
observeHistogram("http_request_duration_seconds", durationLabels, duration);
|
|
25
|
-
};
|
|
26
|
-
};
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { trackAttempt } from "../lib/authRateLimit";
|
|
2
|
-
import { buildFingerprint } from "../lib/fingerprint";
|
|
3
|
-
import { getClientIp } from "../lib/clientIp";
|
|
4
|
-
export const rateLimit = ({ windowMs, max, fingerprintLimit = false, }) => {
|
|
5
|
-
const opts = { windowMs, max };
|
|
6
|
-
return async (c, next) => {
|
|
7
|
-
const ip = getClientIp(c);
|
|
8
|
-
// Per-tenant namespacing: each tenant gets independent rate limit buckets
|
|
9
|
-
const tenantId = c.get("tenantId");
|
|
10
|
-
const prefix = tenantId ? `t:${tenantId}:` : "";
|
|
11
|
-
if (await trackAttempt(`${prefix}ip:${ip}`, opts)) {
|
|
12
|
-
return c.json({ error: "Too Many Requests" }, 429);
|
|
13
|
-
}
|
|
14
|
-
if (fingerprintLimit) {
|
|
15
|
-
const fp = await buildFingerprint(c.req.raw);
|
|
16
|
-
if (await trackAttempt(`${prefix}fp:${fp}`, opts)) {
|
|
17
|
-
return c.json({ error: "Too Many Requests" }, 429);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
await next();
|
|
21
|
-
};
|
|
22
|
-
};
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import type { MiddlewareHandler } from "hono";
|
|
2
|
-
import type { AppEnv } from "../lib/context";
|
|
3
|
-
import type { TenancyConfig } from "../app";
|
|
4
|
-
export declare const invalidateTenantCache: (tenantId: string) => void;
|
|
5
|
-
export declare const createTenantMiddleware: (config: TenancyConfig) => MiddlewareHandler<AppEnv>;
|