@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/schemas/auth.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { getPasswordPolicy } from "../lib/appConfig";
|
|
3
|
-
/** Build a Zod schema for the password field based on the configured policy.
|
|
4
|
-
* Applied to registration and reset-password. Login uses min(1) intentionally
|
|
5
|
-
* to avoid locking out users registered under older/weaker policies. */
|
|
6
|
-
const passwordSchema = () => {
|
|
7
|
-
const policy = getPasswordPolicy();
|
|
8
|
-
const minLen = policy.minLength ?? 8;
|
|
9
|
-
let schema = z.string().min(minLen, `Password must be at least ${minLen} characters`);
|
|
10
|
-
if (policy.requireLetter !== false) {
|
|
11
|
-
schema = schema.regex(/[a-zA-Z]/, "Password must contain at least one letter");
|
|
12
|
-
}
|
|
13
|
-
if (policy.requireDigit !== false) {
|
|
14
|
-
schema = schema.regex(/\d/, "Password must contain at least one digit");
|
|
15
|
-
}
|
|
16
|
-
if (policy.requireSpecial) {
|
|
17
|
-
schema = schema.regex(/[^a-zA-Z0-9]/, "Password must contain at least one special character");
|
|
18
|
-
}
|
|
19
|
-
return schema;
|
|
20
|
-
};
|
|
21
|
-
export const makeRegisterSchema = (primaryField) => z.object({
|
|
22
|
-
[primaryField]: primaryField === "email" ? z.string().email() : z.string().min(3),
|
|
23
|
-
password: passwordSchema(),
|
|
24
|
-
});
|
|
25
|
-
export const makeLoginSchema = (primaryField) => z.object({
|
|
26
|
-
[primaryField]: primaryField === "email" ? z.string().email() : z.string().min(1),
|
|
27
|
-
password: z.string().min(1),
|
|
28
|
-
});
|
|
29
|
-
/** Password schema for reset-password — same policy as registration. */
|
|
30
|
-
export const resetPasswordSchema = () => passwordSchema();
|
package/dist/server.d.ts
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import type { Server, ServerWebSocket, WebSocketHandler } from "bun";
|
|
2
|
-
import { type CreateAppConfig } from "./app";
|
|
3
|
-
import { type SocketData } from "./ws/index";
|
|
4
|
-
import { type HeartbeatConfig } from "./lib/wsHeartbeat";
|
|
5
|
-
import { type WsMessageStore, type WsMessageDefaults } from "./lib/wsMessages";
|
|
6
|
-
export interface WsConfig<T extends object = object> {
|
|
7
|
-
/** Override or extend the default WebSocket handler */
|
|
8
|
-
handler?: WebSocketHandler<SocketData<T>>;
|
|
9
|
-
/** Override the default /ws upgrade handler (auth + upgrade logic) */
|
|
10
|
-
upgradeHandler?: (req: Request, server: Server<SocketData<T>>) => Promise<Response | undefined>;
|
|
11
|
-
/**
|
|
12
|
-
* Guard called before a socket joins a room via the subscribe action.
|
|
13
|
-
* Return true to allow, false to deny (client receives { event: "subscribe_denied", room }).
|
|
14
|
-
* ws.data.userId is available for auth checks.
|
|
15
|
-
*/
|
|
16
|
-
onRoomSubscribe?: (ws: ServerWebSocket<SocketData<T>>, room: string) => boolean | Promise<boolean>;
|
|
17
|
-
/**
|
|
18
|
-
* Maximum allowed WebSocket message size in bytes.
|
|
19
|
-
* Messages exceeding this limit will cause the connection to be closed with code 1009.
|
|
20
|
-
* Defaults to 65536 (64 KB).
|
|
21
|
-
*/
|
|
22
|
-
maxMessageSize?: number;
|
|
23
|
-
/**
|
|
24
|
-
* Heartbeat / ping-pong keepalive. Set `true` for defaults (30s interval, 10s timeout)
|
|
25
|
-
* or provide an object to customize intervals.
|
|
26
|
-
*/
|
|
27
|
-
heartbeat?: boolean | HeartbeatConfig;
|
|
28
|
-
/**
|
|
29
|
-
* Presence tracking. Set `true` for defaults or provide config.
|
|
30
|
-
* When enabled, `presence_join`/`presence_leave` events are broadcast to rooms.
|
|
31
|
-
*/
|
|
32
|
-
presence?: boolean | {
|
|
33
|
-
broadcastEvents?: boolean;
|
|
34
|
-
};
|
|
35
|
-
/**
|
|
36
|
-
* Message persistence. Opt rooms in via `configureRoom()`.
|
|
37
|
-
*/
|
|
38
|
-
persistence?: {
|
|
39
|
-
store?: WsMessageStore;
|
|
40
|
-
defaults?: WsMessageDefaults;
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
export interface CreateServerConfig<T extends object = object> extends CreateAppConfig {
|
|
44
|
-
port?: number;
|
|
45
|
-
/** Absolute path to the service's workers directory — auto-imports all .ts files */
|
|
46
|
-
workersDir?: string;
|
|
47
|
-
/** Set false to disable auto-loading workers. Defaults to true */
|
|
48
|
-
enableWorkers?: boolean;
|
|
49
|
-
/** WebSocket configuration */
|
|
50
|
-
ws?: WsConfig<T>;
|
|
51
|
-
/**
|
|
52
|
-
* Maximum request body size in bytes. Defaults to the upload config limit when present
|
|
53
|
-
* (maxFileSize * maxFiles), otherwise Bun's default (128 MB).
|
|
54
|
-
*/
|
|
55
|
-
maxRequestBodySize?: number;
|
|
56
|
-
}
|
|
57
|
-
export declare const createServer: <T extends object = object>(config: CreateServerConfig<T>) => Promise<Server<SocketData<T>>>;
|
package/dist/server.js
DELETED
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
import { createApp } from "./app";
|
|
2
|
-
import { websocket as defaultWebsocket, createWsUpgradeHandler } from "./ws/index";
|
|
3
|
-
import { setWsServer, handleRoomActions, cleanupSocket, setPresenceEnabled } from "./lib/ws";
|
|
4
|
-
import { registerSocket, deregisterSocket, handlePong, startHeartbeat, stopHeartbeat } from "./lib/wsHeartbeat";
|
|
5
|
-
import { trackSocket, untrackSocket } from "./lib/wsPresence";
|
|
6
|
-
import { setWsMessageStore, setWsMessageDefaults } from "./lib/wsMessages";
|
|
7
|
-
import { log } from "./lib/logger";
|
|
8
|
-
export const createServer = async (config) => {
|
|
9
|
-
const app = await createApp(config);
|
|
10
|
-
const port = Number(process.env.PORT ?? config.port ?? 3000);
|
|
11
|
-
const { workersDir, enableWorkers = true, ws: wsConfig = {} } = config;
|
|
12
|
-
// Compute maxRequestBodySize: explicit config wins, else derive from upload config
|
|
13
|
-
let maxRequestBodySize = config.maxRequestBodySize;
|
|
14
|
-
if (maxRequestBodySize === undefined && config.upload) {
|
|
15
|
-
const maxFileSize = config.upload.maxFileSize ?? 10 * 1024 * 1024;
|
|
16
|
-
const maxFiles = config.upload.maxFiles ?? 10;
|
|
17
|
-
maxRequestBodySize = maxFileSize * maxFiles;
|
|
18
|
-
}
|
|
19
|
-
const { handler: userWs, upgradeHandler: wsUpgradeHandler, onRoomSubscribe, maxMessageSize = 65_536, heartbeat: heartbeatConfig, presence: presenceConfig, persistence: persistenceConfig, } = wsConfig;
|
|
20
|
-
// Configure presence
|
|
21
|
-
if (presenceConfig)
|
|
22
|
-
setPresenceEnabled(true);
|
|
23
|
-
// Configure message persistence
|
|
24
|
-
if (persistenceConfig) {
|
|
25
|
-
if (persistenceConfig.store)
|
|
26
|
-
setWsMessageStore(persistenceConfig.store);
|
|
27
|
-
if (persistenceConfig.defaults)
|
|
28
|
-
setWsMessageDefaults(persistenceConfig.defaults);
|
|
29
|
-
}
|
|
30
|
-
const defaultOpen = defaultWebsocket.open;
|
|
31
|
-
const defaultClose = defaultWebsocket.close;
|
|
32
|
-
const defaultDrain = defaultWebsocket.drain;
|
|
33
|
-
const heartbeatEnabled = !!heartbeatConfig;
|
|
34
|
-
const ws = {
|
|
35
|
-
open(socket) {
|
|
36
|
-
if (heartbeatEnabled)
|
|
37
|
-
registerSocket(socket, socket.data.id);
|
|
38
|
-
if (presenceConfig)
|
|
39
|
-
trackSocket(socket.data.id, socket.data.userId);
|
|
40
|
-
(userWs?.open ?? defaultOpen)(socket);
|
|
41
|
-
},
|
|
42
|
-
async message(socket, message) {
|
|
43
|
-
const size = typeof message === "string" ? message.length : message.byteLength;
|
|
44
|
-
if (size > maxMessageSize) {
|
|
45
|
-
socket.close(1009, "Message too large");
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
if (!await handleRoomActions(socket, message, onRoomSubscribe)) {
|
|
49
|
-
if (userWs?.message) {
|
|
50
|
-
userWs.message(socket, message);
|
|
51
|
-
}
|
|
52
|
-
// No default echo — without a custom handler, non-room messages are silently dropped
|
|
53
|
-
}
|
|
54
|
-
},
|
|
55
|
-
close(socket, code, reason) {
|
|
56
|
-
if (heartbeatEnabled)
|
|
57
|
-
deregisterSocket(socket.data.id);
|
|
58
|
-
if (presenceConfig)
|
|
59
|
-
untrackSocket(socket.data.id);
|
|
60
|
-
cleanupSocket(socket.data.id, socket.data.rooms);
|
|
61
|
-
socket.data.rooms.clear();
|
|
62
|
-
(userWs?.close ?? defaultClose)(socket, code, reason);
|
|
63
|
-
},
|
|
64
|
-
pong(socket) {
|
|
65
|
-
if (heartbeatEnabled)
|
|
66
|
-
handlePong(socket.data.id);
|
|
67
|
-
},
|
|
68
|
-
drain: userWs?.drain ?? defaultDrain,
|
|
69
|
-
};
|
|
70
|
-
let server;
|
|
71
|
-
server = Bun.serve({
|
|
72
|
-
port,
|
|
73
|
-
routes: {
|
|
74
|
-
"/ws": (req) => wsUpgradeHandler
|
|
75
|
-
? wsUpgradeHandler(req, server)
|
|
76
|
-
: createWsUpgradeHandler(server)(req),
|
|
77
|
-
},
|
|
78
|
-
fetch: app.fetch,
|
|
79
|
-
websocket: ws,
|
|
80
|
-
...(maxRequestBodySize !== undefined ? { maxRequestBodySize } : {}),
|
|
81
|
-
error(err) {
|
|
82
|
-
console.error(err);
|
|
83
|
-
return Response.json({ error: "Internal Server Error" }, { status: 500 });
|
|
84
|
-
},
|
|
85
|
-
});
|
|
86
|
-
setWsServer(server);
|
|
87
|
-
// Start heartbeat after server is ready
|
|
88
|
-
if (heartbeatEnabled)
|
|
89
|
-
startHeartbeat(heartbeatConfig);
|
|
90
|
-
// Graceful shutdown — stop heartbeat alongside existing cleanup
|
|
91
|
-
const gracefulShutdown = () => { stopHeartbeat(); };
|
|
92
|
-
process.on("SIGTERM", gracefulShutdown);
|
|
93
|
-
process.on("SIGINT", gracefulShutdown);
|
|
94
|
-
if (enableWorkers && workersDir) {
|
|
95
|
-
const glob = new Bun.Glob("**/*.ts");
|
|
96
|
-
for await (const file of glob.scan({ cwd: workersDir })) {
|
|
97
|
-
await import(`${workersDir}/${file}`);
|
|
98
|
-
}
|
|
99
|
-
// Clean up ghost cron schedulers after all workers are loaded
|
|
100
|
-
try {
|
|
101
|
-
const { getRegisteredCronNames, cleanupStaleSchedulers } = await import("./lib/queue");
|
|
102
|
-
const activeNames = [...getRegisteredCronNames()];
|
|
103
|
-
if (activeNames.length > 0) {
|
|
104
|
-
await cleanupStaleSchedulers(activeNames);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
catch { /* bullmq not installed or no cron workers */ }
|
|
108
|
-
}
|
|
109
|
-
log(`[server] running at http://localhost:${server.port}`);
|
|
110
|
-
log(`[server] API docs at http://localhost:${server.port}/docs`);
|
|
111
|
-
return server;
|
|
112
|
-
};
|
package/dist/services/auth.d.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import type { SessionMetadata } from "../lib/session";
|
|
2
|
-
export interface AuthResult {
|
|
3
|
-
token: string;
|
|
4
|
-
userId: string;
|
|
5
|
-
email?: string;
|
|
6
|
-
emailVerified?: boolean;
|
|
7
|
-
googleLinked?: boolean;
|
|
8
|
-
refreshToken?: string;
|
|
9
|
-
mfaRequired?: boolean;
|
|
10
|
-
mfaToken?: string;
|
|
11
|
-
mfaMethods?: string[];
|
|
12
|
-
webauthnOptions?: Record<string, unknown>;
|
|
13
|
-
}
|
|
14
|
-
/** Create a session for a user (used internally and by MFA verify). */
|
|
15
|
-
export declare const createSessionForUser: (userId: string, metadata?: SessionMetadata) => Promise<{
|
|
16
|
-
token: string;
|
|
17
|
-
refreshToken?: string;
|
|
18
|
-
}>;
|
|
19
|
-
export declare const register: (identifier: string, password: string, metadata?: SessionMetadata) => Promise<AuthResult>;
|
|
20
|
-
export declare const login: (identifier: string, password: string, metadata?: SessionMetadata) => Promise<AuthResult>;
|
|
21
|
-
export declare const refresh: (refreshTokenValue: string) => Promise<{
|
|
22
|
-
token: string;
|
|
23
|
-
refreshToken: string;
|
|
24
|
-
userId: string;
|
|
25
|
-
}>;
|
|
26
|
-
export declare const deleteAccount: (userId: string, password?: string) => Promise<void>;
|
|
27
|
-
export declare const logout: (token: string | null) => Promise<void>;
|
package/dist/services/auth.js
DELETED
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
import { getAuthAdapter } from "../lib/authAdapter";
|
|
2
|
-
import { HttpError } from "../lib/HttpError";
|
|
3
|
-
import { signToken, verifyToken } from "../lib/jwt";
|
|
4
|
-
import { createSession, deleteSession, getActiveSessionCount, evictOldestSession, deleteUserSessions, setRefreshToken, getSessionByRefreshToken, rotateRefreshToken } from "../lib/session";
|
|
5
|
-
import { getDefaultRole, getPrimaryField, getEmailVerificationConfig, getMaxSessions, getRefreshTokenConfig, getAccessTokenExpiry, getMfaConfig, getMfaEmailOtpConfig, getMfaWebAuthnConfig } from "../lib/appConfig";
|
|
6
|
-
import { createVerificationToken } from "../lib/emailVerification";
|
|
7
|
-
import { createMfaChallenge } from "../lib/mfaChallenge";
|
|
8
|
-
import { generateEmailOtpCode, generateWebAuthnAuthenticationOptions } from "./mfa";
|
|
9
|
-
async function createSessionWithRefreshToken(userId, sessionId, metadata) {
|
|
10
|
-
const rtConfig = getRefreshTokenConfig();
|
|
11
|
-
const expirySeconds = rtConfig ? getAccessTokenExpiry() : undefined;
|
|
12
|
-
const token = await signToken(userId, sessionId, expirySeconds);
|
|
13
|
-
while (await getActiveSessionCount(userId) >= getMaxSessions()) {
|
|
14
|
-
await evictOldestSession(userId);
|
|
15
|
-
}
|
|
16
|
-
await createSession(userId, token, sessionId, metadata);
|
|
17
|
-
let refreshToken;
|
|
18
|
-
if (rtConfig) {
|
|
19
|
-
refreshToken = crypto.randomUUID();
|
|
20
|
-
await setRefreshToken(sessionId, refreshToken);
|
|
21
|
-
}
|
|
22
|
-
return { token, refreshToken, sessionId };
|
|
23
|
-
}
|
|
24
|
-
/** Create a session for a user (used internally and by MFA verify). */
|
|
25
|
-
export const createSessionForUser = async (userId, metadata) => {
|
|
26
|
-
const sessionId = crypto.randomUUID();
|
|
27
|
-
return createSessionWithRefreshToken(userId, sessionId, metadata);
|
|
28
|
-
};
|
|
29
|
-
export const register = async (identifier, password, metadata) => {
|
|
30
|
-
const hashed = await Bun.password.hash(password);
|
|
31
|
-
const adapter = getAuthAdapter();
|
|
32
|
-
const user = await adapter.create(identifier, hashed);
|
|
33
|
-
const role = getDefaultRole();
|
|
34
|
-
if (role)
|
|
35
|
-
await adapter.setRoles(user.id, [role]);
|
|
36
|
-
const sessionId = crypto.randomUUID();
|
|
37
|
-
const { token, refreshToken } = await createSessionWithRefreshToken(user.id, sessionId, metadata);
|
|
38
|
-
const evConfig = getEmailVerificationConfig();
|
|
39
|
-
if (evConfig && getPrimaryField() === "email") {
|
|
40
|
-
try {
|
|
41
|
-
const verificationToken = await createVerificationToken(user.id, identifier);
|
|
42
|
-
await evConfig.onSend(identifier, verificationToken);
|
|
43
|
-
}
|
|
44
|
-
catch (e) {
|
|
45
|
-
console.error("[email-verification] Failed to send verification email:", e);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return { token, userId: user.id, email: identifier, refreshToken };
|
|
49
|
-
};
|
|
50
|
-
// Pre-computed dummy hash so non-existent-user login takes the same time as wrong-password login
|
|
51
|
-
const DUMMY_HASH = await Bun.password.hash("dummy-timing-safe-placeholder");
|
|
52
|
-
export const login = async (identifier, password, metadata) => {
|
|
53
|
-
const adapter = getAuthAdapter();
|
|
54
|
-
const findFn = adapter.findByIdentifier ?? adapter.findByEmail.bind(adapter);
|
|
55
|
-
const user = await findFn(identifier);
|
|
56
|
-
// Always verify against a hash to prevent timing-based user enumeration
|
|
57
|
-
const hashToVerify = user?.passwordHash ?? DUMMY_HASH;
|
|
58
|
-
const passwordValid = await Bun.password.verify(password, hashToVerify);
|
|
59
|
-
if (!user || !passwordValid) {
|
|
60
|
-
throw new HttpError(401, "Invalid credentials");
|
|
61
|
-
}
|
|
62
|
-
// Check email verification before MFA to avoid leaking MFA status to unverified users
|
|
63
|
-
const fullUser = adapter.getUser ? await adapter.getUser(user.id) : null;
|
|
64
|
-
const googleLinked = fullUser?.providerIds?.some((id) => id.startsWith("google:")) ?? false;
|
|
65
|
-
const evConfig = getEmailVerificationConfig();
|
|
66
|
-
if (evConfig && getPrimaryField() === "email" && adapter.getEmailVerified) {
|
|
67
|
-
const verified = await adapter.getEmailVerified(user.id);
|
|
68
|
-
if (evConfig.required && !verified) {
|
|
69
|
-
throw new HttpError(403, "Email not verified");
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
// Check MFA — if enabled, return challenge token instead of session
|
|
73
|
-
if (getMfaConfig() && adapter.isMfaEnabled && await adapter.isMfaEnabled(user.id)) {
|
|
74
|
-
const methods = adapter.getMfaMethods
|
|
75
|
-
? await adapter.getMfaMethods(user.id)
|
|
76
|
-
: ["totp"];
|
|
77
|
-
// Auto-send email OTP if enabled
|
|
78
|
-
let emailOtpHash;
|
|
79
|
-
const emailOtpConfig = getMfaEmailOtpConfig();
|
|
80
|
-
if (methods.includes("emailOtp") && emailOtpConfig) {
|
|
81
|
-
const { code, hash } = generateEmailOtpCode();
|
|
82
|
-
emailOtpHash = hash;
|
|
83
|
-
const email = fullUser?.email;
|
|
84
|
-
if (email)
|
|
85
|
-
await emailOtpConfig.onSend(email, code);
|
|
86
|
-
}
|
|
87
|
-
// Generate WebAuthn authentication options if enabled
|
|
88
|
-
let webauthnChallenge;
|
|
89
|
-
let webauthnOptions;
|
|
90
|
-
const webauthnConfig = getMfaWebAuthnConfig();
|
|
91
|
-
if (methods.includes("webauthn") && webauthnConfig && adapter.getWebAuthnCredentials) {
|
|
92
|
-
const result = await generateWebAuthnAuthenticationOptions(user.id);
|
|
93
|
-
if (result) {
|
|
94
|
-
webauthnChallenge = result.challenge;
|
|
95
|
-
webauthnOptions = result.options;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
const mfaToken = await createMfaChallenge(user.id, { emailOtpHash, webauthnChallenge });
|
|
99
|
-
return { token: "", userId: user.id, mfaRequired: true, mfaToken, mfaMethods: methods, webauthnOptions };
|
|
100
|
-
}
|
|
101
|
-
const sessionId = crypto.randomUUID();
|
|
102
|
-
const { token, refreshToken } = await createSessionWithRefreshToken(user.id, sessionId, metadata);
|
|
103
|
-
if (evConfig && getPrimaryField() === "email" && adapter.getEmailVerified) {
|
|
104
|
-
const verified = await adapter.getEmailVerified(user.id);
|
|
105
|
-
return { token, userId: user.id, email: fullUser?.email, emailVerified: verified, googleLinked, refreshToken };
|
|
106
|
-
}
|
|
107
|
-
return { token, userId: user.id, email: fullUser?.email, googleLinked, refreshToken };
|
|
108
|
-
};
|
|
109
|
-
export const refresh = async (refreshTokenValue) => {
|
|
110
|
-
const result = await getSessionByRefreshToken(refreshTokenValue);
|
|
111
|
-
if (!result) {
|
|
112
|
-
throw new HttpError(401, "Invalid or expired refresh token");
|
|
113
|
-
}
|
|
114
|
-
const { sessionId, userId, newRefreshToken } = result;
|
|
115
|
-
// If the returned newRefreshToken differs from what was sent, we're in a grace window replay.
|
|
116
|
-
// Return the current tokens without rotating again.
|
|
117
|
-
if (newRefreshToken !== refreshTokenValue) {
|
|
118
|
-
const accessToken = await signToken(userId, sessionId, getAccessTokenExpiry());
|
|
119
|
-
return { token: accessToken, refreshToken: newRefreshToken, userId };
|
|
120
|
-
}
|
|
121
|
-
// Normal rotation: generate new refresh + access tokens
|
|
122
|
-
const newRT = crypto.randomUUID();
|
|
123
|
-
const newAccessToken = await signToken(userId, sessionId, getAccessTokenExpiry());
|
|
124
|
-
await rotateRefreshToken(sessionId, newRT, newAccessToken);
|
|
125
|
-
return { token: newAccessToken, refreshToken: newRT, userId };
|
|
126
|
-
};
|
|
127
|
-
export const deleteAccount = async (userId, password) => {
|
|
128
|
-
const adapter = getAuthAdapter();
|
|
129
|
-
if (!adapter.deleteUser) {
|
|
130
|
-
throw new HttpError(501, "Auth adapter does not support deleteUser");
|
|
131
|
-
}
|
|
132
|
-
// Verify password for credential accounts
|
|
133
|
-
if (password) {
|
|
134
|
-
const user = adapter.getUser ? await adapter.getUser(userId) : null;
|
|
135
|
-
const email = user?.email;
|
|
136
|
-
if (email) {
|
|
137
|
-
const findFn = adapter.findByIdentifier ?? adapter.findByEmail.bind(adapter);
|
|
138
|
-
const found = await findFn(email);
|
|
139
|
-
if (found && !(await Bun.password.verify(password, found.passwordHash))) {
|
|
140
|
-
throw new HttpError(401, "Invalid password");
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
else if (adapter.hasPassword && await adapter.hasPassword(userId)) {
|
|
145
|
-
throw new HttpError(400, "Password is required to delete a credential account");
|
|
146
|
-
}
|
|
147
|
-
// Revoke all sessions
|
|
148
|
-
await deleteUserSessions(userId);
|
|
149
|
-
// Delete the user
|
|
150
|
-
await adapter.deleteUser(userId);
|
|
151
|
-
};
|
|
152
|
-
export const logout = async (token) => {
|
|
153
|
-
if (token) {
|
|
154
|
-
const payload = await verifyToken(token);
|
|
155
|
-
const sessionId = payload.sid;
|
|
156
|
-
if (sessionId)
|
|
157
|
-
await deleteSession(sessionId);
|
|
158
|
-
}
|
|
159
|
-
};
|
package/dist/ws/index.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { Server, WebSocketHandler } from "bun";
|
|
2
|
-
export type SocketData<T extends object = object> = {
|
|
3
|
-
id: string;
|
|
4
|
-
userId: string | null;
|
|
5
|
-
rooms: Set<string>;
|
|
6
|
-
} & T;
|
|
7
|
-
type BaseSocketData = SocketData<object>;
|
|
8
|
-
export declare const createWsUpgradeHandler: (server: Server<BaseSocketData>) => (req: Request) => Promise<Response | undefined>;
|
|
9
|
-
export declare const websocket: WebSocketHandler<BaseSocketData>;
|
|
10
|
-
export {};
|
package/dist/ws/index.js
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { verifyToken } from "../lib/jwt";
|
|
2
|
-
import { getSession } from "../lib/session";
|
|
3
|
-
import { COOKIE_TOKEN } from "../lib/constants";
|
|
4
|
-
import { trackSocket, untrackSocket } from "../lib/wsPresence";
|
|
5
|
-
export const createWsUpgradeHandler = (server) => async (req) => {
|
|
6
|
-
let userId = null;
|
|
7
|
-
try {
|
|
8
|
-
const token = req.headers.get("cookie")
|
|
9
|
-
?.match(new RegExp(`(?:^|;\\s*)${COOKIE_TOKEN}=([^;]+)`))?.[1] ?? null;
|
|
10
|
-
if (token) {
|
|
11
|
-
const payload = await verifyToken(token);
|
|
12
|
-
const sessionId = payload.sid;
|
|
13
|
-
if (sessionId) {
|
|
14
|
-
const stored = await getSession(sessionId);
|
|
15
|
-
if (stored === token)
|
|
16
|
-
userId = payload.sub;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
catch { /* unauthenticated — userId stays null */ }
|
|
21
|
-
const upgraded = server.upgrade(req, { data: { id: crypto.randomUUID(), userId, rooms: new Set() } });
|
|
22
|
-
return upgraded ? undefined : Response.json({ error: "Upgrade failed" }, { status: 400 });
|
|
23
|
-
};
|
|
24
|
-
export const websocket = {
|
|
25
|
-
open(ws) {
|
|
26
|
-
trackSocket(ws.data.id, ws.data.userId);
|
|
27
|
-
console.log(`[ws] connected: ${ws.data.id}`);
|
|
28
|
-
ws.send(JSON.stringify({ event: "connected", id: ws.data.id }));
|
|
29
|
-
},
|
|
30
|
-
message(_ws, _message) {
|
|
31
|
-
// No-op: room actions are handled by server.ts via handleRoomActions.
|
|
32
|
-
// Override ws.handler.message in WsConfig for custom message handling.
|
|
33
|
-
},
|
|
34
|
-
close(ws) {
|
|
35
|
-
untrackSocket(ws.data.id);
|
|
36
|
-
console.log(`[ws] disconnected: ${ws.data.id}`);
|
|
37
|
-
},
|
|
38
|
-
};
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
## Adding Middleware
|
|
2
|
-
|
|
3
|
-
### Global (runs on every request)
|
|
4
|
-
|
|
5
|
-
Pass via `middleware` config — injected after `identify`, before route matching:
|
|
6
|
-
|
|
7
|
-
```ts
|
|
8
|
-
await createServer({
|
|
9
|
-
routesDir: import.meta.dir + "/routes",
|
|
10
|
-
app: { name: "My App", version: "1.0.0" },
|
|
11
|
-
middleware: [myMiddleware],
|
|
12
|
-
});
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
Write it using core's exported types:
|
|
16
|
-
|
|
17
|
-
```ts
|
|
18
|
-
// src/middleware/tenant.ts
|
|
19
|
-
import type { MiddlewareHandler } from "hono";
|
|
20
|
-
import type { AppEnv } from "@lastshotlabs/bunshot";
|
|
21
|
-
|
|
22
|
-
export const tenantMiddleware: MiddlewareHandler<AppEnv> = async (c, next) => {
|
|
23
|
-
// c.get("userId") is available — identify has already run
|
|
24
|
-
await next();
|
|
25
|
-
};
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
### Per-route
|
|
29
|
-
|
|
30
|
-
```ts
|
|
31
|
-
import { userAuth, rateLimit } from "@lastshotlabs/bunshot";
|
|
32
|
-
|
|
33
|
-
router.use("/admin", userAuth);
|
|
34
|
-
router.use("/admin", rateLimit({ windowMs: 60_000, max: 10 }));
|
|
35
|
-
```
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
## Adding Models
|
|
2
|
-
|
|
3
|
-
Import `appConnection` and register models on it. This ensures your models use the correct connection whether you're on a single DB or a separate tenant DB.
|
|
4
|
-
|
|
5
|
-
`appConnection` is a lazy proxy — calling `.model()` at the top level works fine even before `connectMongo()` has been called. Mongoose buffers any queries until the connection is established.
|
|
6
|
-
|
|
7
|
-
```ts
|
|
8
|
-
// src/models/Product.ts
|
|
9
|
-
import { appConnection } from "@lastshotlabs/bunshot";
|
|
10
|
-
import { Schema } from "mongoose";
|
|
11
|
-
import type { HydratedDocument } from "mongoose";
|
|
12
|
-
|
|
13
|
-
interface IProduct {
|
|
14
|
-
name: string;
|
|
15
|
-
price: number;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export type ProductDocument = HydratedDocument<IProduct>;
|
|
19
|
-
|
|
20
|
-
const ProductSchema = new Schema<IProduct>({
|
|
21
|
-
name: { type: String, required: true },
|
|
22
|
-
price: { type: Number, required: true },
|
|
23
|
-
}, { timestamps: true });
|
|
24
|
-
|
|
25
|
-
export const Product = appConnection.model<IProduct>("Product", ProductSchema);
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
> **Note:** Import types (`HydratedDocument`, `Schema`, etc.) directly from `"mongoose"` — the `appConnection` and `mongoose` exports from bunshot are runtime proxies and cannot be used as TypeScript namespaces.
|
|
29
|
-
|
|
30
|
-
### Zod as Single Source of Truth
|
|
31
|
-
|
|
32
|
-
If you use Zod schemas for your OpenAPI spec (via `createRoute` or `modelSchemas`), you can derive your Mongoose schemas and DTO mappers from those same Zod definitions — so each entity is defined **once**.
|
|
33
|
-
|
|
34
|
-
#### `zodToMongoose` — Zod → Mongoose SchemaDefinition
|
|
35
|
-
|
|
36
|
-
Converts a Zod object schema into a Mongoose field definition. Business fields are auto-converted; DB-specific concerns (ObjectId refs, type overrides, subdocuments) are declared via config. The `id` field is automatically excluded since Mongoose provides `_id`.
|
|
37
|
-
|
|
38
|
-
```ts
|
|
39
|
-
import { appConnection, zodToMongoose } from "@lastshotlabs/bunshot";
|
|
40
|
-
import { Schema, type HydratedDocument } from "mongoose";
|
|
41
|
-
import { ProductSchema } from "../schemas/product"; // your Zod schema
|
|
42
|
-
import type { ProductDto } from "../schemas/product";
|
|
43
|
-
|
|
44
|
-
// DB interface derives from Zod DTO type
|
|
45
|
-
interface IProduct extends Omit<ProductDto, "id" | "categoryId"> {
|
|
46
|
-
user: Types.ObjectId;
|
|
47
|
-
category: Types.ObjectId;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const ProductMongoSchema = new Schema<IProduct>(
|
|
51
|
-
zodToMongoose(ProductSchema, {
|
|
52
|
-
dbFields: {
|
|
53
|
-
user: { type: Schema.Types.ObjectId, ref: "UserProfile", required: true },
|
|
54
|
-
},
|
|
55
|
-
refs: {
|
|
56
|
-
categoryId: { dbField: "category", ref: "Category" },
|
|
57
|
-
},
|
|
58
|
-
typeOverrides: {
|
|
59
|
-
createdAt: { type: Date, required: true },
|
|
60
|
-
},
|
|
61
|
-
}) as Record<string, unknown>,
|
|
62
|
-
{ timestamps: true }
|
|
63
|
-
);
|
|
64
|
-
|
|
65
|
-
export type ProductDocument = HydratedDocument<IProduct>;
|
|
66
|
-
export const Product = appConnection.model<IProduct>("Product", ProductMongoSchema);
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
**Config options:**
|
|
70
|
-
|
|
71
|
-
| Option | Description |
|
|
72
|
-
|---|---|
|
|
73
|
-
| `dbFields` | Fields that exist only in the DB, not in the API schema (e.g., `user` ObjectId ref) |
|
|
74
|
-
| `refs` | API fields that map to ObjectId refs: `{ accountId: { dbField: "account", ref: "Account" } }` |
|
|
75
|
-
| `typeOverrides` | Override the auto-converted Mongoose type for a field (e.g., Zod `z.string()` for dates → Mongoose `Date`) |
|
|
76
|
-
| `subdocSchemas` | Subdocument array fields: `{ items: mongooseSubSchema }` |
|
|
77
|
-
|
|
78
|
-
**Auto-conversion mapping:**
|
|
79
|
-
|
|
80
|
-
| Zod type | Mongoose type |
|
|
81
|
-
|---|---|
|
|
82
|
-
| `z.string()` | `String` |
|
|
83
|
-
| `z.number()` | `Number` |
|
|
84
|
-
| `z.boolean()` | `Boolean` |
|
|
85
|
-
| `z.date()` | `Date` |
|
|
86
|
-
| `z.enum([...])` | `String` with `enum` |
|
|
87
|
-
| `.nullable()` / `.optional()` | `required: false` |
|
|
88
|
-
|
|
89
|
-
#### `createDtoMapper` — Zod → toDto mapper
|
|
90
|
-
|
|
91
|
-
Creates a generic `toDto` function from a Zod schema. The schema defines which fields exist in the DTO; the config declares how to transform DB-specific types.
|
|
92
|
-
|
|
93
|
-
```ts
|
|
94
|
-
import { createDtoMapper } from "@lastshotlabs/bunshot";
|
|
95
|
-
import { ProductSchema, type ProductDto } from "../schemas/product";
|
|
96
|
-
|
|
97
|
-
const toDto = createDtoMapper<ProductDto>(ProductSchema, {
|
|
98
|
-
refs: { category: "categoryId" }, // ObjectId ref → string, with rename
|
|
99
|
-
dates: ["createdAt"], // Date → ISO string
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
// Use it
|
|
103
|
-
const product = await Product.findOne({ _id: id });
|
|
104
|
-
return product ? toDto(product) : null;
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
**Auto-handled transforms:**
|
|
108
|
-
|
|
109
|
-
| Transform | Description |
|
|
110
|
-
|---|---|
|
|
111
|
-
| `_id` → `id` | Always converted via `.toString()` |
|
|
112
|
-
| `refs` | ObjectId fields → string (`.toString()`), with DB→API field renaming |
|
|
113
|
-
| `dates` | `Date` objects → ISO strings (`.toISOString()`) |
|
|
114
|
-
| `subdocs` | Array fields mapped with a sub-mapper (for nested documents) |
|
|
115
|
-
| nullable/optional | `undefined` → `null` coercion (based on Zod schema) |
|
|
116
|
-
| everything else | Passthrough |
|
|
117
|
-
|
|
118
|
-
**Subdocument example:**
|
|
119
|
-
|
|
120
|
-
```ts
|
|
121
|
-
const itemToDto = createDtoMapper<TemplateItemDto>(TemplateItemSchema);
|
|
122
|
-
const toDto = createDtoMapper<TemplateDto>(TemplateSchema, {
|
|
123
|
-
subdocs: { items: itemToDto },
|
|
124
|
-
});
|
|
125
|
-
```
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
## Adding Models
|
|
2
|
-
|
|
3
|
-
Import `appConnection` and register Mongoose models on it. `appConnection` is a lazy proxy — `.model()` works before `connectMongo()` has been called.
|
|
4
|
-
|
|
5
|
-
```ts
|
|
6
|
-
import { appConnection } from "@lastshotlabs/bunshot";
|
|
7
|
-
import { Schema, type HydratedDocument } from "mongoose";
|
|
8
|
-
|
|
9
|
-
const ProductSchema = new Schema({ name: String, price: Number }, { timestamps: true });
|
|
10
|
-
export const Product = appConnection.model("Product", ProductSchema);
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
Bunshot also provides `zodToMongoose` (Zod -> Mongoose schema conversion) and `createDtoMapper` (DB document -> API DTO) to use Zod as the single source of truth for your models and OpenAPI spec.
|