@lastshotlabs/bunshot 0.0.27 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.oclif.manifest.json +39 -0
- package/README.md +8282 -2147
- package/dist/cli/commands/init.js +690 -0
- package/dist/cli/index.js +6 -0
- package/dist/cli.js +4 -4
- package/dist/packages/bunshot-admin/src/index.d.ts +15 -0
- package/dist/packages/bunshot-admin/src/index.js +11 -0
- package/dist/packages/bunshot-admin/src/lib/resourceTypes.d.ts +8 -0
- package/dist/packages/bunshot-admin/src/lib/resourceTypes.js +33 -0
- package/dist/packages/bunshot-admin/src/lib/typedRoute.d.ts +14 -0
- package/dist/packages/bunshot-admin/src/lib/typedRoute.js +17 -0
- package/dist/packages/bunshot-admin/src/plugin.d.ts +4 -0
- package/dist/packages/bunshot-admin/src/plugin.js +46 -0
- package/dist/packages/bunshot-admin/src/providers/auth0Access.d.ts +6 -0
- package/dist/packages/bunshot-admin/src/providers/auth0Access.js +32 -0
- package/dist/packages/bunshot-admin/src/routes/admin.d.ts +10 -0
- package/dist/packages/bunshot-admin/src/routes/admin.js +923 -0
- package/dist/packages/bunshot-admin/src/routes/mail.d.ts +6 -0
- package/dist/packages/bunshot-admin/src/routes/mail.js +114 -0
- package/dist/packages/bunshot-admin/src/routes/permissions.d.ts +8 -0
- package/dist/packages/bunshot-admin/src/routes/permissions.js +315 -0
- package/dist/packages/bunshot-admin/src/types/config.d.ts +16 -0
- package/dist/packages/bunshot-admin/src/types/config.js +37 -0
- package/dist/packages/bunshot-admin/src/types/env.d.ts +14 -0
- package/dist/packages/bunshot-admin/src/types/provider.d.ts +1 -0
- package/dist/packages/bunshot-admin/src/types/provider.js +4 -0
- package/dist/packages/bunshot-auth/src/adapters/memoryAuth.d.ts +66 -0
- package/dist/packages/bunshot-auth/src/adapters/memoryAuth.js +1063 -0
- package/dist/packages/bunshot-auth/src/adapters/mongoAuth.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/adapters/mongoAuth.js +536 -0
- package/dist/packages/bunshot-auth/src/adapters/sqliteAuth.d.ts +88 -0
- package/dist/packages/bunshot-auth/src/adapters/sqliteAuth.js +1366 -0
- package/dist/packages/bunshot-auth/src/admin/bunshotAccess.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/admin/bunshotAccess.js +23 -0
- package/dist/packages/bunshot-auth/src/admin/bunshotUsers.d.ts +5 -0
- package/dist/packages/bunshot-auth/src/admin/bunshotUsers.js +131 -0
- package/dist/packages/bunshot-auth/src/bootstrap.d.ts +38 -0
- package/dist/packages/bunshot-auth/src/bootstrap.js +384 -0
- package/dist/packages/bunshot-auth/src/config/appConfig.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/config/appConfig.js +4 -0
- package/dist/packages/bunshot-auth/src/config/authConfig.d.ts +478 -0
- package/dist/packages/bunshot-auth/src/config/authConfig.js +46 -0
- package/dist/packages/bunshot-auth/src/config/configLock.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/config/configLock.js +10 -0
- package/dist/packages/bunshot-auth/src/index.d.ts +25 -0
- package/dist/packages/bunshot-auth/src/index.js +23 -0
- package/dist/packages/bunshot-auth/src/infra/mongo.d.ts +15 -0
- package/dist/packages/bunshot-auth/src/infra/mongo.js +44 -0
- package/dist/packages/bunshot-auth/src/infra/queue.d.ts +14 -0
- package/dist/packages/bunshot-auth/src/infra/queue.js +27 -0
- package/dist/packages/bunshot-auth/src/infra/redis.d.ts +5 -0
- package/dist/packages/bunshot-auth/src/infra/redis.js +15 -0
- package/dist/packages/bunshot-auth/src/infra/signing.d.ts +7 -0
- package/dist/packages/bunshot-auth/src/infra/signing.js +8 -0
- package/dist/packages/bunshot-auth/src/lib/accountLockout.d.ts +34 -0
- package/dist/packages/bunshot-auth/src/lib/accountLockout.js +244 -0
- package/dist/packages/bunshot-auth/src/lib/adapterTiers.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/lib/adapterTiers.js +1 -0
- package/dist/packages/bunshot-auth/src/lib/authAdapter.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/lib/authAdapter.js +1 -0
- package/dist/packages/bunshot-auth/src/lib/authContext.d.ts +15 -0
- package/dist/packages/bunshot-auth/src/lib/authContext.js +1 -0
- package/dist/packages/bunshot-auth/src/lib/authEventBus.d.ts +4 -0
- package/dist/packages/bunshot-auth/src/lib/authEventBus.js +15 -0
- package/dist/packages/bunshot-auth/src/lib/authRateLimit.d.ts +28 -0
- package/dist/packages/bunshot-auth/src/lib/authRateLimit.js +205 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/breachedPassword.d.ts +8 -2
- package/dist/{lib → packages/bunshot-auth/src/lib}/breachedPassword.js +22 -9
- package/dist/packages/bunshot-auth/src/lib/cache.d.ts +12 -0
- package/dist/packages/bunshot-auth/src/lib/cache.js +120 -0
- package/dist/packages/bunshot-auth/src/lib/clientIp.d.ts +4 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/clientIp.js +14 -7
- package/dist/packages/bunshot-auth/src/lib/cookieOptions.d.ts +27 -0
- package/dist/packages/bunshot-auth/src/lib/cookieOptions.js +33 -0
- package/dist/packages/bunshot-auth/src/lib/credentialStuffing.d.ts +40 -0
- package/dist/packages/bunshot-auth/src/lib/credentialStuffing.js +211 -0
- package/dist/packages/bunshot-auth/src/lib/deletionCancelToken.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/lib/deletionCancelToken.js +148 -0
- package/dist/packages/bunshot-auth/src/lib/emailTemplates.d.ts +23 -0
- package/dist/packages/bunshot-auth/src/lib/emailTemplates.js +265 -0
- package/dist/packages/bunshot-auth/src/lib/emailVerification.d.ts +30 -0
- package/dist/packages/bunshot-auth/src/lib/emailVerification.js +200 -0
- package/dist/packages/bunshot-auth/src/lib/env.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/lib/env.js +3 -0
- package/dist/packages/bunshot-auth/src/lib/fingerprint.js +36 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/groups.d.ts +15 -16
- package/dist/{lib → packages/bunshot-auth/src/lib}/groups.js +22 -34
- package/dist/packages/bunshot-auth/src/lib/jwks.d.ts +28 -0
- package/dist/packages/bunshot-auth/src/lib/jwks.js +79 -0
- package/dist/packages/bunshot-auth/src/lib/jwt.d.ts +12 -0
- package/dist/packages/bunshot-auth/src/lib/jwt.js +86 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/logger.js +3 -3
- package/dist/{lib → packages/bunshot-auth/src/lib}/m2m.d.ts +5 -4
- package/dist/{lib → packages/bunshot-auth/src/lib}/m2m.js +6 -10
- package/dist/packages/bunshot-auth/src/lib/magicLink.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/lib/magicLink.js +145 -0
- package/dist/packages/bunshot-auth/src/lib/mfaChallenge.d.ts +60 -0
- package/dist/packages/bunshot-auth/src/lib/mfaChallenge.js +419 -0
- package/dist/packages/bunshot-auth/src/lib/oauth.d.ts +82 -0
- package/dist/packages/bunshot-auth/src/lib/oauth.js +177 -0
- package/dist/packages/bunshot-auth/src/lib/oauthCode.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/lib/oauthCode.js +182 -0
- package/dist/packages/bunshot-auth/src/lib/oauthReauth.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/lib/oauthReauth.js +255 -0
- package/dist/packages/bunshot-auth/src/lib/organization.d.ts +66 -0
- package/dist/packages/bunshot-auth/src/lib/organization.js +225 -0
- package/dist/packages/bunshot-auth/src/lib/passwordHistory.d.ts +12 -0
- package/dist/packages/bunshot-auth/src/lib/passwordHistory.js +31 -0
- package/dist/packages/bunshot-auth/src/lib/resetPassword.d.ts +20 -0
- package/dist/packages/bunshot-auth/src/lib/resetPassword.js +148 -0
- package/dist/packages/bunshot-auth/src/lib/roles.d.ts +9 -0
- package/dist/packages/bunshot-auth/src/lib/roles.js +93 -0
- package/dist/packages/bunshot-auth/src/lib/saml.d.ts +29 -0
- package/dist/packages/bunshot-auth/src/lib/saml.js +73 -0
- package/dist/packages/bunshot-auth/src/lib/samlRequestId.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/lib/samlRequestId.js +129 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/scim.d.ts +7 -7
- package/dist/{lib → packages/bunshot-auth/src/lib}/scim.js +15 -13
- package/dist/packages/bunshot-auth/src/lib/securityEventWiring.d.ts +22 -0
- package/dist/packages/bunshot-auth/src/lib/securityEventWiring.js +65 -0
- package/dist/packages/bunshot-auth/src/lib/session.d.ts +45 -0
- package/dist/packages/bunshot-auth/src/lib/session.js +1211 -0
- package/dist/packages/bunshot-auth/src/lib/storeInfra.d.ts +26 -0
- package/dist/packages/bunshot-auth/src/lib/storeInfra.js +18 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/suspension.d.ts +3 -2
- package/dist/{lib → packages/bunshot-auth/src/lib}/suspension.js +2 -5
- package/dist/packages/bunshot-auth/src/lib/validateAdapter.d.ts +16 -0
- package/dist/packages/bunshot-auth/src/lib/validateAdapter.js +161 -0
- package/dist/packages/bunshot-auth/src/middleware/bearerAuth.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/middleware/bearerAuth.js +58 -0
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/csrf.d.ts +5 -4
- package/dist/packages/bunshot-auth/src/middleware/csrf.js +138 -0
- package/dist/packages/bunshot-auth/src/middleware/identify.d.ts +4 -0
- package/dist/packages/bunshot-auth/src/middleware/identify.js +124 -0
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.js +10 -8
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.js +20 -16
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireScope.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireScope.js +6 -6
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireStepUp.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireStepUp.js +8 -7
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.js +7 -6
- package/dist/packages/bunshot-auth/src/middleware/scimAuth.d.ts +8 -0
- package/dist/packages/bunshot-auth/src/middleware/scimAuth.js +29 -0
- package/dist/packages/bunshot-auth/src/middleware/userAuth.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/middleware/userAuth.js +6 -0
- package/dist/{models → packages/bunshot-auth/src/models}/AuthUser.d.ts +12 -8
- package/dist/packages/bunshot-auth/src/models/AuthUser.js +53 -0
- package/dist/packages/bunshot-auth/src/models/Group.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/models/Group.js +22 -0
- package/dist/{models → packages/bunshot-auth/src/models}/GroupMembership.d.ts +6 -8
- package/dist/packages/bunshot-auth/src/models/GroupMembership.js +19 -0
- package/dist/{models → packages/bunshot-auth/src/models}/M2MClient.d.ts +1 -1
- package/dist/{models → packages/bunshot-auth/src/models}/M2MClient.js +5 -5
- package/dist/packages/bunshot-auth/src/models/TenantRole.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/models/TenantRole.js +17 -0
- package/dist/packages/bunshot-auth/src/plugin.d.ts +4 -0
- package/dist/packages/bunshot-auth/src/plugin.js +277 -0
- package/dist/packages/bunshot-auth/src/routes/auth.d.ts +15 -0
- package/dist/packages/bunshot-auth/src/routes/auth.js +1624 -0
- package/dist/packages/bunshot-auth/src/routes/groups.d.ts +4 -0
- package/dist/packages/bunshot-auth/src/routes/groups.js +481 -0
- package/dist/packages/bunshot-auth/src/routes/m2m.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/routes/m2m.js +145 -0
- package/dist/packages/bunshot-auth/src/routes/mfa.d.ts +6 -0
- package/dist/packages/bunshot-auth/src/routes/mfa.js +991 -0
- package/dist/packages/bunshot-auth/src/routes/oauth.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/routes/oauth.js +1727 -0
- package/dist/packages/bunshot-auth/src/routes/oidc.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/routes/oidc.js +84 -0
- package/dist/packages/bunshot-auth/src/routes/organizations.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/routes/organizations.js +741 -0
- package/dist/packages/bunshot-auth/src/routes/passkey.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/routes/passkey.js +199 -0
- package/dist/packages/bunshot-auth/src/routes/saml.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/routes/saml.js +226 -0
- package/dist/packages/bunshot-auth/src/routes/scim.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/routes/scim.js +588 -0
- package/dist/packages/bunshot-auth/src/runtime.d.ts +52 -0
- package/dist/packages/bunshot-auth/src/runtime.js +11 -0
- package/dist/{schemas → packages/bunshot-auth/src/schemas}/auth.d.ts +4 -5
- package/dist/packages/bunshot-auth/src/schemas/auth.js +24 -0
- package/dist/packages/bunshot-auth/src/schemas/error.d.ts +10 -0
- package/dist/packages/bunshot-auth/src/schemas/error.js +10 -0
- package/dist/packages/bunshot-auth/src/schemas/success.d.ts +10 -0
- package/dist/packages/bunshot-auth/src/schemas/success.js +10 -0
- package/dist/packages/bunshot-auth/src/services/auth.d.ts +39 -0
- package/dist/packages/bunshot-auth/src/services/auth.js +378 -0
- package/dist/{services → packages/bunshot-auth/src/services}/mfa.d.ts +41 -17
- package/dist/{services → packages/bunshot-auth/src/services}/mfa.js +259 -183
- package/dist/packages/bunshot-auth/src/testing.d.ts +31 -0
- package/dist/packages/bunshot-auth/src/testing.js +23 -0
- package/dist/packages/bunshot-auth/src/types/adapter.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/types/adapter.js +1 -0
- package/dist/packages/bunshot-auth/src/types/config.d.ts +152 -0
- package/dist/packages/bunshot-auth/src/types/config.js +179 -0
- package/dist/{routes → packages/bunshot-auth/src/types}/groups.d.ts +2 -3
- package/dist/packages/bunshot-auth/src/types/groups.js +1 -0
- package/dist/packages/bunshot-auth/src/types/oauthCode.d.ts +6 -0
- package/dist/packages/bunshot-auth/src/types/oauthCode.js +1 -0
- package/dist/packages/bunshot-auth/src/types/oauthReauth.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/types/oauthReauth.js +1 -0
- package/dist/packages/bunshot-auth/src/types/redis.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/types/redis.js +1 -0
- package/dist/packages/bunshot-auth/src/types/saml.d.ts +10 -0
- package/dist/packages/bunshot-auth/src/types/saml.js +1 -0
- package/dist/packages/bunshot-auth/src/types/session.d.ts +18 -0
- package/dist/packages/bunshot-auth/src/types/session.js +1 -0
- package/dist/packages/bunshot-auth/src/types/store.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/types/store.js +1 -0
- package/dist/packages/bunshot-core/src/adminProvider.d.ts +95 -0
- package/dist/packages/bunshot-core/src/adminProvider.js +1 -0
- package/dist/packages/bunshot-core/src/auditLog.d.ts +34 -0
- package/dist/packages/bunshot-core/src/auditLog.js +1 -0
- package/dist/packages/bunshot-core/src/auth-adapter.d.ts +227 -0
- package/dist/packages/bunshot-core/src/auth-adapter.js +4 -0
- package/dist/packages/bunshot-core/src/authVariables.d.ts +14 -0
- package/dist/packages/bunshot-core/src/authVariables.js +4 -0
- package/dist/packages/bunshot-core/src/cache.d.ts +12 -0
- package/dist/packages/bunshot-core/src/cache.js +21 -0
- package/dist/{lib → packages/bunshot-core/src}/captcha.d.ts +1 -10
- package/dist/packages/bunshot-core/src/captcha.js +1 -0
- package/dist/packages/bunshot-core/src/clearRegistry.d.ts +6 -0
- package/dist/packages/bunshot-core/src/clearRegistry.js +17 -0
- package/dist/packages/bunshot-core/src/clientIp.d.ts +3 -0
- package/dist/packages/bunshot-core/src/clientIp.js +45 -0
- package/dist/packages/bunshot-core/src/configLock.d.ts +4 -0
- package/dist/packages/bunshot-core/src/configLock.js +7 -0
- package/dist/packages/bunshot-core/src/configValidation.d.ts +22 -0
- package/dist/packages/bunshot-core/src/configValidation.js +39 -0
- package/dist/packages/bunshot-core/src/constants.js +10 -0
- package/dist/packages/bunshot-core/src/context/bunshotContext.d.ts +232 -0
- package/dist/packages/bunshot-core/src/context/bunshotContext.js +1 -0
- package/dist/packages/bunshot-core/src/context/contextAccess.d.ts +3 -0
- package/dist/packages/bunshot-core/src/context/contextAccess.js +16 -0
- package/dist/packages/bunshot-core/src/context/contextStore.d.ts +16 -0
- package/dist/packages/bunshot-core/src/context/contextStore.js +31 -0
- package/dist/packages/bunshot-core/src/context/frameworkConfig.d.ts +38 -0
- package/dist/packages/bunshot-core/src/context/frameworkConfig.js +1 -0
- package/dist/packages/bunshot-core/src/context/index.d.ts +4 -0
- package/dist/packages/bunshot-core/src/context/index.js +2 -0
- package/dist/packages/bunshot-core/src/context.d.ts +40 -0
- package/dist/packages/bunshot-core/src/context.js +35 -0
- package/dist/packages/bunshot-core/src/coreContracts.d.ts +47 -0
- package/dist/packages/bunshot-core/src/coreContracts.js +1 -0
- package/dist/packages/bunshot-core/src/coreRegistrar.d.ts +6 -0
- package/dist/packages/bunshot-core/src/coreRegistrar.js +42 -0
- package/dist/{lib → packages/bunshot-core/src}/createRoute.d.ts +4 -30
- package/dist/{lib → packages/bunshot-core/src}/createRoute.js +39 -88
- package/dist/packages/bunshot-core/src/cronRegistry.d.ts +11 -0
- package/dist/packages/bunshot-core/src/cronRegistry.js +1 -0
- package/dist/packages/bunshot-core/src/crypto.d.ts +43 -0
- package/dist/packages/bunshot-core/src/crypto.js +74 -0
- package/dist/packages/bunshot-core/src/csrf.d.ts +8 -0
- package/dist/packages/bunshot-core/src/csrf.js +1 -0
- package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.d.ts +7 -0
- package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.js +19 -0
- package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.d.ts +6 -0
- package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.js +40 -0
- package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.d.ts +6 -0
- package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.js +24 -0
- package/dist/packages/bunshot-core/src/emailTemplates.d.ts +5 -0
- package/dist/packages/bunshot-core/src/emailTemplates.js +10 -0
- package/dist/{lib/HttpError.d.ts → packages/bunshot-core/src/errors.d.ts} +4 -1
- package/dist/{lib/HttpError.js → packages/bunshot-core/src/errors.js} +7 -1
- package/dist/packages/bunshot-core/src/eventBus.d.ts +270 -0
- package/dist/packages/bunshot-core/src/eventBus.js +143 -0
- package/dist/packages/bunshot-core/src/idempotency.d.ts +18 -0
- package/dist/packages/bunshot-core/src/idempotency.js +1 -0
- package/dist/packages/bunshot-core/src/index.d.ts +60 -0
- package/dist/packages/bunshot-core/src/index.js +34 -0
- package/dist/packages/bunshot-core/src/mail.d.ts +14 -0
- package/dist/packages/bunshot-core/src/mail.js +8 -0
- package/dist/packages/bunshot-core/src/memoryEviction.d.ts +24 -0
- package/dist/packages/bunshot-core/src/memoryEviction.js +52 -0
- package/dist/packages/bunshot-core/src/pagination.d.ts +45 -0
- package/dist/packages/bunshot-core/src/pagination.js +61 -0
- package/dist/packages/bunshot-core/src/permissions.d.ts +64 -0
- package/dist/packages/bunshot-core/src/permissions.js +27 -0
- package/dist/packages/bunshot-core/src/plugin.d.ts +44 -0
- package/dist/packages/bunshot-core/src/plugin.js +1 -0
- package/dist/packages/bunshot-core/src/rateLimit.d.ts +5 -0
- package/dist/packages/bunshot-core/src/rateLimit.js +18 -0
- package/dist/packages/bunshot-core/src/redis.d.ts +21 -0
- package/dist/packages/bunshot-core/src/redis.js +1 -0
- package/dist/packages/bunshot-core/src/routeAuth.d.ts +5 -0
- package/dist/packages/bunshot-core/src/routeAuth.js +11 -0
- package/dist/packages/bunshot-core/src/routeOverrides.d.ts +24 -0
- package/dist/packages/bunshot-core/src/routeOverrides.js +25 -0
- package/dist/packages/bunshot-core/src/routerAdapter.d.ts +6 -0
- package/dist/packages/bunshot-core/src/routerAdapter.js +56 -0
- package/dist/packages/bunshot-core/src/secrets.d.ts +48 -0
- package/dist/packages/bunshot-core/src/secrets.js +8 -0
- package/dist/packages/bunshot-core/src/signing.d.ts +41 -0
- package/dist/packages/bunshot-core/src/signing.js +1 -0
- package/dist/packages/bunshot-core/src/sse.d.ts +36 -0
- package/dist/packages/bunshot-core/src/sse.js +1 -0
- package/dist/packages/bunshot-core/src/storageAdapter.js +1 -0
- package/dist/packages/bunshot-core/src/storeInfra.d.ts +44 -0
- package/dist/packages/bunshot-core/src/storeInfra.js +18 -0
- package/dist/packages/bunshot-core/src/storeType.d.ts +7 -0
- package/dist/packages/bunshot-core/src/storeType.js +1 -0
- package/dist/packages/bunshot-core/src/testing.d.ts +1 -0
- package/dist/packages/bunshot-core/src/testing.js +1 -0
- package/dist/packages/bunshot-core/src/uploadRegistry.d.ts +23 -0
- package/dist/packages/bunshot-core/src/uploadRegistry.js +4 -0
- package/dist/packages/bunshot-core/src/userResolver.d.ts +5 -0
- package/dist/packages/bunshot-core/src/userResolver.js +14 -0
- package/dist/packages/bunshot-core/src/wsMessages.d.ts +42 -0
- package/dist/packages/bunshot-core/src/wsMessages.js +4 -0
- package/dist/packages/bunshot-permissions/src/adapters/memory.d.ts +7 -0
- package/dist/packages/bunshot-permissions/src/adapters/memory.js +73 -0
- package/dist/packages/bunshot-permissions/src/index.d.ts +10 -0
- package/dist/packages/bunshot-permissions/src/index.js +5 -0
- package/dist/packages/bunshot-permissions/src/lib/bootstrap.d.ts +7 -0
- package/dist/packages/bunshot-permissions/src/lib/bootstrap.js +12 -0
- package/dist/packages/bunshot-permissions/src/lib/evaluator.d.ts +10 -0
- package/dist/packages/bunshot-permissions/src/lib/evaluator.js +165 -0
- package/dist/packages/bunshot-permissions/src/lib/registry.d.ts +2 -0
- package/dist/packages/bunshot-permissions/src/lib/registry.js +31 -0
- package/dist/packages/bunshot-permissions/src/lib/validation.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/lib/validation.js +1 -0
- package/dist/packages/bunshot-permissions/src/types/adapter.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/types/adapter.js +1 -0
- package/dist/packages/bunshot-permissions/src/types/evaluator.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/types/evaluator.js +1 -0
- package/dist/packages/bunshot-permissions/src/types/models.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/types/models.js +1 -0
- package/dist/packages/bunshot-permissions/src/types/registry.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/types/registry.js +1 -0
- package/dist/packages/bunshot-postgres/src/adapter.d.ts +6 -0
- package/dist/packages/bunshot-postgres/src/adapter.js +794 -0
- package/dist/packages/bunshot-postgres/src/connection.d.ts +15 -0
- package/dist/packages/bunshot-postgres/src/connection.js +16 -0
- package/dist/packages/bunshot-postgres/src/index.d.ts +4 -0
- package/dist/packages/bunshot-postgres/src/index.js +2 -0
- package/dist/packages/bunshot-postgres/src/schema.d.ts +997 -0
- package/dist/packages/bunshot-postgres/src/schema.js +105 -0
- package/dist/src/app.d.ts +230 -0
- package/dist/src/app.js +182 -0
- package/dist/src/cli/commands/init.d.ts +10 -0
- package/dist/src/cli/commands/init.js +709 -0
- package/dist/src/cli/index.d.ts +1 -0
- package/dist/src/cli/index.js +3 -0
- package/dist/src/entrypoints/mongo.d.ts +6 -0
- package/dist/src/entrypoints/mongo.js +4 -0
- package/dist/src/entrypoints/queue.d.ts +2 -0
- package/dist/src/entrypoints/queue.js +1 -0
- package/dist/src/entrypoints/redis.d.ts +1 -0
- package/dist/src/entrypoints/redis.js +1 -0
- package/dist/{adapters → src/framework/adapters}/localStorage.d.ts +1 -1
- package/dist/{adapters → src/framework/adapters}/localStorage.js +10 -10
- package/dist/src/framework/adapters/memoryStorage.d.ts +2 -0
- package/dist/src/framework/adapters/memoryStorage.js +45 -0
- package/dist/{adapters → src/framework/adapters}/s3Storage.d.ts +1 -1
- package/dist/{adapters → src/framework/adapters}/s3Storage.js +12 -12
- package/dist/src/framework/admin/bunshotAccess.d.ts +2 -0
- package/dist/src/framework/admin/bunshotAccess.js +23 -0
- package/dist/src/framework/admin/bunshotUsers.d.ts +2 -0
- package/dist/src/framework/admin/bunshotUsers.js +103 -0
- package/dist/src/framework/admin/index.d.ts +7 -0
- package/dist/src/framework/admin/index.js +21 -0
- package/dist/src/framework/boundaryAdapters/cacheFactories.d.ts +13 -0
- package/dist/src/framework/boundaryAdapters/cacheFactories.js +86 -0
- package/dist/src/framework/boundaryAdapters/index.d.ts +2 -0
- package/dist/src/framework/boundaryAdapters/index.js +1 -0
- package/dist/src/framework/boundaryAdapters.d.ts +17 -0
- package/dist/src/framework/boundaryAdapters.js +62 -0
- package/dist/src/framework/buildContext.d.ts +33 -0
- package/dist/src/framework/buildContext.js +119 -0
- package/dist/src/framework/config/schema.d.ts +447 -0
- package/dist/src/framework/config/schema.js +528 -0
- package/dist/src/framework/createInfrastructure.d.ts +76 -0
- package/dist/src/framework/createInfrastructure.js +221 -0
- package/dist/src/framework/lib/auditLog.d.ts +23 -0
- package/dist/src/framework/lib/auditLog.js +416 -0
- package/dist/src/framework/lib/captcha.d.ts +11 -0
- package/dist/{lib → src/framework/lib}/captcha.js +13 -10
- package/dist/{lib → src/framework/lib}/createDtoMapper.js +4 -4
- package/dist/src/framework/lib/createRoute.d.ts +1 -0
- package/dist/src/framework/lib/createRoute.js +2 -0
- package/dist/{lib → src/framework/lib}/idempotency.d.ts +2 -6
- package/dist/src/framework/lib/idempotency.js +74 -0
- package/dist/src/framework/lib/logger.d.ts +3 -0
- package/dist/src/framework/lib/logger.js +14 -0
- package/dist/src/framework/lib/metrics.d.ts +34 -0
- package/dist/{lib → src/framework/lib}/metrics.js +49 -57
- package/dist/src/framework/lib/pagination.d.ts +42 -0
- package/dist/src/framework/lib/pagination.js +51 -0
- package/dist/src/framework/lib/redisTransport.d.ts +38 -0
- package/dist/src/framework/lib/redisTransport.js +107 -0
- package/dist/src/framework/lib/resolveUserId.d.ts +2 -0
- package/dist/src/framework/lib/resolveUserId.js +5 -0
- package/dist/src/framework/lib/sseCollision.d.ts +6 -0
- package/dist/src/framework/lib/sseCollision.js +26 -0
- package/dist/src/framework/lib/storageAdapter.d.ts +1 -0
- package/dist/src/framework/lib/storageAdapter.js +1 -0
- package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.js +4 -4
- package/dist/src/framework/lib/tenant.d.ts +21 -0
- package/dist/src/framework/lib/tenant.js +70 -0
- package/dist/{lib → src/framework/lib}/upload.d.ts +11 -10
- package/dist/src/framework/lib/upload.js +132 -0
- package/dist/src/framework/lib/uploadRegistry.d.ts +23 -0
- package/dist/src/framework/lib/uploadRegistry.js +34 -0
- package/dist/{lib → src/framework/lib}/validate.d.ts +1 -1
- package/dist/{lib → src/framework/lib}/validate.js +2 -2
- package/dist/src/framework/lib/ws.d.ts +19 -0
- package/dist/src/framework/lib/ws.js +130 -0
- package/dist/src/framework/lib/wsHeartbeat.d.ts +12 -0
- package/dist/src/framework/lib/wsHeartbeat.js +53 -0
- package/dist/src/framework/lib/wsMessages.d.ts +25 -0
- package/dist/src/framework/lib/wsMessages.js +45 -0
- package/dist/src/framework/lib/wsNamespace.d.ts +17 -0
- package/dist/src/framework/lib/wsNamespace.js +19 -0
- package/dist/src/framework/lib/wsPresence.d.ts +17 -0
- package/dist/src/framework/lib/wsPresence.js +84 -0
- package/dist/src/framework/lib/wsTransport.d.ts +38 -0
- package/dist/src/framework/lib/wsTransport.js +9 -0
- package/dist/{lib → src/framework/lib}/zodToMongoose.d.ts +1 -1
- package/dist/{lib → src/framework/lib}/zodToMongoose.js +11 -11
- package/dist/{middleware → src/framework/middleware}/auditLog.d.ts +4 -3
- package/dist/src/framework/middleware/auditLog.js +42 -0
- package/dist/{middleware → src/framework/middleware}/botProtection.d.ts +2 -2
- package/dist/{middleware → src/framework/middleware}/botProtection.js +8 -9
- package/dist/src/framework/middleware/cacheResponse.d.ts +35 -0
- package/dist/src/framework/middleware/cacheResponse.js +126 -0
- package/dist/{middleware → src/framework/middleware}/captcha.d.ts +2 -3
- package/dist/src/framework/middleware/captcha.js +37 -0
- package/dist/{middleware → src/framework/middleware}/errorHandler.d.ts +1 -1
- package/dist/{middleware → src/framework/middleware}/errorHandler.js +2 -2
- package/dist/src/framework/middleware/index.js +1 -0
- package/dist/{middleware → src/framework/middleware}/logger.d.ts +1 -1
- package/dist/src/framework/middleware/metrics.d.ts +12 -0
- package/dist/src/framework/middleware/metrics.js +26 -0
- package/dist/{middleware → src/framework/middleware}/rateLimit.d.ts +2 -2
- package/dist/src/framework/middleware/rateLimit.js +22 -0
- package/dist/src/framework/middleware/requestId.d.ts +3 -0
- package/dist/{middleware → src/framework/middleware}/requestId.js +2 -2
- package/dist/{middleware → src/framework/middleware}/requestLogger.d.ts +3 -3
- package/dist/{middleware → src/framework/middleware}/requestLogger.js +17 -12
- package/dist/{middleware → src/framework/middleware}/requestSigning.d.ts +2 -2
- package/dist/{middleware → src/framework/middleware}/requestSigning.js +18 -20
- package/dist/src/framework/middleware/tenant.d.ts +14 -0
- package/dist/{middleware → src/framework/middleware}/tenant.js +31 -27
- package/dist/src/framework/middleware/upload.d.ts +5 -0
- package/dist/{middleware → src/framework/middleware}/upload.js +4 -4
- package/dist/{middleware → src/framework/middleware}/webhookAuth.d.ts +3 -3
- package/dist/{middleware → src/framework/middleware}/webhookAuth.js +11 -12
- package/dist/src/framework/models/AuditLog.d.ts +21 -0
- package/dist/src/framework/models/AuditLog.js +31 -0
- package/dist/src/framework/mountMiddleware.d.ts +91 -0
- package/dist/src/framework/mountMiddleware.js +128 -0
- package/dist/src/framework/mountOptionalEndpoints.d.ts +103 -0
- package/dist/src/framework/mountOptionalEndpoints.js +64 -0
- package/dist/src/framework/mountRoutes.d.ts +21 -0
- package/dist/src/framework/mountRoutes.js +144 -0
- package/dist/src/framework/persistence/cronRegistry.d.ts +28 -0
- package/dist/src/framework/persistence/cronRegistry.js +139 -0
- package/dist/src/framework/persistence/idempotency.d.ts +26 -0
- package/dist/src/framework/persistence/idempotency.js +178 -0
- package/dist/src/framework/persistence/index.d.ts +6 -0
- package/dist/src/framework/persistence/index.js +8 -0
- package/dist/src/framework/persistence/storeInfra.d.ts +9 -0
- package/dist/src/framework/persistence/storeInfra.js +1 -0
- package/dist/src/framework/persistence/uploadRegistry.d.ts +35 -0
- package/dist/src/framework/persistence/uploadRegistry.js +235 -0
- package/dist/src/framework/persistence/wsMessages.d.ts +22 -0
- package/dist/src/framework/persistence/wsMessages.js +296 -0
- package/dist/src/framework/preloadSchemas.d.ts +24 -0
- package/dist/src/framework/preloadSchemas.js +42 -0
- package/dist/src/framework/registerBoundaryAdapters.d.ts +23 -0
- package/dist/src/framework/registerBoundaryAdapters.js +46 -0
- package/dist/src/framework/routes/admin.d.ts +9 -0
- package/dist/src/framework/routes/admin.js +361 -0
- package/dist/src/framework/routes/health.d.ts +1 -0
- package/dist/src/framework/routes/health.js +21 -0
- package/dist/src/framework/routes/home.d.ts +1 -0
- package/dist/src/framework/routes/home.js +18 -0
- package/dist/src/framework/routes/jobs.d.ts +3 -0
- package/dist/{routes → src/framework/routes}/jobs.js +128 -103
- package/dist/src/framework/routes/metrics.d.ts +10 -0
- package/dist/src/framework/routes/metrics.js +57 -0
- package/dist/{routes → src/framework/routes}/uploads.d.ts +3 -3
- package/dist/src/framework/routes/uploads.js +262 -0
- package/dist/src/framework/runPluginLifecycle.d.ts +27 -0
- package/dist/src/framework/runPluginLifecycle.js +121 -0
- package/dist/src/framework/secrets/frameworkSecretSchema.d.ts +58 -0
- package/dist/src/framework/secrets/frameworkSecretSchema.js +20 -0
- package/dist/src/framework/secrets/index.d.ts +9 -0
- package/dist/src/framework/secrets/index.js +7 -0
- package/dist/src/framework/secrets/providers/envProvider.d.ts +15 -0
- package/dist/src/framework/secrets/providers/envProvider.js +18 -0
- package/dist/src/framework/secrets/providers/fileProvider.d.ts +8 -0
- package/dist/src/framework/secrets/providers/fileProvider.js +82 -0
- package/dist/src/framework/secrets/providers/ssmProvider.d.ts +20 -0
- package/dist/src/framework/secrets/providers/ssmProvider.js +127 -0
- package/dist/src/framework/secrets/resolveSecretBundle.d.ts +53 -0
- package/dist/src/framework/secrets/resolveSecretBundle.js +84 -0
- package/dist/src/framework/secrets/resolveSecrets.d.ts +18 -0
- package/dist/src/framework/secrets/resolveSecrets.js +34 -0
- package/dist/src/framework/sse/index.d.ts +21 -0
- package/dist/src/framework/sse/index.js +109 -0
- package/dist/src/framework/ws/index.d.ts +11 -0
- package/dist/src/framework/ws/index.js +8 -0
- package/dist/src/index.d.ts +87 -0
- package/dist/src/index.js +58 -0
- package/dist/src/lib/appConfig.d.ts +7 -0
- package/dist/src/lib/appConfig.js +27 -0
- package/dist/src/lib/appMeta.d.ts +7 -0
- package/dist/src/lib/appMeta.js +3 -0
- package/dist/src/lib/authConfig.d.ts +532 -0
- package/dist/{lib/appConfig.js → src/lib/authConfig.js} +75 -17
- package/dist/{lib → src/lib}/context.d.ts +6 -12
- package/dist/{lib → src/lib}/context.js +5 -5
- package/dist/src/lib/logger.d.ts +1 -0
- package/dist/src/lib/logger.js +1 -0
- package/dist/src/lib/mongo.d.ts +58 -0
- package/dist/src/lib/mongo.js +96 -0
- package/dist/src/lib/queue.d.ts +72 -0
- package/dist/src/lib/queue.js +152 -0
- package/dist/src/lib/redis.d.ts +28 -0
- package/dist/src/lib/redis.js +72 -0
- package/dist/{lib → src/lib}/signing.d.ts +2 -2
- package/dist/src/lib/signing.js +210 -0
- package/dist/src/lib/signingConfig.d.ts +40 -0
- package/dist/src/lib/signingConfig.js +28 -0
- package/dist/src/server.d.ts +146 -0
- package/dist/src/server.js +469 -0
- package/dist/src/shared/lib/HttpError.d.ts +1 -0
- package/dist/src/shared/lib/HttpError.js +2 -0
- package/dist/src/shared/lib/constants.d.ts +10 -0
- package/dist/src/shared/lib/crypto.d.ts +43 -0
- package/dist/src/shared/lib/crypto.js +74 -0
- package/dist/src/shared/lib/signing.d.ts +52 -0
- package/dist/{lib → src/shared/lib}/signing.js +35 -8
- package/dist/src/testing.d.ts +34 -0
- package/dist/src/testing.js +93 -0
- package/package.json +100 -26
- package/dist/adapters/memoryAuth.d.ts +0 -52
- package/dist/adapters/memoryAuth.js +0 -749
- package/dist/adapters/memoryStorage.d.ts +0 -3
- package/dist/adapters/memoryStorage.js +0 -44
- package/dist/adapters/mongoAuth.d.ts +0 -2
- package/dist/adapters/mongoAuth.js +0 -403
- package/dist/adapters/sqliteAuth.d.ts +0 -72
- package/dist/adapters/sqliteAuth.js +0 -858
- package/dist/app.d.ts +0 -559
- package/dist/app.js +0 -651
- package/dist/entrypoints/mongo.d.ts +0 -5
- package/dist/entrypoints/mongo.js +0 -4
- package/dist/entrypoints/queue.d.ts +0 -2
- package/dist/entrypoints/queue.js +0 -1
- package/dist/entrypoints/redis.d.ts +0 -1
- package/dist/entrypoints/redis.js +0 -1
- package/dist/index.d.ts +0 -117
- package/dist/index.js +0 -88
- package/dist/lib/appConfig.d.ts +0 -275
- package/dist/lib/auditLog.d.ts +0 -58
- package/dist/lib/auditLog.js +0 -218
- package/dist/lib/authAdapter.d.ts +0 -246
- package/dist/lib/authAdapter.js +0 -7
- package/dist/lib/authRateLimit.d.ts +0 -13
- package/dist/lib/authRateLimit.js +0 -117
- package/dist/lib/clientIp.d.ts +0 -14
- package/dist/lib/credentialStuffing.d.ts +0 -31
- package/dist/lib/credentialStuffing.js +0 -77
- package/dist/lib/crypto.d.ts +0 -11
- package/dist/lib/crypto.js +0 -22
- package/dist/lib/deletionCancelToken.d.ts +0 -12
- package/dist/lib/deletionCancelToken.js +0 -88
- package/dist/lib/emailVerification.d.ts +0 -19
- package/dist/lib/emailVerification.js +0 -129
- package/dist/lib/fingerprint.js +0 -36
- package/dist/lib/idempotency.js +0 -182
- package/dist/lib/jwks.d.ts +0 -25
- package/dist/lib/jwks.js +0 -51
- package/dist/lib/jwt.d.ts +0 -15
- package/dist/lib/jwt.js +0 -111
- package/dist/lib/metrics.d.ts +0 -14
- package/dist/lib/mfaChallenge.d.ts +0 -55
- package/dist/lib/mfaChallenge.js +0 -398
- package/dist/lib/mongo.d.ts +0 -39
- package/dist/lib/mongo.js +0 -124
- package/dist/lib/oauth.d.ts +0 -40
- package/dist/lib/oauth.js +0 -101
- package/dist/lib/oauthCode.d.ts +0 -15
- package/dist/lib/oauthCode.js +0 -95
- package/dist/lib/pagination.d.ts +0 -119
- package/dist/lib/pagination.js +0 -166
- package/dist/lib/queue.d.ts +0 -37
- package/dist/lib/queue.js +0 -117
- package/dist/lib/redis.d.ts +0 -9
- package/dist/lib/redis.js +0 -61
- package/dist/lib/resetPassword.d.ts +0 -12
- package/dist/lib/resetPassword.js +0 -93
- package/dist/lib/roles.d.ts +0 -7
- package/dist/lib/roles.js +0 -49
- package/dist/lib/saml.d.ts +0 -25
- package/dist/lib/saml.js +0 -64
- package/dist/lib/securityEvents.d.ts +0 -28
- package/dist/lib/securityEvents.js +0 -26
- package/dist/lib/session.d.ts +0 -49
- package/dist/lib/session.js +0 -597
- package/dist/lib/tenant.d.ts +0 -15
- package/dist/lib/tenant.js +0 -65
- package/dist/lib/upload.js +0 -112
- package/dist/lib/uploadRegistry.d.ts +0 -18
- package/dist/lib/uploadRegistry.js +0 -83
- package/dist/lib/ws.d.ts +0 -22
- package/dist/lib/ws.js +0 -96
- package/dist/lib/wsHeartbeat.d.ts +0 -12
- package/dist/lib/wsHeartbeat.js +0 -57
- package/dist/lib/wsMessages.d.ts +0 -40
- package/dist/lib/wsMessages.js +0 -330
- package/dist/lib/wsPresence.d.ts +0 -25
- package/dist/lib/wsPresence.js +0 -99
- package/dist/middleware/auditLog.js +0 -39
- package/dist/middleware/bearerAuth.d.ts +0 -2
- package/dist/middleware/bearerAuth.js +0 -11
- package/dist/middleware/cacheResponse.d.ts +0 -15
- package/dist/middleware/cacheResponse.js +0 -178
- package/dist/middleware/captcha.js +0 -36
- package/dist/middleware/csrf.js +0 -129
- package/dist/middleware/identify.d.ts +0 -3
- package/dist/middleware/identify.js +0 -122
- package/dist/middleware/index.js +0 -1
- package/dist/middleware/metrics.d.ts +0 -9
- package/dist/middleware/metrics.js +0 -26
- package/dist/middleware/rateLimit.js +0 -22
- package/dist/middleware/requestId.d.ts +0 -3
- package/dist/middleware/scimAuth.d.ts +0 -8
- package/dist/middleware/scimAuth.js +0 -29
- package/dist/middleware/tenant.d.ts +0 -5
- package/dist/middleware/upload.d.ts +0 -5
- package/dist/middleware/userAuth.d.ts +0 -3
- package/dist/middleware/userAuth.js +0 -6
- package/dist/models/AuditLog.d.ts +0 -30
- package/dist/models/AuditLog.js +0 -39
- package/dist/models/AuthUser.js +0 -55
- package/dist/models/Group.d.ts +0 -21
- package/dist/models/Group.js +0 -28
- package/dist/models/GroupMembership.js +0 -25
- package/dist/models/TenantRole.d.ts +0 -15
- package/dist/models/TenantRole.js +0 -23
- package/dist/routes/auth.d.ts +0 -12
- package/dist/routes/auth.js +0 -744
- package/dist/routes/groups.js +0 -346
- package/dist/routes/health.d.ts +0 -1
- package/dist/routes/health.js +0 -22
- package/dist/routes/home.d.ts +0 -1
- package/dist/routes/home.js +0 -16
- package/dist/routes/jobs.d.ts +0 -2
- package/dist/routes/m2m.d.ts +0 -2
- package/dist/routes/m2m.js +0 -72
- package/dist/routes/metrics.d.ts +0 -8
- package/dist/routes/metrics.js +0 -55
- package/dist/routes/mfa.d.ts +0 -5
- package/dist/routes/mfa.js +0 -628
- package/dist/routes/oauth.d.ts +0 -2
- package/dist/routes/oauth.js +0 -520
- package/dist/routes/oidc.d.ts +0 -2
- package/dist/routes/oidc.js +0 -29
- package/dist/routes/passkey.d.ts +0 -1
- package/dist/routes/passkey.js +0 -157
- package/dist/routes/saml.d.ts +0 -2
- package/dist/routes/saml.js +0 -86
- package/dist/routes/scim.d.ts +0 -2
- package/dist/routes/scim.js +0 -255
- package/dist/routes/uploads.js +0 -227
- package/dist/schemas/auth.js +0 -30
- package/dist/server.d.ts +0 -57
- package/dist/server.js +0 -112
- package/dist/services/auth.d.ts +0 -29
- package/dist/services/auth.js +0 -238
- package/dist/ws/index.d.ts +0 -10
- package/dist/ws/index.js +0 -39
- package/docs/sections/adding-middleware/full.md +0 -35
- package/docs/sections/adding-models/full.md +0 -125
- package/docs/sections/adding-models/overview.md +0 -13
- package/docs/sections/adding-routes/full.md +0 -182
- package/docs/sections/adding-routes/overview.md +0 -23
- package/docs/sections/auth-flow/full.md +0 -790
- package/docs/sections/auth-flow/overview.md +0 -10
- package/docs/sections/auth-security-examples/full.md +0 -388
- package/docs/sections/authentication/full.md +0 -130
- package/docs/sections/authentication/overview.md +0 -5
- package/docs/sections/cli/full.md +0 -42
- package/docs/sections/configuration/full.md +0 -172
- package/docs/sections/configuration/overview.md +0 -18
- package/docs/sections/configuration-example/full.md +0 -117
- package/docs/sections/configuration-example/overview.md +0 -30
- package/docs/sections/documentation/full.md +0 -171
- package/docs/sections/environment-variables/full.md +0 -55
- package/docs/sections/exports/full.md +0 -123
- package/docs/sections/extending-context/full.md +0 -59
- package/docs/sections/header.md +0 -3
- package/docs/sections/installation/full.md +0 -6
- package/docs/sections/jobs/full.md +0 -140
- package/docs/sections/jobs/overview.md +0 -15
- package/docs/sections/logging/full.md +0 -83
- package/docs/sections/metrics/full.md +0 -131
- package/docs/sections/mongodb-connections/full.md +0 -45
- package/docs/sections/mongodb-connections/overview.md +0 -7
- package/docs/sections/multi-tenancy/full.md +0 -66
- package/docs/sections/multi-tenancy/overview.md +0 -15
- package/docs/sections/oauth/full.md +0 -189
- package/docs/sections/oauth/overview.md +0 -16
- package/docs/sections/package-development/full.md +0 -7
- package/docs/sections/pagination/full.md +0 -93
- package/docs/sections/passkey-login/full.md +0 -90
- package/docs/sections/passkey-login/overview.md +0 -1
- package/docs/sections/peer-dependencies/full.md +0 -47
- package/docs/sections/quick-start/full.md +0 -43
- package/docs/sections/response-caching/full.md +0 -117
- package/docs/sections/response-caching/overview.md +0 -13
- package/docs/sections/roles/full.md +0 -225
- package/docs/sections/roles/overview.md +0 -14
- package/docs/sections/running-without-redis/full.md +0 -16
- package/docs/sections/running-without-redis-or-mongodb/full.md +0 -60
- package/docs/sections/signing/full.md +0 -203
- package/docs/sections/stack/full.md +0 -10
- package/docs/sections/uploads/full.md +0 -208
- package/docs/sections/versioning/full.md +0 -85
- package/docs/sections/webhook-auth/full.md +0 -100
- package/docs/sections/websocket/full.md +0 -196
- package/docs/sections/websocket/overview.md +0 -5
- package/docs/sections/websocket-rooms/full.md +0 -102
- package/docs/sections/websocket-rooms/overview.md +0 -5
- /package/dist/{lib/storageAdapter.js → packages/bunshot-admin/src/types/env.js} +0 -0
- /package/dist/{lib → packages/bunshot-auth/src/lib}/fingerprint.d.ts +0 -0
- /package/dist/{lib → packages/bunshot-auth/src/lib}/logger.d.ts +0 -0
- /package/dist/{lib → packages/bunshot-core/src}/constants.d.ts +0 -0
- /package/dist/{lib → packages/bunshot-core/src}/storageAdapter.d.ts +0 -0
- /package/dist/{lib → src/framework/lib}/createDtoMapper.d.ts +0 -0
- /package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.d.ts +0 -0
- /package/dist/{middleware → src/framework/middleware}/cors.d.ts +0 -0
- /package/dist/{middleware → src/framework/middleware}/cors.js +0 -0
- /package/dist/{middleware → src/framework/middleware}/index.d.ts +0 -0
- /package/dist/{middleware → src/framework/middleware}/logger.js +0 -0
- /package/dist/{lib → src/shared/lib}/constants.js +0 -0
package/dist/lib/jwt.js
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import { SignJWT, jwtVerify } from "jose";
|
|
2
|
-
import { getJwtIssuer, getJwtAudience } from "./appConfig";
|
|
3
|
-
import { getSigningPrivateKey, getVerifyPublicKeys, isJwksLoaded } from "./jwks";
|
|
4
|
-
let _secret = null;
|
|
5
|
-
let _algorithm = "HS256";
|
|
6
|
-
function getSecret() {
|
|
7
|
-
if (_secret)
|
|
8
|
-
return _secret;
|
|
9
|
-
const isProd = process.env.NODE_ENV === "production";
|
|
10
|
-
const envKey = isProd ? "JWT_SECRET_PROD" : "JWT_SECRET_DEV";
|
|
11
|
-
const rawSecret = process.env[envKey];
|
|
12
|
-
if (!rawSecret || rawSecret.length < 32) {
|
|
13
|
-
throw new Error(`[security] ${envKey} is missing or too short (${rawSecret?.length ?? 0} chars). ` +
|
|
14
|
-
`JWT secrets must be at least 32 characters. Generate one with: ` +
|
|
15
|
-
`node -e "console.log(require('crypto').randomBytes(64).toString('hex'))"`);
|
|
16
|
-
}
|
|
17
|
-
_secret = new TextEncoder().encode(rawSecret);
|
|
18
|
-
return _secret;
|
|
19
|
-
}
|
|
20
|
-
export function validateJwtSecrets() {
|
|
21
|
-
if (_algorithm !== "RS256") {
|
|
22
|
-
getSecret();
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
export async function signToken(claimsOrUserId, sessionIdOrExpiry, expirySeconds) {
|
|
26
|
-
let claims;
|
|
27
|
-
let expiry;
|
|
28
|
-
if (typeof claimsOrUserId === "string") {
|
|
29
|
-
// Legacy positional: signToken(userId, sessionId, expirySeconds?)
|
|
30
|
-
claims = { sub: claimsOrUserId, sid: sessionIdOrExpiry };
|
|
31
|
-
expiry = expirySeconds;
|
|
32
|
-
}
|
|
33
|
-
else {
|
|
34
|
-
// New object form: signToken(claims, expirySeconds?)
|
|
35
|
-
claims = claimsOrUserId;
|
|
36
|
-
expiry = sessionIdOrExpiry;
|
|
37
|
-
}
|
|
38
|
-
if (_algorithm === "RS256") {
|
|
39
|
-
if (!isJwksLoaded()) {
|
|
40
|
-
throw new Error("RS256 requires OIDC key configuration — call loadJwksKey() first");
|
|
41
|
-
}
|
|
42
|
-
// Use RS256 with JWKS key
|
|
43
|
-
const privateKey = getSigningPrivateKey();
|
|
44
|
-
const jwt = new SignJWT(claims)
|
|
45
|
-
.setProtectedHeader({ alg: "RS256", kid: "key-1" })
|
|
46
|
-
.setIssuedAt()
|
|
47
|
-
.setExpirationTime(expiry ? `${expiry}s` : "7d");
|
|
48
|
-
const issuer = getJwtIssuer();
|
|
49
|
-
const audience = getJwtAudience();
|
|
50
|
-
if (issuer)
|
|
51
|
-
jwt.setIssuer(issuer);
|
|
52
|
-
if (audience)
|
|
53
|
-
jwt.setAudience(audience);
|
|
54
|
-
return jwt.sign(privateKey);
|
|
55
|
-
}
|
|
56
|
-
const jwt = new SignJWT(claims)
|
|
57
|
-
.setProtectedHeader({ alg: _algorithm })
|
|
58
|
-
.setIssuedAt()
|
|
59
|
-
.setExpirationTime(expiry ? `${expiry}s` : "7d");
|
|
60
|
-
const issuer = getJwtIssuer();
|
|
61
|
-
const audience = getJwtAudience();
|
|
62
|
-
if (issuer)
|
|
63
|
-
jwt.setIssuer(issuer);
|
|
64
|
-
if (audience)
|
|
65
|
-
jwt.setAudience(audience);
|
|
66
|
-
return jwt.sign(getSecret());
|
|
67
|
-
}
|
|
68
|
-
export const verifyToken = async (token) => {
|
|
69
|
-
if (_algorithm === "RS256") {
|
|
70
|
-
if (!isJwksLoaded()) {
|
|
71
|
-
throw new Error("RS256 requires OIDC key configuration");
|
|
72
|
-
}
|
|
73
|
-
const publicKeys = getVerifyPublicKeys();
|
|
74
|
-
const opts = { algorithms: ["RS256"] };
|
|
75
|
-
const issuer = getJwtIssuer();
|
|
76
|
-
const audience = getJwtAudience();
|
|
77
|
-
if (issuer)
|
|
78
|
-
opts.issuer = issuer;
|
|
79
|
-
if (audience)
|
|
80
|
-
opts.audience = audience;
|
|
81
|
-
// Try each key (supports key rotation)
|
|
82
|
-
for (const key of publicKeys) {
|
|
83
|
-
try {
|
|
84
|
-
const { payload } = await jwtVerify(token, key, opts);
|
|
85
|
-
return payload;
|
|
86
|
-
}
|
|
87
|
-
catch {
|
|
88
|
-
continue;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
throw new Error("JWT verification failed with all available keys");
|
|
92
|
-
}
|
|
93
|
-
const issuer = getJwtIssuer();
|
|
94
|
-
const audience = getJwtAudience();
|
|
95
|
-
const opts = { algorithms: [_algorithm] };
|
|
96
|
-
if (issuer)
|
|
97
|
-
opts.issuer = issuer;
|
|
98
|
-
if (audience)
|
|
99
|
-
opts.audience = audience;
|
|
100
|
-
const { payload } = await jwtVerify(token, getSecret(), opts);
|
|
101
|
-
return payload;
|
|
102
|
-
};
|
|
103
|
-
/** @internal — used by Feature 8 (OIDC) to switch to RS256 once key material is loaded */
|
|
104
|
-
export function _setAlgorithm(alg) {
|
|
105
|
-
_algorithm = alg;
|
|
106
|
-
}
|
|
107
|
-
/** @internal — reset for testing */
|
|
108
|
-
export function _resetJwtState() {
|
|
109
|
-
_secret = null;
|
|
110
|
-
_algorithm = "HS256";
|
|
111
|
-
}
|
package/dist/lib/metrics.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
type Labels = Record<string, string>;
|
|
2
|
-
export declare function defaultNormalizePath(path: string): string;
|
|
3
|
-
export declare function incrementCounter(name: string, labels: Labels, amount?: number): void;
|
|
4
|
-
export declare function observeHistogram(name: string, labels: Labels, value: number, buckets?: number[]): void;
|
|
5
|
-
type GaugeCallback = () => Promise<{
|
|
6
|
-
labels: Labels;
|
|
7
|
-
value: number;
|
|
8
|
-
}[]>;
|
|
9
|
-
export declare function registerGaugeCallback(name: string, cb: GaugeCallback): void;
|
|
10
|
-
export declare function serializeMetrics(): Promise<string>;
|
|
11
|
-
export declare function resetMetrics(): void;
|
|
12
|
-
export declare function setMetricsQueues(map: Map<string, any>): void;
|
|
13
|
-
export declare function closeMetricsQueues(): Promise<void>;
|
|
14
|
-
export {};
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
export type MfaChallengePurpose = "login" | "webauthn-registration" | "passkey-login";
|
|
2
|
-
export interface MfaChallengeOptions {
|
|
3
|
-
emailOtpHash?: string;
|
|
4
|
-
webauthnChallenge?: string;
|
|
5
|
-
}
|
|
6
|
-
export interface MfaChallengeData {
|
|
7
|
-
userId: string;
|
|
8
|
-
purpose: MfaChallengePurpose;
|
|
9
|
-
emailOtpHash?: string;
|
|
10
|
-
webauthnChallenge?: string;
|
|
11
|
-
}
|
|
12
|
-
/** Reset all in-memory MFA challenge state. Called by clearMemoryStore(). */
|
|
13
|
-
export declare const clearMemoryMfaChallenges: () => void;
|
|
14
|
-
/** Must be called when store is "sqlite" to inject the db instance. */
|
|
15
|
-
export declare const setMfaChallengeSqliteDb: (db: any) => void;
|
|
16
|
-
type MfaChallengeStore = "redis" | "mongo" | "sqlite" | "memory";
|
|
17
|
-
export declare const setMfaChallengeStore: (store: MfaChallengeStore) => void;
|
|
18
|
-
export declare const createMfaChallenge: (userId: string, options?: MfaChallengeOptions) => Promise<string>;
|
|
19
|
-
export declare const consumeMfaChallenge: (token: string) => Promise<MfaChallengeData | null>;
|
|
20
|
-
/**
|
|
21
|
-
* Replace the email OTP hash on an existing challenge without consuming it.
|
|
22
|
-
* Used for the resend flow. Increments resendCount and caps the challenge lifetime.
|
|
23
|
-
* Returns { userId, resendCount } on success, null if challenge not found/expired/max resends reached.
|
|
24
|
-
*/
|
|
25
|
-
export declare const replaceMfaChallengeOtp: (token: string, newEmailOtpHash: string) => Promise<{
|
|
26
|
-
userId: string;
|
|
27
|
-
resendCount: number;
|
|
28
|
-
} | null>;
|
|
29
|
-
/**
|
|
30
|
-
* Create a WebAuthn registration challenge token. Separate from the login flow —
|
|
31
|
-
* uses `purpose: "webauthn-registration"` so it cannot be consumed by `consumeMfaChallenge`.
|
|
32
|
-
*/
|
|
33
|
-
export declare const createWebAuthnRegistrationChallenge: (userId: string, challenge: string) => Promise<string>;
|
|
34
|
-
/**
|
|
35
|
-
* Consume a WebAuthn registration challenge token.
|
|
36
|
-
* Only accepts tokens with `purpose: "webauthn-registration"`.
|
|
37
|
-
*/
|
|
38
|
-
export declare const consumeWebAuthnRegistrationChallenge: (token: string) => Promise<{
|
|
39
|
-
userId: string;
|
|
40
|
-
challenge: string;
|
|
41
|
-
} | null>;
|
|
42
|
-
/**
|
|
43
|
-
* Create a passkey login challenge token. Not tied to a user — userId is resolved
|
|
44
|
-
* from the credential after assertion. Uses a fixed 120s TTL.
|
|
45
|
-
*/
|
|
46
|
-
export declare const createPasskeyLoginChallenge: (challenge: string) => Promise<string>;
|
|
47
|
-
/**
|
|
48
|
-
* Consume a passkey login challenge token.
|
|
49
|
-
* Only accepts tokens with `purpose: "passkey-login"`.
|
|
50
|
-
* Returns the stored webauthnChallenge bytes or null if expired/invalid.
|
|
51
|
-
*/
|
|
52
|
-
export declare const consumePasskeyLoginChallenge: (token: string) => Promise<{
|
|
53
|
-
webauthnChallenge: string;
|
|
54
|
-
} | null>;
|
|
55
|
-
export {};
|
package/dist/lib/mfaChallenge.js
DELETED
|
@@ -1,398 +0,0 @@
|
|
|
1
|
-
import { getRedis } from "./redis";
|
|
2
|
-
import { appConnection, mongoose } from "./mongo";
|
|
3
|
-
import { getAppName, getMfaChallengeTtl } from "./appConfig";
|
|
4
|
-
import { sha256 } from "./crypto";
|
|
5
|
-
const MAX_RESENDS = 3;
|
|
6
|
-
function getMfaChallengeModel() {
|
|
7
|
-
if (appConnection.models["MfaChallenge"])
|
|
8
|
-
return appConnection.models["MfaChallenge"];
|
|
9
|
-
const { Schema } = mongoose;
|
|
10
|
-
const schema = new Schema({
|
|
11
|
-
token: { type: String, required: true, unique: true },
|
|
12
|
-
userId: { type: String, required: true },
|
|
13
|
-
purpose: { type: String, required: true, default: "login" },
|
|
14
|
-
emailOtpHash: { type: String },
|
|
15
|
-
webauthnChallenge: { type: String },
|
|
16
|
-
createdAt: { type: Date, required: true },
|
|
17
|
-
resendCount: { type: Number, required: true, default: 0 },
|
|
18
|
-
expiresAt: { type: Date, required: true, index: { expireAfterSeconds: 0 } },
|
|
19
|
-
}, { collection: "mfa_challenges" });
|
|
20
|
-
return appConnection.model("MfaChallenge", schema);
|
|
21
|
-
}
|
|
22
|
-
// ---------------------------------------------------------------------------
|
|
23
|
-
// In-memory store
|
|
24
|
-
// ---------------------------------------------------------------------------
|
|
25
|
-
const _memoryChallenges = new Map();
|
|
26
|
-
/** Reset all in-memory MFA challenge state. Called by clearMemoryStore(). */
|
|
27
|
-
export const clearMemoryMfaChallenges = () => { _memoryChallenges.clear(); };
|
|
28
|
-
// ---------------------------------------------------------------------------
|
|
29
|
-
// SQLite store (reuses the existing SQLite DB instance)
|
|
30
|
-
// ---------------------------------------------------------------------------
|
|
31
|
-
let _sqliteDb = null;
|
|
32
|
-
let _sqliteTableCreated = false;
|
|
33
|
-
/** Must be called when store is "sqlite" to inject the db instance. */
|
|
34
|
-
export const setMfaChallengeSqliteDb = (db) => { _sqliteDb = db; };
|
|
35
|
-
function ensureSqliteMfaTable() {
|
|
36
|
-
if (_sqliteTableCreated || !_sqliteDb)
|
|
37
|
-
return;
|
|
38
|
-
_sqliteDb.run(`CREATE TABLE IF NOT EXISTS mfa_challenges (
|
|
39
|
-
token TEXT PRIMARY KEY,
|
|
40
|
-
userId TEXT NOT NULL,
|
|
41
|
-
purpose TEXT NOT NULL DEFAULT 'login',
|
|
42
|
-
emailOtpHash TEXT,
|
|
43
|
-
webauthnChallenge TEXT,
|
|
44
|
-
createdAt INTEGER NOT NULL,
|
|
45
|
-
resendCount INTEGER NOT NULL DEFAULT 0,
|
|
46
|
-
expiresAt INTEGER NOT NULL
|
|
47
|
-
)`);
|
|
48
|
-
// Migrate pre-existing tables that lack newer columns
|
|
49
|
-
try {
|
|
50
|
-
_sqliteDb.run("ALTER TABLE mfa_challenges ADD COLUMN emailOtpHash TEXT");
|
|
51
|
-
}
|
|
52
|
-
catch { /* already exists */ }
|
|
53
|
-
try {
|
|
54
|
-
_sqliteDb.run("ALTER TABLE mfa_challenges ADD COLUMN createdAt INTEGER NOT NULL DEFAULT 0");
|
|
55
|
-
}
|
|
56
|
-
catch { /* already exists */ }
|
|
57
|
-
try {
|
|
58
|
-
_sqliteDb.run("ALTER TABLE mfa_challenges ADD COLUMN resendCount INTEGER NOT NULL DEFAULT 0");
|
|
59
|
-
}
|
|
60
|
-
catch { /* already exists */ }
|
|
61
|
-
try {
|
|
62
|
-
_sqliteDb.run("ALTER TABLE mfa_challenges ADD COLUMN purpose TEXT NOT NULL DEFAULT 'login'");
|
|
63
|
-
}
|
|
64
|
-
catch { /* already exists */ }
|
|
65
|
-
try {
|
|
66
|
-
_sqliteDb.run("ALTER TABLE mfa_challenges ADD COLUMN webauthnChallenge TEXT");
|
|
67
|
-
}
|
|
68
|
-
catch { /* already exists */ }
|
|
69
|
-
_sqliteTableCreated = true;
|
|
70
|
-
}
|
|
71
|
-
// ---------------------------------------------------------------------------
|
|
72
|
-
// Redis helpers
|
|
73
|
-
// ---------------------------------------------------------------------------
|
|
74
|
-
/** Atomically GET+DEL a key. Uses native GETDEL (Redis >= 6.2) with a Lua fallback. */
|
|
75
|
-
async function redisGetDel(key) {
|
|
76
|
-
const redis = getRedis();
|
|
77
|
-
if (typeof redis.getdel === "function") {
|
|
78
|
-
try {
|
|
79
|
-
return await redis.getdel(key);
|
|
80
|
-
}
|
|
81
|
-
catch (err) {
|
|
82
|
-
const msg = err?.message ?? "";
|
|
83
|
-
if (!/unknown command|ERR unknown command/i.test(msg))
|
|
84
|
-
throw err;
|
|
85
|
-
// Fall through to Lua on "unknown command"
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
const result = await redis.eval("local v = redis.call('GET', KEYS[1])\nif v then redis.call('DEL', KEYS[1]) end\nreturn v", 1, key);
|
|
89
|
-
return result ?? null;
|
|
90
|
-
}
|
|
91
|
-
let _store = "redis";
|
|
92
|
-
export const setMfaChallengeStore = (store) => { _store = store; };
|
|
93
|
-
// ---------------------------------------------------------------------------
|
|
94
|
-
// Public API
|
|
95
|
-
// ---------------------------------------------------------------------------
|
|
96
|
-
export const createMfaChallenge = async (userId, options) => {
|
|
97
|
-
const bytes = new Uint8Array(32);
|
|
98
|
-
crypto.getRandomValues(bytes);
|
|
99
|
-
const token = Buffer.from(bytes).toString("base64url");
|
|
100
|
-
const hash = sha256(token);
|
|
101
|
-
const ttl = getMfaChallengeTtl();
|
|
102
|
-
const now = Date.now();
|
|
103
|
-
const purpose = "login";
|
|
104
|
-
const emailOtpHash = options?.emailOtpHash;
|
|
105
|
-
const webauthnChallenge = options?.webauthnChallenge;
|
|
106
|
-
if (_store === "memory") {
|
|
107
|
-
_memoryChallenges.set(hash, { userId, purpose, emailOtpHash, webauthnChallenge, createdAt: now, resendCount: 0, expiresAt: now + ttl * 1000 });
|
|
108
|
-
return token;
|
|
109
|
-
}
|
|
110
|
-
if (_store === "sqlite") {
|
|
111
|
-
ensureSqliteMfaTable();
|
|
112
|
-
_sqliteDb.run("INSERT INTO mfa_challenges (token, userId, purpose, emailOtpHash, webauthnChallenge, createdAt, resendCount, expiresAt) VALUES (?, ?, ?, ?, ?, ?, 0, ?)", [hash, userId, purpose, emailOtpHash ?? null, webauthnChallenge ?? null, now, now + ttl * 1000]);
|
|
113
|
-
return token;
|
|
114
|
-
}
|
|
115
|
-
if (_store === "mongo") {
|
|
116
|
-
await getMfaChallengeModel().create({
|
|
117
|
-
token: hash,
|
|
118
|
-
userId,
|
|
119
|
-
purpose,
|
|
120
|
-
emailOtpHash,
|
|
121
|
-
webauthnChallenge,
|
|
122
|
-
createdAt: new Date(now),
|
|
123
|
-
resendCount: 0,
|
|
124
|
-
expiresAt: new Date(now + ttl * 1000),
|
|
125
|
-
});
|
|
126
|
-
return token;
|
|
127
|
-
}
|
|
128
|
-
// redis
|
|
129
|
-
await getRedis().set(`mfachallenge:${getAppName()}:${hash}`, JSON.stringify({ userId, purpose, emailOtpHash, webauthnChallenge, createdAt: now, resendCount: 0 }), "EX", ttl);
|
|
130
|
-
return token;
|
|
131
|
-
};
|
|
132
|
-
export const consumeMfaChallenge = async (token) => {
|
|
133
|
-
const hash = sha256(token);
|
|
134
|
-
if (_store === "memory") {
|
|
135
|
-
const entry = _memoryChallenges.get(hash);
|
|
136
|
-
if (!entry || entry.expiresAt <= Date.now()) {
|
|
137
|
-
_memoryChallenges.delete(hash);
|
|
138
|
-
return null;
|
|
139
|
-
}
|
|
140
|
-
_memoryChallenges.delete(hash);
|
|
141
|
-
if (entry.purpose !== "login")
|
|
142
|
-
return null;
|
|
143
|
-
return { userId: entry.userId, purpose: entry.purpose, emailOtpHash: entry.emailOtpHash, webauthnChallenge: entry.webauthnChallenge };
|
|
144
|
-
}
|
|
145
|
-
if (_store === "sqlite") {
|
|
146
|
-
ensureSqliteMfaTable();
|
|
147
|
-
const row = _sqliteDb.query("DELETE FROM mfa_challenges WHERE token = ? AND expiresAt > ? RETURNING userId, purpose, emailOtpHash, webauthnChallenge").get(hash, Date.now());
|
|
148
|
-
if (!row || row.purpose !== "login")
|
|
149
|
-
return null;
|
|
150
|
-
return { userId: row.userId, purpose: "login", emailOtpHash: row.emailOtpHash ?? undefined, webauthnChallenge: row.webauthnChallenge ?? undefined };
|
|
151
|
-
}
|
|
152
|
-
if (_store === "mongo") {
|
|
153
|
-
const doc = await getMfaChallengeModel().findOneAndDelete({ token: hash, expiresAt: { $gt: new Date() } });
|
|
154
|
-
if (!doc || doc.purpose !== "login")
|
|
155
|
-
return null;
|
|
156
|
-
return { userId: doc.userId, purpose: "login", emailOtpHash: doc.emailOtpHash, webauthnChallenge: doc.webauthnChallenge };
|
|
157
|
-
}
|
|
158
|
-
// redis
|
|
159
|
-
const key = `mfachallenge:${getAppName()}:${hash}`;
|
|
160
|
-
const raw = await redisGetDel(key);
|
|
161
|
-
if (!raw)
|
|
162
|
-
return null;
|
|
163
|
-
const data = JSON.parse(raw);
|
|
164
|
-
if (data.purpose !== "login")
|
|
165
|
-
return null;
|
|
166
|
-
return { userId: data.userId, purpose: "login", emailOtpHash: data.emailOtpHash, webauthnChallenge: data.webauthnChallenge };
|
|
167
|
-
};
|
|
168
|
-
/**
|
|
169
|
-
* Replace the email OTP hash on an existing challenge without consuming it.
|
|
170
|
-
* Used for the resend flow. Increments resendCount and caps the challenge lifetime.
|
|
171
|
-
* Returns { userId, resendCount } on success, null if challenge not found/expired/max resends reached.
|
|
172
|
-
*/
|
|
173
|
-
export const replaceMfaChallengeOtp = async (token, newEmailOtpHash) => {
|
|
174
|
-
const hash = sha256(token);
|
|
175
|
-
const ttl = getMfaChallengeTtl();
|
|
176
|
-
if (_store === "memory") {
|
|
177
|
-
const entry = _memoryChallenges.get(hash);
|
|
178
|
-
if (!entry || entry.expiresAt <= Date.now()) {
|
|
179
|
-
_memoryChallenges.delete(hash);
|
|
180
|
-
return null;
|
|
181
|
-
}
|
|
182
|
-
if (entry.resendCount >= MAX_RESENDS)
|
|
183
|
-
return null;
|
|
184
|
-
entry.emailOtpHash = newEmailOtpHash;
|
|
185
|
-
entry.resendCount++;
|
|
186
|
-
// Cap lifetime: min(now + ttl, createdAt + ttl * 3)
|
|
187
|
-
const maxExpiry = entry.createdAt + ttl * 3 * 1000;
|
|
188
|
-
entry.expiresAt = Math.min(Date.now() + ttl * 1000, maxExpiry);
|
|
189
|
-
return { userId: entry.userId, resendCount: entry.resendCount };
|
|
190
|
-
}
|
|
191
|
-
if (_store === "sqlite") {
|
|
192
|
-
ensureSqliteMfaTable();
|
|
193
|
-
const now = Date.now();
|
|
194
|
-
const existing = _sqliteDb.query("SELECT createdAt, resendCount FROM mfa_challenges WHERE token = ? AND expiresAt > ?").get(hash, now);
|
|
195
|
-
if (!existing || existing.resendCount >= MAX_RESENDS)
|
|
196
|
-
return null;
|
|
197
|
-
const newExpiry = Math.min(now + ttl * 1000, existing.createdAt + ttl * 3 * 1000);
|
|
198
|
-
const newCount = existing.resendCount + 1;
|
|
199
|
-
const row = _sqliteDb.query("UPDATE mfa_challenges SET emailOtpHash = ?, resendCount = ?, expiresAt = ? WHERE token = ? RETURNING userId").get(newEmailOtpHash, newCount, newExpiry, hash);
|
|
200
|
-
return row ? { userId: row.userId, resendCount: newCount } : null;
|
|
201
|
-
}
|
|
202
|
-
if (_store === "mongo") {
|
|
203
|
-
const now = new Date();
|
|
204
|
-
const existing = await getMfaChallengeModel().findOne({
|
|
205
|
-
token: hash,
|
|
206
|
-
expiresAt: { $gt: now },
|
|
207
|
-
resendCount: { $lt: MAX_RESENDS },
|
|
208
|
-
});
|
|
209
|
-
if (!existing)
|
|
210
|
-
return null;
|
|
211
|
-
const newCount = existing.resendCount + 1;
|
|
212
|
-
const newExpiry = new Date(Math.min(Date.now() + ttl * 1000, existing.createdAt.getTime() + ttl * 3 * 1000));
|
|
213
|
-
existing.emailOtpHash = newEmailOtpHash;
|
|
214
|
-
existing.resendCount = newCount;
|
|
215
|
-
existing.expiresAt = newExpiry;
|
|
216
|
-
await existing.save();
|
|
217
|
-
return { userId: existing.userId, resendCount: newCount };
|
|
218
|
-
}
|
|
219
|
-
// redis
|
|
220
|
-
const key = `mfachallenge:${getAppName()}:${hash}`;
|
|
221
|
-
const raw = await getRedis().get(key);
|
|
222
|
-
if (!raw)
|
|
223
|
-
return null;
|
|
224
|
-
const data = JSON.parse(raw);
|
|
225
|
-
if (data.resendCount >= MAX_RESENDS)
|
|
226
|
-
return null;
|
|
227
|
-
data.emailOtpHash = newEmailOtpHash;
|
|
228
|
-
data.resendCount++;
|
|
229
|
-
// Cap lifetime
|
|
230
|
-
const maxExpiry = data.createdAt + ttl * 3 * 1000;
|
|
231
|
-
const newExpiry = Math.min(Date.now() + ttl * 1000, maxExpiry);
|
|
232
|
-
const remainingTtl = Math.max(1, Math.ceil((newExpiry - Date.now()) / 1000));
|
|
233
|
-
await getRedis().set(key, JSON.stringify(data), "EX", remainingTtl);
|
|
234
|
-
return { userId: data.userId, resendCount: data.resendCount };
|
|
235
|
-
};
|
|
236
|
-
// ---------------------------------------------------------------------------
|
|
237
|
-
// WebAuthn registration challenge helpers
|
|
238
|
-
// ---------------------------------------------------------------------------
|
|
239
|
-
/**
|
|
240
|
-
* Create a WebAuthn registration challenge token. Separate from the login flow —
|
|
241
|
-
* uses `purpose: "webauthn-registration"` so it cannot be consumed by `consumeMfaChallenge`.
|
|
242
|
-
*/
|
|
243
|
-
export const createWebAuthnRegistrationChallenge = async (userId, challenge) => {
|
|
244
|
-
const bytes = new Uint8Array(32);
|
|
245
|
-
crypto.getRandomValues(bytes);
|
|
246
|
-
const token = Buffer.from(bytes).toString("base64url");
|
|
247
|
-
const hash = sha256(token);
|
|
248
|
-
const ttl = getMfaChallengeTtl();
|
|
249
|
-
const now = Date.now();
|
|
250
|
-
const purpose = "webauthn-registration";
|
|
251
|
-
if (_store === "memory") {
|
|
252
|
-
_memoryChallenges.set(hash, { userId, purpose, webauthnChallenge: challenge, createdAt: now, resendCount: 0, expiresAt: now + ttl * 1000 });
|
|
253
|
-
return token;
|
|
254
|
-
}
|
|
255
|
-
if (_store === "sqlite") {
|
|
256
|
-
ensureSqliteMfaTable();
|
|
257
|
-
_sqliteDb.run("INSERT INTO mfa_challenges (token, userId, purpose, webauthnChallenge, createdAt, resendCount, expiresAt) VALUES (?, ?, ?, ?, ?, 0, ?)", [hash, userId, purpose, challenge, now, now + ttl * 1000]);
|
|
258
|
-
return token;
|
|
259
|
-
}
|
|
260
|
-
if (_store === "mongo") {
|
|
261
|
-
await getMfaChallengeModel().create({
|
|
262
|
-
token: hash,
|
|
263
|
-
userId,
|
|
264
|
-
purpose,
|
|
265
|
-
webauthnChallenge: challenge,
|
|
266
|
-
createdAt: new Date(now),
|
|
267
|
-
resendCount: 0,
|
|
268
|
-
expiresAt: new Date(now + ttl * 1000),
|
|
269
|
-
});
|
|
270
|
-
return token;
|
|
271
|
-
}
|
|
272
|
-
// redis
|
|
273
|
-
await getRedis().set(`mfachallenge:${getAppName()}:${hash}`, JSON.stringify({ userId, purpose, webauthnChallenge: challenge, createdAt: now, resendCount: 0 }), "EX", ttl);
|
|
274
|
-
return token;
|
|
275
|
-
};
|
|
276
|
-
/**
|
|
277
|
-
* Consume a WebAuthn registration challenge token.
|
|
278
|
-
* Only accepts tokens with `purpose: "webauthn-registration"`.
|
|
279
|
-
*/
|
|
280
|
-
export const consumeWebAuthnRegistrationChallenge = async (token) => {
|
|
281
|
-
const hash = sha256(token);
|
|
282
|
-
if (_store === "memory") {
|
|
283
|
-
const entry = _memoryChallenges.get(hash);
|
|
284
|
-
if (!entry || entry.expiresAt <= Date.now()) {
|
|
285
|
-
_memoryChallenges.delete(hash);
|
|
286
|
-
return null;
|
|
287
|
-
}
|
|
288
|
-
_memoryChallenges.delete(hash);
|
|
289
|
-
if (entry.purpose !== "webauthn-registration" || !entry.webauthnChallenge)
|
|
290
|
-
return null;
|
|
291
|
-
return { userId: entry.userId, challenge: entry.webauthnChallenge };
|
|
292
|
-
}
|
|
293
|
-
if (_store === "sqlite") {
|
|
294
|
-
ensureSqliteMfaTable();
|
|
295
|
-
const row = _sqliteDb.query("DELETE FROM mfa_challenges WHERE token = ? AND expiresAt > ? RETURNING userId, purpose, webauthnChallenge").get(hash, Date.now());
|
|
296
|
-
if (!row || row.purpose !== "webauthn-registration" || !row.webauthnChallenge)
|
|
297
|
-
return null;
|
|
298
|
-
return { userId: row.userId, challenge: row.webauthnChallenge };
|
|
299
|
-
}
|
|
300
|
-
if (_store === "mongo") {
|
|
301
|
-
const doc = await getMfaChallengeModel().findOneAndDelete({ token: hash, expiresAt: { $gt: new Date() } });
|
|
302
|
-
if (!doc || doc.purpose !== "webauthn-registration" || !doc.webauthnChallenge)
|
|
303
|
-
return null;
|
|
304
|
-
return { userId: doc.userId, challenge: doc.webauthnChallenge };
|
|
305
|
-
}
|
|
306
|
-
// redis
|
|
307
|
-
const key = `mfachallenge:${getAppName()}:${hash}`;
|
|
308
|
-
const raw = await redisGetDel(key);
|
|
309
|
-
if (!raw)
|
|
310
|
-
return null;
|
|
311
|
-
const data = JSON.parse(raw);
|
|
312
|
-
if (data.purpose !== "webauthn-registration" || !data.webauthnChallenge)
|
|
313
|
-
return null;
|
|
314
|
-
return { userId: data.userId, challenge: data.webauthnChallenge };
|
|
315
|
-
};
|
|
316
|
-
// ---------------------------------------------------------------------------
|
|
317
|
-
// Passkey login challenge helpers (passwordless first-factor)
|
|
318
|
-
// ---------------------------------------------------------------------------
|
|
319
|
-
const PASSKEY_LOGIN_CHALLENGE_TTL = 120; // seconds — single-use, so longer TTL is safe
|
|
320
|
-
/**
|
|
321
|
-
* Create a passkey login challenge token. Not tied to a user — userId is resolved
|
|
322
|
-
* from the credential after assertion. Uses a fixed 120s TTL.
|
|
323
|
-
*/
|
|
324
|
-
export const createPasskeyLoginChallenge = async (challenge) => {
|
|
325
|
-
const bytes = new Uint8Array(32);
|
|
326
|
-
crypto.getRandomValues(bytes);
|
|
327
|
-
const token = Buffer.from(bytes).toString("base64url");
|
|
328
|
-
const hash = sha256(token);
|
|
329
|
-
const ttl = PASSKEY_LOGIN_CHALLENGE_TTL;
|
|
330
|
-
const now = Date.now();
|
|
331
|
-
const purpose = "passkey-login";
|
|
332
|
-
const userId = ""; // anonymous — resolved from credential ID at login time
|
|
333
|
-
if (_store === "memory") {
|
|
334
|
-
_memoryChallenges.set(hash, { userId, purpose, webauthnChallenge: challenge, createdAt: now, resendCount: 0, expiresAt: now + ttl * 1000 });
|
|
335
|
-
return token;
|
|
336
|
-
}
|
|
337
|
-
if (_store === "sqlite") {
|
|
338
|
-
ensureSqliteMfaTable();
|
|
339
|
-
_sqliteDb.run("INSERT INTO mfa_challenges (token, userId, purpose, webauthnChallenge, createdAt, resendCount, expiresAt) VALUES (?, ?, ?, ?, ?, 0, ?)", [hash, userId, purpose, challenge, now, now + ttl * 1000]);
|
|
340
|
-
return token;
|
|
341
|
-
}
|
|
342
|
-
if (_store === "mongo") {
|
|
343
|
-
await getMfaChallengeModel().create({
|
|
344
|
-
token: hash,
|
|
345
|
-
userId,
|
|
346
|
-
purpose,
|
|
347
|
-
webauthnChallenge: challenge,
|
|
348
|
-
createdAt: new Date(now),
|
|
349
|
-
resendCount: 0,
|
|
350
|
-
expiresAt: new Date(now + ttl * 1000),
|
|
351
|
-
});
|
|
352
|
-
return token;
|
|
353
|
-
}
|
|
354
|
-
// redis
|
|
355
|
-
await getRedis().set(`mfachallenge:${getAppName()}:${hash}`, JSON.stringify({ userId, purpose, webauthnChallenge: challenge, createdAt: now, resendCount: 0 }), "EX", ttl);
|
|
356
|
-
return token;
|
|
357
|
-
};
|
|
358
|
-
/**
|
|
359
|
-
* Consume a passkey login challenge token.
|
|
360
|
-
* Only accepts tokens with `purpose: "passkey-login"`.
|
|
361
|
-
* Returns the stored webauthnChallenge bytes or null if expired/invalid.
|
|
362
|
-
*/
|
|
363
|
-
export const consumePasskeyLoginChallenge = async (token) => {
|
|
364
|
-
const hash = sha256(token);
|
|
365
|
-
if (_store === "memory") {
|
|
366
|
-
const entry = _memoryChallenges.get(hash);
|
|
367
|
-
if (!entry || entry.expiresAt <= Date.now()) {
|
|
368
|
-
_memoryChallenges.delete(hash);
|
|
369
|
-
return null;
|
|
370
|
-
}
|
|
371
|
-
_memoryChallenges.delete(hash);
|
|
372
|
-
if (entry.purpose !== "passkey-login" || !entry.webauthnChallenge)
|
|
373
|
-
return null;
|
|
374
|
-
return { webauthnChallenge: entry.webauthnChallenge };
|
|
375
|
-
}
|
|
376
|
-
if (_store === "sqlite") {
|
|
377
|
-
ensureSqliteMfaTable();
|
|
378
|
-
const row = _sqliteDb.query("DELETE FROM mfa_challenges WHERE token = ? AND expiresAt > ? RETURNING purpose, webauthnChallenge").get(hash, Date.now());
|
|
379
|
-
if (!row || row.purpose !== "passkey-login" || !row.webauthnChallenge)
|
|
380
|
-
return null;
|
|
381
|
-
return { webauthnChallenge: row.webauthnChallenge };
|
|
382
|
-
}
|
|
383
|
-
if (_store === "mongo") {
|
|
384
|
-
const doc = await getMfaChallengeModel().findOneAndDelete({ token: hash, expiresAt: { $gt: new Date() } });
|
|
385
|
-
if (!doc || doc.purpose !== "passkey-login" || !doc.webauthnChallenge)
|
|
386
|
-
return null;
|
|
387
|
-
return { webauthnChallenge: doc.webauthnChallenge };
|
|
388
|
-
}
|
|
389
|
-
// redis
|
|
390
|
-
const key = `mfachallenge:${getAppName()}:${hash}`;
|
|
391
|
-
const raw = await redisGetDel(key);
|
|
392
|
-
if (!raw)
|
|
393
|
-
return null;
|
|
394
|
-
const data = JSON.parse(raw);
|
|
395
|
-
if (data.purpose !== "passkey-login" || !data.webauthnChallenge)
|
|
396
|
-
return null;
|
|
397
|
-
return { webauthnChallenge: data.webauthnChallenge };
|
|
398
|
-
};
|
package/dist/lib/mongo.d.ts
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { Connection, Mongoose } from "mongoose";
|
|
2
|
-
type MongooseModule = Mongoose;
|
|
3
|
-
/**
|
|
4
|
-
* Named connection used exclusively for auth data (AuthUser model).
|
|
5
|
-
* Connected via connectAuthMongo() or connectMongo() (backward compat).
|
|
6
|
-
*/
|
|
7
|
-
export declare const authConnection: Connection;
|
|
8
|
-
/**
|
|
9
|
-
* Named connection for app/tenant data.
|
|
10
|
-
* Connected via connectAppMongo() or connectMongo() (backward compat).
|
|
11
|
-
* Use this when registering your own models: appConnection.model("Product", schema).
|
|
12
|
-
*/
|
|
13
|
-
export declare const appConnection: Connection;
|
|
14
|
-
/**
|
|
15
|
-
* The mongoose instance. Available after connectMongo() / connectAuthMongo() is called.
|
|
16
|
-
*/
|
|
17
|
-
export declare const mongoose: MongooseModule;
|
|
18
|
-
/**
|
|
19
|
-
* Connect the auth connection to its dedicated MongoDB server.
|
|
20
|
-
* Uses MONGO_AUTH_USER_*, MONGO_AUTH_PW_*, MONGO_AUTH_HOST_*, MONGO_AUTH_DB_* env vars.
|
|
21
|
-
*/
|
|
22
|
-
export declare const connectAuthMongo: () => Promise<void>;
|
|
23
|
-
/**
|
|
24
|
-
* Connect the app connection to its MongoDB server.
|
|
25
|
-
* Uses MONGO_USER_*, MONGO_PW_*, MONGO_HOST_*, MONGO_DB_* env vars.
|
|
26
|
-
*/
|
|
27
|
-
export declare const connectAppMongo: () => Promise<void>;
|
|
28
|
-
/**
|
|
29
|
-
* Connect both auth and app connections to the same MongoDB server.
|
|
30
|
-
* Backward-compatible shorthand for single-DB setups.
|
|
31
|
-
* Uses MONGO_USER_*, MONGO_PW_*, MONGO_HOST_*, MONGO_DB_* env vars.
|
|
32
|
-
*/
|
|
33
|
-
export declare const connectMongo: () => Promise<void>;
|
|
34
|
-
/**
|
|
35
|
-
* Close both auth and app Mongo connections.
|
|
36
|
-
* Useful for one-off scripts that need a clean exit.
|
|
37
|
-
*/
|
|
38
|
-
export declare const disconnectMongo: () => Promise<void>;
|
|
39
|
-
export {};
|