@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
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { RoomPersistenceConfig, StoredMessage, WsMessageDefaults } from '../../../packages/bunshot-core/src/index.js';
|
|
2
|
+
export type { StoredMessage, WsMessageDefaults, RoomPersistenceConfig };
|
|
3
|
+
export type WsMessageStore = 'redis' | 'mongo' | 'sqlite' | 'memory';
|
|
4
|
+
/**
|
|
5
|
+
* Persist a message to a room. Returns null if room is not configured for persistence.
|
|
6
|
+
* On store errors, logs a warning and returns null (non-blocking).
|
|
7
|
+
*/
|
|
8
|
+
export declare const persistMessage: (endpoint: string, room: string, data: {
|
|
9
|
+
senderId?: string | null;
|
|
10
|
+
payload: unknown;
|
|
11
|
+
}, app: object) => Promise<StoredMessage | null>;
|
|
12
|
+
/**
|
|
13
|
+
* Get message history for a room.
|
|
14
|
+
* Cursor-based pagination using message `id` as cursor.
|
|
15
|
+
*/
|
|
16
|
+
export declare const getMessageHistory: (endpoint: string, room: string, opts: {
|
|
17
|
+
limit?: number;
|
|
18
|
+
before?: string;
|
|
19
|
+
after?: string;
|
|
20
|
+
} | undefined, app: object) => Promise<StoredMessage[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Opt a room into message persistence.
|
|
23
|
+
* Delegates to persistence.configureRoom() on the context.
|
|
24
|
+
*/
|
|
25
|
+
export declare const configureRoom: (endpoint: string, room: string, options: RoomPersistenceConfig, app: object) => void;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { getContext } from '../../../packages/bunshot-core/src/index.js';
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Public API — requires app context
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
/**
|
|
6
|
+
* Persist a message to a room. Returns null if room is not configured for persistence.
|
|
7
|
+
* On store errors, logs a warning and returns null (non-blocking).
|
|
8
|
+
*/
|
|
9
|
+
export const persistMessage = async (endpoint, room, data, app) => {
|
|
10
|
+
const ctx = getContext(app);
|
|
11
|
+
const persistence = ctx.persistence;
|
|
12
|
+
const config = persistence.getRoomConfig(endpoint, room);
|
|
13
|
+
if (!config)
|
|
14
|
+
return null;
|
|
15
|
+
const message = {
|
|
16
|
+
id: crypto.randomUUID(),
|
|
17
|
+
endpoint,
|
|
18
|
+
room,
|
|
19
|
+
senderId: data.senderId ?? null,
|
|
20
|
+
payload: data.payload,
|
|
21
|
+
createdAt: Date.now(),
|
|
22
|
+
};
|
|
23
|
+
try {
|
|
24
|
+
return await persistence.wsMessages.persist(message, config);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
console.warn(`[wsMessages] failed to persist message to ${endpoint}${room}:`, err);
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Get message history for a room.
|
|
33
|
+
* Cursor-based pagination using message `id` as cursor.
|
|
34
|
+
*/
|
|
35
|
+
export const getMessageHistory = async (endpoint, room, opts, app) => {
|
|
36
|
+
return getContext(app).persistence.wsMessages.getHistory(endpoint, room, opts);
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Opt a room into message persistence.
|
|
40
|
+
* Delegates to persistence.configureRoom() on the context.
|
|
41
|
+
*/
|
|
42
|
+
export const configureRoom = (endpoint, room, options, app) => {
|
|
43
|
+
const ctx = getContext(app);
|
|
44
|
+
ctx.persistence.configureRoom(endpoint, room, options);
|
|
45
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Produces a collision-safe composite key for scoping rooms to an endpoint.
|
|
3
|
+
*
|
|
4
|
+
* Both endpoint and room are percent-encoded before joining with `:`.
|
|
5
|
+
* Since encodeURIComponent encodes `:` → `%3A`, the literal `:` separator
|
|
6
|
+
* can only come from this function — not from endpoint or room values.
|
|
7
|
+
*
|
|
8
|
+
* Examples:
|
|
9
|
+
* wsEndpointKey("/chat", "general") → "%2Fchat:general"
|
|
10
|
+
* wsEndpointKey("/chat", "room:1") → "%2Fchat:room%3A1"
|
|
11
|
+
* wsEndpointKey("/a:b", "c") → "%2Fa%3Ab:c"
|
|
12
|
+
* wsEndpointKey("/notifications", "x") → "%2Fnotifications:x"
|
|
13
|
+
*
|
|
14
|
+
* Used for: in-memory room maps, Redis channel names, Redis message keys.
|
|
15
|
+
* NOT used for: SQLite or MongoDB schemas (those store endpoint + room separately).
|
|
16
|
+
*/
|
|
17
|
+
export declare function wsEndpointKey(endpoint: string, room: string): string;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Produces a collision-safe composite key for scoping rooms to an endpoint.
|
|
3
|
+
*
|
|
4
|
+
* Both endpoint and room are percent-encoded before joining with `:`.
|
|
5
|
+
* Since encodeURIComponent encodes `:` → `%3A`, the literal `:` separator
|
|
6
|
+
* can only come from this function — not from endpoint or room values.
|
|
7
|
+
*
|
|
8
|
+
* Examples:
|
|
9
|
+
* wsEndpointKey("/chat", "general") → "%2Fchat:general"
|
|
10
|
+
* wsEndpointKey("/chat", "room:1") → "%2Fchat:room%3A1"
|
|
11
|
+
* wsEndpointKey("/a:b", "c") → "%2Fa%3Ab:c"
|
|
12
|
+
* wsEndpointKey("/notifications", "x") → "%2Fnotifications:x"
|
|
13
|
+
*
|
|
14
|
+
* Used for: in-memory room maps, Redis channel names, Redis message keys.
|
|
15
|
+
* NOT used for: SQLite or MongoDB schemas (those store endpoint + room separately).
|
|
16
|
+
*/
|
|
17
|
+
export function wsEndpointKey(endpoint, room) {
|
|
18
|
+
return `${encodeURIComponent(endpoint)}:${encodeURIComponent(room)}`;
|
|
19
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { WsState } from '../../../packages/bunshot-core/src/index.js';
|
|
2
|
+
export declare const trackSocket: (state: WsState, socketId: string, userId: string | null) => void;
|
|
3
|
+
export declare const untrackSocket: (state: WsState, socketId: string) => void;
|
|
4
|
+
export declare const addPresence: (state: WsState, socketId: string, endpoint: string, room: string) => {
|
|
5
|
+
userId: string;
|
|
6
|
+
isNewUser: boolean;
|
|
7
|
+
} | null;
|
|
8
|
+
export declare const removePresence: (state: WsState, socketId: string, endpoint: string, room: string) => {
|
|
9
|
+
userId: string;
|
|
10
|
+
isLastSocket: boolean;
|
|
11
|
+
} | null;
|
|
12
|
+
export declare const cleanupPresence: (state: WsState, socketId: string, endpoint: string, rooms: Set<string>) => Array<{
|
|
13
|
+
room: string;
|
|
14
|
+
userId: string;
|
|
15
|
+
}>;
|
|
16
|
+
export declare const getRoomPresence: (state: WsState, endpoint: string, room: string) => string[];
|
|
17
|
+
export declare const getUserPresence: (state: WsState, userId: string) => string[];
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { wsEndpointKey } from './wsNamespace';
|
|
2
|
+
export const trackSocket = (state, socketId, userId) => {
|
|
3
|
+
if (!userId)
|
|
4
|
+
return;
|
|
5
|
+
state.socketUsers.set(socketId, userId);
|
|
6
|
+
};
|
|
7
|
+
export const untrackSocket = (state, socketId) => {
|
|
8
|
+
state.socketUsers.delete(socketId);
|
|
9
|
+
};
|
|
10
|
+
export const addPresence = (state, socketId, endpoint, room) => {
|
|
11
|
+
const userId = state.socketUsers.get(socketId);
|
|
12
|
+
if (!userId)
|
|
13
|
+
return null;
|
|
14
|
+
const key = wsEndpointKey(endpoint, room);
|
|
15
|
+
if (!state.roomPresence.has(key))
|
|
16
|
+
state.roomPresence.set(key, new Map());
|
|
17
|
+
const roomMap = state.roomPresence.get(key);
|
|
18
|
+
const isNewUser = !roomMap.has(userId) || roomMap.get(userId).size === 0;
|
|
19
|
+
if (!roomMap.has(userId))
|
|
20
|
+
roomMap.set(userId, new Set());
|
|
21
|
+
roomMap.get(userId).add(socketId);
|
|
22
|
+
return { userId, isNewUser };
|
|
23
|
+
};
|
|
24
|
+
export const removePresence = (state, socketId, endpoint, room) => {
|
|
25
|
+
const userId = state.socketUsers.get(socketId);
|
|
26
|
+
if (!userId)
|
|
27
|
+
return null;
|
|
28
|
+
const key = wsEndpointKey(endpoint, room);
|
|
29
|
+
const roomMap = state.roomPresence.get(key);
|
|
30
|
+
if (!roomMap)
|
|
31
|
+
return null;
|
|
32
|
+
const sockets = roomMap.get(userId);
|
|
33
|
+
if (!sockets)
|
|
34
|
+
return null;
|
|
35
|
+
sockets.delete(socketId);
|
|
36
|
+
const isLastSocket = sockets.size === 0;
|
|
37
|
+
if (isLastSocket) {
|
|
38
|
+
roomMap.delete(userId);
|
|
39
|
+
if (roomMap.size === 0)
|
|
40
|
+
state.roomPresence.delete(key);
|
|
41
|
+
}
|
|
42
|
+
return { userId, isLastSocket };
|
|
43
|
+
};
|
|
44
|
+
export const cleanupPresence = (state, socketId, endpoint, rooms) => {
|
|
45
|
+
const userId = state.socketUsers.get(socketId);
|
|
46
|
+
if (!userId)
|
|
47
|
+
return [];
|
|
48
|
+
const departed = [];
|
|
49
|
+
for (const room of rooms) {
|
|
50
|
+
const key = wsEndpointKey(endpoint, room);
|
|
51
|
+
const roomMap = state.roomPresence.get(key);
|
|
52
|
+
if (!roomMap)
|
|
53
|
+
continue;
|
|
54
|
+
const sockets = roomMap.get(userId);
|
|
55
|
+
if (!sockets)
|
|
56
|
+
continue;
|
|
57
|
+
sockets.delete(socketId);
|
|
58
|
+
if (sockets.size === 0) {
|
|
59
|
+
roomMap.delete(userId);
|
|
60
|
+
if (roomMap.size === 0)
|
|
61
|
+
state.roomPresence.delete(key);
|
|
62
|
+
departed.push({ room, userId });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return departed;
|
|
66
|
+
};
|
|
67
|
+
export const getRoomPresence = (state, endpoint, room) => {
|
|
68
|
+
const roomMap = state.roomPresence.get(wsEndpointKey(endpoint, room));
|
|
69
|
+
if (!roomMap)
|
|
70
|
+
return [];
|
|
71
|
+
return [...roomMap.keys()];
|
|
72
|
+
};
|
|
73
|
+
export const getUserPresence = (state, userId) => {
|
|
74
|
+
const rooms = [];
|
|
75
|
+
for (const [key, roomMap] of state.roomPresence) {
|
|
76
|
+
const sockets = roomMap.get(userId);
|
|
77
|
+
if (sockets && sockets.size > 0) {
|
|
78
|
+
const colonIdx = key.indexOf(':');
|
|
79
|
+
if (colonIdx !== -1)
|
|
80
|
+
rooms.push(decodeURIComponent(key.slice(colonIdx + 1)));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return rooms;
|
|
84
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pluggable transport for cross-instance WebSocket message delivery.
|
|
3
|
+
*
|
|
4
|
+
* `publish()` is called on every room broadcast — the transport fans out
|
|
5
|
+
* the message to other server instances (e.g. via Redis pub/sub).
|
|
6
|
+
*
|
|
7
|
+
* `connect()` is called once at server startup. The `onMessage` callback
|
|
8
|
+
* should be invoked when a message arrives from another instance —
|
|
9
|
+
* it will be delivered to local sockets via Bun's native `server.publish()`.
|
|
10
|
+
*
|
|
11
|
+
* `disconnect()` is called on graceful shutdown.
|
|
12
|
+
*/
|
|
13
|
+
export interface WsTransportAdapter {
|
|
14
|
+
/**
|
|
15
|
+
* Fan out a message to other instances.
|
|
16
|
+
* Called on every `publish()` in ws.ts — must be non-blocking.
|
|
17
|
+
* Errors are caught and logged by the caller; they never break local delivery.
|
|
18
|
+
* @param origin — unique ID of the publishing instance (for self-echo filtering)
|
|
19
|
+
*/
|
|
20
|
+
publish(endpoint: string, room: string, message: string, origin: string): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Connect to the transport backend.
|
|
23
|
+
* @param onMessage — call this when a message arrives from the transport.
|
|
24
|
+
* Includes `origin` so the caller can skip self-echo.
|
|
25
|
+
*/
|
|
26
|
+
connect(onMessage: (endpoint: string, room: string, message: string, origin: string) => void): Promise<void>;
|
|
27
|
+
/** Disconnect from the transport backend. Called on SIGTERM/SIGINT. */
|
|
28
|
+
disconnect(): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Default no-op transport. Single-instance — all messages go through
|
|
32
|
+
* Bun's native `server.publish()` only. No cross-instance delivery.
|
|
33
|
+
*/
|
|
34
|
+
export declare class InMemoryTransport implements WsTransportAdapter {
|
|
35
|
+
publish(_endpoint: string, _room: string, _message: string, _origin: string): Promise<void>;
|
|
36
|
+
connect(_onMessage: (endpoint: string, room: string, message: string, origin: string) => void): Promise<void>;
|
|
37
|
+
disconnect(): Promise<void>;
|
|
38
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default no-op transport. Single-instance — all messages go through
|
|
3
|
+
* Bun's native `server.publish()` only. No cross-instance delivery.
|
|
4
|
+
*/
|
|
5
|
+
export class InMemoryTransport {
|
|
6
|
+
async publish(_endpoint, _room, _message, _origin) { }
|
|
7
|
+
async connect(_onMessage) { }
|
|
8
|
+
async disconnect() { }
|
|
9
|
+
}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getMongooseModule } from '../../lib/mongo';
|
|
2
2
|
/** Unwrap nullable, optional, and default wrappers to get the core Zod type */
|
|
3
3
|
function unwrap(zodType) {
|
|
4
4
|
let t = zodType;
|
|
5
5
|
let required = true;
|
|
6
6
|
while (true) {
|
|
7
7
|
const defType = t._zod?.def?.type;
|
|
8
|
-
if (defType ===
|
|
8
|
+
if (defType === 'nullable') {
|
|
9
9
|
t = t._zod.def.innerType;
|
|
10
10
|
required = false;
|
|
11
11
|
}
|
|
12
|
-
else if (defType ===
|
|
12
|
+
else if (defType === 'optional') {
|
|
13
13
|
t = t._zod.def.innerType;
|
|
14
14
|
required = false;
|
|
15
15
|
}
|
|
16
|
-
else if (defType ===
|
|
16
|
+
else if (defType === 'default') {
|
|
17
17
|
t = t._zod.def.innerType;
|
|
18
18
|
required = false;
|
|
19
19
|
}
|
|
@@ -24,21 +24,21 @@ function unwrap(zodType) {
|
|
|
24
24
|
}
|
|
25
25
|
/** Lazily access the Mongoose Schema class (avoids top-level require of mongoose) */
|
|
26
26
|
function getSchema() {
|
|
27
|
-
return
|
|
27
|
+
return getMongooseModule().Schema;
|
|
28
28
|
}
|
|
29
29
|
/** Convert a single Zod type to a Mongoose field definition */
|
|
30
30
|
function toMongooseField(zodType) {
|
|
31
31
|
const { core, required } = unwrap(zodType);
|
|
32
32
|
const defType = core._zod?.def?.type;
|
|
33
|
-
if (defType ===
|
|
33
|
+
if (defType === 'string')
|
|
34
34
|
return { type: String, required };
|
|
35
|
-
if (defType ===
|
|
35
|
+
if (defType === 'number')
|
|
36
36
|
return { type: Number, required };
|
|
37
|
-
if (defType ===
|
|
37
|
+
if (defType === 'boolean')
|
|
38
38
|
return { type: Boolean, required };
|
|
39
|
-
if (defType ===
|
|
39
|
+
if (defType === 'date')
|
|
40
40
|
return { type: Date, required };
|
|
41
|
-
if (defType ===
|
|
41
|
+
if (defType === 'enum')
|
|
42
42
|
return { type: String, enum: core.options, required };
|
|
43
43
|
return { type: getSchema().Types.Mixed, required };
|
|
44
44
|
}
|
|
@@ -64,7 +64,7 @@ export function zodToMongoose(zodSchema, config = {}) {
|
|
|
64
64
|
const shape = zodSchema.shape;
|
|
65
65
|
const fields = {};
|
|
66
66
|
for (const [apiField, zodType] of Object.entries(shape)) {
|
|
67
|
-
if (apiField ===
|
|
67
|
+
if (apiField === 'id')
|
|
68
68
|
continue;
|
|
69
69
|
if (config.refs?.[apiField]) {
|
|
70
70
|
const { dbField, ref } = config.refs[apiField];
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
3
|
-
import type { AuditLogEntry,
|
|
1
|
+
import type { AuditLogOptions } from '../lib/auditLog';
|
|
2
|
+
import type { Context, MiddlewareHandler } from 'hono';
|
|
3
|
+
import type { AppEnv, AuditLogEntry, AuditLogProvider } from '../../../packages/bunshot-core/src/index.js';
|
|
4
4
|
export interface AuditLogMiddlewareOptions extends AuditLogOptions {
|
|
5
|
+
provider?: AuditLogProvider;
|
|
5
6
|
exclude?: {
|
|
6
7
|
/** Skip logging for requests with these HTTP methods (e.g. `["GET", "HEAD"]`). */
|
|
7
8
|
methods?: string[];
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { createAuditLogProvider } from '../lib/auditLog';
|
|
2
|
+
import { getClientIp } from '../../../packages/bunshot-core/src/index.js';
|
|
3
|
+
export const auditLog = (options) => {
|
|
4
|
+
const provider = options.provider ?? createAuditLogProvider(options);
|
|
5
|
+
return async (c, next) => {
|
|
6
|
+
await next();
|
|
7
|
+
// Exclusion checks run after next() intentionally — c.res.status is only available
|
|
8
|
+
// after the route handler runs. The route still executes; we're only skipping the log write.
|
|
9
|
+
if (options.exclude?.methods?.includes(c.req.method))
|
|
10
|
+
return;
|
|
11
|
+
// Note: if exclude.paths grows large, regex evaluation on every request adds up.
|
|
12
|
+
// For high-traffic exclusions, prefer string matching over regex.
|
|
13
|
+
const path = c.req.path;
|
|
14
|
+
if (options.exclude?.paths?.some(p => (typeof p === 'string' ? p === path : p.test(path))))
|
|
15
|
+
return;
|
|
16
|
+
let entry = {
|
|
17
|
+
id: crypto.randomUUID(),
|
|
18
|
+
requestId: c.get('requestId') ?? undefined,
|
|
19
|
+
userId: c.get('authUserId') ?? null,
|
|
20
|
+
sessionId: c.get('sessionId') ?? null,
|
|
21
|
+
tenantId: c.get('tenantId') ?? null,
|
|
22
|
+
method: c.req.method,
|
|
23
|
+
path,
|
|
24
|
+
status: c.res.status,
|
|
25
|
+
ip: getClientIp(c),
|
|
26
|
+
userAgent: c.req.header('user-agent') ?? null,
|
|
27
|
+
createdAt: new Date().toISOString(),
|
|
28
|
+
};
|
|
29
|
+
if (options.onEntry) {
|
|
30
|
+
try {
|
|
31
|
+
entry = await options.onEntry(entry, c);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
console.error('[auditLog] onEntry hook threw:', err);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Fire-and-forget — never block the response; logAuditEntry also swallows errors internally
|
|
38
|
+
provider.logEntry(entry).catch((err) => {
|
|
39
|
+
console.error('[auditLog] write failed:', err);
|
|
40
|
+
});
|
|
41
|
+
};
|
|
42
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { MiddlewareHandler } from
|
|
1
|
+
import type { MiddlewareHandler } from 'hono';
|
|
2
2
|
export interface BotProtectionOptions {
|
|
3
3
|
/**
|
|
4
4
|
* List of IPv4 CIDRs (e.g. "198.51.100.0/24"), IPv4 exact addresses,
|
|
@@ -6,4 +6,4 @@ export interface BotProtectionOptions {
|
|
|
6
6
|
*/
|
|
7
7
|
blockList?: string[];
|
|
8
8
|
}
|
|
9
|
-
export declare const botProtection: ({ blockList
|
|
9
|
+
export declare const botProtection: ({ blockList }: BotProtectionOptions) => MiddlewareHandler;
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import { getClientIp } from
|
|
1
|
+
import { getClientIp } from '../../../packages/bunshot-core/src/index.js';
|
|
2
2
|
// ---------------------------------------------------------------------------
|
|
3
3
|
// CIDR helpers (IPv4 only; IPv6 exact-match supported)
|
|
4
4
|
// ---------------------------------------------------------------------------
|
|
5
5
|
function ipv4ToUint32(ip) {
|
|
6
|
-
const parts = ip.split(
|
|
7
|
-
return ((
|
|
8
|
-
0);
|
|
6
|
+
const parts = ip.split('.').map(Number);
|
|
7
|
+
return ((parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8) | parts[3]) >>> 0;
|
|
9
8
|
}
|
|
10
9
|
function cidrMatchesIpv4(cidr, ip) {
|
|
11
|
-
const slash = cidr.indexOf(
|
|
10
|
+
const slash = cidr.indexOf('/');
|
|
12
11
|
const network = slash === -1 ? cidr : cidr.slice(0, slash);
|
|
13
12
|
const prefixLen = slash === -1 ? 32 : parseInt(cidr.slice(slash + 1), 10);
|
|
14
13
|
const mask = prefixLen === 0 ? 0 : (~0 << (32 - prefixLen)) >>> 0;
|
|
@@ -17,7 +16,7 @@ function cidrMatchesIpv4(cidr, ip) {
|
|
|
17
16
|
const IPV4_RE = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/;
|
|
18
17
|
function normalizeIp(ip) {
|
|
19
18
|
// Strip IPv4-mapped IPv6 prefix (::ffff:1.2.3.4)
|
|
20
|
-
if (ip.startsWith(
|
|
19
|
+
if (ip.startsWith('::ffff:'))
|
|
21
20
|
return ip.slice(7);
|
|
22
21
|
return ip;
|
|
23
22
|
}
|
|
@@ -37,13 +36,13 @@ function isBlocked(ip, blockList) {
|
|
|
37
36
|
}
|
|
38
37
|
return false;
|
|
39
38
|
}
|
|
40
|
-
export const botProtection = ({ blockList = []
|
|
39
|
+
export const botProtection = ({ blockList = [] }) => {
|
|
41
40
|
if (blockList.length === 0)
|
|
42
41
|
return (_c, next) => next();
|
|
43
42
|
return async (c, next) => {
|
|
44
43
|
const ip = getClientIp(c);
|
|
45
|
-
if (ip !==
|
|
46
|
-
return c.json({ error:
|
|
44
|
+
if (ip !== 'unknown' && isBlocked(ip, blockList)) {
|
|
45
|
+
return c.json({ error: 'Forbidden' }, 403);
|
|
47
46
|
}
|
|
48
47
|
await next();
|
|
49
48
|
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { MiddlewareHandler } from 'hono';
|
|
2
|
+
import type { Connection } from 'mongoose';
|
|
3
|
+
import type { AppEnv } from '../../../packages/bunshot-core/src/index.js';
|
|
4
|
+
import type { CacheStoreName } from '../../../packages/bunshot-core/src/index.js';
|
|
5
|
+
interface CacheDoc {
|
|
6
|
+
key: string;
|
|
7
|
+
value: string;
|
|
8
|
+
expiresAt?: Date;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Get or create the Mongoose CacheEntry model on the given connection.
|
|
12
|
+
* Accepts connection and mongoose module as parameters — no module-level state.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getCacheModel(conn?: Connection): import('mongoose').Model<CacheDoc>;
|
|
15
|
+
type CacheStore = CacheStoreName;
|
|
16
|
+
/**
|
|
17
|
+
* Delete a cached entry by exact key across ALL cache backends.
|
|
18
|
+
*
|
|
19
|
+
* Requires an app reference so cache invalidation uses the correct instance-owned adapters.
|
|
20
|
+
*/
|
|
21
|
+
export declare const bustCache: (key: string, app: object) => Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Delete cached entries matching a glob pattern across ALL cache backends.
|
|
24
|
+
*
|
|
25
|
+
* Same defense-in-depth rationale as `bustCache` — see comment above.
|
|
26
|
+
*/
|
|
27
|
+
export declare const bustCachePattern: (pattern: string, app: object) => Promise<void>;
|
|
28
|
+
type KeyFn = (c: Parameters<MiddlewareHandler<any>>[0]) => string;
|
|
29
|
+
interface CacheOptions {
|
|
30
|
+
ttl?: number;
|
|
31
|
+
key: string | KeyFn;
|
|
32
|
+
store?: CacheStore;
|
|
33
|
+
}
|
|
34
|
+
export declare const cacheResponse: ({ ttl, key, store: storeOverride, }: CacheOptions) => MiddlewareHandler<AppEnv>;
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { getMongooseModule } from '../../lib/mongo';
|
|
2
|
+
import { getBunshotCtx, getCacheAdapter, getCacheAdapterOrNull } from '../../../packages/bunshot-core/src/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Get or create the Mongoose CacheEntry model on the given connection.
|
|
5
|
+
* Accepts connection and mongoose module as parameters — no module-level state.
|
|
6
|
+
*/
|
|
7
|
+
export function getCacheModel(conn) {
|
|
8
|
+
// When called without args (from registerBoundaryAdapters), the model
|
|
9
|
+
// must already be registered on the connection from a prior call.
|
|
10
|
+
// This is a lazy model that gets created on first use with a connection.
|
|
11
|
+
if (!conn) {
|
|
12
|
+
// Fallback: the model must have been registered already on some connection.
|
|
13
|
+
// This path is only hit from registerBoundaryAdapters where appConnection is passed
|
|
14
|
+
// through the closure. We need to accept the connection as parameter.
|
|
15
|
+
throw new Error('getCacheModel requires a connection parameter');
|
|
16
|
+
}
|
|
17
|
+
if (conn.models['CacheEntry'])
|
|
18
|
+
return conn.models['CacheEntry'];
|
|
19
|
+
const mg = getMongooseModule();
|
|
20
|
+
const { Schema } = mg;
|
|
21
|
+
const cacheSchema = new Schema({
|
|
22
|
+
key: { type: String, required: true, unique: true },
|
|
23
|
+
value: { type: String, required: true },
|
|
24
|
+
expiresAt: { type: Date, index: { expireAfterSeconds: 0 } },
|
|
25
|
+
}, { collection: 'cache_entries' });
|
|
26
|
+
return conn.model('CacheEntry', cacheSchema);
|
|
27
|
+
}
|
|
28
|
+
async function storeGet(ctx, store, cacheKey) {
|
|
29
|
+
const adapter = getCacheAdapter(ctx, store);
|
|
30
|
+
if (!adapter.isReady()) {
|
|
31
|
+
throw new Error(`cacheResponse: store "${store}" is not ready.`);
|
|
32
|
+
}
|
|
33
|
+
return adapter.get(cacheKey);
|
|
34
|
+
}
|
|
35
|
+
async function storeSet(ctx, store, cacheKey, value, ttl) {
|
|
36
|
+
const adapter = getCacheAdapter(ctx, store);
|
|
37
|
+
if (!adapter.isReady()) {
|
|
38
|
+
throw new Error(`cacheResponse: store "${store}" is not ready.`);
|
|
39
|
+
}
|
|
40
|
+
await adapter.set(cacheKey, value, ttl);
|
|
41
|
+
}
|
|
42
|
+
async function storeDel(app, store, cacheKey) {
|
|
43
|
+
const adapter = getCacheAdapterOrNull(app, store);
|
|
44
|
+
if (!adapter?.isReady())
|
|
45
|
+
return;
|
|
46
|
+
await adapter.del(cacheKey);
|
|
47
|
+
}
|
|
48
|
+
async function storeDelPattern(app, store, fullPattern) {
|
|
49
|
+
const adapter = getCacheAdapterOrNull(app, store);
|
|
50
|
+
if (!adapter?.isReady())
|
|
51
|
+
return;
|
|
52
|
+
await adapter.delPattern(fullPattern);
|
|
53
|
+
}
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
// Public API
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
/**
|
|
58
|
+
* Delete a cached entry by exact key across ALL cache backends.
|
|
59
|
+
*
|
|
60
|
+
* Requires an app reference so cache invalidation uses the correct instance-owned adapters.
|
|
61
|
+
*/
|
|
62
|
+
export const bustCache = async (key, app) => {
|
|
63
|
+
const { getContext } = await import('../../../packages/bunshot-core/src/index.js');
|
|
64
|
+
const ctx = getContext(app);
|
|
65
|
+
const appName = ctx.config.appName;
|
|
66
|
+
const cacheKey = `cache:${appName}:${key}`;
|
|
67
|
+
const stores = [...ctx.cacheAdapters.keys()];
|
|
68
|
+
await Promise.all(stores.map(store => storeDel(app, store, cacheKey)));
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Delete cached entries matching a glob pattern across ALL cache backends.
|
|
72
|
+
*
|
|
73
|
+
* Same defense-in-depth rationale as `bustCache` — see comment above.
|
|
74
|
+
*/
|
|
75
|
+
export const bustCachePattern = async (pattern, app) => {
|
|
76
|
+
const { getContext } = await import('../../../packages/bunshot-core/src/index.js');
|
|
77
|
+
const ctx = getContext(app);
|
|
78
|
+
const appName = ctx.config.appName;
|
|
79
|
+
const fullPattern = `cache:${appName}:${pattern}`;
|
|
80
|
+
const stores = [...ctx.cacheAdapters.keys()];
|
|
81
|
+
await Promise.all(stores.map(store => storeDelPattern(app, store, fullPattern)));
|
|
82
|
+
};
|
|
83
|
+
/** Headers that must never be cached — storing these can cause session fixation or auth bypass. */
|
|
84
|
+
const UNCACHEABLE_HEADERS = new Set([
|
|
85
|
+
'set-cookie',
|
|
86
|
+
'www-authenticate',
|
|
87
|
+
'authorization',
|
|
88
|
+
'x-csrf-token',
|
|
89
|
+
'proxy-authenticate',
|
|
90
|
+
]);
|
|
91
|
+
export const cacheResponse = ({ ttl, key, store: storeOverride, }) => {
|
|
92
|
+
return async (c, next) => {
|
|
93
|
+
const ctx = getBunshotCtx(c);
|
|
94
|
+
const store = storeOverride ?? ctx.config.resolvedStores.cache ?? 'redis';
|
|
95
|
+
const appName = ctx.config.appName;
|
|
96
|
+
const rawKey = typeof key === 'function' ? key(c) : key;
|
|
97
|
+
// Per-tenant namespacing: prevents two tenants caching the same key from colliding
|
|
98
|
+
const tenantId = c.get('tenantId');
|
|
99
|
+
const tenantSegment = tenantId ? `${tenantId}:` : '';
|
|
100
|
+
const cacheKey = `cache:${appName}:${tenantSegment}${rawKey}`;
|
|
101
|
+
const cached = await storeGet(ctx, store, cacheKey);
|
|
102
|
+
if (cached) {
|
|
103
|
+
const { status, headers, body } = JSON.parse(cached);
|
|
104
|
+
return new Response(body, {
|
|
105
|
+
status,
|
|
106
|
+
headers: { ...headers, 'x-cache': 'HIT' },
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
await next();
|
|
110
|
+
const res = c.res;
|
|
111
|
+
if (res.status >= 200 && res.status < 300) {
|
|
112
|
+
const body = await res.text();
|
|
113
|
+
const headers = {};
|
|
114
|
+
res.headers.forEach((value, name) => {
|
|
115
|
+
if (!UNCACHEABLE_HEADERS.has(name.toLowerCase())) {
|
|
116
|
+
headers[name] = value;
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
await storeSet(ctx, store, cacheKey, JSON.stringify({ status: res.status, headers, body }), ttl);
|
|
120
|
+
c.res = new Response(body, {
|
|
121
|
+
status: res.status,
|
|
122
|
+
headers: { ...headers, 'x-cache': 'MISS' },
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { MiddlewareHandler } from 'hono';
|
|
2
|
+
import type { AppEnv, CaptchaConfig } from '../../../packages/bunshot-core/src/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Middleware factory that verifies a CAPTCHA token from the request body.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* router.post("/contact", requireCaptcha({ provider: "turnstile", secretKey: "..." }), handler);
|
|
8
|
+
*/
|
|
9
|
+
export declare const requireCaptcha: (config?: CaptchaConfig) => MiddlewareHandler<AppEnv>;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { verifyCaptcha } from '../lib/captcha';
|
|
2
|
+
import { HttpError, getContextOrNull } from '../../../packages/bunshot-core/src/index.js';
|
|
3
|
+
import { getClientIp } from '../../../packages/bunshot-core/src/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Middleware factory that verifies a CAPTCHA token from the request body.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* router.post("/contact", requireCaptcha({ provider: "turnstile", secretKey: "..." }), handler);
|
|
9
|
+
*/
|
|
10
|
+
export const requireCaptcha = (config) => async (c, next) => {
|
|
11
|
+
// Get effective config: param takes precedence, then context config
|
|
12
|
+
const app = c.get('bunshotCtx')?.app;
|
|
13
|
+
const ctx = app ? getContextOrNull(app) : null;
|
|
14
|
+
const effectiveConfig = config ?? ctx?.config?.captcha ?? undefined;
|
|
15
|
+
if (!effectiveConfig) {
|
|
16
|
+
await next();
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const tokenField = effectiveConfig.tokenField ?? 'captcha-token';
|
|
20
|
+
let body;
|
|
21
|
+
try {
|
|
22
|
+
body = await c.req.json();
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
body = {};
|
|
26
|
+
}
|
|
27
|
+
const token = body[tokenField];
|
|
28
|
+
if (!token) {
|
|
29
|
+
throw new HttpError(400, 'CAPTCHA token is required', 'CAPTCHA_MISSING');
|
|
30
|
+
}
|
|
31
|
+
const ip = getClientIp(c) ?? undefined;
|
|
32
|
+
const result = await verifyCaptcha(token, effectiveConfig, ip);
|
|
33
|
+
if (!result.success) {
|
|
34
|
+
throw new HttpError(400, 'CAPTCHA verification failed', 'CAPTCHA_FAILED');
|
|
35
|
+
}
|
|
36
|
+
await next();
|
|
37
|
+
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { Middleware } from
|
|
1
|
+
import type { Middleware } from '.';
|
|
2
2
|
export declare const errorHandler: Middleware;
|